Mercurial > sdl-ios-xcode
annotate src/video/SDL_blit_copy.c @ 3485:e77a69aae239
Mason Wheeler to sdl
I updated SDL, and suddenly my SDL frames stopped working. They'd "initialize" full of gibberish, and I couldn't render anything to them. After a bit of digging, I found a problem: the renderer initialization routine in my SDL frame code wasn't getting called anymore.
procedure TSdlFrame.Paint;
begin
if SDL_SelectRenderer(FWindowID) = -1 then
CreateRenderer;
SDL_RenderPresent;
end;
function TSdlFrame.CreateRenderer: boolean;
const
pf: tagPIXELFORMATDESCRIPTOR = (nSize: sizeof(pf); nVersion: 1;
dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
iPixelType: PFD_TYPE_RGBA; cColorBits: 24; cAlphaBits: 8;
iLayerType: PFD_MAIN_PLANE);
RENDERERS: array[TRendererType] of AnsiString = ('software', 'gdi', 'opengl', 'd3d');
var
pFormat: integer;
begin
if (SDL_SelectRenderer(FWindowID) = 0) then
begin
result := true;
Exit;
end;
if FRendererType = rtOpenGL then
begin
pFormat := ChoosePixelFormat(canvas.Handle, @pf);
if not SetPixelFormat(canvas.Handle, pFormat, @pf) then
outputDebugString(PChar(SysErrorMessage(GetLastError)));
if wglCreateContext(canvas.Handle) = 0 then
outputDebugString(PChar(SysErrorMessage(GetLastError)));
end;
if (SDL_CreateRenderer(FWindowID, SDL_RendererIndex(RENDERERS[FRendererType]), [sdlrPresentFlip3, sdlrAccelerated]) = 0) then
begin
SDL_ShowWindow(FWindowID);
assert(SDL_SetRenderDrawColor(0, 0, 0, 255) = 0);
FFlags := SDL_GetWindowFlags(FWindowID);
if assigned(FOnAvailable) then
FOnAvailable(self);
end
else outputDebugString(pChar(format('SDL_CreateRenderer failed: %s', [sdl_GetError])));
result := SDL_SelectRenderer(FWindowID) = 0;
end;
This is a critical issue. The Paint method gets called when the control receives a WM_PAINT message from Windows. I can't create the renderer before then, or it will fail and cause trouble. And when I do create it, it needs to be created with certain parameters. So imagine my surprise when I started debugging into the DLL and found that SDL_SelectRenderer was trying to be "helpful" by creating the renderer for me if it didn't already exist! Now not only does my initialization code not get called, I end up with the wrong renderer and so things don't render as expected when I try to use the window.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 24 Nov 2009 04:48:12 +0000 |
parents | 99210400e8b9 |
children | 72024425b437 |
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 |
2859 | 3 Copyright (C) 1997-2009 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--;) { |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
68 _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
|
69 values[0] = *(__m64 *) (src + 0); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
70 values[1] = *(__m64 *) (src + 8); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
71 values[2] = *(__m64 *) (src + 16); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
72 values[3] = *(__m64 *) (src + 24); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
73 values[4] = *(__m64 *) (src + 32); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
74 values[5] = *(__m64 *) (src + 40); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
75 values[6] = *(__m64 *) (src + 48); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
76 values[7] = *(__m64 *) (src + 56); |
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
77 _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
|
78 _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
|
79 _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
|
80 _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
|
81 _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
|
82 _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
|
83 _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
|
84 _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
|
85 src += 64; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
86 dst += 64; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
87 } |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
88 |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
89 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
|
90 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
|
91 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
92 #endif /* __MMX__ */ |
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 void |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
95 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
|
96 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
97 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
|
98 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
|
99 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
|
100 |
2267
c785543d1843
Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents:
2262
diff
changeset
|
101 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
|
102 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
|
103 src = info->src; |
bee005ace1bf
Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents:
2254
diff
changeset
|
104 dst = info->dst; |
2267
c785543d1843
Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents:
2262
diff
changeset
|
105 srcskip = info->src_pitch; |
c785543d1843
Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents:
2262
diff
changeset
|
106 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
|
107 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
108 #ifdef __SSE__ |
2826
cd4a49d5c1ba
Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents:
2780
diff
changeset
|
109 if (SDL_HasSSE() && |
cd4a49d5c1ba
Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents:
2780
diff
changeset
|
110 !((uintptr_t) src & 15) && !(srcskip & 15) && |
cd4a49d5c1ba
Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents:
2780
diff
changeset
|
111 !((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
|
112 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
113 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
|
114 src += srcskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
115 dst += dstskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
116 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
117 return; |
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 #endif |
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 #ifdef __MMX__ |
2826
cd4a49d5c1ba
Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents:
2780
diff
changeset
|
122 if (SDL_HasMMX() && |
cd4a49d5c1ba
Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents:
2780
diff
changeset
|
123 !((uintptr_t) src & 7) && !(srcskip & 7) && |
cd4a49d5c1ba
Fixed crash on 64-bit systems
Sam Lantinga <slouken@libsdl.org>
parents:
2780
diff
changeset
|
124 !((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
|
125 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
126 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
|
127 src += srcskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
128 dst += dstskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
129 } |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
130 _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
|
131 return; |
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 #endif |
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 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
136 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
|
137 src += srcskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
138 dst += dstskip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
139 } |
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 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
142 void |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
143 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
|
144 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
145 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
|
146 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
|
147 int skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
148 |
2267
c785543d1843
Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents:
2262
diff
changeset
|
149 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
|
150 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
|
151 src = info->src; |
bee005ace1bf
Work in progress: merging new texture features into SDL blit system
Sam Lantinga <slouken@libsdl.org>
parents:
2254
diff
changeset
|
152 dst = info->dst; |
2267
c785543d1843
Okay, still some bugs, but everything builds again...
Sam Lantinga <slouken@libsdl.org>
parents:
2262
diff
changeset
|
153 skip = info->src_pitch; |
2248
5cd2a2293cf0
Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
154 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
|
155 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
|
156 } else { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
157 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
|
158 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
|
159 while (h--) { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
160 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
|
161 src -= skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
162 dst -= skip; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
163 } |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
164 } |
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 /* vi: set ts=4 sw=4 expandtab: */ |