[Mesa-dev] [PATCH 3/4] radeonsi/nir: set input_usage_mask properly

Timothy Arceri tarceri at itsqueeze.com
Mon Feb 11 03:44:00 UTC 2019


---
 src/gallium/drivers/radeonsi/si_shader_nir.c | 28 +++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
index 04e9e217306..ba7c0b31bd2 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -437,16 +437,30 @@ void si_nir_scan_shader(const struct nir_shader *nir,
 		 * variable->data.driver_location.
 		 */
 		if (nir->info.stage == MESA_SHADER_VERTEX) {
-			/* TODO: gather the actual input useage and remove this. */
-			info->input_usage_mask[i] = TGSI_WRITEMASK_XYZW;
+			for (unsigned j = 0; j < attrib_count; j++, i++) {
 
-			if (glsl_type_is_dual_slot(variable->type)) {
-				num_inputs += 2;
+				unsigned num_components;
+				unsigned component;
+				get_num_of_component_info(variable, 0, &num_components, &component);
+
+				info->input_usage_mask[i + j] |= get_component_usagemask(component, num_components);
+
+				if (glsl_type_is_dual_slot(glsl_without_array(variable->type))) {
+					get_num_of_component_info(variable, 1, &num_components, &component);
+					info->input_usage_mask[i + j + 1] |= get_component_usagemask(component, num_components);
+				}
+
+				if (processed_inputs & ((uint64_t)1 << i))
+					continue;
+
+				processed_inputs |= ((uint64_t)1 << i);
+
+				if (glsl_type_is_dual_slot(glsl_without_array(variable->type)))
+					num_inputs++;
 
-				/* TODO: gather the actual input useage and remove this. */
-				info->input_usage_mask[i+1] = TGSI_WRITEMASK_XYZW;
-			} else
 				num_inputs++;
+			}
+
 			continue;
 		}
 
-- 
2.20.1



More information about the mesa-dev mailing list