layers:Add secondary CB warning
authorTobin Ehlis <tobine@google.com>
Tue, 28 Nov 2017 22:02:29 +0000 (15:02 -0700)
committerTobin Ehlis <tobine@google.com>
Fri, 1 Dec 2017 22:04:14 +0000 (15:04 -0700)
Fixes #2237

If VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT is not set by a
secondary command buffer, then any renderPass specified in the
inheritance info will be ignored. Adding a warning if a non-NULL
renderPass is included in the inheritance info but the
VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT is not set. This is
likely an oversight by the user and the current validation error that
this case leads to (no active renderPass) doesn't directly point to the
root cause.

layers/core_validation.cpp

index e08ca12921d7643e88b0ebcc0979a8c8a895d8f5..769c65f26c21c43f90f98c494d9d43d3348ce52b 100644 (file)
@@ -5200,12 +5200,24 @@ VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer,
             cb_node->inheritanceInfo = *(cb_node->beginInfo.pInheritanceInfo);
             cb_node->beginInfo.pInheritanceInfo = &cb_node->inheritanceInfo;
             // If we are a secondary command-buffer and inheriting.  Update the items we should inherit.
-            if ((cb_node->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) &&
-                (cb_node->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
-                cb_node->activeRenderPass = GetRenderPassState(dev_data, cb_node->beginInfo.pInheritanceInfo->renderPass);
-                cb_node->activeSubpass = cb_node->beginInfo.pInheritanceInfo->subpass;
-                cb_node->activeFramebuffer = cb_node->beginInfo.pInheritanceInfo->framebuffer;
-                cb_node->framebuffers.insert(cb_node->beginInfo.pInheritanceInfo->framebuffer);
+            if (cb_node->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
+                if (cb_node->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
+                    cb_node->activeRenderPass = GetRenderPassState(dev_data, cb_node->beginInfo.pInheritanceInfo->renderPass);
+                    cb_node->activeSubpass = cb_node->beginInfo.pInheritanceInfo->subpass;
+                    cb_node->activeFramebuffer = cb_node->beginInfo.pInheritanceInfo->framebuffer;
+                    cb_node->framebuffers.insert(cb_node->beginInfo.pInheritanceInfo->framebuffer);
+                } else if (VK_NULL_HANDLE != cb_node->beginInfo.pInheritanceInfo->renderPass) {
+                    // This is a user-requested warning. This is a likely case where user forgot to set RP continue bit
+                    skip |=
+                        log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
+                                HandleToUint64(cb_node->beginInfo.pInheritanceInfo->renderPass), __LINE__,
+                                VALIDATION_ERROR_0280006a, "CORE",
+                                "vkBeginCommandBuffer(): Secondary command buffer with a non-null pInheritanceInfo->renderPass "
+                                "does not have "
+                                "VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT. If you intend to draw from this command buffer "
+                                "you must set "
+                                "VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT in pBeginInfo->flags.");
+                }
             }
         }
     }