(WIP)support newly material file,can't use.

This commit is contained in:
hyzboy 2021-09-09 18:20:17 +08:00
parent 903f9081eb
commit ba6367556b
13 changed files with 92 additions and 193 deletions

@ -1 +1 @@
Subproject commit 2940b99b99cfe575dd45103ef20f4019dee15b54 Subproject commit 97a78cdd429f33a7c074fd0d7649012eec20d43a

@ -1 +1 @@
Subproject commit 9be589598595963f94ba264d7b416d0533421106 Subproject commit c39fbdac0f0f6638d5cfca43988750a1aac512db

@ -1 +1 @@
Subproject commit 630770496d8d78dd6c06511ba180dbe4ddf14f94 Subproject commit b61ed5cbfad8b76339ef1b2564ca03ffe34de7cc

2
CMCore

@ -1 +1 @@
Subproject commit 468aa4462224a722b334d7140723b169556ba368 Subproject commit 9c5cb2dc4a946906be186e10a3c0a4fb67d2a912

@ -1 +1 @@
Subproject commit e2f056ddff2e1adacd6431c685af9c0ed8177e06 Subproject commit 7a5040224a162cd63f54e28d31eaf7eb710b48a0

2
CMUtil

@ -1 +1 @@
Subproject commit 9982ca25af1a52981054af8636dfc5f3e2ea59c9 Subproject commit 8ce98c85a397921277cd19a91993b6724bf1d391

View File

@ -195,9 +195,9 @@ public: //shader & material
ShaderModule *CreateShaderModule(ShaderResource *); ShaderModule *CreateShaderModule(ShaderResource *);
Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps); Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *);
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module); Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module); Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
public: //Command Buffer 相关 public: //Command Buffer 相关

View File

@ -88,10 +88,6 @@ public: // VBO/VAO
public: //Material public: //Material
const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource); const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource);
const ShaderModule *CreateShaderModule(const OSString &filename);
Material * CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &fragment_shader_filename);
Material * CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename);
Material * CreateMaterial(const OSString &); Material * CreateMaterial(const OSString &);
MaterialInstance * CreateMaterialInstance(Material *); MaterialInstance * CreateMaterialInstance(Material *);

View File

@ -30,6 +30,7 @@ struct ShaderDescriptor
DescriptorSetType set_type; DescriptorSetType set_type;
uint32_t set; uint32_t set;
uint32_t binding; uint32_t binding;
uint32_t stage_flag;
}; };
using ShaderDescriptorList=List<ShaderDescriptor>; using ShaderDescriptorList=List<ShaderDescriptor>;
@ -46,6 +47,37 @@ constexpr size_t VK_DESCRIPTOR_TYPE_END_RANGE=VK_DESCRIPTOR_TYPE_INPUT_ATTACHMEN
constexpr size_t VK_DESCRIPTOR_TYPE_RANGE_SIZE=VK_DESCRIPTOR_TYPE_END_RANGE-VK_DESCRIPTOR_TYPE_BEGIN_RANGE+1; constexpr size_t VK_DESCRIPTOR_TYPE_RANGE_SIZE=VK_DESCRIPTOR_TYPE_END_RANGE-VK_DESCRIPTOR_TYPE_BEGIN_RANGE+1;
#endif//VK_DESCRIPTOR_TYPE_RANGE_SIZE #endif//VK_DESCRIPTOR_TYPE_RANGE_SIZE
class MaterialDescriptorSets
{
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
public:
const ShaderDescriptorList * GetDescriptorList ()const {return descriptor_list;}
ShaderDescriptorList * GetDescriptorList (VkDescriptorType desc_type)
{
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
return descriptor_list+desc_type;
}
ShaderDescriptorList &GetUBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER];}
ShaderDescriptorList &GetSSBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER];}
ShaderDescriptorList &GetUBODynamic (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC];}
ShaderDescriptorList &GetSSBODynamic(){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC];}
ShaderDescriptorList &GetSampler (){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const;
//const DescriptorBindingList * GetBindingList (VkDescriptorType desc_type)const
//{
// if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
// ||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
// return &(descriptor_list[desc_type].binding_list);
//}
};//
class ShaderResource class ShaderResource
{ {
VkShaderStageFlagBits stage_flag; VkShaderStageFlagBits stage_flag;
@ -56,8 +88,6 @@ class ShaderResource
ShaderStageList stage_inputs; ShaderStageList stage_inputs;
ShaderStageList stage_outputs; ShaderStageList stage_outputs;
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
public: public:
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32); ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
@ -77,34 +107,9 @@ public:
const ShaderStage * GetStageInput (const AnsiString &)const; const ShaderStage * GetStageInput (const AnsiString &)const;
const int GetStageInputBinding(const AnsiString &)const; const int GetStageInputBinding(const AnsiString &)const;
const ShaderDescriptorList * GetDescriptorList ()const {return descriptor_list;}
ShaderDescriptorList * GetDescriptorList (VkDescriptorType desc_type)
{
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
return descriptor_list+desc_type;
}
ShaderDescriptorList &GetUBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER];}
ShaderDescriptorList &GetSSBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER];}
ShaderDescriptorList &GetUBODynamic (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC];}
ShaderDescriptorList &GetSSBODynamic(){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC];}
ShaderDescriptorList &GetSampler(){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const;
//const DescriptorBindingList * GetBindingList (VkDescriptorType desc_type)const
//{
// if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
// ||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
// return &(descriptor_list[desc_type].binding_list);
//}
};//class ShaderResource };//class ShaderResource
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header); ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize);
ShaderResource *LoadShaderResoruce(const OSString &filename);
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO> struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
{ {

2
res

@ -1 +1 @@
Subproject commit 9f031f98a611172812ceb4094af0f032218c5e91 Subproject commit a0c84d12663e1d0ce0ad22faa5cd89ede26af90f

View File

@ -3,7 +3,7 @@
#include"VKDescriptorSetLayoutCreater.h" #include"VKDescriptorSetLayoutCreater.h"
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps) Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *mds)
{ {
const int shader_count=shader_maps->GetCount(); const int shader_count=shader_maps->GetCount();
@ -45,7 +45,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
return(new Material(mtl_name,shader_maps,shader_stage_list,dsl_creater)); return(new Material(mtl_name,shader_maps,shader_stage_list,dsl_creater));
} }
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module) Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds)
{ {
if(!vertex_shader_module||!fragment_shader_module) if(!vertex_shader_module||!fragment_shader_module)
return(nullptr); return(nullptr);
@ -58,10 +58,10 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShade
smm->Add(vertex_shader_module); smm->Add(vertex_shader_module);
smm->Add(fragment_shader_module); smm->Add(fragment_shader_module);
return CreateMaterial(mtl_name,smm); return CreateMaterial(mtl_name,smm,mds);
} }
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module) Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds)
{ {
if(!vertex_shader_module if(!vertex_shader_module
||!geometry_shader_module ||!geometry_shader_module
@ -78,6 +78,6 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShade
smm->Add(geometry_shader_module); smm->Add(geometry_shader_module);
smm->Add(fragment_shader_module); smm->Add(fragment_shader_module);
return CreateMaterial(mtl_name,smm); return CreateMaterial(mtl_name,smm,mds);
} }
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -26,57 +26,50 @@ const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,
return sm; return sm;
} }
const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename) const bool LoadShaderDescriptor(ShaderResource *sr,const uint8 *data)
{ {
ShaderModule *sm; const uint8 count=*data++;
if(shader_module_by_name.Get(filename,sm)) if(count<=0)return(true);
return sm;
ShaderResource *shader_resource=LoadShaderResoruce(filename); ShaderDescriptorList *sd_list;
const VkDescriptorType desc_type;
if(!shader_resource)return(nullptr);
sm=device->CreateShaderModule(shader_resource);
shader_module_by_name.Add(filename,sm); uint str_len;
return sm; sd_list->SetCount(count);
}
Material *RenderResource::CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &fragment_shader_filename) ShaderDescriptor *sd=sd_list->GetData();
{
const ShaderModule *vs=CreateShaderModule(vertex_shader_filename);
if(!vs) for(uint i=0;i<count;i++)
return(nullptr); {
sd->set=*data++;
sd->binding=*data++;
str_len=*data++;
const ShaderModule *fs=CreateShaderModule(fragment_shader_filename); memcpy(sd->name,(char *)data,str_len);
sd->name[str_len]=0;
data+=str_len;
if(!fs) sd->set_type=CheckDescriptorSetType(sd->name);
return(nullptr);
return(device->CreateMaterial(mtl_name,(VertexShaderModule *)vs,fs)); if(sd->set_type==DescriptorSetType::Renderable)
} {
if(desc_type==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;else
if(desc_type==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;else
sd->desc_type=desc_type;
}
else
{
sd->desc_type=desc_type;
}
Material *RenderResource::CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename) ++sd;
{ }
const ShaderModule *vs=CreateShaderModule(vertex_shader_filename);
if(!vs) return data;
return(nullptr);
const ShaderModule *gs=CreateShaderModule(geometry_shader_filename);
if(!gs)
return(nullptr);
const ShaderModule *fs=CreateShaderModule(fragment_shader_filename);
if(!fs)
return(nullptr);
return(device->CreateMaterial(mtl_name,(VertexShaderModule *)vs,gs,fs));
} }
Material *RenderResource::CreateMaterial(const OSString &filename) Material *RenderResource::CreateMaterial(const OSString &filename)
@ -104,24 +97,21 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
return(nullptr); return(nullptr);
const uint8 *sp=origin_filedata; const uint8 *sp=origin_filedata;
int64 left=filesize; const uint8 *end=sp+filesize;
if(memcmp(sp,MaterialFileHeader,MaterialFileHeaderLength)!=0) if(memcmp(sp,MaterialFileHeader,MaterialFileHeaderLength)!=0)
return(nullptr); return(nullptr);
sp+=MaterialFileHeaderLength; sp+=MaterialFileHeaderLength;
left-=MaterialFileHeaderLength;
const uint8 ver=*sp; const uint8 ver=*sp;
++sp; ++sp;
--left;
if(ver!=1) if(ver!=2)
return(nullptr); return(nullptr);
const uint32_t shader_bits=*(uint32_t *)sp; const uint32_t shader_bits=*(uint32_t *)sp;
sp+=sizeof(uint32_t); sp+=sizeof(uint32_t);
left-=sizeof(uint32_t);
const uint count=GetShaderCountByBits(shader_bits); const uint count=GetShaderCountByBits(shader_bits);
uint32_t size; uint32_t size;
@ -138,11 +128,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
{ {
size=*(uint32_t *)sp; size=*(uint32_t *)sp;
sp+=sizeof(uint32_t); sp+=sizeof(uint32_t);
left-=sizeof(uint32_t);
sr=LoadShaderResource(sp,size,false); sr=LoadShaderResource(sp,size);
sp+=size; sp+=size;
left-=size;
if(sr) if(sr)
{ {
@ -161,6 +149,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
break; break;
} }
if(!LoadShaderDescriptor(sr,filedata))
result=false;
if(result) if(result)
{ {
mtl=device->CreateMaterial(ToUTF8String(filename),smm); mtl=device->CreateMaterial(ToUTF8String(filename),smm);

View File

@ -40,8 +40,6 @@ VK_NAMESPACE_BEGIN
if(count<=0) if(count<=0)
return(data); return(data);
const uint32 total_bytes=AccessByPointer(data,uint32);
int str_len; int str_len;
ShaderStage *ss; ShaderStage *ss;
@ -50,11 +48,11 @@ VK_NAMESPACE_BEGIN
{ {
ss=new ShaderStage; ss=new ShaderStage;
ss->location=*data++; ss->location =*data++;
ss->type.basetype=(VertexAttribBaseType)*data++; ss->type.basetype =(VertexAttribBaseType)*data++;
ss->type.vec_size=*data++; ss->type.vec_size =*data++;
ss->format=VK_NAMESPACE::GetVulkanFormat(&(ss->type)); ss->format =VK_NAMESPACE::GetVulkanFormat(&(ss->type));
str_len=*data++; str_len=*data++;
ss->name.SetString((char *)data,str_len); ss->name.SetString((char *)data,str_len);
@ -67,51 +65,6 @@ VK_NAMESPACE_BEGIN
return data; return data;
} }
const uint8 *LoadShaderDescriptor(const uint8_t version,ShaderDescriptorList *sd_list,const VkDescriptorType desc_type,const uint8 *data)
{
const uint32 total_bytes=AccessByPointer(data,uint32);
const uint count=*data++;
uint str_len;
sd_list->SetCount(count);
ShaderDescriptor *sd=sd_list->GetData();
for(uint i=0;i<count;i++)
{
if(version>=1)
sd->set=*data++;
else
sd->set=0;
sd->binding=*data++;
str_len=*data++;
memcpy(sd->name,(char *)data,str_len);
sd->name[str_len]=0;
data+=str_len;
sd->set_type=CheckDescriptorSetType(sd->name);
if(sd->set_type==DescriptorSetType::Renderable)
{
if(desc_type==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;else
if(desc_type==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;else
sd->desc_type=desc_type;
}
else
{
sd->desc_type=desc_type;
}
++sd;
}
return data;
}
}//namespcae }//namespcae
ShaderResource::ShaderResource(const VkShaderStageFlagBits &flag,const void *sd,const uint32 size) ShaderResource::ShaderResource(const VkShaderStageFlagBits &flag,const void *sd,const uint32 size)
@ -195,31 +148,16 @@ VK_NAMESPACE_BEGIN
return -1; return -1;
} }
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header) ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize)
{ {
if(!origin_filedata)return(nullptr); if(!origin_filedata)return(nullptr);
const uint8 *filedata=origin_filedata; const uint8 *filedata=origin_filedata;
const uint8 *file_end=filedata+filesize; const uint8 *file_end=filedata+filesize;
if(include_file_header)
{
if(filesize<SHADER_FILE_MIN_SIZE
||memcmp(origin_filedata,SHADER_FILE_HEADER,SHADER_FILE_HEADER_BYTES))
{
delete[] origin_filedata;
return(nullptr);
}
filedata+=SHADER_FILE_HEADER_BYTES;
}
uint8 version;
VkShaderStageFlagBits flag; VkShaderStageFlagBits flag;
uint32 spv_size; uint32 spv_size;
uint32 desc_type;
version =AccessByPointer(filedata,uint8);
flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32); flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32);
spv_size=AccessByPointer(filedata,uint32); spv_size=AccessByPointer(filedata,uint32);
@ -230,37 +168,6 @@ VK_NAMESPACE_BEGIN
filedata=LoadShaderStages(sr->GetStageInputs(),filedata); filedata=LoadShaderStages(sr->GetStageInputs(),filedata);
filedata=LoadShaderStages(sr->GetStageOutputs(),filedata); filedata=LoadShaderStages(sr->GetStageOutputs(),filedata);
while(filedata<file_end)
{
desc_type=AccessByPointer(filedata,uint32);
filedata=LoadShaderDescriptor(version,sr->GetDescriptorList((VkDescriptorType)desc_type),(VkDescriptorType)desc_type,filedata);
}
return sr;
}
ShaderResource *LoadShaderResoruce(const OSString &filename)
{
ShaderResource *sr;
if(shader_resource_by_filename.Get(filename,sr))
return sr;
int64 filesize;
uint8 *filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".shader"),filesize);
if(!filedata)
{
shader_resource_by_filename.Add(filename,nullptr);
return(nullptr);
}
AutoDeleteArray<uint8> origin_filedata(filedata,filesize);
sr=LoadShaderResource(origin_filedata,filesize,true);
shader_resource_by_filename.Add(filename,sr);
return sr; return sr;
} }
VK_NAMESPACE_END VK_NAMESPACE_END