forked from MoonsideGames/Refresh
dispose renderpass
parent
2548833525
commit
031f36f450
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue