diff options
| author | Mike Stroyan <mike@LunarG.com> | 2015-09-25 13:39:21 -0600 |
|---|---|---|
| committer | Mike Stroyan <mike@LunarG.com> | 2015-10-08 13:00:20 -0600 |
| commit | 8a5ab8aadfd719f8d57858aeb6d5370ad0e89095 (patch) | |
| tree | 486d0b73b353aaeb5851666182f0fef84ca6011a /layers/image.cpp | |
| parent | 80034dd427a3a2e998b092892a2a2c58951bff09 (diff) | |
| download | usermoji-8a5ab8aadfd719f8d57858aeb6d5370ad0e89095.tar.xz | |
intel,layers,tests: move cmd_meta errors to validation
Add checks for alignment in DeviceLimits layer.
Add checks for type, format and sample count in Images layer.
Remove such checks from intel icd.
Add new validations to layer_validation_tests.
Diffstat (limited to 'layers/image.cpp')
| -rw-r--r-- | layers/image.cpp | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/layers/image.cpp b/layers/image.cpp index 912c23f4..93579c72 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -43,6 +43,7 @@ #include "vk_layer_table.h" #include "vk_layer_data.h" #include "vk_layer_extension_utils.h" +#include "vk_layer_utils.h" using namespace std; @@ -518,25 +519,51 @@ VK_LAYER_EXPORT void VKAPI vkCmdCopyImage( const VkImageCopy *pRegions) { VkBool32 skipCall = VK_FALSE; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); + auto srcImageEntry = device_data->imageMap.find(srcImage.handle); + auto destImageEntry = device_data->imageMap.find(destImage.handle); // For each region, src aspect mask must match dest aspect mask // For each region, color aspects cannot be mixed with depth/stencil aspects for (uint32_t i = 0; i < regionCount; i++) { if (pRegions[i].srcSubresource.aspect != pRegions[i].destSubresource.aspect) { - layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match"; skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); } if ((pRegions[i].srcSubresource.aspect & VK_IMAGE_ASPECT_COLOR) && (pRegions[i].srcSubresource.aspect & (VK_IMAGE_ASPECT_DEPTH | VK_IMAGE_ASPECT_STENCIL))) { - layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); char const str[] = "vkCmdCopyImage aspectMask cannot specify both COLOR and DEPTH/STENCIL aspects"; skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str); } } + if ((srcImageEntry != device_data->imageMap.end()) + && (destImageEntry != device_data->imageMap.end())) { + if (srcImageEntry->second->imageType != destImageEntry->second->imageType) { + char const str[] = "vkCmdCopyImage called with unmatched source and dest image types."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str); + } + // Check that format is same size or exact stencil/depth + if (is_depth_format(srcImageEntry->second->format)) { + if (srcImageEntry->second->format != destImageEntry->second->format) { + char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); + } + } else { + size_t srcSize = vk_format_get_size(srcImageEntry->second->format); + size_t destSize = vk_format_get_size(destImageEntry->second->format); + if (srcSize != destSize) { + char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); + } + } + } + if (VK_FALSE == skipCall) { get_dispatch_table(image_device_table_map, cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); @@ -634,18 +661,44 @@ VK_LAYER_EXPORT void VKAPI vkCmdResolveImage( const VkImageResolve *pRegions) { VkBool32 skipCall = VK_FALSE; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); + auto srcImageEntry = device_data->imageMap.find(srcImage.handle); + auto destImageEntry = device_data->imageMap.find(destImage.handle); // For each region, src and dest image aspect must be color only for (uint32_t i = 0; i < regionCount; i++) { if ((pRegions[i].srcSubresource.aspect != VK_IMAGE_ASPECT_COLOR) || (pRegions[i].destSubresource.aspect != VK_IMAGE_ASPECT_COLOR)) { - layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); char const str[] = "vkCmdResolveImage: src and dest aspectMasks for each region must specify only VK_IMAGE_ASPECT_COLOR_BIT"; skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str); } } + if ((srcImageEntry != device_data->imageMap.end()) + && (destImageEntry != device_data->imageMap.end())) { + if (srcImageEntry->second->format != destImageEntry->second->format) { + char const str[] = "vkCmdResolveImage called with unmatched source and dest formats."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); + } + if (srcImageEntry->second->imageType != destImageEntry->second->imageType) { + char const str[] = "vkCmdResolveImage called with unmatched source and dest image types."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str); + } + if (srcImageEntry->second->samples <= 1) { + char const str[] = "vkCmdResolveImage called with source sample count less than 2."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str); + } + if (destImageEntry->second->samples > 1) { + char const str[] = "vkCmdResolveImage called with dest sample count greater than 1."; + skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, + (uint64_t)cmdBuffer, 0, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str); + } + } + if (VK_FALSE == skipCall) { get_dispatch_table(image_device_table_map, cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); |
