layers: DrawState validation cases for BeginCommandBuffer
authorMark Lobodzinski <mark@lunarg.com>
Tue, 4 Aug 2015 22:24:20 +0000 (16:24 -0600)
committerMark Lobodzinski <mark@lunarg.com>
Tue, 4 Aug 2015 22:32:44 +0000 (16:32 -0600)
Framebuffer and Renderpass must be NULL for PRIMARY CBs, non-NULL
for SECONDARY command buffers. Test cases also added.

layers/draw_state.cpp
layers/draw_state.h

index d21dc60..714d578 100644 (file)
@@ -1979,6 +1979,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device, const VkCm
         pCB->flags = pCreateInfo->flags;
         pCB->pool = pCreateInfo->cmdPool;
         pCB->lastVtxBinding = MAX_BINDING;
+        pCB->level = pCreateInfo->level;
         cmdBufferMap[*pCmdBuffer] = pCB;
         loader_platform_thread_unlock_mutex(&globalLock);
         updateCBTracking(*pCmdBuffer);
@@ -1988,6 +1989,23 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device, const VkCm
 
 VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
 {
+    // Validate command buffer level
+    GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
+    if (pCB) {
+        if (pCB->level == VK_CMD_BUFFER_LEVEL_PRIMARY) {
+            if (pBeginInfo->renderPass.handle || pBeginInfo->framebuffer.handle) {
+                // These should be NULL for a Primary CB
+                log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_BEGIN_CB_INVALID_STATE, "DS",
+                    "vkCreateCommandBuffer():  Primary Command Buffer (%p) may not specify framebuffer or renderpass parameters", (void*)cmdBuffer);
+            }
+        } else {
+            if (!pBeginInfo->renderPass.handle || !pBeginInfo->framebuffer.handle) {
+                // These should NOT be null for an Secondary CB
+                log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_BEGIN_CB_INVALID_STATE, "DS",
+                    "vkCreateCommandBuffer():  Secondary Command Buffers (%p) must specify framebuffer and renderpass parameters", (void*)cmdBuffer);
+            }
+        }
+    }
     VkResult result = get_dispatch_table(draw_state_device_table_map, cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
     if (VK_SUCCESS == result) {
         GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
index 5491e48..63e814f 100644 (file)
@@ -61,6 +61,7 @@ typedef enum _DRAW_STATE_ERROR
     DRAWSTATE_NO_ACTIVE_RENDERPASS,             // Rendering cmd submitted without an active RenderPass
     DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED,       // DescriptorSet bound but it was never updated. This is a warning code.
     DRAWSTATE_CLEAR_CMD_BEFORE_DRAW,            // Clear cmd issued before any Draw in CmdBuffer, should use RenderPass Ops instead
+    DRAWSTATE_BEGIN_CB_INVALID_STATE,           // Primary/Secondary CB created with mismatched FB/RP information
     DRAWSTATE_INVALID_EXTENSION,
 } DRAW_STATE_ERROR;
 
@@ -253,5 +254,6 @@ typedef struct _GLOBAL_CB_NODE {
     VkRenderPass                 activeRenderPass;
     uint32_t                     activeSubpass;
     VkFramebuffer                framebuffer;
+    VkCmdBufferLevel             level;
     vector<VkDescriptorSet>      boundDescriptorSets;
 } GLOBAL_CB_NODE;