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;