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