[PATCH] WineD3D: Separate texture_activate_dimensions=0A=

Stefan Doesinger stefan at codeweavers.com
Fri Jul 4 17:25:23 CDT 2008


=0A=
This creates an nvts version of this function, and removes the nvts code =
from the original one. The nvts version is=0A=
used by the nvts pipeline implementation, the original one by the =
nvrc-only, atifs and ffp one.=0A=
=0A=
I plan to add some opengl extension information to the state templates =
later, this will eliminate one of the=0A=
almost-duplicated nvrc/nvts state templates.=0A=
---=0A=
 dlls/wined3d/nvidia_texture_shader.c |   79 +++++++++++++++++---=0A=
 dlls/wined3d/utils.c                 |  139 =
+++++++++++++---------------------=0A=
 2 files changed, 120 insertions(+), 98 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index 0c2301c..5d7dceb 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -29,6 +29,42 @@=0A=
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);=0A=
 =0A=
 #define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
+void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+    BOOL bumpmap =3D FALSE;=0A=
+=0A=
+    if(stage > 0 && (stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAPLUMINANCE ||=0A=
+                     stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAP)) {=0A=
+        bumpmap =3D TRUE;=0A=
+        context->texShaderBumpMap |=3D (1 << stage);=0A=
+    } else {=0A=
+        context->texShaderBumpMap &=3D ~(1 << stage);=0A=
+    }=0A=
+=0A=
+    if(stateblock->textures[stage]) {=0A=
+        switch(stateblock->textureDimensions[stage]) {=0A=
+            case GL_TEXTURE_2D:=0A=
+                glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
bumpmap ? GL_OFFSET_TEXTURE_2D_NV : GL_TEXTURE_2D);=0A=
+                checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
+                break;=0A=
+            case GL_TEXTURE_RECTANGLE_ARB:=0A=
+                glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
bumpmap ? GL_OFFSET_TEXTURE_2D_NV : GL_TEXTURE_RECTANGLE_ARB);=0A=
+                checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
+                break;=0A=
+            case GL_TEXTURE_3D:=0A=
+                glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_TEXTURE_3D);=0A=
+                checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_3D)");=0A=
+                break;=0A=
+            case GL_TEXTURE_CUBE_MAP_ARB:=0A=
+                glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_TEXTURE_CUBE_MAP_ARB);=0A=
+                checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+                break;=0A=
+        }=0A=
+    } else {=0A=
+        glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_NONE);=0A=
+        checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_NONE)");=0A=
+    }=0A=
+}=0A=
+=0A=
 static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
     DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
     DWORD mapped_stage =3D stateblock->wineD3DDevice->texUnitMap[stage];=0A=
@@ -92,7 +128,13 @@ static void nvrc_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3=0A=
      * if the sampler for this stage is dirty=0A=
      */=0A=
     if(!isStateDirty(context, STATE_SAMPLER(stage))) {=0A=
-        if (tex_used) texture_activate_dimensions(stage, stateblock, =
context);=0A=
+        if (tex_used) {=0A=
+            if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
+                nvts_activate_dimensions(stage, stateblock, context);=0A=
+            } else {=0A=
+                texture_activate_dimensions(stage, stateblock, context);=0A=
+            }=0A=
+        }=0A=
     }=0A=
 =0A=
     /* Set the texture combiners */=0A=
@@ -114,13 +156,29 @@ static void nvrc_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3=0A=
         if(usesBump !=3D usedBump) {=0A=
             GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage + 1));=0A=
             checkGLcall("glActiveTextureARB");=0A=
-            texture_activate_dimensions(stage + 1, stateblock, context);=0A=
+            nvts_activate_dimensions(stage + 1, stateblock, context);=0A=
             GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
             checkGLcall("glActiveTextureARB");=0A=
         }=0A=
     }=0A=
 }=0A=
 =0A=
+void nvts_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context) {=0A=
+    DWORD sampler =3D state - STATE_SAMPLER(0);=0A=
+    DWORD mapped_stage =3D =
stateblock->wineD3DDevice->texUnitMap[sampler];=0A=
+=0A=
+    /* No need to enable / disable anything here for unused samplers. =
The tex_colorop=0A=
+    * handler takes care. Also no action is needed with pixel shaders, =
or if tex_colorop=0A=
+    * will take care of this business=0A=
+    */=0A=
+    if(mapped_stage =3D=3D -1 || mapped_stage >=3D GL_LIMITS(textures)) =
return;=0A=
+    if(sampler >=3D stateblock->lowest_disabled_stage) return;=0A=
+    if(use_ps(stateblock->wineD3DDevice)) return;=0A=
+    if(isStateDirty(context, STATE_TEXTURESTAGE(sampler, =
WINED3DTSS_COLOROP))) return;=0A=
+=0A=
+    nvts_activate_dimensions(sampler, stateblock, context);=0A=
+}=0A=
+=0A=
 static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
     DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
     float mat[2][2];=0A=
@@ -155,7 +213,6 @@ static void nvrc_texfactor(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Wine=0A=
     =
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], =
col);=0A=
     GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));=0A=
 }=0A=
-=0A=
 #undef GLINFO_LOCATION=0A=
 =0A=
 #define GLINFO_LOCATION (*gl_info)=0A=
@@ -341,14 +398,14 @@ const struct StateEntryTemplate =
nvts_fragmentstate_template[] =3D {=0A=
     { STATE_PIXELSHADER,                                  { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
     { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE),            { =
STATE_PIXELSHADER,                                  apply_pixelshader   =
}},=0A=
     { STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              { =
STATE_RENDER(WINED3DRS_TEXTUREFACTOR),              nvrc_texfactor      =
}},=0A=
-    { STATE_SAMPLER(0),                                   { =
STATE_SAMPLER(0),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(1),                                   { =
STATE_SAMPLER(1),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(2),                                   { =
STATE_SAMPLER(2),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(3),                                   { =
STATE_SAMPLER(3),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(4),                                   { =
STATE_SAMPLER(4),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(5),                                   { =
STATE_SAMPLER(5),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(6),                                   { =
STATE_SAMPLER(6),                                   sampler_texdim      =
}},=0A=
-    { STATE_SAMPLER(7),                                   { =
STATE_SAMPLER(7),                                   sampler_texdim      =
}},=0A=
+    { STATE_SAMPLER(0),                                   { =
STATE_SAMPLER(0),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(1),                                   { =
STATE_SAMPLER(1),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(2),                                   { =
STATE_SAMPLER(2),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(3),                                   { =
STATE_SAMPLER(3),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(4),                                   { =
STATE_SAMPLER(4),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(5),                                   { =
STATE_SAMPLER(5),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(6),                                   { =
STATE_SAMPLER(6),                                   nvts_texdim         =
}},=0A=
+    { STATE_SAMPLER(7),                                   { =
STATE_SAMPLER(7),                                   nvts_texdim         =
}},=0A=
     {0 /* Terminate */,                                   { 0,          =
                                        0                   }},=0A=
 };=0A=
 =0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index 71833d5..6093b32 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -3392,110 +3392,75 @@ void add_ffp_shader(struct list *shaders, =
struct ffp_desc *desc) {=0A=
  */=0A=
 #define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
 void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
-    BOOL bumpmap =3D FALSE;=0A=
-=0A=
-    if(stage > 0 && (stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAPLUMINANCE ||=0A=
-                     stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAP)) {=0A=
-        bumpmap =3D TRUE;=0A=
-        context->texShaderBumpMap |=3D (1 << stage);=0A=
-    } else {=0A=
-        context->texShaderBumpMap &=3D ~(1 << stage);=0A=
-    }=0A=
-=0A=
     if(stateblock->textures[stage]) {=0A=
         switch(stateblock->textureDimensions[stage]) {=0A=
             case GL_TEXTURE_2D:=0A=
-                if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-                    glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, bumpmap ? GL_OFFSET_TEXTURE_2D_NV : =
GL_TEXTURE_2D);=0A=
-                    checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
-                } else {=0A=
-                    glDisable(GL_TEXTURE_3D);=0A=
-                    checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
-                    if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
-                        glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                        =
checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
-                    }=0A=
-                    if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
-                        glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
-                        =
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
-                    }=0A=
-                    glEnable(GL_TEXTURE_2D);=0A=
-                    checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
+                glDisable(GL_TEXTURE_3D);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+                if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+                    glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+                    checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+                }=0A=
+                if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+                    glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+                    checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
                 }=0A=
+                glEnable(GL_TEXTURE_2D);=0A=
+                checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
                 break;=0A=
             case GL_TEXTURE_RECTANGLE_ARB:=0A=
-                if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-                    glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, bumpmap ? GL_OFFSET_TEXTURE_2D_NV : =
GL_TEXTURE_RECTANGLE_ARB);=0A=
-                    checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
-                } else {=0A=
-                    glDisable(GL_TEXTURE_2D);=0A=
-                    checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
-                    glDisable(GL_TEXTURE_3D);=0A=
-                    checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
-                    if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
-                        glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                        =
checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
-                    }=0A=
-                    glEnable(GL_TEXTURE_RECTANGLE_ARB);=0A=
-                    checkGLcall("glEnable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
+                glDisable(GL_TEXTURE_2D);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+                glDisable(GL_TEXTURE_3D);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+                if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+                    glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+                    checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
                 }=0A=
+                glEnable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+                checkGLcall("glEnable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
                 break;=0A=
             case GL_TEXTURE_3D:=0A=
-                if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-                    glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_3D);=0A=
-                    checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_3D)");=0A=
-                } else {=0A=
-                    if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
-                        glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                        =
checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
-                    }=0A=
-                    if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
-                        glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
-                        =
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
-                    }=0A=
-                    glDisable(GL_TEXTURE_2D);=0A=
-                    checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
-                    glEnable(GL_TEXTURE_3D);=0A=
-                    checkGLcall("glEnable(GL_TEXTURE_3D)");=0A=
+                if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+                    glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+                    checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
                 }=0A=
+                if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+                    glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+                    checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
+                }=0A=
+                glDisable(GL_TEXTURE_2D);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+                glEnable(GL_TEXTURE_3D);=0A=
+                checkGLcall("glEnable(GL_TEXTURE_3D)");=0A=
                 break;=0A=
             case GL_TEXTURE_CUBE_MAP_ARB:=0A=
-                if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-                    glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                    checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB)");=0A=
-                } else {=0A=
-                    glDisable(GL_TEXTURE_2D);=0A=
-                    checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
-                    glDisable(GL_TEXTURE_3D);=0A=
-                    checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
-                    if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
-                        glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
-                        =
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
-                    }=0A=
-                    glEnable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                    checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+                glDisable(GL_TEXTURE_2D);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+                glDisable(GL_TEXTURE_3D);=0A=
+                checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+                if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+                    glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+                    checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
                 }=0A=
+                glEnable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+                checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
               break;=0A=
         }=0A=
     } else {=0A=
-        if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-            glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_NONE);=0A=
-            checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_NONE)");=0A=
-        } else {=0A=
-            glEnable(GL_TEXTURE_2D);=0A=
-            checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
-            glDisable(GL_TEXTURE_3D);=0A=
-            checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
-            if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
-                glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
-            }=0A=
-            if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
-                glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
-                checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
-            }=0A=
-            /* Binding textures is done by samplers. A dummy texture =
will be bound */=0A=
+        glEnable(GL_TEXTURE_2D);=0A=
+        checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
+        glDisable(GL_TEXTURE_3D);=0A=
+        checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+        if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+            glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+            checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+        }=0A=
+        if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+            glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+            checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
         }=0A=
+        /* Binding textures is done by samplers. A dummy texture will =
be bound */=0A=
     }=0A=
 }=0A=
 =0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0011_01C8E33C.6EEBCFF0--




More information about the wine-patches mailing list