nir/spirv: Set the right location for shader input/outputs
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 26 Jun 2015 00:32:25 +0000 (17:32 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 26 Jun 2015 00:36:34 +0000 (17:36 -0700)
We need to add FRAG_RESULT_DATA0 etc. to the input/output location.

src/glsl/nir/spirv_to_nir.c

index 2dd3c42db036cf0d4138cf3eef0bf2f8ace38878..d8523fd5a52bf132f2ed76f74e0cf792a618f294 100644 (file)
@@ -571,6 +571,17 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
 
       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;
+      } else if (b->execution_model == SpvExecutionModelVertex &&
+                 var->data.mode == nir_var_shader_in) {
+         var->data.location += VERT_ATTRIB_GENERIC0;
+      } else if (var->data.mode == nir_var_shader_in ||
+                 var->data.mode == nir_var_shader_out) {
+         var->data.location += VARYING_SLOT_VAR0;
+      }
+
       switch (var->data.mode) {
       case nir_var_shader_in:
          exec_list_push_tail(&b->shader->inputs, &var->node);