From: Matteo Bruni mbruni@codeweavers.com
--- dlls/wined3d/cs.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index bf171326926..932080bc406 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1690,6 +1690,7 @@ void wined3d_device_context_emit_set_samplers(struct wined3d_device_context *con
static void wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) { + const struct wined3d_d3d_info *d3d_info = &cs->c.device->adapter->d3d_info; const struct wined3d_cs_set_shader *op = data;
/* CB binding may have been skipped earlier if the shader wasn't set, so make it happen. */ @@ -1697,6 +1698,8 @@ static void wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) device_invalidate_state(cs->c.device, STATE_CONSTANT_BUFFER(op->type)); cs->state.shader[op->type] = op->shader; device_invalidate_state(cs->c.device, STATE_SHADER(op->type)); + if (op->type == WINED3D_SHADER_TYPE_VERTEX && !d3d_info->vs_clipping) + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); if (op->type != WINED3D_SHADER_TYPE_COMPUTE) device_invalidate_state(cs->c.device, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); else @@ -1819,10 +1822,14 @@ void wined3d_device_context_set_depth_bounds(struct wined3d_device_context *cont
static void wined3d_cs_exec_set_render_state(struct wined3d_cs *cs, const void *data) { + const struct wined3d_d3d_info *d3d_info = &cs->c.device->adapter->d3d_info; const struct wined3d_cs_set_render_state *op = data;
cs->state.render_states[op->state] = op->value; device_invalidate_state(cs->c.device, STATE_RENDER(op->state)); + if ((op->state == WINED3D_RS_CLIPPING || op->state == WINED3D_RS_CLIPPLANEENABLE) + && !d3d_info->vs_clipping && cs->state.shader[WINED3D_SHADER_TYPE_VERTEX]) + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); }
void wined3d_device_context_emit_set_render_state(struct wined3d_device_context *context,