diff options
| author | Dave Houlton <daveh@lunarg.com> | 2018-04-10 16:41:14 -0600 |
|---|---|---|
| committer | Dave Houlton <daveh@lunarg.com> | 2018-04-12 14:05:51 -0600 |
| commit | 78bfa6c301bd1d87ec8aa3c097455beac0b65c4f (patch) | |
| tree | 6916d40fa11e1290929facad4886f69ddafdae95 /layers/buffer_validation.cpp | |
| parent | b4c7b602e4238558e7001ca541e0fe8924c5c2ec (diff) | |
| download | usermoji-78bfa6c301bd1d87ec8aa3c097455beac0b65c4f.tar.xz | |
layers: maint2 image usage bit validation
Add partial support for VK_IMAGE_CREATE_EXTENDED_USAGE_BIT in
vkCreateImage(), currently just avoiding the usage bit checks when
EXTENDED_USAGE is specified. Full support will require an
exhaustive search of all compatible format's usage bits, which
seems pretty expensive. TODO for now.
Adds support for checking for a chained VkImageViewUsageCreateInfo
struct when doing usage bit validation in vkCreateImageView().
Change-Id: I79a5853dc93dfa54040ace162170f1226a978c2d
Diffstat (limited to 'layers/buffer_validation.cpp')
| -rw-r--r-- | layers/buffer_validation.cpp | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index b0dddba6..7532ea1a 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -29,6 +29,7 @@ #include "vk_layer_data.h" #include "vk_layer_utils.h" #include "vk_layer_logging.h" +#include "vk_typemap_helper.h" #include "buffer_validation.h" @@ -721,27 +722,29 @@ bool PreCallValidateCreateImage(layer_data *device_data, const VkImageCreateInfo return skip; } - if ((pCreateInfo->usage & VK_IMAGE_USAGE_SAMPLED_BIT) && !(features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { - std::stringstream ss; - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007ae : VALIDATION_ERROR_09e007a4); - ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_SAMPLED_BIT is not supported for format " << format_string << " with tiling " - << tiling_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, "%s.", - ss.str().c_str()); - } - - if ((pCreateInfo->usage & VK_IMAGE_USAGE_STORAGE_BIT) && !(features & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) { - std::stringstream ss; - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007b0 : VALIDATION_ERROR_09e007a6); - ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_STORAGE_BIT is not supported for format " << format_string << " with tiling " - << tiling_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, "%s.", - ss.str().c_str()); - } - // TODO: Add checks for EXTENDED_USAGE images to validate images are compatible - // For EXTENDED_USAGE images, format can match any image COMPATIBLE with original image + // For EXTENDED_USAGE images, any usage bit set for any format compatible with image format becomes legal + // For now we'll just avoid the usage bit checks for EXTENDED_USAGE images, pending an implementation of + // an exhaustive search of compatible formats if (!GetDeviceExtensions(device_data)->vk_khr_maintenance2 || !(pCreateInfo->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR)) { + if ((pCreateInfo->usage & VK_IMAGE_USAGE_SAMPLED_BIT) && !(features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { + std::stringstream ss; + UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007ae : VALIDATION_ERROR_09e007a4); + ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_SAMPLED_BIT is not supported for format " << format_string + << " with tiling " << tiling_string; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, "%s.", + ss.str().c_str()); + } + + if ((pCreateInfo->usage & VK_IMAGE_USAGE_STORAGE_BIT) && !(features & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) { + std::stringstream ss; + UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007b0 : VALIDATION_ERROR_09e007a6); + ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_STORAGE_BIT is not supported for format " << format_string + << " with tiling " << tiling_string; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, "%s.", + ss.str().c_str()); + } + // Validate that format supports usage as color attachment if ((pCreateInfo->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && (0 == (features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))) { @@ -3412,6 +3415,21 @@ bool PreCallValidateCreateImageView(layer_data *device_data, const VkImageViewCr VkImageType image_type = image_state->createInfo.imageType; VkImageViewType view_type = create_info->viewType; + // If there's a chained VkImageViewUsageCreateInfo struct, modify image_usage to match + auto chained_ivuci_struct = lvl_find_in_chain<VkImageViewUsageCreateInfoKHR>(create_info->pNext); + if (chained_ivuci_struct) { + if (chained_ivuci_struct->usage & ~image_usage) { + std::stringstream ss; + ss << "vkCreateImageView(): Chained VkImageViewUsageCreateInfo usage field (0x" << std::hex + << chained_ivuci_struct->usage << "must not include flags not present in underlying image's usage (0x" + << image_usage << ")."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_3f200c66, "%s", ss.str().c_str()); + } + + image_usage = chained_ivuci_struct->usage; + } + // Validate VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT state if (image_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) { if ((!GetDeviceExtensions(device_data)->vk_khr_maintenance2 || |
