Module: wine Branch: master Commit: f1e52bf16218ffeacf91438b7928d1d678099b0c URL: https://gitlab.winehq.org/wine/wine/-/commit/f1e52bf16218ffeacf91438b7928d1d...
Author: Elizabeth Figura zfigura@codeweavers.com Date: Sun Jun 9 12:50:25 2024 -0500
wined3d: Feed the fragment part of WINED3D_RS_SPECULARENABLE through a push constant buffer.
---
dlls/wined3d/glsl_shader.c | 12 +----------- dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/stateblock.c | 5 +++++ dlls/wined3d/wined3d_private.h | 3 +++ 4 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 3c97eebe124..4f7929923b8 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1901,10 +1901,7 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, if (prog->ps.tex_factor_location != -1) GL_EXTCALL(glUniform4fv(prog->ps.tex_factor_location, 1, &constants->texture_factor.r));
- if (state->render_states[WINED3D_RS_SPECULARENABLE]) - GL_EXTCALL(glUniform4f(prog->ps.specular_enable_location, 1.0f, 1.0f, 1.0f, 0.0f)); - else - GL_EXTCALL(glUniform4f(prog->ps.specular_enable_location, 0.0f, 0.0f, 0.0f, 0.0f)); + GL_EXTCALL(glUniform4fv(prog->ps.specular_enable_location, 1, &constants->specular_enable.r));
for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) { @@ -12286,12 +12283,6 @@ static void glsl_fragment_pipe_tex_transform(struct wined3d_context *context, context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; }
-static void glsl_fragment_pipe_invalidate_constants(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_PS; -} - static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -12451,7 +12442,6 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {STATE_TEXTURESTAGE(5,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(6,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(7,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_SPECULARENABLE), {STATE_RENDER(WINED3D_RS_SPECULARENABLE), glsl_fragment_pipe_invalidate_constants}, WINED3D_GL_EXT_NONE }, {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, glsl_fragment_pipe_shader }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_fragment_pipe_shademode }, WINED3D_GLSL_130 }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), state_shademode }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index b4ef9f61f43..61a64f07a6f 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1253,7 +1253,6 @@ static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_state {STATE_RENDER(WINED3D_RS_ALPHAREF), {STATE_RENDER(WINED3D_RS_ALPHAREF), state_nop}}, {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHAFUNC), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), state_nop}}, - {STATE_RENDER(WINED3D_RS_SPECULARENABLE), {STATE_RENDER(WINED3D_RS_SPECULARENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGCOLOR), {STATE_RENDER(WINED3D_RS_FOGCOLOR), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGTABLEMODE), {STATE_RENDER(WINED3D_RS_FOGTABLEMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGSTART), {STATE_RENDER(WINED3D_RS_FOGSTART), state_nop}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 104affe6e56..f97b03e508e 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1542,6 +1542,7 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb } break;
+ case WINED3D_RS_SPECULARENABLE: case WINED3D_RS_TEXTUREFACTOR: stateblock->changed.ffp_ps_constants = 1; break; @@ -3326,6 +3327,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
if (changed->ffp_ps_constants) { + static const struct wined3d_color specular_enabled = {1.0f, 1.0f, 1.0f, 0.0f}; + static const struct wined3d_color specular_disabled; struct wined3d_ffp_ps_constants constants;
for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) @@ -3333,6 +3336,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
wined3d_color_from_d3dcolor(&constants.texture_factor, state->rs[WINED3D_RS_TEXTUREFACTOR]);
+ constants.specular_enable = state->rs[WINED3D_RS_SPECULARENABLE] ? specular_enabled : specular_disabled; + wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_PS_FFP, WINED3D_SHADER_CONST_FFP_PS, 0, sizeof(constants), &constants); } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 46cc0ec30ce..5bfc13f3b88 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2771,6 +2771,9 @@ struct wined3d_ffp_ps_constants { struct wined3d_color texture_constants[WINED3D_MAX_FFP_TEXTURES]; struct wined3d_color texture_factor; + /* (1, 1, 1, 0) or (0, 0, 0, 0), which shaders will multiply with the + * specular color. */ + struct wined3d_color specular_enable; };
enum wined3d_push_constants