From: Mark Lobodzinski Date: Tue, 4 Aug 2015 22:24:20 +0000 (-0600) Subject: layers: DrawState validation cases for BeginCommandBuffer X-Git-Tag: upstream/1.1.92~5080 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4192027f9395f9512bf39cf46a7abcaae9957f2e;p=platform%2Fupstream%2FVulkan-Tools.git layers: DrawState validation cases for BeginCommandBuffer Framebuffer and Renderpass must be NULL for PRIMARY CBs, non-NULL for SECONDARY command buffers. Test cases also added. --- diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index d21dc60..714d578 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -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); diff --git a/layers/draw_state.h b/layers/draw_state.h index 5491e48..63e814f 100644 --- a/layers/draw_state.h +++ b/layers/draw_state.h @@ -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 boundDescriptorSets; } GLOBAL_CB_NODE;