aboutsummaryrefslogtreecommitdiff
path: root/layers/buffer_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2017-02-07 16:36:03 -0700
committerMark Lobodzinski <mark@lunarg.com>2017-02-08 10:25:28 -0700
commit148ffe71bb94a0c8189918592e666c2a9474e750 (patch)
tree46ed38a2141f8829428f482d49f734c810186132 /layers/buffer_validation.cpp
parent79343aac8492c6cddd58ee7fc29745e7408dd789 (diff)
downloadusermoji-148ffe71bb94a0c8189918592e666c2a9474e750.tar.xz
layers: Move ValidateCmdBufImageLayouts out of CV
Change-Id: I358250b6cacd42e4c2b28b324e3683b51efe75e0
Diffstat (limited to 'layers/buffer_validation.cpp')
-rw-r--r--layers/buffer_validation.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 2de17dea..0b58b866 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -1501,4 +1501,46 @@ void PreCallRecordCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_
UpdateCmdBufferLastCmd(device_data, cb_node, CMD_BLITIMAGE);
}
-
+// This validates that the initial layout specified in the command buffer for
+// the IMAGE is the same
+// as the global IMAGE layout
+bool ValidateCmdBufImageLayouts(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB) {
+ const debug_report_data *report_data = core_validation::GetReportData(dev_data);
+ bool skip_call = false;
+ for (auto cb_image_data : pCB->imageLayoutMap) {
+ VkImageLayout imageLayout;
+ if (!FindGlobalLayout(dev_data, cb_image_data.first, imageLayout)) {
+ skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS",
+ "Cannot submit cmd buffer using deleted image 0x%" PRIx64 ".",
+ reinterpret_cast<const uint64_t &>(cb_image_data.first));
+ } else {
+ if (cb_image_data.second.initialLayout == VK_IMAGE_LAYOUT_UNDEFINED) {
+ // TODO: Set memory invalid which is in mem_tracker currently
+ } else if (imageLayout != cb_image_data.second.initialLayout) {
+ if (cb_image_data.first.hasSubresource) {
+ skip_call |= log_msg(
+ report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ reinterpret_cast<uint64_t &>(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS",
+ "Cannot submit cmd buffer using image (0x%" PRIx64
+ ") [sub-resource: aspectMask 0x%X array layer %u, mip level %u], "
+ "with layout %s when first use is %s.",
+ reinterpret_cast<const uint64_t &>(cb_image_data.first.image), cb_image_data.first.subresource.aspectMask,
+ cb_image_data.first.subresource.arrayLayer, cb_image_data.first.subresource.mipLevel,
+ string_VkImageLayout(imageLayout), string_VkImageLayout(cb_image_data.second.initialLayout));
+ } else {
+ skip_call |=
+ log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t &>(pCB->commandBuffer),
+ __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "Cannot submit cmd buffer using image (0x%" PRIx64
+ ") with layout %s when "
+ "first use is %s.",
+ reinterpret_cast<const uint64_t &>(cb_image_data.first.image), string_VkImageLayout(imageLayout),
+ string_VkImageLayout(cb_image_data.second.initialLayout));
+ }
+ }
+ SetGlobalLayout(dev_data, cb_image_data.first, cb_image_data.second.layout);
+ }
+ }
+ return skip_call;
+}