From d932fba7c334d88a037ae7e24e5403036b3d59f9 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 31 Jul 2023 12:46:55 -0500
Subject: [PATCH] vkd3d-shader/spirv: Make output varyings not consumed by the
 next stage private variables.

---
 libs/vkd3d-shader/ir.c                   | 5 +----
 libs/vkd3d-shader/spirv.c                | 6 ++++++
 libs/vkd3d-shader/vkd3d_shader_private.h | 5 ++++-
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c
index 0ade5a079c..705905f788 100644
--- a/libs/vkd3d-shader/ir.c
+++ b/libs/vkd3d-shader/ir.c
@@ -133,10 +133,7 @@ static enum vkd3d_result remap_output_signature(struct vkd3d_shader_parser *pars
         }
         else
         {
-            vkd3d_shader_parser_error(parser, VKD3D_SHADER_ERROR_VSIR_NOT_IMPLEMENTED,
-                    "Aborting due to not yet implemented feature: "
-                    "This stage outputs varyings not consumed by the next stage.");
-            return VKD3D_ERROR_NOT_IMPLEMENTED;
+            e->target_location = SIGNATURE_TARGET_LOCATION_UNUSED;
         }
     }
 
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 2882525689..2725ed80cd 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -4978,6 +4978,12 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
 
         spirv_compiler_emit_register_execution_mode(compiler, &dst->reg);
     }
+    else if (signature_element->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
+    {
+        storage_class = SpvStorageClassPrivate;
+        id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream,
+                storage_class, component_type, output_component_count, array_sizes, 2);
+    }
     else
     {
         unsigned int location = signature_element->target_location;
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 188fe46026..dc43175d4b 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -809,6 +809,8 @@ enum vkd3d_shader_input_sysval_semantic
     VKD3D_SIV_LINE_DENSITY_TESS_FACTOR     = 22,
 };
 
+#define SIGNATURE_TARGET_LOCATION_UNUSED (~0u)
+
 struct signature_element
 {
     unsigned int sort_index;
@@ -823,7 +825,8 @@ struct signature_element
     unsigned int mask;
     unsigned int used_mask;
     enum vkd3d_shader_minimum_precision min_precision;
-    /* Register index / location in the target shader. */
+    /* Register index / location in the target shader.
+     * If SIGNATURE_TARGET_LOCATION_UNUSED, this element should not be written. */
     unsigned int target_location;
 };
 
-- 
GitLab