aboutsummaryrefslogtreecommitdiff
path: root/layers/buffer_validation.cpp
diff options
context:
space:
mode:
authorDave Houlton <daveh@lunarg.com>2017-02-21 15:59:08 -0700
committerDave Houlton <daveh@lunarg.com>2017-02-22 15:11:12 -0700
commit70887210f9c26ef6a3be1a208baa708a08c9265e (patch)
treeb16cff1f30032457ab79cc4660b62a98dcee1991 /layers/buffer_validation.cpp
parent74d2075ad768c577cd2e985082add0c5613458ed (diff)
downloadusermoji-70887210f9c26ef6a3be1a208baa708a08c9265e.tar.xz
layers: Fix a bug in depth/stencil packing
Fixed incorrect size calculations for image<->buffer copies due to special packing rules of depth and stencil formats. Added test code to layer_validation_tests ImageBufferCopyTests to exercise these checks. Change-Id: I90446379ba8888bf91eda6567e18fa1aae9593b1
Diffstat (limited to 'layers/buffer_validation.cpp')
-rw-r--r--layers/buffer_validation.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 76389cfc..41bfb9d8 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -2685,6 +2685,27 @@ static inline bool ValidtateBufferBounds(const debug_report_data *report_data, I
VkDeviceSize buffer_height = (0 == pRegions[i].bufferImageHeight ? copy_extent.height : pRegions[i].bufferImageHeight);
VkDeviceSize unit_size = vk_format_get_size(image_state->createInfo.format); // size (bytes) of texel or block
+ // Handle special buffer packing rules for specific depth/stencil formats
+ if (pRegions[i].imageSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
+ unit_size = vk_format_get_size(VK_FORMAT_S8_UINT);
+ } else if (pRegions[i].imageSubresource.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
+ switch (image_state->createInfo.format) {
+ case VK_FORMAT_D16_UNORM_S8_UINT:
+ unit_size = vk_format_get_size(VK_FORMAT_D16_UNORM);
+ break;
+ case VK_FORMAT_D32_SFLOAT_S8_UINT:
+ unit_size = vk_format_get_size(VK_FORMAT_D32_SFLOAT);
+ break;
+ case VK_FORMAT_X8_D24_UNORM_PACK32:
+ // Intentionally fall through
+ case VK_FORMAT_D24_UNORM_S8_UINT:
+ unit_size = 4;
+ break;
+ default:
+ break;
+ }
+ }
+
if (vk_format_is_compressed(image_state->createInfo.format)) {
VkExtent2D texel_block_extent = vk_format_compressed_block_size(image_state->createInfo.format);
buffer_width /= texel_block_extent.width; // switch to texel block units