st/glsl_to_nir: add patch support to st_nir_assign_var_locations()
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 13 Dec 2017 23:14:34 +0000 (10:14 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 27 Dec 2017 00:26:08 +0000 (11:26 +1100)
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_glsl_to_nir.cpp

index b411621ab2ca6ccd9c79c4243ae309ea5cd2f521..276450a64acf9a1d4acb61d95e2f8c92d2a09af2 100644 (file)
@@ -126,8 +126,9 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
                             gl_shader_stage stage)
 {
    unsigned location = 0;
-   unsigned assigned_locations[VARYING_SLOT_MAX];
+   unsigned assigned_locations[VARYING_SLOT_TESS_MAX];
    uint64_t processed_locs = 0;
+   uint32_t processed_patch_locs = 0;
 
    nir_foreach_variable(var, var_list) {
 
@@ -137,11 +138,24 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
          type = glsl_get_array_element(type);
       }
 
+      bool processed = false;
+      if (var->data.patch) {
+         unsigned patch_loc = var->data.location - VARYING_SLOT_VAR0;
+         if (processed_patch_locs & (1 << patch_loc))
+            processed = true;
+
+         processed_patch_locs |= (1 << patch_loc);
+      } else {
+         if (processed_locs & ((uint64_t)1 << var->data.location))
+            processed = true;
+
+         processed_locs |= ((uint64_t)1 << var->data.location);
+      }
+
       /* Because component packing allows varyings to share the same location
        * we may have already have processed this location.
        */
-      if (var->data.location >= VARYING_SLOT_VAR0 &&
-          processed_locs & ((uint64_t)1 << var->data.location)) {
+      if (processed && var->data.location >= VARYING_SLOT_VAR0) {
          var->data.driver_location = assigned_locations[var->data.location];
          *size += type_size(type);
          continue;
@@ -150,8 +164,6 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
       assigned_locations[var->data.location] = location;
       var->data.driver_location = location;
       location += type_size(type);
-
-      processed_locs |= ((uint64_t)1 << var->data.location);
    }
 
    *size += location;