From 8363275b367b45b6fcf20a241b7f5849701a001d Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Fri, 24 Mar 2023 20:39:02 +0800 Subject: [PATCH 1/7] moved codes to .cpp from VKArrayBuffer.h --- inc/hgl/graph/VKArrayBuffer.h | 75 +++++------------------- src/SceneGraph/Vulkan/VKArrayBuffer.cpp | 77 +++++++++++++------------ 2 files changed, 55 insertions(+), 97 deletions(-) diff --git a/inc/hgl/graph/VKArrayBuffer.h b/inc/hgl/graph/VKArrayBuffer.h index 690493ca..9aafb12a 100644 --- a/inc/hgl/graph/VKArrayBuffer.h +++ b/inc/hgl/graph/VKArrayBuffer.h @@ -1,14 +1,15 @@ #ifndef HGL_GRAPH_VULKAN_ARRAY_BUFFER_INCLUDE #define HGL_GRAPH_VULKAN_ARRAY_BUFFER_INCLUDE -#include -#include -#include -#include +#include namespace hgl { + class Collection; + namespace graph { + class VKMemoryAllocator; + /** * GPU数据阵列缓冲区
* 它用于储存多份相同格式的数据,常用于多物件渲染,instance等 @@ -30,66 +31,18 @@ namespace hgl public: - GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il) - { - device=dev; - buffer_usage_flags=flags; - item_length=il; + GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il); + virtual ~GPUArrayBuffer(); - { - ubo_offset_alignment=device->GetUBOAlign(); + const uint32_t GetOffsetAlignment()const{return ubo_offset_alignment;} + const uint32_t GetUnitSize()const; + DeviceBuffer * GetBuffer(); - const uint32_t unit_size=hgl_align(item_length,ubo_offset_alignment); + uint32 Alloc(const uint32 max_count); ///<预分配空间 + void Clear(); - vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment - MemoryBlock *mb=new MemoryBlock(vk_ma); - - coll=new Collection(unit_size,mb); - } - } - - virtual ~GPUArrayBuffer() - { - delete coll; - } - - const uint32_t GetOffsetAlignment()const - { - return ubo_offset_alignment; - } - - const uint32_t GetUnitSize()const - { - return coll->GetUnitBytes(); - } - - DeviceBuffer *GetBuffer() - { - return vk_ma->GetBuffer(); - } - - uint32 Alloc(const uint32 max_count) ///<预分配空间 - { - if(!coll->Alloc(max_count)) - return(0); - - return coll->GetAllocCount(); - } - - void Clear() - { - coll->Clear(); - } - - void *Map(const uint32 start,const uint32 count) - { - return coll->Map(start,count); - } - - void Flush(const uint32 count) - { - vk_ma->Flush(count*GetUnitSize()); - } + void * Map(const uint32 start,const uint32 count); + void Flush(const uint32 count); };//class GPUArrayBuffer }//namespace graph }//namespace hgl diff --git a/src/SceneGraph/Vulkan/VKArrayBuffer.cpp b/src/SceneGraph/Vulkan/VKArrayBuffer.cpp index fa286e73..7eadb3dc 100644 --- a/src/SceneGraph/Vulkan/VKArrayBuffer.cpp +++ b/src/SceneGraph/Vulkan/VKArrayBuffer.cpp @@ -1,60 +1,65 @@ #include +#include +#include +#include +#include namespace hgl { namespace graph { - /** - * 本类构造函数 - * @param d 设备指针 - * @param s 单个数据长度 - * @param c 数据个数 - */ - GPUArrayBuffer::GPUArrayBuffer(GPUDevice *d,const uint32_t s,const uint32_t c) + GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il) { - device=d; + device=dev; + buffer_usage_flags=flags; + item_length=il; - item_size=s; - count=c; - alloc_count=power_to_2(c); + ubo_offset_alignment=device->GetUBOAlign(); - buf_gpu=nullptr; - buf_cpu=nullptr; - offset=nullptr; + const uint32_t unit_size=hgl_align(item_length,ubo_offset_alignment); + + vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment + MemoryBlock *mb=new MemoryBlock(vk_ma); + + coll=new Collection(unit_size,mb); } GPUArrayBuffer::~GPUArrayBuffer() { - SAFE_CLEAR_ARRAY(offset); - SAFE_CLEAR(buf_gpu); + delete coll; + } + + const uint32_t GPUArrayBuffer::GetUnitSize()const + { + return coll->GetUnitBytes(); + } + + DeviceBuffer *GPUArrayBuffer::GetBuffer() + { + return vk_ma->GetBuffer(); + } + + uint32 GPUArrayBuffer::Alloc(const uint32 max_count) ///<预分配空间 + { + if(!coll->Alloc(max_count)) + return(0); + + return coll->GetAllocCount(); } void GPUArrayBuffer::Clear() { - count=0; + coll->Clear(); } - bool GPUArrayBuffer::Init(const uint32_t c) + void *GPUArrayBuffer::Map(const uint32 start,const uint32 count) { - if(c<=0)return(false); + return coll->Map(start,count); + } - if(!buf_gpu) - { - count=c; - alloc_count=power_to_2(count); - - total_bytes=item_size*alloc_count; - - if(total_bytes<=0)return(false); - - buf_gpu=device->CreateUBO(total_bytes); - buf_cpu=(uint8 *)(buf_gpu->Map()); - - offset=new uint32_t[alloc_count]; - } - else - { - } + void GPUArrayBuffer::Flush(const uint32 count) + { + vk_ma->Flush(count*GetUnitSize()); } }//namespace graph }//namespace hgl From 19a20411d8e40b8ebd6c0b50fbe787c53f1e38b1 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Fri, 24 Mar 2023 22:14:05 +0800 Subject: [PATCH 2/7] supported SSBAlign in ArrayBuffer --- inc/hgl/graph/VKArrayBuffer.h | 6 +++--- inc/hgl/graph/VKDevice.h | 1 + src/SceneGraph/Vulkan/VKArrayBuffer.cpp | 14 +++++++++++--- src/SceneGraph/Vulkan/VKDeviceBuffer.cpp | 5 +++++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/inc/hgl/graph/VKArrayBuffer.h b/inc/hgl/graph/VKArrayBuffer.h index 9aafb12a..e40bdd74 100644 --- a/inc/hgl/graph/VKArrayBuffer.h +++ b/inc/hgl/graph/VKArrayBuffer.h @@ -25,16 +25,16 @@ namespace hgl VKMemoryAllocator *vk_ma; - uint32_t ubo_offset_alignment; + uint32_t offset_alignment; Collection *coll; public: - GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il); + GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt); virtual ~GPUArrayBuffer(); - const uint32_t GetOffsetAlignment()const{return ubo_offset_alignment;} + const uint32_t GetOffsetAlignment()const{return offset_alignment;} const uint32_t GetUnitSize()const; DeviceBuffer * GetBuffer(); diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index a3904473..9b8e20ee 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -140,6 +140,7 @@ public: //Buffer相关 IndexBuffer * CreateIBO32 ( uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U32, count,nullptr,sm);} const VkDeviceSize GetUBOAlign(); + const VkDeviceSize GetSSBOAlign(); #define CREATE_BUFFER_OBJECT(LargeName,type) DeviceBuffer *Create##LargeName( VkDeviceSize size,void *data, SharingMode sm=SharingMode::Exclusive) {return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size ,size,data, sm);} \ DeviceBuffer *Create##LargeName( VkDeviceSize size, SharingMode sm=SharingMode::Exclusive) {return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size ,size,nullptr, sm);} \ diff --git a/src/SceneGraph/Vulkan/VKArrayBuffer.cpp b/src/SceneGraph/Vulkan/VKArrayBuffer.cpp index 7eadb3dc..093254be 100644 --- a/src/SceneGraph/Vulkan/VKArrayBuffer.cpp +++ b/src/SceneGraph/Vulkan/VKArrayBuffer.cpp @@ -8,15 +8,23 @@ namespace hgl { namespace graph { - GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il) + GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt) { device=dev; buffer_usage_flags=flags; item_length=il; - ubo_offset_alignment=device->GetUBOAlign(); + if(dt==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER + ||dt==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) + offset_alignment=device->GetUBOAlign(); + else + if(dt==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER + ||dt==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) + offset_alignment=device->GetSSBOAlign(); + else + offset_alignment=0; - const uint32_t unit_size=hgl_align(item_length,ubo_offset_alignment); + const uint32_t unit_size=hgl_align(item_length,offset_alignment); vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment MemoryBlock *mb=new MemoryBlock(vk_ma); diff --git a/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp b/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp index 978a8b64..5e53feaf 100644 --- a/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp @@ -9,6 +9,11 @@ const VkDeviceSize GPUDevice::GetUBOAlign() return attr->physical_device->GetUBOAlign(); } +const VkDeviceSize GPUDevice::GetSSBOAlign() +{ + return attr->physical_device->GetSSBOAlign(); +} + bool GPUDevice::CreateBuffer(DeviceBufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize range,VkDeviceSize size,const void *data,SharingMode sharing_mode) { BufferCreateInfo buf_info; From 8e52595123646225d87f22a3e58b3ec4e5ab588f Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Fri, 24 Mar 2023 22:14:43 +0800 Subject: [PATCH 3/7] standalone RenderList2D --- example/Vulkan/third_triangle.cpp | 7 ++- inc/hgl/graph/RenderList.h | 57 ++++--------------- inc/hgl/graph/RenderList2D.h | 77 ++++++------------------- inc/hgl/graph/RenderNode2D.h | 18 +----- inc/hgl/graph/VKMaterial.h | 2 + inc/hgl/graph/VKMaterialParameters.h | 1 - src/SceneGraph/CMakeLists.txt | 6 +- src/SceneGraph/RenderList2D.cpp | 84 +++++++++++----------------- 8 files changed, 73 insertions(+), 179 deletions(-) diff --git a/example/Vulkan/third_triangle.cpp b/example/Vulkan/third_triangle.cpp index 3ce1d3de..d47bea90 100644 --- a/example/Vulkan/third_triangle.cpp +++ b/example/Vulkan/third_triangle.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace hgl; using namespace hgl::graph; @@ -33,7 +34,7 @@ class TestApp:public VulkanApplicationFramework private: SceneNode render_root; - RenderList * render_list =nullptr; + RenderList2D * render_list =nullptr; MaterialInstance * material_instance =nullptr; Renderable * render_obj =nullptr; @@ -73,7 +74,7 @@ private: render_root.RefreshMatrix(); - render_list->Expend(GetCameraInfo(),&render_root); + render_list->Expend(&render_root); return(true); } @@ -90,7 +91,7 @@ public: if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); - render_list=new RenderList(device); + render_list=new RenderList2D(device); if(!InitMaterial()) return(false); diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index e28a34d8..24977cc2 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -13,25 +13,26 @@ namespace hgl { namespace graph { - using MaterialSets=SortedSets; - /** * 渲染对象列表
* 已经展开的渲染对象列表,产生mvp用UBO/SSBO等数据,最终创建RenderCommandBuffer */ class RenderList { - protected: + protected: - GPUDevice * device; - RenderCmdBuffer *cmd_buf; + GPUDevice * device; + RenderCmdBuffer * cmd_buf; private: - RenderNodeList render_node_list; ///<场景节点列表 - MaterialSets material_sets; ///<材质合集 + GPUArrayBuffer * mvp_array; + CameraInfo camera_info; - RenderNodeComparator *render_node_comparator; + RenderNode3DList render_node_list; ///<场景节点列表 + MaterialSets material_sets; ///<材质合集 + + RenderNode3DComparator *render_node_comparator; private: @@ -61,49 +62,11 @@ namespace hgl RenderList(GPUDevice *); virtual ~RenderList(); - + virtual bool Expend(const CameraInfo &,SceneNode *); virtual bool Render(RenderCmdBuffer *); };//class RenderList - - class RenderList2D:public RenderList - { - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList2D(); - virtual ~RenderList2D() override; - - virtual bool Expend(SceneNode *); - }; - - class RenderList3D:public RenderList - { - protected: - - CameraInfo camera_info; - GPUArrayBuffer *mvp_array; - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList3D(); - virtual ~RenderList3D() override; - - bool Expend(const CameraInfo &,SceneNode *); - }; }//namespace graph }//namespace hgl #endif//HGL_GRAPH_RENDER_LIST_INCLUDE diff --git a/inc/hgl/graph/RenderList2D.h b/inc/hgl/graph/RenderList2D.h index e28a34d8..ea1aa903 100644 --- a/inc/hgl/graph/RenderList2D.h +++ b/inc/hgl/graph/RenderList2D.h @@ -1,37 +1,34 @@ -#ifndef HGL_GRAPH_RENDER_LIST_INCLUDE -#define HGL_GRAPH_RENDER_LIST_INCLUDE +#ifndef HGL_GRAPH_RENDER_LIST_2D_INCLUDE +#define HGL_GRAPH_RENDER_LIST_2D_INCLUDE #include -#include #include -#include +#include #include -#include -#include -#include +#include namespace hgl { namespace graph { - using MaterialSets=SortedSets; - /** * 渲染对象列表
* 已经展开的渲染对象列表,产生mvp用UBO/SSBO等数据,最终创建RenderCommandBuffer */ - class RenderList + class RenderList2D { protected: - GPUDevice * device; - RenderCmdBuffer *cmd_buf; + GPUDevice * device; + RenderCmdBuffer * cmd_buf; private: - RenderNodeList render_node_list; ///<场景节点列表 - MaterialSets material_sets; ///<材质合集 +// GPUArrayBuffer * mvp_array; - RenderNodeComparator *render_node_comparator; + RenderNode2DList render_node_list; ///<场景节点列表 + MaterialSets material_sets; ///<材质合集 + + RenderNode2DComparator render_node_comparator; private: @@ -46,7 +43,7 @@ namespace hgl protected: virtual bool Begin(); - virtual bool Expend(SceneNode *); + virtual bool ExpendNode(SceneNode *); virtual void End(); private: @@ -59,51 +56,13 @@ namespace hgl public: - RenderList(GPUDevice *); - virtual ~RenderList(); + RenderList2D(GPUDevice *); + virtual ~RenderList2D(); - virtual bool Expend(const CameraInfo &,SceneNode *); + virtual bool Expend(SceneNode *); virtual bool Render(RenderCmdBuffer *); - };//class RenderList - - class RenderList2D:public RenderList - { - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList2D(); - virtual ~RenderList2D() override; - - virtual bool Expend(SceneNode *); - }; - - class RenderList3D:public RenderList - { - protected: - - CameraInfo camera_info; - GPUArrayBuffer *mvp_array; - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList3D(); - virtual ~RenderList3D() override; - - bool Expend(const CameraInfo &,SceneNode *); - }; + };//class RenderList2D }//namespace graph }//namespace hgl -#endif//HGL_GRAPH_RENDER_LIST_INCLUDE +#endif//HGL_GRAPH_RENDER_LIST_2D_INCLUDE diff --git a/inc/hgl/graph/RenderNode2D.h b/inc/hgl/graph/RenderNode2D.h index 40efcee2..c125bfec 100644 --- a/inc/hgl/graph/RenderNode2D.h +++ b/inc/hgl/graph/RenderNode2D.h @@ -1,30 +1,16 @@ #ifndef HGL_GRAPH_RENDER_NODE_2D_INCLUDE #define HGL_GRAPH_RENDER_NODE_2D_INCLUDE -#include -#include -#include +#include namespace hgl { namespace graph { class Renderable; - struct Transiton2D - { - Vector2f move; - Vector2f center; //中心点 - - //下方的不管是缩放还是旋转,均以上面的center为中心变换 - - Vector2f scale; - float rotate; - float z; - }; - struct RenderNode2D { - Transiton2D trans; + Matrix3x4f local_to_world; Renderable *ri; }; diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 868ad7a0..354d95a6 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -78,5 +78,7 @@ public: bool Release(VIL *); const uint GetVILCount(); };//class Material + +using MaterialSets=SortedSets; VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE diff --git a/inc/hgl/graph/VKMaterialParameters.h b/inc/hgl/graph/VKMaterialParameters.h index 23002f31..6b575bd0 100644 --- a/inc/hgl/graph/VKMaterialParameters.h +++ b/inc/hgl/graph/VKMaterialParameters.h @@ -43,7 +43,6 @@ public: public: #define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;} - MP_TYPE_IS(Skeleton) MP_TYPE_IS(Instance) MP_TYPE_IS(PerObject) MP_TYPE_IS(PerMaterial) diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index cb4e35f6..43e66447 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -41,9 +41,10 @@ SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/SceneInfo.h ${SG_INCLUDE_PATH}/RenderList2D.h ) -SET(SCENE_GRAPH_SOURCE RenderList.cpp +SET(SCENE_GRAPH_SOURCE + #RenderList.cpp RenderList2D.cpp - RenderList3D.cpp + #RenderList3D.cpp SceneNode.cpp SceneOrient.cpp) @@ -118,6 +119,7 @@ SET(VK_MEMORY_SOURCE ${SG_INCLUDE_PATH}/VKMemory.h Vulkan/VKMemory.cpp Vulkan/VKMemoryAllocator.cpp Vulkan/VKBuffer.cpp + Vulkan/VKArrayBuffer.cpp ) SET(VK_DEVICE_TEXTURE_SOURCE Vulkan/Texture/BufferImageCopy2D.h diff --git a/src/SceneGraph/RenderList2D.cpp b/src/SceneGraph/RenderList2D.cpp index 45d69787..63458df0 100644 --- a/src/SceneGraph/RenderList2D.cpp +++ b/src/SceneGraph/RenderList2D.cpp @@ -1,5 +1,4 @@ -#include -#include +#include #include #include #include @@ -15,11 +14,10 @@ * for(pipeline) * for(material_instance) * for(vbo) -* for(distance) */ template<> -int Comparator::compare(const RenderNode3DPointer &obj_one,const RenderNode3DPointer &obj_two) const +int Comparator::compare(const RenderNode2DPointer &obj_one,const RenderNode2DPointer &obj_two) const { int off; @@ -58,17 +56,6 @@ int Comparator::compare(const RenderNode3DPointer &obj_one, return off; } - //比较距离 - { - const double dist=obj_one->distance_to_camera_square- - obj_two->distance_to_camera_square; - - //由于距离差距可能会小于1,但又返回int,所以需要做如此处理 - - if(dist>0)return 1;else - if(dist<0)return -1; - } - return 0; } @@ -76,7 +63,7 @@ namespace hgl { namespace graph { - RenderList::RenderList(GPUDevice *dev) + RenderList2D::RenderList2D(GPUDevice *dev) { device =dev; cmd_buf =nullptr; @@ -87,13 +74,15 @@ namespace hgl last_pipeline =nullptr; hgl_zero(last_mp); last_vbo =0; + +// mvp_array =new GPUArrayBuffer(device,VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,MVPMatrixBytes); } - RenderList::~RenderList() + RenderList2D::~RenderList2D() { } - bool RenderList::Begin() + bool RenderList2D::Begin() { render_node_list.ClearData(); ri_list.ClearData(); @@ -103,7 +92,7 @@ namespace hgl return(true); } - void RenderList::End() + void RenderList2D::End() { if(render_node_list.GetCount()<=0)return; @@ -116,46 +105,46 @@ namespace hgl { //按当前总节点数量分配UBO - mvp_array->Alloc(count); - mvp_array->Clear(); +// mvp_array->Alloc(count); +// mvp_array->Clear(); ri_list.ClearData(); - ri_list.SetCount(count); + ri_list.SetCount(count); } { - ubo_align=mvp_array->GetUnitSize(); +// ubo_align=mvp_array->GetUnitSize(); - char *mp=(char *)(mvp_array->Map(0,count)); +// char *mp=(char *)(mvp_array->Map(0,count)); Renderable **ri=ri_list.GetData(); - for(RenderNode *node:render_node_list) //未来可能要在Expend处考虑做去重 + for(RenderNode2D *node:render_node_list) //未来可能要在Expend处考虑做去重 { - memcpy(mp,&(node->matrix),MVPMatrixBytes); - mp+=ubo_align; +// memcpy(mp,&(node->matrix),MVPMatrixBytes); +// mp+=ubo_align; (*ri)=node->ri; ++ri; } - mvp_array->Flush(count); +// mvp_array->Flush(count); } } //为所有的材质绑定 - for(Material *mtl:material_sets) - { - MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject); + //for(Material *mtl:material_sets) + //{ + // MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject); - if(mp) - { - if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) - mp->Update(); - } - } + // if(mp) + // { + // if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) + // mp->Update(); + // } + //} } - bool RenderList::Expend(SceneNode *sn) + bool RenderList2D::ExpendNode(SceneNode *sn) { if(!sn)return(false); @@ -163,14 +152,9 @@ namespace hgl if(ri) { - RenderNode *rn=new RenderNode; + RenderNode2D *rn=new RenderNode2D; - rn->matrix.Set(sn->GetLocalToWorldMatrix(),camera_info.vp,camera_info.view); - - rn->WorldCenter=sn->GetWorldCenter(); - - rn->distance_to_camera_square=length_squared(rn->WorldCenter,camera_info.pos); -// rn->distance_to_camera=sqrtf(rn->distance_to_camera_square); + rn->local_to_world=sn->GetLocalToWorldMatrix(); rn->ri=ri; @@ -185,20 +169,18 @@ namespace hgl return(true); } - bool RenderList::Expend(const CameraInfo &ci,SceneNode *sn) + bool RenderList2D::Expend(SceneNode *sn) { if(!device|!sn)return(false); - camera_info=ci; - Begin(); - Expend(sn); + ExpendNode(sn); End(); return(true); } - void RenderList::Render(Renderable *ri) + void RenderList2D::Render(Renderable *ri) { if(last_pipeline!=ri->GetPipeline()) { @@ -273,7 +255,7 @@ namespace hgl } } - bool RenderList::Render(RenderCmdBuffer *cb) + bool RenderList2D::Render(RenderCmdBuffer *cb) { if(!cb) return(false); From fd39d08fda2ced9408f38bc2832d34dfcf0a6a60 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo)" Date: Fri, 24 Mar 2023 22:43:04 +0800 Subject: [PATCH 4/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6889903..8bdaf21a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ULRE -experiment project - Ultra Light Rendering Engine +experiment project - Ultra Lightweight Rendering Engine ULRE is a project of experimental nature,Used to experiment with various rendering related techniques,And do some examples. From 0457d28577047723fa542a79d4c72864667c65b7 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Sat, 25 Mar 2023 15:47:08 +0800 Subject: [PATCH 5/7] fixed lost of #include --- example/common/VulkanAppFramework.h | 8 ++++---- inc/hgl/graph/RenderList.h | 2 +- src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp | 1 + src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 8209375b..f81b6b2a 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -248,7 +248,7 @@ public: return BuildCommandBuffer(sc_render_target->GetCurrentFrameIndices(),ri); } - void BuildCommandBuffer(uint32_t index,RenderList *rl) + void BuildCommandBuffer(uint32_t index,RenderList2D *rl) { if(!rl)return; @@ -263,13 +263,13 @@ public: cb->End(); } - void BuildCommandBuffer(RenderList *rl) + void BuildCommandBuffer(RenderList2D *rl) { for(int32_t i=0;iGetCurrentFrameIndices(),rl); } diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index 24977cc2..b9ee0643 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -8,7 +8,7 @@ #include #include #include -#include +#include namespace hgl { namespace graph diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp index 96ef570d..86f5c53b 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp @@ -1,5 +1,6 @@ #include #include +#include VK_NAMESPACE_BEGIN bool GPUDevice::CheckFormatSupport(const VkFormat format,const uint32_t bits,ImageTiling tiling) const diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp index e5a47285..cbf3630c 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include"BufferImageCopy2D.h" VK_NAMESPACE_BEGIN void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32_t layer_count); From fefdc196749ebe2413cc0635bcf142ea7559c0fe Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Sat, 25 Mar 2023 23:11:43 +0800 Subject: [PATCH 6/7] added GetBindingMap at MaterialDescriptorManager and MaterialParameters --- inc/hgl/graph/VKMaterialDescriptorManager.h | 10 +++++++++- inc/hgl/graph/VKMaterialParameters.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/inc/hgl/graph/VKMaterialDescriptorManager.h b/inc/hgl/graph/VKMaterialDescriptorManager.h index 331890df..5e420e9b 100644 --- a/inc/hgl/graph/VKMaterialDescriptorManager.h +++ b/inc/hgl/graph/VKMaterialDescriptorManager.h @@ -5,11 +5,14 @@ #include VK_NAMESPACE_BEGIN +using BindingMap=Map; +using BindingMapArray=BindingMap[VK_DESCRIPTOR_TYPE_RANGE_SIZE]; + class MaterialDescriptorManager { UTF8String mtl_name; - Map binding_map[DESCRIPTOR_SET_TYPE_COUNT][VK_DESCRIPTOR_TYPE_RANGE_SIZE]; + BindingMapArray binding_map[DESCRIPTOR_SET_TYPE_COUNT]; private: @@ -32,6 +35,11 @@ public: return dsl_ci[size_t(set_type)].bindingCount; } + const BindingMapArray &GetBindingMap(const DescriptorSetType &set_type)const + { + return binding_map[size_t(set_type)]; + } + const int GetBinding(const DescriptorSetType &set_type,const VkDescriptorType &desc_type,const AnsiString &name)const; const int GetUBO (const DescriptorSetType &set_type,const AnsiString &name,bool dynamic)const{return GetBinding(set_type,dynamic?VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,name);} diff --git a/inc/hgl/graph/VKMaterialParameters.h b/inc/hgl/graph/VKMaterialParameters.h index 6b575bd0..dc478f12 100644 --- a/inc/hgl/graph/VKMaterialParameters.h +++ b/inc/hgl/graph/VKMaterialParameters.h @@ -31,6 +31,7 @@ public: const VkDescriptorSet GetVkDescriptorSet ()const{return descriptor_set->GetDescriptorSet();} const uint32_t GetDescriptorCount ()const{return desc_manager->GetBindCount(set_type);} ///<获取总共需要绑定的描述符数量 + const BindingMapArray & GetBindingMap ()const{return desc_manager->GetBindingMap(set_type);} const uint32_t GetDynamicCount ()const //返回动态ubo/ssbo总量 { From 6c3e674d23eaa19178bd8c29361d7687d15b26de Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Sat, 25 Mar 2023 23:12:08 +0800 Subject: [PATCH 7/7] used DescriptorBinding in Global Binding --- example/Vulkan/second_triangle.cpp | 2 +- example/common/VulkanAppFramework.h | 2 +- inc/hgl/graph/VKDescriptorBindingManage.h | 91 +++++++++++++++++++ inc/hgl/graph/VKRenderResource.h | 14 ++- src/SceneGraph/CMakeLists.txt | 2 + .../Vulkan/VKDescriptorBindingManage.cpp | 44 +++++++++ src/SceneGraph/Vulkan/VKRenderResource.cpp | 55 ----------- 7 files changed, 145 insertions(+), 65 deletions(-) create mode 100644 inc/hgl/graph/VKDescriptorBindingManage.h create mode 100644 src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp diff --git a/example/Vulkan/second_triangle.cpp b/example/Vulkan/second_triangle.cpp index 1daeb5d2..e035a152 100644 --- a/example/Vulkan/second_triangle.cpp +++ b/example/Vulkan/second_triangle.cpp @@ -60,7 +60,7 @@ private: if(!material_instance) return(false); - db->BindGlobalDescriptor(material_instance); + db->BindGlobal(material_instance); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index f81b6b2a..b927f6a2 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -142,7 +142,7 @@ public: ubo_vp_info=db->CreateUBO(sizeof(ViewportInfo),&vp_info); - db->SetGlobal(GlobalDescriptor::ViewportInfo.name,ubo_vp_info); + db->AddGlobalUBO(GlobalDescriptor::ViewportInfo.name,ubo_vp_info); } return(true); diff --git a/inc/hgl/graph/VKDescriptorBindingManage.h b/inc/hgl/graph/VKDescriptorBindingManage.h new file mode 100644 index 00000000..372fd92d --- /dev/null +++ b/inc/hgl/graph/VKDescriptorBindingManage.h @@ -0,0 +1,91 @@ +#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE +#define HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE + +#include +namespace hgl +{ + namespace graph + { + class DeviceBuffer; + class Texture; + class MaterialParameters; + + class DescriptorBinding + { + Map ubo_map; + Map ssbo_map; + Map texture_map; + + public: + + bool AddUBO(const AnsiString &name,DeviceBuffer *buf) + { + if(!buf)return(false); + if(name.IsEmpty())return(false); + + return ubo_map.Add(name,buf); + } + + DeviceBuffer *GetUBO(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); + + return GetListObject(ubo_map,name); + } + + void RemoveUBO(DeviceBuffer *buf) + { + if(!buf)return; + + ubo_map.DeleteByValue(buf); + } + + bool AddSSBO(const AnsiString &name,DeviceBuffer *buf) + { + if(!buf)return(false); + if(name.IsEmpty())return(false); + + return ssbo_map.Add(name,buf); + } + + DeviceBuffer *GetSSBO(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); + + return GetListObject(ssbo_map,name); + } + + void RemoveSSBO(DeviceBuffer *buf) + { + if(!buf)return; + + ssbo_map.DeleteByValue(buf); + } + + bool AddTexture(const AnsiString &name,Texture *tex) + { + if(!tex)return(false); + if(name.IsEmpty())return(false); + + return texture_map.Add(name,tex); + } + + Texture *GetTexture(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); + + return GetListObject(texture_map,name); + } + + void RemoveTexture(Texture *tex) + { + if(!tex)return; + + texture_map.DeleteByValue(tex); + } + + bool Bind(MaterialParameters *); + };//class DescriptorBinding + }//namespace graph +}//namespace hgl +#endif//HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index b52c02e4..becfcd2e 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -15,6 +15,8 @@ #include #include #include +#include + VK_NAMESPACE_BEGIN using MaterialID =int; using MaterialInstanceID =int; @@ -47,8 +49,7 @@ class RenderResource IDResManage rm_textures; ///<纹理合集 IDResManage rm_renderables; ///<渲染实例集合集 - Map global_buffer_map; ///<全局Buffer(UBO/SSBO) - Map global_texture_map; ///<全局Texture + DescriptorBinding global_binding; ///<全局属性描述符绑定管理 public: @@ -68,13 +69,10 @@ public: //Add public: //全局属性(对应shader中的PerGlobal set合集) - void SetGlobal(const AnsiString &name,DeviceBuffer *buf); + void AddGlobalUBO(const AnsiString &name,DeviceBuffer *buf){global_binding.AddUBO(name,buf);} + void AddGlobalSSBO(const AnsiString &name,DeviceBuffer *buf){global_binding.AddSSBO(name,buf);} - DeviceBuffer *GetGlobal(const AnsiString &name); - - void Free(DeviceBuffer *); - - void BindGlobalDescriptor(MaterialInstance *); + bool BindGlobal(MaterialInstance *mi){return global_binding.Bind(mi->GetMP(DescriptorSetType::Global));} public: // VBO/VAO diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 43e66447..e8e1ad60 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -184,6 +184,8 @@ SET(VK_TEXTURE_SOURCE ${SG_INCLUDE_PATH}/VKImageView.h SET(VK_MATERIAL_SOURCE ${SG_INCLUDE_PATH}/VKMaterial.h ${SG_INCLUDE_PATH}/VKMaterialParameters.h ${SG_INCLUDE_PATH}/VKMaterialInstance.h + ${SG_INCLUDE_PATH}/VKDescriptorBindingManage.h + Vulkan/VKDescriptorBindingManage.cpp Vulkan/VKMaterial.cpp Vulkan/VKMaterialParameters.cpp Vulkan/VKMaterialInstance.cpp) diff --git a/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp b/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp new file mode 100644 index 00000000..237eaad1 --- /dev/null +++ b/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp @@ -0,0 +1,44 @@ +#include +#include + +VK_NAMESPACE_BEGIN +bool DescriptorBinding::Bind(MaterialParameters *mp) +{ + if(!mp)return(false); + + { + const auto *dp=ubo_map.GetDataList(); + + for(uint i=0;iBindUBO((*dp)->left,(*dp)->right); + + ++dp; + } + } + + { + const auto *dp=ssbo_map.GetDataList(); + + for(uint i=0;iBindSSBO((*dp)->left,(*dp)->right); + + ++dp; + } + } + + //{ + // const auto *dp=texture_map.GetDataList(); + + // for(uint i=0;iBindImageSampler((*dp)->left,(*dp)->right); + + // ++dp; + // } + //} + + mp->Update(); +} +VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 66f5e32f..6319d05c 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -5,61 +5,6 @@ #include VK_NAMESPACE_BEGIN -void RenderResource::SetGlobal(const AnsiString &name,DeviceBuffer *buf) -{ - if(!buf)return; - if(name.IsEmpty())return; - - global_buffer_map.Add(name,buf); -} - -DeviceBuffer *RenderResource::GetGlobal(const AnsiString &name) -{ - if(name.IsEmpty())return(nullptr); - - DeviceBuffer *buf; - - if(global_buffer_map.Get(name,buf)) - return buf; - else - return nullptr; -} - -void RenderResource::Free(DeviceBuffer *buf) -{ - rm_buffers.Release(buf); - - global_buffer_map.DeleteByValue(buf); -} - -void RenderResource::BindGlobalDescriptor(MaterialInstance *mi) -{ - if(!mi)return; - - const uint count=global_buffer_map.GetCount(); - - if(count<=0)return; - - auto **gb_list=global_buffer_map.GetDataList(); - - auto *mp=mi->GetMP(DescriptorSetType::Global); - - if(!mp) - return; - - if(mp->GetDescriptorCount()<=0) - return; - - for(uint i=0;iBindUBO((*gb_list)->left,(*gb_list)->right); - - ++gb_list; - } - - mp->Update(); -} - VBO *RenderResource::CreateVBO(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode) { VBO *vb=device->CreateVBO(format,count,data,sharing_mode);