改进SPIRType到VkFormat转换

This commit is contained in:
HuYingzhuo 2019-04-26 10:17:28 +08:00
parent d485dd90e3
commit d8978b6eaa
2 changed files with 36 additions and 42 deletions

View File

@ -95,6 +95,22 @@
#define FMT_RGBA32I VK_FORMAT_R32G32B32A32_SINT #define FMT_RGBA32I VK_FORMAT_R32G32B32A32_SINT
#define FMT_RGBA32F VK_FORMAT_R32G32B32A32_SFLOAT #define FMT_RGBA32F VK_FORMAT_R32G32B32A32_SFLOAT
#define FMT_R64U VK_FORMAT_R64_UINT
#define FMT_R64I VK_FORMAT_R64_SINT
#define FMT_R64F VK_FORMAT_R64_SFLOAT
#define FMT_RG64U VK_FORMAT_R64G64_UINT
#define FMT_RG64I VK_FORMAT_R64G64_SINT
#define FMT_RG64F VK_FORMAT_R64G64_SFLOAT
#define FMT_RGB64U VK_FORMAT_R64G64B64_UINT
#define FMT_RGB64I VK_FORMAT_R64G64B64_SINT
#define FMT_RGB64F VK_FORMAT_R64G64B64_SFLOAT
#define FMT_RGBA64U VK_FORMAT_R64G64B64A64_UINT
#define FMT_RGBA64I VK_FORMAT_R64G64B64A64_SINT
#define FMT_RGBA64F VK_FORMAT_R64G64B64A64_SFLOAT
#define FMT_B10GR11 VK_FORMAT_B10G11R11_UFLOAT_PACK32 #define FMT_B10GR11 VK_FORMAT_B10G11R11_UFLOAT_PACK32
#define FMT_E5BGR9 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 #define FMT_E5BGR9 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32

View File

@ -5,49 +5,28 @@
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
const VkFormat GetVecFormat(const spirv_cross::SPIRType &type) const VkFormat GetVecFormat(const spirv_cross::SPIRType &type)
{ {
if(type.basetype==spirv_cross::SPIRType::Float) constexpr VkFormat format[][4]=
{ {
constexpr VkFormat format[4]={FMT_R32F,FMT_RG32F,FMT_RGB32F,FMT_RGB32F}; {FMT_R8I,FMT_RG8I,FMT_RGB8I,FMT_RGBA8I}, //sbyte
{FMT_R8U,FMT_RG8U,FMT_RGB8U,FMT_RGBA8U}, //ubyte
return format[type.vecsize-1]; {FMT_R16I,FMT_RG16I,FMT_RGB16I,FMT_RGBA16I},//short
} {FMT_R16U,FMT_RG16U,FMT_RGB16U,FMT_RGBA16U},//ushort
else {FMT_R32I,FMT_RG32I,FMT_RGB32I,FMT_RGBA32I},//int
if(type.basetype==spirv_cross::SPIRType::Half) {FMT_R32U,FMT_RG32U,FMT_RGB32U,FMT_RGBA32U},//uint
{ {FMT_R64I,FMT_RG64I,FMT_RGB64I,FMT_RGBA64I},//int64
constexpr VkFormat format[4]={FMT_R16F,FMT_RG16F,FMT_RGB16F,FMT_RGB16F}; {FMT_R64U,FMT_RG64U,FMT_RGB64U,FMT_RGBA64U},//uint64
{}, //atomic
return format[type.vecsize-1]; {FMT_R16F,FMT_RG16F,FMT_RGB16F,FMT_RGBA16F},//half
} {FMT_R32F,FMT_RG32F,FMT_RGB32F,FMT_RGBA32F},//float
else {FMT_R64F,FMT_RG64F,FMT_RGB64F,FMT_RGBA64F} //double
if(type.basetype==spirv_cross::SPIRType::UInt) };
{
constexpr VkFormat format[4]={FMT_R32U,FMT_RG32U,FMT_RGB32U,FMT_RGB32U};
return format[type.vecsize-1];
}
else
if(type.basetype==spirv_cross::SPIRType::Int)
{
constexpr VkFormat format[4]={FMT_R32I,FMT_RG32I,FMT_RGB32I,FMT_RGB32I};
return format[type.vecsize-1];
}
else
if(type.basetype==spirv_cross::SPIRType::UShort)
{
constexpr VkFormat format[4]={FMT_R16U,FMT_RG16U,FMT_RGB16U,FMT_RGB16U};
return format[type.vecsize-1];
}
else
if(type.basetype==spirv_cross::SPIRType::Short)
{
constexpr VkFormat format[4]={FMT_R16I,FMT_RG16I,FMT_RGB16I,FMT_RGB16I};
return format[type.vecsize-1];
}
if(type.basetype<spirv_cross::SPIRType::SByte
||type.basetype>spirv_cross::SPIRType::Double
||type.basetype==spirv_cross::SPIRType::AtomicCounter)
return VK_FORMAT_UNDEFINED; return VK_FORMAT_UNDEFINED;
return format[type.basetype-spirv_cross::SPIRType::SByte][type.vecsize-1];
} }
bool Shader::CreateVIS(const void *spv_data,const uint32_t spv_size) bool Shader::CreateVIS(const void *spv_data,const uint32_t spv_size)
@ -67,8 +46,7 @@ bool Shader::CreateVIS(const void *spv_data,const uint32_t spv_size)
const uint32_t location=comp.get_decoration(si.id,spv::DecorationLocation); const uint32_t location=comp.get_decoration(si.id,spv::DecorationLocation);
const UTF8String & name =comp.get_name(si.id).c_str(); const UTF8String & name =comp.get_name(si.id).c_str();
const int binding=vertex_input_state->Add(name,location,format); vertex_input_state->Add(name,location,format);
} }
return(true); return(true);