nir/spirv: Handle decorations after assigning variable locations
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 5 Sep 2015 20:16:49 +0000 (13:16 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 5 Sep 2015 20:17:21 +0000 (13:17 -0700)
src/glsl/nir/spirv_to_nir.c

index 8c2b31cf3ece80887cddbf52a4eb1005045e2d58..30104f0d09a90bc94330107ded6ca9c4aaec0e91 100644 (file)
@@ -1282,8 +1282,6 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
       val->deref = nir_deref_var_create(b, var);
       val->deref_type = type;
 
-      vtn_foreach_decoration(b, val, var_decoration_cb, var);
-
       if (b->execution_model == SpvExecutionModelFragment &&
           var->data.mode == nir_var_shader_out) {
          var->data.location += FRAG_RESULT_DATA0;
@@ -1295,6 +1293,12 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
          var->data.location += VARYING_SLOT_VAR0;
       }
 
+      /* We handle decorations last because decorations might cause us to
+       * over-write other things such as the variable's location and we want
+       * those changes to stick.
+       */
+      vtn_foreach_decoration(b, val, var_decoration_cb, var);
+
       /* If this was a uniform block, then we're not going to actually use the
        * variable (we're only going to use it to compute offsets), so don't
        * declare it in the shader.