aboutsummaryrefslogtreecommitdiff
path: root/layers/buffer_validation.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2017-02-17 15:17:04 -0700
committerTobin Ehlis <tobine@google.com>2017-04-07 10:28:02 -0600
commit4f211053e71ceed79449a98514c7d190b1247a2a (patch)
treea07e976869a15b5c04cfe5495000a01174065f0a /layers/buffer_validation.cpp
parent8e04c6f0054eccf28f26245255eb05685a7c11ba (diff)
downloadusermoji-4f211053e71ceed79449a98514c7d190b1247a2a.tar.xz
layers:Refactor image layout validation
Streamline some of the image layout validation code. At the time of CmdBeginRenderPass() remove the layout transition from validation code and perform the layout transitions all at once. This allows a bit of transition code to be killed so that the initial transition code can share TransitionSubpassLayouts() function.
Diffstat (limited to 'layers/buffer_validation.cpp')
-rw-r--r--layers/buffer_validation.cpp53
1 files changed, 29 insertions, 24 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index dbe72559..7f07a1d0 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -288,10 +288,8 @@ bool VerifyFramebufferAndRenderPassLayouts(layer_data *device_data, GLOBAL_CB_NO
assert(view_state);
const VkImage &image = view_state->create_info.image;
const VkImageSubresourceRange &subRange = view_state->create_info.subresourceRange;
- IMAGE_CMD_BUF_LAYOUT_NODE newNode = {pRenderPassInfo->pAttachments[i].initialLayout,
- pRenderPassInfo->pAttachments[i].initialLayout};
+ auto initial_layout = pRenderPassInfo->pAttachments[i].initialLayout;
// TODO: Do not iterate over every possibility - consolidate where possible
- // TODO: Consolidate this with SetImageViewLayout() function above
for (uint32_t j = 0; j < subRange.levelCount; j++) {
uint32_t level = subRange.baseMipLevel + j;
for (uint32_t k = 0; k < subRange.layerCount; k++) {
@@ -299,25 +297,18 @@ bool VerifyFramebufferAndRenderPassLayouts(layer_data *device_data, GLOBAL_CB_NO
VkImageSubresource sub = {subRange.aspectMask, level, layer};
IMAGE_CMD_BUF_LAYOUT_NODE node;
if (!FindCmdBufLayout(device_data, pCB, image, sub, node)) {
- // If ImageView was created with depth or stencil, transition both aspects if it's a DS image
- if (subRange.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
- if (FormatIsDepthAndStencil(view_state->create_info.format)) {
- sub.aspectMask |= (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
- }
- }
- SetLayout(device_data, pCB, image, sub, newNode);
+ // Missing layouts will be added during state update
continue;
}
- if (newNode.layout != VK_IMAGE_LAYOUT_UNDEFINED && newNode.layout != node.layout) {
- 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_RENDERPASS, "DS",
- "You cannot start a render pass using attachment %u "
- "where the render pass initial layout is %s and the previous "
- "known layout of the attachment is %s. The layouts must match, or "
- "the render pass initial layout for the attachment must be "
- "VK_IMAGE_LAYOUT_UNDEFINED",
- i, string_VkImageLayout(newNode.layout), string_VkImageLayout(node.layout));
+ if (initial_layout != VK_IMAGE_LAYOUT_UNDEFINED && initial_layout != node.layout) {
+ skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+ DRAWSTATE_INVALID_RENDERPASS, "DS",
+ "You cannot start a render pass using attachment %u "
+ "where the render pass initial layout is %s and the previous "
+ "known layout of the attachment is %s. The layouts must match, or "
+ "the render pass initial layout for the attachment must be "
+ "VK_IMAGE_LAYOUT_UNDEFINED",
+ i, string_VkImageLayout(initial_layout), string_VkImageLayout(node.layout));
}
}
}
@@ -333,13 +324,12 @@ void TransitionAttachmentRefLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB,
}
}
-void TransitionSubpassLayouts(layer_data *device_data, GLOBAL_CB_NODE *pCB, const VkRenderPassBeginInfo *pRenderPassBegin,
+void TransitionSubpassLayouts(layer_data *device_data, GLOBAL_CB_NODE *pCB, const RENDER_PASS_STATE *render_pass_state,
const int subpass_index, FRAMEBUFFER_STATE *framebuffer_state) {
- auto renderPass = GetRenderPassState(device_data, pRenderPassBegin->renderPass);
- if (!renderPass) return;
+ assert(render_pass_state);
if (framebuffer_state) {
- auto const &subpass = renderPass->createInfo.pSubpasses[subpass_index];
+ auto const &subpass = render_pass_state->createInfo.pSubpasses[subpass_index];
for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) {
TransitionAttachmentRefLayout(device_data, pCB, framebuffer_state, subpass.pInputAttachments[j]);
}
@@ -377,6 +367,21 @@ bool ValidateImageAspectLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, con
return skip;
}
+// Transition the layout state for renderpass attachments based on the BeginRenderPass() call. This includes:
+// 1. Transition into initialLayout state
+// 2. Transition from initialLayout to layout used in subpass 0
+void TransitionBeginRenderPassLayouts(layer_data *device_data, GLOBAL_CB_NODE *cb_state, const RENDER_PASS_STATE *render_pass_state,
+ FRAMEBUFFER_STATE *framebuffer_state) {
+ // First transition into initialLayout
+ auto const rpci = render_pass_state->createInfo.ptr();
+ for (uint32_t i = 0; i < rpci->attachmentCount; ++i) {
+ VkImageView image_view = framebuffer_state->createInfo.pAttachments[i];
+ SetImageViewLayout(device_data, cb_state, image_view, rpci->pAttachments[i].initialLayout);
+ }
+ // Now transition for first subpass (index 0)
+ TransitionSubpassLayouts(device_data, cb_state, render_pass_state, 0, framebuffer_state);
+}
+
void TransitionImageAspectLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, const VkImageMemoryBarrier *mem_barrier,
uint32_t level, uint32_t layer, VkImageAspectFlags aspect) {
if (!(mem_barrier->subresourceRange.aspectMask & aspect)) {