intel: add missing PS restriction on BDW+
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 26 Jan 2023 19:37:54 +0000 (21:37 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 1 Feb 2023 00:28:53 +0000 (00:28 +0000)
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: mesa-stable
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20949>

src/intel/blorp/blorp_genX_exec.h
src/intel/common/intel_genX_state.h

index 3eec1f5..1a2f939 100644 (file)
@@ -859,25 +859,6 @@ blorp_emit_ps_config(struct blorp_batch *batch,
       if (GFX_VER == 11)
          ps.SamplerCount = 0;
 
-      if (prog_data) {
-         intel_set_ps_dispatch_state(&ps, devinfo, prog_data,
-                                     params->num_samples);
-
-         ps.DispatchGRFStartRegisterForConstantSetupData0 =
-            brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 0);
-         ps.DispatchGRFStartRegisterForConstantSetupData1 =
-            brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 1);
-         ps.DispatchGRFStartRegisterForConstantSetupData2 =
-            brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 2);
-
-         ps.KernelStartPointer0 = params->wm_prog_kernel +
-                                  brw_wm_prog_data_prog_offset(prog_data, ps, 0);
-         ps.KernelStartPointer1 = params->wm_prog_kernel +
-                                  brw_wm_prog_data_prog_offset(prog_data, ps, 1);
-         ps.KernelStartPointer2 = params->wm_prog_kernel +
-                                  brw_wm_prog_data_prog_offset(prog_data, ps, 2);
-      }
-
       /* 3DSTATE_PS expects the number of threads per PSD, which is always 64
        * for pre Gfx11 and 128 for gfx11+; On gfx11+ If a programmed value is
        * k, it implies 2(k+1) threads. It implicitly scales for different GT
@@ -915,6 +896,25 @@ blorp_emit_ps_config(struct blorp_batch *batch,
       default:
          unreachable("Invalid fast clear op");
       }
+
+      if (prog_data) {
+         intel_set_ps_dispatch_state(&ps, devinfo, prog_data,
+                                     params->num_samples);
+
+         ps.DispatchGRFStartRegisterForConstantSetupData0 =
+            brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 0);
+         ps.DispatchGRFStartRegisterForConstantSetupData1 =
+            brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 1);
+         ps.DispatchGRFStartRegisterForConstantSetupData2 =
+            brw_wm_prog_data_dispatch_grf_start_reg(prog_data, ps, 2);
+
+         ps.KernelStartPointer0 = params->wm_prog_kernel +
+                                  brw_wm_prog_data_prog_offset(prog_data, ps, 0);
+         ps.KernelStartPointer1 = params->wm_prog_kernel +
+                                  brw_wm_prog_data_prog_offset(prog_data, ps, 1);
+         ps.KernelStartPointer2 = params->wm_prog_kernel +
+                                  brw_wm_prog_data_prog_offset(prog_data, ps, 2);
+      }
    }
 
    blorp_emit(batch, GENX(3DSTATE_PS_EXTRA), psx) {
index 08e7420..dd6fbe9 100644 (file)
@@ -51,6 +51,27 @@ intel_set_ps_dispatch_state(struct GENX(3DSTATE_PS) *ps,
    bool enable_16 = prog_data->dispatch_16;
    bool enable_32 = prog_data->dispatch_32;
 
+#if GFX_VER >= 9
+   /* SKL PRMs, Volume 2a: Command Reference: Instructions:
+    *    3DSTATE_PS_BODY::8 Pixel Dispatch Enable:
+    *
+    *    "When Render Target Fast Clear Enable is ENABLED or Render Target
+    *     Resolve Type = RESOLVE_PARTIAL or RESOLVE_FULL, this bit must be
+    *     DISABLED."
+    */
+   if (ps->RenderTargetFastClearEnable ||
+       ps->RenderTargetResolveType == RESOLVE_PARTIAL ||
+       ps->RenderTargetResolveType == RESOLVE_FULL)
+      enable_8 = false;
+#elif GFX_VER >= 8
+   /* BDW has the same wording as SKL, except some of the fields mentioned
+    * don't exist...
+    */
+   if (ps->RenderTargetFastClearEnable ||
+       ps->RenderTargetResolveEnable)
+      enable_8 = false;
+#endif
+
    if (prog_data->persample_dispatch) {
       /* TGL PRMs, Volume 2d: Command Reference: Structures:
        *    3DSTATE_PS_BODY::32 Pixel Dispatch Enable: