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;
