Mercurial > sdl-ios-xcode
annotate src/video/SDL_blit_copy.c @ 2250:e1d228456537
Fixed a few compiler warnings.
Added SDL_blit_copy.c to the Visual C++ project
The SSE and MMX intrinsics don't compile on Visual Studio yet...
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 16 Aug 2007 06:20:51 +0000 |
parents | 5a58b57b6724 |
children | b80e3d57941f |
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 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
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 |
2250
e1d228456537
Fixed a few compiler warnings.
Sam Lantinga <slouken@libsdl.org>
parents:
2249
diff
changeset
|
24 #include "SDL_cpuinfo.h" |
2247
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_video.h" |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
26 #include "SDL_blit.h" |
2249
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2248
diff
changeset
|
27 #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
|
28 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
29 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
30 #ifdef __MMX__ |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
31 static __inline__ void |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
32 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
|
33 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
34 int i; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
35 |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
36 __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
|
37 for (i = len / 64; i--;) { |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
38 _mm_prefetch(src, _MM_HINT_NTA); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
39 values[0] = *(__m64 *) (src + 0); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
40 values[1] = *(__m64 *) (src + 8); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
41 values[2] = *(__m64 *) (src + 16); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
42 values[3] = *(__m64 *) (src + 24); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
43 values[4] = *(__m64 *) (src + 32); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
44 values[5] = *(__m64 *) (src + 40); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
45 values[6] = *(__m64 *) (src + 48); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
46 values[7] = *(__m64 *) (src + 56); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
47 _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
|
48 _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
|
49 _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
|
50 _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
|
51 _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
|
52 _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
|
53 _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
|
54 _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
|
55 src += 64; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
56 dst += 64; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
57 } |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
58 |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
59 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
|
60 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
|
61 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
62 #endif /* __MMX__ */ |
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 #ifdef __SSE__ |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
65 static __inline__ void |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
66 SDL_memcpySSE(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
|
67 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
68 int i; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
69 |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
70 __m128 values[4]; |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
71 for (i = len / 64; i--;) { |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
72 _mm_prefetch(src, _MM_HINT_NTA); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
73 values[0] = *(__m128 *) (src + 0); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
74 values[1] = *(__m128 *) (src + 16); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
75 values[2] = *(__m128 *) (src + 32); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
76 values[3] = *(__m128 *) (src + 48); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
77 _mm_stream_ps((float *) (dst + 0), values[0]); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
78 _mm_stream_ps((float *) (dst + 16), values[1]); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
79 _mm_stream_ps((float *) (dst + 32), values[2]); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
80 _mm_stream_ps((float *) (dst + 48), values[3]); |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
81 src += 64; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
82 dst += 64; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
83 } |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
84 |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
85 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
|
86 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
|
87 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
88 #endif /* __SSE__ */ |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
89 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
90 void |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
91 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
|
92 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
93 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
|
94 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
|
95 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
|
96 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
97 w = info->d_width * info->dst->BytesPerPixel; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
98 h = info->d_height; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
99 src = info->s_pixels; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
100 dst = info->d_pixels; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
101 srcskip = w + info->s_skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
102 dstskip = w + info->d_skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
103 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
104 #ifdef __SSE__ |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
105 if (SDL_HasSSE() && !((uintptr_t) src & 15) && !((uintptr_t) dst & 15)) { |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
106 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
107 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
|
108 src += srcskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
109 dst += dstskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
110 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
111 return; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
112 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
113 #endif |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
114 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
115 #ifdef __MMX__ |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
116 if (SDL_HasMMX() && !((uintptr_t) src & 7) && !((uintptr_t) dst & 7)) { |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
117 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
118 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
|
119 src += srcskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
120 dst += dstskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
121 } |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
122 _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
|
123 return; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
124 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
125 #endif |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
126 |
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_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
|
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 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
132 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
133 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
134 void |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
135 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
|
136 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
137 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
|
138 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
|
139 int skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
140 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
141 w = info->d_width * info->dst->BytesPerPixel; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
142 h = info->d_height; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
143 src = info->s_pixels; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
144 dst = info->d_pixels; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
145 skip = w + info->s_skip; |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
146 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
|
147 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
|
148 } else { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
149 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
|
150 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
|
151 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
152 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
|
153 src -= skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
154 dst -= skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
155 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
156 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
157 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
158 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
159 /* vi: set ts=4 sw=4 expandtab: */ |