From fb1ef4f4042b29b0da2eae2294b13d1b60e7726d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 6 Oct 2026 08:11:13 +0000 Subject: [PATCH] refactor(recompiler): share the SPIR-V emission failure helper Nine SPIR-V backend sources each defined an identical FailEmit in an anonymous namespace. Declare it once in SpirvEmitterHelpers.hpp and define it in SpirvEmitterHelpers.cpp; the message is unchanged. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MBXJqzgohLeVAeHsn4Jpm7 --- .../include/SpirvBackend/SpirvEmitterHelpers.hpp | 2 ++ .../SpirvBackend/src/SpirvMemory/SpirvBufferAccess.cpp | 5 +---- .../SpirvBackend/src/SpirvMemory/SpirvConstants.cpp | 9 +-------- .../SpirvBackend/src/SpirvMemory/SpirvDescriptors.cpp | 4 ---- .../SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp | 6 +++--- .../SpirvBackend/src/SpirvMemory/SpirvFormatConvert.cpp | 4 ---- .../SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp | 5 +---- .../SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp | 4 ---- .../SpirvBackend/src/SpirvMemory/SpirvSubgroup.cpp | 5 +---- .../SpirvBackend/src/SpirvMemory/SpirvTypes.cpp | 5 +---- 10 files changed, 10 insertions(+), 39 deletions(-) diff --git a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp index 201f4f9ae0..caec0c7bb6 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp @@ -3,9 +3,11 @@ #include "SpirvBackend/SpirvEmitterState.hpp" #include "Optimization/BindingAllocator.hpp" +#include namespace ShaderRecompiler { +[[noreturn]] void FailEmit(const std::string& reason); const RdnaImageDimensionInfo& RdnaImageDimensionInfoFor(RdnaImageDimension dimension); std::uint32_t TypeVoid(SpirvEmitterState& state); std::uint32_t TypeBool(SpirvEmitterState& state); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvBufferAccess.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvBufferAccess.cpp index 9c7ee72285..b63540f834 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvBufferAccess.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvBufferAccess.cpp @@ -1,4 +1,5 @@ #include "SpirvBackend/SpirvMemory/SpirvBufferAccess.hpp" +#include "SpirvBackend/SpirvEmitterHelpers.hpp" #include "SpirvBackend/SpirvMemory/SpirvTypes.hpp" #include "SpirvBackend/SpirvMemory/SpirvDescriptors.hpp" #include @@ -11,10 +12,6 @@ namespace ShaderRecompiler { namespace { - [[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); - } - const ShaderWorkgroupInputInfo* ShaderWorkgroupInput(const SpirvEmitterState& state) { switch (state.program.Resources().stage) { case IrShaderStage::Compute: diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvConstants.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvConstants.cpp index ab2d368b08..c4a0e26277 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvConstants.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvConstants.cpp @@ -1,4 +1,5 @@ #include "SpirvBackend/SpirvMemory/SpirvConstants.hpp" +#include "SpirvBackend/SpirvEmitterHelpers.hpp" #include "SpirvBackend/SpirvMemory/SpirvTypes.hpp" #include #include @@ -6,14 +7,6 @@ namespace ShaderRecompiler { -namespace { - -[[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); -} - -} - std::uint32_t ConstantU32(SpirvEmitterState& state, std::uint32_t value) { return state.module.Constant(spv::OpConstant, TypeU32(state), value); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvDescriptors.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvDescriptors.cpp index b0fee41fa6..0fe12f8efc 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvDescriptors.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvDescriptors.cpp @@ -12,10 +12,6 @@ namespace ShaderRecompiler { namespace { -[[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); -} - IrShaderStage StageOf(const SpirvEmitterState& state) { return state.program.Resources().stage; } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp index c7b0c1c01c..0edb9069a5 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp @@ -12,12 +12,12 @@ namespace ShaderRecompiler { -namespace { - -[[noreturn]] void FailEmit(const std::string& reason) { +void FailEmit(const std::string& reason) { throw std::runtime_error("SPIR-V module emission failed: " + reason); } +namespace { + const ShaderPixelInputInfo& PixelInfo(const SpirvEmitterState& state) { if (state.inputInfo.pixel == nullptr) { FailEmit("pixel input info is missing"); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvFormatConvert.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvFormatConvert.cpp index 0a12e65f2f..c2497d5f54 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvFormatConvert.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvFormatConvert.cpp @@ -15,10 +15,6 @@ namespace ShaderRecompiler { namespace { - [[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); - } - std::uint32_t UnormToF32Bits(SpirvEmitterState& state, std::uint32_t value, std::uint32_t bits) { const std::uint32_t maximum = (1u << bits) - 1u; const auto zero = EmitCompareU32Constant(state, spv::OpIEqual, value, 0u); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp index 6ee03acfa5..a4e5517358 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp @@ -1,4 +1,5 @@ #include "SpirvBackend/SpirvMemory/SpirvInputOutput.hpp" +#include "SpirvBackend/SpirvEmitterHelpers.hpp" #include "SpirvBackend/SpirvMemory/SpirvTypes.hpp" #include "SpirvBackend/SpirvMemory/SpirvSubgroup.hpp" #include "SpirvBackend/SpirvMemory/SpirvBufferAccess.hpp" @@ -18,10 +19,6 @@ namespace ShaderRecompiler constexpr std::uint32_t PsInputFlatShade = 0x00000400u; constexpr std::uint32_t PixelParameterLimit = 32u; - [[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); - } - IrShaderStage StageOf(const SpirvEmitterState& state) { return state.program.Resources().stage; } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp index 9100ce94ff..9b42dde319 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp @@ -12,10 +12,6 @@ namespace ShaderRecompiler { namespace { -[[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); -} - IrShaderStage StageOf(const SpirvEmitterState& state) { return state.program.Resources().stage; } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvSubgroup.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvSubgroup.cpp index 6532d500d8..cde24c0baa 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvSubgroup.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvSubgroup.cpp @@ -1,4 +1,5 @@ #include "SpirvBackend/SpirvEmitter.hpp" +#include "SpirvBackend/SpirvEmitterHelpers.hpp" #include #include #include @@ -13,10 +14,6 @@ namespace ShaderRecompiler namespace { - [[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); - } - std::uint32_t HostInvocationId(SpirvEmitterState& state) { if (state.subgroupLocalInvocationIdVariable == 0) { FailEmit("SubgroupLocalInvocationId was not declared before function emission"); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvTypes.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvTypes.cpp index acefd6b607..bdc7ced720 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvTypes.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvTypes.cpp @@ -1,4 +1,5 @@ #include "SpirvBackend/SpirvMemory/SpirvTypes.hpp" +#include "SpirvBackend/SpirvEmitterHelpers.hpp" #include "SpirvBackend/SpirvMemory/SpirvConstants.hpp" #include #include @@ -8,10 +9,6 @@ namespace ShaderRecompiler { namespace { -[[noreturn]] void FailEmit(const std::string& reason) { - throw std::runtime_error("SPIR-V module emission failed: " + reason); -} - std::uint32_t StorageBufferType(SpirvEmitterState& state) { const auto array = state.module.DecoratedType(spv::OpTypeRuntimeArray, {{spv::OpDecorate, {spv::DecorationArrayStride, 4u}}}, TypeU32(state)); return state.module.DecoratedType(spv::OpTypeStruct,