fix transfer buffer record keeping
parent
159115cbfa
commit
81d04201d2
|
@ -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 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue