From: Elizabeth Figura zfigura@codeweavers.com
We still need to pass it through the CS, for the sake of the vertex side. --- dlls/wined3d/ffp_gl.c | 23 ++++++++--------------- dlls/wined3d/glsl_shader.c | 7 ------- dlls/wined3d/shader.c | 2 +- dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/stateblock.c | 2 ++ dlls/wined3d/utils.c | 2 +- dlls/wined3d/wined3d_private.h | 1 + 7 files changed, 13 insertions(+), 25 deletions(-)
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 4c587f2edc4..a0411214733 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -100,22 +100,15 @@ void state_shademode(struct wined3d_context *context, const struct wined3d_state { const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
- switch (state->render_states[WINED3D_RS_SHADEMODE]) + if (state->extra_ps_args.flat_shading) { - case WINED3D_SHADE_FLAT: - gl_info->gl_ops.gl.p_glShadeModel(GL_FLAT); - checkGLcall("glShadeModel(GL_FLAT)"); - break; - case WINED3D_SHADE_GOURAUD: - /* WINED3D_SHADE_PHONG in practice is the same as WINED3D_SHADE_GOURAUD - * in D3D. */ - case WINED3D_SHADE_PHONG: - gl_info->gl_ops.gl.p_glShadeModel(GL_SMOOTH); - checkGLcall("glShadeModel(GL_SMOOTH)"); - break; - default: - FIXME("Unrecognized shade mode %#x.\n", - state->render_states[WINED3D_RS_SHADEMODE]); + gl_info->gl_ops.gl.p_glShadeModel(GL_FLAT); + checkGLcall("glShadeModel(GL_FLAT)"); + } + else + { + gl_info->gl_ops.gl.p_glShadeModel(GL_SMOOTH); + checkGLcall("glShadeModel(GL_SMOOTH)"); } }
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 390e371d4d7..48943dbbe2a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -12150,12 +12150,6 @@ static void glsl_fragment_pipe_alpha_test(struct wined3d_context_gl *context_gl, } }
-static void glsl_fragment_pipe_shademode(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; -} - static const struct wined3d_state_entry_template glsl_fragment_pipe_state_template[] = { {STATE_VDECL, {STATE_VDECL, glsl_fragment_pipe_vdecl }, WINED3D_GL_EXT_NONE }, @@ -12248,7 +12242,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_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_fragment_pipe_shademode }, WINED3D_GL_EXT_NONE }, {0 /* Terminate */, {0, 0 }, WINED3D_GL_EXT_NONE }, };
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 4c9ea349bc9..1c0aada0681 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -3120,7 +3120,7 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3 : WINED3D_CMP_ALWAYS) - 1;
if (d3d_info->emulated_flatshading) - args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; + args->flatshading = state->extra_ps_args.flat_shading;
for (i = 0; i < ARRAY_SIZE(state->fb.render_targets); ++i) { diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 062929f9265..a033c69feec 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1283,7 +1283,6 @@ static void spirv_fragment_pipe_vk_fp_free_context_data(struct wined3d_context *
static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_states[] = { - {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), 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}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 390694ca852..cb26f01a0b9 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1711,6 +1711,7 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb break;
case WINED3D_RS_POINTSPRITEENABLE: + case WINED3D_RS_SHADEMODE: stateblock->changed.extra_ps_args = 1; break;
@@ -3952,6 +3953,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, struct wined3d_extra_ps_args args;
args.point_sprite = state->rs[WINED3D_RS_POINTSPRITEENABLE]; + args.flat_shading = state->rs[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; wined3d_device_context_emit_set_extra_ps_args(context, &args); }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 11b72e6ebc6..f068c6ebf77 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6457,7 +6457,7 @@ void wined3d_ffp_get_fs_settings(const struct wined3d_state *state, : WINED3D_CMP_ALWAYS) - 1;
if (d3d_info->emulated_flatshading) - settings->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; + settings->flatshading = state->extra_ps_args.flat_shading; else settings->flatshading = FALSE; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 6dca6452201..9a391475ba8 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2876,6 +2876,7 @@ enum wined3d_push_constants struct wined3d_extra_ps_args { bool point_sprite; + bool flat_shading; };
struct wined3d_blend_state