radv: Use default 0 for undefined builtin PS inputs.

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 <timur.kristof@gmail.com>
Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32220>
This commit is contained in:
Timur Kristóf
2024-11-26 17:13:29 +01:00
committed by Marge Bot
parent b0b1a07193
commit 2089bf7b57
5 changed files with 27 additions and 32 deletions
+12 -32
View File
@@ -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. */
@@ -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
@@ -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
@@ -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
@@ -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