[PATCH 5/5] wined3d: Invalidate shaders when interpolation qualifiers might change.

Matteo Bruni mbruni at codeweavers.com
Mon Jun 4 13:32:32 CDT 2018


Signed-off-by: Matteo Bruni <mbruni at 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
-- 
2.16.1




More information about the wine-devel mailing list