From e04f66ae335c9d1167853b8bfb8285df147c1261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 14 Mar 2024 00:38:50 +0100 Subject: [PATCH] radv: Use NIR IO semantics to determine GS output info. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Timur Kristóf Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_shader_info.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index 62425e2aaa6..99ac29ae5af 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -779,18 +779,21 @@ gather_shader_info_gs(struct radv_device *device, const nir_shader *nir, struct info->gs.output_prim = nir->info.gs.output_primitive; info->gs.invocations = nir->info.gs.invocations; info->gs.max_stream = nir->info.gs.active_stream_mask ? util_last_bit(nir->info.gs.active_stream_mask) - 1 : 0; - - nir_foreach_shader_out_variable (var, nir) { - unsigned num_components = glsl_get_component_slots(var->type); - unsigned stream = var->data.stream; - - assert(stream < 4); - - info->gs.num_stream_output_components[stream] += num_components; - } - info->gs.has_pipeline_stat_query = pdev->emulate_ngg_gs_query_pipeline_stat; + for (unsigned slot = 0; slot < VARYING_SLOT_MAX; ++slot) { + const uint8_t usage_mask = info->gs.output_usage_mask[slot]; + const uint8_t gs_streams = info->gs.output_streams[slot]; + + for (unsigned component = 0; component < 4; ++component) { + if (!(usage_mask & BITFIELD_BIT(component))) + continue; + + const uint8_t stream = (gs_streams >> (component * 2)) & 0x3; + info->gs.num_stream_output_components[stream]++; + } + } + gather_info_unlinked_input(info, nir); if (info->is_ngg) {