diff options
| author | Dave Houlton <daveh@lunarg.com> | 2018-02-02 16:18:52 -0700 |
|---|---|---|
| committer | Dave Houlton <daveh@lunarg.com> | 2018-03-08 09:46:53 -0700 |
| commit | 3f746dac981f5c9f3aba116d2c17762c669c1149 (patch) | |
| tree | fd1fb4ba5db7ce59d6d7a4f694930f9b59c13417 /layers | |
| parent | 6f433a8b2f8bb5b5446054a46e3399896b215c04 (diff) | |
| download | usermoji-3f746dac981f5c9f3aba116d2c17762c669c1149.tar.xz | |
layers: Param validation checks multiplane bits
Update parameter validation checks to recognize the new aspect flag
bits added by VK_KHR_sampler_ycbcr_conversion extension
(VK_IMAGE_ASPECT_PLANE_n_BIT_KHR). Update core validation checks to
avoid false positives when copying multiplane images.
Change-Id: I6fb19ff76386ce55f3b44b0301ba7cd7f7e88547
Diffstat (limited to 'layers')
| -rw-r--r-- | layers/buffer_validation.cpp | 24 | ||||
| -rw-r--r-- | layers/parameter_validation_utils.cpp | 42 |
2 files changed, 46 insertions, 20 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 8bb4fd44..4167e7a6 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -1228,8 +1228,13 @@ static bool RangesIntersect(int32_t start, uint32_t start_offset, int32_t end, u } // Returns true if two VkImageCopy structures overlap -static bool RegionIntersects(const VkImageCopy *src, const VkImageCopy *dst, VkImageType type) { +static bool RegionIntersects(const VkImageCopy *src, const VkImageCopy *dst, VkImageType type, bool is_multiplane) { bool result = false; + + if (is_multiplane && (src->srcSubresource.aspectMask != dst->dstSubresource.aspectMask)) { + return result; + } + if ((src->srcSubresource.mipLevel == dst->dstSubresource.mipLevel) && (RangesIntersect(src->srcSubresource.baseArrayLayer, src->srcSubresource.layerCount, dst->dstSubresource.baseArrayLayer, dst->dstSubresource.layerCount))) { @@ -1830,12 +1835,14 @@ bool PreCallValidateCmdCopyImage(layer_data *device_data, GLOBAL_CB_NODE *cb_nod } } - // For each region, the aspectMask member of srcSubresource and dstSubresource must match - if (region.srcSubresource.aspectMask != region.dstSubresource.aspectMask) { - char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00112, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_09c00112]); + if (!GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + // not multi-plane, the aspectMask member of srcSubresource and dstSubresource must match + if (region.srcSubresource.aspectMask != region.dstSubresource.aspectMask) { + char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00112, "IMAGE", "%s. %s", str, + validation_error_map[VALIDATION_ERROR_09c00112]); + } } // For each region, the aspectMask member of srcSubresource must be present in the source image @@ -2007,7 +2014,8 @@ bool PreCallValidateCmdCopyImage(layer_data *device_data, GLOBAL_CB_NODE *cb_nod // must not overlap in memory if (src_image_state->image == dst_image_state->image) { for (uint32_t j = 0; j < region_count; j++) { - if (RegionIntersects(®ion, ®ions[j], src_image_state->createInfo.imageType)) { + if (RegionIntersects(®ion, ®ions[j], src_image_state->createInfo.imageType, + FormatIsMultiplane(src_image_state->createInfo.format))) { std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] src overlaps with pRegions[" << j << "]."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp index 56962654..7b0cd78b 100644 --- a/layers/parameter_validation_utils.cpp +++ b/layers/parameter_validation_utils.cpp @@ -2399,17 +2399,21 @@ bool pv_vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageL bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->srcSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, VALIDATION_ERROR_0a600c01, LayerName, "vkCmdCopyImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator. %s", validation_error_map[VALIDATION_ERROR_0a600c01]); } - if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->dstSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, VALIDATION_ERROR_0a600c01, LayerName, @@ -2425,16 +2429,20 @@ bool pv_vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageL bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->srcSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, UNRECOGNIZED_VALUE, LayerName, "vkCmdBlitImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator"); } - if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->dstSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, UNRECOGNIZED_VALUE, LayerName, @@ -2449,9 +2457,14 @@ bool pv_vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->imageSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, UNRECOGNIZED_VALUE, LayerName, "vkCmdCopyBufferToImage() parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an " @@ -2466,9 +2479,14 @@ bool pv_vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->imageSubresource.aspectMask & legal_aspect_flags) == 0) { log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, UNRECOGNIZED_VALUE, LayerName, "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized " |
