From 0abe38de98c2a0a21f2ca4bb608a9ed7fbc95a0b Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Thu, 23 Feb 2023 19:01:01 +0800 Subject: [PATCH] LoadMaterial use ConstBufferReader --- CMCore | 2 +- inc/hgl/graph/VKMaterialDescriptorSets.h | 6 +-- inc/hgl/graph/VKRenderResource.h | 4 +- inc/hgl/graph/VKShaderResource.h | 5 +- .../Vulkan/VKRenderResourceMaterial.cpp | 52 ++++++++----------- src/SceneGraph/Vulkan/VKShaderResource.cpp | 44 +++++++--------- 6 files changed, 50 insertions(+), 63 deletions(-) diff --git a/CMCore b/CMCore index ac5931ce..ba717609 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit ac5931ce2602d45149e1c8baacf0805fa39f73f6 +Subproject commit ba7176099f0fed43becb0e5bb62bc061eec2b8a5 diff --git a/inc/hgl/graph/VKMaterialDescriptorSets.h b/inc/hgl/graph/VKMaterialDescriptorSets.h index c08365c6..24c9e35f 100644 --- a/inc/hgl/graph/VKMaterialDescriptorSets.h +++ b/inc/hgl/graph/VKMaterialDescriptorSets.h @@ -11,9 +11,9 @@ struct ShaderDescriptor VkDescriptorType desc_type; DescriptorSetType set_type; - uint32_t set; - uint32_t binding; - uint32_t stage_flag; + uint8 set; + uint8 binding; + uint32 stage_flag; }; using ShaderDescriptorList=List; diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 539fe6c9..888649c1 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -39,9 +39,9 @@ class RenderResource IDResManage rm_material; ///<材质合集 IDResManage rm_material_instance; ///<材质实例合集 - IDResManage rm_desc_sets; ///<描述符合集 + IDResManage rm_desc_sets; ///<描述符合集 IDResManage rm_primitives; ///<图元合集 - IDResManage rm_buffers; ///<顶点缓冲区合集 + IDResManage rm_buffers; ///<顶点缓冲区合集 IDResManage rm_samplers; ///<采样器合集 IDResManage rm_textures; ///<纹理合集 IDResManage rm_renderables; ///<渲染实例集合集 diff --git a/inc/hgl/graph/VKShaderResource.h b/inc/hgl/graph/VKShaderResource.h index 446bca0c..029aa56a 100644 --- a/inc/hgl/graph/VKShaderResource.h +++ b/inc/hgl/graph/VKShaderResource.h @@ -5,13 +5,14 @@ #include #include #include +#include VK_NAMESPACE_BEGIN struct ShaderStage { AnsiString name; - uint location; + uint8 location; VertexAttribType type; ///<成份数量(如vec4中的4) @@ -51,7 +52,7 @@ public: const int GetStageInputBinding(const AnsiString &)const; };//class ShaderResource -ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize); +ShaderResource *LoadShaderResource(io::ConstBufferReader &); struct ShaderModuleCreateInfo:public vkstruct_flag { diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index ea1e2609..6bfbaafd 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -6,6 +6,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN @@ -40,23 +41,17 @@ const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename, return sm; } -void LoadShaderDescriptor(const uint8 *data,ShaderDescriptor *sd_list,const uint count,const uint8 ver) +void LoadShaderDescriptor(io::ConstBufferReader &cbr,ShaderDescriptor *sd_list,const uint count,const uint8 ver) { ShaderDescriptor *sd=sd_list; - uint str_len; for(uint i=0;idesc_type=VkDescriptorType(*data++); - - { - str_len=*data++; - memcpy(sd->name,(char *)data,str_len); - data+=str_len; - } + cbr.CastRead(sd->desc_type); + cbr.ReadTinyString(sd->name); if(ver==3) - sd->set_type =(DescriptorSetType)*data++; + cbr.CastRead(sd->set_type); else if(ver==2) //以下是旧的,未来不用了,现仅保证能运行 { @@ -66,10 +61,9 @@ void LoadShaderDescriptor(const uint8 *data,ShaderDescriptor *sd_list,const uint sd->set_type=DescriptorSetType::PerFrame; } - sd->set =*data++; - sd->binding =*data++; - sd->stage_flag =*(uint32 *)data; - data+=sizeof(uint32); + cbr.Read(sd->set); + cbr.Read(sd->binding); + cbr.Read(sd->stage_flag); if(sd->set_type==DescriptorSetType::PerObject) { @@ -105,22 +99,23 @@ Material *RenderResource::CreateMaterial(const OSString &filename) if(filesize3) return(nullptr); - const uint32_t shader_bits=*(uint32_t *)sp; - sp+=sizeof(uint32_t); + uint32_t shader_bits; + + cbr.Read(shader_bits); const uint count=GetShaderCountByBits(shader_bits); uint32_t size; @@ -135,11 +130,10 @@ Material *RenderResource::CreateMaterial(const OSString &filename) for(uint i=0;i0) { ShaderDescriptor *sd_list=new ShaderDescriptor[count]; - LoadShaderDescriptor(sp,sd_list,count,ver); + LoadShaderDescriptor(cbr,sd_list,count,ver); mds=new MaterialDescriptorSets(mtl_name,sd_list,count); } diff --git a/src/SceneGraph/Vulkan/VKShaderResource.cpp b/src/SceneGraph/Vulkan/VKShaderResource.cpp index d2db232b..e4641a90 100644 --- a/src/SceneGraph/Vulkan/VKShaderResource.cpp +++ b/src/SceneGraph/Vulkan/VKShaderResource.cpp @@ -2,23 +2,22 @@ #include #include #include +#include VK_NAMESPACE_BEGIN - #define AccessByPointer(data,type) *(type *)data;data+=sizeof(type); - namespace { ObjectMap shader_resource_by_filename; - const uint8 *LoadShaderStages(ShaderStageList &ss_list,const uint8 *data) + const bool LoadShaderStages(ShaderStageList &ss_list,io::ConstBufferReader &cbr) { - const uint count=*data++; + uint count; + + cbr.CastRead(count); if(count<=0) - return(data); - - int str_len; + return(false); ShaderStage *ss; @@ -26,18 +25,16 @@ VK_NAMESPACE_BEGIN { ss=new ShaderStage; - ss->location =*data++; - ss->type.basetype =(VertexAttribBaseType)*data++; - ss->type.vec_size =*data++; + cbr.Read(ss->location); + cbr.CastRead(ss->type.basetype); + cbr.CastRead(ss->type.vec_size); - str_len=*data++; - ss->name.SetString((char *)data,str_len); - data+=str_len; + cbr.ReadTinyString(ss->name); ss_list.Add(ss); } - return data; + return true; } }//namespcae @@ -108,25 +105,20 @@ VK_NAMESPACE_BEGIN return -1; } - ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize) + ShaderResource *LoadShaderResource(io::ConstBufferReader &cbr) { - if(!origin_filedata)return(nullptr); - - const uint8 *filedata=origin_filedata; - const uint8 *file_end=filedata+filesize; - VkShaderStageFlagBits flag; uint32 spv_size; - flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32); - spv_size=AccessByPointer(filedata,uint32); + cbr.CastRead(flag); + cbr.Read(spv_size); - ShaderResource *sr=new ShaderResource(flag,filedata,spv_size); + ShaderResource *sr=new ShaderResource(flag,cbr.CurPointer(),spv_size); - filedata+=spv_size; + cbr.Skip(spv_size); - filedata=LoadShaderStages(sr->GetStageInputs(),filedata); - //filedata=LoadShaderStages(sr->GetStageOutputs(),filedata); + LoadShaderStages(sr->GetStageInputs(),cbr); +// LoadShaderStages(sr->GetStageOutputs(),cbr); return sr; }