nir: Add a helper for getting the bitmask for a variable's location
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 27 Oct 2015 18:32:34 +0000 (11:32 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 24 Dec 2015 08:47:20 +0000 (00:47 -0800)
src/glsl/nir/nir.h

index 8655c144012a439f41cc604acbc558ab9df7fb8b..815c22c5e8b88c9d4af291aa60e0eed4fe2a570d 100644 (file)
@@ -366,6 +366,32 @@ typedef struct {
 #define nir_foreach_variable(var, var_list) \
    foreach_list_typed(nir_variable, var, node, var_list)
 
+/**
+ * Returns the bits in the inputs_read, outputs_written, or
+ * system_values_read bitfield corresponding to this variable.
+ */
+static inline uint64_t
+nir_variable_get_io_mask(nir_variable *var, gl_shader_stage stage)
+{
+   assert(var->data.mode == nir_var_shader_in ||
+          var->data.mode == nir_var_shader_out ||
+          var->data.mode == nir_var_system_value);
+   assert(var->data.location >= 0);
+
+   const struct glsl_type *var_type = var->type;
+   if (stage == MESA_SHADER_GEOMETRY && var->data.mode == nir_var_shader_in) {
+      /* Most geometry shader inputs are per-vertex arrays */
+      if (var->data.location >= VARYING_SLOT_VAR0)
+         assert(glsl_type_is_array(var_type));
+
+      if (glsl_type_is_array(var_type))
+         var_type = glsl_get_array_element(var_type);
+   }
+
+   unsigned slots = glsl_count_attribute_slots(var_type);
+   return ((1ull << slots) - 1) << var->data.location;
+}
+
 typedef struct {
    struct exec_node node;