crocus/gen7: add missing IVB/GT2 geom shader workaround.
authorDave Airlie <airlied@redhat.com>
Tue, 14 Sep 2021 06:59:03 +0000 (16:59 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 14 Sep 2021 07:03:36 +0000 (07:03 +0000)
Noticed this in passing.

Fixes: f3630548f1da ("crocus: initial gallium driver for Intel gfx 4-7")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12847>

src/gallium/drivers/crocus/crocus_context.h
src/gallium/drivers/crocus/crocus_state.c

index 4cb9368..06a0ff0 100644 (file)
@@ -626,6 +626,8 @@ struct crocus_context {
 
       struct crocus_shader_state shaders[MESA_SHADER_STAGES];
 
+      /* track if geom shader is active for IVB GT2 workaround */
+      bool gs_enabled;
       /** Do vertex shader uses shader draw parameters ? */
       bool vs_uses_draw_params;
       bool vs_uses_derived_draw_params;
index 7eb3dc7..0b65451 100644 (file)
@@ -6809,6 +6809,22 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
 
       emit_push_constant_packets(ice, batch, MESA_SHADER_GEOMETRY, &push_bos);
 #endif
+#if GFX_VERx10 == 70
+   /**
+    * From Graphics BSpec: 3D-Media-GPGPU Engine > 3D Pipeline Stages >
+    * Geometry > Geometry Shader > State:
+    *
+    *     "Note: Because of corruption in IVB:GT2, software needs to flush the
+    *     whole fixed function pipeline when the GS enable changes value in
+    *     the 3DSTATE_GS."
+    *
+    * The hardware architects have clarified that in this context "flush the
+    * whole fixed function pipeline" means to emit a PIPE_CONTROL with the "CS
+    * Stall" bit set.
+    */
+   if (batch->screen->devinfo.gt == 2 && ice->state.gs_enabled != active)
+      gen7_emit_cs_stall_flush(batch);
+#endif
 #if GFX_VER >= 6
       crocus_emit_cmd(batch, GENX(3DSTATE_GS), gs)
 #else
@@ -6954,6 +6970,7 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
          gs.MaximumVPIndex = ice->state.num_viewports - 1;
 #endif
       }
+      ice->state.gs_enabled = active;
    }
 
 #if GFX_VER >= 7