Resize buffer if size does not match required size
This commit is contained in:
@@ -305,16 +305,23 @@ namespace OpenVulkano::Vulkan
|
|||||||
ManagedBuffer* ResourceManager::CreateBuffer(vk::DeviceSize size, const vk::BufferUsageFlags& usage, const vk::MemoryPropertyFlags& properties)
|
ManagedBuffer* ResourceManager::CreateBuffer(vk::DeviceSize size, const vk::BufferUsageFlags& usage, const vk::MemoryPropertyFlags& properties)
|
||||||
{
|
{
|
||||||
size = Utils::Align(size, 16);
|
size = Utils::Align(size, 16);
|
||||||
const vk::BufferCreateInfo bufferCreateInfo = { {}, size, usage, vk::SharingMode::eExclusive };
|
vk::BufferCreateInfo bufferCreateInfo = { {}, size, usage, vk::SharingMode::eExclusive };
|
||||||
vk::Buffer buffer = device.createBuffer(bufferCreateInfo);
|
vk::Buffer buffer = device.createBuffer(bufferCreateInfo);
|
||||||
const vk::MemoryRequirements memoryRequirements = device.getBufferMemoryRequirements(buffer);
|
const vk::MemoryRequirements memoryRequirements = device.getBufferMemoryRequirements(buffer);
|
||||||
uint32_t memtype = context->device->GetMemoryType(memoryRequirements.memoryTypeBits, properties);
|
uint32_t memtype = context->device->GetMemoryType(memoryRequirements.memoryTypeBits, properties);
|
||||||
if (memoryRequirements.size != size) Logger::DATA->debug("Memory Requirement Size ({0}) != Size ({1})", memoryRequirements.size, size);
|
if (memoryRequirements.size != size)
|
||||||
MemoryAllocation* allocation = GetFreeMemoryAllocation(memoryRequirements.size, memoryRequirements.alignment, memtype);
|
{
|
||||||
|
Logger::DATA->debug("Memory Requirement Size ({0}) != Size ({1})", memoryRequirements.size, size);
|
||||||
|
size = memoryRequirements.size;
|
||||||
|
device.destroy(buffer);
|
||||||
|
bufferCreateInfo.size = size;
|
||||||
|
buffer = device.createBuffer(bufferCreateInfo);
|
||||||
|
}
|
||||||
|
MemoryAllocation* allocation = GetFreeMemoryAllocation(size, memoryRequirements.alignment, memtype);
|
||||||
uint32_t offset = Utils::Align(allocation->used, memoryRequirements.alignment);
|
uint32_t offset = Utils::Align(allocation->used, memoryRequirements.alignment);
|
||||||
device.bindBufferMemory(buffer, allocation->memory, offset);
|
device.bindBufferMemory(buffer, allocation->memory, offset);
|
||||||
allocation->used += memoryRequirements.size + (offset - allocation->used);
|
allocation->used += size + (offset - allocation->used);
|
||||||
return new ManagedBuffer{ allocation, offset, memoryRequirements.size, buffer, usage, properties, nullptr };
|
return new ManagedBuffer{ allocation, offset, size, buffer, usage, properties, nullptr };
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryAllocation* ResourceManager::CreateMemoryAllocation(size_t size, uint32_t type, bool addToCache)
|
MemoryAllocation* ResourceManager::CreateMemoryAllocation(size_t size, uint32_t type, bool addToCache)
|
||||||
|
|||||||
Reference in New Issue
Block a user