diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 3fd830ea5..de71ecb24 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -75,6 +75,30 @@ int SampleCount(VkSampleCountFlagBits countFlag) return 1; } +int StageIndex(VkShaderStageFlagBits stageFlag) +{ + switch(stageFlag) + { + case VK_SHADER_STAGE_VERTEX_BIT: + return 0; + case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: + return 1; + case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: + return 2; + case VK_SHADER_STAGE_GEOMETRY_BIT: + return 3; + case VK_SHADER_STAGE_FRAGMENT_BIT: + return 4; + case VK_SHADER_STAGE_COMPUTE_BIT: + return 5; + default: + RDCERR("Unrecognised/not single flag %x", stageFlag); + break; + } + + return 0; +} + ResourceFormat MakeResourceFormat(VkFormat fmt) { ResourceFormat ret; diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 39ffcca48..9f2802caa 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -55,6 +55,7 @@ VkPrimitiveTopology MakeVkPrimitiveTopology(PrimitiveTopology Topo); VkAccessFlags MakeAccessMask(VkImageLayout layout); int SampleCount(VkSampleCountFlagBits countFlag); +int StageIndex(VkShaderStageFlagBits stageFlag); // structure for casting to easily iterate and template specialising Serialise struct VkGenericStruct diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 9af0d0e2b..730fec343 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include "vk_info.h" +#include "3rdparty/glslang/SPIRV/spirv.hpp" void DescSetLayout::Init(VulkanResourceManager *resourceMan, VulkanCreationInfo &info, const VkDescriptorSetLayoutCreateInfo* pCreateInfo) { @@ -75,10 +76,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk ResourceId id = resourceMan->GetNonDispWrapper(pCreateInfo->pStages[i].module)->id; // convert shader bit to shader index - int s=0; - for(; s < 6; s++) - if(pCreateInfo->pStages[i].stage == (1<pStages[i].stage); Shader &shad = shaders[s]; @@ -430,7 +428,23 @@ void VulkanCreationInfo::ShaderModule::Init(VulkanResourceManager *resourceMan, } else { - RDCASSERT(pCreateInfo->codeSize % sizeof(uint32_t) == 0); - ParseSPIRV((uint32_t *)pCreateInfo->pCode, pCreateInfo->codeSize/sizeof(uint32_t), spirv); + static const unsigned int MagicNumber = 0x07230203; // SPIR-V magic number + + // is the SPIR-V version 0? assume GLSL + + if(pCreateInfo->pCode[0] == MagicNumber && pCreateInfo->pCode[1] == 0) + { + // GLSL - compile to SPIR-V ourselves + const char *src = (const char *)(pCreateInfo->pCode+3); + vector srcs; srcs.push_back(src); + vector spirv_code; + string ret = CompileSPIRV((SPIRVShaderStage)StageIndex((VkShaderStageFlagBits)pCreateInfo->pCode[2]), srcs, spirv_code); + ParseSPIRV(&spirv_code[0], spirv_code.size(), spirv); + } + else + { + RDCASSERT(pCreateInfo->codeSize % sizeof(uint32_t) == 0); + ParseSPIRV((uint32_t *)pCreateInfo->pCode, pCreateInfo->codeSize/sizeof(uint32_t), spirv); + } } }