(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 *);
Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps);
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 *geometry_shader_module,const ShaderModule *fragment_shader_module);
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,MaterialDescriptorSets *);
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 相关

View File

@ -88,11 +88,7 @@ public: // VBO/VAO
public: //Material
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 &);
MaterialInstance * CreateMaterialInstance(Material *);
MaterialInstance * CreateMaterialInstance(const OSString &);

View File

@ -30,6 +30,7 @@ struct ShaderDescriptor
DescriptorSetType set_type;
uint32_t set;
uint32_t binding;
uint32_t stage_flag;
};
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;
#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
{
VkShaderStageFlagBits stage_flag;
@ -56,8 +88,6 @@ class ShaderResource
ShaderStageList stage_inputs;
ShaderStageList stage_outputs;
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
public:
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
@ -77,34 +107,9 @@ public:
const ShaderStage * GetStageInput (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
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header);
ShaderResource *LoadShaderResoruce(const OSString &filename);
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize);
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"
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();
@ -45,7 +45,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
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)
return(nullptr);
@ -58,10 +58,10 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShade
smm->Add(vertex_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
||!geometry_shader_module
@ -78,6 +78,6 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShade
smm->Add(geometry_shader_module);
smm->Add(fragment_shader_module);
return CreateMaterial(mtl_name,smm);
return CreateMaterial(mtl_name,smm,mds);
}
VK_NAMESPACE_END

View File

@ -26,57 +26,50 @@ const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,
return sm;
}
const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename)
{
ShaderModule *sm;
const bool LoadShaderDescriptor(ShaderResource *sr,const uint8 *data)
{
const uint8 count=*data++;
if(shader_module_by_name.Get(filename,sm))
return sm;
if(count<=0)return(true);
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)
{
const ShaderModule *vs=CreateShaderModule(vertex_shader_filename);
ShaderDescriptor *sd=sd_list->GetData();
if(!vs)
return(nullptr);
for(uint i=0;i<count;i++)
{
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)
return(nullptr);
sd->set_type=CheckDescriptorSetType(sd->name);
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)
{
const ShaderModule *vs=CreateShaderModule(vertex_shader_filename);
++sd;
}
if(!vs)
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));
return data;
}
Material *RenderResource::CreateMaterial(const OSString &filename)
@ -104,24 +97,21 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
return(nullptr);
const uint8 *sp=origin_filedata;
int64 left=filesize;
const uint8 *end=sp+filesize;
if(memcmp(sp,MaterialFileHeader,MaterialFileHeaderLength)!=0)
return(nullptr);
sp+=MaterialFileHeaderLength;
left-=MaterialFileHeaderLength;
const uint8 ver=*sp;
++sp;
--left;
if(ver!=1)
if(ver!=2)
return(nullptr);
const uint32_t shader_bits=*(uint32_t *)sp;
sp+=sizeof(uint32_t);
left-=sizeof(uint32_t);
const uint count=GetShaderCountByBits(shader_bits);
uint32_t size;
@ -138,11 +128,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
{
size=*(uint32_t *)sp;
sp+=sizeof(uint32_t);
left-=sizeof(uint32_t);
sr=LoadShaderResource(sp,size,false);
sr=LoadShaderResource(sp,size);
sp+=size;
left-=size;
if(sr)
{
@ -155,12 +143,15 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
if(smm->Add(sm))
continue;
}
}
}
result=false;
break;
}
if(!LoadShaderDescriptor(sr,filedata))
result=false;
if(result)
{
mtl=device->CreateMaterial(ToUTF8String(filename),smm);

View File

@ -40,8 +40,6 @@ VK_NAMESPACE_BEGIN
if(count<=0)
return(data);
const uint32 total_bytes=AccessByPointer(data,uint32);
int str_len;
ShaderStage *ss;
@ -50,11 +48,11 @@ VK_NAMESPACE_BEGIN
{
ss=new ShaderStage;
ss->location=*data++;
ss->type.basetype=(VertexAttribBaseType)*data++;
ss->type.vec_size=*data++;
ss->location =*data++;
ss->type.basetype =(VertexAttribBaseType)*data++;
ss->type.vec_size =*data++;
ss->format=VK_NAMESPACE::GetVulkanFormat(&(ss->type));
ss->format =VK_NAMESPACE::GetVulkanFormat(&(ss->type));
str_len=*data++;
ss->name.SetString((char *)data,str_len);
@ -67,51 +65,6 @@ VK_NAMESPACE_BEGIN
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
ShaderResource::ShaderResource(const VkShaderStageFlagBits &flag,const void *sd,const uint32 size)
@ -195,31 +148,16 @@ VK_NAMESPACE_BEGIN
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);
const uint8 *filedata=origin_filedata;
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;
uint32 spv_size;
uint32 desc_type;
version =AccessByPointer(filedata,uint8);
flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32);
spv_size=AccessByPointer(filedata,uint32);
@ -230,37 +168,6 @@ VK_NAMESPACE_BEGIN
filedata=LoadShaderStages(sr->GetStageInputs(),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;
}
VK_NAMESPACE_END