diff --git a/include/Refresh.h b/include/Refresh.h index 29fe7f7..bfb8d29 100644 --- a/include/Refresh.h +++ b/include/Refresh.h @@ -1038,6 +1038,7 @@ REFRESHAPI void Refresh_GetBufferData( */ REFRESHAPI void Refresh_QueueDestroyTexture( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Texture *texture ); @@ -1050,6 +1051,7 @@ REFRESHAPI void Refresh_QueueDestroyTexture( */ REFRESHAPI void Refresh_QueueDestroySampler( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Sampler *sampler ); @@ -1062,6 +1064,7 @@ REFRESHAPI void Refresh_QueueDestroySampler( */ REFRESHAPI void Refresh_QueueDestroyBuffer( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Buffer *buffer ); @@ -1074,6 +1077,7 @@ REFRESHAPI void Refresh_QueueDestroyBuffer( */ REFRESHAPI void Refresh_QueueDestroyRenderTarget( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderTarget *renderTarget ); @@ -1086,6 +1090,7 @@ REFRESHAPI void Refresh_QueueDestroyRenderTarget( */ REFRESHAPI void Refresh_QueueDestroyFramebuffer( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Framebuffer *frameBuffer ); @@ -1098,6 +1103,7 @@ REFRESHAPI void Refresh_QueueDestroyFramebuffer( */ REFRESHAPI void Refresh_QueueDestroyShaderModule( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_ShaderModule *shaderModule ); @@ -1110,6 +1116,7 @@ REFRESHAPI void Refresh_QueueDestroyShaderModule( */ REFRESHAPI void Refresh_QueueDestroyRenderPass( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderPass *renderPass ); @@ -1122,6 +1129,7 @@ REFRESHAPI void Refresh_QueueDestroyRenderPass( */ REFRESHAPI void Refresh_QueueDestroyComputePipeline( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_ComputePipeline *computePipeline ); @@ -1134,6 +1142,7 @@ REFRESHAPI void Refresh_QueueDestroyComputePipeline( */ REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_GraphicsPipeline *graphicsPipeline ); diff --git a/src/Refresh.c b/src/Refresh.c index 24f56cb..369aad9 100644 --- a/src/Refresh.c +++ b/src/Refresh.c @@ -542,99 +542,117 @@ void Refresh_GetBufferData( void Refresh_QueueDestroyTexture( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Texture *texture ) { NULL_RETURN(device); device->QueueDestroyTexture( device->driverData, + commandBuffer, texture ); } void Refresh_QueueDestroySampler( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Sampler *sampler ) { NULL_RETURN(device); device->QueueDestroySampler( device->driverData, + commandBuffer, sampler ); } void Refresh_QueueDestroyBuffer( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Buffer *buffer ) { NULL_RETURN(device); device->QueueDestroyBuffer( device->driverData, + commandBuffer, buffer ); } void Refresh_QueueDestroyRenderTarget( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderTarget *renderTarget ) { NULL_RETURN(device); device->QueueDestroyRenderTarget( device->driverData, + commandBuffer, renderTarget ); } void Refresh_QueueDestroyFramebuffer( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_Framebuffer *frameBuffer ) { NULL_RETURN(device); device->QueueDestroyFramebuffer( device->driverData, + commandBuffer, frameBuffer ); } void Refresh_QueueDestroyShaderModule( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_ShaderModule *shaderModule ) { NULL_RETURN(device); device->QueueDestroyShaderModule( device->driverData, + commandBuffer, shaderModule ); } void Refresh_QueueDestroyRenderPass( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderPass *renderPass ) { NULL_RETURN(device); device->QueueDestroyRenderPass( device->driverData, + commandBuffer, renderPass ); } void Refresh_QueueDestroyComputePipeline( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_ComputePipeline *computePipeline ) { NULL_RETURN(device); device->QueueDestroyComputePipeline( device->driverData, + commandBuffer, computePipeline ); } void Refresh_QueueDestroyGraphicsPipeline( Refresh_Device *device, + Refresh_CommandBuffer *commandBuffer, Refresh_GraphicsPipeline *graphicsPipeline ) { NULL_RETURN(device); device->QueueDestroyGraphicsPipeline( device->driverData, + commandBuffer, graphicsPipeline ); } diff --git a/src/Refresh_Driver.h b/src/Refresh_Driver.h index d28582c..948b76a 100644 --- a/src/Refresh_Driver.h +++ b/src/Refresh_Driver.h @@ -361,46 +361,55 @@ struct Refresh_Device void(*QueueDestroyTexture)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Texture *texture ); void(*QueueDestroySampler)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Sampler *sampler ); void(*QueueDestroyBuffer)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Buffer *buffer ); void(*QueueDestroyRenderTarget)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderTarget *renderTarget ); void(*QueueDestroyFramebuffer)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Framebuffer *frameBuffer ); void(*QueueDestroyShaderModule)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_ShaderModule *shaderModule ); void(*QueueDestroyRenderPass)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderPass *renderPass ); void(*QueueDestroyComputePipeline)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_ComputePipeline *computePipeline ); void(*QueueDestroyGraphicsPipeline)( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_GraphicsPipeline *graphicsPipeline ); diff --git a/src/Refresh_Driver_Vulkan.c b/src/Refresh_Driver_Vulkan.c index 8463b80..a2e1a74 100644 --- a/src/Refresh_Driver_Vulkan.c +++ b/src/Refresh_Driver_Vulkan.c @@ -706,14 +706,6 @@ struct VulkanUniformBufferPool VulkanUniformBuffer **availableBuffers; uint32_t availableBufferCount; uint32_t availableBufferCapacity; - - VulkanUniformBuffer **boundBuffers; - uint32_t boundBufferCount; - uint32_t boundBufferCapacity; - - VulkanUniformBuffer **submittedBuffers; - uint32_t submittedBufferCount; - uint32_t submittedBufferCapacity; }; /* Renderer Structure */ @@ -749,6 +741,7 @@ typedef struct VulkanSwapchainData /* Synchronization primitives */ VkSemaphore imageAvailableSemaphore; VkSemaphore renderFinishedSemaphore; + VkFence inFlightFence; /* borrowed from VulkanRenderer */ } VulkanSwapchainData; typedef struct SwapChainSupportDetails @@ -1203,13 +1196,11 @@ typedef struct VulkanTransferBuffer typedef struct VulkanTransferBufferPool { + SDL_mutex *lock; + VulkanTransferBuffer **availableBuffers; uint32_t availableBufferCount; uint32_t availableBufferCapacity; - - VulkanTransferBuffer **submittedBuffers; - uint32_t submittedBufferCount; - uint32_t submittedBufferCapacity; } VulkanTransferBufferPool; typedef struct VulkanCommandPool VulkanCommandPool; @@ -1246,6 +1237,51 @@ typedef struct VulkanCommandBuffer VulkanTransferBuffer** transferBuffers; uint32_t transferBufferCount; + uint32_t transferBufferCapacity; + + VulkanUniformBuffer **boundUniformBuffers; + uint32_t boundUniformBufferCount; + uint32_t boundUniformBufferCapacity; + + /* Deferred destroy storage */ + + VulkanRenderTarget **renderTargetsToDestroy; + uint32_t renderTargetsToDestroyCount; + uint32_t renderTargetsToDestroyCapacity; + + VulkanTexture **texturesToDestroy; + uint32_t texturesToDestroyCount; + uint32_t texturesToDestroyCapacity; + + VulkanBuffer **buffersToDestroy; + uint32_t buffersToDestroyCount; + uint32_t buffersToDestroyCapacity; + + VulkanGraphicsPipeline **graphicsPipelinesToDestroy; + uint32_t graphicsPipelinesToDestroyCount; + uint32_t graphicsPipelinesToDestroyCapacity; + + VulkanComputePipeline **computePipelinesToDestroy; + uint32_t computePipelinesToDestroyCount; + uint32_t computePipelinesToDestroyCapacity; + + VkShaderModule *shaderModulesToDestroy; + uint32_t shaderModulesToDestroyCount; + uint32_t shaderModulesToDestroyCapacity; + + VkSampler *samplersToDestroy; + uint32_t samplersToDestroyCount; + uint32_t samplersToDestroyCapacity; + + VulkanFramebuffer **framebuffersToDestroy; + uint32_t framebuffersToDestroyCount; + uint32_t framebuffersToDestroyCapacity; + + VkRenderPass *renderPassesToDestroy; + uint32_t renderPassesToDestroyCount; + uint32_t renderPassesToDestroyCapacity; + + VkFence inFlightFence; /* borrowed from VulkanRenderer */ } VulkanCommandBuffer; struct VulkanCommandPool @@ -1361,10 +1397,6 @@ typedef struct VulkanRenderer uint32_t availableFenceCount; uint32_t availableFenceCapacity; - VkFence *usedFences; - uint32_t usedFenceCount; - uint32_t usedFenceCapacity; - VulkanCommandBuffer **submittedCommandBuffers; uint32_t submittedCommandBufferCount; uint32_t submittedCommandBufferCapacity; @@ -1402,82 +1434,8 @@ typedef struct VulkanRenderer VkDeviceSize minUBOAlignment; SDL_mutex *allocatorLock; - SDL_mutex *disposeLock; SDL_mutex *submitLock; - - /* Deferred destroy storage */ - - VulkanRenderTarget **renderTargetsToDestroy; - uint32_t renderTargetsToDestroyCount; - uint32_t renderTargetsToDestroyCapacity; - - VulkanRenderTarget **submittedRenderTargetsToDestroy; - uint32_t submittedRenderTargetsToDestroyCount; - uint32_t submittedRenderTargetsToDestroyCapacity; - - VulkanTexture **texturesToDestroy; - uint32_t texturesToDestroyCount; - uint32_t texturesToDestroyCapacity; - - VulkanTexture **submittedTexturesToDestroy; - uint32_t submittedTexturesToDestroyCount; - uint32_t submittedTexturesToDestroyCapacity; - - VulkanBuffer **buffersToDestroy; - uint32_t buffersToDestroyCount; - uint32_t buffersToDestroyCapacity; - - VulkanBuffer **submittedBuffersToDestroy; - uint32_t submittedBuffersToDestroyCount; - uint32_t submittedBuffersToDestroyCapacity; - - VulkanGraphicsPipeline **graphicsPipelinesToDestroy; - uint32_t graphicsPipelinesToDestroyCount; - uint32_t graphicsPipelinesToDestroyCapacity; - - VulkanGraphicsPipeline **submittedGraphicsPipelinesToDestroy; - uint32_t submittedGraphicsPipelinesToDestroyCount; - uint32_t submittedGraphicsPipelinesToDestroyCapacity; - - VulkanComputePipeline **computePipelinesToDestroy; - uint32_t computePipelinesToDestroyCount; - uint32_t computePipelinesToDestroyCapacity; - - VulkanComputePipeline **submittedComputePipelinesToDestroy; - uint32_t submittedComputePipelinesToDestroyCount; - uint32_t submittedComputePipelinesToDestroyCapacity; - - VkShaderModule *shaderModulesToDestroy; - uint32_t shaderModulesToDestroyCount; - uint32_t shaderModulesToDestroyCapacity; - - VkShaderModule *submittedShaderModulesToDestroy; - uint32_t submittedShaderModulesToDestroyCount; - uint32_t submittedShaderModulesToDestroyCapacity; - - VkSampler *samplersToDestroy; - uint32_t samplersToDestroyCount; - uint32_t samplersToDestroyCapacity; - - VkSampler *submittedSamplersToDestroy; - uint32_t submittedSamplersToDestroyCount; - uint32_t submittedSamplersToDestroyCapacity; - - VulkanFramebuffer **framebuffersToDestroy; - uint32_t framebuffersToDestroyCount; - uint32_t framebuffersToDestroyCapacity; - - VulkanFramebuffer **submittedFramebuffersToDestroy; - uint32_t submittedFramebuffersToDestroyCount; - uint32_t submittedFramebuffersToDestroyCapacity; - - VkRenderPass *renderPassesToDestroy; - uint32_t renderPassesToDestroyCount; - uint32_t renderPassesToDestroyCapacity; - - VkRenderPass *submittedRenderPassesToDestroy; - uint32_t submittedRenderPassesToDestroyCount; - uint32_t submittedRenderPassesToDestroyCapacity; + SDL_mutex *acquireFenceLock; #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ vkfntype_##func func; @@ -2507,12 +2465,33 @@ static void VULKAN_INTERNAL_DestroyCommandPool( VulkanRenderer *renderer, VulkanCommandPool *commandPool ) { + uint32_t i; + VulkanCommandBuffer* commandBuffer; + renderer->vkDestroyCommandPool( renderer->logicalDevice, commandPool->commandPool, NULL ); + for (i = 0; i < commandPool->inactiveCommandBufferCount; i += 1) + { + commandBuffer = commandPool->inactiveCommandBuffers[i]; + + SDL_free(commandBuffer->boundUniformBuffers); + SDL_free(commandBuffer->renderTargetsToDestroy); + SDL_free(commandBuffer->texturesToDestroy); + SDL_free(commandBuffer->buffersToDestroy); + SDL_free(commandBuffer->graphicsPipelinesToDestroy); + SDL_free(commandBuffer->computePipelinesToDestroy); + SDL_free(commandBuffer->shaderModulesToDestroy); + SDL_free(commandBuffer->samplersToDestroy); + SDL_free(commandBuffer->framebuffersToDestroy); + SDL_free(commandBuffer->renderPassesToDestroy); + + SDL_free(commandBuffer); + } + SDL_free(commandPool->inactiveCommandBuffers); SDL_free(commandPool); } @@ -3247,14 +3226,6 @@ static VulkanUniformBufferPool* VULKAN_INTERNAL_CreateUniformBufferPool( uniformBufferPool->availableBufferCount = 0; uniformBufferPool->availableBuffers = SDL_malloc(uniformBufferPool->availableBufferCapacity * sizeof(VulkanUniformBuffer*)); - uniformBufferPool->boundBufferCapacity = 16; - uniformBufferPool->boundBufferCount = 0; - uniformBufferPool->boundBuffers = SDL_malloc(uniformBufferPool->boundBufferCapacity * sizeof(VulkanUniformBuffer*)); - - uniformBufferPool->submittedBufferCapacity = 16; - uniformBufferPool->submittedBufferCount = 0; - uniformBufferPool->submittedBuffers = SDL_malloc(uniformBufferPool->submittedBufferCapacity * sizeof(VulkanUniformBuffer*)); - uniformBufferPool->descriptorPool.availableDescriptorSetCount = 0; uniformBufferPool->descriptorPool.descriptorPoolCount = 0; uniformBufferPool->descriptorPool.descriptorPools = NULL; @@ -3264,61 +3235,21 @@ static VulkanUniformBufferPool* VULKAN_INTERNAL_CreateUniformBufferPool( return uniformBufferPool; } -static void VULKAN_INTERNAL_RotateBoundUniformBuffers( - VulkanUniformBufferPool* uniformBufferPool +static void VULKAN_INTERNAL_BindUniformBuffer( + VulkanCommandBuffer *commandBuffer, + VulkanUniformBuffer *uniformBuffer ) { - uint32_t i; - - /* Submitted buffers are now available */ - if ( uniformBufferPool->availableBufferCount + uniformBufferPool->submittedBufferCount >= - uniformBufferPool->availableBufferCapacity - ) { - uniformBufferPool->availableBufferCapacity = uniformBufferPool->availableBufferCount + uniformBufferPool->submittedBufferCount; - uniformBufferPool->availableBuffers = SDL_realloc( - uniformBufferPool->availableBuffers, - uniformBufferPool->availableBufferCapacity * sizeof(VulkanUniformBuffer*) + if (commandBuffer->boundUniformBufferCount >= commandBuffer->boundUniformBufferCapacity) + { + commandBuffer->boundUniformBufferCapacity *= 2; + commandBuffer->boundUniformBuffers = SDL_realloc( + commandBuffer->boundUniformBuffers, + sizeof(VulkanUniformBuffer*) * commandBuffer->boundUniformBufferCapacity ); } - for (i = 0; i < uniformBufferPool->submittedBufferCount; i += 1) - { - uniformBufferPool->availableBuffers[uniformBufferPool->availableBufferCount] = uniformBufferPool->submittedBuffers[i]; - uniformBufferPool->availableBufferCount += 1; - } - - /* Bound buffers are now submitted */ - if (uniformBufferPool->boundBufferCount >= uniformBufferPool->submittedBufferCapacity) - { - uniformBufferPool->submittedBufferCapacity = uniformBufferPool->boundBufferCount; - uniformBufferPool->submittedBuffers = SDL_realloc( - uniformBufferPool->submittedBuffers, - uniformBufferPool->submittedBufferCapacity * sizeof(VulkanUniformBuffer*) - ); - } - - for (i = 0; i < uniformBufferPool->boundBufferCount; i += 1) - { - uniformBufferPool->submittedBuffers[i] = uniformBufferPool->boundBuffers[i]; - } - uniformBufferPool->submittedBufferCount = uniformBufferPool->boundBufferCount; - uniformBufferPool->boundBufferCount = 0; -} - -static void VULKAN_INTERNAL_BindUniformBuffer(VulkanUniformBuffer *uniformBuffer) -{ - VulkanUniformBufferPool *pool = uniformBuffer->pool; - - if (pool->boundBufferCount >= pool->boundBufferCapacity) - { - pool->boundBufferCapacity *= 2; - pool->boundBuffers = SDL_realloc( - pool->boundBuffers, - sizeof(VulkanUniformBuffer*) * pool->boundBufferCapacity - ); - } - - pool->boundBuffers[pool->boundBufferCount] = uniformBuffer; - pool->boundBufferCount += 1; + commandBuffer->boundUniformBuffers[commandBuffer->boundUniformBufferCount] = uniformBuffer; + commandBuffer->boundUniformBufferCount += 1; } static uint8_t VULKAN_INTERNAL_CreateUniformBuffer( @@ -3506,16 +3437,14 @@ static void VULKAN_INTERNAL_DestroyUniformBufferPool( } SDL_free(uniformBufferPool->descriptorPool.descriptorPools); - /* This is always destroyed after rotating twice, so all buffers are available */ + /* This is always destroyed after submissions, so all buffers are available */ for (i = 0; i < uniformBufferPool->availableBufferCount; i += 1) { VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->availableBuffers[i]->vulkanBuffer); } - SDL_free(uniformBufferPool->availableBuffers); - SDL_free(uniformBufferPool->boundBuffers); - SDL_free(uniformBufferPool->submittedBuffers); SDL_DestroyMutex(uniformBufferPool->lock); + SDL_free(uniformBufferPool->availableBuffers); SDL_free(uniformBufferPool); } @@ -3738,264 +3667,6 @@ static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer* renderer) static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer) { - uint32_t i; - - /* Destroy submitted resources */ - - SDL_LockMutex(renderer->disposeLock); - - for (i = 0; i < renderer->submittedRenderTargetsToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyRenderTarget( - renderer, - renderer->submittedRenderTargetsToDestroy[i] - ); - } - renderer->submittedRenderTargetsToDestroyCount = 0; - - for (i = 0; i < renderer->submittedTexturesToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyTexture( - renderer, - renderer->submittedTexturesToDestroy[i] - ); - } - renderer->submittedTexturesToDestroyCount = 0; - - for (i = 0; i < renderer->submittedBuffersToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyBuffer( - renderer, - renderer->submittedBuffersToDestroy[i] - ); - } - renderer->submittedBuffersToDestroyCount = 0; - - for (i = 0; i < renderer->submittedGraphicsPipelinesToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyGraphicsPipeline( - renderer, - renderer->submittedGraphicsPipelinesToDestroy[i] - ); - } - renderer->submittedGraphicsPipelinesToDestroyCount = 0; - - for (i = 0; i < renderer->submittedComputePipelinesToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyComputePipeline( - renderer, - renderer->submittedComputePipelinesToDestroy[i] - ); - } - renderer->submittedComputePipelinesToDestroyCount = 0; - - for (i = 0; i < renderer->submittedShaderModulesToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyShaderModule( - renderer, - renderer->submittedShaderModulesToDestroy[i] - ); - } - renderer->submittedShaderModulesToDestroyCount = 0; - - for (i = 0; i < renderer->submittedSamplersToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroySampler( - renderer, - renderer->submittedSamplersToDestroy[i] - ); - } - renderer->submittedSamplersToDestroyCount = 0; - - for (i = 0; i < renderer->submittedFramebuffersToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyFramebuffer( - renderer, - renderer->submittedFramebuffersToDestroy[i] - ); - } - renderer->submittedFramebuffersToDestroyCount = 0; - - for (i = 0; i < renderer->submittedRenderPassesToDestroyCount; i += 1) - { - VULKAN_INTERNAL_DestroyRenderPass( - renderer, - renderer->submittedRenderPassesToDestroy[i] - ); - } - renderer->submittedRenderPassesToDestroyCount = 0; - - /* Re-size submitted destroy lists */ - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedRenderTargetsToDestroy, - VulkanRenderTarget*, - renderer->renderTargetsToDestroyCount, - renderer->submittedRenderTargetsToDestroyCapacity, - renderer->renderTargetsToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedTexturesToDestroy, - VulkanTexture*, - renderer->texturesToDestroyCount, - renderer->submittedTexturesToDestroyCapacity, - renderer->texturesToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedBuffersToDestroy, - VulkanBuffer*, - renderer->buffersToDestroyCount, - renderer->submittedBuffersToDestroyCapacity, - renderer->buffersToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedGraphicsPipelinesToDestroy, - VulkanGraphicsPipeline*, - renderer->graphicsPipelinesToDestroyCount, - renderer->submittedGraphicsPipelinesToDestroyCapacity, - renderer->graphicsPipelinesToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedComputePipelinesToDestroy, - VulkanComputePipeline*, - renderer->computePipelinesToDestroyCount, - renderer->submittedComputePipelinesToDestroyCapacity, - renderer->computePipelinesToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedShaderModulesToDestroy, - VkShaderModule, - renderer->shaderModulesToDestroyCount, - renderer->submittedShaderModulesToDestroyCapacity, - renderer->shaderModulesToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedSamplersToDestroy, - VkSampler, - renderer->samplersToDestroyCount, - renderer->submittedSamplersToDestroyCapacity, - renderer->samplersToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedFramebuffersToDestroy, - VulkanFramebuffer*, - renderer->framebuffersToDestroyCount, - renderer->submittedFramebuffersToDestroyCapacity, - renderer->framebuffersToDestroyCount - ) - - EXPAND_ARRAY_IF_NEEDED( - renderer->submittedRenderPassesToDestroy, - VkRenderPass, - renderer->renderPassesToDestroyCount, - renderer->submittedRenderPassesToDestroyCapacity, - renderer->renderPassesToDestroyCount - ) - - /* Rotate destroy lists */ - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedRenderTargetsToDestroy, - renderer->submittedRenderTargetsToDestroyCount, - renderer->renderTargetsToDestroy, - renderer->renderTargetsToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedTexturesToDestroy, - renderer->submittedTexturesToDestroyCount, - renderer->texturesToDestroy, - renderer->texturesToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedBuffersToDestroy, - renderer->submittedBuffersToDestroyCount, - renderer->buffersToDestroy, - renderer->buffersToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedGraphicsPipelinesToDestroy, - renderer->submittedGraphicsPipelinesToDestroyCount, - renderer->graphicsPipelinesToDestroy, - renderer->graphicsPipelinesToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedComputePipelinesToDestroy, - renderer->submittedComputePipelinesToDestroyCount, - renderer->computePipelinesToDestroy, - renderer->computePipelinesToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedShaderModulesToDestroy, - renderer->submittedShaderModulesToDestroyCount, - renderer->shaderModulesToDestroy, - renderer->shaderModulesToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedSamplersToDestroy, - renderer->submittedSamplersToDestroyCount, - renderer->samplersToDestroy, - renderer->samplersToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedFramebuffersToDestroy, - renderer->submittedFramebuffersToDestroyCount, - renderer->framebuffersToDestroy, - renderer->framebuffersToDestroyCount - ) - - MOVE_ARRAY_CONTENTS_AND_RESET( - i, - renderer->submittedRenderPassesToDestroy, - renderer->submittedRenderPassesToDestroyCount, - renderer->renderPassesToDestroy, - renderer->renderPassesToDestroyCount - ) - - SDL_UnlockMutex(renderer->disposeLock); - - VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->vertexUniformBufferPool); - 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); } @@ -4560,6 +4231,8 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( &swapchainData->renderFinishedSemaphore ); + swapchainData->inFlightFence = VK_NULL_HANDLE; + SDL_SetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA, swapchainData); if (renderer->swapchainDataCount >= renderer->swapchainDataCapacity) @@ -4637,7 +4310,10 @@ static void VULKAN_INTERNAL_EndCommandBuffer( if ( commandBuffer->computeUniformBuffer != renderer->dummyComputeUniformBuffer && commandBuffer->computeUniformBuffer != NULL ) { - VULKAN_INTERNAL_BindUniformBuffer(commandBuffer->computeUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + commandBuffer, + commandBuffer->computeUniformBuffer + ); } commandBuffer->computeUniformBuffer = NULL; commandBuffer->currentComputePipeline = NULL; @@ -4690,15 +4366,6 @@ static void VULKAN_DestroyDevice( ); } - for (i = 0; i < renderer->usedFenceCount; i += 1) - { - renderer->vkDestroyFence( - renderer->logicalDevice, - renderer->usedFences[i], - NULL - ); - } - for (i = 0; i < NUM_COMMAND_POOL_BUCKETS; i += 1) { commandPoolHashArray = renderer->commandPoolHashTable.buckets[i]; @@ -4870,8 +4537,8 @@ static void VULKAN_DestroyDevice( SDL_free(renderer->memoryAllocator); SDL_DestroyMutex(renderer->allocatorLock); - SDL_DestroyMutex(renderer->disposeLock); SDL_DestroyMutex(renderer->submitLock); + SDL_DestroyMutex(renderer->acquireFenceLock); renderer->vkDestroyDevice(renderer->logicalDevice, NULL); renderer->vkDestroyInstance(renderer->instance, NULL); @@ -6469,26 +6136,36 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( /* Nothing fits, so let's get a transfer buffer from the pool */ + SDL_LockMutex(renderer->transferBufferPool.lock); + for (i = 0; i < renderer->transferBufferPool.availableBufferCount; i += 1) { transferBuffer = renderer->transferBufferPool.availableBuffers[i]; if (transferBuffer->offset + requiredSize <= transferBuffer->buffer->size) { - commandBuffer->transferBuffers = SDL_realloc( - commandBuffer->transferBuffers, - (commandBuffer->transferBufferCount + 1) * sizeof(VulkanTransferBuffer*) - ); + if (commandBuffer->transferBufferCount == commandBuffer->transferBufferCapacity) + { + commandBuffer->transferBufferCapacity *= 2; + commandBuffer->transferBuffers = SDL_realloc( + commandBuffer->transferBuffers, + commandBuffer->transferBufferCapacity * sizeof(VulkanTransferBuffer*) + ); + } + commandBuffer->transferBuffers[commandBuffer->transferBufferCount] = transferBuffer; commandBuffer->transferBufferCount += 1; renderer->transferBufferPool.availableBuffers[i] = renderer->transferBufferPool.availableBuffers[renderer->transferBufferPool.availableBufferCount - 1]; renderer->transferBufferPool.availableBufferCount -= 1; + SDL_UnlockMutex(renderer->transferBufferPool.lock); return transferBuffer; } } + SDL_UnlockMutex(renderer->transferBufferPool.lock); + /* Nothing fits still, so let's create a new transfer buffer */ size = TRANSFER_BUFFER_STARTING_SIZE; @@ -6513,10 +6190,15 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( return NULL; } - commandBuffer->transferBuffers = SDL_realloc( - commandBuffer->transferBuffers, - (commandBuffer->transferBufferCount + 1) * sizeof(VulkanTransferBuffer*) - ); + if (commandBuffer->transferBufferCount == commandBuffer->transferBufferCapacity) + { + commandBuffer->transferBufferCapacity *= 2; + commandBuffer->transferBuffers = SDL_realloc( + commandBuffer->transferBuffers, + commandBuffer->transferBufferCapacity * sizeof(VulkanTransferBuffer*) + ); + } + commandBuffer->transferBuffers[commandBuffer->transferBufferCount] = transferBuffer; commandBuffer->transferBufferCount += 1; @@ -7083,7 +6765,10 @@ static uint32_t VULKAN_PushVertexShaderUniforms( UBO_BUFFER_SIZE ) { /* We're out of space in this buffer, bind the old one and acquire a new one */ - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->vertexUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->vertexUniformBuffer + ); vulkanCommandBuffer->vertexUniformBuffer = VULKAN_INTERNAL_AcquireUniformBufferFromPool( renderer, renderer->vertexUniformBufferPool, @@ -7135,7 +6820,10 @@ static uint32_t VULKAN_PushFragmentShaderUniforms( UBO_BUFFER_SIZE ) { /* We're out of space in this buffer, bind the old one and acquire a new one */ - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->fragmentUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->fragmentUniformBuffer + ); vulkanCommandBuffer->fragmentUniformBuffer = VULKAN_INTERNAL_AcquireUniformBufferFromPool( renderer, renderer->fragmentUniformBufferPool, @@ -7186,7 +6874,10 @@ static uint32_t VULKAN_PushComputeShaderUniforms( UBO_BUFFER_SIZE ) { /* We're out of space in this buffer, bind the old one and acquire a new one */ - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->computeUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->computeUniformBuffer + ); vulkanCommandBuffer->computeUniformBuffer = VULKAN_INTERNAL_AcquireUniformBufferFromPool( renderer, renderer->computeUniformBufferPool, @@ -7697,213 +7388,184 @@ static void VULKAN_CopyTextureToBuffer( static void VULKAN_QueueDestroyTexture( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Texture *texture ) { - VulkanRenderer* renderer = (VulkanRenderer*)driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VulkanTexture* vulkanTexture = (VulkanTexture*)texture; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->texturesToDestroy, + vulkanCommandBuffer->texturesToDestroy, VulkanTexture*, - renderer->texturesToDestroyCount + 1, - renderer->texturesToDestroyCapacity, - renderer->texturesToDestroyCapacity * 2 + vulkanCommandBuffer->texturesToDestroyCount + 1, + vulkanCommandBuffer->texturesToDestroyCapacity, + vulkanCommandBuffer->texturesToDestroyCapacity * 2 ) - renderer->texturesToDestroy[renderer->texturesToDestroyCount] = vulkanTexture; - renderer->texturesToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->texturesToDestroy[vulkanCommandBuffer->texturesToDestroyCount] = vulkanTexture; + vulkanCommandBuffer->texturesToDestroyCount += 1; } static void VULKAN_QueueDestroySampler( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Sampler *sampler ) { - VulkanRenderer* renderer = (VulkanRenderer*)driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VkSampler vulkanSampler = (VkSampler) sampler; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->samplersToDestroy, + vulkanCommandBuffer->samplersToDestroy, VkSampler, - renderer->samplersToDestroyCount + 1, - renderer->samplersToDestroyCapacity, - renderer->samplersToDestroyCapacity * 2 + vulkanCommandBuffer->samplersToDestroyCount + 1, + vulkanCommandBuffer->samplersToDestroyCapacity, + vulkanCommandBuffer->samplersToDestroyCapacity * 2 ) - renderer->samplersToDestroy[renderer->samplersToDestroyCount] = vulkanSampler; - renderer->samplersToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->samplersToDestroy[vulkanCommandBuffer->samplersToDestroyCount] = vulkanSampler; + vulkanCommandBuffer->samplersToDestroyCount += 1; } static void VULKAN_QueueDestroyBuffer( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Buffer *buffer ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->buffersToDestroy, + vulkanCommandBuffer->buffersToDestroy, VulkanBuffer*, - renderer->buffersToDestroyCount + 1, - renderer->buffersToDestroyCapacity, - renderer->buffersToDestroyCapacity * 2 + vulkanCommandBuffer->buffersToDestroyCount + 1, + vulkanCommandBuffer->buffersToDestroyCapacity, + vulkanCommandBuffer->buffersToDestroyCapacity * 2 ) - renderer->buffersToDestroy[ - renderer->buffersToDestroyCount + vulkanCommandBuffer->buffersToDestroy[ + vulkanCommandBuffer->buffersToDestroyCount ] = vulkanBuffer; - renderer->buffersToDestroyCount += 1; - - SDL_free(vulkanBuffer); - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->buffersToDestroyCount += 1; } static void VULKAN_QueueDestroyRenderTarget( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderTarget *renderTarget ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VulkanRenderTarget *vulkanRenderTarget = (VulkanRenderTarget*) renderTarget; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->renderTargetsToDestroy, + vulkanCommandBuffer->renderTargetsToDestroy, VulkanRenderTarget*, - renderer->renderTargetsToDestroyCount + 1, - renderer->renderTargetsToDestroyCapacity, - renderer->renderTargetsToDestroyCapacity * 2 + vulkanCommandBuffer->renderTargetsToDestroyCount + 1, + vulkanCommandBuffer->renderTargetsToDestroyCapacity, + vulkanCommandBuffer->renderTargetsToDestroyCapacity * 2 ) - renderer->renderTargetsToDestroy[renderer->renderTargetsToDestroyCount] = vulkanRenderTarget; - renderer->renderTargetsToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->renderTargetsToDestroy[vulkanCommandBuffer->renderTargetsToDestroyCount] = vulkanRenderTarget; + vulkanCommandBuffer->renderTargetsToDestroyCount += 1; } static void VULKAN_QueueDestroyFramebuffer( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_Framebuffer *framebuffer ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VulkanFramebuffer *vulkanFramebuffer = (VulkanFramebuffer*) framebuffer; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->framebuffersToDestroy, + vulkanCommandBuffer->framebuffersToDestroy, VulkanFramebuffer*, - renderer->framebuffersToDestroyCount + 1, - renderer->framebuffersToDestroyCapacity, - renderer->framebuffersToDestroyCapacity * 2 + vulkanCommandBuffer->framebuffersToDestroyCount + 1, + vulkanCommandBuffer->framebuffersToDestroyCapacity, + vulkanCommandBuffer->framebuffersToDestroyCapacity * 2 ) - renderer->framebuffersToDestroy[renderer->framebuffersToDestroyCount] = vulkanFramebuffer; - renderer->framebuffersToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->framebuffersToDestroy[vulkanCommandBuffer->framebuffersToDestroyCount] = vulkanFramebuffer; + vulkanCommandBuffer->framebuffersToDestroyCount += 1; } static void VULKAN_QueueDestroyShaderModule( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_ShaderModule *shaderModule ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VkShaderModule vulkanShaderModule = (VkShaderModule) shaderModule; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->shaderModulesToDestroy, + vulkanCommandBuffer->shaderModulesToDestroy, VkShaderModule, - renderer->shaderModulesToDestroyCount + 1, - renderer->shaderModulesToDestroyCapacity, - renderer->shaderModulesToDestroyCapacity * 2 + vulkanCommandBuffer->shaderModulesToDestroyCount + 1, + vulkanCommandBuffer->shaderModulesToDestroyCapacity, + vulkanCommandBuffer->shaderModulesToDestroyCapacity * 2 ) - renderer->shaderModulesToDestroy[renderer->shaderModulesToDestroyCount] = vulkanShaderModule; - renderer->shaderModulesToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->shaderModulesToDestroy[vulkanCommandBuffer->shaderModulesToDestroyCount] = vulkanShaderModule; + vulkanCommandBuffer->shaderModulesToDestroyCount += 1; } static void VULKAN_QueueDestroyRenderPass( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_RenderPass *renderPass ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VkRenderPass vulkanRenderPass = (VkRenderPass) renderPass; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->renderPassesToDestroy, + vulkanCommandBuffer->renderPassesToDestroy, VkRenderPass, - renderer->renderPassesToDestroyCount + 1, - renderer->renderPassesToDestroyCapacity, - renderer->renderPassesToDestroyCapacity * 2 + vulkanCommandBuffer->renderPassesToDestroyCount + 1, + vulkanCommandBuffer->renderPassesToDestroyCapacity, + vulkanCommandBuffer->renderPassesToDestroyCapacity * 2 ) - renderer->renderPassesToDestroy[renderer->renderPassesToDestroyCount] = vulkanRenderPass; - renderer->renderPassesToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->renderPassesToDestroy[vulkanCommandBuffer->renderPassesToDestroyCount] = vulkanRenderPass; + vulkanCommandBuffer->renderPassesToDestroyCount += 1; } static void VULKAN_QueueDestroyComputePipeline( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_ComputePipeline *computePipeline ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VulkanComputePipeline *vulkanComputePipeline = (VulkanComputePipeline*) computePipeline; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->computePipelinesToDestroy, + vulkanCommandBuffer->computePipelinesToDestroy, VulkanComputePipeline*, - renderer->computePipelinesToDestroyCount + 1, - renderer->computePipelinesToDestroyCapacity, - renderer->computePipelinesToDestroyCapacity * 2 + vulkanCommandBuffer->computePipelinesToDestroyCount + 1, + vulkanCommandBuffer->computePipelinesToDestroyCapacity, + vulkanCommandBuffer->computePipelinesToDestroyCapacity * 2 ) - renderer->computePipelinesToDestroy[renderer->computePipelinesToDestroyCount] = vulkanComputePipeline; - renderer->computePipelinesToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->computePipelinesToDestroy[vulkanCommandBuffer->computePipelinesToDestroyCount] = vulkanComputePipeline; + vulkanCommandBuffer->computePipelinesToDestroyCount += 1; } static void VULKAN_QueueDestroyGraphicsPipeline( Refresh_Renderer *driverData, + Refresh_CommandBuffer *commandBuffer, Refresh_GraphicsPipeline *graphicsPipeline ) { - VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; VulkanGraphicsPipeline *vulkanGraphicsPipeline = (VulkanGraphicsPipeline*) graphicsPipeline; - SDL_LockMutex(renderer->disposeLock); - EXPAND_ARRAY_IF_NEEDED( - renderer->graphicsPipelinesToDestroy, + vulkanCommandBuffer->graphicsPipelinesToDestroy, VulkanGraphicsPipeline*, - renderer->graphicsPipelinesToDestroyCount + 1, - renderer->graphicsPipelinesToDestroyCapacity, - renderer->graphicsPipelinesToDestroyCapacity * 2 + vulkanCommandBuffer->graphicsPipelinesToDestroyCount + 1, + vulkanCommandBuffer->graphicsPipelinesToDestroyCapacity, + vulkanCommandBuffer->graphicsPipelinesToDestroyCapacity * 2 ) - renderer->graphicsPipelinesToDestroy[renderer->graphicsPipelinesToDestroyCount] = vulkanGraphicsPipeline; - renderer->graphicsPipelinesToDestroyCount += 1; - - SDL_UnlockMutex(renderer->disposeLock); + vulkanCommandBuffer->graphicsPipelinesToDestroy[vulkanCommandBuffer->graphicsPipelinesToDestroyCount] = vulkanGraphicsPipeline; + vulkanCommandBuffer->graphicsPipelinesToDestroyCount += 1; } /* Command Buffer render state */ @@ -8034,14 +7696,20 @@ static void VULKAN_EndRenderPass( if ( vulkanCommandBuffer->vertexUniformBuffer != renderer->dummyVertexUniformBuffer && vulkanCommandBuffer->vertexUniformBuffer != NULL ) { - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->vertexUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->vertexUniformBuffer + ); } vulkanCommandBuffer->vertexUniformBuffer = NULL; if ( vulkanCommandBuffer->fragmentUniformBuffer != renderer->dummyFragmentUniformBuffer && vulkanCommandBuffer->fragmentUniformBuffer != NULL ) { - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->fragmentUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->fragmentUniformBuffer + ); } vulkanCommandBuffer->fragmentUniformBuffer = NULL; @@ -8114,7 +7782,10 @@ static void VULKAN_BindGraphicsPipeline( if ( vulkanCommandBuffer->vertexUniformBuffer != renderer->dummyVertexUniformBuffer && vulkanCommandBuffer->vertexUniformBuffer != NULL ) { - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->vertexUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->vertexUniformBuffer + ); } if (pipeline->vertexUniformBlockSize == 0) @@ -8133,7 +7804,10 @@ static void VULKAN_BindGraphicsPipeline( if ( vulkanCommandBuffer->fragmentUniformBuffer != renderer->dummyFragmentUniformBuffer && vulkanCommandBuffer->fragmentUniformBuffer != NULL ) { - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->fragmentUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->fragmentUniformBuffer + ); } if (pipeline->fragmentUniformBlockSize == 0) @@ -8242,7 +7916,10 @@ static void VULKAN_BindComputePipeline( if ( vulkanCommandBuffer->computeUniformBuffer != renderer->dummyComputeUniformBuffer && vulkanCommandBuffer->computeUniformBuffer != NULL ) { - VULKAN_INTERNAL_BindUniformBuffer(vulkanCommandBuffer->computeUniformBuffer); + VULKAN_INTERNAL_BindUniformBuffer( + vulkanCommandBuffer, + vulkanCommandBuffer->computeUniformBuffer + ); } vulkanCommandBuffer->computeUniformBuffer = NULL; @@ -8381,8 +8058,11 @@ static void VULKAN_INTERNAL_AllocateCommandBuffers( currentVulkanCommandBuffer->commandPool = vulkanCommandPool; currentVulkanCommandBuffer->commandBuffer = commandBuffers[i]; currentVulkanCommandBuffer->boundComputeBufferCount = 0; - currentVulkanCommandBuffer->transferBuffers = NULL; + currentVulkanCommandBuffer->transferBufferCapacity = 4; currentVulkanCommandBuffer->transferBufferCount = 0; + currentVulkanCommandBuffer->transferBuffers = SDL_malloc( + currentVulkanCommandBuffer->transferBufferCapacity * sizeof(VulkanTransferBuffer*) + ); currentVulkanCommandBuffer->present = 0; currentVulkanCommandBuffer->presentWindowHandle = NULL; currentVulkanCommandBuffer->presentSwapchainImageIndex = 0; @@ -8504,6 +8184,88 @@ static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer( commandBuffer->fragmentUniformBuffer = NULL; commandBuffer->computeUniformBuffer = NULL; + /* Bound buffer tracking */ + + commandBuffer->boundUniformBufferCapacity = 16; + commandBuffer->boundUniformBufferCount = 0; + commandBuffer->boundUniformBuffers = SDL_malloc( + commandBuffer->boundUniformBufferCapacity * sizeof(VulkanUniformBuffer*) + ); + + /* Deferred destroy storage */ + + commandBuffer->renderTargetsToDestroyCapacity = 16; + commandBuffer->renderTargetsToDestroyCount = 0; + + commandBuffer->renderTargetsToDestroy = (VulkanRenderTarget**) SDL_malloc( + sizeof(VulkanRenderTarget*) * + commandBuffer->renderTargetsToDestroyCapacity + ); + + commandBuffer->texturesToDestroyCapacity = 16; + commandBuffer->texturesToDestroyCount = 0; + + commandBuffer->texturesToDestroy = (VulkanTexture**)SDL_malloc( + sizeof(VulkanTexture*) * + commandBuffer->texturesToDestroyCapacity + ); + + commandBuffer->buffersToDestroyCapacity = 16; + commandBuffer->buffersToDestroyCount = 0; + + commandBuffer->buffersToDestroy = (VulkanBuffer**) SDL_malloc( + sizeof(VulkanBuffer*) * + commandBuffer->buffersToDestroyCapacity + ); + + commandBuffer->graphicsPipelinesToDestroyCapacity = 16; + commandBuffer->graphicsPipelinesToDestroyCount = 0; + + commandBuffer->graphicsPipelinesToDestroy = (VulkanGraphicsPipeline**) SDL_malloc( + sizeof(VulkanGraphicsPipeline*) * + commandBuffer->graphicsPipelinesToDestroyCapacity + ); + + commandBuffer->computePipelinesToDestroyCapacity = 16; + commandBuffer->computePipelinesToDestroyCount = 0; + + commandBuffer->computePipelinesToDestroy = (VulkanComputePipeline**) SDL_malloc( + sizeof(VulkanComputePipeline*) * + commandBuffer->computePipelinesToDestroyCapacity + ); + + commandBuffer->shaderModulesToDestroyCapacity = 16; + commandBuffer->shaderModulesToDestroyCount = 0; + + commandBuffer->shaderModulesToDestroy = (VkShaderModule*) SDL_malloc( + sizeof(VkShaderModule) * + commandBuffer->shaderModulesToDestroyCapacity + ); + + commandBuffer->samplersToDestroyCapacity = 16; + commandBuffer->samplersToDestroyCount = 0; + + commandBuffer->samplersToDestroy = (VkSampler*) SDL_malloc( + sizeof(VkSampler) * + commandBuffer->samplersToDestroyCapacity + ); + + commandBuffer->framebuffersToDestroyCapacity = 16; + commandBuffer->framebuffersToDestroyCount = 0; + + commandBuffer->framebuffersToDestroy = (VulkanFramebuffer**) SDL_malloc( + sizeof(VulkanFramebuffer*) * + commandBuffer->framebuffersToDestroyCapacity + ); + + commandBuffer->renderPassesToDestroyCapacity = 16; + commandBuffer->renderPassesToDestroyCount = 0; + + commandBuffer->renderPassesToDestroy = (VkRenderPass*) SDL_malloc( + sizeof(VkRenderPass) * + commandBuffer->renderPassesToDestroyCapacity + ); + /* init bound compute buffer array */ for (i = 0; i < MAX_BUFFER_BINDINGS; i += 1) @@ -8635,52 +8397,6 @@ static void VULKAN_QueuePresent( } } -static void VULKAN_INTERNAL_ResetCommandBuffer( - VulkanRenderer *renderer, - VulkanCommandBuffer *commandBuffer -) { - VkResult vulkanResult; - uint32_t i; - VulkanCommandPool *commandPool = commandBuffer->commandPool; - - vulkanResult = renderer->vkResetCommandBuffer( - commandBuffer->commandBuffer, - VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT - ); - - if (vulkanResult != VK_SUCCESS) - { - LogVulkanResultAsError("vkResetCommandBuffer", vulkanResult); - } - - /* Return transfer buffers to the pool */ - if (renderer->transferBufferPool.submittedBufferCount + commandBuffer->transferBufferCount > renderer->transferBufferPool.submittedBufferCapacity) - { - 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.submittedBuffers[renderer->transferBufferPool.submittedBufferCount] = commandBuffer->transferBuffers[i]; - renderer->transferBufferPool.submittedBufferCount += 1; - } - - SDL_free(commandBuffer->transferBuffers); - commandBuffer->transferBuffers = NULL; - commandBuffer->transferBufferCount = 0; - - commandBuffer->submitted = 0; - - commandPool->inactiveCommandBuffers[ - commandPool->inactiveCommandBufferCount - ] = commandBuffer; - commandPool->inactiveCommandBufferCount += 1; -} - /* Synchronization management */ static VkFence VULKAN_INTERNAL_AcquireFence( @@ -8690,6 +8406,8 @@ static VkFence VULKAN_INTERNAL_AcquireFence( VkFence fence; VkResult fenceCreateResult; + SDL_LockMutex(renderer->acquireFenceLock); + if (renderer->availableFenceCount == 0) { fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; @@ -8705,6 +8423,7 @@ static VkFence VULKAN_INTERNAL_AcquireFence( if (fenceCreateResult != VK_SUCCESS) { + SDL_UnlockMutex(renderer->acquireFenceLock); LogVulkanResultAsError("vkCreateFence", fenceCreateResult); return VK_NULL_HANDLE; } @@ -8715,72 +8434,217 @@ static VkFence VULKAN_INTERNAL_AcquireFence( fence = renderer->availableFences[renderer->availableFenceCount - 1]; renderer->availableFenceCount -= 1; - if (renderer->usedFenceCount >= renderer->usedFenceCapacity) - { - renderer->usedFenceCapacity *= 2; - renderer->usedFences = SDL_realloc( - renderer->usedFences, - renderer->usedFenceCapacity * sizeof(VkFence) - ); - } - - renderer->usedFences[renderer->usedFenceCount] = fence; - renderer->usedFenceCount += 1; + SDL_UnlockMutex(renderer->acquireFenceLock); return fence; } -static void VULKAN_INTERNAL_ResetUsedFences( - VulkanRenderer *renderer +/* Submission structure */ + +static void VULKAN_INTERNAL_CleanCommandBuffer( + VulkanRenderer *renderer, + VulkanCommandBuffer *commandBuffer ) { uint32_t i; + VulkanUniformBuffer *uniformBuffer; + VkResult result; - if (renderer->usedFenceCount > 0) + result = renderer->vkResetCommandBuffer( + commandBuffer->commandBuffer, + VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT + ); + + if (result != VK_SUCCESS) { - /* Prepare the command buffer fence for submission */ - renderer->vkResetFences( - renderer->logicalDevice, - renderer->usedFenceCount, - renderer->usedFences - ); + LogVulkanResultAsError("vkResetCommandBuffer", result); + } - /* Used fences are now available */ - if (renderer->usedFenceCount + renderer->availableFenceCount >= renderer->availableFenceCapacity) + commandBuffer->submitted = 0; + + /* Bound uniform buffers are now available */ + + for (i = 0; i < commandBuffer->boundUniformBufferCount; i += 1) + { + uniformBuffer = commandBuffer->boundUniformBuffers[i]; + + SDL_LockMutex(uniformBuffer->pool->lock); + if (uniformBuffer->pool->availableBufferCount == uniformBuffer->pool->availableBufferCapacity) { - renderer->availableFenceCapacity = renderer->usedFenceCount + renderer->availableFenceCount; - renderer->availableFences = SDL_realloc( - renderer->availableFences, - renderer->availableFenceCapacity * sizeof(VkFence) + uniformBuffer->pool->availableBufferCapacity *= 2; + uniformBuffer->pool->availableBuffers = SDL_realloc( + uniformBuffer->pool->availableBuffers, + uniformBuffer->pool->availableBufferCapacity * sizeof(VulkanUniformBuffer*) ); } - for (i = 0; i < renderer->usedFenceCount; i += 1) - { - renderer->availableFences[renderer->availableFenceCount] = renderer->usedFences[i]; - renderer->availableFenceCount += 1; - } - renderer->usedFenceCount = 0; + uniformBuffer->pool->availableBuffers[uniformBuffer->pool->availableBufferCount] = uniformBuffer; + uniformBuffer->pool->availableBufferCount += 1; + SDL_UnlockMutex(uniformBuffer->pool->lock); } -} -/* Submission structure */ + commandBuffer->boundUniformBufferCount = 0; + + SDL_LockMutex(renderer->transferBufferPool.lock); + + if (renderer->transferBufferPool.availableBufferCount + commandBuffer->transferBufferCount >= renderer->transferBufferPool.availableBufferCapacity) + { + renderer->transferBufferPool.availableBufferCapacity = renderer->transferBufferPool.availableBufferCount + commandBuffer->transferBufferCount; + renderer->transferBufferPool.availableBuffers = SDL_realloc( + renderer->transferBufferPool.availableBuffers, + renderer->transferBufferPool.availableBufferCapacity * sizeof(VulkanTransferBuffer*) + ); + } + + for (i = 0; i < commandBuffer->transferBufferCount; i += 1) + { + commandBuffer->transferBuffers[i]->offset = 0; + renderer->transferBufferPool.availableBuffers[renderer->transferBufferPool.availableBufferCount] = commandBuffer->transferBuffers[i]; + renderer->transferBufferPool.availableBufferCount += 1; + } + + SDL_UnlockMutex(renderer->transferBufferPool.lock); + + commandBuffer->transferBufferCount = 0; + + /* Perform pending destroys */ + + for (i = 0; i < commandBuffer->renderTargetsToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyRenderTarget( + renderer, + commandBuffer->renderTargetsToDestroy[i] + ); + } + commandBuffer->renderTargetsToDestroyCount = 0; + + for (i = 0; i < commandBuffer->texturesToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyTexture( + renderer, + commandBuffer->texturesToDestroy[i] + ); + } + commandBuffer->texturesToDestroyCount = 0; + + for (i = 0; i < commandBuffer->buffersToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyBuffer( + renderer, + commandBuffer->buffersToDestroy[i] + ); + } + commandBuffer->buffersToDestroyCount = 0; + + for (i = 0; i < commandBuffer->graphicsPipelinesToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyGraphicsPipeline( + renderer, + commandBuffer->graphicsPipelinesToDestroy[i] + ); + } + commandBuffer->graphicsPipelinesToDestroyCount = 0; + + for (i = 0; i < commandBuffer->computePipelinesToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyComputePipeline( + renderer, + commandBuffer->computePipelinesToDestroy[i] + ); + } + commandBuffer->computePipelinesToDestroyCount = 0; + + for (i = 0; i < commandBuffer->shaderModulesToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyShaderModule( + renderer, + commandBuffer->shaderModulesToDestroy[i] + ); + } + commandBuffer->shaderModulesToDestroyCount = 0; + + for (i = 0; i < commandBuffer->samplersToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroySampler( + renderer, + commandBuffer->samplersToDestroy[i] + ); + } + commandBuffer->samplersToDestroyCount = 0; + + for (i = 0; i < commandBuffer->framebuffersToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyFramebuffer( + renderer, + commandBuffer->framebuffersToDestroy[i] + ); + } + commandBuffer->framebuffersToDestroyCount = 0; + + for (i = 0; i < commandBuffer->renderPassesToDestroyCount; i += 1) + { + VULKAN_INTERNAL_DestroyRenderPass( + renderer, + commandBuffer->renderPassesToDestroy[i] + ); + } + commandBuffer->renderPassesToDestroyCount = 0; + + commandBuffer->commandPool->inactiveCommandBuffers[ + commandBuffer->commandPool->inactiveCommandBufferCount + ] = commandBuffer; + commandBuffer->commandPool->inactiveCommandBufferCount += 1; + + renderer->vkResetFences( + renderer->logicalDevice, + 1, + &commandBuffer->inFlightFence + ); + + SDL_LockMutex(renderer->acquireFenceLock); + + if (renderer->availableFenceCount == renderer->availableFenceCapacity) + { + renderer->availableFenceCapacity *= 2; + renderer->availableFences = SDL_realloc( + renderer->availableFences, + renderer->availableFenceCapacity * sizeof(VkFence) + ); + } + + renderer->availableFences[renderer->availableFenceCount] = commandBuffer->inFlightFence; + renderer->availableFenceCount += 1; + + SDL_UnlockMutex(renderer->acquireFenceLock); + + commandBuffer->inFlightFence = VK_NULL_HANDLE; +} static void VULKAN_Wait( Refresh_Renderer *driverData ) { VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VulkanCommandBuffer *commandBuffer; + VkResult result; + uint32_t i; - if (renderer->usedFenceCount > 0) + for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) { - renderer->vkWaitForFences( + commandBuffer = renderer->submittedCommandBuffers[i]; + + result = renderer->vkWaitForFences( renderer->logicalDevice, - renderer->usedFenceCount, - renderer->usedFences, + 1, + &commandBuffer->inFlightFence, VK_TRUE, UINT64_MAX ); - VULKAN_INTERNAL_ResetUsedFences(renderer); + if (result != VK_SUCCESS) + { + LogVulkanResultAsError("vkWaitForFences", result); + } + + VULKAN_INTERNAL_CleanCommandBuffer(renderer, commandBuffer); } } @@ -8801,10 +8665,31 @@ static void VULKAN_Submit( VkPipelineStageFlags waitStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VulkanSwapchainData *swapchainData; VkFence fence; - uint32_t i; + int32_t i; SDL_LockMutex(renderer->submitLock); + /* Check if we can perform any cleanups */ + for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) + { + /* If we set a timeout of 0, we can query the command buffer state */ + vulkanResult = renderer->vkWaitForFences( + renderer->logicalDevice, + 1, + &renderer->submittedCommandBuffers[i]->inFlightFence, + VK_TRUE, + 0 + ); + + if (vulkanResult == VK_SUCCESS) + { + VULKAN_INTERNAL_CleanCommandBuffer( + renderer, + renderer->submittedCommandBuffers[i] + ); + } + } + commandBuffers = SDL_stack_alloc(VkCommandBuffer, commandBufferCount); submitInfos = SDL_stack_alloc(VkSubmitInfo, commandBufferCount); @@ -8859,43 +8744,34 @@ static void VULKAN_Submit( } } - if (presentCount > 0) + for (i = 0; i < commandBufferCount; i += 1) { - /* Wait for the previous submission to complete */ - if (renderer->usedFenceCount > 0) + currentCommandBuffer = (VulkanCommandBuffer*)pCommandBuffers[i]; + + if (currentCommandBuffer->present) { - vulkanResult = renderer->vkWaitForFences( - renderer->logicalDevice, - renderer->usedFenceCount, - renderer->usedFences, - VK_TRUE, - UINT64_MAX - ); + swapchainData = (VulkanSwapchainData*) SDL_GetWindowData(currentCommandBuffer->presentWindowHandle, WINDOW_SWAPCHAIN_DATA); - if (vulkanResult != VK_SUCCESS) + if (swapchainData->inFlightFence != VK_NULL_HANDLE) { - SDL_UnlockMutex(renderer->submitLock); - LogVulkanResultAsError("vkWaitForFences", vulkanResult); - return; - } - } - - VULKAN_INTERNAL_PostWorkCleanup(renderer); - - /* Reset the previously submitted command buffers */ - for (i = 0; i < renderer->submittedCommandBufferCount; i += 1) - { - if (!renderer->submittedCommandBuffers[i]->fixed) - { - VULKAN_INTERNAL_ResetCommandBuffer( - renderer, - renderer->submittedCommandBuffers[i] + renderer->vkWaitForFences( + renderer->logicalDevice, + 1, + &swapchainData->inFlightFence, + VK_TRUE, + UINT64_MAX ); + + if (vulkanResult != VK_SUCCESS) + { + SDL_UnlockMutex(renderer->submitLock); + LogVulkanResultAsError("vkWaitForFences", vulkanResult); + return; + } + + swapchainData->inFlightFence = VK_NULL_HANDLE; } } - renderer->submittedCommandBufferCount = 0; - - VULKAN_INTERNAL_ResetUsedFences(renderer); } /* Acquire a fence */ @@ -8923,6 +8799,18 @@ static void VULKAN_Submit( return; } + for (i = 0; i < commandBufferCount; i += 1) + { + currentCommandBuffer = (VulkanCommandBuffer*)pCommandBuffers[i]; + currentCommandBuffer->inFlightFence = fence; + + if (currentCommandBuffer->present) + { + swapchainData = (VulkanSwapchainData*) SDL_GetWindowData(currentCommandBuffer->presentWindowHandle, WINDOW_SWAPCHAIN_DATA); + swapchainData->inFlightFence = fence; + } + } + if (renderer->submittedCommandBufferCount + commandBufferCount >= renderer->submittedCommandBufferCapacity) { renderer->submittedCommandBufferCapacity = renderer->submittedCommandBufferCount + commandBufferCount; @@ -9774,8 +9662,8 @@ static Refresh_Device* VULKAN_CreateDevice( /* Threading */ renderer->allocatorLock = SDL_CreateMutex(); - renderer->disposeLock = SDL_CreateMutex(); renderer->submitLock = SDL_CreateMutex(); + renderer->acquireFenceLock = SDL_CreateMutex(); /* Create fence lists */ @@ -9783,10 +9671,6 @@ static Refresh_Device* VULKAN_CreateDevice( renderer->availableFenceCapacity = 4; renderer->availableFences = SDL_malloc(renderer->availableFenceCapacity * sizeof(VkFence)); - renderer->usedFenceCount = 0; - renderer->usedFenceCapacity = 4; - renderer->usedFences = SDL_malloc(renderer->usedFenceCapacity * sizeof(VkFence)); - /* * Create submitted command buffer list */ @@ -10088,161 +9972,12 @@ static Refresh_Device* VULKAN_CreateDevice( } /* Initialize transfer buffer pool */ + renderer->transferBufferPool.lock = SDL_CreateMutex(); 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 */ - - renderer->renderTargetsToDestroyCapacity = 16; - renderer->renderTargetsToDestroyCount = 0; - - renderer->renderTargetsToDestroy = (VulkanRenderTarget**) SDL_malloc( - sizeof(VulkanRenderTarget*) * - renderer->renderTargetsToDestroyCapacity - ); - - renderer->submittedRenderTargetsToDestroyCapacity = 16; - renderer->submittedRenderTargetsToDestroyCount = 0; - - renderer->submittedRenderTargetsToDestroy = (VulkanRenderTarget**) SDL_malloc( - sizeof(VulkanRenderTarget*) * - renderer->submittedRenderTargetsToDestroyCapacity - ); - - renderer->texturesToDestroyCapacity = 16; - renderer->texturesToDestroyCount = 0; - - renderer->texturesToDestroy = (VulkanTexture**)SDL_malloc( - sizeof(VulkanTexture*) * - renderer->texturesToDestroyCapacity - ); - - renderer->submittedTexturesToDestroyCapacity = 16; - renderer->submittedTexturesToDestroyCount = 0; - - renderer->submittedTexturesToDestroy = (VulkanTexture**)SDL_malloc( - sizeof(VulkanTexture*) * - renderer->submittedTexturesToDestroyCapacity - ); - - renderer->buffersToDestroyCapacity = 16; - renderer->buffersToDestroyCount = 0; - - renderer->buffersToDestroy = (VulkanBuffer**) SDL_malloc( - sizeof(VulkanBuffer*) * - renderer->buffersToDestroyCapacity - ); - - renderer->submittedBuffersToDestroyCapacity = 16; - renderer->submittedBuffersToDestroyCount = 0; - - renderer->submittedBuffersToDestroy = (VulkanBuffer**) SDL_malloc( - sizeof(VulkanBuffer*) * - renderer->submittedBuffersToDestroyCapacity - ); - - renderer->graphicsPipelinesToDestroyCapacity = 16; - renderer->graphicsPipelinesToDestroyCount = 0; - - renderer->graphicsPipelinesToDestroy = (VulkanGraphicsPipeline**) SDL_malloc( - sizeof(VulkanGraphicsPipeline*) * - renderer->graphicsPipelinesToDestroyCapacity - ); - - renderer->submittedGraphicsPipelinesToDestroyCapacity = 16; - renderer->submittedGraphicsPipelinesToDestroyCount = 0; - - renderer->submittedGraphicsPipelinesToDestroy = (VulkanGraphicsPipeline**) SDL_malloc( - sizeof(VulkanGraphicsPipeline*) * - renderer->submittedGraphicsPipelinesToDestroyCapacity - ); - - renderer->computePipelinesToDestroyCapacity = 16; - renderer->computePipelinesToDestroyCount = 0; - - renderer->computePipelinesToDestroy = (VulkanComputePipeline**) SDL_malloc( - sizeof(VulkanComputePipeline*) * - renderer->computePipelinesToDestroyCapacity - ); - - renderer->submittedComputePipelinesToDestroyCapacity = 16; - renderer->submittedComputePipelinesToDestroyCount = 0; - - renderer->submittedComputePipelinesToDestroy = (VulkanComputePipeline**) SDL_malloc( - sizeof(VulkanComputePipeline*) * - renderer->submittedComputePipelinesToDestroyCapacity - ); - - renderer->shaderModulesToDestroyCapacity = 16; - renderer->shaderModulesToDestroyCount = 0; - - renderer->shaderModulesToDestroy = (VkShaderModule*) SDL_malloc( - sizeof(VkShaderModule) * - renderer->shaderModulesToDestroyCapacity - ); - - renderer->submittedShaderModulesToDestroyCapacity = 16; - renderer->submittedShaderModulesToDestroyCount = 0; - - renderer->submittedShaderModulesToDestroy = (VkShaderModule*) SDL_malloc( - sizeof(VkShaderModule) * - renderer->submittedShaderModulesToDestroyCapacity - ); - - renderer->samplersToDestroyCapacity = 16; - renderer->samplersToDestroyCount = 0; - - renderer->samplersToDestroy = (VkSampler*) SDL_malloc( - sizeof(VkSampler) * - renderer->samplersToDestroyCapacity - ); - - renderer->submittedSamplersToDestroyCapacity = 16; - renderer->submittedSamplersToDestroyCount = 0; - - renderer->submittedSamplersToDestroy = (VkSampler*) SDL_malloc( - sizeof(VkSampler) * - renderer->submittedSamplersToDestroyCapacity - ); - - renderer->framebuffersToDestroyCapacity = 16; - renderer->framebuffersToDestroyCount = 0; - - renderer->framebuffersToDestroy = (VulkanFramebuffer**) SDL_malloc( - sizeof(VulkanFramebuffer*) * - renderer->framebuffersToDestroyCapacity - ); - - renderer->submittedFramebuffersToDestroyCapacity = 16; - renderer->submittedFramebuffersToDestroyCount = 0; - - renderer->submittedFramebuffersToDestroy = (VulkanFramebuffer**) SDL_malloc( - sizeof(VulkanFramebuffer*) * - renderer->submittedFramebuffersToDestroyCapacity - ); - - renderer->renderPassesToDestroyCapacity = 16; - renderer->renderPassesToDestroyCount = 0; - - renderer->renderPassesToDestroy = (VkRenderPass*) SDL_malloc( - sizeof(VkRenderPass) * - renderer->renderPassesToDestroyCapacity - ); - - renderer->submittedRenderPassesToDestroyCapacity = 16; - renderer->submittedRenderPassesToDestroyCount = 0; - - renderer->submittedRenderPassesToDestroy = (VkRenderPass*) SDL_malloc( - sizeof(VkRenderPass) * - renderer->submittedRenderPassesToDestroyCapacity - ); - return result; }