diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-05-11 10:38:29 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-05-11 12:32:14 -0600 |
| commit | 72090ca8d9990e281dc9149055fb0541e5c84dc2 (patch) | |
| tree | af40d1ac80b40964b9fec78be21927c191684dd5 /layers/core_validation.cpp | |
| parent | ff8ab29de704bed4b4f2e59e00b7869c8f760311 (diff) | |
| download | usermoji-72090ca8d9990e281dc9149055fb0541e5c84dc2.tar.xz | |
layers: Migrate INVALID_IMAGE_LAYOUT check to renderpass create time
Previously performing this check at CmdBeginRenderPass time, but we have
all of the data needed when renderpass is created so check there instead.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 443ca501..7b270ee0 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8290,6 +8290,25 @@ static bool ValidateDependencies(const layer_data *my_data, const VkRenderPassBe } return skip_call; } +// ValidateLayoutVsAttachmentDescription is a general function where we can validate various state associated with the +// VkAttachmentDescription structs that are used by the sub-passes of a renderpass. Initial check is to make sure that +// READ_ONLY layout attachments don't have CLEAR as their loadOp. +static bool ValidateLayoutVsAttachmentDescription(debug_report_data *report_data, const VkImageLayout first_layout, + const uint32_t attachment, + const VkAttachmentDescription &attachment_description) { + bool skip_call = false; + // Verify that initial loadOp on READ_ONLY attachments is not CLEAR + if (attachment_description.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) { + if ((first_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) || + (first_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + VkDebugReportObjectTypeEXT(0), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + "Cannot clear attachment %d with invalid first layout %s.", attachment, string_VkImageLayout(first_layout)); + } + } + return skip_call; +} static bool ValidateLayouts(const layer_data *my_data, VkDevice device, const VkRenderPassCreateInfo *pCreateInfo) { bool skip = false; @@ -8297,6 +8316,7 @@ static bool ValidateLayouts(const layer_data *my_data, VkDevice device, const Vk for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { const VkSubpassDescription &subpass = pCreateInfo->pSubpasses[i]; for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { + const VkAttachmentDescription attach_desc = pCreateInfo->pAttachments[subpass.pInputAttachments[j].attachment]; if (subpass.pInputAttachments[j].layout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL && subpass.pInputAttachments[j].layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { if (subpass.pInputAttachments[j].layout == VK_IMAGE_LAYOUT_GENERAL) { @@ -8311,6 +8331,9 @@ static bool ValidateLayouts(const layer_data *my_data, VkDevice device, const Vk string_VkImageLayout(subpass.pInputAttachments[j].layout)); } } + auto attach_index = subpass.pInputAttachments[j].attachment; + skip |= ValidateLayoutVsAttachmentDescription(my_data->report_data, subpass.pInputAttachments[j].layout, attach_index, + pCreateInfo->pAttachments[attach_index]); } for (uint32_t j = 0; j < subpass.colorAttachmentCount; ++j) { if (subpass.pColorAttachments[j].layout != VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { @@ -8326,6 +8349,9 @@ static bool ValidateLayouts(const layer_data *my_data, VkDevice device, const Vk string_VkImageLayout(subpass.pColorAttachments[j].layout)); } } + auto attach_index = subpass.pColorAttachments[j].attachment; + skip |= ValidateLayoutVsAttachmentDescription(my_data->report_data, subpass.pColorAttachments[j].layout, attach_index, + pCreateInfo->pAttachments[attach_index]); } if ((subpass.pDepthStencilAttachment != NULL) && (subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED)) { if (subpass.pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { @@ -8342,6 +8368,9 @@ static bool ValidateLayouts(const layer_data *my_data, VkDevice device, const Vk string_VkImageLayout(subpass.pDepthStencilAttachment->layout)); } } + auto attach_index = subpass.pDepthStencilAttachment->attachment; + skip |= ValidateLayoutVsAttachmentDescription(my_data->report_data, subpass.pDepthStencilAttachment->layout, + attach_index, pCreateInfo->pAttachments[attach_index]); } } return skip; @@ -8753,15 +8782,6 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p }; cb_data->second->validate_functions.push_back(function); } - VkImageLayout &attachment_layout = pRPNode->attachment_first_layout[pRPNode->attachments[i].attachment]; - if (attachment_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL || - attachment_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - (uint64_t)(pRenderPassBegin->renderPass), __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", - "Cannot clear attachment %d with invalid first layout %d.", - pRPNode->attachments[i].attachment, attachment_layout); - } } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<bool()> function = [=]() { |
