From 6b8208ad85981fc97488c7297ecd87147a12bdc0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 12 Nov 2018 00:18:26 +0100 Subject: [PATCH] use multiple textures and rotate them (d3d9) --- ddraw.rc | 2 +- src/render_d3d9.c | 69 +++++++++++++++++++++++++++++++---------------- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index f686a3e..495881e 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_BUILD 4 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 3c69b76..4634c68 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -6,6 +6,7 @@ #include "d3d9shader.h" #include "render_d3d9.h" +#define TEXTURE_COUNT 2 HMODULE Direct3D9_hModule; @@ -13,8 +14,8 @@ static D3DPRESENT_PARAMETERS D3dpp; static LPDIRECT3D9 D3d; static LPDIRECT3DDEVICE9 D3dDev; static LPDIRECT3DVERTEXBUFFER9 VertexBuf; -static IDirect3DTexture9 *SurfaceTex; -static IDirect3DTexture9 *PaletteTex; +static IDirect3DTexture9 *SurfaceTex[TEXTURE_COUNT]; +static IDirect3DTexture9 *PaletteTex[TEXTURE_COUNT]; static IDirect3DPixelShader9 *PixelShader; static float ScaleW; static float ScaleH; @@ -70,7 +71,7 @@ BOOL Direct3D9_Create() D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, ddraw->hWnd, - D3DCREATE_MULTITHREADED | behaviorFlags[i], //D3DCREATE_NOWINDOWCHANGES | + D3DCREATE_MULTITHREADED | behaviorFlags[i], &D3dpp, &D3dDev))) return D3dDev && CreateResources() && SetStates(); @@ -110,16 +111,20 @@ BOOL Direct3D9_Release() VertexBuf = NULL; } - if (SurfaceTex) + int i; + for (i = 0; i < TEXTURE_COUNT; i++) { - SurfaceTex->lpVtbl->Release(SurfaceTex); - SurfaceTex = NULL; - } + if (SurfaceTex[i]) + { + SurfaceTex[i]->lpVtbl->Release(SurfaceTex[i]); + SurfaceTex[i] = NULL; + } - if (PaletteTex) - { - PaletteTex->lpVtbl->Release(PaletteTex); - PaletteTex = NULL; + if (PaletteTex[i]) + { + PaletteTex[i]->lpVtbl->Release(PaletteTex[i]); + PaletteTex[i] = NULL; + } } if (PixelShader) @@ -167,16 +172,24 @@ static BOOL CreateResources() err = err || !UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0)); - err = err || FAILED( - D3dDev->lpVtbl->CreateTexture(D3dDev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex, 0)); + int i; + for (i = 0; i < TEXTURE_COUNT; i++) + { + err = err || FAILED( + D3dDev->lpVtbl->CreateTexture(D3dDev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex[i], 0)); - err = err || FAILED( - D3dDev->lpVtbl->CreateTexture(D3dDev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex, 0)); + err = err || !SurfaceTex[i]; + + err = err || FAILED( + D3dDev->lpVtbl->CreateTexture(D3dDev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex[i], 0)); + + err = err || !PaletteTex[i]; + } err = err || FAILED( D3dDev->lpVtbl->CreatePixelShader(D3dDev, (DWORD *)PalettePixelShaderSrc, &PixelShader)); - return SurfaceTex && PaletteTex && VertexBuf && PixelShader && !err; + return VertexBuf && PixelShader && !err; } static BOOL SetStates() @@ -185,8 +198,8 @@ static BOOL SetStates() err = err || FAILED(D3dDev->lpVtbl->SetFVF(D3dDev, D3DFVF_XYZRHW | D3DFVF_TEX1)); err = err || FAILED(D3dDev->lpVtbl->SetStreamSource(D3dDev, 0, VertexBuf, 0, sizeof(CUSTOMVERTEX))); - err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex)); - err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex)); + err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex[0])); + err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex[0])); err = err || FAILED(D3dDev->lpVtbl->SetPixelShader(D3dDev, PixelShader)); D3DVIEWPORT9 viewData = { @@ -268,6 +281,8 @@ DWORD WINAPI render_d3d9_main(void) DrawFrameInfoStart(); #endif + static int texIndex = 0, palIndex = 0; + if (MaxFPS > 0) tickStart = timeGetTime(); @@ -293,9 +308,13 @@ DWORD WINAPI render_d3d9_main(void) if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE)) { + if (++texIndex >= TEXTURE_COUNT) + texIndex = 0; + RECT rc = { 0,0,ddraw->width,ddraw->height }; - if (SUCCEEDED(SurfaceTex->lpVtbl->LockRect(SurfaceTex, 0, &lock_rc, &rc, 0))) + if (SUCCEEDED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex[texIndex])) && + SUCCEEDED(SurfaceTex[texIndex]->lpVtbl->LockRect(SurfaceTex[texIndex], 0, &lock_rc, &rc, 0))) { unsigned char *src = (unsigned char *)ddraw->primary->surface; unsigned char *dst = (unsigned char *)lock_rc.pBits; @@ -309,19 +328,23 @@ DWORD WINAPI render_d3d9_main(void) dst += lock_rc.Pitch; } - SurfaceTex->lpVtbl->UnlockRect(SurfaceTex, 0); + SurfaceTex[texIndex]->lpVtbl->UnlockRect(SurfaceTex[texIndex], 0); } } if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE)) { + if (++palIndex >= TEXTURE_COUNT) + palIndex = 0; + RECT rc = { 0,0,256,1 }; - if (SUCCEEDED(PaletteTex->lpVtbl->LockRect(PaletteTex, 0, &lock_rc, &rc, 0))) + if (SUCCEEDED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex[palIndex])) && + SUCCEEDED(PaletteTex[palIndex]->lpVtbl->LockRect(PaletteTex[palIndex], 0, &lock_rc, &rc, 0))) { - memcpy(lock_rc.pBits, ddraw->primary->palette->data_rgb, 4 * 256); + memcpy(lock_rc.pBits, ddraw->primary->palette->data_rgb, 256 * sizeof(int)); - PaletteTex->lpVtbl->UnlockRect(PaletteTex, 0); + PaletteTex[palIndex]->lpVtbl->UnlockRect(PaletteTex[palIndex], 0); } } }