From ba6367556b2be12191e1b3aa07e6ea4894d01af3 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 9 Sep 2021 18:20:17 +0800 Subject: [PATCH] (WIP)support newly material file,can't use. --- 3rdpty/MathGeoLib | 2 +- 3rdpty/jsoncpp | 2 +- CMCMakeModule | 2 +- CMCore | 2 +- CMPlatform | 2 +- CMUtil | 2 +- inc/hgl/graph/VKDevice.h | 6 +- inc/hgl/graph/VKRenderResource.h | 4 - inc/hgl/graph/shader/ShaderResource.h | 61 ++++++----- res | 2 +- src/SceneGraph/Vulkan/VKDeviceMaterial.cpp | 10 +- .../Vulkan/VKRenderResourceMaterial.cpp | 87 +++++++-------- src/SceneGraph/shader/ShaderResource.cpp | 103 +----------------- 13 files changed, 92 insertions(+), 193 deletions(-) diff --git a/3rdpty/MathGeoLib b/3rdpty/MathGeoLib index 2940b99b..97a78cdd 160000 --- a/3rdpty/MathGeoLib +++ b/3rdpty/MathGeoLib @@ -1 +1 @@ -Subproject commit 2940b99b99cfe575dd45103ef20f4019dee15b54 +Subproject commit 97a78cdd429f33a7c074fd0d7649012eec20d43a diff --git a/3rdpty/jsoncpp b/3rdpty/jsoncpp index 9be58959..c39fbdac 160000 --- a/3rdpty/jsoncpp +++ b/3rdpty/jsoncpp @@ -1 +1 @@ -Subproject commit 9be589598595963f94ba264d7b416d0533421106 +Subproject commit c39fbdac0f0f6638d5cfca43988750a1aac512db diff --git a/CMCMakeModule b/CMCMakeModule index 63077049..b61ed5cb 160000 --- a/CMCMakeModule +++ b/CMCMakeModule @@ -1 +1 @@ -Subproject commit 630770496d8d78dd6c06511ba180dbe4ddf14f94 +Subproject commit b61ed5cbfad8b76339ef1b2564ca03ffe34de7cc diff --git a/CMCore b/CMCore index 468aa446..9c5cb2dc 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 468aa4462224a722b334d7140723b169556ba368 +Subproject commit 9c5cb2dc4a946906be186e10a3c0a4fb67d2a912 diff --git a/CMPlatform b/CMPlatform index e2f056dd..7a504022 160000 --- a/CMPlatform +++ b/CMPlatform @@ -1 +1 @@ -Subproject commit e2f056ddff2e1adacd6431c685af9c0ed8177e06 +Subproject commit 7a5040224a162cd63f54e28d31eaf7eb710b48a0 diff --git a/CMUtil b/CMUtil index 9982ca25..8ce98c85 160000 --- a/CMUtil +++ b/CMUtil @@ -1 +1 @@ -Subproject commit 9982ca25af1a52981054af8636dfc5f3e2ea59c9 +Subproject commit 8ce98c85a397921277cd19a91993b6724bf1d391 diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index be05c3ff..84832b21 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -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 相关 diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index f69e5c81..d375adbb 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -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 &); diff --git a/inc/hgl/graph/shader/ShaderResource.h b/inc/hgl/graph/shader/ShaderResource.h index 4ca6e9f5..604d6afc 100644 --- a/inc/hgl/graph/shader/ShaderResource.h +++ b/inc/hgl/graph/shader/ShaderResource.h @@ -30,6 +30,7 @@ struct ShaderDescriptor DescriptorSetType set_type; uint32_t set; uint32_t binding; + uint32_t stage_flag; }; using ShaderDescriptorList=List; @@ -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_typeVK_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_typeVK_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_typeVK_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_typeVK_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 { diff --git a/res b/res index 9f031f98..a0c84d12 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 9f031f98a611172812ceb4094af0f032218c5e91 +Subproject commit a0c84d12663e1d0ce0ad22faa5cd89ede26af90f diff --git a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp index 7b595f22..f569f6f4 100644 --- a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp @@ -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 \ No newline at end of file diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index e95cb0aa..2845a6c7 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -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;iset=*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); diff --git a/src/SceneGraph/shader/ShaderResource.cpp b/src/SceneGraph/shader/ShaderResource.cpp index 783c3028..28ae2c39 100644 --- a/src/SceneGraph/shader/ShaderResource.cpp +++ b/src/SceneGraph/shader/ShaderResource.cpp @@ -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=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(filesizeGetStageInputs(),filedata); filedata=LoadShaderStages(sr->GetStageOutputs(),filedata); - while(filedataGetDescriptorList((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 origin_filedata(filedata,filesize); - - sr=LoadShaderResource(origin_filedata,filesize,true); - - shader_resource_by_filename.Add(filename,sr); return sr; } VK_NAMESPACE_END