supported SSBAlign in ArrayBuffer

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-24 22:14:05 +08:00
parent 8363275b36
commit 19a20411d8
4 changed files with 20 additions and 6 deletions

View File

@ -25,16 +25,16 @@ namespace hgl
VKMemoryAllocator *vk_ma; VKMemoryAllocator *vk_ma;
uint32_t ubo_offset_alignment; uint32_t offset_alignment;
Collection *coll; Collection *coll;
public: public:
GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il); GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt);
virtual ~GPUArrayBuffer(); virtual ~GPUArrayBuffer();
const uint32_t GetOffsetAlignment()const{return ubo_offset_alignment;} const uint32_t GetOffsetAlignment()const{return offset_alignment;}
const uint32_t GetUnitSize()const; const uint32_t GetUnitSize()const;
DeviceBuffer * GetBuffer(); DeviceBuffer * GetBuffer();

View File

@ -140,6 +140,7 @@ public: //Buffer相关
IndexBuffer * CreateIBO32 ( uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U32, count,nullptr,sm);} IndexBuffer * CreateIBO32 ( uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U32, count,nullptr,sm);}
const VkDeviceSize GetUBOAlign(); 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);} \ #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);} \ DeviceBuffer *Create##LargeName( VkDeviceSize size, SharingMode sm=SharingMode::Exclusive) {return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size ,size,nullptr, sm);} \

View File

@ -8,15 +8,23 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il) GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt)
{ {
device=dev; device=dev;
buffer_usage_flags=flags; buffer_usage_flags=flags;
item_length=il; 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<uint32_t>(item_length,ubo_offset_alignment); const uint32_t unit_size=hgl_align<uint32_t>(item_length,offset_alignment);
vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment 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); MemoryBlock *mb=new MemoryBlock(vk_ma);

View File

@ -9,6 +9,11 @@ const VkDeviceSize GPUDevice::GetUBOAlign()
return attr->physical_device->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) bool GPUDevice::CreateBuffer(DeviceBufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize range,VkDeviceSize size,const void *data,SharingMode sharing_mode)
{ {
BufferCreateInfo buf_info; BufferCreateInfo buf_info;