zink/spirv: be a bit more strict with fragment-results
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 15 Jul 2019 10:02:31 +0000 (12:02 +0200)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 28 Oct 2019 08:51:46 +0000 (08:51 +0000)
Acked-by: Jordan Justen <jordan.l.justen@intel.com>
src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c

index ca29e7e..3792729 100644 (file)
@@ -280,14 +280,23 @@ emit_output(struct ntv_context *ctx, struct nir_variable *var)
          }
       }
    } else if (ctx->stage == MESA_SHADER_FRAGMENT) {
-      switch (var->data.location) {
-      case FRAG_RESULT_DEPTH:
-         spirv_builder_emit_builtin(&ctx->builder, var_id, SpvBuiltInFragDepth);
-         break;
-
-      default:
+      if (var->data.location >= FRAG_RESULT_DATA0)
          spirv_builder_emit_location(&ctx->builder, var_id,
-                                     var->data.driver_location);
+                                     var->data.location - FRAG_RESULT_DATA0);
+      else {
+         switch (var->data.location) {
+         case FRAG_RESULT_COLOR:
+            spirv_builder_emit_location(&ctx->builder, var_id, 0);
+            break;
+
+         case FRAG_RESULT_DEPTH:
+            spirv_builder_emit_builtin(&ctx->builder, var_id, SpvBuiltInFragDepth);
+            break;
+
+         default:
+            spirv_builder_emit_location(&ctx->builder, var_id,
+                                        var->data.driver_location);
+         }
       }
    }