[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