Fixed Direct3D rendering
authorSam Lantinga <slouken@libsdl.org>
Tue, 25 Nov 2008 00:29:44 +0000
changeset 2783 e33ad7ebb7eb
parent 2782 53689036f265
child 2784 9bbe3bd94be8
Fixed Direct3D rendering
src/video/win32/SDL_d3drender.c
test/testsprite2.c
--- a/src/video/win32/SDL_d3drender.c	Mon Nov 24 23:55:18 2008 +0000
+++ b/src/video/win32/SDL_d3drender.c	Tue Nov 25 00:29:44 2008 +0000
@@ -27,6 +27,14 @@
 
 /* Direct3D renderer implementation */
 
+#if 1 /* This takes more memory but you won't lose your texture data */
+#define D3DPOOL_SDL	D3DPOOL_MANAGED
+#define SDL_MEMORY_POOL_MANAGED
+#else
+#define D3DPOOL_SDL	D3DPOOL_DEFAULT
+#define SDL_MEMORY_POOL_DEFAULT
+#endif
+
 static SDL_Renderer *D3D_CreateRenderer(SDL_Window * window, Uint32 flags);
 static int D3D_DisplayModeChanged(SDL_Renderer * renderer);
 static int D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
@@ -473,7 +481,7 @@
         IDirect3DDevice9_CreateTexture(renderdata->device, texture->w,
                                        texture->h, 1, 0,
                                        PixelFormatToD3DFMT(texture->format),
-                                       D3DPOOL_MANAGED, &data->texture, NULL);
+                                       D3DPOOL_SDL, &data->texture, NULL);
     if (FAILED(result)) {
         D3D_SetError("CreateTexture()", result);
         return -1;
@@ -547,6 +555,7 @@
     return 0;
 }
 
+#ifdef SDL_MEMORY_POOL_DEFAULT
 static int
 D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
                   const SDL_Rect * rect, const void *pixels, int pitch)
@@ -605,6 +614,43 @@
     }
     return 0;
 }
+#else
+static int
+D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
+                  const SDL_Rect * rect, const void *pixels, int pitch)
+{
+    D3D_TextureData *data = (D3D_TextureData *) texture->driverdata;
+    D3D_RenderData *renderdata = (D3D_RenderData *) renderer->driverdata;
+    RECT d3drect;
+    D3DLOCKED_RECT locked;
+    const Uint8 *src;
+    Uint8 *dst;
+    int row, length;
+    HRESULT result;
+
+    d3drect.left = rect->x;
+    d3drect.right = rect->x + rect->w;
+    d3drect.top = rect->y;
+    d3drect.bottom = rect->y + rect->h;
+
+    result = IDirect3DTexture9_LockRect(data->texture, 0, &locked, &d3drect, 0);
+    if (FAILED(result)) {
+        D3D_SetError("LockRect()", result);
+        return -1;
+    }
+
+    src = pixels;
+    dst = locked.pBits;
+    length = rect->w * SDL_BYTESPERPIXEL(texture->format);
+    for (row = 0; row < rect->h; ++row) {
+        SDL_memcpy(dst, src, length);
+        src += pitch;
+        dst += locked.Pitch;
+    }
+    IDirect3DTexture9_UnlockRect(data->texture, 0);
+    return 0;
+}
+#endif // SDL_MEMORY_POOL_DEFAULT
 
 static int
 D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
--- a/test/testsprite2.c	Mon Nov 24 23:55:18 2008 +0000
+++ b/test/testsprite2.c	Tue Nov 25 00:29:44 2008 +0000
@@ -83,7 +83,7 @@
 {
     int i, n;
     int window_w, window_h;
-    SDL_Rect area, *position, *velocity;
+    SDL_Rect *position, *velocity;
 
     SDL_SelectRenderer(window);
 
@@ -291,8 +291,8 @@
     /* Print out some timing information */
     now = SDL_GetTicks();
     if (now > then) {
-        printf("%2.2f frames per second\n",
-               ((double) frames * 1000) / (now - then));
+		double fps = ((double) frames * 1000) / (now - then);
+        printf("%2.2f frames per second\n", fps);
     }
     quit(0);
 }