From c070991def83e9bbfd599b03a6d52eb2bd4131c9 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Mon, 12 Apr 2021 22:26:15 -0300
Subject: [PATCH] shader: Fix fixed pipeline point size on geometry shaders

---
 .../backend/spirv/emit_spirv_special.cpp      | 28 ++++++++++++-------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
index 6c8fcd5a50..fee740c084 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
@@ -15,6 +15,13 @@ void ConvertDepthMode(EmitContext& ctx) {
     const Id vector{ctx.OpCompositeInsert(ctx.F32[4], screen_depth, position, 2u)};
     ctx.OpStore(ctx.output_position, vector);
 }
+
+void SetFixedPipelinePointSize(EmitContext& ctx) {
+    if (ctx.profile.fixed_state_point_size) {
+        const float point_size{*ctx.profile.fixed_state_point_size};
+        ctx.OpStore(ctx.output_point_size, ctx.Constant(ctx.F32[1], point_size));
+    }
+}
 } // Anonymous namespace
 
 void EmitPrologue(EmitContext& ctx) {
@@ -28,10 +35,9 @@ void EmitPrologue(EmitContext& ctx) {
                 ctx.OpStore(generic_id, default_vector);
             }
         }
-        if (ctx.profile.fixed_state_point_size) {
-            const float point_size{*ctx.profile.fixed_state_point_size};
-            ctx.OpStore(ctx.output_point_size, ctx.Constant(ctx.F32[1], point_size));
-        }
+    }
+    if (ctx.stage == Stage::VertexB || ctx.stage == Stage::Geometry) {
+        SetFixedPipelinePointSize(ctx);
     }
 }
 
@@ -45,21 +51,23 @@ void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream) {
     if (ctx.profile.convert_depth_mode) {
         ConvertDepthMode(ctx);
     }
-    if (!stream.IsImmediate()) {
+    if (stream.IsImmediate()) {
+        ctx.OpEmitStreamVertex(ctx.Def(stream));
+    } else {
         // LOG_WARNING(..., "EmitVertex's stream is not constant");
         ctx.OpEmitStreamVertex(ctx.u32_zero_value);
-        return;
     }
-    ctx.OpEmitStreamVertex(ctx.Def(stream));
+    // Restore fixed pipeline point size after emitting the vertex
+    SetFixedPipelinePointSize(ctx);
 }
 
 void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream) {
-    if (!stream.IsImmediate()) {
+    if (stream.IsImmediate()) {
+        ctx.OpEndStreamPrimitive(ctx.Def(stream));
+    } else {
         // LOG_WARNING(..., "EndPrimitive's stream is not constant");
         ctx.OpEndStreamPrimitive(ctx.u32_zero_value);
-        return;
     }
-    ctx.OpEndStreamPrimitive(ctx.Def(stream));
 }
 
 } // namespace Shader::Backend::SPIRV