From 50888ba390f2fe359d5a5955e68c20fb23a4ec46 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 31 May 2023 09:44:21 +0200 Subject: [PATCH] radv: handle per_vertex variables when gathering FS inputs Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_shader.h | 1 + src/amd/vulkan/radv_shader_info.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 49b3baf5c0f..956c7f3ce24 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -345,6 +345,7 @@ struct radv_shader_info { uint32_t input_per_primitive_mask; uint32_t flat_shaded_mask; uint32_t explicit_shaded_mask; + uint32_t per_vertex_shaded_mask; uint32_t float16_shaded_mask; uint32_t num_interp; uint32_t num_prim_interp; diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index 094289def4b..049cd8bb913 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -615,7 +615,9 @@ gather_shader_info_fs(const struct radv_device *device, const nir_shader *nir, info->ps.spi_shader_col_format = pipeline_key->ps.epilog.spi_shader_col_format; nir_foreach_shader_in_variable(var, nir) { - unsigned attrib_count = glsl_count_attribute_slots(var->type, false); + const struct glsl_type *type = + var->data.per_vertex ? glsl_get_array_element(var->type) : var->type; + unsigned attrib_count = glsl_count_attribute_slots(type, false); int idx = var->data.location; switch (idx) { @@ -631,7 +633,7 @@ gather_shader_info_fs(const struct radv_device *device, const nir_shader *nir, unsigned component_count = var->data.location_frac + glsl_get_length(var->type); attrib_count = (component_count + 3) / 4; } else { - mark_16bit_ps_input(info, var->type, var->data.driver_location); + mark_16bit_ps_input(info, type, var->data.driver_location); } uint64_t mask = ((1ull << attrib_count) - 1); @@ -641,6 +643,8 @@ gather_shader_info_fs(const struct radv_device *device, const nir_shader *nir, info->ps.flat_shaded_mask |= mask << var->data.driver_location; else if (var->data.interpolation == INTERP_MODE_EXPLICIT) info->ps.explicit_shaded_mask |= mask << var->data.driver_location; + else if (var->data.per_vertex) + info->ps.per_vertex_shaded_mask |= mask << var->data.driver_location; } if (var->data.location >= VARYING_SLOT_VAR0) {