diff --git a/src/Refresh_Driver_Vulkan.c b/src/Refresh_Driver_Vulkan.c index 98482a4..52cd6df 100644 --- a/src/Refresh_Driver_Vulkan.c +++ b/src/Refresh_Driver_Vulkan.c @@ -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 */