From 3cc21a42feaa8a3519efda0d1a32307fc29d3ba6 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 11 Mar 2022 09:29:28 +0100 Subject: [PATCH] radv: use shader_info::outputs_written/per_primitive_outputs for VS outputs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Samuel Pitoiset Reviewed-by: Timur Kristóf Part-of: --- src/amd/vulkan/radv_shader_info.c | 65 +++++++++++-------------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index b403a45d0a6..ca88e1bc34c 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -427,8 +427,6 @@ static void gather_info_output_decl(const nir_shader *nir, const nir_variable *var, struct radv_shader_info *info) { - struct radv_vs_output_info *vs_info = get_vs_output_info(nir, info); - switch (nir->info.stage) { case MESA_SHADER_VERTEX: break; @@ -440,39 +438,6 @@ gather_info_output_decl(const nir_shader *nir, const nir_variable *var, default: break; } - - if (vs_info) { - switch (var->data.location) { - case VARYING_SLOT_CLIP_DIST0: - vs_info->clip_dist_mask = (1 << nir->info.clip_distance_array_size) - 1; - vs_info->cull_dist_mask = (1 << nir->info.cull_distance_array_size) - 1; - vs_info->cull_dist_mask <<= nir->info.clip_distance_array_size; - break; - case VARYING_SLOT_PSIZ: - vs_info->writes_pointsize = true; - break; - case VARYING_SLOT_VIEWPORT: - if (var->data.per_primitive) - vs_info->writes_viewport_index_per_primitive = true; - else - vs_info->writes_viewport_index = true; - break; - case VARYING_SLOT_LAYER: - if (var->data.per_primitive) - vs_info->writes_layer_per_primitive = true; - else - vs_info->writes_layer = true; - break; - case VARYING_SLOT_PRIMITIVE_SHADING_RATE: - if (var->data.per_primitive) - vs_info->writes_primitive_shading_rate_per_primitive = true; - else - vs_info->writes_primitive_shading_rate = true; - break; - default: - break; - } - } } static void @@ -581,6 +546,29 @@ radv_nir_shader_info_pass(struct radv_device *device, const struct nir_shader *n struct radv_vs_output_info *outinfo = get_vs_output_info(nir, info); if (outinfo) { + uint64_t special_mask = BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_COUNT) | + BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_INDICES); + uint64_t per_prim_mask = + nir->info.outputs_written & nir->info.per_primitive_outputs & ~special_mask; + uint64_t per_vtx_mask = + nir->info.outputs_written & ~nir->info.per_primitive_outputs & ~special_mask; + + /* Per vertex outputs. */ + outinfo->writes_pointsize = per_vtx_mask & VARYING_BIT_PSIZ; + outinfo->writes_viewport_index = per_vtx_mask & VARYING_BIT_VIEWPORT; + outinfo->writes_layer = per_vtx_mask & VARYING_BIT_LAYER; + outinfo->writes_primitive_shading_rate = per_vtx_mask & VARYING_BIT_PRIMITIVE_SHADING_RATE; + + /* Per primitive outputs. */ + outinfo->writes_viewport_index_per_primitive = per_prim_mask & VARYING_BIT_VIEWPORT; + outinfo->writes_layer_per_primitive = per_prim_mask & VARYING_BIT_LAYER; + outinfo->writes_primitive_shading_rate_per_primitive = per_prim_mask & VARYING_BIT_PRIMITIVE_SHADING_RATE; + + /* Clip/cull distances. */ + outinfo->clip_dist_mask = (1 << nir->info.clip_distance_array_size) - 1; + outinfo->cull_dist_mask = (1 << nir->info.cull_distance_array_size) - 1; + outinfo->cull_dist_mask <<= nir->info.clip_distance_array_size; + int pos_written = 0x1; if (outinfo->writes_pointsize || outinfo->writes_viewport_index || outinfo->writes_layer || @@ -600,13 +588,6 @@ radv_nir_shader_info_pass(struct radv_device *device, const struct nir_shader *n memset(outinfo->vs_output_param_offset, AC_EXP_PARAM_UNDEFINED, sizeof(outinfo->vs_output_param_offset)); - uint64_t special_mask = BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_COUNT) | - BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_INDICES); - uint64_t per_prim_mask = - nir->info.outputs_written & nir->info.per_primitive_outputs & ~special_mask; - uint64_t per_vtx_mask = - nir->info.outputs_written & ~nir->info.per_primitive_outputs & ~special_mask; - unsigned total_param_exports = 0; /* Per-vertex outputs */