dispose renderpass

submit_rewrite
cosmonaut 2020-12-28 19:44:34 -08:00
parent 2548833525
commit 031f36f450
1 changed files with 81 additions and 5 deletions

View File

@ -1126,6 +1126,14 @@ typedef struct VulkanRenderer
uint32_t submittedFramebuffersToDestroyCount;
uint32_t submittedFramebuffersToDestroyCapacity;
VkRenderPass *renderPassesToDestroy;
uint32_t renderPassesToDestroyCount;
uint32_t renderPassesToDestroyCapacity;
VkRenderPass *submittedRenderPassesToDestroy;
uint32_t submittedRenderPassesToDestroyCount;
uint32_t submittedRenderPassesToDestroyCapacity;
#define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \
vkfntype_##func func;
#define VULKAN_DEVICE_FUNCTION(ext, ret, func, params) \
@ -2044,6 +2052,17 @@ static void VULKAN_INTERNAL_DestroyFramebuffer(
);
}
static void VULKAN_INTERNAL_DestroyRenderPass(
VulkanRenderer *renderer,
VkRenderPass renderPass
) {
renderer->vkDestroyRenderPass(
renderer->logicalDevice,
renderPass,
NULL
);
}
static void VULKAN_INTERNAL_DestroySwapchain(VulkanRenderer* renderer)
{
uint32_t i;
@ -2112,7 +2131,7 @@ static void VULKAN_INTERNAL_DestroySamplerDescriptorSetCache(
SDL_free(cache);
}
static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer)
{
uint32_t i, j;
@ -2183,6 +2202,15 @@ static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
}
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(
@ -2241,6 +2269,14 @@ static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
renderer->framebuffersToDestroyCount
)
EXPAND_ARRAY_IF_NEEDED(
renderer->submittedRenderPassesToDestroy,
VkRenderPass,
renderer->renderPassesToDestroyCount,
renderer->submittedRenderPassesToDestroyCapacity,
renderer->renderPassesToDestroyCount
)
/* Rotate destroy lists */
MOVE_ARRAY_CONTENTS_AND_RESET(
@ -2299,6 +2335,14 @@ static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
renderer->framebuffersToDestroyCount
)
MOVE_ARRAY_CONTENTS_AND_RESET(
i,
renderer->submittedRenderPassesToDestroy,
renderer->submittedRenderPassesToDestroyCount,
renderer->renderPassesToDestroy,
renderer->renderPassesToDestroyCount
)
SDL_UnlockMutex(renderer->disposeLock);
/* Increment the frame index */
@ -3015,8 +3059,8 @@ static void VULKAN_DestroyDevice(
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->fragmentUBO);
/* We have to do this twice so the rotation happens correctly */
VULKAN_INTERNAL_PostSubmitCleanup(renderer);
VULKAN_INTERNAL_PostSubmitCleanup(renderer);
VULKAN_INTERNAL_PostWorkCleanup(renderer);
VULKAN_INTERNAL_PostWorkCleanup(renderer);
VULKAN_INTERNAL_DestroyTextureStagingBuffer(renderer);
@ -6130,7 +6174,23 @@ static void VULKAN_AddDisposeRenderPass(
REFRESH_Renderer *driverData,
REFRESH_RenderPass *renderPass
) {
SDL_assert(0);
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
VkRenderPass vulkanRenderPass = (VkRenderPass) renderPass;
SDL_LockMutex(renderer->disposeLock);
EXPAND_ARRAY_IF_NEEDED(
renderer->renderPassesToDestroy,
VkRenderPass,
renderer->renderPassesToDestroyCount + 1,
renderer->renderPassesToDestroyCapacity,
renderer->renderPassesToDestroyCapacity * 2
)
renderer->renderPassesToDestroy[renderer->renderPassesToDestroyCount] = vulkanRenderPass;
renderer->renderPassesToDestroyCount += 1;
SDL_UnlockMutex(renderer->disposeLock);
}
static void VULKAN_AddDisposeGraphicsPipeline(
@ -6712,7 +6772,7 @@ static void VULKAN_Submit(
return;
}
VULKAN_INTERNAL_PostSubmitCleanup(renderer);
VULKAN_INTERNAL_PostWorkCleanup(renderer);
/* Reset the previously submitted command buffers */
for (i = 0; i < renderer->submittedCommandBufferCount; i += 1)
@ -8049,6 +8109,22 @@ static REFRESH_Device* VULKAN_CreateDevice(
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;
}