Stefan Dösinger : wined3d: Add a setting for the render target locking method.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 18 05:13:33 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 739d565c59c351a779c3fb655eecf2e90fc99997
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=739d565c59c351a779c3fb655eecf2e90fc99997

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon Jul 17 20:14:25 2006 +0200

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 2efd65f..f28561e 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -727,7 +727,28 @@ static HRESULT WINAPI IWineD3DSurfaceImp
             *             (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 IWineD3DSurfaceImp
             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 9f984b0..1021932 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, 
                 }
                 /* 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 03ce7d7..9e83ddd 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -138,6 +138,13 @@ #define SHADER_ARB  1
 #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;




More information about the wine-cvs mailing list