From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/ffp_gl.c | 2 +- dlls/wined3d/glsl_shader.c | 14 +------------- dlls/wined3d/shader.c | 2 +- dlls/wined3d/stateblock.c | 8 +++++++- dlls/wined3d/utils.c | 4 ++-- dlls/wined3d/wined3d_private.h | 1 + 6 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index f6c1b96baf4..d617f8d5194 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1527,7 +1527,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) } rs_holes[] = { - { 1, 8}, + { 1, 9}, { 11, 25}, { 27, 27}, { 30, 40}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 247f08f887c..0651efaac95 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -10575,8 +10575,7 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl, { reorder_shader_id = shader_glsl_generate_vs3_rasterizer_input_setup(priv, vshader, pshader, state->primitive_type == WINED3D_PT_POINTLIST && vshader->reg_maps.point_size, - d3d_info->emulated_flatshading - && state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT, gl_info); + d3d_info->emulated_flatshading && state->extra_vs_args.flat_shading, gl_info); TRACE("Attaching GLSL shader object %u to program %u.\n", reorder_shader_id, program_id); GL_EXTCALL(glAttachShader(program_id, reorder_shader_id)); checkGLcall("glAttachShader"); @@ -11806,9 +11805,6 @@ static void glsl_vertex_pipe_vp_free(struct wined3d_device *device, struct wined wine_rb_destroy(&priv->ffp_vertex_shaders, shader_glsl_free_ffp_vertex_shader, &ctx); }
-static void glsl_vertex_pipe_nop(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) {} - static void glsl_vertex_pipe_vdecl(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -11899,12 +11895,6 @@ static void glsl_vertex_pipe_pointsize(struct wined3d_context *context, context->constant_update_mask |= WINED3D_SHADER_CONST_VS_POINTSIZE; }
-static void glsl_vertex_pipe_shademode(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_VERTEX; -} - static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = { {STATE_VDECL, {STATE_VDECL, glsl_vertex_pipe_vdecl }, WINED3D_GL_EXT_NONE }, @@ -11930,8 +11920,6 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_POINTSIZE), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), glsl_vertex_pipe_pointsize}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSIZE_MAX), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_vertex_pipe_shademode}, WINED3D_GLSL_130 }, - {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_vertex_pipe_nop }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXCOORD_INDEX), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXCOORD_INDEX), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXCOORD_INDEX), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 1236a7f6229..c6e219c94eb 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2740,7 +2740,7 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3 args->next_shader_input_count = 0; args->swizzle_map = swizzle_map; if (d3d_info->emulated_flatshading) - args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; + args->flatshading = state->extra_vs_args.flat_shading; else args->flatshading = 0;
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index bf5c3a887e3..3560bbcaf2c 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1718,11 +1718,15 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb case WINED3D_RS_ALPHAFUNC: case WINED3D_RS_ALPHATESTENABLE: case WINED3D_RS_POINTSPRITEENABLE: - case WINED3D_RS_SHADEMODE: case WINED3D_RS_SRGBWRITEENABLE: stateblock->changed.extra_ps_args = 1; break;
+ case WINED3D_RS_SHADEMODE: + stateblock->changed.extra_vs_args = 1; + stateblock->changed.extra_ps_args = 1; + break; + case WINED3D_RS_FOGENABLE: stateblock->changed.ffp_vs_settings = 1; stateblock->changed.extra_ps_args = 1; @@ -3233,6 +3237,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, case WINED3D_RS_CLIPPING: case WINED3D_RS_CLIPPLANEENABLE: case WINED3D_RS_FOGTABLEMODE: + case WINED3D_RS_SHADEMODE: break;
case WINED3D_RS_ANTIALIAS: @@ -3983,6 +3988,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
args.clip_planes = state->rs[WINED3D_RS_CLIPPING] ? state->rs[WINED3D_RS_CLIPPLANEENABLE] : 0; args.pixel_fog = (state->rs[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE); + args.flat_shading = state->rs[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; wined3d_device_context_emit_set_extra_vs_args(context, &args); }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index e8a0a3c58ec..d6adfaf59a6 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6519,7 +6519,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct settings->texcoords = wined3d_mask_from_size(WINED3D_MAX_FFP_TEXTURES);
if (d3d_info->emulated_flatshading) - settings->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; + settings->flatshading = state->extra_vs_args.flat_shading; else settings->flatshading = FALSE;
@@ -6613,7 +6613,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct settings->fog_mode = WINED3D_FFP_VS_FOG_DEPTH;
if (d3d_info->emulated_flatshading) - settings->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; + settings->flatshading = state->extra_vs_args.flat_shading; else settings->flatshading = FALSE;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index bc2076cc46b..d70da4260e2 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2878,6 +2878,7 @@ struct wined3d_extra_vs_args { uint8_t clip_planes; bool pixel_fog; + bool flat_shading; };
struct wined3d_extra_ps_args