aboutsummaryrefslogtreecommitdiff
path: root/layers
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2017-05-16 14:42:25 -0600
committerMark Lobodzinski <mark@lunarg.com>2017-05-17 08:15:42 -0600
commite2ca5d47475f7bb42d865acc13cc8ac4e84b992f (patch)
treef3ff9be1c38c3267c01a810cf30e142bd27c16c3 /layers
parentad190dca307a079766a6f558ddda4e2774b2c136 (diff)
downloadusermoji-e2ca5d47475f7bb42d865acc13cc8ac4e84b992f.tar.xz
layers: Add basic support for new extension
Add basic validation support for KHR_shared_presentable_image. Change-Id: If6cc5abe6b41ed8580fc89bcf7c8103af971abc9
Diffstat (limited to 'layers')
-rw-r--r--layers/buffer_validation.cpp44
-rw-r--r--layers/core_validation.cpp23
-rw-r--r--layers/core_validation_error_enums.h1
-rw-r--r--layers/device_extensions.h3
-rw-r--r--layers/vk_validation_error_database.txt2
5 files changed, 50 insertions, 23 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 3fd4e9ab..c24400e2 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<const uint64_t &>(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<uint64_t &>(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<uint64_t &>(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<uint64_t &>(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 fb81f7ad..3cd41e04 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<uint64_t>(dev_data->device), __LINE__, DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "DS",
+ reinterpret_cast<uint64_t>(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<uint64_t>(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<VkImageLayout> 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<uint64_t &>(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 ac82b9b4..199d075f 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 742bffad..ad1e7d08 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 bda6e037..c42d9581 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