aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorCort <github@dangerware.org>2016-12-05 17:33:49 -0800
committerTobin Ehlis <tobine@google.com>2016-12-09 09:35:31 -0700
commit0729911dfd20287a76bd3513636bbaf17a5ba9da (patch)
tree63c708fdb0306f3e4c47bf6c6c80c52339b1317d /layers/core_validation.cpp
parentbc56474cd3743ca7898f1e032b61c5426e78bf5f (diff)
downloadusermoji-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.cpp65
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)