From e2ca5d47475f7bb42d865acc13cc8ac4e84b992f Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 16 May 2017 14:42:25 -0600 Subject: [PATCH] layers: Add basic support for new extension Add basic validation support for KHR_shared_presentable_image. Change-Id: If6cc5abe6b41ed8580fc89bcf7c8103af971abc9 --- layers/buffer_validation.cpp | 44 ++++++++++++++++++++++----------- layers/core_validation.cpp | 23 +++++++++++------ layers/core_validation_error_enums.h | 1 + layers/device_extensions.h | 3 +++ layers/vk_validation_error_database.txt | 2 +- 5 files changed, 50 insertions(+), 23 deletions(-) diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 3fd4e9a..c24400e 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -584,13 +584,15 @@ bool VerifyImageLayout(layer_data const *device_data, GLOBAL_CB_NODE const *cb_n "%s: For optimal performance image 0x%" PRIxLEAST64 " layout should be %s instead of GENERAL.", caller, reinterpret_cast(image), string_VkImageLayout(optimal_layout)); } - } else if (image_state->shared_presentable) { - if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != explicit_layout) { - // TODO: Add unique error id when available. - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, msg_code, "DS", - "Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", - string_VkImageLayout(optimal_layout)); + } else if (GetDeviceExtensions(device_data)->khr_shared_presentable_image) { + if (image_state->shared_presentable) { + if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != explicit_layout) { + // TODO: Add unique error id when available. + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, msg_code, "DS", + "Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", + string_VkImageLayout(optimal_layout)); + } } } else { *error = true; @@ -897,13 +899,21 @@ bool VerifyClearImageLayout(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IM reinterpret_cast(image_state->image), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "%s: Layout for cleared image should be TRANSFER_DST_OPTIMAL instead of GENERAL.", func_name); } - } else if (image_state->shared_presentable) { - if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != dest_image_layout) { - // TODO: Add unique error id when available. - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 0, "DS", - "Layout for shared presentable cleared image is %s but can only be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", - string_VkImageLayout(dest_image_layout)); + } else if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR == dest_image_layout) { + if (!GetDeviceExtensions(device_data)->khr_shared_presentable_image) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + reinterpret_cast(image_state->image), __LINE__, 0, "DS", + "Must enable VK_KHR_shared_presentable_image extension before creating images with a layout type " + "of VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR."); + + } else { + if (image_state->shared_presentable) { + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + reinterpret_cast(image_state->image), __LINE__, 0, "DS", + "Layout for shared presentable cleared image is %s but can only be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", + string_VkImageLayout(dest_image_layout)); + } } } else { UNIQUE_VALIDATION_ERROR_CODE error_code = VALIDATION_ERROR_01086; @@ -2205,7 +2215,11 @@ bool ValidateMaskBitsFromLayouts(core_validation::layer_data *device_data, VkCom // avoid only a WAR hazard -- any writes need to be ordered after // the PE's reads. There is no need for a memory dependency for this // case. - /* fallthrough */ + // Intentionally fall through + + case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR: + // Todo -- shouldn't be valid unless extension is enabled + // Intentionally fall through case VK_IMAGE_LAYOUT_GENERAL: default: { break; } diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index fb81f7a..3cd41e0 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -10345,13 +10345,20 @@ static bool PreCallValidateCreateSwapchainKHR(layer_data *dev_data, const char * // Validate state for shared presentable case if (VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR == pCreateInfo->presentMode || VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR == pCreateInfo->presentMode) { - if (pCreateInfo->minImageCount != 1) { - // TODO: Add unique error id when available. + if (!dev_data->device_extensions.khr_shared_presentable_image) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - reinterpret_cast(dev_data->device), __LINE__, DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "DS", + reinterpret_cast(dev_data->device), __LINE__, DRAWSTATE_EXTENSION_NOT_ENABLED, "DS", + "%s called with presentMode %s which requires the VK_KHR_shared_presentable_image extension, which has not " + "been enabled.", + func_name, string_VkPresentModeKHR(pCreateInfo->presentMode))) + return true; + } else if (pCreateInfo->minImageCount != 1) { + if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, + reinterpret_cast(dev_data->device), __LINE__, VALIDATION_ERROR_03295, "DS", "%s called with presentMode %s, but minImageCount value is %d. For shared presentable image, minImageCount " - "must be 1.", - func_name, string_VkPresentModeKHR(pCreateInfo->presentMode), pCreateInfo->minImageCount)) + "must be 1. %s", + func_name, string_VkPresentModeKHR(pCreateInfo->presentMode), pCreateInfo->minImageCount, + validation_error_map[VALIDATION_ERROR_03295])) return true; } } @@ -10539,12 +10546,14 @@ VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInf vector layouts; if (FindLayouts(dev_data, image, layouts)) { for (auto layout : layouts) { - if (layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) { + if ((layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) && + (!dev_data->device_extensions.khr_shared_presentable_image || + (layout != VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, reinterpret_cast(queue), __LINE__, VALIDATION_ERROR_01964, "DS", "Images passed to present must be in layout " - "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR but is in %s. %s", + "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR but is in %s. %s", string_VkImageLayout(layout), validation_error_map[VALIDATION_ERROR_01964]); } } diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index ac82b9b..199d075 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -159,6 +159,7 @@ enum DRAW_STATE_ERROR { DRAWSTATE_SWAPCHAIN_BAD_FORMAT, DRAWSTATE_SWAPCHAIN_REPLACED, DRAWSTATE_SWAPCHAIN_IMAGES_NOT_FOUND, + DRAWSTATE_EXTENSION_NOT_ENABLED, }; // Shader Checker ERROR codes diff --git a/layers/device_extensions.h b/layers/device_extensions.h index 742bffa..ad1e7d0 100644 --- a/layers/device_extensions.h +++ b/layers/device_extensions.h @@ -48,6 +48,7 @@ struct DeviceExtensions { bool nv_external_memory_win32; bool nvx_device_generated_commands; bool khr_incremental_present; + bool khr_shared_presentable_image; void InitFromDeviceCreateInfo(const VkDeviceCreateInfo *pCreateInfo) { using E = DeviceExtensions; @@ -84,6 +85,8 @@ struct DeviceExtensions { #endif {VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, &E::nvx_device_generated_commands}, {VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, &E::khr_incremental_present}, + {VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, &E::khr_shared_presentable_image}, + }; for (auto ext : known_extensions) { diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt index bda6e03..c42d958 100644 --- a/layers/vk_validation_error_database.txt +++ b/layers/vk_validation_error_database.txt @@ -3095,7 +3095,7 @@ VALIDATION_ERROR_03291~^~N~^~Unknown~^~vkGetPhysicalDeviceSurfaceFormats2KHR~^~F VALIDATION_ERROR_03292~^~N~^~Unknown~^~vkGetPhysicalDeviceSurfaceFormats2KHR~^~For more information refer to Vulkan Spec Section '30.5. Surface Queries' which states 'If the value referenced by pSurfaceFormatCount is not 0, and pSurfaceFormats is not NULL, pSurfaceFormats must be a pointer to an array of pSurfaceFormatCount VkSurfaceFormat2KHR structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#vkGetPhysicalDeviceSurfaceFormats2KHR)~^~implicit VALIDATION_ERROR_03293~^~Y~^~Unknown~^~vkGetSwapchainStatusKHR~^~For more information refer to Vulkan Spec Section '30.8. WSI Swapchain' which states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#vkGetSwapchainStatusKHR)~^~implicit VALIDATION_ERROR_03294~^~Y~^~Unknown~^~vkGetSwapchainStatusKHR~^~For more information refer to Vulkan Spec Section '30.8. WSI Swapchain' which states 'swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#vkGetSwapchainStatusKHR)~^~implicit -VALIDATION_ERROR_03295~^~N~^~Unknown~^~vkCreateSwapchainKHR~^~For more information refer to Vulkan Spec Section '30.8. WSI Swapchain' which states 'minImageCount must be 1 if presentMode is either VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkSwapchainCreateFlagBitsKHR)~^~ +VALIDATION_ERROR_03295~^~Y~^~None~^~vkCreateSwapchainKHR~^~For more information refer to Vulkan Spec Section '30.8. WSI Swapchain' which states 'minImageCount must be 1 if presentMode is either VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkSwapchainCreateFlagBitsKHR)~^~ VALIDATION_ERROR_03296~^~N~^~Unknown~^~vkCreateSwapchainKHR~^~For more information refer to Vulkan Spec Section '30.8. WSI Swapchain' which states 'imageUsage must be a subset of the supported usage flags present in the sharedPresentSupportedUsageFlags member of the VkSharedPresentSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilities2KHR for the surface if presentMode is set to either VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkSwapchainCreateFlagBitsKHR)~^~ VALIDATION_ERROR_03297~^~N~^~Unknown~^~vkQueuePresentKHR~^~For more information refer to Vulkan Spec Section '30.8. WSI Swapchain' which states 'swapchainCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247)~^~implicit -- 2.7.4