H. Verbeet : wined3d: Don' t do WINED3DTSS_COLOROP texture operations for stages that aren' t mapped to a texture unit.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 4 15:09:30 CST 2007


Module: wine
Branch: master
Commit: 8c530333cb4b5ad610676f4a3aa7607a154e410a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8c530333cb4b5ad610676f4a3aa7607a154e410a

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Wed Jan  3 19:18:38 2007 +0100

wined3d: Don't do WINED3DTSS_COLOROP texture operations for stages that aren't mapped to a texture unit.

---

 dlls/wined3d/state.c |   51 +++++++++++++++++++++++++++----------------------
 1 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index c99be0e..1e93787 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1363,6 +1363,7 @@ static void activate_dimensions(DWORD st
 
 static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock) {
     DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
+    DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
 
     TRACE("Setting color op for stage %d\n", stage);
 
@@ -1372,21 +1373,23 @@ static void tex_colorop(DWORD state, IWi
         return;
     }
 
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {
-        /* TODO: register combiners! */
-        if(stage != stateblock->wineD3DDevice->texUnitMap[stage]) ERR("Foo: %d is %d!\n", stage, stateblock->wineD3DDevice->texUnitMap[stage]);
-        if(stateblock->wineD3DDevice->texUnitMap[stage] >= GL_LIMITS(sampler_stages)) {
-            if(stateblock->textureState[stage][WINED3DTSS_COLOROP] != WINED3DTOP_DISABLE &&
-              stateblock->textureState[stage][WINED3DTSS_COLOROP] != 0) {
-                FIXME("Attempt to enable unsupported stage!\n");
+    if (stage != mapped_stage) WARN("Using non 1:1 mapping: %d -> %d!\n", stage, mapped_stage);
+
+    if (mapped_stage != -1) {
+        if (GL_SUPPORT(ARB_MULTITEXTURE)) {
+            if (mapped_stage >= GL_LIMITS(sampler_stages)) {
+                if (stateblock->textureState[stage][WINED3DTSS_COLOROP] != WINED3DTOP_DISABLE &&
+                        stateblock->textureState[stage][WINED3DTSS_COLOROP] != 0) {
+                    FIXME("Attempt to enable unsupported stage!\n");
+                }
+                return;
             }
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
+            checkGLcall("glActiveTextureARB");
+        } else if (stage > 0) {
+            WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
             return;
         }
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + stateblock->wineD3DDevice->texUnitMap[stage]));
-        checkGLcall("glActiveTextureARB");
-    } else if (stage > 0) {
-        WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
-        return;
     }
 
     if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
@@ -1399,20 +1402,22 @@ static void tex_colorop(DWORD state, IWi
     }
     if(stage >= stateblock->lowest_disabled_stage) {
         TRACE("Stage disabled\n");
-        /* Disable everything here */
-        glDisable(GL_TEXTURE_1D);
-        checkGLcall("glDisable(GL_TEXTURE_1D)");
-        glDisable(GL_TEXTURE_2D);
-        checkGLcall("glDisable(GL_TEXTURE_2D)");
-        glDisable(GL_TEXTURE_3D);
-        checkGLcall("glDisable(GL_TEXTURE_3D)");
-        glDisable(GL_TEXTURE_CUBE_MAP_ARB);
-        checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
+        if (mapped_stage != -1) {
+            /* Disable everything here */
+            glDisable(GL_TEXTURE_1D);
+            checkGLcall("glDisable(GL_TEXTURE_1D)");
+            glDisable(GL_TEXTURE_2D);
+            checkGLcall("glDisable(GL_TEXTURE_2D)");
+            glDisable(GL_TEXTURE_3D);
+            checkGLcall("glDisable(GL_TEXTURE_3D)");
+            glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+            checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
+        }
         /* All done */
         return;
     }
 
-    activate_dimensions(stage, stateblock);
+    if (mapped_stage != -1) activate_dimensions(stage, stateblock);
 
     /* Set the texture combiners */
     if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
@@ -1421,7 +1426,7 @@ static void tex_colorop(DWORD state, IWi
                          stateblock->textureState[stage][WINED3DTSS_COLORARG1],
                          stateblock->textureState[stage][WINED3DTSS_COLORARG2],
                          stateblock->textureState[stage][WINED3DTSS_COLORARG0],
-                         stateblock->wineD3DDevice->texUnitMap[stage]);
+                         mapped_stage);
     } else {
         set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, stage,
                     stateblock->textureState[stage][WINED3DTSS_COLOROP],




More information about the wine-cvs mailing list