From 7030dbe85ce60070c575a9eceb8c34841947a4e2 Mon Sep 17 00:00:00 2001 From: Ian Elliott Date: Thu, 21 Jan 2016 12:57:20 -0700 Subject: [PATCH] Swapchain: vkDestroyInstance check if child objects were destroyed. --- layers/swapchain.cpp | 26 ++++++++++++++++++++++---- layers/swapchain.h | 2 +- layers/vk_validation_layer_details.md | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index f6f88c6..d75a0ac 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -343,14 +343,19 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance // Regardless of skipCall value, do some internal cleanup: if (pInstance) { - // Delete all of the SwpPhysicalDevice's and the SwpInstance associated - // with this instance: + // Delete all of the SwpPhysicalDevice's, SwpSurface's, and the + // SwpInstance associated with this instance: for (auto it = pInstance->physicalDevices.begin() ; it != pInstance->physicalDevices.end() ; it++) { // Free memory that was allocated for/by this SwpPhysicalDevice: SwpPhysicalDevice *pPhysicalDevice = it->second; if (pPhysicalDevice) { + LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, instance, "VkInstance", + SWAPCHAIN_DEL_OBJECT_BEFORE_CHILDREN, + "%s() called before all of its associated " + "VkPhysicalDevices were destroyed.", + __FUNCTION__); free(pPhysicalDevice->pSurfaceFormats); free(pPhysicalDevice->pPresentModes); } @@ -359,6 +364,19 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance // are simply pointed to by the SwpInstance): my_data->physicalDeviceMap.erase(it->second->physicalDevice); } + for (auto it = pInstance->surfaces.begin() ; + it != pInstance->surfaces.end() ; it++) { + + // Free memory that was allocated for/by this SwpPhysicalDevice: + SwpSurface *pSurface = it->second; + if (pSurface) { + LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, instance, "VkInstance", + SWAPCHAIN_DEL_OBJECT_BEFORE_CHILDREN, + "%s() called before all of its associated " + "VkSurfaceKHRs were destroyed.", + __FUNCTION__); + } + } my_data->instanceMap.erase(instance); } delete my_data->instance_dispatch_table; @@ -958,7 +976,7 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(VkInstance insta } if (!pSurface->swapchains.empty()) { LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, instance, "VkInstance", - SWAPCHAIN_DEL_OBJECT_BEFORE_SWAPCHAINS, + SWAPCHAIN_DEL_OBJECT_BEFORE_CHILDREN, "%s() called before all of its associated " "VkSwapchainKHRs were destroyed.", __FUNCTION__); @@ -1079,7 +1097,7 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, cons } if (!pDevice->swapchains.empty()) { LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device, "VkDevice", - SWAPCHAIN_DEL_OBJECT_BEFORE_SWAPCHAINS, + SWAPCHAIN_DEL_OBJECT_BEFORE_CHILDREN, "%s() called before all of its associated " "VkSwapchainKHRs were destroyed.", __FUNCTION__); diff --git a/layers/swapchain.h b/layers/swapchain.h index 495cd9a..6fc3819 100644 --- a/layers/swapchain.h +++ b/layers/swapchain.h @@ -63,7 +63,7 @@ typedef enum _SWAPCHAIN_ERROR SWAPCHAIN_INVALID_HANDLE, // Handle used that isn't currently valid SWAPCHAIN_NULL_POINTER, // Pointer set to NULL, instead of being a valid pointer SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED, // Did not enable WSI extension, but called WSI function - SWAPCHAIN_DEL_OBJECT_BEFORE_SWAPCHAINS, // Called vkDestroyDevice() before vkDestroySwapchainKHR() + SWAPCHAIN_DEL_OBJECT_BEFORE_CHILDREN, // Called vkDestroyDevice() before vkDestroySwapchainKHR() SWAPCHAIN_CREATE_UNSUPPORTED_SURFACE, // Called vkCreateSwapchainKHR() with a pCreateInfo->surface that wasn't seen as supported by vkGetPhysicalDeviceSurfaceSupportKHR for the device SWAPCHAIN_CREATE_SWAP_WITHOUT_QUERY, // Called vkCreateSwapchainKHR() without calling a query (e.g. vkGetPhysicalDeviceSurfaceCapabilitiesKHR()) SWAPCHAIN_CREATE_SWAP_BAD_MIN_IMG_COUNT, // Called vkCreateSwapchainKHR() with out-of-bounds minImageCount diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 6d7a08f..5ebe0d7 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -347,7 +347,7 @@ This layer is a work in progress. VK_LAYER_LUNARG_swapchain layer is intended to | Valid handle | If an invalid handle is used, this error will be flagged | INVALID_HANDLE | vkCreateDevice vkCreateSwapchainKHR | NA | None | | Valid pointer | If a NULL pointer is used, this error will be flagged | NULL_POINTER | vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfacePresentModesKHR vkCreateSwapchainKHR vkGetSwapchainImagesKHR vkAcquireNextImageKHR vkQueuePresentKHR | NA | None | | Extension enabled before use | Validates that a WSI extension is enabled before its functions are used | EXT_NOT_ENABLED_BUT_USED | vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfacePresentModesKHR vkCreateSwapchainKHR vkDestroySwapchainKHR vkGetSwapchainImagesKHR vkAcquireNextImageKHR vkQueuePresentKHR | NA | None | -| Swapchains destroyed before devices | Validates that vkDestroySwapchainKHR() is called for all swapchains associated with a device before vkDestroyDevice() is called | DEL_OBJECT_BEFORE_SWAPCHAINS | vkDestroyDevice vkDestroySurfaceKHR | NA | None | +| Swapchains destroyed before devices | Validates that vkDestroySwapchainKHR() is called for all swapchains associated with a device before vkDestroyDevice() is called | DEL_OBJECT_BEFORE_CHILDREN | vkDestroyDevice vkDestroySurfaceKHR | NA | None | | Supported surface used with a swapchain | Validates that vkGetPhysicalDeviceSurfaceSupportKHR() was seen to support the surface used with a swapchain | CREATE_SWAP_UNSUPPORTED_SURFACE | vkCreateSwapchainKHR | NA | None | | Queries occur before swapchain creation | Validates that vkGetPhysicalDeviceSurfaceCapabilitiesKHR(), vkGetPhysicalDeviceSurfaceFormatsKHR() and vkGetPhysicalDeviceSurfacePresentModesKHR() are called before vkCreateSwapchainKHR() | CREATE_SWAP_WITHOUT_QUERY | vkCreateSwapchainKHR | NA | None | | vkCreateSwapchainKHR(pCreateInfo->minImageCount) | Validates vkCreateSwapchainKHR(pCreateInfo->minImageCount) | CREATE_SWAP_BAD_MIN_IMG_COUNT | vkCreateSwapchainKHR | NA | None | -- 2.7.4