From 739d565c59c351a779c3fb655eecf2e90fc99997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Mon, 17 Jul 2006 20:14:25 +0200 Subject: [PATCH] wined3d: Add a setting for the render target locking method. --- dlls/wined3d/surface.c | 46 ++++++++++++++++++++++++++++++++-- dlls/wined3d/wined3d_main.c | 33 ++++++++++++++++++++++-- dlls/wined3d/wined3d_private.h | 8 ++++++ 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 2efd65f5a45..f28561e1d9e 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -727,7 +727,28 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED * (char *)pLockedRect->pBits + (pLockedRect->Pitch * (j-This->lockedRect.top))); *****************************************/ if (!notInContext) { /* Only read the buffer if it's in the current context */ - read_from_framebuffer(This, &This->lockedRect, pLockedRect->pBits, pLockedRect->Pitch); + switch(wined3d_settings.rendertargetlock_mode) { + case RTL_AUTO: + case RTL_READDRAW: + case RTL_READTEX: + read_from_framebuffer(This, &This->lockedRect, pLockedRect->pBits, pLockedRect->Pitch); + break; + + case RTL_TEXDRAW: + case RTL_TEXTEX: + ERR("Reading from render target with a texture isn't implemented yet\n"); + break; + + case RTL_DISABLE: + { + static BOOL warned = FALSE; + if(!warned) { + ERR("Application tries to lock the render target, but render target locking is disabled\n"); + warned = TRUE; + } + } + break; + } } TRACE("Resetting buffer\n"); @@ -1071,7 +1092,28 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) { glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); - flush_to_framebuffer_drawpixels(This); + switch(wined3d_settings.rendertargetlock_mode) { + case RTL_AUTO: + case RTL_READDRAW: + case RTL_TEXDRAW: + flush_to_framebuffer_drawpixels(This); + break; + + case RTL_READTEX: + case RTL_TEXTEX: + ERR("Writing to the render target with textures is not implemented yet\n"); + break; + + case RTL_DISABLE: + { + static BOOL warned = FALSE; + if(!warned) { + ERR("The application tries to write to the render target, but render target locking is disabled\n"); + warned = TRUE; + } + } + break; + } if(implSwapChain->backBuffer && implSwapChain->backBuffer[0]) { glDrawBuffer(GL_BACK); diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index 9f984b0aa2d..1021932e6f5 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -36,8 +36,9 @@ wined3d_settings_t wined3d_settings = { VS_HW, /* Hardware by default */ PS_NONE, /* Disabled by default */ - VBO_HW, /* Hardware by default */ - FALSE /* Use of GLSL disabled by default */ + VBO_HW, /* Hardware by default */ + FALSE, /* Use of GLSL disabled by default */ + RTL_AUTO /* Automatically determine best locking method */ }; WineD3DGlobalStatistics *wineD3DGlobalStatistics = NULL; @@ -196,6 +197,34 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) } /* There will be a couple of other choices for nonpow2, they are: TextureRecrangle and OpenGL 2 */ } + if ( !get_config_key( hkey, appkey, "RenderTargetLockMode", buffer, size) ) + { + if (!strcmp(buffer,"disabled")) + { + TRACE("Disabling render target locking\n"); + wined3d_settings.rendertargetlock_mode = RTL_DISABLE; + } + else if (!strcmp(buffer,"readdraw")) + { + TRACE("Using glReadPixels for render target reading and glDrawPixels for writing\n"); + wined3d_settings.rendertargetlock_mode = RTL_READDRAW; + } + else if (!strcmp(buffer,"readtex")) + { + TRACE("Using glReadPixels for render target reading and textures for writing\n"); + wined3d_settings.rendertargetlock_mode = RTL_READTEX; + } + else if (!strcmp(buffer,"texdraw")) + { + TRACE("Using textures for render target reading and glDrawPixels for writing\n"); + wined3d_settings.rendertargetlock_mode = RTL_TEXDRAW; + } + else if (!strcmp(buffer,"textex")) + { + TRACE("Reading render targets via textures and writing via textures\n"); + wined3d_settings.rendertargetlock_mode = RTL_TEXTEX; + } + } } if (wined3d_settings.vs_mode == VS_HW) TRACE("Allow HW vertex shaders\n"); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 03ce7d76f62..9e83ddd18e5 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -138,6 +138,13 @@ static WINED3DGLTYPE const glTypeLookup[D3DDECLTYPE_UNUSED] = { #define SHADER_GLSL 2 #define SHADER_NONE 3 +#define RTL_DISABLE -1 +#define RTL_AUTO 0 +#define RTL_READDRAW 1 +#define RTL_READTEX 2 +#define RTL_TEXDRAW 3 +#define RTL_TEXTEX 4 + typedef struct wined3d_settings_s { /* vertex and pixel shader modes */ int vs_mode; @@ -151,6 +158,7 @@ typedef struct wined3d_settings_s { int ps_selected_mode; /* nonpower 2 function */ int nonpower2_mode; + int rendertargetlock_mode; } wined3d_settings_t; extern wined3d_settings_t wined3d_settings;