dispose framebuffer

pull/8/head
cosmonaut 2020-12-28 17:35:18 -08:00
parent aa9b27aecf
commit da9b255dec
1 changed files with 79 additions and 2 deletions

View File

@ -1118,6 +1118,14 @@ typedef struct VulkanRenderer
uint32_t submittedSamplersToDestroyCount; uint32_t submittedSamplersToDestroyCount;
uint32_t submittedSamplersToDestroyCapacity; uint32_t submittedSamplersToDestroyCapacity;
VulkanFramebuffer **framebuffersToDestroy;
uint32_t framebuffersToDestroyCount;
uint32_t framebuffersToDestroyCapacity;
VulkanFramebuffer **submittedFramebuffersToDestroy;
uint32_t submittedFramebuffersToDestroyCount;
uint32_t submittedFramebuffersToDestroyCapacity;
#define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \
vkfntype_##func func; vkfntype_##func func;
#define VULKAN_DEVICE_FUNCTION(ext, ret, func, params) \ #define VULKAN_DEVICE_FUNCTION(ext, ret, func, params) \
@ -2024,6 +2032,18 @@ static void VULKAN_INTERNAL_DestroySampler(
); );
} }
/* The framebuffer doesn't own any targets so we don't have to do much. */
static void VULKAN_INTERNAL_DestroyFramebuffer(
VulkanRenderer *renderer,
VulkanFramebuffer *framebuffer
) {
renderer->vkDestroyFramebuffer(
renderer->logicalDevice,
framebuffer->framebuffer,
NULL
);
}
static void VULKAN_INTERNAL_DestroySwapchain(VulkanRenderer* renderer) static void VULKAN_INTERNAL_DestroySwapchain(VulkanRenderer* renderer)
{ {
uint32_t i; uint32_t i;
@ -2154,6 +2174,15 @@ static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
} }
renderer->submittedSamplersToDestroyCount = 0; renderer->submittedSamplersToDestroyCount = 0;
for (i = 0; i < renderer->submittedFramebuffersToDestroyCount; i += 1)
{
VULKAN_INTERNAL_DestroyFramebuffer(
renderer,
renderer->submittedFramebuffersToDestroy[i]
);
}
renderer->submittedFramebuffersToDestroyCount = 0;
/* Re-size submitted destroy lists */ /* Re-size submitted destroy lists */
EXPAND_ARRAY_IF_NEEDED( EXPAND_ARRAY_IF_NEEDED(
@ -2204,6 +2233,14 @@ static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
renderer->samplersToDestroyCount renderer->samplersToDestroyCount
) )
EXPAND_ARRAY_IF_NEEDED(
renderer->submittedFramebuffersToDestroy,
VulkanFramebuffer*,
renderer->framebuffersToDestroyCount,
renderer->submittedFramebuffersToDestroyCapacity,
renderer->framebuffersToDestroyCount
)
/* Rotate destroy lists */ /* Rotate destroy lists */
MOVE_ARRAY_CONTENTS_AND_RESET( MOVE_ARRAY_CONTENTS_AND_RESET(
@ -2254,6 +2291,14 @@ static void VULKAN_INTERNAL_PostSubmitCleanup(VulkanRenderer* renderer)
renderer->samplersToDestroyCount renderer->samplersToDestroyCount
) )
MOVE_ARRAY_CONTENTS_AND_RESET(
i,
renderer->submittedFramebuffersToDestroy,
renderer->submittedFramebuffersToDestroyCount,
renderer->framebuffersToDestroy,
renderer->framebuffersToDestroyCount
)
SDL_UnlockMutex(renderer->disposeLock); SDL_UnlockMutex(renderer->disposeLock);
/* Increment the frame index */ /* Increment the frame index */
@ -6025,9 +6070,25 @@ static void VULKAN_AddDisposeDepthStencilTarget(
static void VULKAN_AddDisposeFramebuffer( static void VULKAN_AddDisposeFramebuffer(
REFRESH_Renderer *driverData, REFRESH_Renderer *driverData,
REFRESH_Framebuffer *frameBuffer REFRESH_Framebuffer *framebuffer
) { ) {
SDL_assert(0); VulkanRenderer *renderer = (VulkanRenderer*) driverData;
VulkanFramebuffer *vulkanFramebuffer = (VulkanFramebuffer*) framebuffer;
SDL_LockMutex(renderer->disposeLock);
EXPAND_ARRAY_IF_NEEDED(
renderer->framebuffersToDestroy,
VulkanFramebuffer*,
renderer->framebuffersToDestroyCount + 1,
renderer->framebuffersToDestroyCapacity,
renderer->framebuffersToDestroyCapacity *= 2
)
renderer->framebuffersToDestroy[renderer->framebuffersToDestroyCount] = vulkanFramebuffer;
renderer->framebuffersToDestroyCount += 1;
SDL_UnlockMutex(renderer->disposeLock);
} }
static void VULKAN_AddDisposeShaderModule( static void VULKAN_AddDisposeShaderModule(
@ -7960,6 +8021,22 @@ static REFRESH_Device* VULKAN_CreateDevice(
renderer->submittedSamplersToDestroyCapacity 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
);
return result; return result;
} }