From d1e4c7bb6535a64a77a923ee2c05098cffcdee32 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 16 Jun 2016 17:14:34 +1200 Subject: layers: Untangle validate+update in QueuePresentKHR Change-Id: I8f719c6e57cbab836b90f30414e6494a0643580e Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 69 +++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index ba365080..b9c6be77 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9911,54 +9911,61 @@ GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pCoun VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); - VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; - if (pPresentInfo) { - std::lock_guard lock(global_lock); - for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) { - const VkSemaphore &semaphore = pPresentInfo->pWaitSemaphores[i]; - if (dev_data->semaphoreMap.find(semaphore) != dev_data->semaphoreMap.end()) { - if (dev_data->semaphoreMap[semaphore].signaled) { - dev_data->semaphoreMap[semaphore].signaled = false; - } else { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", - "Queue 0x%" PRIx64 " is waiting on semaphore 0x%" PRIx64 " that has no way to be signaled.", - reinterpret_cast(queue), reinterpret_cast(semaphore)); - } - } + std::lock_guard lock(global_lock); + for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) { + auto pSemaphore = getSemaphoreNode(dev_data, pPresentInfo->pWaitSemaphores[i]); + if (pSemaphore && !pSemaphore->signaled) { + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + "Queue 0x%" PRIx64 " is waiting on semaphore 0x%" PRIx64 " that has no way to be signaled.", + reinterpret_cast(queue), reinterpret_cast(pPresentInfo->pWaitSemaphores[i])); } - VkDeviceMemory mem; - for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) { - auto swapchain_data = getSwapchainNode(dev_data, pPresentInfo->pSwapchains[i]); - if (swapchain_data && pPresentInfo->pImageIndices[i] < swapchain_data->images.size()) { - VkImage image = swapchain_data->images[pPresentInfo->pImageIndices[i]]; + } + VkDeviceMemory mem; + for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) { + auto swapchain_data = getSwapchainNode(dev_data, pPresentInfo->pSwapchains[i]); + if (swapchain_data && pPresentInfo->pImageIndices[i] < swapchain_data->images.size()) { + VkImage image = swapchain_data->images[pPresentInfo->pImageIndices[i]]; #if MTMERGESOURCE - skip_call |= + skip_call |= get_mem_binding_from_object(dev_data, (uint64_t)(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem); - skip_call |= validate_memory_is_valid(dev_data, mem, "vkQueuePresentKHR()", image); + skip_call |= validate_memory_is_valid(dev_data, mem, "vkQueuePresentKHR()", image); #endif - vector layouts; - if (FindLayouts(dev_data, image, layouts)) { - for (auto layout : layouts) { - if (layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) { - skip_call |= + vector layouts; + if (FindLayouts(dev_data, image, layouts)) { + for (auto layout : layouts) { + if (layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, reinterpret_cast(queue), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "Images passed to present must be in layout " "PRESENT_SOURCE_KHR but is in %s", string_VkImageLayout(layout)); - } } } } } } - if (!skip_call) - result = dev_data->device_dispatch_table->QueuePresentKHR(queue, pPresentInfo); + if (skip_call) { + return VK_ERROR_VALIDATION_FAILED_EXT; + } + + VkResult result = dev_data->device_dispatch_table->QueuePresentKHR(queue, pPresentInfo); + + if (result != VK_ERROR_VALIDATION_FAILED_EXT) { + // Semaphore waits occur before error generation, if the call reached + // the ICD. (Confirm?) + for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) { + auto pSemaphore = getSemaphoreNode(dev_data, pPresentInfo->pWaitSemaphores[i]); + if (pSemaphore && pSemaphore->signaled) { + pSemaphore->signaled = false; + } + } + } return result; } -- cgit v1.2.3