From db0a8ee256606fca2165ab2d3142d5b95947bc32 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Fri, 28 Apr 2023 11:09:22 +0800 Subject: [PATCH] Created VertexInputData at VKRenderable.h --- inc/hgl/graph/VKRenderable.h | 29 +++++--- .../Vulkan/VKCommandBufferRender.cpp | 6 +- src/SceneGraph/Vulkan/VKRenderable.cpp | 71 +++++++++++-------- 3 files changed, 64 insertions(+), 42 deletions(-) diff --git a/inc/hgl/graph/VKRenderable.h b/inc/hgl/graph/VKRenderable.h index d4b19ba0..7e66d5d5 100644 --- a/inc/hgl/graph/VKRenderable.h +++ b/inc/hgl/graph/VKRenderable.h @@ -8,9 +8,25 @@ #include #include VK_NAMESPACE_BEGIN + +struct VertexInputData +{ + uint32_t count; + + const char **name_list; + const VkVertexInputBindingDescription *bind_list; + const VkVertexInputAttributeDescription *attr_list; + VkBuffer *buffer_list; + VkDeviceSize *buffer_offset; + +public: + + VertexInputData(const VIL *vil); + ~VertexInputData(); +}; + /** * 可渲染对象
-* RenderList会统一管理Shader中的LocalToWorld数据,使用DynamicUBO/DynamicSSBO实现。 */ class Renderable ///可渲染对象实例 { @@ -18,9 +34,7 @@ class Renderable MaterialInstance * mat_inst; Primitive * primitive; - uint32_t buffer_count; - VkBuffer * buffer_list; - VkDeviceSize * buffer_size; + VertexInputData * vertex_input_data; uint32_t buffer_hash; @@ -28,7 +42,7 @@ private: friend Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *); - Renderable(Primitive *,MaterialInstance *,Pipeline *,const uint32_t,VkBuffer *,VkDeviceSize *); + Renderable(Primitive *,MaterialInstance *,Pipeline *,VertexInputData *); public: @@ -43,9 +57,8 @@ public: Primitive * GetPrimitive (){return primitive;} const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();} - const uint32_t GetBufferCount ()const{return buffer_count;} - VkBuffer * GetBuffer ()const{return buffer_list;} - VkDeviceSize * GetBufferSize ()const{return buffer_size;} + const VertexInputData * GetVertexInputData ()const{return vertex_input_data;} + IndexBuffer * GetIndexBuffer ()const{return primitive->GetIndexBuffer();} const uint32_t GetIndexBufferOffset()const{return primitive->GetIndexBufferOffset();} const uint32_t GetDrawCount ()const{return primitive->GetDrawCount();} diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index b6d82dcc..9ab0bbba 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -138,12 +138,12 @@ bool RenderCmdBuffer::BindVBO(Renderable *ri) if(!ri) return(false); - const uint count=ri->GetBufferCount(); + const VertexInputData *vid=ri->GetVertexInputData(); - if(count<=0) + if(vid->count<=0) return(false); - vkCmdBindVertexBuffers(cmd_buf,0,count,ri->GetBuffer(),ri->GetBufferSize()); + vkCmdBindVertexBuffers(cmd_buf,0,vid->count,vid->buffer_list,vid->buffer_offset); IndexBuffer *indices_buffer=ri->GetIndexBuffer(); diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index e4091107..0bed3564 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -8,18 +8,34 @@ VK_NAMESPACE_BEGIN using namespace util; -Renderable::Renderable(Primitive *r,MaterialInstance *mi,Pipeline *p,const uint32_t count,VkBuffer *bl,VkDeviceSize *bs) +VertexInputData::VertexInputData(const VIL *vil) +{ + count=vil->GetAttrCount(); + + name_list=vil->GetNameList(); + bind_list=vil->GetBindingList(); + attr_list=vil->GetAttributeList(); + + buffer_list=new VkBuffer[count]; + buffer_offset=new VkDeviceSize[count]; +} + +VertexInputData::~VertexInputData() +{ + delete[] buffer_list; + delete[] buffer_offset; +} + +Renderable::Renderable(Primitive *r,MaterialInstance *mi,Pipeline *p,VertexInputData *vid) { primitive=r; pipeline=p; mat_inst=mi; - buffer_count=count; - buffer_list=bl; - buffer_size=bs; + vertex_input_data=vid; - if(buffer_count>0) - CountHash(buffer_list,buffer_count*sizeof(VkBuffer),(void *)&buffer_hash); + if(vertex_input_data->count>0) + CountHash(vertex_input_data->buffer_list,vertex_input_data->count*sizeof(VkBuffer),(void *)&buffer_hash); else buffer_hash=0; } @@ -28,8 +44,7 @@ Renderable::~Renderable() { //需要在这里添加删除pipeline/desc_sets/primitive引用计数的代码 - delete[] buffer_list; - delete[] buffer_size; + delete vertex_input_data; } Renderable *CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p) @@ -47,54 +62,48 @@ Renderable *CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p) return(nullptr); } - AutoDeleteArray buffer_list(input_count); - AutoDeleteArray buffer_size(input_count); - VBO *vbo; - const char ** name_list=vil->GetNameList(); - const VkVertexInputBindingDescription * bind_list=vil->GetBindingList(); - const VkVertexInputAttributeDescription * attr_list=vil->GetAttributeList(); + const char *name; + + VertexInputData *vid=new VertexInputData(vil); for(int i=0;iGetVBO(*name_list,buffer_size+i); + vbo=r->GetVBO(vid->name_list[i],vid->buffer_offset+i); + + name=vid->name_list[i]; if(!vbo) { - LOG_ERROR("[FATAL ERROR] not found VBO \""+AnsiString(*name_list)+"\" in Material: "+mtl_name); + LOG_ERROR("[FATAL ERROR] not found VBO \""+AnsiString(vid->name_list[i])+"\" in Material: "+mtl_name); return(nullptr); } - if(vbo->GetFormat()!=attr_list->format) + if(vbo->GetFormat()!=vid->attr_list[i].format) { - LOG_ERROR( "[FATAL ERROR] VBO \""+**name_list+ + LOG_ERROR( "[FATAL ERROR] VBO \""+UTF8String(name)+ UTF8String("\" format can't match Renderable, Material(")+mtl_name+ - UTF8String(") Format(")+GetVulkanFormatName(attr_list->format)+ + UTF8String(") Format(")+GetVulkanFormatName(vid->attr_list[i].format)+ UTF8String("), VBO Format(")+GetVulkanFormatName(vbo->GetFormat())+ ")"); + delete vid; return(nullptr); } - if(vbo->GetStride()!=bind_list->stride) + if(vbo->GetStride()!=vid->bind_list[i].stride) { - LOG_ERROR( "[FATAL ERROR] VBO \""+**name_list+ + LOG_ERROR( "[FATAL ERROR] VBO \""+UTF8String(name)+ UTF8String("\" stride can't match Renderable, Material(")+mtl_name+ - UTF8String(") stride(")+UTF8String::numberOf(bind_list->stride)+ + UTF8String(") stride(")+UTF8String::numberOf(vid->bind_list[i].stride)+ UTF8String("), VBO stride(")+UTF8String::numberOf(vbo->GetStride())+ ")"); + delete vid; return(nullptr); } - buffer_list[i]=vbo->GetBuffer(); - - ++name_list; - ++bind_list; - ++attr_list; + vid->buffer_list[i]=vbo->GetBuffer(); } - Renderable *ri=new Renderable(r,mi,p,input_count,buffer_list,buffer_size); - buffer_list.Discard(); - buffer_size.Discard(); - return ri; + return(new Renderable(r,mi,p,vid)); } VK_NAMESPACE_END