From: Elizabeth Figura zfigura@codeweavers.com
Arguably there is a benefit here in that it reduces shader backend state application down to a single method, although whether that is an improvement may be up for debate.
More saliently, we would like to move FFP state application out of the state table and into a linear state function. In practice that function will probably be vp_enable / fp_enable. In that case we will need those functions, and hence also shader_select(), to be called when more states are dirty.
This does not in itself mean that shader_load_constants() needs to be merged with shader_select(), but it does remove the primary impetus for keeping them separate. --- dlls/wined3d/arb_program_shader.c | 28 +++++++++++++----------- dlls/wined3d/context_gl.c | 16 +++++--------- dlls/wined3d/glsl_shader.c | 36 +++++++++++++++++++------------ dlls/wined3d/shader.c | 3 --- dlls/wined3d/shader_spirv.c | 7 ------ dlls/wined3d/wined3d_private.h | 2 -- 6 files changed, 43 insertions(+), 49 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index eecbe1c22b1..e8d9b3feeb6 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -714,13 +714,6 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv, str } }
-static void shader_arb_load_constants(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state) -{ - shader_arb_load_constants_internal(shader_priv, wined3d_context_gl(context), - state, use_ps(state), use_vs(state), FALSE); -} - static void shader_arb_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count) { struct wined3d_context_gl *context_gl = wined3d_context_gl_get_current(); @@ -4614,12 +4607,11 @@ static void find_arb_vs_compile_args(const struct wined3d_state *state, }
/* Context activation is done by the caller. */ -static void shader_arb_select(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state) +static void shader_arb_update_graphics_shaders(struct shader_arb_priv *priv, + struct wined3d_context *context, const struct wined3d_state *state) { struct wined3d_context_gl *context_gl = wined3d_context_gl(context); const struct wined3d_gl_info *gl_info = context_gl->gl_info; - struct shader_arb_priv *priv = shader_priv; int i;
/* Deal with pixel shaders first so the vertex shader arg function has the input signature ready */ @@ -4659,7 +4651,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context priv->pshader_const_dirty[i] = 1; } /* Also takes care of loading local constants */ - shader_arb_load_constants_internal(shader_priv, context_gl, state, TRUE, FALSE, TRUE); + shader_arb_load_constants_internal(priv, context_gl, state, TRUE, FALSE, TRUE); } else { @@ -4748,6 +4740,19 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context } }
+static void shader_arb_select(void *shader_priv, struct wined3d_context *context, + const struct wined3d_state *state) +{ + struct wined3d_context_gl *context_gl = wined3d_context_gl(context); + struct shader_arb_priv *priv = shader_priv; + + if (context->shader_update_mask & ~(1u << WINED3D_SHADER_TYPE_COMPUTE)) + shader_arb_update_graphics_shaders(priv, context, state); + + if (context->constant_update_mask) + shader_arb_load_constants_internal(priv, context_gl, state, use_ps(state), use_vs(state), FALSE); +} + static void shader_arb_select_compute(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state) { @@ -5708,7 +5713,6 @@ const struct wined3d_shader_backend_ops arb_program_shader_backend = shader_arb_disable, shader_arb_update_float_vertex_constants, shader_arb_update_float_pixel_constants, - shader_arb_load_constants, shader_arb_destroy, shader_arb_alloc, shader_arb_free, diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index 2c319132164..1dbacc65e3c 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -4386,12 +4386,6 @@ static BOOL context_apply_draw_state(struct wined3d_context *context,
memset(context->dirty_graphics_states, 0, sizeof(context->dirty_graphics_states));
- if (context->shader_update_mask & ~(1u << WINED3D_SHADER_TYPE_COMPUTE)) - { - device->shader_backend->shader_select(device->shader_priv, context, state); - context->shader_update_mask &= 1u << WINED3D_SHADER_TYPE_COMPUTE; - } - if (context->update_shader_resource_bindings) { for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i) @@ -4413,11 +4407,11 @@ static BOOL context_apply_draw_state(struct wined3d_context *context, if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) wined3d_context_gl_check_fbo_status(context_gl, GL_FRAMEBUFFER);
- if (context->constant_update_mask) - { - device->shader_backend->shader_load_constants(device->shader_priv, context, state); - context->constant_update_mask = 0; - } + /* WINED3D_SHADER_CONST_PS_NP2_FIXUP may be set when binding shader + * resources, so constant loading needs to be done after that. */ + device->shader_backend->shader_select(device->shader_priv, context, state); + context->shader_update_mask &= 1u << WINED3D_SHADER_TYPE_COMPUTE; + context->constant_update_mask = 0;
context->last_was_blit = FALSE; context->last_was_ffp_blit = FALSE; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index bc4053e21de..1dabaa50df0 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1513,9 +1513,8 @@ static void shader_glsl_load_color_key_constant(const struct glsl_ps_program *ps GL_EXTCALL(glUniform4fv(ps->color_key_location, 2, &float_key[0].r)); }
-/* Context activation is done by the caller (state handler). */ -static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state) +static void shader_glsl_load_constants(struct shader_glsl_priv *priv, + struct wined3d_context *context, const struct wined3d_state *state) { const struct wined3d_shader *vshader = state->shader[WINED3D_SHADER_TYPE_VERTEX]; const struct wined3d_shader *pshader = state->shader[WINED3D_SHADER_TYPE_PIXEL]; @@ -1525,7 +1524,6 @@ static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context const struct wined3d_gl_info *gl_info = context_gl->gl_info; float position_fixup[4 * WINED3D_MAX_VIEWPORTS]; struct wined3d_device *device = context->device; - struct shader_glsl_priv *priv = shader_priv; unsigned int constant_version; DWORD update_mask; int i; @@ -10697,19 +10695,17 @@ static void shader_glsl_precompile(void *shader_priv, struct wined3d_shader *sha }
/* Context activation is done by the caller. */ -static void shader_glsl_select(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state) +static void shader_glsl_update_graphics_program(struct shader_glsl_priv *priv, + struct wined3d_context_gl *context_gl, const struct wined3d_state *state) { - struct wined3d_context_gl *context_gl = wined3d_context_gl(context); - struct glsl_context_data *ctx_data = context->shader_backend_data; + struct glsl_context_data *ctx_data = context_gl->c.shader_backend_data; const struct wined3d_gl_info *gl_info = context_gl->gl_info; - struct shader_glsl_priv *priv = shader_priv; struct glsl_shader_prog_link *glsl_program; GLenum current_vertex_color_clamp; GLuint program_id, prev_id;
- priv->vertex_pipe->vp_enable(context, !use_vs(state)); - priv->fragment_pipe->fp_enable(context, !use_ps(state)); + priv->vertex_pipe->vp_enable(&context_gl->c, !use_vs(state)); + priv->fragment_pipe->fp_enable(&context_gl->c, !use_ps(state));
prev_id = ctx_data->glsl_program ? ctx_data->glsl_program->id : 0; set_glsl_shader_program(context_gl, state, priv, ctx_data); @@ -10750,10 +10746,23 @@ static void shader_glsl_select(void *shader_priv, struct wined3d_context *contex checkGLcall("glUseProgram");
if (glsl_program) - context->constant_update_mask |= glsl_program->constant_update_mask; + context_gl->c.constant_update_mask |= glsl_program->constant_update_mask; }
- context->shader_update_mask |= (1u << WINED3D_SHADER_TYPE_COMPUTE); + context_gl->c.shader_update_mask |= (1u << WINED3D_SHADER_TYPE_COMPUTE); +} + +static void shader_glsl_select(void *shader_priv, struct wined3d_context *context, + const struct wined3d_state *state) +{ + struct wined3d_context_gl *context_gl = wined3d_context_gl(context); + struct shader_glsl_priv *priv = shader_priv; + + if (context->shader_update_mask & ~(1u << WINED3D_SHADER_TYPE_COMPUTE)) + shader_glsl_update_graphics_program(priv, context_gl, state); + + if (context->constant_update_mask) + shader_glsl_load_constants(priv, context, state); }
/* Context activation is done by the caller. */ @@ -11543,7 +11552,6 @@ const struct wined3d_shader_backend_ops glsl_shader_backend = shader_glsl_disable, shader_glsl_update_float_vertex_constants, shader_glsl_update_float_pixel_constants, - shader_glsl_load_constants, shader_glsl_destroy, shader_glsl_alloc, shader_glsl_free, diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 91105a43a91..2bf3b3dc253 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -1933,8 +1933,6 @@ static void shader_none_select_compute(void *shader_priv, struct wined3d_context const struct wined3d_state *state) {} static void shader_none_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count) {} static void shader_none_update_float_pixel_constants(struct wined3d_device *device, UINT start, UINT count) {} -static void shader_none_load_constants(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state) {} static void shader_none_destroy(struct wined3d_shader *shader) {} static void shader_none_free_context_data(struct wined3d_context *context) {} static void shader_none_init_context_state(struct wined3d_context *context) {} @@ -2041,7 +2039,6 @@ const struct wined3d_shader_backend_ops none_shader_backend = shader_none_disable, shader_none_update_float_vertex_constants, shader_none_update_float_pixel_constants, - shader_none_load_constants, shader_none_destroy, shader_none_alloc, shader_none_free, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index ad34856ab5d..68a9d55bb2f 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -926,12 +926,6 @@ static void shader_spirv_update_float_pixel_constants(struct wined3d_device *dev WARN("Not implemented.\n"); }
-static void shader_spirv_load_constants(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state) -{ - WARN("Not implemented.\n"); -} - static void shader_spirv_invalidate_compute_program(struct wined3d_context_vk *context_vk, const struct shader_spirv_compute_program_vk *program) { @@ -1124,7 +1118,6 @@ static const struct wined3d_shader_backend_ops spirv_shader_backend_vk = .shader_disable = shader_spirv_disable, .shader_update_float_vertex_constants = shader_spirv_update_float_vertex_constants, .shader_update_float_pixel_constants = shader_spirv_update_float_pixel_constants, - .shader_load_constants = shader_spirv_load_constants, .shader_destroy = shader_spirv_destroy, .shader_alloc_private = shader_spirv_alloc, .shader_free_private = shader_spirv_free, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 474a31a9206..f0008313209 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1549,8 +1549,6 @@ struct wined3d_shader_backend_ops void (*shader_disable)(void *shader_priv, struct wined3d_context *context); void (*shader_update_float_vertex_constants)(struct wined3d_device *device, UINT start, UINT count); void (*shader_update_float_pixel_constants)(struct wined3d_device *device, UINT start, UINT count); - void (*shader_load_constants)(void *shader_priv, struct wined3d_context *context, - const struct wined3d_state *state); void (*shader_destroy)(struct wined3d_shader *shader); HRESULT (*shader_alloc_private)(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe);