From 5b6b9923abb078cfd00cfaaf8a5387a36d83868a Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Fri, 16 Sep 2022 17:10:01 +0200
Subject: [PATCH] [dxbc] Write point size in vertex shaders

Silences some validation errors when point rendering is enabled.
---
 src/dxbc/dxbc_compiler.cpp | 14 ++++++++++++++
 src/dxbc/dxbc_compiler.h   |  8 ++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp
index b0e59edea..5d31f9431 100644
--- a/src/dxbc/dxbc_compiler.cpp
+++ b/src/dxbc/dxbc_compiler.cpp
@@ -6634,6 +6634,19 @@ namespace dxvk {
   }
   
   
+  void DxbcCompiler::emitPointSizeStore() {
+    if (!m_pointSizeOut) {
+      m_pointSizeOut = emitNewBuiltinVariable(DxbcRegisterInfo {
+        { DxbcScalarType::Float32, 1, 0 },
+        spv::StorageClassOutput },
+        spv::BuiltInPointSize,
+        "point_size");
+    }
+
+    m_module.opStore(m_pointSizeOut, m_module.constf32(1.0f));
+  }
+
+
   void DxbcCompiler::emitInit() {
     // Set up common capabilities for all shaders
     m_module.enableCapability(spv::CapabilityShader);
@@ -6873,6 +6886,7 @@ namespace dxvk {
     this->emitOutputSetup();
     this->emitClipCullStore(DxbcSystemValue::ClipDistance, m_clipDistances);
     this->emitClipCullStore(DxbcSystemValue::CullDistance, m_cullDistances);
+    this->emitPointSizeStore();
     this->emitFunctionEnd();
   }
   
diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h
index 961219247..03ddf7ad6 100644
--- a/src/dxbc/dxbc_compiler.h
+++ b/src/dxbc/dxbc_compiler.h
@@ -484,7 +484,9 @@ namespace dxvk {
     
     uint32_t m_primitiveIdIn  = 0;
     uint32_t m_primitiveIdOut = 0;
-    
+
+    uint32_t m_pointSizeOut   = 0;
+
     //////////////////////////////////////////////////
     // Immediate constant buffer. If defined, this is
     // an array of four-component uint32 vectors.
@@ -1077,7 +1079,9 @@ namespace dxvk {
     void emitClipCullLoad(
             DxbcSystemValue         sv,
             uint32_t                srcArray);
-    
+
+    void emitPointSizeStore();
+
     //////////////////////////////////////
     // Common function definition methods
     void emitInit();