fix transfer buffer record keeping
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details

pull/7/head
cosmonaut 2022-01-20 14:54:47 -08:00
parent 159115cbfa
commit 81d04201d2
1 changed files with 42 additions and 17 deletions

View File

@ -1175,9 +1175,13 @@ typedef struct VulkanTransferBuffer
typedef struct VulkanTransferBufferPool
{
VulkanTransferBuffer **buffers;
uint32_t bufferCount;
uint32_t bufferCapacity;
VulkanTransferBuffer **availableBuffers;
uint32_t availableBufferCount;
uint32_t availableBufferCapacity;
VulkanTransferBuffer **submittedBuffers;
uint32_t submittedBufferCount;
uint32_t submittedBufferCapacity;
} VulkanTransferBufferPool;
typedef struct VulkanCommandPool VulkanCommandPool;
@ -3928,6 +3932,23 @@ static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer)
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->fragmentUniformBufferPool);
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->computeUniformBufferPool);
if (renderer->transferBufferPool.submittedBufferCount + renderer->transferBufferPool.availableBufferCount > renderer->transferBufferPool.availableBufferCapacity)
{
renderer->transferBufferPool.availableBufferCapacity = renderer->transferBufferPool.submittedBufferCount + renderer->transferBufferPool.availableBufferCount;
renderer->transferBufferPool.availableBuffers = SDL_realloc(
renderer->transferBufferPool.availableBuffers,
renderer->transferBufferPool.availableBufferCapacity * sizeof(VulkanTransferBuffer*)
);
}
for (i = 0; i < renderer->transferBufferPool.submittedBufferCount; i += 1)
{
renderer->transferBufferPool.submittedBuffers[i]->offset = 0;
renderer->transferBufferPool.availableBuffers[renderer->transferBufferPool.availableBufferCount] = renderer->transferBufferPool.submittedBuffers[i];
renderer->transferBufferPool.availableBufferCount += 1;
}
renderer->transferBufferPool.submittedBufferCount = 0;
/* Reset descriptor set data */
VULKAN_INTERNAL_ResetDescriptorSetData(renderer);
}
@ -6283,9 +6304,9 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer(
/* Nothing fits, so let's get a transfer buffer from the pool */
for (i = 0; i < renderer->transferBufferPool.bufferCount; i += 1)
for (i = 0; i < renderer->transferBufferPool.availableBufferCount; i += 1)
{
transferBuffer = renderer->transferBufferPool.buffers[i];
transferBuffer = renderer->transferBufferPool.availableBuffers[i];
if (transferBuffer->offset + requiredSize <= transferBuffer->buffer->size)
{
@ -6296,8 +6317,8 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer(
commandBuffer->transferBuffers[commandBuffer->transferBufferCount] = transferBuffer;
commandBuffer->transferBufferCount += 1;
renderer->transferBufferPool.buffers[i] = renderer->transferBufferPool.buffers[renderer->transferBufferPool.bufferCount - 1];
renderer->transferBufferPool.bufferCount -= 1;
renderer->transferBufferPool.availableBuffers[i] = renderer->transferBufferPool.availableBuffers[renderer->transferBufferPool.availableBufferCount - 1];
renderer->transferBufferPool.availableBufferCount -= 1;
return transferBuffer;
}
@ -8429,19 +8450,19 @@ static void VULKAN_INTERNAL_ResetCommandBuffer(
}
/* Return transfer buffers to the pool */
if (renderer->transferBufferPool.bufferCount + commandBuffer->transferBufferCount > renderer->transferBufferPool.bufferCapacity)
if (renderer->transferBufferPool.submittedBufferCount + commandBuffer->transferBufferCount > renderer->transferBufferPool.submittedBufferCapacity)
{
renderer->transferBufferPool.bufferCapacity = renderer->transferBufferPool.bufferCount + commandBuffer->transferBufferCount;
renderer->transferBufferPool.buffers = SDL_realloc(
renderer->transferBufferPool.buffers,
renderer->transferBufferPool.bufferCapacity * sizeof(VulkanTransferBuffer*)
renderer->transferBufferPool.submittedBufferCapacity = renderer->transferBufferPool.submittedBufferCount + commandBuffer->transferBufferCount;
renderer->transferBufferPool.submittedBuffers = SDL_realloc(
renderer->transferBufferPool.submittedBuffers,
renderer->transferBufferPool.submittedBufferCapacity * sizeof(VulkanTransferBuffer*)
);
}
for (i = 0; i < commandBuffer->transferBufferCount; i+= 1)
{
renderer->transferBufferPool.buffers[renderer->transferBufferPool.bufferCount] = commandBuffer->transferBuffers[i];
renderer->transferBufferPool.bufferCount += 1;
renderer->transferBufferPool.submittedBuffers[renderer->transferBufferPool.submittedBufferCount] = commandBuffer->transferBuffers[i];
renderer->transferBufferPool.submittedBufferCount += 1;
}
SDL_free(commandBuffer->transferBuffers);
@ -9820,9 +9841,13 @@ static Refresh_Device* VULKAN_INTERNAL_CreateDevice(
/* Initialize transfer buffer pool */
renderer->transferBufferPool.bufferCapacity = 4;
renderer->transferBufferPool.bufferCount = 0;
renderer->transferBufferPool.buffers = SDL_malloc(renderer->transferBufferPool.bufferCapacity * sizeof(VulkanTransferBuffer*));
renderer->transferBufferPool.availableBufferCapacity = 4;
renderer->transferBufferPool.availableBufferCount = 0;
renderer->transferBufferPool.availableBuffers = SDL_malloc(renderer->transferBufferPool.availableBufferCapacity * sizeof(VulkanTransferBuffer*));
renderer->transferBufferPool.submittedBufferCapacity = 4;
renderer->transferBufferPool.submittedBufferCount = 0;
renderer->transferBufferPool.submittedBuffers = SDL_malloc(renderer->transferBufferPool.submittedBufferCapacity * sizeof(VulkanTransferBuffer*));
/* Deferred destroy storage */