implement DestroyDevice

pull/8/head
cosmonaut 2020-12-28 14:57:14 -08:00
parent 6367ccdac0
commit 5a38907294
1 changed files with 199 additions and 12 deletions

View File

@ -1858,6 +1858,42 @@ static void VULKAN_INTERNAL_PerformDeferredDestroys(VulkanRenderer* renderer)
/* TODO */ /* TODO */
} }
static void VULKAN_INTERNAL_DestroyTextureStagingBuffer(
VulkanRenderer* renderer
) {
VULKAN_INTERNAL_DestroyBuffer(
renderer,
renderer->textureStagingBuffer
);
}
static void VULKAN_INTERNAL_DestroySamplerDescriptorSetCache(
VulkanRenderer* renderer,
SamplerDescriptorSetCache* cache
) {
uint32_t i;
for (i = 0; i < cache->samplerDescriptorPoolCount; i += 1)
{
renderer->vkDestroyDescriptorPool(
renderer->logicalDevice,
cache->samplerDescriptorPools[i],
NULL
);
}
SDL_free(cache->samplerDescriptorPools);
SDL_free(cache->inactiveDescriptorSets);
SDL_free(cache->elements);
for (i = 0; i < NUM_DESCRIPTOR_SET_HASH_BUCKETS; i += 1)
{
SDL_free(cache->buckets[i].elements);
}
SDL_free(cache);
}
/* Swapchain */ /* Swapchain */
static inline VkExtent2D VULKAN_INTERNAL_ChooseSwapExtent( static inline VkExtent2D VULKAN_INTERNAL_ChooseSwapExtent(
@ -2499,7 +2535,167 @@ static void VULKAN_INTERNAL_EndCommandBuffer(
static void VULKAN_DestroyDevice( static void VULKAN_DestroyDevice(
REFRESH_Device *device REFRESH_Device *device
) { ) {
SDL_assert(0); VulkanRenderer* renderer = (VulkanRenderer*) device->driverData;
VkResult waitResult;
PipelineLayoutHashArray pipelineLayoutHashArray;
VulkanMemorySubAllocator *allocator;
uint32_t i, j, k;
VULKAN_Submit(device->driverData);
waitResult = renderer->vkDeviceWaitIdle(renderer->logicalDevice);
if (waitResult != VK_SUCCESS)
{
LogVulkanResult("vkDeviceWaitIdle", waitResult);
}
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer);
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyFragmentUniformBuffer);
/* We have to do this twice so the rotation happens correctly */
VULKAN_INTERNAL_PerformDeferredDestroys(renderer);
VULKAN_INTERNAL_PerformDeferredDestroys(renderer);
VULKAN_INTERNAL_DestroyTextureStagingBuffer(renderer);
renderer->vkDestroySemaphore(
renderer->logicalDevice,
renderer->imageAvailableSemaphore,
NULL
);
renderer->vkDestroySemaphore(
renderer->logicalDevice,
renderer->renderFinishedSemaphore,
NULL
);
renderer->vkDestroyFence(
renderer->logicalDevice,
renderer->inFlightFence,
NULL
);
renderer->vkDestroyCommandPool(
renderer->logicalDevice,
renderer->commandPool,
NULL
);
for (i = 0; i < NUM_PIPELINE_LAYOUT_BUCKETS; i += 1)
{
pipelineLayoutHashArray = renderer->pipelineLayoutHashTable.buckets[i];
for (j = 0; j < pipelineLayoutHashArray.count; j += 1)
{
VULKAN_INTERNAL_DestroySamplerDescriptorSetCache(
renderer,
pipelineLayoutHashArray.elements[j].value->vertexSamplerDescriptorSetCache
);
VULKAN_INTERNAL_DestroySamplerDescriptorSetCache(
renderer,
pipelineLayoutHashArray.elements[j].value->fragmentSamplerDescriptorSetCache
);
renderer->vkDestroyPipelineLayout(
renderer->logicalDevice,
pipelineLayoutHashArray.elements[j].value->pipelineLayout,
NULL
);
}
if (pipelineLayoutHashArray.elements != NULL)
{
SDL_free(pipelineLayoutHashArray.elements);
}
}
renderer->vkDestroyDescriptorPool(
renderer->logicalDevice,
renderer->defaultDescriptorPool,
NULL
);
for (i = 0; i < NUM_DESCRIPTOR_SET_LAYOUT_BUCKETS; i += 1)
{
for (j = 0; j < renderer->samplerDescriptorSetLayoutHashTable.buckets[i].count; j += 1)
{
renderer->vkDestroyDescriptorSetLayout(
renderer->logicalDevice,
renderer->samplerDescriptorSetLayoutHashTable.buckets[i].elements[j].value,
NULL
);
}
SDL_free(renderer->samplerDescriptorSetLayoutHashTable.buckets[i].elements);
}
renderer->vkDestroyDescriptorSetLayout(
renderer->logicalDevice,
renderer->emptyVertexSamplerLayout,
NULL
);
renderer->vkDestroyDescriptorSetLayout(
renderer->logicalDevice,
renderer->emptyFragmentSamplerLayout,
NULL
);
VULKAN_INTERNAL_DestroySwapchain(renderer);
if (!renderer->headless)
{
renderer->vkDestroySurfaceKHR(
renderer->instance,
renderer->surface,
NULL
);
}
for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1)
{
allocator = &renderer->memoryAllocator->subAllocators[i];
for (j = 0; j < allocator->allocationCount; j += 1)
{
for (k = 0; k < allocator->allocations[j]->freeRegionCount; k += 1)
{
SDL_free(allocator->allocations[j]->freeRegions[k]);
}
SDL_free(allocator->allocations[j]->freeRegions);
renderer->vkFreeMemory(
renderer->logicalDevice,
allocator->allocations[j]->memory,
NULL
);
SDL_free(allocator->allocations[j]);
}
SDL_free(allocator->allocations);
SDL_free(allocator->sortedFreeRegions);
}
SDL_free(renderer->memoryAllocator);
SDL_DestroyMutex(renderer->commandLock);
SDL_DestroyMutex(renderer->allocatorLock);
SDL_free(renderer->buffersInUse);
SDL_free(renderer->inactiveCommandBuffers);
SDL_free(renderer->activeCommandBuffers);
SDL_free(renderer->submittedCommandBuffers);
renderer->vkDestroyDevice(renderer->logicalDevice, NULL);
renderer->vkDestroyInstance(renderer->instance, NULL);
SDL_free(renderer);
SDL_free(device);
} }
static void VULKAN_Clear( static void VULKAN_Clear(
@ -4327,15 +4523,6 @@ static REFRESH_Buffer* VULKAN_CreateIndexBuffer(
/* Setters */ /* Setters */
static void VULKAN_INTERNAL_DestroyTextureStagingBuffer(
VulkanRenderer *renderer
) {
VULKAN_INTERNAL_DestroyBuffer(
renderer,
renderer->textureStagingBuffer
);
}
static void VULKAN_INTERNAL_MaybeExpandStagingBuffer( static void VULKAN_INTERNAL_MaybeExpandStagingBuffer(
VulkanRenderer *renderer, VulkanRenderer *renderer,
VkDeviceSize size VkDeviceSize size