render target cleanup

pull/15/head
cosmonaut 2022-03-01 22:04:26 -08:00
parent 4c73c6c200
commit fbff906aa3
1 changed files with 106 additions and 58 deletions

View File

@ -1695,6 +1695,7 @@ typedef struct VulkanRenderer
static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer, VulkanCommandBuffer *commandBuffer); static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer, VulkanCommandBuffer *commandBuffer);
static void VULKAN_Wait(Refresh_Renderer *driverData); static void VULKAN_Wait(Refresh_Renderer *driverData);
static void VULKAN_Submit(Refresh_Renderer *driverData, uint32_t commandBufferCount, Refresh_CommandBuffer **pCommandBuffers); static void VULKAN_Submit(Refresh_Renderer *driverData, uint32_t commandBufferCount, Refresh_CommandBuffer **pCommandBuffers);
static void VULKAN_INTERNAL_DestroyRenderTarget(VulkanRenderer *renderer, VulkanRenderTarget *renderTarget);
/* Error Handling */ /* Error Handling */
@ -2601,51 +2602,6 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier(
/* Resource Disposal */ /* Resource Disposal */
/* TODO: destroy associated framebuffers and render targets */
static void VULKAN_INTERNAL_DestroyTexture(
VulkanRenderer* renderer,
VulkanTexture* texture
) {
if (texture->allocation->dedicated)
{
renderer->vkFreeMemory(
renderer->logicalDevice,
texture->allocation->memory,
NULL
);
SDL_DestroyMutex(texture->allocation->memoryLock);
SDL_free(texture->allocation->freeRegions);
SDL_free(texture->allocation);
}
else
{
SDL_LockMutex(renderer->allocatorLock);
VULKAN_INTERNAL_NewMemoryFreeRegion(
texture->allocation,
texture->offset,
texture->memorySize
);
SDL_UnlockMutex(renderer->allocatorLock);
}
renderer->vkDestroyImageView(
renderer->logicalDevice,
texture->view,
NULL
);
renderer->vkDestroyImage(
renderer->logicalDevice,
texture->image,
NULL
);
SDL_free(texture);
}
static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( static void VULKAN_INTERNAL_RemoveFramebuffersContainingView(
VulkanRenderer *renderer, VulkanRenderer *renderer,
VkImageView view VkImageView view
@ -2682,6 +2638,90 @@ static void VULKAN_INTERNAL_RemoveFramebuffersContainingView(
SDL_UnlockMutex(renderer->framebufferFetchLock); SDL_UnlockMutex(renderer->framebufferFetchLock);
} }
static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture(
VulkanRenderer *renderer,
VulkanTexture *texture
) {
RenderTargetHash *hash;
int32_t i;
SDL_LockMutex(renderer->renderTargetFetchLock);
for (i = renderer->renderTargetHashArray.count - 1; i >= 0; i -= 1)
{
hash = &renderer->renderTargetHashArray.elements[i].key;
if ((VulkanTexture*) hash->texture == texture)
{
VULKAN_INTERNAL_RemoveFramebuffersContainingView(
renderer,
renderer->renderTargetHashArray.elements[i].value->view
);
VULKAN_INTERNAL_DestroyRenderTarget(
renderer,
renderer->renderTargetHashArray.elements[i].value
);
RenderTargetHash_Remove(
&renderer->renderTargetHashArray,
i
);
}
}
SDL_UnlockMutex(renderer->renderTargetFetchLock);
}
static void VULKAN_INTERNAL_DestroyTexture(
VulkanRenderer* renderer,
VulkanTexture* texture
) {
if (texture->allocation->dedicated)
{
renderer->vkFreeMemory(
renderer->logicalDevice,
texture->allocation->memory,
NULL
);
SDL_DestroyMutex(texture->allocation->memoryLock);
SDL_free(texture->allocation->freeRegions);
SDL_free(texture->allocation);
}
else
{
SDL_LockMutex(renderer->allocatorLock);
VULKAN_INTERNAL_NewMemoryFreeRegion(
texture->allocation,
texture->offset,
texture->memorySize
);
SDL_UnlockMutex(renderer->allocatorLock);
}
VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture(
renderer,
texture
);
renderer->vkDestroyImageView(
renderer->logicalDevice,
texture->view,
NULL
);
renderer->vkDestroyImage(
renderer->logicalDevice,
texture->image,
NULL
);
SDL_free(texture);
}
static void VULKAN_INTERNAL_DestroyRenderTarget( static void VULKAN_INTERNAL_DestroyRenderTarget(
VulkanRenderer *renderer, VulkanRenderer *renderer,
VulkanRenderTarget *renderTarget VulkanRenderTarget *renderTarget
@ -2767,6 +2807,9 @@ static void VULKAN_INTERNAL_DestroyCommandPool(
{ {
commandBuffer = commandPool->inactiveCommandBuffers[i]; commandBuffer = commandPool->inactiveCommandBuffers[i];
SDL_free(commandBuffer->presentDatas);
SDL_free(commandBuffer->waitSemaphores);
SDL_free(commandBuffer->signalSemaphores);
SDL_free(commandBuffer->transferBuffers); SDL_free(commandBuffer->transferBuffers);
SDL_free(commandBuffer->boundUniformBuffers); SDL_free(commandBuffer->boundUniformBuffers);
SDL_free(commandBuffer->boundDescriptorSetDatas); SDL_free(commandBuffer->boundDescriptorSetDatas);
@ -2848,9 +2891,9 @@ static void VULKAN_INTERNAL_DestroySwapchain(
for (i = 0; i < swapchainData->imageCount; i += 1) for (i = 0; i < swapchainData->imageCount; i += 1)
{ {
VULKAN_INTERNAL_RemoveFramebuffersContainingView( VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture(
renderer, renderer,
swapchainData->textures[i].view &swapchainData->textures[i]
); );
renderer->vkDestroyImageView( renderer->vkDestroyImageView(
@ -4071,7 +4114,10 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain(
swapchainCreateInfo.imageColorSpace = swapchainData->surfaceFormat.colorSpace; swapchainCreateInfo.imageColorSpace = swapchainData->surfaceFormat.colorSpace;
swapchainCreateInfo.imageExtent = swapchainData->extent; swapchainCreateInfo.imageExtent = swapchainData->extent;
swapchainCreateInfo.imageArrayLayers = 1; swapchainCreateInfo.imageArrayLayers = 1;
swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; swapchainCreateInfo.imageUsage =
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
VK_IMAGE_USAGE_TRANSFER_DST_BIT;
swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
swapchainCreateInfo.queueFamilyIndexCount = 0; swapchainCreateInfo.queueFamilyIndexCount = 0;
swapchainCreateInfo.pQueueFamilyIndices = NULL; swapchainCreateInfo.pQueueFamilyIndices = NULL;
@ -4494,6 +4540,17 @@ static void VULKAN_DestroyDevice(
NULL NULL
); );
VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->vertexUniformBufferPool);
VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->fragmentUniformBufferPool);
VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->computeUniformBufferPool);
for (i = renderer->swapchainDataCount - 1; i >= 0; i -= 1)
{
VULKAN_INTERNAL_DestroySwapchain(renderer, renderer->swapchainDatas[i]->windowHandle);
}
SDL_free(renderer->swapchainDatas);
for (i = 0; i < renderer->framebufferHashArray.count; i += 1) for (i = 0; i < renderer->framebufferHashArray.count; i += 1)
{ {
renderer->vkDestroyFramebuffer( renderer->vkDestroyFramebuffer(
@ -4516,16 +4573,7 @@ static void VULKAN_DestroyDevice(
SDL_free(renderer->renderPassHashArray.elements); SDL_free(renderer->renderPassHashArray.elements);
VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->vertexUniformBufferPool); SDL_free(renderer->renderTargetHashArray.elements);
VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->fragmentUniformBufferPool);
VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->computeUniformBufferPool);
for (i = renderer->swapchainDataCount - 1; i >= 0; i -= 1)
{
VULKAN_INTERNAL_DestroySwapchain(renderer, renderer->swapchainDatas[i]->windowHandle);
}
SDL_free(renderer->swapchainDatas);
for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1) for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1)
{ {