Handle GLSL being passed into shader module creation function

This commit is contained in:
baldurk
2015-12-18 11:03:33 +01:00
parent 599a378d9c
commit e286d34a53
3 changed files with 45 additions and 6 deletions
+24
View File
@@ -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;
+1
View File
@@ -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
+20 -6
View File
@@ -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<<s))
break;
int s = StageIndex(pCreateInfo->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<string> srcs; srcs.push_back(src);
vector<uint32_t> 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);
}
}
}