[2/2] wined3d: Cleanup the pixelshader() state handler a little bit

H. Verbeet hverbeet at gmail.com
Tue Feb 13 12:53:20 CST 2007


On 13/02/07, H. Verbeet <hverbeet at gmail.com> wrote:
> Changelog:
>   - Cleanup the pixelshader() state handler a little bit
>
This conflicts with 380930dc54337ba2e486e295714edb13c569f3ea, use the
attached patch instead.
-------------- next part --------------
---

 dlls/wined3d/state.c |   32 ++++++++++----------------------
 1 files changed, 10 insertions(+), 22 deletions(-)

diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index b4a1ab9..61ab215 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1905,9 +1905,11 @@ static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
 }
 
 static void pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+    BOOL use_ps = stateblock->pixelShader && ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function != NULL;
+    BOOL use_vs = stateblock->vertexShader && ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function != NULL;
     int i;
 
-    if(stateblock->pixelShader && ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.function != NULL) {
+    if (use_ps) {
         if(!context->last_was_pshader) {
             /* Former draw without a pixel shader, some samplers
              * may be disabled because of WINED3DTSS_COLOROP = WINED3DTOP_DISABLE
@@ -1926,18 +1928,6 @@ static void pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
 
         /* Compile and bind the shader */
         IWineD3DPixelShader_CompileShader(stateblock->pixelShader);
-
-        if(!isStateDirty(context, StateTable[STATE_VSHADER].representative)) {
-            stateblock->wineD3DDevice->shader_backend->shader_select(
-                    (IWineD3DDevice *) stateblock->wineD3DDevice,
-                    TRUE,
-                    !stateblock->vertexShader ? FALSE : ((IWineD3DVertexShaderImpl *) stateblock->vertexShader)->baseShader.function != NULL);
-            
-            if(!isStateDirty(context, STATE_VERTEXSHADERCONSTANT)) {
-                shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
-            }
-        }
-        context->last_was_pshader = TRUE;
     } else {
         /* Disabled the pixel shader - color ops weren't applied
          * while it was enabled, so re-apply them.
@@ -1947,19 +1937,17 @@ static void pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
                 tex_colorop(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
             }
         }
-        context->last_was_pshader = FALSE;
+    }
 
-        if(!isStateDirty(context, StateTable[STATE_VSHADER].representative)) {
-            stateblock->wineD3DDevice->shader_backend->shader_select(
-                    (IWineD3DDevice *) stateblock->wineD3DDevice,
-                    FALSE,
-                    !stateblock->vertexShader ? FALSE : ((IWineD3DVertexShaderImpl *) stateblock->vertexShader)->baseShader.function != NULL);
+    if(!isStateDirty(context, StateTable[STATE_VSHADER].representative)) {
+        stateblock->wineD3DDevice->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, use_ps, use_vs);
 
-            if(!isStateDirty(context, STATE_VERTEXSHADERCONSTANT)) {
-                shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
-            }
+        if(!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vs || use_ps)) {
+            shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
         }
     }
+
+    context->last_was_pshader = use_ps;
 }
 
 static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {


More information about the wine-patches mailing list