annotate src/video/SDL_blit_copy.c @ 4525:3abf0b9cafad

pelya 2010-07-12 03:53:48 PDT In function GLES_RenderCopy() in SDL_renderer_gles.c:819 there is one memcpy() that can be avoided if we're updating whole texture. Because of that the SDL 1.3 in compatibility mode is working even slower than software rendering in SDL 1.2.
author Sam Lantinga <slouken@libsdl.org>
date Wed, 14 Jul 2010 07:31:35 -0700
parents f7b03b6838cb
children b530ef003506
rev   line source
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
1 /*
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
2 SDL - Simple DirectMedia Layer
3697
f7b03b6838cb Fixed bug #926
Sam Lantinga <slouken@libsdl.org>
parents: 3577
diff changeset
3 Copyright (C) 1997-2010 Sam Lantinga
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
4
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
6 modify it under the terms of the GNU Lesser General Public
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
7 License as published by the Free Software Foundation; either
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
8 version 2.1 of the License, or (at your option) any later version.
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
9
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
13 Lesser General Public License for more details.
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
14
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
15 You should have received a copy of the GNU Lesser General Public
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
16 License along with this library; if not, write to the Free Software
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
18
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
19 Sam Lantinga
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
20 slouken@libsdl.org
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
21 */
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
22 #include "SDL_config.h"
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
23
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
24 #include "SDL_video.h"
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
25 #include "SDL_blit.h"
2254
79e00f5561f4 Oops, didn't want to rename those files...
Sam Lantinga <slouken@libsdl.org>
parents: 2253
diff changeset
26 #include "SDL_blit_copy.h"
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
27
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
28
2253
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
29 #ifdef __SSE__
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
30 /* This assumes 16-byte aligned src and dst */
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
31 static __inline__ void
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
32 SDL_memcpySSE(Uint8 * dst, const Uint8 * src, int len)
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
33 {
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
34 int i;
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
35
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
36 __m128 values[4];
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
37 for (i = len / 64; i--;) {
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
38 _mm_prefetch(src, _MM_HINT_NTA);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
39 values[0] = *(__m128 *) (src + 0);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
40 values[1] = *(__m128 *) (src + 16);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
41 values[2] = *(__m128 *) (src + 32);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
42 values[3] = *(__m128 *) (src + 48);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
43 _mm_stream_ps((float *) (dst + 0), values[0]);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
44 _mm_stream_ps((float *) (dst + 16), values[1]);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
45 _mm_stream_ps((float *) (dst + 32), values[2]);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
46 _mm_stream_ps((float *) (dst + 48), values[3]);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
47 src += 64;
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
48 dst += 64;
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
49 }
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
50
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
51 if (len & 63)
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
52 SDL_memcpy(dst, src, len & 63);
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
53 }
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
54 #endif /* __SSE__ */
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
55
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
56 #ifdef __MMX__
2780
cc15254e44b6 Disable spurious warning
Sam Lantinga <slouken@libsdl.org>
parents: 2267
diff changeset
57 #ifdef _MSC_VER
cc15254e44b6 Disable spurious warning
Sam Lantinga <slouken@libsdl.org>
parents: 2267
diff changeset
58 #pragma warning(disable:4799)
cc15254e44b6 Disable spurious warning
Sam Lantinga <slouken@libsdl.org>
parents: 2267
diff changeset
59 #endif
2253
6d99edd791bf Added notes on the next steps for SDL 1.3
Sam Lantinga <slouken@libsdl.org>
parents: 2252
diff changeset
60 /* This assumes 8-byte aligned src and dst */
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
61 static __inline__ void
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
62 SDL_memcpyMMX(Uint8 * dst, const Uint8 * src, int len)
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
63 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
64 int i;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
65
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
66 __m64 values[8];
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
67 for (i = len / 64; i--;) {
3577
72024425b437 Fixed bug #736
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
68 #ifdef __SSE__
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
69 _mm_prefetch(src, _MM_HINT_NTA);
3577
72024425b437 Fixed bug #736
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
70 #endif
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
71 values[0] = *(__m64 *) (src + 0);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
72 values[1] = *(__m64 *) (src + 8);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
73 values[2] = *(__m64 *) (src + 16);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
74 values[3] = *(__m64 *) (src + 24);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
75 values[4] = *(__m64 *) (src + 32);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
76 values[5] = *(__m64 *) (src + 40);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
77 values[6] = *(__m64 *) (src + 48);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
78 values[7] = *(__m64 *) (src + 56);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
79 _mm_stream_pi((__m64 *) (dst + 0), values[0]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
80 _mm_stream_pi((__m64 *) (dst + 8), values[1]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
81 _mm_stream_pi((__m64 *) (dst + 16), values[2]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
82 _mm_stream_pi((__m64 *) (dst + 24), values[3]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
83 _mm_stream_pi((__m64 *) (dst + 32), values[4]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
84 _mm_stream_pi((__m64 *) (dst + 40), values[5]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
85 _mm_stream_pi((__m64 *) (dst + 48), values[6]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
86 _mm_stream_pi((__m64 *) (dst + 56), values[7]);
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
87 src += 64;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
88 dst += 64;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
89 }
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
90
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
91 if (len & 63)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
92 SDL_memcpy(dst, src, len & 63);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
93 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
94 #endif /* __MMX__ */
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
95
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
96 void
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
97 SDL_BlitCopy(SDL_BlitInfo * info)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
98 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
99 Uint8 *src, *dst;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
100 int w, h;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
101 int srcskip, dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
102
2267
c785543d1843 Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents: 2262
diff changeset
103 w = info->dst_w * info->dst_fmt->BytesPerPixel;
2262
bee005ace1bf Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents: 2254
diff changeset
104 h = info->dst_h;
bee005ace1bf Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents: 2254
diff changeset
105 src = info->src;
bee005ace1bf Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents: 2254
diff changeset
106 dst = info->dst;
2267
c785543d1843 Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents: 2262
diff changeset
107 srcskip = info->src_pitch;
c785543d1843 Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents: 2262
diff changeset
108 dstskip = info->dst_pitch;
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
109
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
110 #ifdef __SSE__
2826
cd4a49d5c1ba Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents: 2780
diff changeset
111 if (SDL_HasSSE() &&
cd4a49d5c1ba Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents: 2780
diff changeset
112 !((uintptr_t) src & 15) && !(srcskip & 15) &&
cd4a49d5c1ba Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents: 2780
diff changeset
113 !((uintptr_t) dst & 15) && !(dstskip & 15)) {
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
114 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
115 SDL_memcpySSE(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
116 src += srcskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
117 dst += dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
118 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
119 return;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
120 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
121 #endif
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
122
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
123 #ifdef __MMX__
2826
cd4a49d5c1ba Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents: 2780
diff changeset
124 if (SDL_HasMMX() &&
cd4a49d5c1ba Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents: 2780
diff changeset
125 !((uintptr_t) src & 7) && !(srcskip & 7) &&
cd4a49d5c1ba Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents: 2780
diff changeset
126 !((uintptr_t) dst & 7) && !(dstskip & 7)) {
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
127 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
128 SDL_memcpyMMX(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
129 src += srcskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
130 dst += dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
131 }
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
132 _mm_empty();
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
133 return;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
134 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
135 #endif
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
136
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
137 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
138 SDL_memcpy(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
139 src += srcskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
140 dst += dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
141 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
142 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
143
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
144 void
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
145 SDL_BlitCopyOverlap(SDL_BlitInfo * info)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
146 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
147 Uint8 *src, *dst;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
148 int w, h;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
149 int skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
150
2267
c785543d1843 Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents: 2262
diff changeset
151 w = info->dst_w * info->dst_fmt->BytesPerPixel;
2262
bee005ace1bf Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents: 2254
diff changeset
152 h = info->dst_h;
bee005ace1bf Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents: 2254
diff changeset
153 src = info->src;
bee005ace1bf Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents: 2254
diff changeset
154 dst = info->dst;
2267
c785543d1843 Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents: 2262
diff changeset
155 skip = info->src_pitch;
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
156 if ((dst < src) || (dst >= (src + h * skip))) {
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
157 SDL_BlitCopy(info);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
158 } else {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
159 src += ((h - 1) * skip);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
160 dst += ((h - 1) * skip);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
161 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
162 SDL_revcpy(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
163 src -= skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
164 dst -= skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
165 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
166 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
167 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
168
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
169 /* vi: set ts=4 sw=4 expandtab: */