diff options
| author | Chris Forbes <chrisforbes@google.com> | 2016-10-06 13:01:33 +1300 |
|---|---|---|
| committer | Chris Forbes <chrisforbes@google.com> | 2016-10-06 17:43:18 +1300 |
| commit | ad1002000e8b2d457bf2351ecd2832f8bb1ad56f (patch) | |
| tree | b1ba394a5d2cdee08a439d6b8c71cce29acf2878 | |
| parent | d8cc42e154b3aaf57aa932dd8a8e5db1be81ce61 (diff) | |
| download | usermoji-ad1002000e8b2d457bf2351ecd2832f8bb1ad56f.tar.xz | |
layers: Migrate surface/swapchain interaction from swapchain to CV
Signed-off-by: Chris Forbes <chrisforbes@google.com>
| -rw-r--r-- | layers/core_validation.cpp | 23 | ||||
| -rw-r--r-- | layers/core_validation_error_enums.h | 2 | ||||
| -rw-r--r-- | layers/swapchain.cpp | 29 | ||||
| -rw-r--r-- | layers/swapchain.h | 3 | ||||
| -rw-r--r-- | layers/vk_validation_layer_details.md | 4 |
5 files changed, 27 insertions, 34 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 49956f75..86f1a8aa 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -11156,6 +11156,26 @@ CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAlloc return result; } +static bool PreCallValidateCreateSwapchainKHR(layer_data *dev_data, VkSwapchainCreateInfoKHR const *pCreateInfo, + SURFACE_STATE *surface_state, SWAPCHAIN_NODE *old_swapchain_state) { + auto most_recent_swapchain = surface_state->swapchain ? surface_state->swapchain : surface_state->old_swapchain; + + if (most_recent_swapchain != old_swapchain_state || (surface_state->old_swapchain && surface_state->swapchain)) { + if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, + reinterpret_cast<uint64_t>(dev_data->device), __LINE__, DRAWSTATE_SWAPCHAIN_ALREADY_EXISTS, "DS", + "vkCreateSwapchainKHR(): surface has an existing swapchain other than oldSwapchain")) + return true; + } + if (old_swapchain_state && old_swapchain_state->createInfo.surface != pCreateInfo->surface) { + if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, + reinterpret_cast<uint64_t const &>(pCreateInfo->oldSwapchain), __LINE__, DRAWSTATE_SWAPCHAIN_WRONG_SURFACE, + "DS", "vkCreateSwapchainKHR(): pCreateInfo->oldSwapchain's surface is not pCreateInfo->surface")) + return true; + } + + return false; +} + VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { @@ -11163,6 +11183,9 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapc auto surface_state = getSurfaceState(dev_data->instance_data, pCreateInfo->surface); auto old_swapchain_state = getSwapchainNode(dev_data, pCreateInfo->oldSwapchain); + if (PreCallValidateCreateSwapchainKHR(dev_data, pCreateInfo, surface_state, old_swapchain_state)) + return VK_ERROR_VALIDATION_FAILED_EXT; + VkResult result = dev_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); if (VK_SUCCESS == result) { diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index 6e118936..9f2da576 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -236,6 +236,8 @@ enum DRAW_STATE_ERROR { DRAWSTATE_SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, // AcquireNextImageKHR with no sync object DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, // QueuePresentKHR with image index out of range DRAWSTATE_SWAPCHAIN_IMAGE_NOT_ACQUIRED, // QueuePresentKHR with image not acquired by app + DRAWSTATE_SWAPCHAIN_ALREADY_EXISTS, // Surface has an existing swapchain that is not being replaced + DRAWSTATE_SWAPCHAIN_WRONG_SURFACE, // Swapchain being replaced is not attached to the same surface }; // Shader Checker ERROR codes diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index 2d4927ac..f43a472d 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -1837,29 +1837,6 @@ static bool validateCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateI pCreateInfo->clipped); } - // Validate pCreateInfo->oldSwapchain: - if (pCreateInfo && pCreateInfo->oldSwapchain) { - SwpSwapchain *pOldSwapchain = NULL; - { - auto it = my_data->swapchainMap.find(pCreateInfo->oldSwapchain); - pOldSwapchain = (it == my_data->swapchainMap.end()) ? NULL : &it->second; - } - if (pOldSwapchain) { - if (device != pOldSwapchain->pDevice->device) { - skip_call |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - reinterpret_cast<uint64_t>(device), __LINE__, SWAPCHAIN_DESTROY_SWAP_DIFF_DEVICE, swapchain_layer_name, - "vkCreateSwapchainKHR() called with a different VkDevice than the VkSwapchainKHR was created with."); - } - if (pCreateInfo->surface != pOldSwapchain->pSurface->surface) { - skip_call |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - reinterpret_cast<uint64_t>(device), __LINE__, SWAPCHAIN_CREATE_SWAP_DIFF_SURFACE, swapchain_layer_name, - "vkCreateSwapchainKHR() called with pCreateInfo->oldSwapchain pCreateInfo->surface."); - } - } - } - return skip_call; } @@ -1941,12 +1918,6 @@ VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR s // Delete the SwpSwapchain associated with this swapchain: if (pSwapchain->pDevice) { pSwapchain->pDevice->swapchains.erase(swapchain); - if (device != pSwapchain->pDevice->device) { - skip_call |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - reinterpret_cast<uint64_t>(device), __LINE__, SWAPCHAIN_DESTROY_SWAP_DIFF_DEVICE, swapchain_layer_name, - "vkDestroySwapchainKHR() called with a different VkDevice than the VkSwapchainKHR was created with."); - } } if (pSwapchain->pSurface) { pSwapchain->pSurface->swapchains.erase(swapchain); diff --git a/layers/swapchain.h b/layers/swapchain.h index 2f63a614..8ba39dce 100644 --- a/layers/swapchain.h +++ b/layers/swapchain.h @@ -54,9 +54,6 @@ enum SWAPCHAIN_ERROR { SWAPCHAIN_CREATE_SWAP_BAD_SHARING_MODE, // Called vkCreateSwapchainKHR() with a non-supported imageSharingMode SWAPCHAIN_CREATE_SWAP_BAD_SHARING_VALUES, // Called vkCreateSwapchainKHR() with bad values when imageSharingMode is // VK_SHARING_MODE_CONCURRENT - SWAPCHAIN_CREATE_SWAP_DIFF_SURFACE, // Called vkCreateSwapchainKHR() with pCreateInfo->oldSwapchain that has a different surface - // than pCreateInfo->surface - SWAPCHAIN_DESTROY_SWAP_DIFF_DEVICE, // Called vkDestroySwapchainKHR() with a different VkDevice than vkCreateSwapchainKHR() SWAPCHAIN_APP_ACQUIRES_TOO_MANY_IMAGES, // vkAcquireNextImageKHR() asked for more images than are available SWAPCHAIN_BAD_BOOL, // VkBool32 that doesn't have value of VK_TRUE or VK_FALSE (e.g. is a non-zero form of true) SWAPCHAIN_PRIOR_COUNT, // Query must be called first to get value of pCount, then called second time diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index d0514333..381928b8 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -122,6 +122,8 @@ The Draw State portion of the core validation layer tracks state leading into Dr | Proper synchronization of acquired images | vkAcquireNextImageKHR should be called with a valid semaphore and/or fence | SWAPCHAIN_NO_SYNC_FOR_ACQUIRE | vkAcquireNextImageKHR | TODO | None | | Swapchain image index too large | Validates that an image index is within the number of images in a swapchain | SWAPCHAIN_INVALID_IMAGE | vkQueuePresentKHR | VkWsiEnabledLayerTest.TestEnabledWsi | None | | Can't present a non-owned image | Validates that application only presents images that it owns | SWAPCHAIN_IMAGE_NOT_ACQUIRED | vkQueuePresentKHR | TODO | None | +| Surface already has swapchain | Cannot create a swapchain for a surface that already has one [other than the swapchain being replaced] | SWAPCHAIN_ALREADY_EXISTS | vkCreateSwapchainKHR | TODO | None | +| Swapchain replacement | pCreateInfo->surface must match pCreateInfo->oldSwapchain's surface | SWAPCHAIN_WRONG_SURFACE | vkCreateSwapchainKHR | TODO | None | ### VK_LAYER_LUNARG_core_validation Draw State Pending Work @@ -348,8 +350,6 @@ This layer is a work in progress. VK_LAYER_LUNARG_swapchain layer is intended to | vkCreateSwapchainKHR(pCreateInfo->presentMode) | Validates vkCreateSwapchainKHR(pCreateInfo->presentMode) | CREATE_SWAP_BAD_PRESENT_MODE | vkCreateSwapchainKHR | TODO | None | | vkCreateSwapchainKHR(pCreateInfo->imageSharingMode) | Validates vkCreateSwapchainKHR(pCreateInfo->imageSharingMode) | CREATE_SWAP_BAD_SHARING_MODE | vkCreateSwapchainKHR | VkWsiEnabledLayerTest.TestEnabledWsi | None | | vkCreateSwapchainKHR(pCreateInfo->imageSharingMode) | Validates vkCreateSwapchainKHR(pCreateInfo->imageSharingMode) | CREATE_SWAP_BAD_SHARING_VALUES | vkCreateSwapchainKHR | VkWsiEnabledLayerTest.TestEnabledWsi | None | -| vkCreateSwapchainKHR(pCreateInfo->oldSwapchain and pCreateInfo->surface) | pCreateInfo->surface must match pCreateInfo->oldSwapchain's surface | CREATE_SWAP_DIFF_SURFACE | vkCreateSwapchainKHR | TODO | None | -| Use same device for swapchain | Validates that vkDestroySwapchainKHR() called with the same VkDevice as vkCreateSwapchainKHR() | DESTROY_SWAP_DIFF_DEVICE | vkCreateSwapchainKHR vkDestroySwapchainKHR | TODO | None | | Don't acquire too many images | Validates that app never tries to acquire too many swapchain images at a time | APP_ACQUIRES_TOO_MANY_IMAGES | vkAcquireNextImageKHR | TODO | None | | A VkBool32 must have values of VK_TRUE or VK_FALSE | Validates that a VkBool32 must have values of VK_TRUE or VK_FALSE | BAD_BOOL | vkCreateSwapchainKHR | TODO | None | | pCount must be set by the API before the other pointer is non-NULL | Validates that app queries for the value of pCount before trying to set it | PRIOR_COUNT | vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfacePresentModesKHR vkGetSwapchainImagesKHR | VkWsiEnabledLayerTest.TestEnabledWsi | None | |
