From be6134117897d9d83767a247e612b3389802e104 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 18 Feb 2025 01:10:49 +0100 Subject: [PATCH] [d3d11] Rework DXBC shader stage to Vulkan shader stage mapping We're going to have to do this at runtime, so this needs to be fast. --- src/d3d11/d3d11_util.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/d3d11/d3d11_util.h b/src/d3d11/d3d11_util.h index 8720bbbb3..10a4a8fc5 100644 --- a/src/d3d11/d3d11_util.h +++ b/src/d3d11/d3d11_util.h @@ -52,15 +52,15 @@ namespace dxvk { * \returns Corresponding Vulkan shader stage */ constexpr VkShaderStageFlagBits GetShaderStage(DxbcProgramType ProgramType) { - switch (ProgramType) { - case DxbcProgramType::VertexShader: return VK_SHADER_STAGE_VERTEX_BIT; - case DxbcProgramType::HullShader: return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; - case DxbcProgramType::DomainShader: return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; - case DxbcProgramType::GeometryShader: return VK_SHADER_STAGE_GEOMETRY_BIT; - case DxbcProgramType::PixelShader: return VK_SHADER_STAGE_FRAGMENT_BIT; - case DxbcProgramType::ComputeShader: return VK_SHADER_STAGE_COMPUTE_BIT; - default: return VkShaderStageFlagBits(0); - } + constexpr uint64_t lut + = (uint64_t(VK_SHADER_STAGE_VERTEX_BIT) << (8u * uint32_t(DxbcProgramType::VertexShader))) + | (uint64_t(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) << (8u * uint32_t(DxbcProgramType::HullShader))) + | (uint64_t(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) << (8u * uint32_t(DxbcProgramType::DomainShader))) + | (uint64_t(VK_SHADER_STAGE_GEOMETRY_BIT) << (8u * uint32_t(DxbcProgramType::GeometryShader))) + | (uint64_t(VK_SHADER_STAGE_FRAGMENT_BIT) << (8u * uint32_t(DxbcProgramType::PixelShader))) + | (uint64_t(VK_SHADER_STAGE_COMPUTE_BIT) << (8u * uint32_t(DxbcProgramType::ComputeShader))); + + return VkShaderStageFlagBits((lut >> (8u * uint32_t(ProgramType))) & 0xff); } -} \ No newline at end of file +}