From 2089bf7b571f712500c470208506a183fcaf39da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Tue, 26 Nov 2024 17:13:29 +0100 Subject: [PATCH] radv: Use default 0 for undefined builtin PS inputs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous code not only left them undefined, but also didn't increment the array index, so subsequent PS inputs would be broken after the undefined one. Note that this doesn't affect any valid Vulkan apps, but it makes the code a bit simpler and it makes undefined inputs a little more forgiving, at no expense for valid PS. This code actually uncovers a bug in Zink, so I'm also documenting the failing Zink test case. Signed-off-by: Timur Kristóf Reviewed-by: Georg Lehmann Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 44 +++++-------------- .../zink/ci/zink-radv-navi10-fails.txt | 4 ++ .../zink/ci/zink-radv-navi31-fails.txt | 4 ++ .../zink/ci/zink-radv-polaris10-fails.txt | 4 ++ .../zink/ci/zink-radv-vangogh-fails.txt | 3 ++ 5 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 8bd76964c5d..4d4606036f0 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -2471,9 +2471,10 @@ enum radv_ps_in_type { static uint32_t offset_to_ps_input(const uint32_t offset, const enum radv_ps_in_type type) { - assert(offset != AC_EXP_PARAM_UNDEFINED); - - if (offset >= AC_EXP_PARAM_DEFAULT_VAL_0000 && offset <= AC_EXP_PARAM_DEFAULT_VAL_1111) { + if (offset == AC_EXP_PARAM_UNDEFINED) { + /* The input is UNDEFINED, use zero. */ + return S_028644_OFFSET(0x20) | S_028644_DEFAULT_VAL(0); + } else if (offset >= AC_EXP_PARAM_DEFAULT_VAL_0000 && offset <= AC_EXP_PARAM_DEFAULT_VAL_1111) { /* The input is a DEFAULT_VAL constant. */ return S_028644_OFFSET(0x20) | S_028644_DEFAULT_VAL(offset - AC_EXP_PARAM_DEFAULT_VAL_0000); } @@ -2511,35 +2512,12 @@ offset_to_ps_input(const uint32_t offset, const enum radv_ps_in_type type) return ps_input_cntl; } -static void -slot_to_ps_input(const struct radv_vs_output_info *outinfo, unsigned slot, uint32_t *ps_input_cntl, unsigned *ps_offset, - const bool use_default_0, const enum radv_ps_in_type type) -{ - unsigned vs_offset = outinfo->vs_output_param_offset[slot]; - - if (vs_offset == AC_EXP_PARAM_UNDEFINED) { - if (use_default_0) - vs_offset = AC_EXP_PARAM_DEFAULT_VAL_0000; - else - return; - } - - ps_input_cntl[*ps_offset] = offset_to_ps_input(vs_offset, type); - ++(*ps_offset); -} - static void input_mask_to_ps_inputs(const struct radv_vs_output_info *outinfo, const struct radv_shader *ps, uint32_t input_mask, uint32_t *ps_input_cntl, unsigned *ps_offset, const enum radv_ps_in_type default_type) { u_foreach_bit (i, input_mask) { - unsigned vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_VAR0 + i]; - if (vs_offset == AC_EXP_PARAM_UNDEFINED) { - ps_input_cntl[*ps_offset] = S_028644_OFFSET(0x20); - ++(*ps_offset); - continue; - } - + const unsigned vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_VAR0 + i]; enum radv_ps_in_type type = default_type; if (ps->info.ps.explicit_shaded_mask & BITFIELD_BIT(*ps_offset)) @@ -2577,10 +2555,12 @@ radv_emit_ps_inputs(struct radv_cmd_buffer *cmd_buffer) ps_input_cntl[ps_offset++] = S_028644_PT_SPRITE_TEX(1) | S_028644_OFFSET(0x20); if (ps->info.ps.input_clips_culls_mask & 0x0f) - slot_to_ps_input(outinfo, VARYING_SLOT_CLIP_DIST0, ps_input_cntl, &ps_offset, false, radv_ps_in_interpolated); + ps_input_cntl[ps_offset++] = + offset_to_ps_input(outinfo->vs_output_param_offset[VARYING_SLOT_CLIP_DIST0], radv_ps_in_interpolated); if (ps->info.ps.input_clips_culls_mask & 0xf0) - slot_to_ps_input(outinfo, VARYING_SLOT_CLIP_DIST1, ps_input_cntl, &ps_offset, false, radv_ps_in_interpolated); + ps_input_cntl[ps_offset++] = + offset_to_ps_input(outinfo->vs_output_param_offset[VARYING_SLOT_CLIP_DIST1], radv_ps_in_interpolated); input_mask_to_ps_inputs(outinfo, ps, ps->info.ps.input_mask, ps_input_cntl, &ps_offset, radv_ps_in_flat); @@ -2588,17 +2568,17 @@ radv_emit_ps_inputs(struct radv_cmd_buffer *cmd_buffer) if (ps->info.ps.prim_id_input) { num_per_primitive_params += !!outinfo->export_prim_id_per_primitive; const enum radv_ps_in_type t = outinfo->export_prim_id_per_primitive ? per_prim : radv_ps_in_flat; - slot_to_ps_input(outinfo, VARYING_SLOT_PRIMITIVE_ID, ps_input_cntl, &ps_offset, false, t); + ps_input_cntl[ps_offset++] = offset_to_ps_input(outinfo->vs_output_param_offset[VARYING_SLOT_PRIMITIVE_ID], t); } if (ps->info.ps.layer_input) { num_per_primitive_params += !!outinfo->writes_layer_per_primitive; const enum radv_ps_in_type t = outinfo->writes_layer_per_primitive ? per_prim : radv_ps_in_flat; - slot_to_ps_input(outinfo, VARYING_SLOT_LAYER, ps_input_cntl, &ps_offset, true, t); + ps_input_cntl[ps_offset++] = offset_to_ps_input(outinfo->vs_output_param_offset[VARYING_SLOT_LAYER], t); } if (ps->info.ps.viewport_index_input) { num_per_primitive_params += !!outinfo->writes_viewport_index_per_primitive; const enum radv_ps_in_type t = outinfo->writes_viewport_index_per_primitive ? per_prim : radv_ps_in_flat; - slot_to_ps_input(outinfo, VARYING_SLOT_VIEWPORT, ps_input_cntl, &ps_offset, true, t); + ps_input_cntl[ps_offset++] = offset_to_ps_input(outinfo->vs_output_param_offset[VARYING_SLOT_VIEWPORT], t); } /* Per-primitive PS inputs: the HW needs these to be last. */ diff --git a/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt index 27e88c99c03..a20b9199485 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt @@ -167,3 +167,7 @@ spec@ext_framebuffer_multisample@interpolation 8 non-centroid-disabled,Fail # Regression noticed in https://gitlab.freedesktop.org/mesa/mesa/-/pipelines/891104 spec@arb_viewport_array@display-list,Fail + +# zink_create_quads_emulation_gs doesn't write primitive ID +# https://gitlab.freedesktop.org/mesa/mesa/-/issues/12214 +spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt index 600d253fc5d..3cffa46e308 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt @@ -201,3 +201,7 @@ spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_yuv420,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_yvu420,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_yvyu,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-transcode-nv12-as-r8-gr88,Fail + +# zink_create_quads_emulation_gs doesn't write primitive ID +# https://gitlab.freedesktop.org/mesa/mesa/-/issues/12214 +spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt index 66dd138c47d..f11f7adf02f 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt @@ -598,3 +598,7 @@ spec@ext_texture_array@copyteximage 1d_array samples=2,Fail spec@ext_texture_array@copyteximage 1d_array samples=4,Fail spec@ext_texture_array@copyteximage 1d_array samples=6,Fail spec@ext_texture_array@copyteximage 1d_array samples=8,Fail + +# zink_create_quads_emulation_gs doesn't write primitive ID +# https://gitlab.freedesktop.org/mesa/mesa/-/issues/12214 +spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt index 61c00e3942d..e4958f4938a 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt @@ -171,3 +171,6 @@ spec@ext_framebuffer_multisample@interpolation 8 non-centroid-disabled,Fail # Regression noticed in https://gitlab.freedesktop.org/mesa/mesa/-/pipelines/891104 spec@arb_viewport_array@display-list,Fail +# zink_create_quads_emulation_gs doesn't write primitive ID +# https://gitlab.freedesktop.org/mesa/mesa/-/issues/12214 +spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail