diff options
| author | Dave Houlton <daveh@lunarg.com> | 2017-03-02 17:00:10 -0700 |
|---|---|---|
| committer | Dave Houlton <daveh@lunarg.com> | 2017-03-07 11:19:42 -0700 |
| commit | 76bcbd2472e9a4c0dc4830fa4d4c5faba5d11885 (patch) | |
| tree | 6f73afb67c65c693f6fa5e8906b1083b34a436f6 | |
| parent | 6072cc914a1807b803601f7da928edfd4b150104 (diff) | |
| download | usermoji-76bcbd2472e9a4c0dc4830fa4d4c5faba5d11885.tar.xz | |
layers: Add VUs 1275, 1276, 1277 related to gh1507
Adds 3 new valid usage checks related to the bugfix, and the
layer_validation_tests code to exercise 2 of them. The third check,
01277, cannot be provoked by a test because it would require a
compressed texture format with block z-dimension > 1, which does
not (currently) exist for Vulkan.
Change-Id: I6c467e64c420b6a453af57f7ff86e1465e132988
| -rw-r--r-- | layers/buffer_validation.cpp | 36 | ||||
| -rw-r--r-- | layers/vk_validation_error_database.txt | 6 |
2 files changed, 39 insertions, 3 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 214b5b55..ef777d76 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -2647,6 +2647,42 @@ bool ValidateBufferImageCopyData(const debug_report_data *report_data, uint32_t function, i, pRegions[i].bufferOffset, block_size_in_bytes, validation_error_map[VALIDATION_ERROR_01274]); } + + // imageExtent width must be a multiple of block width, or extent+offset width must equal subresource width + if ((vk_safe_modulo(pRegions[i].imageExtent.width, block_size.width) != 0) && + (pRegions[i].imageExtent.width + pRegions[i].imageOffset.x != image_state->createInfo.extent.width)) { + 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__, VALIDATION_ERROR_01275, "IMAGE", + "%s(): pRegion[%d] extent width (%d) must be a multiple of the compressed texture block width (%d), or " + "when added to offset.x (%d) must equal the image subresource width (%d). %s.", + function, i, pRegions[i].imageExtent.width, block_size.width, pRegions[i].imageOffset.x, + image_state->createInfo.extent.width, validation_error_map[VALIDATION_ERROR_01275]); + } + + // imageExtent height must be a multiple of block height, or extent+offset height must equal subresource height + if ((vk_safe_modulo(pRegions[i].imageExtent.height, block_size.height) != 0) && + (pRegions[i].imageExtent.height + pRegions[i].imageOffset.y != image_state->createInfo.extent.height)) { + 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__, VALIDATION_ERROR_01276, "IMAGE", + "%s(): pRegion[%d] extent height (%d) must be a multiple of the compressed texture block height (%d), or " + "when added to offset.y (%d) must equal the image subresource height (%d). %s.", + function, i, pRegions[i].imageExtent.height, block_size.height, pRegions[i].imageOffset.y, + image_state->createInfo.extent.height, validation_error_map[VALIDATION_ERROR_01276]); + } + + // imageExtent depth must be a multiple of block depth, or extent+offset depth must equal subresource depth + if ((vk_safe_modulo(pRegions[i].imageExtent.depth, block_size.depth) != 0) && + (pRegions[i].imageExtent.depth + pRegions[i].imageOffset.z != image_state->createInfo.extent.depth)) { + 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__, VALIDATION_ERROR_01277, "IMAGE", + "%s(): pRegion[%d] extent width (%d) must be a multiple of the compressed texture block depth (%d), or " + "when added to offset.z (%d) must equal the image subresource depth (%d). %s.", + function, i, pRegions[i].imageExtent.depth, block_size.depth, pRegions[i].imageOffset.z, + image_state->createInfo.extent.depth, validation_error_map[VALIDATION_ERROR_01277]); + } } } diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt index 1276f742..01269bb5 100644 --- a/layers/vk_validation_error_database.txt +++ b/layers/vk_validation_error_database.txt @@ -1263,9 +1263,9 @@ VALIDATION_ERROR_01271~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For VALIDATION_ERROR_01272~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'bufferImageHeight must be a multiple of the compressed texel block height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ VALIDATION_ERROR_01273~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'all members of imageOffset must be a multiple of the corresponding dimensions of the compressed texel block' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ VALIDATION_ERROR_01274~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'bufferOffset must be a multiple of the compressed texel block size in bytes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ -VALIDATION_ERROR_01275~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the image subresource width' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ -VALIDATION_ERROR_01276~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the image subresource height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ -VALIDATION_ERROR_01277~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the image subresource depth' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ +VALIDATION_ERROR_01275~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the image subresource width' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ +VALIDATION_ERROR_01276~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the image subresource height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ +VALIDATION_ERROR_01277~^~Y~^~None~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the image subresource depth' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ VALIDATION_ERROR_01278~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'bufferOffset, bufferRowLength, bufferImageHeight and all members of imageOffset and imageExtent must respect the image transfer granularity requirements of the queue family that it will be submitted against, as described in Physical Device Enumeration' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ VALIDATION_ERROR_01279~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'The aspectMask member of imageSubresource must specify aspects present in the calling commands VkImage parameter' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ VALIDATION_ERROR_01280~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~For more information refer to Vulkan Spec Section '18.4. Copying Data Between Buffers and Images' which states 'The aspectMask member of imageSubresource must only have a single bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#VkBufferImageCopy)~^~ |
