From 9e71e69d1c26f468e63b87b5f4bebbd653d8ed26 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sun, 15 Mar 2020 11:28:36 +0200 Subject: [PATCH] fix sequence of destroing buffers --- src/client/refresh/vk/vk_buffer.c | 2 -- src/client/refresh/vk/vk_common.c | 9 ++++--- src/client/refresh/vk/vk_image.c | 11 +++++--- src/client/refresh/vk/vk_util.c | 37 +++++++++++++++++++-------- src/client/refresh/vk/vk_validation.c | 2 +- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/client/refresh/vk/vk_buffer.c b/src/client/refresh/vk/vk_buffer.c index f30c4ba4..aec6d395 100644 --- a/src/client/refresh/vk/vk_buffer.c +++ b/src/client/refresh/vk/vk_buffer.c @@ -106,7 +106,6 @@ void QVk_FreeBuffer(qvkbuffer_t *buffer) { buffer_destroy(&buffer->resource); - buffer->resource.buffer = VK_NULL_HANDLE; buffer->currentOffset = 0; } @@ -114,7 +113,6 @@ void QVk_FreeStagingBuffer(qvkstagingbuffer_t *buffer) { buffer_destroy(&buffer->resource); - buffer->resource.buffer = VK_NULL_HANDLE; buffer->currentOffset = 0; } diff --git a/src/client/refresh/vk/vk_common.c b/src/client/refresh/vk/vk_common.c index cdf91cbe..567784fa 100644 --- a/src/client/refresh/vk/vk_common.c +++ b/src/client/refresh/vk/vk_common.c @@ -750,12 +750,15 @@ static void CreateDrawBuffers() // internal helper static void DestroyDrawBuffer(qvktexture_t *drawBuffer) { + if (drawBuffer->imageView != VK_NULL_HANDLE) + { + vkDestroyImageView(vk_device.logical, drawBuffer->imageView, NULL); + drawBuffer->imageView = VK_NULL_HANDLE; + } + if (drawBuffer->resource.image != VK_NULL_HANDLE) { image_destroy(&drawBuffer->resource); - vkDestroyImageView(vk_device.logical, drawBuffer->imageView, NULL); - drawBuffer->resource.image = VK_NULL_HANDLE; - drawBuffer->imageView = VK_NULL_HANDLE; } } diff --git a/src/client/refresh/vk/vk_image.c b/src/client/refresh/vk/vk_image.c index 938c4f87..05d84eea 100644 --- a/src/client/refresh/vk/vk_image.c +++ b/src/client/refresh/vk/vk_image.c @@ -431,15 +431,18 @@ static void QVk_ReleaseTexture(qvktexture_t *texture) vkDeviceWaitIdle(vk_device.logical); } + if (texture->imageView != VK_NULL_HANDLE) + { + vkDestroyImageView(vk_device.logical, texture->imageView, NULL); + texture->imageView = VK_NULL_HANDLE; + } + if (texture->resource.image != VK_NULL_HANDLE) image_destroy(&texture->resource); - if (texture->imageView != VK_NULL_HANDLE) - vkDestroyImageView(vk_device.logical, texture->imageView, NULL); + if (texture->descriptorSet != VK_NULL_HANDLE) vkFreeDescriptorSets(vk_device.logical, vk_descriptorPool, 1, &texture->descriptorSet); - texture->resource.image = VK_NULL_HANDLE; - texture->imageView = VK_NULL_HANDLE; texture->descriptorSet = VK_NULL_HANDLE; } diff --git a/src/client/refresh/vk/vk_util.c b/src/client/refresh/vk/vk_util.c index af6e6fe7..3fd7a7fd 100644 --- a/src/client/refresh/vk/vk_util.c +++ b/src/client/refresh/vk/vk_util.c @@ -179,12 +179,21 @@ VkResult buffer_destroy(BufferResource_t *buf) { assert(!buf->is_mapped); - if(buf->memory != VK_NULL_HANDLE) - vkFreeMemory(vk_device.logical, buf->memory, NULL); + + // buffer should be destroed before bound memory if(buf->buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vk_device.logical, buf->buffer, NULL); - buf->buffer = VK_NULL_HANDLE; - buf->memory = VK_NULL_HANDLE; + { + vkDestroyBuffer(vk_device.logical, buf->buffer, NULL); + buf->buffer = VK_NULL_HANDLE; + } + + // buffer desroed, we can free up memory + if(buf->memory != VK_NULL_HANDLE) + { + vkFreeMemory(vk_device.logical, buf->memory, NULL); + buf->memory = VK_NULL_HANDLE; + } + buf->size = 0; return VK_SUCCESS; @@ -193,12 +202,20 @@ buffer_destroy(BufferResource_t *buf) VkResult image_destroy(ImageResource_t *img) { - if(img->memory != VK_NULL_HANDLE) - vkFreeMemory(vk_device.logical, img->memory, NULL); + // image should be destroed before bound memory if(img->image != VK_NULL_HANDLE) - vkDestroyImage(vk_device.logical, img->image, NULL); - img->image = VK_NULL_HANDLE; - img->memory = VK_NULL_HANDLE; + { + vkDestroyImage(vk_device.logical, img->image, NULL); + img->image = VK_NULL_HANDLE; + } + + // image destroed, we can free up memory + if(img->memory != VK_NULL_HANDLE) + { + vkFreeMemory(vk_device.logical, img->memory, NULL); + img->memory = VK_NULL_HANDLE; + } + img->size = 0; return VK_SUCCESS; diff --git a/src/client/refresh/vk/vk_validation.c b/src/client/refresh/vk/vk_validation.c index f45a9412..00e7436e 100644 --- a/src/client/refresh/vk/vk_validation.c +++ b/src/client/refresh/vk/vk_validation.c @@ -77,7 +77,7 @@ void QVk_CreateValidationLayers() .pUserData = NULL }; - if( vk_validation->value > 1 ) + if(vk_validation->value) { callbackInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;