改进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_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_E5BGR9 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32

View File

@ -5,49 +5,28 @@
VK_NAMESPACE_BEGIN
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
{FMT_R16I,FMT_RG16I,FMT_RGB16I,FMT_RGBA16I},//short
{FMT_R16U,FMT_RG16U,FMT_RGB16U,FMT_RGBA16U},//ushort
{FMT_R32I,FMT_RG32I,FMT_RGB32I,FMT_RGBA32I},//int
{FMT_R32U,FMT_RG32U,FMT_RGB32U,FMT_RGBA32U},//uint
{FMT_R64I,FMT_RG64I,FMT_RGB64I,FMT_RGBA64I},//int64
{FMT_R64U,FMT_RG64U,FMT_RGB64U,FMT_RGBA64U},//uint64
{}, //atomic
{FMT_R16F,FMT_RG16F,FMT_RGB16F,FMT_RGBA16F},//half
{FMT_R32F,FMT_RG32F,FMT_RGB32F,FMT_RGBA32F},//float
{FMT_R64F,FMT_RG64F,FMT_RGB64F,FMT_RGBA64F} //double
};
return format[type.vecsize-1];
}
else
if(type.basetype==spirv_cross::SPIRType::Half)
{
constexpr VkFormat format[4]={FMT_R16F,FMT_RG16F,FMT_RGB16F,FMT_RGB16F};
if(type.basetype<spirv_cross::SPIRType::SByte
||type.basetype>spirv_cross::SPIRType::Double
||type.basetype==spirv_cross::SPIRType::AtomicCounter)
return VK_FORMAT_UNDEFINED;
return format[type.vecsize-1];
}
else
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];
}
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)
@ -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 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);