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

Author: Boris Brezillon <[email protected]>
Date:   Wed Nov 15 18:39:53 2023 +0100

pan/genxml: Fix 'Shader Program' descriptor definition on v9 and v10

Bit 8 in the descriptor is not encoding the primary/secondary shader
information. It's a per shader-type field.

For fragment shader descriptors, it describes what the coverage bitmask
contains for per-sample execution:
- DX-style: bits for all covered samples are set
- GL-style: only the bit for the sample the shader is executed on is set

For vertex shader, it encodes the warp limit we want to apply to the
shader execution.

Patch the existing code to match the new semantics.

Signed-off-by: Boris Brezillon <[email protected]>
Reviewed-by: Erik Faye-Lund <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26221>

---

 src/gallium/drivers/panfrost/pan_cmdstream.c | 11 ++++++++---
 src/panfrost/lib/genxml/v10.xml              | 15 ++++++++++++++-
 src/panfrost/lib/genxml/v9.xml               | 15 ++++++++++++++-
 src/panfrost/lib/pan_blitter.c               |  2 +-
 4 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c 
b/src/gallium/drivers/panfrost/pan_cmdstream.c
index cd0061b550e..d517ac3c770 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -4399,7 +4399,12 @@ prepare_shader(struct panfrost_compiled_shader *state,
    /* Generic, or IDVS/points */
    pan_pack(ptr.cpu, SHADER_PROGRAM, cfg) {
       cfg.stage = pan_shader_stage(&state->info);
-      cfg.primary_shader = true;
+
+      if (cfg.stage == MALI_SHADER_STAGE_FRAGMENT)
+         cfg.fragment_coverage_bitmask_type = MALI_COVERAGE_BITMASK_TYPE_GL;
+      else if (vs)
+         cfg.vertex_warp_limit = MALI_WARP_LIMIT_HALF;
+
       cfg.register_allocation =
          pan_register_allocation(state->info.work_reg_count);
       cfg.binary = state->bin.gpu;
@@ -4416,7 +4421,7 @@ prepare_shader(struct panfrost_compiled_shader *state,
    /* IDVS/triangles */
    pan_pack(ptr.cpu + pan_size(SHADER_PROGRAM), SHADER_PROGRAM, cfg) {
       cfg.stage = pan_shader_stage(&state->info);
-      cfg.primary_shader = true;
+      cfg.vertex_warp_limit = MALI_WARP_LIMIT_HALF;
       cfg.register_allocation =
          pan_register_allocation(state->info.work_reg_count);
       cfg.binary = state->bin.gpu + state->info.vs.no_psiz_offset;
@@ -4431,7 +4436,7 @@ prepare_shader(struct panfrost_compiled_shader *state,
       unsigned work_count = state->info.vs.secondary_work_reg_count;
 
       cfg.stage = pan_shader_stage(&state->info);
-      cfg.primary_shader = false;
+      cfg.vertex_warp_limit = MALI_WARP_LIMIT_FULL;
       cfg.register_allocation = pan_register_allocation(work_count);
       cfg.binary = state->bin.gpu + state->info.vs.secondary_offset;
       cfg.preload.r48_r63 = (state->info.vs.secondary_preload >> 48);
diff --git a/src/panfrost/lib/genxml/v10.xml b/src/panfrost/lib/genxml/v10.xml
index 2dc6a764aec..249aaff7850 100644
--- a/src/panfrost/lib/genxml/v10.xml
+++ b/src/panfrost/lib/genxml/v10.xml
@@ -1206,10 +1206,23 @@
     <field name="R63" size="1" start="0:15" type="bool"/>
   </struct>
 
+  <enum name="Coverage bitmask type">
+    <value name="DX" value="0"/>
+    <value name="GL" value="1"/>
+  </enum>
+
+  <enum name="Warp limit">
+    <value name="Full" value="0"/>
+    <value name="Half" value="1"/>
+    <value name="One-quarter" value="2"/>
+    <value name="One-height" value="3"/>
+  </enum>
+
   <struct name="Shader Program" size="8" align="32">
     <field name="Type" size="4" start="0:0" type="Descriptor Type" 
default="Shader"/>
     <field name="Stage" size="4" start="0:4" type="Shader stage"/>
-    <field name="Primary shader" size="1" start="0:8" type="bool"/>
+    <field name="Fragment coverage bitmask type" size="1" start="0:8" 
type="Coverage bitmask type"/>
+    <field name="Vertex warp limit" size="2" start="0:8" type="Warp limit"/>
     <field name="Suppress NaN" size="1" start="0:16" type="bool"/>
     <field name="Flush to zero mode" size="2" start="0:17" type="Flush to zero 
mode"/>
     <field name="Suppress Inf" size="1" start="0:19" type="bool"/>
diff --git a/src/panfrost/lib/genxml/v9.xml b/src/panfrost/lib/genxml/v9.xml
index 6b8a4871fd4..c08d49e2025 100644
--- a/src/panfrost/lib/genxml/v9.xml
+++ b/src/panfrost/lib/genxml/v9.xml
@@ -856,10 +856,23 @@
     <field name="R63" size="1" start="0:15" type="bool"/>
   </struct>
 
+  <enum name="Coverage bitmask type">
+    <value name="DX" value="0"/>
+    <value name="GL" value="1"/>
+  </enum>
+
+  <enum name="Warp limit">
+    <value name="Full" value="0"/>
+    <value name="Half" value="1"/>
+    <value name="One-quarter" value="2"/>
+    <value name="One-height" value="3"/>
+  </enum>
+
   <struct name="Shader Program" size="8" align="32">
     <field name="Type" size="4" start="0:0" type="Descriptor Type" 
default="Shader"/>
     <field name="Stage" size="4" start="0:4" type="Shader stage"/>
-    <field name="Primary shader" size="1" start="0:8" type="bool"/>
+    <field name="Fragment coverage bitmask type" size="1" start="0:8" 
type="Coverage bitmask type"/>
+    <field name="Vertex warp limit" size="2" start="0:8" type="Warp limit"/>
     <field name="Suppress NaN" size="1" start="0:16" type="bool"/>
     <field name="Flush to zero mode" size="2" start="0:17" type="Flush to zero 
mode"/>
     <field name="Suppress Inf" size="1" start="0:19" type="bool"/>
diff --git a/src/panfrost/lib/pan_blitter.c b/src/panfrost/lib/pan_blitter.c
index 6cc3bed84dd..2f269252d51 100644
--- a/src/panfrost/lib/pan_blitter.c
+++ b/src/panfrost/lib/pan_blitter.c
@@ -1170,7 +1170,7 @@ pan_preload_emit_dcd(struct pan_pool *pool, struct 
pan_fb_info *fb, bool zs,
    struct panfrost_ptr spd = pan_pool_alloc_desc(pool, SHADER_PROGRAM);
    pan_pack(spd.cpu, SHADER_PROGRAM, cfg) {
       cfg.stage = MALI_SHADER_STAGE_FRAGMENT;
-      cfg.primary_shader = true;
+      cfg.fragment_coverage_bitmask_type = MALI_COVERAGE_BITMASK_TYPE_GL;
       cfg.register_allocation = MALI_SHADER_REGISTER_ALLOCATION_32_PER_THREAD;
       cfg.binary = blit_shader->address;
       cfg.preload.r48_r63 = blit_shader->info.preload >> 48;

Reply via email to