WineD3D: Unbind unused textures

Stefan Dösinger stefan at codeweavers.com
Sat Aug 26 14:56:25 CDT 2006


Apparently disabling texturing alone doesn't work, so bind texture 0 to all 
unused texture units. This fixes the bad texture / reflections on many 
objects in half-life 2, dxlevel 80, and makes the flashlight work more 
reliably. The flashlight still doesn't work on bump mapped objects.
-------------- next part --------------
From nobody Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Sat Aug 26 21:48:10 2006 +0200
Subject: [PATCH] WineD3D: Unbind unused textures

---

 dlls/wined3d/drawprim.c |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

1e532303b0a66b0f25ce602e3d2f3e909c354555
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index aa022e2..35d62f4 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1930,23 +1930,55 @@ static void drawPrimitiveUploadTexturesP
             WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
         }
 
-        if (!This->stateBlock->textures[i]) continue;
+        if (!This->stateBlock->textures[i]) {
+            glBindTexture(GL_TEXTURE_2D, 0);
+            checkGLcall("glBindTexture(GL_TEXTURE_2D, 0)");
+            glDisable(GL_TEXTURE_2D);
+            checkGLcall("glDisable(GL_TEXTURE_2D)");
+            glBindTexture(GL_TEXTURE_3D, 0);
+            checkGLcall("glBindTexture(GL_TEXTURE_3D, 0)");
+            glDisable(GL_TEXTURE_3D);
+            checkGLcall("glDisable(GL_TEXTURE_3D)");
+            glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
+            checkGLcall("glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0)");
+            glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+            checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
+            continue;
+        }
 
         /* Enable the correct target. Is this required for GLSL? For ARB_fragment_program it isn't, afaik. */
         glDisable(GL_TEXTURE_1D);
         This->stateBlock->textureDimensions[i] = IWineD3DBaseTexture_GetTextureDimensions(This->stateBlock->textures[i]);
         switch(This->stateBlock->textureDimensions[i]) {
             case GL_TEXTURE_2D:
+                glBindTexture(GL_TEXTURE_3D, 0);
+                checkGLcall("glBindTexture(GL_TEXTURE_3D, 0)");
                 glDisable(GL_TEXTURE_3D);
+                checkGLcall("glDisable(GL_TEXTURE_3D)");
+                glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
+                checkGLcall("glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0)");
                 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+                checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
                 break;
             case GL_TEXTURE_3D:
+                glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
+                checkGLcall("glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0)");
                 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+                checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
+                glBindTexture(GL_TEXTURE_2D, 0);
+                checkGLcall("glBindTexture(GL_TEXTURE_2D, 0)");
                 glDisable(GL_TEXTURE_2D);
+                checkGLcall("glDisable(GL_TEXTURE_2D)");
                 break;
             case GLTEXTURECUBEMAP:
+                glBindTexture(GL_TEXTURE_2D, 0);
+                checkGLcall("glBindTexture(GL_TEXTURE_2D, 0)");
                 glDisable(GL_TEXTURE_2D);
+                checkGLcall("glDisable(GL_TEXTURE_2D)");
+                glBindTexture(GL_TEXTURE_3D, 0);
+                checkGLcall("glBindTexture(GL_TEXTURE_3D, 0)");
                 glDisable(GL_TEXTURE_3D);
+                checkGLcall("glDisable(GL_TEXTURE_3D)");
                 break;
         }
         glEnable(This->stateBlock->textureDimensions[i]);
-- 
1.2.4



More information about the wine-patches mailing list