From 32593c2bac493cf54c4b8312d0df88a952c71322 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 25 Nov 2008 00:29:44 +0000 Subject: [PATCH] Fixed Direct3D rendering --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403244 --- src/video/win32/SDL_d3drender.c | 48 ++++++++++++++++++++++++++++++++- test/testsprite2.c | 6 ++--- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/video/win32/SDL_d3drender.c b/src/video/win32/SDL_d3drender.c index 503c80acb..06e07d6b6 100644 --- a/src/video/win32/SDL_d3drender.c +++ b/src/video/win32/SDL_d3drender.c @@ -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 @@ D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) 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 @@ D3D_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) 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 @@ D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, } 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, diff --git a/test/testsprite2.c b/test/testsprite2.c index 670957605..ac2e1646f 100644 --- a/test/testsprite2.c +++ b/test/testsprite2.c @@ -83,7 +83,7 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) { int i, n; int window_w, window_h; - SDL_Rect area, *position, *velocity; + SDL_Rect *position, *velocity; SDL_SelectRenderer(window); @@ -291,8 +291,8 @@ main(int argc, char *argv[]) /* 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); }