Optimize the code layout to make it easier to read

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-02-18 15:40:55 +08:00
parent d2568072c7
commit 94e6473ce6

View File

@ -184,57 +184,25 @@ EShLanguage FindLanguage(const VkShaderStageFlagBits shader_type)
} }
} }
extern "C" enum class ShaderLanguageType
{ {
bool InitShaderCompiler()
{
init_default_build_in_resource();
return glslang::InitializeProcess();
}
void CloseShaderCompiler()
{
glslang::FinalizeProcess();
}
bool GetLimit(TBuiltInResource *bir,const int size)
{
if(!bir)return(false);
if(size!=sizeof(TBuiltInResource))return(false);
memcpy(bir,&default_build_in_resource,size);
return(true);
}
bool SetLimit(TBuiltInResource *bir,const int size)
{
if(!bir)return(false);
if(size!=sizeof(TBuiltInResource))return(false);
memcpy(&default_build_in_resource,bir,size);
return(true);
}
enum class ShaderLanguageType
{
GLSL=0, GLSL=0,
HLSL, HLSL,
MAX=0xff MAX=0xff
};//enum class ShaderType };//enum class ShaderType
struct CompileInfo struct CompileInfo
{ {
ShaderLanguageType shader_type; ShaderLanguageType shader_type;
const char * entrypoint; const char * entrypoint;
uint32_t includes_count; uint32_t includes_count;
const char ** includes; const char ** includes;
const char * preamble; const char * preamble;
}; };
enum class VertexAttribBaseType enum class VertexAttribBaseType
{ {
Bool=0, Bool=0,
Int, Int,
UInt, UInt,
@ -242,10 +210,10 @@ extern "C"
Double, Double,
MAX=0xff MAX=0xff
};//enum class VertexAttribBaseType };//enum class VertexAttribBaseType
VertexAttribBaseType FromSPIRType(const spirv_cross::SPIRType::BaseType type) VertexAttribBaseType FromSPIRType(const spirv_cross::SPIRType::BaseType type)
{ {
if(type==spirv_cross::SPIRType::BaseType::Boolean) return VertexAttribBaseType::Bool; if(type==spirv_cross::SPIRType::BaseType::Boolean) return VertexAttribBaseType::Bool;
if(type==spirv_cross::SPIRType::BaseType::SByte if(type==spirv_cross::SPIRType::BaseType::SByte
||type==spirv_cross::SPIRType::BaseType::Short ||type==spirv_cross::SPIRType::BaseType::Short
@ -260,10 +228,10 @@ extern "C"
if(type==spirv_cross::SPIRType::BaseType::Double) return VertexAttribBaseType::Double; if(type==spirv_cross::SPIRType::BaseType::Double) return VertexAttribBaseType::Double;
return VertexAttribBaseType::MAX; return VertexAttribBaseType::MAX;
} }
char *new_strcpy(const char *src) char *new_strcpy(const char *src)
{ {
size_t len=1+strlen(src); size_t len=1+strlen(src);
char *str=new char[len]; char *str=new char[len];
@ -271,55 +239,54 @@ extern "C"
memcpy(str,src,len); memcpy(str,src,len);
return str; return str;
} }
struct ShaderStage constexpr size_t SHADER_RESOURCE_NAME_MAX_LENGTH=128;
{
char name[128]; struct ShaderStage
{
char name[SHADER_RESOURCE_NAME_MAX_LENGTH];
uint8_t location; uint8_t location;
uint32_t basetype; uint32_t basetype;
uint32_t vec_size; uint32_t vec_size;
};// };//
struct ShaderStageData struct ShaderStageData
{ {
uint32_t count; uint32_t count;
ShaderStage *items; ShaderStage *items;
}; };
struct ShaderResource struct Descriptor
{ {
char name[128]; char name[SHADER_RESOURCE_NAME_MAX_LENGTH];
union
{
struct
{
uint8_t set; uint8_t set;
uint8_t binding; uint8_t binding;
}; };
struct struct PushConstant
{ {
char name[SHADER_RESOURCE_NAME_MAX_LENGTH];
uint8_t offset; uint8_t offset;
uint8_t size; uint8_t size;
}; };
struct struct SubpassInput
{ {
char name[SHADER_RESOURCE_NAME_MAX_LENGTH];
uint8_t input_attachment_index; uint8_t input_attachment_index;
}; uint8_t binding;
}; };
};
struct ShaderResourceData template<typename T>
{ struct ShaderResourceData
{
uint32_t count; uint32_t count;
ShaderResource *items; T *items;
}; };
struct SPVData struct SPVData
{ {
bool result; bool result;
char *log; char *log;
char *debug_log; char *debug_log;
@ -328,16 +295,16 @@ extern "C"
uint32_t spv_length; uint32_t spv_length;
ShaderStageData input,output; ShaderStageData input,output;
ShaderResourceData resource[VK_DESCRIPTOR_TYPE_COUNT]; ShaderResourceData<Descriptor> resource[VK_DESCRIPTOR_TYPE_COUNT];
ShaderResourceData push_constant; ShaderResourceData<PushConstant> push_constant;
ShaderResourceData subpass_input; ShaderResourceData<SubpassInput> subpass_input;
void Init() void Init()
{ {
memset(this,0,sizeof(SPVData)); memset(this,0,sizeof(SPVData));
} }
public: public:
SPVData(const char *l,const char *dl) SPVData(const char *l,const char *dl)
{ {
@ -385,15 +352,10 @@ extern "C"
delete[] debug_log; delete[] debug_log;
delete[] spv_data; delete[] spv_data;
} }
};//struct SPVData };//struct SPVData
void FreeSPVData(SPVData *spv) void OutputShaderStage(ShaderStageData *ssd,ShaderParse *sp,const SPVResVector &stages)
{ {
delete spv;
}
void OutputShaderStage(ShaderStageData *ssd,ShaderParse *sp,const SPVResVector &stages)
{
size_t attr_count=stages.size(); size_t attr_count=stages.size();
ssd->count=(uint32_t)attr_count; ssd->count=(uint32_t)attr_count;
@ -419,17 +381,17 @@ extern "C"
++ss; ++ss;
} }
} }
void OutputShaderResource(ShaderResourceData *ssd,ShaderParse *sp,const SPVResVector &res) void OutputShaderResource(ShaderResourceData<Descriptor> *ssd,ShaderParse *sp,const SPVResVector &res)
{ {
size_t count=res.size(); size_t count=res.size();
if(count<=0)return; if(count<=0)return;
ssd->count=(uint32_t)count; ssd->count=(uint32_t)count;
ssd->items=new ShaderResource[count]; ssd->items=new Descriptor[count];
ShaderResource *sr=ssd->items; Descriptor *sr=ssd->items;
for(const spirv_cross::Resource &obj:res) for(const spirv_cross::Resource &obj:res)
{ {
@ -439,17 +401,17 @@ extern "C"
++sr; ++sr;
} }
} }
void OutputPushConstant(ShaderResourceData* ssd, ShaderParse* sp, const SPVResVector& res) void OutputPushConstant(ShaderResourceData<PushConstant> *ssd, ShaderParse* sp, const SPVResVector& res)
{ {
size_t count = res.size(); size_t count = res.size();
if (count <= 0)return; if (count <= 0)return;
ssd->count = (uint32_t)count; ssd->count = (uint32_t)count;
ssd->items = new ShaderResource[count]; ssd->items = new PushConstant[count];
ShaderResource* sr = ssd->items; PushConstant *sr=ssd->items;
for (const spirv_cross::Resource& obj : res) for (const spirv_cross::Resource& obj : res)
{ {
@ -459,17 +421,17 @@ extern "C"
++sr; ++sr;
} }
} }
void OutputSubpassInput(ShaderResourceData* ssd, ShaderParse* sp, const SPVResVector& res) void OutputSubpassInput(ShaderResourceData<SubpassInput> *ssd, ShaderParse* sp, const SPVResVector& res)
{ {
size_t count = res.size(); size_t count = res.size();
if (count <= 0)return; if (count <= 0)return;
ssd->count = (uint32_t)count; ssd->count = (uint32_t)count;
ssd->items = new ShaderResource[count]; ssd->items = new SubpassInput[count];
ShaderResource* sr = ssd->items; SubpassInput *sr = ssd->items;
for (const spirv_cross::Resource& obj : res) for (const spirv_cross::Resource& obj : res)
{ {
@ -479,6 +441,43 @@ extern "C"
++sr; ++sr;
} }
}
extern "C"
{
bool InitShaderCompiler()
{
init_default_build_in_resource();
return glslang::InitializeProcess();
}
void CloseShaderCompiler()
{
glslang::FinalizeProcess();
}
bool GetLimit(TBuiltInResource *bir,const int size)
{
if(!bir)return(false);
if(size!=sizeof(TBuiltInResource))return(false);
memcpy(bir,&default_build_in_resource,size);
return(true);
}
bool SetLimit(TBuiltInResource *bir,const int size)
{
if(!bir)return(false);
if(size!=sizeof(TBuiltInResource))return(false);
memcpy(&default_build_in_resource,bir,size);
return(true);
}
void FreeSPVData(SPVData *spv)
{
delete spv;
} }
SPVData *Shader2SPV( SPVData *Shader2SPV(