From 59b02bcb8c5d0bea0b87e1af4f9071af48d98fee Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Tue, 28 Mar 2023 22:24:22 +0800 Subject: [PATCH] optimized VKArrayBuffer --- inc/hgl/graph/VKArrayBuffer.h | 15 ++++++---- inc/hgl/graph/VKDevice.h | 4 +++ inc/hgl/graph/VKMemoryAllocator.h | 2 +- src/SceneGraph/Vulkan/VKArrayBuffer.cpp | 37 +++++++++++++------------ 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/inc/hgl/graph/VKArrayBuffer.h b/inc/hgl/graph/VKArrayBuffer.h index 19333039..962ddd54 100644 --- a/inc/hgl/graph/VKArrayBuffer.h +++ b/inc/hgl/graph/VKArrayBuffer.h @@ -23,11 +23,10 @@ namespace hgl VkBufferUsageFlags buffer_usage_flags; uint item_length; ///<单个数据长度 + uint unit_size; VKMemoryAllocator *vk_ma; - uint32_t offset_alignment; - Collection *coll; protected: @@ -35,13 +34,17 @@ namespace hgl void * Map(const uint32 start,const uint32 count); void Flush(const uint32 count); + private: + + GPUArrayBuffer(GPUDevice *dev,const VkBufferUsageFlags &flag,const uint il,const uint us); + + friend class GPUDevice; + public: - GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt); virtual ~GPUArrayBuffer(); - const uint32_t GetOffsetAlignment()const{return offset_alignment;} - const uint32_t GetUnitSize()const; + const uint32_t GetUnitSize()const{return unit_size;} DeviceBuffer * GetBuffer(); uint32 Alloc(const uint32 max_count); ///<预分配空间 @@ -56,7 +59,7 @@ namespace hgl if(!ptr)return(false); - ubo_access->Start((uchar *)ptr,offset_alignment,count); + ubo_access->Start((uchar *)ptr,start,count); return(true); } diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 08d2090c..888e18b1 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -22,6 +22,7 @@ VK_NAMESPACE_BEGIN class TileData; class TileFont; class FontSource; +class GPUArrayBuffer; /* * GPU设备创建信息 @@ -148,6 +149,9 @@ public: //Buffer相关 #undef CREATE_BUFFER_OBJECT + GPUArrayBuffer *CreateUBO(const VkDeviceSize &uint_size); + GPUArrayBuffer *CreateSSBO(const VkDeviceSize &uint_size); + public: //Image VkImage CreateImage (VkImageCreateInfo *); diff --git a/inc/hgl/graph/VKMemoryAllocator.h b/inc/hgl/graph/VKMemoryAllocator.h index a97404fd..5fbc9a39 100644 --- a/inc/hgl/graph/VKMemoryAllocator.h +++ b/inc/hgl/graph/VKMemoryAllocator.h @@ -25,7 +25,7 @@ public: const uint32_t GetBufferUsageFlagBits ()const{return buffer_usage_flag_bits;} - DeviceBuffer * GetBuffer (){return gpu_buffer;} + DeviceBuffer * GetBuffer (){return gpu_buffer;} public: diff --git a/src/SceneGraph/Vulkan/VKArrayBuffer.cpp b/src/SceneGraph/Vulkan/VKArrayBuffer.cpp index 093254be..71c3c3d2 100644 --- a/src/SceneGraph/Vulkan/VKArrayBuffer.cpp +++ b/src/SceneGraph/Vulkan/VKArrayBuffer.cpp @@ -8,23 +8,13 @@ namespace hgl { namespace graph { - GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt) + GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,const VkBufferUsageFlags &flag,const uint il,const uint us) { device=dev; - buffer_usage_flags=flags; item_length=il; + buffer_usage_flags=flag; - 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,offset_alignment); + unit_size=hgl_align(item_length,us); 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); @@ -37,11 +27,6 @@ namespace hgl delete coll; } - const uint32_t GPUArrayBuffer::GetUnitSize()const - { - return coll->GetUnitBytes(); - } - DeviceBuffer *GPUArrayBuffer::GetBuffer() { return vk_ma->GetBuffer(); @@ -69,5 +54,21 @@ namespace hgl { vk_ma->Flush(count*GetUnitSize()); } + + GPUArrayBuffer *GPUDevice::CreateUBO(const VkDeviceSize &uint_size) + { + return(new GPUArrayBuffer( this, + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + uint_size, + GetUBOAlign())); + } + + GPUArrayBuffer *GPUDevice::CreateSSBO(const VkDeviceSize &uint_size) + { + return(new GPUArrayBuffer( this, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, + uint_size, + GetSSBOAlign())); + } }//namespace graph }//namespace hgl