From f55186a9c84ad2228bfc86965d53c39b3515f5ce Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 29 Nov 2021 20:12:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E9=A1=B6=E7=82=B9=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=B5=81=E6=9C=80=E7=BB=88=E6=A0=BC=E5=BC=8F=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=94=BE=E5=9C=A8MaterialInstance=E4=B8=AD=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=E7=9B=B8=E5=85=B3=E7=B1=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMCore | 2 +- CMSceneGraph | 2 +- inc/hgl/graph/RenderableCreater.h | 23 ++--- inc/hgl/graph/VK.h | 12 +++ inc/hgl/graph/VKDevice.h | 2 +- inc/hgl/graph/VKMaterial.h | 6 +- inc/hgl/graph/VKMaterialInstance.h | 5 +- inc/hgl/graph/VKPipeline.h | 2 + inc/hgl/graph/VKRenderPass.h | 7 +- inc/hgl/graph/VKRenderable.h | 12 +-- inc/hgl/graph/VKShaderModule.h | 23 +++-- inc/hgl/graph/VKShaderResource.h | 1 - inc/hgl/graph/VertexAttribData.h | 9 +- src/SceneGraph/RenderableCreater.cpp | 57 ++++++------ src/SceneGraph/VertexAttribData.cpp | 11 +-- src/SceneGraph/Vulkan/VKDeviceMaterial.cpp | 1 - src/SceneGraph/Vulkan/VKMaterial.cpp | 6 -- src/SceneGraph/Vulkan/VKMaterialInstance.cpp | 21 ++++- src/SceneGraph/Vulkan/VKRenderPass.cpp | 45 ++++------ src/SceneGraph/Vulkan/VKRenderable.cpp | 10 +-- .../Vulkan/VKRenderableInstance.cpp | 48 +++++----- src/SceneGraph/Vulkan/VKShaderModule.cpp | 90 ++++++++++++------- src/SceneGraph/Vulkan/VKShaderResource.cpp | 2 +- 23 files changed, 202 insertions(+), 195 deletions(-) diff --git a/CMCore b/CMCore index 021df224..463eb1dd 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 021df224d02430159428c51c01883ce23ab4f03e +Subproject commit 463eb1dd7eb84ba9e3ed2e4cb1180a7c10186a7d diff --git a/CMSceneGraph b/CMSceneGraph index 4a244cf3..41b0c430 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 4a244cf3f7aed607e6332ccd32bed3f465a667e9 +Subproject commit 41b0c430ed3cc09384a59f3d29e6d6405b8a045d diff --git a/inc/hgl/graph/RenderableCreater.h b/inc/hgl/graph/RenderableCreater.h index 5e9be924..8a7c5a3b 100644 --- a/inc/hgl/graph/RenderableCreater.h +++ b/inc/hgl/graph/RenderableCreater.h @@ -23,7 +23,7 @@ namespace hgl } };//struct ShaderStageBind - using VADMaps=MapObject; + using ShaderStageBindMap=MapObject; /** * 可渲染对象创建器 @@ -35,22 +35,18 @@ namespace hgl RenderResource *db; Material *mtl; - const VertexShaderModule *vsm; + const VAB *vab; protected: - uint32 vertices_number; + uint32 vertices_number; - IndexBuffer * ibo; - VADMaps vab_maps; - - protected: - - virtual VAD *CreateVAD(const AnsiString &name,const ShaderStage *ss); ///<创建一个顶点属性缓冲区 + IndexBuffer * ibo; + ShaderStageBindMap ssb_map; public: - RenderableCreater(RenderResource *sdb,Material *m); + RenderableCreater(RenderResource *sdb,const VAB *); virtual ~RenderableCreater()=default; virtual bool Init(const uint32 count); ///<初始化,参数为顶点数量 @@ -60,12 +56,9 @@ namespace hgl template T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器 { - const ShaderStage *ss=vsm->GetStageInput(name); + const VkFormat format=vab->GetFormat(name); - if(!ss) - return(nullptr); - - if(ss->format!=T::GetVulkanFormat()) + if(format!=T::GetVulkanFormat()) return(nullptr); VAD *vad=this->CreateVAD(name); diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 01b39212..dd4df8d1 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -115,6 +115,18 @@ struct PipelineData; enum class InlinePipeline; class Pipeline; +struct VAConfig +{ + VkFormat format; + bool instance; + +public: + + CompOperatorMemcmp(const VAConfig &); +}; + +using VABConfigInfo=Map; + class VertexAttributeBinding; using VAB=VertexAttributeBinding; diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 6844af09..d554e2df 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -207,7 +207,7 @@ public: //shader & material 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 *); - MaterialInstance *CreateMI(Material *); + MaterialInstance *CreateMI(Material *,const VABConfigInfo *vab_cfg=nullptr); public: //Command Buffer 相关 diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index d84f76dd..4d04e78e 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -5,7 +5,6 @@ #include #include #include -#include VK_NAMESPACE_BEGIN using ShaderStageCreateInfoList=List; @@ -17,7 +16,6 @@ struct MaterialData MaterialDescriptorSets *mds; VertexShaderModule *vertex_sm; - VertexAttributeBinding *vab; ShaderStageCreateInfoList shader_stage_list; @@ -56,15 +54,13 @@ public: const UTF8String & GetName ()const{return data->name;} - const VertexShaderModule * GetVertexShaderModule ()const{return data->vertex_sm;} + VertexShaderModule * GetVertexShaderModule () {return data->vertex_sm;} const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;} const MaterialDescriptorSets * GetDescriptorSets ()const{return data->mds;} const VkPipelineLayout GetPipelineLayout ()const; const PipelineLayoutData * GetPipelineLayoutData ()const{return data->pipeline_layout_data;} - - const VertexAttributeBinding * GetVAB ()const{return data->vab;} public: diff --git a/inc/hgl/graph/VKMaterialInstance.h b/inc/hgl/graph/VKMaterialInstance.h index a22d6603..e5a9b115 100644 --- a/inc/hgl/graph/VKMaterialInstance.h +++ b/inc/hgl/graph/VKMaterialInstance.h @@ -8,13 +8,15 @@ class MaterialInstance { Material *material; + VAB *vab; + MaterialParameters *mp_value; private: friend class GPUDevice; - MaterialInstance(Material *,MaterialParameters *); + MaterialInstance(Material *,VAB *,MaterialParameters *); public: @@ -22,6 +24,7 @@ public: Material *GetMaterial(){return material;} + const VAB *GetVAB()const{return vab;} MaterialParameters *GetMP(){return mp_value;} MaterialParameters *GetMP(const DescriptorSetsType &type); };//class MaterialInstance diff --git a/inc/hgl/graph/VKPipeline.h b/inc/hgl/graph/VKPipeline.h index e852b6c7..2a9a806b 100644 --- a/inc/hgl/graph/VKPipeline.h +++ b/inc/hgl/graph/VKPipeline.h @@ -35,6 +35,8 @@ public: operator VkPipeline(){return pipeline;} + const VAB *GetVAB()const{return data->GetVAB();} + const bool IsAlphaTest()const{return data->alpha_test>0;} const bool IsAlphaBlend()const{return data->alpha_blend;} };//class GraphicsPipeline diff --git a/inc/hgl/graph/VKRenderPass.h b/inc/hgl/graph/VKRenderPass.h index cef82ac8..ce4f09da 100644 --- a/inc/hgl/graph/VKRenderPass.h +++ b/inc/hgl/graph/VKRenderPass.h @@ -52,16 +52,13 @@ public: public: - Pipeline *CreatePipeline(const Material *, PipelineData *); - Pipeline *CreatePipeline(const Material *,const InlinePipeline &); + Pipeline *CreatePipeline(MaterialInstance *, PipelineData *); + Pipeline *CreatePipeline(MaterialInstance *,const InlinePipeline &); public: - Pipeline *CreatePipeline(Material *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false); Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false); - Pipeline *CreatePipeline(Material *, PipelineData *, const Prim &prim,const bool prim_restart=false); Pipeline *CreatePipeline(MaterialInstance *, PipelineData *, const Prim &prim,const bool prim_restart=false); - Pipeline *CreatePipeline(Material *, const OSString &, const Prim &prim,const bool prim_restart=false); Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const Prim &prim,const bool prim_restart=false); };//class RenderPass VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKRenderable.h b/inc/hgl/graph/VKRenderable.h index 94d3f032..79740354 100644 --- a/inc/hgl/graph/VKRenderable.h +++ b/inc/hgl/graph/VKRenderable.h @@ -14,17 +14,17 @@ VK_NAMESPACE_BEGIN */ class Renderable { - struct VABData + struct VBOData { VBO *buf; VkDeviceSize offset; public: - CompOperatorMemcmp(const VABData &); + CompOperatorMemcmp(const VBOData &); }; - Map buffer_list; + Map buffer_list; protected: @@ -56,7 +56,7 @@ public: void SetBoundingBox(const AABB &aabb){BoundingBox=aabb;} const AABB &GetBoundingBox()const {return BoundingBox;} - bool Set(const UTF8String &name,VBO *vb,VkDeviceSize offset=0); + bool Set(const AnsiString &name,VBO *vb,VkDeviceSize offset=0); bool Set(IndexBuffer *ib,VkDeviceSize offset=0) { @@ -78,8 +78,8 @@ public: return draw_count; } - VBO * GetVBO (const UTF8String &,VkDeviceSize *); - VkBuffer GetBuffer (const UTF8String &,VkDeviceSize *); + VBO * GetVBO (const AnsiString &,VkDeviceSize *); + VkBuffer GetBuffer (const AnsiString &,VkDeviceSize *); const int GetBufferCount ()const {return buffer_list.GetCount();} IndexBuffer * GetIndexBuffer () {return indices_buffer;} diff --git a/inc/hgl/graph/VKShaderModule.h b/inc/hgl/graph/VKShaderModule.h index 9b8a688b..b74e29d4 100644 --- a/inc/hgl/graph/VKShaderModule.h +++ b/inc/hgl/graph/VKShaderModule.h @@ -47,8 +47,6 @@ public: const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;} };//class ShaderModule -class VertexAttributeBinding; - /** * 顶点Shader模块
* 由于顶点shader在最前方执行,所以它比其它shader多了VertexInput的数据 @@ -56,12 +54,13 @@ class VertexAttributeBinding; class VertexShaderModule:public ShaderModule { uint32_t attr_count; - VkVertexInputBindingDescription *binding_list; - VkVertexInputAttributeDescription *attribute_list; + VertexAttribType *type_list; + const AnsiString **name_list; + ShaderStage **ssi_list; private: - - Sets vab_sets; + + Sets vab_sets; public: @@ -76,17 +75,17 @@ public: const uint GetStageInputCount () const{return shader_resource->GetStageInputCount();} const ShaderStageList & GetStageInputs () const{return shader_resource->GetStageInputs();} - const uint32_t GetAttrCount()const{return attr_count;} + //const uint32_t GetAttrCount()const{return attr_count;} - const VkVertexInputBindingDescription * GetDescList ()const{return binding_list;} - const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;} + //const VkVertexInputBindingDescription * GetDescList ()const{return binding_list;} + //const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;} - const VkVertexInputBindingDescription * GetDesc (const uint32_t index)const{return (index>=attr_count?nullptr:binding_list+index);} - const VkVertexInputAttributeDescription * GetAttr (const uint32_t index)const{return (index>=attr_count?nullptr:attribute_list+index);} + //const VkVertexInputBindingDescription * GetDesc (const uint32_t index)const{return (index>=attr_count?nullptr:binding_list+index);} + //const VkVertexInputAttributeDescription * GetAttr (const uint32_t index)const{return (index>=attr_count?nullptr:attribute_list+index);} public: - VAB * CreateVAB(); + VAB * CreateVAB(const VABConfigInfo *format_map=nullptr); bool Release(VAB *); const uint32_t GetInstanceCount()const{return vab_sets.GetCount();} };//class VertexShaderModule:public ShaderModule diff --git a/inc/hgl/graph/VKShaderResource.h b/inc/hgl/graph/VKShaderResource.h index 7932b6e1..a4f807b0 100644 --- a/inc/hgl/graph/VKShaderResource.h +++ b/inc/hgl/graph/VKShaderResource.h @@ -14,7 +14,6 @@ struct ShaderStage uint location; VertexAttribType type; ///<成份数量(如vec4中的4) - VkFormat format; ///<对应的Vulkan格式(如vec4对应的FMT_RGBA32F) uint binding; diff --git a/inc/hgl/graph/VertexAttribData.h b/inc/hgl/graph/VertexAttribData.h index 81995e49..64aee685 100644 --- a/inc/hgl/graph/VertexAttribData.h +++ b/inc/hgl/graph/VertexAttribData.h @@ -69,11 +69,12 @@ namespace hgl /** * 根据格式要求,创建对应的顶点属性数据区(VAD) - * @param base_type 基础格式 - * @param vecsize vec数量 - * @param vertex_count 顶点数量 + * @param vertex_count 顶点数量 + * @param fmt Vulkan格式 + * @param vec_size vec数量 + * @param stride 单个数据字节数 */ - VAD *CreateVertexAttribData(const VertexAttribType *,const uint32_t vertex_count); + VAD *CreateVertexAttribData(const uint32_t vertex_count,const VkFormat fmt,const int vec_size,const uint stride); //这个函数比较重要,就不搞成CreateVAD的简写了 }//namespace graph }//namespace hgl diff --git a/src/SceneGraph/RenderableCreater.cpp b/src/SceneGraph/RenderableCreater.cpp index a691e1a1..7cb33004 100644 --- a/src/SceneGraph/RenderableCreater.cpp +++ b/src/SceneGraph/RenderableCreater.cpp @@ -5,11 +5,10 @@ namespace hgl { namespace graph { - RenderableCreater::RenderableCreater(RenderResource *sdb,Material *m) + RenderableCreater::RenderableCreater(RenderResource *sdb,const VAB *v) { db =sdb; - mtl =m; - vsm =mtl->GetVertexShaderModule(); + vab =v; vertices_number =0; ibo =nullptr; @@ -24,70 +23,64 @@ namespace hgl return(true); } - VAD *RenderableCreater::CreateVAD(const AnsiString &name,const ShaderStage *ss) + VAD *RenderableCreater::CreateVAD(const AnsiString &name) { - if(!ss)return(nullptr); + if(!vab)return(nullptr); + if(name.IsEmpty())return(nullptr); + + const auto *va=vab->GetVertexAttribute(name); + + if(!va) + return(nullptr); ShaderStageBind *ssb; - if(vab_maps.Get(name,ssb)) + if(ssb_map.Get(name,ssb)) return ssb->data; ssb=new ShaderStageBind; - ssb->data =hgl::graph::CreateVertexAttribData(&(ss->type),vertices_number); + ssb->data =hgl::graph::CreateVertexAttribData(vertices_number,va->format,va->vec_size,va->stride); ssb->name =name; - ssb->binding=ss->binding; + ssb->binding=va->binding; ssb->vbo =nullptr; - vab_maps.Add(name,ssb); + ssb_map.Add(name,ssb); return ssb->data; - } - VAD *RenderableCreater::CreateVAD(const AnsiString &name) - { - if(!vsm)return(nullptr); - if(name.IsEmpty())return(nullptr); - - const ShaderStage *ss=vsm->GetStageInput(name); - - if(!ss) - return(nullptr); - - return this->CreateVAD(name,ss); } bool RenderableCreater::WriteVAD(const AnsiString &name,const void *data,const uint32_t bytes) { - if(!vsm)return(false); + if(!vab)return(false); if(name.IsEmpty())return(false); if(!data)return(false); if(!bytes)return(false); ShaderStageBind *ssb; - if(vab_maps.Get(name,ssb)) + if(ssb_map.Get(name,ssb)) return false; - const ShaderStage *ss=vsm->GetStageInput(name); + const auto *va=vab->GetVertexAttribute(name); - if(!ss) + if(!va) return(false); - if(ss->type.GetStride()*vertices_number!=bytes) + if(va->stride*vertices_number!=bytes) return(false); ssb=new ShaderStageBind; ssb->data =nullptr; ssb->name =name; - ssb->binding=ss->binding; + ssb->binding=va->binding; - ssb->vbo =db->CreateVBO(ss->format,vertices_number,data); + ssb->vbo =db->CreateVBO(va->format,vertices_number,data); - vab_maps.Add(name,ssb); + ssb_map.Add(name,ssb); return true; } @@ -110,14 +103,14 @@ namespace hgl Renderable *RenderableCreater::Finish() { - const uint si_count=vsm->GetStageInputCount(); + const uint si_count=vab->GetVertexAttrCount(); - if(vab_maps.GetCount()!=si_count) + if(ssb_map.GetCount()!=si_count) return(nullptr); Renderable *render_obj=db->CreateRenderable(vertices_number); - const auto *sp=vab_maps.GetDataList(); + const auto *sp=ssb_map.GetDataList(); for(uint i=0;iright->vbo) diff --git a/src/SceneGraph/VertexAttribData.cpp b/src/SceneGraph/VertexAttribData.cpp index 3d887e56..1cc2c4b2 100644 --- a/src/SceneGraph/VertexAttribData.cpp +++ b/src/SceneGraph/VertexAttribData.cpp @@ -4,14 +4,15 @@ namespace hgl { namespace graph { - VAD *CreateVertexAttribData(const VertexAttribType *type,const uint32_t vertex_count) + VAD *CreateVertexAttribData(const uint32_t vertex_count,const VkFormat fmt,const int vec_size,const uint stride) { - if(!type||!type->Check()) + if(!vertex_count<=0 + ||vec_size<1||vec_size>4 + ||stride<1||stride>8*4 + ||CheckVulkanFormat(fmt)) return(nullptr); - VkFormat fmt=GetVulkanFormat(type); - - return(new VertexAttribData(vertex_count,type->vec_size,type->GetStride(),fmt)); + return(new VertexAttribData(vertex_count,vec_size,stride,fmt)); } }//namespace graph }//namespace hgl diff --git a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp index dc9bf730..d8d182b2 100644 --- a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp @@ -104,7 +104,6 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap * data->shader_maps =shader_maps; data->mds =mds; data->vertex_sm =(VertexShaderModule *)vsm; - data->vab =data->vertex_sm->CreateVAB(); CreateShaderStageList(data->shader_stage_list,shader_maps); diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index db6ba3d3..033cb0a5 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -9,12 +9,6 @@ MaterialData::~MaterialData() SAFE_CLEAR(mp.r); SAFE_CLEAR(mp.g); - if(vab) - { - vertex_sm->Release(vab); - delete vab; - } - delete shader_maps; SAFE_CLEAR(mds); } diff --git a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp index 74c62687..7bf1c8d5 100644 --- a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp +++ b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp @@ -2,21 +2,36 @@ #include #include #include +#include VK_NAMESPACE_BEGIN -MaterialInstance *GPUDevice::CreateMI(Material *mtl) +MaterialInstance *GPUDevice::CreateMI(Material *mtl,const VABConfigInfo *vab_cfg) { if(!mtl)return(nullptr); + VertexShaderModule *vsm=mtl->GetVertexShaderModule(); + + VAB *vab=vsm->CreateVAB(vab_cfg); + + if(!vab)return(nullptr); + MaterialParameters *mp=CreateMP(mtl,DescriptorSetsType::Value); - return(new MaterialInstance(mtl,mp)); + if(!mp) + { + delete vab; + return nullptr; + } + + return(new MaterialInstance(mtl,vab,mp)); } -MaterialInstance::MaterialInstance(Material *mtl,MaterialParameters *p) +MaterialInstance::MaterialInstance(Material *mtl,VAB *v,MaterialParameters *p) { material=mtl; + vab=v; + mp_value=p; } diff --git a/src/SceneGraph/Vulkan/VKRenderPass.cpp b/src/SceneGraph/Vulkan/VKRenderPass.cpp index 726f5829..7c27f0fe 100644 --- a/src/SceneGraph/Vulkan/VKRenderPass.cpp +++ b/src/SceneGraph/Vulkan/VKRenderPass.cpp @@ -23,16 +23,18 @@ RenderPass::~RenderPass() vkDestroyRenderPass(device,render_pass,nullptr); } -Pipeline *RenderPass::CreatePipeline(const Material *material,PipelineData *data) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,PipelineData *data) { VkPipeline graphicsPipeline; - data->InitShaderStage(material->GetStageList()); - data->InitVertexInputState(material->GetVAB()); + Material *mtl=mi->GetMaterial(); + + data->InitShaderStage(mtl->GetStageList()); + data->InitVertexInputState(mi->GetVAB()); data->SetColorAttachments(color_formats.GetCount()); - data->pipeline_info.layout = material->GetPipelineLayout(); + data->pipeline_info.layout = mtl->GetPipelineLayout(); { data->pipeline_info.renderPass = render_pass; @@ -49,24 +51,24 @@ Pipeline *RenderPass::CreatePipeline(const Material *material,PipelineData *data return(new Pipeline(device,graphicsPipeline,data)); } -Pipeline *RenderPass::CreatePipeline(const Material *mtl,const InlinePipeline &ip) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip) { PipelineData *pd=GetPipelineData(ip); if(!pd)return(nullptr); - return CreatePipeline(mtl,pd); + return CreatePipeline(mi,pd); } -Pipeline *RenderPass::CreatePipeline(Material *mtl,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) { - if(!mtl)return(nullptr); + if(!mi)return(nullptr); PipelineData *pd=GetPipelineData(ip); pd->Set(prim,prim_restart); - Pipeline *p=CreatePipeline(mtl,pd); + Pipeline *p=CreatePipeline(mi,pd); if(p) pipeline_list.Add(p); @@ -74,18 +76,11 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,const InlinePipeline &ip,cons return p; } -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) -{ - if(!mi)return(nullptr); - - return CreatePipeline(mi->GetMaterial(),ip,prim,prim_restart); -} - -Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const Prim &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart) { pd->Set(prim,prim_restart); - Pipeline *p=CreatePipeline(mtl,pd); + Pipeline *p=CreatePipeline(mi,pd); if(p) pipeline_list.Add(p); @@ -93,22 +88,12 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const Prim & return(p); } -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart) -{ - return CreatePipeline(mi->GetMaterial(),pd,prim,prim_restart); -} - -Pipeline *RenderPass::CreatePipeline(Material *mtl,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) +Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) { PipelineData *pd=GetPipelineData(pipeline_filename); if(!pd)return(nullptr); - return CreatePipeline(mtl,pd,prim,prim_restart); -} - -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const OSString &filename,const Prim &prim,const bool prim_restart) -{ - return CreatePipeline(mi->GetMaterial(),filename,prim,prim_restart); + return CreatePipeline(mi,pd,prim,prim_restart); } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index a776b61c..3f7bb9b6 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -22,12 +22,12 @@ VK_NAMESPACE_BEGIN // return(true); //} -bool Renderable::Set(const UTF8String &name,VBO *vbo,VkDeviceSize offset) +bool Renderable::Set(const AnsiString &name,VBO *vbo,VkDeviceSize offset) { if(!vbo)return(false); if(buffer_list.KeyExist(name))return(false); - VABData bd; + VBOData bd; bd.buf=vbo; bd.offset=offset; @@ -36,12 +36,12 @@ bool Renderable::Set(const UTF8String &name,VBO *vbo,VkDeviceSize offset) return(true); } -VBO *Renderable::GetVBO(const UTF8String &name,VkDeviceSize *offset) +VBO *Renderable::GetVBO(const AnsiString &name,VkDeviceSize *offset) { if(!offset)return(nullptr); if(name.IsEmpty())return(nullptr); - VABData bd; + VBOData bd; if(buffer_list.Get(name,bd)) { @@ -52,7 +52,7 @@ VBO *Renderable::GetVBO(const UTF8String &name,VkDeviceSize *offset) return(nullptr); } -VkBuffer Renderable::GetBuffer(const UTF8String &name,VkDeviceSize *offset) +VkBuffer Renderable::GetBuffer(const AnsiString &name,VkDeviceSize *offset) { VBO *vbo=GetVBO(name,offset); diff --git a/src/SceneGraph/Vulkan/VKRenderableInstance.cpp b/src/SceneGraph/Vulkan/VKRenderableInstance.cpp index b4d6aeb0..8c22c7be 100644 --- a/src/SceneGraph/Vulkan/VKRenderableInstance.cpp +++ b/src/SceneGraph/Vulkan/VKRenderableInstance.cpp @@ -34,19 +34,15 @@ RenderableInstance::~RenderableInstance() RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p) { - if(!r||!mi||!p)return(nullptr); + if(!r||!p)return(nullptr); - const Material *mtl=mi->GetMaterial(); - - if(!mtl)return(nullptr); - - const VertexShaderModule *vsm=mtl->GetVertexShaderModule(); - const ShaderStageList &ssl=vsm->GetStageInputs(); - const int input_count=ssl.GetCount(); + const VAB *vab=p->GetVAB(); + const int input_count=vab->GetVertexAttrCount(); + const UTF8String &mtl_name=mi->GetMaterial()->GetName(); if(r->GetBufferCount()GetName()); + LOG_ERROR("[FATAL ERROR] input buffer count of Renderable lesser than Material, Material name: "+mtl_name); return(nullptr); } @@ -54,40 +50,36 @@ RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi, AutoDeleteArray buffer_list(input_count); AutoDeleteArray buffer_size(input_count); - ShaderStage **ss=ssl.GetData(); - VBO *vbo; - const VkVertexInputBindingDescription *desc; - const VkVertexInputAttributeDescription *attr; + const AnsiString ** name_list=vab->GetVertexNameList(); + const VkVertexInputBindingDescription * bind_list=vab->GetVertexBindingList(); + const VkVertexInputAttributeDescription * attr_list=vab->GetVertexAttributeList(); for(int i=0;iGetDesc(i); - attr=vsm->GetAttr(i); - - vbo=r->GetVBO((*ss)->name,buffer_size+i); + vbo=r->GetVBO(**name_list,buffer_size+i); if(!vbo) { - LOG_ERROR("[FATAL ERROR] can't find VBO \""+(*ss)->name+"\" in Material: "+mtl->GetName()); + LOG_ERROR("[FATAL ERROR] can't find VBO \""+**name_list+"\" in Material: "+mtl_name); return(nullptr); } - if(vbo->GetFormat()!=attr->format) + if(vbo->GetFormat()!=attr_list->format) { - LOG_ERROR( "[FATAL ERROR] VBO \""+(*ss)->name+ - UTF8String("\" format can't match Renderable, Material(")+mtl->GetName()+ - UTF8String(") Format(")+GetVulkanFormatName(attr->format)+ + LOG_ERROR( "[FATAL ERROR] VBO \""+**name_list+ + UTF8String("\" format can't match Renderable, Material(")+mtl_name+ + UTF8String(") Format(")+GetVulkanFormatName(attr_list->format)+ UTF8String("), VBO Format(")+GetVulkanFormatName(vbo->GetFormat())+ ")"); return(nullptr); } - if(vbo->GetStride()!=desc->stride) + if(vbo->GetStride()!=bind_list->stride) { - LOG_ERROR( "[FATAL ERROR] VBO \""+(*ss)->name+ - UTF8String("\" stride can't match Renderable, Material(")+mtl->GetName()+ - UTF8String(") stride(")+UTF8String::valueOf(desc->stride)+ + LOG_ERROR( "[FATAL ERROR] VBO \""+**name_list+ + UTF8String("\" stride can't match Renderable, Material(")+mtl_name+ + UTF8String(") stride(")+UTF8String::valueOf(bind_list->stride)+ UTF8String("), VBO stride(")+UTF8String::valueOf(vbo->GetStride())+ ")"); return(nullptr); @@ -95,7 +87,9 @@ RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi, buffer_list[i]=vbo->GetBuffer(); - ++ss; + ++name_list; + ++bind_list; + ++attr_list; } RenderableInstance *ri=new RenderableInstance(r,mi,p,input_count,buffer_list,buffer_size); diff --git a/src/SceneGraph/Vulkan/VKShaderModule.cpp b/src/SceneGraph/Vulkan/VKShaderModule.cpp index 49d189c8..eb9f923c 100644 --- a/src/SceneGraph/Vulkan/VKShaderModule.cpp +++ b/src/SceneGraph/Vulkan/VKShaderModule.cpp @@ -38,42 +38,23 @@ ShaderModule::~ShaderModule() { vkDestroyShaderModule(device,stage_create_info->module,nullptr); //这里不用删除stage_create_info,材质中会删除的 + + SAFE_CLEAR(shader_resource); } VertexShaderModule::VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr):ShaderModule(dev,pssci,sr) { - const ShaderStageList &stage_inputs=sr->GetStageInputs(); - - attr_count=stage_inputs.GetCount(); - binding_list=new VkVertexInputBindingDescription[attr_count]; - attribute_list=new VkVertexInputAttributeDescription[attr_count]; - - VkVertexInputBindingDescription *bind=binding_list; - VkVertexInputAttributeDescription *attr=attribute_list; - - ShaderStage **si=stage_inputs.GetData(); + const ShaderStageList &stage_input_list=sr->GetStageInputs(); + attr_count=stage_input_list.GetCount(); + ssi_list=stage_input_list.GetData(); + name_list=new const AnsiString *[attr_count]; + type_list=new VertexAttribType[attr_count]; + for(uint i=0;ibinding =i; //binding对应在vkCmdBindVertexBuffer中设置的缓冲区的序列号,所以这个数字必须从0开始,而且紧密排列。 - //在VertexInput类中,buf_list需要严格按照本此binding为序列号排列 - bind->stride =GetStrideByFormat((*si)->format); - bind->inputRate =VK_VERTEX_INPUT_RATE_VERTEX; - - //binding对应的是第几个数据输入流 - //实际使用一个binding可以绑定多个attrib - //比如在一个流中传递{pos,color}这样两个数据,就需要两个attrib - //但在我们的设计中,仅支持一个流传递一个attrib - - attr->binding =i; - attr->location =(*si)->location; //此值对应shader中的layout(location= - attr->format =(*si)->format; - attr->offset =0; - - ++attr; - ++bind; - - ++si; + name_list[i]=&(ssi_list[i]->name); + type_list[i]= ssi_list[i]->type; } } @@ -84,13 +65,56 @@ VertexShaderModule::~VertexShaderModule() //还有在用的,这是个错误 } - SAFE_CLEAR_ARRAY(binding_list); - SAFE_CLEAR_ARRAY(attribute_list); + delete[] type_list; + delete[] name_list; } -VAB *VertexShaderModule::CreateVAB() +VAB *VertexShaderModule::CreateVAB(const VABConfigInfo *cfg) { - VAB *vab=new VAB(attr_count,binding_list,attribute_list); + VkVertexInputBindingDescription *binding_list=new VkVertexInputBindingDescription[attr_count]; + VkVertexInputAttributeDescription *attribute_list=new VkVertexInputAttributeDescription[attr_count]; + + VkVertexInputBindingDescription *bind=binding_list; + VkVertexInputAttributeDescription *attr=attribute_list; + + ShaderStage **si=ssi_list; + VAConfig vac; + + for(uint i=0;ibinding =i; + attr->location =(*si)->location; //此值对应shader中的layout(location= + + attr->offset =0; + + bind->binding =i; //binding对应在vkCmdBindVertexBuffer中设置的缓冲区的序列号,所以这个数字必须从0开始,而且紧密排列。 + //在RenderableInstance类中,buffer_list必需严格按照本此binding为序列号排列 + + if(!cfg||!cfg->Get((*si)->name,vac)) + { + attr->format =VK_NAMESPACE::GetVulkanFormat(&((*si)->type)); + bind->inputRate =VK_VERTEX_INPUT_RATE_VERTEX; + } + else + { + attr->format =vac.format; + bind->inputRate =vac.instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX; + } + + bind->stride =GetStrideByFormat(attr->format); + + ++attr; + ++bind; + + ++si; + } + + VAB *vab=new VAB(attr_count,name_list,type_list,binding_list,attribute_list); vab_sets.Add(vab); diff --git a/src/SceneGraph/Vulkan/VKShaderResource.cpp b/src/SceneGraph/Vulkan/VKShaderResource.cpp index 94e5631a..5753e3f6 100644 --- a/src/SceneGraph/Vulkan/VKShaderResource.cpp +++ b/src/SceneGraph/Vulkan/VKShaderResource.cpp @@ -42,7 +42,7 @@ VK_NAMESPACE_BEGIN 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);