[PATCH 3/5] wined3d: Don't access the stateblock from shader_arb_load_constants_internal

Stefan Dösinger stefan at codeweavers.com
Sun May 12 08:30:25 CDT 2013


This drops the stateblock->changed.*ShaderConstants{I/B} check, but I
think that it is safe to assume that any sane program using a shader
that reads these constants will at least set them once.
---
 dlls/wined3d/arb_program_shader.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 6756927..ebacac2 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -651,23 +651,19 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
  */
 /* Context activation is done by the caller (state handler). */
 static void shader_arb_load_constants_internal(const struct wined3d_context *context,
-        BOOL usePixelShader, BOOL useVertexShader, BOOL from_shader_select)
+        BOOL usePixelShader, BOOL useVertexShader, BOOL from_shader_select,
+        const struct wined3d_state *state, struct shader_arb_priv *priv)
 {
-    struct wined3d_device *device = context->swapchain->device;
-    const struct wined3d_stateblock *stateblock = device->stateBlock;
-    const struct wined3d_state *state = &stateblock->state;
-    const struct wined3d_gl_info *gl_info = context->gl_info;
     const struct wined3d_d3d_info *d3d_info = context->d3d_info;
-    struct shader_arb_priv *priv = device->shader_priv;
+    const struct wined3d_gl_info *gl_info = context->gl_info;
 
     if (!from_shader_select)
     {
         const struct wined3d_shader *vshader = state->vertex_shader, *pshader = state->pixel_shader;
         if (vshader
-                && (stateblock->changed.vertexShaderConstantsB & vshader->reg_maps.boolean_constants
+                && (vshader->reg_maps.boolean_constants
                 || (!gl_info->supported[NV_VERTEX_PROGRAM2_OPTION]
-                && (stateblock->changed.vertexShaderConstantsI
-                & vshader->reg_maps.integer_constants & ~vshader->reg_maps.local_int_consts))))
+                && (vshader->reg_maps.integer_constants & ~vshader->reg_maps.local_int_consts))))
         {
             TRACE("bool/integer vertex shader constants potentially modified, forcing shader reselection.\n");
             shader_arb_select(context,
@@ -675,10 +671,9 @@ static void shader_arb_load_constants_internal(const struct wined3d_context *con
                     usePixelShader ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP);
         }
         else if (pshader
-                && (stateblock->changed.pixelShaderConstantsB & pshader->reg_maps.boolean_constants
+                && (pshader->reg_maps.boolean_constants
                 || (!gl_info->supported[NV_FRAGMENT_PROGRAM_OPTION]
-                && (stateblock->changed.pixelShaderConstantsI
-                & pshader->reg_maps.integer_constants & ~pshader->reg_maps.local_int_consts))))
+                && (pshader->reg_maps.integer_constants & ~pshader->reg_maps.local_int_consts))))
         {
             TRACE("bool/integer pixel shader constants potentially modified, forcing shader reselection.\n");
             shader_arb_select(context,
@@ -726,7 +721,11 @@ static void shader_arb_load_constants_internal(const struct wined3d_context *con
 
 static void shader_arb_load_constants(const struct wined3d_context *context, BOOL ps, BOOL vs)
 {
-    shader_arb_load_constants_internal(context, ps, vs, FALSE);
+    struct wined3d_device *device = context->swapchain->device;
+    const struct wined3d_stateblock *stateblock = device->stateBlock;
+    const struct wined3d_state *state = &stateblock->state;
+
+    shader_arb_load_constants_internal(context, ps, vs, FALSE, state, device->shader_priv);
 }
 
 static void shader_arb_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count)
@@ -4654,7 +4653,7 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
                 priv->pshader_const_dirty[i] = 1;
             }
             /* Also takes care of loading local constants */
-            shader_arb_load_constants_internal(context, TRUE, FALSE, TRUE);
+            shader_arb_load_constants_internal(context, TRUE, FALSE, TRUE, state, device->shader_priv);
         }
         else
         {
-- 
1.8.1.5




More information about the wine-patches mailing list