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