Module: Mesa Branch: main Commit: 3a0a3a5c350e4bb354dfb4823e32b70ab9d7655e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3a0a3a5c350e4bb354dfb4823e32b70ab9d7655e
Author: Marek Olšák <marek.ol...@amd.com> Date: Sat Nov 18 23:07:06 2023 -0500 radeonsi: implement gl_Layer in FS as a system value This replaces the vec4 FS input with the Ancillary VGPR input. Reviewed-by: Qiang Yu <yuq...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26274> --- src/amd/ci/radeonsi-raven-fails.txt | 4 ++++ src/amd/ci/radeonsi-stoney-fails.txt | 6 ++++++ src/gallium/drivers/radeonsi/si_get.c | 1 + src/gallium/drivers/radeonsi/si_nir_lower_abi.c | 3 +++ src/gallium/drivers/radeonsi/si_shader.c | 22 ++++++++++------------ src/gallium/drivers/radeonsi/si_shader.h | 1 + src/gallium/drivers/radeonsi/si_shader_info.c | 4 +++- src/gallium/drivers/radeonsi/si_state_shaders.cpp | 3 ++- 8 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/amd/ci/radeonsi-raven-fails.txt b/src/amd/ci/radeonsi-raven-fails.txt index 25e0bd179c1..9049f6f914c 100644 --- a/src/amd/ci/radeonsi-raven-fails.txt +++ b/src/amd/ci/radeonsi-raven-fails.txt @@ -153,3 +153,7 @@ spec@!opengl 1.1@line-smooth-stipple,Fail spec@arb_viewport_array@display-list,Fail # since transition XORG -> WESTON glx@glx_arb_sync_control@waitformsc,Fail + +# remove these after updating piglit: +spec@arb_fragment_layer_viewport@layer-gs-write-simple,Fail +spec@arb_fragment_layer_viewport@layer-vs-write-simple,Fail diff --git a/src/amd/ci/radeonsi-stoney-fails.txt b/src/amd/ci/radeonsi-stoney-fails.txt index 79b4927e6de..c83cf4fb427 100644 --- a/src/amd/ci/radeonsi-stoney-fails.txt +++ b/src/amd/ci/radeonsi-stoney-fails.txt @@ -233,3 +233,9 @@ spec@!opengl 1.1@line-smooth-stipple,Fail spec@arb_viewport_array@display-list,Fail # since transition XORG -> WESTON glx@glx_arb_sync_control@waitformsc,Fail + +# remove these after updating piglit: +spec@arb_fragment_layer_viewport@layer-gs-writes-out-of-range,Fail +spec@arb_fragment_layer_viewport@layer-vs-write-simple,Fail +spec@arb_fragment_layer_viewport@layer-gs-write-simple,Fail +spec@arb_fragment_layer_viewport@layer-vs-gs-write-simple,Fail diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index e15ab779966..672c0cce298 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -1390,6 +1390,7 @@ void si_init_screen_get_functions(struct si_screen *sscreen) * when execution mode is rtz instead of rtne. */ .force_f2f16_rtz = true, + .lower_layer_fs_input_to_sysval = true, }; *sscreen->nir_options = nir_options; } diff --git a/src/gallium/drivers/radeonsi/si_nir_lower_abi.c b/src/gallium/drivers/radeonsi/si_nir_lower_abi.c index 6a44ce13065..fdd29fdbbc5 100644 --- a/src/gallium/drivers/radeonsi/si_nir_lower_abi.c +++ b/src/gallium/drivers/radeonsi/si_nir_lower_abi.c @@ -593,6 +593,9 @@ static bool lower_intrinsic(nir_builder *b, nir_instr *instr, struct lower_abi_s replacement = nir_ilt_imm(b, prim_mask, 0); break; } + case nir_intrinsic_load_layer_id: + replacement = ac_nir_unpack_arg(b, &args->ac, args->ac.ancillary, 16, 13); + break; case nir_intrinsic_load_color0: case nir_intrinsic_load_color1: { uint32_t colors_read = sel->info.colors_read; diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 8c0b9f4fbed..c97256d6620 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1640,18 +1640,11 @@ static bool si_nir_kill_outputs(nir_shader *nir, const union si_shader_key *key) nir_function_impl *impl = nir_shader_get_entrypoint(nir); assert(impl); assert(nir->info.stage <= MESA_SHADER_GEOMETRY); - uint64_t kill_outputs = key->ge.opt.kill_outputs; - /* Always remove the interpolated gl_Layer output for blit shaders on the first compile - * (it's always unused by PS), otherwise we hang because we don't pass the attribute ring - * pointer to position-only shaders that also write gl_Layer. - */ - if (nir->info.stage == MESA_SHADER_VERTEX && nir->info.vs.blit_sgprs_amd) - kill_outputs |= BITFIELD64_BIT(SI_UNIQUE_SLOT_LAYER); - - if (!kill_outputs && + if (!key->ge.opt.kill_outputs && !key->ge.opt.kill_pointsize && - !key->ge.opt.kill_clip_distances) { + !key->ge.opt.kill_clip_distances && + !(nir->info.outputs_written & BITFIELD64_BIT(VARYING_SLOT_LAYER))) { nir_metadata_preserve(impl, nir_metadata_all); return false; } @@ -1675,7 +1668,7 @@ static bool si_nir_kill_outputs(nir_shader *nir, const union si_shader_key *key) nir_io_semantics sem = nir_intrinsic_io_semantics(intr); if (nir_slot_is_varying(sem.location) && - kill_outputs & + key->ge.opt.kill_outputs & (1ull << si_shader_io_get_unique_index(sem.location))) progress |= nir_remove_varying(intr, MESA_SHADER_FRAGMENT); @@ -1705,6 +1698,11 @@ static bool si_nir_kill_outputs(nir_shader *nir, const union si_shader_key *key) progress |= nir_remove_sysval_output(intr); } break; + + case VARYING_SLOT_LAYER: + /* LAYER is never passed to FS. Instead, we load it there as a system value. */ + progress |= nir_remove_varying(intr, MESA_SHADER_FRAGMENT); + break; } } } @@ -2650,7 +2648,7 @@ si_set_spi_ps_input_config(struct si_shader *shader) S_0286CC_LINEAR_SAMPLE_ENA(info->uses_linear_sample) | S_0286CC_FRONT_FACE_ENA(info->uses_frontface) | S_0286CC_SAMPLE_COVERAGE_ENA(info->reads_samplemask) | - S_0286CC_ANCILLARY_ENA(info->uses_sampleid); + S_0286CC_ANCILLARY_ENA(info->uses_sampleid || info->uses_layer_id); uint8_t mask = info->reads_frag_coord_mask | info->reads_sample_pos_mask; u_foreach_bit(i, mask) { diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index cd59fe01bef..51c41faab85 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -504,6 +504,7 @@ struct si_shader_info { bool uses_indirect_descriptor; bool has_divergent_loop; bool uses_sampleid; + bool uses_layer_id; bool has_non_uniform_tex_access; bool uses_vmem_sampler_or_bvh; diff --git a/src/gallium/drivers/radeonsi/si_shader_info.c b/src/gallium/drivers/radeonsi/si_shader_info.c index d0585ed6c25..2b2ca3d21d9 100644 --- a/src/gallium/drivers/radeonsi/si_shader_info.c +++ b/src/gallium/drivers/radeonsi/si_shader_info.c @@ -641,6 +641,7 @@ void si_nir_scan_shader(struct si_screen *sscreen, const struct nir_shader *nir, info->uses_persp_centroid = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID); info->uses_persp_center = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL); info->uses_sampleid = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_ID); + info->uses_layer_id = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_LAYER_ID); if (nir->info.stage == MESA_SHADER_FRAGMENT) { info->writes_z = nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_DEPTH); @@ -748,7 +749,8 @@ void si_nir_scan_shader(struct si_screen *sscreen, const struct nir_shader *nir, /* Ignore outputs that are not passed from VS to PS. */ if (semantic != VARYING_SLOT_POS && semantic != VARYING_SLOT_PSIZ && - semantic != VARYING_SLOT_CLIP_VERTEX) { + semantic != VARYING_SLOT_CLIP_VERTEX && + semantic != VARYING_SLOT_LAYER) { info->outputs_written_before_ps |= 1ull << si_shader_io_get_unique_index(semantic); } diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index fb2c9ce28bb..467b478f025 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -3136,7 +3136,8 @@ static void si_init_shader_selector_async(void *job, void *gdata, int thread_ind semantic != VARYING_SLOT_POS && semantic != VARYING_SLOT_PSIZ && semantic != VARYING_SLOT_CLIP_VERTEX && - semantic != VARYING_SLOT_EDGE) { + semantic != VARYING_SLOT_EDGE && + semantic != VARYING_SLOT_LAYER) { id = si_shader_io_get_unique_index(semantic); sel->info.outputs_written_before_ps &= ~(1ull << id); }