Signed-off-by: Matteo Bruni mbruni@codeweavers.com --- dlls/wined3d/cs.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 3f1ca8ce658..e5ae7f478f8 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1444,10 +1444,21 @@ void wined3d_cs_emit_set_sampler(struct wined3d_cs *cs, enum wined3d_shader_type
static void wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) { + const struct wined3d_gl_info *gl_info = &cs->device->adapter->gl_info; const struct wined3d_cs_set_shader *op = data;
cs->state.shader[op->type] = op->shader; device_invalidate_state(cs->device, STATE_SHADER(op->type)); + if (needs_interpolation_qualifiers_for_shader_outputs(gl_info) && op->type == WINED3D_SHADER_TYPE_PIXEL + && op->shader && op->shader->reg_maps.shader_version.major >= 4) + { + if (cs->state.shader[WINED3D_SHADER_TYPE_GEOMETRY]) + device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY)); + else if (cs->state.shader[WINED3D_SHADER_TYPE_DOMAIN]) + device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_DOMAIN)); + else if (cs->state.shader[WINED3D_SHADER_TYPE_VERTEX]) + device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX)); + } if (op->type != WINED3D_SHADER_TYPE_COMPUTE) device_invalidate_state(cs->device, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); else