Module: Mesa
Branch: main
Commit: d8ad51ec76c1d84747b1c74d93405ae73645d19d
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d8ad51ec76c1d84747b1c74d93405ae73645d19d

Author: Francisco Jerez <[email protected]>
Date:   Thu Nov 30 23:04:06 2023 -0800

intel/xe2+: Implement fragment shader dispatch state setup.

This sets up the PS dispatch controls to a supported combination of
Kernel0/Kernel1 dispatch modes, initializing the polygon packing
controls to use a multipolygon dispatch mode if one was provided.

Rework:
 * Jordan: Move into intel_update_ps_state()

Reviewed-by: Caio Oliveira <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26606>

---

 src/intel/common/intel_genX_state.h | 41 ++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/intel/common/intel_genX_state.h 
b/src/intel/common/intel_genX_state.h
index 919a6d10b86..affd82de277 100644
--- a/src/intel/common/intel_genX_state.h
+++ b/src/intel/common/intel_genX_state.h
@@ -118,16 +118,43 @@ intel_set_ps_dispatch_state(struct GENX(3DSTATE_PS) *ps,
    }
 
    assert(enable_8 || enable_16 || enable_32 ||
-          (GFX_VER == 12 && prog_data->dispatch_multi));
+          (GFX_VER >= 12 && prog_data->dispatch_multi));
    assert(!prog_data->dispatch_multi ||
-          (GFX_VER == 12 && !enable_8));
+          (GFX_VER >= 12 && !enable_8));
 
 #if GFX_VER >= 20
-   assert(!enable_8);
-   ps->Kernel0Enable = enable_16 || enable_32;
-   ps->Kernel0SIMDWidth = enable_16 ? 0 : 1;
-   ps->Kernel1Enable = enable_16 && enable_32;
-   ps->Kernel1SIMDWidth = SIMD32 /* SIMD32 */;
+   if (prog_data->dispatch_multi) {
+      ps->Kernel0Enable = true;
+      ps->Kernel0SIMDWidth = (prog_data->dispatch_multi == 32 ?
+                              PS_SIMD32 : PS_SIMD16);
+      ps->Kernel0MaximumPolysperThread =
+         prog_data->max_polygons - 1;
+      switch (prog_data->dispatch_multi /
+              prog_data->max_polygons) {
+      case 8:
+         ps->Kernel0PolyPackingPolicy = POLY_PACK8_FIXED;
+         break;
+      case 16:
+         ps->Kernel0PolyPackingPolicy = POLY_PACK16_FIXED;
+         break;
+      default:
+         unreachable("Invalid polygon width");
+      }
+
+   } else if (enable_16) {
+      ps->Kernel0Enable = true;
+      ps->Kernel0SIMDWidth = PS_SIMD16;
+      ps->Kernel0PolyPackingPolicy = POLY_PACK16_FIXED;
+   }
+
+   if (enable_32) {
+      ps->Kernel1Enable = true;
+      ps->Kernel1SIMDWidth = PS_SIMD32;
+
+   } else if (enable_16 && prog_data->dispatch_multi == 16) {
+      ps->Kernel1Enable = true;
+      ps->Kernel1SIMDWidth = PS_SIMD16;
+   }
 #else
    ps->_8PixelDispatchEnable = enable_8 ||
       (GFX_VER == 12 && prog_data->dispatch_multi);

Reply via email to