diff --git a/CMCore b/CMCore index d70d3128..b7e0852b 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit d70d31288f601061a69f93b4970af6692e53a34b +Subproject commit b7e0852bd4b781abbb8a0815f5f456b0f810ce95 diff --git a/CMSceneGraph b/CMSceneGraph index a6a36803..3d69fc8b 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit a6a368031209ce23dc14e88acf45dd8298a19886 +Subproject commit 3d69fc8b48d844b9761ec7d9b1a357a5684a295e diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index c7256799..d2204572 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -216,16 +216,14 @@ public: { if(!ri)return(false); - const PrimitiveDataBuffer *prb=ri->GetRenderBuffer(); - cb->Begin(); cb->BindFramebuffer(rp,fb); cb->SetClearColor(0,clear_color); cb->BeginRenderPass(); cb->BindPipeline(ri->GetPipeline()); cb->BindDescriptorSets(ri->GetMaterial()); - cb->BindVAB(ri); - cb->Draw(prb,ri->GetRenderData()); + cb->BindRenderBuffer(ri->GetRenderBuffer()); + cb->Draw(ri->GetRenderBuffer(),ri->GetRenderData()); cb->EndRenderPass(); cb->End(); diff --git a/inc/hgl/graph/MaterialRenderList.h b/inc/hgl/graph/MaterialRenderList.h index 322b7c91..a8bab36c 100644 --- a/inc/hgl/graph/MaterialRenderList.h +++ b/inc/hgl/graph/MaterialRenderList.h @@ -24,11 +24,11 @@ private: struct RenderItem { uint32_t first; - uint32_t count; + uint32_t instance_count; Pipeline * pipeline; MaterialInstance * mi; - const PrimitiveDataBuffer * prb; + const PrimitiveDataBuffer * pdb; const PrimitiveRenderData * prd; public: @@ -43,10 +43,10 @@ private: protected: - VABList * vbo_list; + VABList * vab_list; Pipeline * last_pipeline; - const PrimitiveDataBuffer * last_render_buf; + const PrimitiveDataBuffer * last_data_buffer; const PrimitiveRenderData * last_render_data; bool BindVAB(const PrimitiveDataBuffer *,const uint); diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 8124aeca..f09cb521 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -22,9 +22,11 @@ protected: AnsiString prim_name; PrimitiveData * prim_data; - + uint32_t vertices_number; ///<顶点数量 + void_pointer *map_ptr_list; ///<映射指针列表 + uint32_t index_number; ///<索引数量 IndexType index_type; ///<索引类型 IndexBuffer * ibo; ///<索引缓冲区 @@ -127,10 +129,10 @@ template class VABMap public: - VABMap(PrimitiveCreater *pc,const AnsiString &name) + VABMap(PrimitiveCreater *c,const AnsiString &name) { pc=c; - vab_index=pc->GetVABIndex(name,T::GetVulkanFormat(),nullptr); + vab_index=pc->GetVABIndex(name,T::GetVulkanFormat()); void *map_ptr=(T *)(pc->MapVAB(vab_index)); @@ -148,7 +150,7 @@ public: ~VABMap() { - if(vab) + if(pc&&vab_index>=0) pc->UnmapVAB(vab_index); } diff --git a/inc/hgl/graph/VKCommandBuffer.h b/inc/hgl/graph/VKCommandBuffer.h index a8ac408c..e56537ae 100644 --- a/inc/hgl/graph/VKCommandBuffer.h +++ b/inc/hgl/graph/VKCommandBuffer.h @@ -174,9 +174,9 @@ public: return(true); } - void BindIBO(IBAccess *); + void BindIBO(IndexBuffer *,const VkDeviceSize byte_offset=0); - bool BindVAB(Renderable *); + bool BindRenderBuffer(const PrimitiveDataBuffer *); void SetViewport (uint32_t first,uint32_t count,const VkViewport *vp) {vkCmdSetViewport(cmd_buf,first,count,vp);} void SetScissor (uint32_t first,uint32_t count,const VkRect2D *sci) {vkCmdSetScissor(cmd_buf,first,count,sci);} @@ -213,8 +213,7 @@ public: //draw void DrawIndirect (VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand )){return DrawIndirect( buf,0,drawCount,stride);} void DrawIndexedIndirect(VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand )){return DrawIndexedIndirect( buf,0,drawCount,stride);} - void Draw (const PrimitiveDataBuffer *prb,const PrimitiveRenderData *prd); -// void DrawIndexed (const IBAccess *iba,const uint32_t instance_count); + void Draw (const PrimitiveDataBuffer *prb,const PrimitiveRenderData *prd,const uint32_t instance_count=1,const uint32_t first_instance=0); public: //dynamic state };//class RenderCmdBuffer:public GPUCmdBuffer diff --git a/inc/hgl/graph/VKPrimitive.h b/inc/hgl/graph/VKPrimitive.h index 78e614d2..2f72e730 100644 --- a/inc/hgl/graph/VKPrimitive.h +++ b/inc/hgl/graph/VKPrimitive.h @@ -33,10 +33,14 @@ public: const VkDeviceSize GetVertexCount ()const; const int GetVABCount ()const; + const int GetVABIndex (const AnsiString &name)const; + VAB * GetVAB (const int); + VAB * GetVAB (const AnsiString &name){return GetVAB(GetVABIndex(name));} + const int32_t GetVertexOffset ()const; ///<取得顶点偏移(注意是顶点不是字节) - VABAccess * GetVABAccess (const AnsiString &); - + const uint32_t GetIndexCount ()const; IndexBuffer * GetIBO (); + const uint32_t GetFirstIndex ()const; ///<取得第一个索引 const AABB & GetBoundingBox ()const{return BoundingBox;} };//class Primitive diff --git a/inc/hgl/graph/VKRenderable.h b/inc/hgl/graph/VKRenderable.h index 2da85927..66e7c078 100644 --- a/inc/hgl/graph/VKRenderable.h +++ b/inc/hgl/graph/VKRenderable.h @@ -31,10 +31,10 @@ struct PrimitiveDataBuffer public: - PrimitiveDataBuffer(const uint32_t,const uint32_t, IndexBuffer *); + PrimitiveDataBuffer(const uint32_t,IndexBuffer *); ~PrimitiveDataBuffer(); - const bool Comp(const PrimitiveDataBuffer *prb)const; + const bool Comp(const PrimitiveDataBuffer *pdb)const; };//struct PrimitiveDataBuffer /** @@ -43,19 +43,27 @@ public: */ struct PrimitiveRenderData { - uint vab_count; - uint32_t vertex_count; - uint32_t index_count; + //因为要VAB是流式访问,所以我们这个结构会被用做排序依据 + //也因此,把vertex_offset放在最前面 int32_t vertex_offset; //注意:这里的offset是相对于vertex的,代表第几个顶点,不是字节偏移 uint32_t first_index; + uint32_t vertex_count; + uint32_t index_count; + public: - PrimitiveRenderData(const uint32_t bc,const uint32_t vc); - ~PrimitiveRenderData(); + PrimitiveRenderData(const uint32_t vc,const uint32_t ic,const int32_t vo=0,const uint32_t fi=0) + { + vertex_count =vc; + index_count =ic; + vertex_offset =vo; + first_index =fi; + } - const bool Comp(const PrimitiveRenderData *)const; + CompOperatorMemcmp(const PrimitiveRenderData &); + CompOperatorMemcmpPointer(PrimitiveRenderData); }; /** @@ -95,8 +103,8 @@ public: Primitive * GetPrimitive (){return primitive;} const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();} - const PrimitiveDataBuffer * GetRenderBuffer ()const{return primitive_data_buffer;} - const PrimitiveRenderData * GetRenderData ()const{return primitive_render_data;} + const PrimitiveDataBuffer *GetRenderBuffer ()const{return primitive_data_buffer;} + const PrimitiveRenderData *GetRenderData ()const{return primitive_render_data;} };//class Renderable Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *); diff --git a/src/SceneGraph/MaterialRenderList.cpp b/src/SceneGraph/MaterialRenderList.cpp index a4458d57..2eb0729e 100644 --- a/src/SceneGraph/MaterialRenderList.cpp +++ b/src/SceneGraph/MaterialRenderList.cpp @@ -55,12 +55,12 @@ MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m) assign_buffer=new RenderAssignBuffer(device,material); - vbo_list=new VABList(material->GetVertexInput()->GetCount()); + vab_list=new VABList(material->GetVertexInput()->GetCount()); } MaterialRenderList::~MaterialRenderList() { - SAFE_CLEAR(vbo_list); + SAFE_CLEAR(vab_list); SAFE_CLEAR(assign_buffer); } @@ -93,7 +93,7 @@ void MaterialRenderList::RenderItem::Set(Renderable *ri) { pipeline=ri->GetPipeline(); mi =ri->GetMaterialInstance(); - prb =ri->GetRenderBuffer(); + pdb =ri->GetRenderBuffer(); prd =ri->GetRenderData(); } @@ -110,11 +110,11 @@ void MaterialRenderList::Stat() ri_count=1; ri->first=0; - ri->count=1; + ri->instance_count=1; ri->Set(rn->ri); last_pipeline =ri->pipeline; - last_render_buf =ri->prb; + last_data_buffer =ri->pdb; last_render_data=ri->prd; ++rn; @@ -122,10 +122,10 @@ void MaterialRenderList::Stat() for(uint i=1;iri->GetPipeline()) - if(last_render_buf->Comp(rn->ri->GetRenderBuffer())) - if(last_render_data->Comp(rn->ri->GetRenderData())) + if(last_data_buffer->Comp(rn->ri->GetRenderBuffer())) + if(last_render_data->_Comp(rn->ri->GetRenderData())==0) { - ++ri->count; + ++ri->instance_count; ++rn; continue; } @@ -134,18 +134,18 @@ void MaterialRenderList::Stat() ++ri; ri->first=i; - ri->count=1; + ri->instance_count=1; ri->Set(rn->ri); last_pipeline =ri->pipeline; - last_render_buf =ri->prb; + last_data_buffer =ri->pdb; last_render_data=ri->prd; ++rn; } } -bool MaterialRenderList::BindVAB(const PrimitiveDataBuffer *prb,const uint ri_index) +bool MaterialRenderList::BindVAB(const PrimitiveDataBuffer *pdb,const uint ri_index) { //binding号都是在VertexInput::CreateVIL时连续紧密排列生成的,所以bind时first_binding写0就行了。 @@ -154,19 +154,19 @@ bool MaterialRenderList::BindVAB(const PrimitiveDataBuffer *prb,const uint ri_in //if(vil->GetCount(VertexInputGroup::Basic)!=prb->vab_count) // return(false); //这里基本不太可能,因为CreateRenderable时就会检查值是否一样 - vbo_list->Restart(); + vab_list->Restart(); //Basic组,它所有的VAB信息均来自于Primitive,由vid参数传递进来 { - vbo_list->Add(prb->vab_list, - prb->vab_offset, - prb->vab_count); + vab_list->Add(pdb->vab_list, + nullptr,//prb->vab_offset, + pdb->vab_count); } if(assign_buffer) //L2W/MI分发组 - vbo_list->Add(assign_buffer->GetVAB(),0);//ASSIGN_VAB_STRIDE_BYTES*ri_index); + vab_list->Add(assign_buffer->GetVAB(),0);//ASSIGN_VAB_STRIDE_BYTES*ri_index); - //if(!vbo_list.IsFull()) //Joint组,暂未支持 + //if(!vab_list.IsFull()) //Joint组,暂未支持 //{ // const uint joint_id_binding_count=vil->GetCount(VertexInputGroup::JointID); @@ -201,7 +201,7 @@ bool MaterialRenderList::BindVAB(const PrimitiveDataBuffer *prb,const uint ri_in // return(false); //} - cmd_buf->BindVAB(vbo_list); + cmd_buf->BindVAB(vab_list); return(true); } @@ -213,36 +213,23 @@ void MaterialRenderList::Render(RenderItem *ri) cmd_buf->BindPipeline(ri->pipeline); last_pipeline=ri->pipeline; - last_render_buf=nullptr; + last_data_buffer=nullptr; //这里未来尝试换pipeline同时不换mi/primitive是否需要重新绑定mi/primitive } - if(!ri->prb->Comp(last_render_buf)) + if(!ri->pdb->Comp(last_data_buffer)) { - last_render_buf=ri->prb; + last_data_buffer=ri->pdb; last_render_data=nullptr; - BindVAB(ri->prb,ri->first); + BindVAB(ri->pdb,ri->first); - if(ri->prb->ib_access->buffer) - cmd_buf->BindIBO(ri->prb->ib_access); + if(ri->pdb->ibo) + cmd_buf->BindIBO(ri->pdb->ibo); } - if(last_render_buf->ib_access->buffer) - { - cmd_buf->DrawIndexed(ri->prd->index_count, - ri->count, - ri->prd->first_index, - ri->prd->vertex_offset, //因为vkCmdDrawIndexed的vertexOffset是针对所有VAB的,所以所有的VAB数据都必须是对齐的, - //最终这里使用vab_offset[0]是可以的,因为它也等于其它所有的vab_offset。未来考虑统一成一个。 - ri->first); //这里vkCmdDrawIndexed的firstInstance参数指的是instance Rate更新的VAB的起始实例数,不是指instance批量渲染。 - //所以这里使用ri->first是对的。 - } - else - { - cmd_buf->Draw(ri->prd->vertex_count,ri->count); - } + cmd_buf->Draw(ri->pdb,ri->prd,ri->instance_count,ri->first); } void MaterialRenderList::Render(RenderCmdBuffer *rcb) @@ -259,7 +246,7 @@ void MaterialRenderList::Render(RenderCmdBuffer *rcb) RenderItem *ri=ri_array.GetData(); last_pipeline =nullptr; - last_render_buf =nullptr; + last_data_buffer =nullptr; if(assign_buffer) assign_buffer->Bind(material); diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index f3a0e234..e4510d31 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -15,6 +15,8 @@ PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v) prim_data =nullptr; + map_ptr_list =hgl_zero_new(v->GetVertexAttribCount()); + Clear(); } @@ -29,6 +31,7 @@ PrimitiveCreater::PrimitiveCreater(VertexDataManager *_vdm) PrimitiveCreater::~PrimitiveCreater() { SAFE_CLEAR(prim_data); + SAFE_CLEAR_ARRAY(map_ptr_list) } void PrimitiveCreater::Clear() @@ -120,9 +123,7 @@ const int PrimitiveCreater::GetVABIndex(const AnsiString &name,const VkFormat &a VAB *vab=prim_data->GetVAB(vab_index); if(!vab) - return(-1); - - vab=prim_data->InitVAB(vab_index,acquire_format,nullptr); + vab=prim_data->InitVAB(vab_index,acquire_format,nullptr); if(!vab) return(-1); @@ -145,16 +146,23 @@ const int PrimitiveCreater::GetVABIndex(const AnsiString &name,const VkFormat &a void *PrimitiveCreater::MapVAB(const int vab_index) { + if(!prim_data) + return(nullptr); + VAB *vab=prim_data->GetVAB(vab_index); if(!vab) return(nullptr); - return vab->Map(prim_data->GetVertexOffset(),vertices_number); + map_ptr_list[vab_index]=vab->Map(prim_data->GetVertexOffset(),vertices_number); + + return map_ptr_list[vab_index]; } void PrimitiveCreater::UnmapVAB(const int vab_index) { + if(!prim_data)return; + VAB *vab=prim_data->GetVAB(vab_index); if(!vab)return; @@ -208,6 +216,13 @@ Primitive *PrimitiveCreater::Create() if(!prim_data) return(nullptr); + for(int i=0;iGetVertexAttribCount();i++) + if(map_ptr_list[i]) + { + prim_data->GetVAB(i)->Unmap(); + map_ptr_list[i]=nullptr; + } + Primitive *primitive=new Primitive(prim_name,prim_data); if(!primitive) diff --git a/src/SceneGraph/VertexDataManager.cpp b/src/SceneGraph/VertexDataManager.cpp index 1a91f06f..036d6c3f 100644 --- a/src/SceneGraph/VertexDataManager.cpp +++ b/src/SceneGraph/VertexDataManager.cpp @@ -13,7 +13,7 @@ namespace hgl device=dev; vil=_vil; - vi_count=_vil->GetCount(); + vi_count=_vil->GetVertexAttribCount(); vif_list=_vil->GetVIFList(); //来自于Material,不会被释放,所以指针有效 vab_max_size=0; diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index 837fe54e..41be882e 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -130,39 +130,32 @@ bool RenderCmdBuffer::BindDescriptorSets(Material *mtl) return(true); } -void RenderCmdBuffer::BindIBO(IBAccess *iba) +void RenderCmdBuffer::BindIBO(IndexBuffer *ibo,const VkDeviceSize byte_offset) { - if(!iba)return; - - IndexBuffer *ibo=iba->buffer; - if(!ibo)return; - + vkCmdBindIndexBuffer(cmd_buf, ibo->GetBuffer(), - iba->start*ibo->GetStride(), + byte_offset, VkIndexType(ibo->GetType())); } -bool RenderCmdBuffer::BindVAB(Renderable *ri) +bool RenderCmdBuffer::BindRenderBuffer(const PrimitiveDataBuffer *pdb) { - if(!ri) + if(!pdb) return(false); - const PrimitiveDataBuffer *prb=ri->GetRenderBuffer(); - - if(prb->vab_count<=0) + if(pdb->vab_count<=0) return(false); - const PrimitiveRenderData *prd=ri->GetRenderData(); + vkCmdBindVertexBuffers(cmd_buf, + 0, //first binding + pdb->vab_count, + pdb->vab_list, + nullptr); //vab byte offsets - if(prd->vertex_count<=0) - return(false); - - vkCmdBindVertexBuffers(cmd_buf,0,prb->vab_count,prb->vab_list,prb->vab_offset); - - if(prb->ib_access->buffer) - BindIBO(prb->ib_access); + if(pdb->ibo) + BindIBO(pdb->ibo); return(true); } @@ -191,15 +184,24 @@ void RenderCmdBuffer::DrawIndexedIndirect( VkBuffer buffer, vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset+i*stride,1,stride); } -void RenderCmdBuffer::Draw(const PrimitiveDataBuffer *prb,const PrimitiveRenderData *prd) +void RenderCmdBuffer::Draw(const PrimitiveDataBuffer *prb,const PrimitiveRenderData *prd,const uint32_t instance_count,const uint32_t first_instance) { if(!prb||!prd) return; - if (prb->ib_access->buffer) - DrawIndexed(prd->index_count); + if (prb->ibo) + vkCmdDrawIndexed( cmd_buf, + prd->index_count, + instance_count, + prd->first_index, + prd->vertex_offset, //这里的vertexOffset是针对所有VAB的 + first_instance); //这里的first_instance针对的是instance Rate更新的VAB的起始实例数,不是指instance批量渲染 else - Draw(prd->vertex_count); + vkCmdDraw( cmd_buf, + prd->vertex_count, + instance_count, + prd->vertex_offset, + first_instance); } //void RenderCmdBuffer::DrawIndexed(const IBAccess *iba,const uint32_t instance_count) diff --git a/src/SceneGraph/Vulkan/VKPrimitive.cpp b/src/SceneGraph/Vulkan/VKPrimitive.cpp index d754fb17..490fa2aa 100644 --- a/src/SceneGraph/Vulkan/VKPrimitive.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitive.cpp @@ -51,14 +51,24 @@ const int Primitive::GetVABCount()const return prim_data->GetVABCount(); } -VABAccess *Primitive::GetVABAccess(const AnsiString &name) +const int Primitive::GetVABIndex(const AnsiString &name)const { - return prim_data->GetVABAccess(name); + return prim_data->GetVABIndex(name); } -IBAccess *Primitive::GetIBAccess() +VAB *Primitive::GetVAB(const int vab_index) { - return prim_data->GetIBAccess(); + return prim_data->GetVAB(vab_index); +} + +const int32_t Primitive::GetVertexOffset()const +{ + return prim_data->GetVertexOffset(); +} + +const uint32_t Primitive::GetIndexCount()const +{ + return prim_data->GetIndexCount(); } IndexBuffer *Primitive::GetIBO() @@ -66,4 +76,8 @@ IndexBuffer *Primitive::GetIBO() return prim_data->GetIBO(); } +const uint32_t Primitive::GetFirstIndex()const +{ + return prim_data->GetFirstIndex(); +} VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp index 1c4eace2..ab95081f 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp @@ -13,7 +13,7 @@ PrimitiveData::PrimitiveData(const VIL *_vil,const uint32_t vc) vertex_count=vc; - vab_list=hgl_zero_new(_vil->GetCount()); + vab_list=hgl_zero_new(_vil->GetVertexAttribCount()); ibo=nullptr; } @@ -25,7 +25,7 @@ PrimitiveData::~PrimitiveData() const int PrimitiveData::GetVABCount()const { - return vil->GetCount(); + return vil->GetVertexAttribCount(); } const int PrimitiveData::GetVABIndex(const AnsiString &name) const @@ -37,7 +37,7 @@ const int PrimitiveData::GetVABIndex(const AnsiString &name) const VAB *PrimitiveData::GetVAB(const int index) { - if(index<0||index>=vil->GetCount())return(nullptr); + if(index<0||index>=vil->GetVertexAttribCount())return(nullptr); return vab_list[index]; } @@ -67,7 +67,7 @@ namespace { VAB **vab=vab_list; - for(uint i=0;iGetCount();i++) + for(uint i=0;iGetVertexAttribCount();i++) { if(*vab) delete *vab; @@ -100,7 +100,7 @@ namespace if(!device)return(nullptr); if(!vil)return(nullptr); - if(vab_index<0||vab_index>=vil->GetCount()) + if(vab_index<0||vab_index>=vil->GetVertexAttribCount()) return(nullptr); const VertexInputFormat *vif=vil->GetConfig(vab_index); @@ -159,14 +159,14 @@ namespace vdm->ReleaseVAB(vab_node); } - IndexBuffer *InitIBO(const uint32_t index_count,IndexType it) override + IndexBuffer *InitIBO(const uint32_t ic,IndexType it) override { - if(index_count<=0)return(nullptr); + if(ic<=0)return(nullptr); if(!vdm)return(nullptr); if(!ib_node) { - ib_node=vdm->AcquireIB(index_count); + ib_node=vdm->AcquireIB(ic); if(!ib_node) return(nullptr); @@ -174,6 +174,8 @@ namespace ibo=vdm->GetIBO(); } + index_count=ic; + return ibo; } @@ -182,7 +184,7 @@ namespace if(!vdm)return(nullptr); if(!vil)return(nullptr); - if (vab_index<0||vab_index>=vil->GetCount()) + if (vab_index<0||vab_index>=vil->GetVertexAttribCount()) return(nullptr); const VertexInputFormat *vif=vil->GetConfig(vab_index); diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.h b/src/SceneGraph/Vulkan/VKPrimitiveData.h index 150a3a99..9b7b15d5 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.h +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.h @@ -38,6 +38,7 @@ public: const int GetVABCount ()const; const int GetVABIndex (const AnsiString &name)const; VAB * GetVAB (const int index); + VAB * GetVAB (const AnsiString &name){return GetVAB(GetVABIndex(name));} IndexBuffer * GetIBO (){return ibo;} uint32_t GetIndexCount ()const{return index_count;} diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index 896fc46f..98068eab 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -7,7 +7,7 @@ #include VK_NAMESPACE_BEGIN -PrimitiveDataBuffer::PrimitiveDataBuffer(const uint32_t c,const uint32_t vc, IndexBuffer *ib) +PrimitiveDataBuffer::PrimitiveDataBuffer(const uint32_t c,IndexBuffer *ib) { vab_count=c; @@ -20,60 +20,39 @@ PrimitiveDataBuffer::~PrimitiveDataBuffer() delete[] vab_list; } -const bool PrimitiveDataBuffer::Comp(const PrimitiveDataBuffer *prb)const +const bool PrimitiveDataBuffer::Comp(const PrimitiveDataBuffer *pdb)const { - if(!prb)return(false); + if(!pdb)return(false); - if(vab_count!=prb->vab_count)return(false); + if(vab_count!=pdb->vab_count)return(false); for(uint32_t i=0;ivab_list[i])return(false); + if(vab_list[i]!=pdb->vab_list[i])return(false); } - if(ibo!=prb->ibo) + if(ibo!=pdb->ibo) return(false); return(true); } -Renderable::Renderable(Primitive *r,MaterialInstance *mi,Pipeline *p,PrimitiveDataBuffer *prb,PrimitiveRenderData *prd) +Renderable::Renderable(Primitive *r,MaterialInstance *mi,Pipeline *p,PrimitiveDataBuffer *pdb,PrimitiveRenderData *prd) { primitive=r; pipeline=p; mat_inst=mi; - primitive_data_buffer=prb; + primitive_data_buffer=pdb; primitive_render_data=prd; } - -PrimitiveRenderData::PrimitiveRenderData(const uint32_t bc,const uint32_t vc) -{ - vab_count=bc; - - vertex_count=vc; - vertex_offset=0; - - first_index=0; -} - -PrimitiveRenderData::~PrimitiveRenderData() -{ -} - -const bool PrimitiveRenderData::Comp(const PrimitiveRenderData *prd)const -{ - if(!prd)return(false); - - return !memcmp(this,prd,sizeof(PrimitiveRenderData)); -} Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p) { if(!prim||!mi||!p)return(nullptr); const VIL *vil=mi->GetVIL(); - const uint32_t input_count=vil->GetCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的 + const uint32_t input_count=vil->GetVertexAttribCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的 const UTF8String &mtl_name=mi->GetMaterial()->GetName(); if(prim->GetVABCount()GetVertexCount(),prim->GetIBO()); - PrimitiveRenderData *prd=new PrimitiveRenderData(input_count,prim->GetVertexCount()); + PrimitiveDataBuffer *pdb=new PrimitiveDataBuffer(input_count,prim->GetIBO()); + PrimitiveRenderData *prd=new PrimitiveRenderData(prim->GetVertexCount(),prim->GetIndexCount(),prim->GetVertexOffset(),prim->GetFirstIndex()); const VertexInputFormat *vif=vil->GetVIFList(VertexInputGroup::Basic); - VABAccess *vab_access; + VAB *vab; for(uint i=0;iGetVABAccess(vif->name); + vab=prim->GetVAB(vif->name); - if(!vab_access||!vab_access->vab) + if(!vab) { LOG_ERROR("[FATAL ERROR] not found VAB \""+AnsiString(vif->name)+"\" in Material: "+mtl_name); return(nullptr); } - if(vab_access->vab->GetFormat()!=vif->format) + if(vab->GetFormat()!=vif->format) { LOG_ERROR( "[FATAL ERROR] VAB \""+UTF8String(vif->name)+ UTF8String("\" format can't match Renderable, Material(")+mtl_name+ UTF8String(") Format(")+GetVulkanFormatName(vif->format)+ - UTF8String("), VAB Format(")+GetVulkanFormatName(vab_access->vab->GetFormat())+ + UTF8String("), VAB Format(")+GetVulkanFormatName(vab->GetFormat())+ ")"); return(nullptr); } - if(vab_access->vab->GetStride()!=vif->stride) + if(vab->GetStride()!=vif->stride) { LOG_ERROR( "[FATAL ERROR] VAB \""+UTF8String(vif->name)+ UTF8String("\" stride can't match Renderable, Material(")+mtl_name+ UTF8String(") stride(")+UTF8String::numberOf(vif->stride)+ - UTF8String("), VAB stride(")+UTF8String::numberOf(vab_access->vab->GetStride())+ + UTF8String("), VAB stride(")+UTF8String::numberOf(vab->GetStride())+ ")"); return(nullptr); } - prb->vab_offset[i]=vab_access->start; - prb->vab_list[i]=vab_access->vab->GetBuffer(); + pdb->vab_list[i]=vab->GetBuffer(); ++vif; } - return(new Renderable(prim,mi,p,prb,prd)); + return(new Renderable(prim,mi,p,pdb,prd)); } VK_NAMESPACE_END