iris: Implement WA for push constants.
authorRafael Antognolli <rafael.antognolli@intel.com>
Tue, 19 Nov 2019 23:00:06 +0000 (15:00 -0800)
committerRafael Antognolli <rafael.antognolli@intel.com>
Fri, 13 Dec 2019 22:15:04 +0000 (14:15 -0800)
v2: Apply WA to gen11+ instead of gen12+ (Jordan).

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/gallium/drivers/iris/iris_state.c

index 10c1bc4b7c35f759361eadfc96e826cb0d5baba4..c4b7393419a07f858e482cca4289ba7b412ebad8 100644 (file)
@@ -5412,12 +5412,23 @@ iris_upload_dirty_render_state(struct iris_context *ice,
       }
    }
 
+   /* GEN:BUG:1604061319
+    *
+    *    3DSTATE_CONSTANT_* needs to be programmed before BTP_*
+    *
+    * Testing shows that all the 3DSTATE_CONSTANT_XS need to be emitted if
+    * any stage has a dirty binding table.
+    */
+   const bool emit_const_wa = GEN_GEN >= 11 &&
+      (dirty & IRIS_ALL_DIRTY_BINDINGS) != 0;
+
 #if GEN_GEN >= 12
    uint32_t nobuffer_stages = 0;
 #endif
 
    for (int stage = 0; stage <= MESA_SHADER_FRAGMENT; stage++) {
-      if (!(dirty & (IRIS_DIRTY_CONSTANTS_VS << stage)))
+      if (!(dirty & (IRIS_DIRTY_CONSTANTS_VS << stage)) &&
+          !emit_const_wa)
          continue;
 
       struct iris_shader_state *shs = &ice->state.shaders[stage];