diff options
| author | Cort <github@dangerware.org> | 2016-12-05 17:33:49 -0800 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-12-09 09:35:31 -0700 |
| commit | 0729911dfd20287a76bd3513636bbaf17a5ba9da (patch) | |
| tree | 63c708fdb0306f3e4c47bf6c6c80c52339b1317d /layers/core_validation.cpp | |
| parent | bc56474cd3743ca7898f1e032b61c5426e78bf5f (diff) | |
| download | usermoji-0729911dfd20287a76bd3513636bbaf17a5ba9da.tar.xz | |
Core validation: VerifyClearImageLayout tweaks:
- Move test for invalid layouts before test for valid-but-non-matching layout
- Use unique error codes
- Pass caller function name to differentiate between color and depth/stencil clears
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 65 |
1 files changed, 41 insertions, 24 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index b7cc5177..67e0475c 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8243,12 +8243,37 @@ static bool VerifyDestImageLayout(layer_data *dev_data, GLOBAL_CB_NODE *cb_node, } static bool VerifyClearImageLayout(layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage image, VkImageSubresourceRange range, - VkImageLayout destImageLayout) { + VkImageLayout destImageLayout, const char *func_name) { bool skip_call = false; VkImageSubresourceRange resolvedRange = range; ResolveRemainingLevelsLayers(dev_data, &resolvedRange, image); + if (destImageLayout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { + if (destImageLayout == VK_IMAGE_LAYOUT_GENERAL) { + auto image_state = getImageState(dev_data, image); + if (image_state->createInfo.tiling != VK_IMAGE_TILING_LINEAR) { + // LAYOUT_GENERAL is allowed, but may not be performance optimal, flag as perf warning. + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, + (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + "Layout for cleared image should be TRANSFER_DST_OPTIMAL instead of GENERAL."); + } + } else { + UNIQUE_VALIDATION_ERROR_CODE error_code = VALIDATION_ERROR_00000; + if (strcmp(func_name, "vkCmdClearColorImage()") == 0) { + error_code = VALIDATION_ERROR_01086; + } else if (strcmp(func_name, "vkCmdClearDepthStencilImage()") == 0) { + error_code = VALIDATION_ERROR_01101; + } else { + assert(0); + } + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + error_code, "DS", "Layout for cleared image is %s but can only be " + "TRANSFER_DST_OPTIMAL or GENERAL. %s", + string_VkImageLayout(destImageLayout), validation_error_map[error_code]); + } + } + for (uint32_t levelIdx = 0; levelIdx < range.levelCount; ++levelIdx) { uint32_t level = levelIdx + range.baseMipLevel; for (uint32_t layerIdx = 0; layerIdx < range.layerCount; ++layerIdx) { @@ -8260,31 +8285,23 @@ static bool VerifyClearImageLayout(layer_data *dev_data, GLOBAL_CB_NODE *cb_node continue; } if (node.layout != destImageLayout) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, - __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "Cannot clear an image whose layout is %s and " - "doesn't match the current layout %s.", - string_VkImageLayout(destImageLayout), string_VkImageLayout(node.layout)); + UNIQUE_VALIDATION_ERROR_CODE error_code = VALIDATION_ERROR_00000; + if (strcmp(func_name, "vkCmdClearColorImage()") == 0) { + error_code = VALIDATION_ERROR_01085; + } else if (strcmp(func_name, "vkCmdClearDepthStencilImage()") == 0) { + error_code = VALIDATION_ERROR_01100; + } else { + assert(0); + } + skip_call |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, + __LINE__, error_code, "DS", "Cannot clear an image whose layout is %s and " + "doesn't match the current layout %s. %s", + string_VkImageLayout(destImageLayout), string_VkImageLayout(node.layout), validation_error_map[error_code]); } } } - if (destImageLayout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { - if (destImageLayout == VK_IMAGE_LAYOUT_GENERAL) { - auto image_state = getImageState(dev_data, image); - if (image_state->createInfo.tiling != VK_IMAGE_TILING_LINEAR) { - // LAYOUT_GENERAL is allowed, but may not be performance optimal, flag as perf warning. - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", - "Layout for cleared image should be TRANSFER_DST_OPTIMAL instead of GENERAL."); - } - } else { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "Layout for cleared image is %s but can only be " - "TRANSFER_DST_OPTIMAL or GENERAL.", - string_VkImageLayout(destImageLayout)); - } - } return skip_call; } @@ -8846,7 +8863,7 @@ VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkI assert(0); } for (uint32_t i = 0; i < rangeCount; ++i) { - skip_call |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout); + skip_call |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearColorImage()"); } lock.unlock(); if (!skip_call) @@ -8879,7 +8896,7 @@ CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageL assert(0); } for (uint32_t i = 0; i < rangeCount; ++i) { - skip_call |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout); + skip_call |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearDepthStencilImage()"); } lock.unlock(); if (!skip_call) |
