From 299d3bd0194518a518c0104b819cbf11e9f3f13b Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 25 May 2024 01:46:19 +0800 Subject: [PATCH] newly Primitive/PrimitiveData/PrimitiveCreater, and test OK! can RUN! --- inc/hgl/graph/PrimitiveCreater.h | 58 +++--- inc/hgl/graph/VK.h | 2 +- inc/hgl/graph/VKPrimitive.h | 23 +-- inc/hgl/graph/VertexAttribDataAccess.h | 2 + src/SceneGraph/CMakeLists.txt | 1 + src/SceneGraph/PrimitiveCreater.cpp | 121 ++++-------- src/SceneGraph/Vulkan/VKPrimitive.cpp | 83 ++------ src/SceneGraph/Vulkan/VKPrimitiveData.cpp | 231 +++++++++++++--------- src/SceneGraph/Vulkan/VKPrimitiveData.h | 50 +++++ src/SceneGraph/Vulkan/VKRenderable.cpp | 4 +- 10 files changed, 286 insertions(+), 289 deletions(-) create mode 100644 src/SceneGraph/Vulkan/VKPrimitiveData.h diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 5b7fca7f..abca210c 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -1,12 +1,11 @@ #pragma once -#include #include #include -#include #include VK_NAMESPACE_BEGIN + /** * 可绘制图元创建器 */ @@ -14,37 +13,30 @@ class PrimitiveCreater { protected: - GPUDevice *device; - const GPUPhysicalDevice *phy_device; + GPUDevice * device; const VIL * vil; -protected: + AnsiString prim_name; + PrimitiveData * prim_data; - AnsiString prim_name; ///<名称 - PrimitiveData * prim_data; ///<图元数据 +protected: VkDeviceSize vertices_number; ///<顶点数量 - uint vab_proc_count; ///<操作的vab数量 VkDeviceSize index_number; ///<索引数量 - IBAccess * iba; - -protected: - - void ClearAllData(); + IndexType index_type; ///<索引类型 + IBAccess * iba; ///<索引缓冲区 public: PrimitiveCreater(GPUDevice *,const VIL *,const AnsiString &name); - PrimitiveCreater(VertexDataManager *); - virtual ~PrimitiveCreater() - { - ClearAllData(); - } + virtual ~PrimitiveCreater(); virtual bool Init(const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 +public: //顶点缓冲区 + const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 VABAccess * AcquirePVB (const AnsiString &name,const VkFormat &format,const void *data=nullptr,const VkDeviceSize bytes=0); ///<请求一个顶点属性数据区 @@ -53,15 +45,21 @@ public: return AcquirePVB(name,format,data,bytes); } - const IndexType GetIndexType()const{return iba->buffer->GetType();} - IBAccess * AcquireIBO(){return iba;} +public: //索引缓冲区 + + const IndexType GetIndexType()const{return index_type;} + + void * MapIBO(); + void UnmapIBO(); bool WriteIBO(const void *data,const VkDeviceSize bytes); template bool WriteIBO(const T *data){return WriteIBO(data,index_number*sizeof(T));} - virtual Primitive * Finish(RenderResource *); ///<结束并创建可渲染对象 +public: //创建可渲染对象 + + virtual Primitive * Create(); ///<创建一个可渲染对象 };//class PrimitiveCreater /** @@ -186,30 +184,28 @@ typedef VABMap VABMap4d; */ template class IBMap { - IBAccess *iba; + PrimitiveCreater *pc; T *map_ptr; public: - IBMap(IBAccess *a) + IBMap(PrimitiveCreater *c) { - iba=a; + pc=c; - if(iba) - map_ptr=(T *)(iba->buffer->Map(iba->start,iba->count)); + if(pc) + map_ptr=(T *)(pc->MapIBO()); else map_ptr=nullptr; } - IBMap(PrimitiveCreater *pc):IBMap(pc->AcquireIBO()){} - ~IBMap() { - if(iba) - iba->buffer->Unmap(); + if(map_ptr&&pc) + pc->UnmapIBO(); } - const bool IsValid()const{ return iba; } + const bool IsValid()const{ return map_ptr; } operator T *(){ return map_ptr; } };//template class IBMap diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 66abb33c..7f6c0b19 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -118,7 +118,7 @@ using VIF=VertexInputFormat; class VertexInputLayout; using VIL=VertexInputLayout; -struct PrimitiveData; +class PrimitiveData; class Primitive; class Renderable; diff --git a/inc/hgl/graph/VKPrimitive.h b/inc/hgl/graph/VKPrimitive.h index 8b004ac6..aad8674d 100644 --- a/inc/hgl/graph/VKPrimitive.h +++ b/inc/hgl/graph/VKPrimitive.h @@ -24,36 +24,27 @@ class Primitive { protected: - AnsiString prim_name; - PrimitiveData *prim_data; + AnsiString prim_name; + + PrimitiveData * prim_data; protected: AABB BoundingBox; - -protected: - - Primitive(const AnsiString &pn,PrimitiveData *pd) - { - prim_name=pn; - prim_data=pd; - } - + public: - virtual ~Primitive()=default; + Primitive(const AnsiString &pn,PrimitiveData *pd); + virtual ~Primitive(); public: const AnsiString & GetName ()const{ return prim_name; } const VkDeviceSize GetVertexCount ()const; - const int GetVACount ()const; + const int GetVABCount ()const; VABAccess * GetVABAccess (const AnsiString &); IBAccess * GetIBAccess (); const AABB & GetBoundingBox ()const{return BoundingBox;} };//class Primitive - -Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *); -Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *); VK_NAMESPACE_END diff --git a/inc/hgl/graph/VertexAttribDataAccess.h b/inc/hgl/graph/VertexAttribDataAccess.h index edce72a5..848544c6 100644 --- a/inc/hgl/graph/VertexAttribDataAccess.h +++ b/inc/hgl/graph/VertexAttribDataAccess.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include namespace hgl { namespace graph diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index e5fd8a25..fff13f9e 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -17,6 +17,7 @@ SOURCE_GROUP("VertexDataManager" FILES ${SG_VDM_SOURCE}) SET(SG_PRIMITIVE_SOURCE ${SG_INCLUDE_PATH}/VKPrimitive.h Vulkan/VKPrimitive.cpp Vulkan/VKPrimitiveData.cpp + Vulkan/VKPrimitiveData.h ${SG_INCLUDE_PATH}/VKRenderablePrimitiveCreater.h ${SG_INCLUDE_PATH}/PrimitiveCreater.h PrimitiveCreater.cpp) diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index 2138419a..c5b52ba7 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -1,52 +1,36 @@ #include -#include +#include +#include #include #include -//#include +#include"vulkan/VKPrimitiveData.h" VK_NAMESPACE_BEGIN - -PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc); -IBAccess * GetIBAccess( PrimitiveData *pd); -void SetIndexBuffer( PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic); -VABAccess * GetVABAccess( PrimitiveData *pd,const int); -void Destory( PrimitiveData *pd); - PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v,const AnsiString &name) { device =dev; - phy_device =device->GetPhysicalDevice(); vil =v; prim_name =name; prim_data =nullptr; vertices_number =0; - vab_proc_count =0; index_number =0; + index_type =IndexType::ERR; iba =nullptr; } -//PrimitiveCreater::PrimitiveCreater(VertexDataManager *_vdm) -//{ -// device =_vdm->GetDevice(); -// phy_device =device->GetPhysicalDevice(); -// -// vdm =_vdm; -// vil =vdm->GetVIL(); -// -// vertices_number =0; -// index_number =0; -// ibo =nullptr; -// ibo_map =nullptr; -//} +PrimitiveCreater::~PrimitiveCreater() +{ + SAFE_CLEAR(prim_data); +} bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize index_count,IndexType it) { if(vertex_count<=0)return(false); - prim_data=CreatePrimitiveData(vil,vertex_count); + prim_data=CreatePrimitiveData(device,vil,vertex_count); if(!prim_data)return(false); @@ -67,15 +51,12 @@ bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize i return(false); } - iba=GetIBAccess(prim_data); + iba=prim_data->InitIBO(index_count,it); - iba->buffer=device->CreateIBO(it,index_count); - - if(!iba->buffer)return(false); - - iba->start=0; - iba->count=index_count; + if(!iba) + return(false); + index_type=it; index_number=index_count; #ifdef _DEBUG @@ -94,37 +75,16 @@ bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize i VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data,const VkDeviceSize bytes) { - if(!vil)return(nullptr); + if(!prim_data)return(nullptr); if(name.IsEmpty())return(nullptr); - const int index=vil->GetIndex(name); - - if(index<0||index>=vil->GetCount()) - return(nullptr); - - const VertexInputFormat *vif=vil->GetConfig(index); - - if(!vif) - return(nullptr); - - if(vif->format!=acquire_format) - return(nullptr); - - if(data) - if(vif->stride*vertices_number!=bytes) - return(nullptr); - - VABAccess *vab_access=GetVABAccess(prim_data,index); + VABAccess *vab_access=prim_data->InitVAB(name,acquire_format,data,bytes); if(!vab_access) return(nullptr); - if(!vab_access->vab) - { - vab_access->vab=device->CreateVAB(vif->format,vertices_number,data); - vab_access->start=0; - vab_access->count=vertices_number; - + if(vab_access->vab) + { #ifdef _DEBUG DebugUtils *du=device->GetDebugUtils(); @@ -134,19 +94,32 @@ VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &a du->SetDeviceMemory(vab_access->vab->GetVkMemory(), prim_name+":VAB:Memory:"+name); } #endif//_DEBUG - - ++vab_proc_count; } - if(data) - vab_access->vab->Write(data,bytes); - return vab_access; } + +void *PrimitiveCreater::MapIBO() +{ + if(!prim_data)return(nullptr); + if(!iba)return(nullptr); + + return iba->buffer->Map(iba->start,iba->count); +} + +void PrimitiveCreater::UnmapIBO() +{ + if(iba) + iba->buffer->Unmap(); +} + bool PrimitiveCreater::WriteIBO(const void *data,const VkDeviceSize bytes) { if(!data)return(false); + if(!prim_data)return(false); + + IBAccess *iba=prim_data->GetIBAccess(); if(bytes>0) if(iba->buffer->GetStride()*index_numberbuffer->Write(data,bytes); } -void PrimitiveCreater::ClearAllData() +Primitive *PrimitiveCreater::Create() { - iba=nullptr; - - if(prim_data) - { - Destory(prim_data); - prim_data=nullptr; - } -} - -Primitive *PrimitiveCreater::Finish(RenderResource *rr) -{ - const uint si_count=vil->GetCount(VertexInputGroup::Basic); - - if(vab_proc_count!=si_count) + if(!prim_data) return(nullptr); - Primitive *primitive=rr->CreatePrimitive(prim_name,prim_data); + Primitive *primitive=new Primitive(prim_name,prim_data); if(!primitive) - { - ClearAllData(); return(nullptr); - } - iba=nullptr; prim_data=nullptr; + iba=nullptr; return primitive; } diff --git a/src/SceneGraph/Vulkan/VKPrimitive.cpp b/src/SceneGraph/Vulkan/VKPrimitive.cpp index 570ecbc9..c9161519 100644 --- a/src/SceneGraph/Vulkan/VKPrimitive.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitive.cpp @@ -3,6 +3,7 @@ #include #include #include +#include"VKPrimitiveData.h" #ifdef _DEBUG #include @@ -11,65 +12,6 @@ VK_NAMESPACE_BEGIN -const VkDeviceSize GetVertexCount( PrimitiveData *pd); -const int GetVABCount( PrimitiveData *pd); - VABAccess * GetVABAccess( PrimitiveData *pd,const AnsiString &name); - IBAccess * GetIBAccess( PrimitiveData *pd); - void Destory( PrimitiveData *pd); - void Free( PrimitiveData *pd); - -class PrimitivePrivateBuffer:public Primitive -{ -public: - - using Primitive::Primitive; - - ~PrimitivePrivateBuffer() override - { - Destory(prim_data); - } - - friend Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *); -};//class PrimitivePrivateBuffer - -class PrimitiveVDM:public Primitive -{ - VertexDataManager *vdm; - -public: - - PrimitiveVDM(VertexDataManager *_vdm,const AnsiString &pn,PrimitiveData *pd):Primitive(pn,pd) - { - vdm=_vdm; - } - - ~PrimitiveVDM() override - { - - - Free(prim_data); - } - - friend Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *); -};//class PrimitiveVDM; - -Primitive *CreatePrimitivePrivate(const AnsiString &name,PrimitiveData *pd) -{ - if(!pd)return(nullptr); - if(name.IsEmpty())return(nullptr); - - return(new PrimitivePrivateBuffer(name,pd)); -} - -Primitive *CreatePrimitivePrivate(VertexDataManager *vdm,const AnsiString &name,PrimitiveData *pd) -{ - if(!vdm)return(nullptr); - if(!pd)return(nullptr); - if(name.IsEmpty())return(nullptr); - - return(new PrimitiveVDM(vdm,name,pd)); -} - //bool Renderable::Set(const int stage_input_binding,VIL *vil,VkDeviceSize offset) //{ // if(stage_input_binding<0||stage_input_binding>=buf_count||!vil)return(false); @@ -88,24 +30,35 @@ Primitive *CreatePrimitivePrivate(VertexDataManager *vdm,const AnsiString &name, // return(true); //} -const VkDeviceSize Primitive::GetVertexCount()const +Primitive::Primitive(const AnsiString &pn,PrimitiveData *pd) { - return VK_NAMESPACE::GetVertexCount(prim_data); + prim_name=pn; + prim_data=pd; } -const int Primitive::GetVACount()const +Primitive::~Primitive() { - return GetVABCount(prim_data); + SAFE_CLEAR(prim_data); +} + +const VkDeviceSize Primitive::GetVertexCount()const +{ + return prim_data->GetVertexCount(); +} + +const int Primitive::GetVABCount()const +{ + return prim_data->GetVABCount(); } VABAccess *Primitive::GetVABAccess(const AnsiString &name) { - return VK_NAMESPACE::GetVABAccess(prim_data,name); + return prim_data->GetVABAccess(name); } IBAccess *Primitive::GetIBAccess() { - return VK_NAMESPACE::GetIBAccess(prim_data); + return prim_data->GetIBAccess(); } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp index 57e437d6..e24b8e45 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp @@ -1,122 +1,55 @@ +#include"VKPrimitiveData.h" #include #include #include +#include VK_NAMESPACE_BEGIN -struct PrimitiveData + +PrimitiveData::PrimitiveData(const VIL *_vil,const VkDeviceSize vc) { - const VIL * vil; + vil=_vil; - VkDeviceSize vertex_count; - -/* - 1.ֹ2024.4.27vulkan.gpuinfo.orgͳƣֻ9%豸maxVertexInputAttributesΪ16ڵ16豸 - 9.0%豸Ϊ28 - 31 - 70.7%豸Ϊ32 - 9.6%豸Ϊ64 + vertex_count=vc; - ʱûзҪʹ16Եݶʹ16 - (ʱȥԶٴβѯֵǷɸijɸߵֵԼǷҪ) + vab_access=hgl_zero_new(_vil->GetCount()); - 2.Ϊva_nameʹchar[][]StringԼ̬ڴ棿 - - Ϊ˱ر̬ܶڴ棬ԼֱmemcpyԴ˴塣 -*/ - - VABAccess vab_access[HGL_MAX_VERTEX_ATTRIB_COUNT]; - IBAccess ib_access; -};//struct PrimitiveData - -PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc) -{ - if(!_vil)return(nullptr); - if(vc<=0)return(nullptr); - - PrimitiveData *pd=hgl_zero_new(); - - pd->vil =_vil; - pd->vertex_count=vc; - - return(pd); + hgl_zero(ib_access); } -void Free(PrimitiveData *pd) +PrimitiveData::~PrimitiveData() { - if(!pd)return; - - delete pd; + SAFE_CLEAR_ARRAY(vab_access); //注意:这里并不释放VAB,在派生类中释放 } -void Destory(PrimitiveData *pd) +const int PrimitiveData::GetVABCount()const { - if(!pd)return; - - VABAccess *vab=pd->vab_access; - - for(uint32_t i=0;ivil->GetCount();i++) - { - if(vab->vab) - { - delete vab->vab; - vab->vab=nullptr; - } - - ++vab; - } - - if(pd->ib_access.buffer) - { - delete pd->ib_access.buffer; - pd->ib_access.buffer=nullptr; - } - - delete pd; + return vil->GetCount(); } -const VkDeviceSize GetVertexCount(PrimitiveData *pd) +const int PrimitiveData::GetVABIndex(const AnsiString &name) const { - if(!pd)return(0); - - return pd->vertex_count; -} - -const int GetVABCount(PrimitiveData *pd) -{ - if(!pd)return(-1); - if(!pd->vil)return(-2); - - return pd->vil->GetCount(); -} - -int GetVABIndex(const PrimitiveData *pd,const AnsiString &name) -{ - if(!pd)return(-1); - if(!pd->vil)return(-1); if(name.IsEmpty())return(-1); - return pd->vil->GetIndex(name); + return vil->GetIndex(name); } -VABAccess *GetVABAccess(PrimitiveData *pd,const int index) +VABAccess *PrimitiveData::GetVABAccess(const int index) { - if(!pd)return(nullptr); - if(!pd->vil)return(nullptr); - if(index<0||index>=pd->vil->GetCount())return(nullptr); + if(index<0||index>=vil->GetCount())return(nullptr); - return pd->vab_access+index; + return vab_access+index; } -VABAccess *GetVABAccess(PrimitiveData *pd,const AnsiString &name) +VABAccess *PrimitiveData::GetVABAccess(const AnsiString &name) { - if(!pd)return(nullptr); - if(!pd->vil)return(nullptr); if(name.IsEmpty())return(nullptr); - const int index=pd->vil->GetIndex(name); + const int index=vil->GetIndex(name); if(index<0)return(nullptr); - return pd->vab_access+index; + return vab_access+index; } //VABAccess *SetVAB(PrimitiveData *pd,const int index,VAB *vab,VkDeviceSize start,VkDeviceSize count) @@ -153,11 +86,125 @@ VABAccess *GetVABAccess(PrimitiveData *pd,const AnsiString &name) // pd->ib_access.count=ic; //} -IBAccess *GetIBAccess(PrimitiveData *pd) +namespace { - if(!pd)return(nullptr); + /** + * 直接使用GPUDevice创建VAB/IBO,并在释构时释放 + */ + class PrimitiveDataPrivateBuffer:public PrimitiveData + { + GPUDevice *device; - return &(pd->ib_access); + public: + + PrimitiveDataPrivateBuffer(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc):PrimitiveData(_vil,vc) + { + device=dev; + } + + ~PrimitiveDataPrivateBuffer() + { + VABAccess *vab=vab_access; + + for(uint i=0;iGetCount();i++) + { + if(vab->vab) + { + delete vab->vab; + vab->vab=nullptr; + } + + ++vab; + } + + if(ib_access.buffer) + { + delete ib_access.buffer; + ib_access.buffer=nullptr; + } + } + + IBAccess *InitIBO(const VkDeviceSize index_count,IndexType it) override + { + if(!device)return(nullptr); + + if(ib_access.buffer) + { + delete ib_access.buffer; + ib_access.buffer=nullptr; + } + + ib_access.buffer=device->CreateIBO(it,index_count); + + if(!ib_access.buffer) + return(nullptr); + + ib_access.start=0; + ib_access.count=index_count; + + return(&ib_access); + } + + VABAccess *InitVAB(const AnsiString &name,const VkFormat &format,const void *data,const VkDeviceSize bytes) + { + if(!device)return(nullptr); + if(!vil)return(nullptr); + if(name.IsEmpty())return(nullptr); + + const int index=vil->GetIndex(name); + + if(index<0||index>=vil->GetCount()) + return(nullptr); + + const VertexInputFormat *vif=vil->GetConfig(index); + + if(!vif)return(nullptr); + + if(vif->format!=format) + return(nullptr); + + if(data) + { + if(vif->stride*vertex_count!=bytes) + return(nullptr); + } + + VABAccess *vaba=vab_access+index; + + if(!vaba->vab) + { + vaba->vab=device->CreateVAB(format,vertex_count,data); + + if(!vaba->vab) + return(nullptr); + + vaba->start=0; + vaba->count=vertex_count; + } + else + { + vaba->vab->Write(data,vertex_count); + } + + return vaba; + } + };//class PrimitiveDataPrivateBuffer:public PrimitiveData + + /** + * 使用VertexDataBuffer分配VAB/IBO,在本类析构时归还数据 + */ + class PrimitiveDataVDM:public PrimitiveData + { + + }; +}//namespace + +PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc) +{ + if(!dev)return(nullptr); + if(!_vil)return(nullptr); + if(vc<=0)return(nullptr); + + return(new PrimitiveDataPrivateBuffer(dev,_vil,vc)); } - -VK_NAMESPACE_END \ No newline at end of file +VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.h b/src/SceneGraph/Vulkan/VKPrimitiveData.h new file mode 100644 index 00000000..be134b72 --- /dev/null +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.h @@ -0,0 +1,50 @@ +#include + +VK_NAMESPACE_BEGIN +/* + 1.截止2024.4.27,根据vulkan.gpuinfo.org统计,只有9%的设备maxVertexInputAttributes为16,不存在低于16的设备。 + 9.0%的设备为28 - 31 + 70.7%的设备为32 + 9.6%的设备为64 + + 由于我们暂时没有发现需要使用16个以上属性的情况,所以这里暂定使用16。 + (如果时间过去久远,可再次查询此值是否可改成更高的值,以及是否需要) + + 2.为何va_name使用char[][]而不是String以及动态分配内存? + + 就是为了必避动态分配内存,以及可以直接memcpy处理,所以此处这样定义。 +*/ + +class PrimitiveData +{ +protected: + + const VIL * vil; + + VkDeviceSize vertex_count; + + VABAccess *vab_access; + IBAccess ib_access; + +public: + + PrimitiveData(const VIL *_vil,const VkDeviceSize vc); + virtual ~PrimitiveData(); + +public: + + const VkDeviceSize GetVertexCount ()const{return vertex_count;} + const int GetVABCount ()const; + const int GetVABIndex (const AnsiString &name)const; + VABAccess * GetVABAccess (const int index); + VABAccess * GetVABAccess (const AnsiString &name); + IBAccess * GetIBAccess (){return &ib_access;} + +public: + + virtual IBAccess * InitIBO(const VkDeviceSize index_count,IndexType it)=0; + virtual VABAccess *InitVAB(const AnsiString &name,const VkFormat &format,const void *data,const VkDeviceSize bytes)=0; +};//class PrimitiveData + +PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc); +VK_NAMESPACE_END \ No newline at end of file diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index 9587392a..92e0b90b 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -51,7 +51,7 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p) const uint32_t input_count=vil->GetCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的 const UTF8String &mtl_name=mi->GetMaterial()->GetName(); - if(prim->GetVACount()GetVABCount()