render target cleanup
parent
4c73c6c200
commit
fbff906aa3
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue