From e9107bd14037e9dbf00a83202fa9252565f330f3 Mon Sep 17 00:00:00 2001
From: Stenzek <stenzek@gmail.com>
Date: Sun, 14 Apr 2024 14:42:55 +1000
Subject: [PATCH] VulkanDevice: Add env var for non-semantic debug info

Backport of https://github.com/PCSX2/pcsx2/commit/070068366f18f176cdfb147281eaf656106c57fd
---
 src/util/vulkan_device.cpp   | 14 ++++++++++++--
 src/util/vulkan_pipeline.cpp |  6 ++++--
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/util/vulkan_device.cpp b/src/util/vulkan_device.cpp
index 8db1197ca..aedf3c413 100644
--- a/src/util/vulkan_device.cpp
+++ b/src/util/vulkan_device.cpp
@@ -23,6 +23,7 @@
 #include "fmt/format.h"
 #include "xxhash.h"
 
+#include <cstdlib>
 #include <limits>
 #include <mutex>
 
@@ -395,8 +396,17 @@ bool VulkanDevice::SelectDeviceExtensions(ExtensionList* extension_list, bool en
     m_optional_extensions.vk_khr_dynamic_rendering &&
     SupportsExtension(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME, false);
   m_optional_extensions.vk_khr_push_descriptor = SupportsExtension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, false);
-  m_optional_extensions.vk_khr_shader_non_semantic_info =
-    SupportsExtension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, false);
+
+  // glslang generates debug info instructions before phi nodes at the beginning of blocks when non-semantic debug info
+  // is enabled, triggering errors by spirv-val. Gate it by an environment variable if you want source debugging until
+  // this is fixed.
+  if (const char* val = std::getenv("USE_NON_SEMANTIC_DEBUG_INFO");
+      val && StringUtil::FromChars<bool>(val).value_or(false))
+  {
+    m_optional_extensions.vk_khr_shader_non_semantic_info =
+      SupportsExtension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, false);
+  }
+
   m_optional_extensions.vk_ext_external_memory_host =
     SupportsExtension(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, false);
 
diff --git a/src/util/vulkan_pipeline.cpp b/src/util/vulkan_pipeline.cpp
index 13f44c54e..a0a68d3ce 100644
--- a/src/util/vulkan_pipeline.cpp
+++ b/src/util/vulkan_pipeline.cpp
@@ -65,9 +65,11 @@ std::unique_ptr<GPUShader> VulkanDevice::CreateShaderFromSource(GPUShaderStage s
 
   if (m_debug_device)
   {
-    options.SetOptimizationLevel(shaderc_optimization_level_zero);
+    options.SetGenerateDebugInfo();
     if (m_optional_extensions.vk_khr_shader_non_semantic_info)
-      options.SetGenerateDebugInfo();
+      options.SetEmitNonSemanticDebugInfo();
+
+    options.SetOptimizationLevel(shaderc_optimization_level_zero);
   }
   else
   {