From 418c2e8d72f3e052c292053352b1fbf5593ddc49 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 18 Aug 2015 07:10:58 -0600 Subject: layers: Add validation check to enforce ONE_TIME_SUBMIT of cmd buffers Track createInfo and beginInfo independently per cmdBuffer & check begin flags at QueueSubmit time to verify cmd buffer not submitted multiple times if VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT is set. Add CmdBufferTwoSubmits test to verify this check. --- layers/draw_state.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'layers/draw_state.cpp') diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 0e82f3b0..c6a82d98 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -1111,13 +1111,11 @@ static void resetCB(const VkCmdBuffer cb) cmd_list.pop_back(); } pCB->pCmds.clear(); - // Reset CB state - VkFlags saveFlags = pCB->flags; - VkCmdPool savedPool = pCB->pool; + // Reset CB state (need to save createInfo) + VkCmdBufferCreateInfo saveCBCI = pCB->createInfo; memset(pCB, 0, sizeof(GLOBAL_CB_NODE)); pCB->cmdBuffer = cb; - pCB->flags = saveFlags; - pCB->pool = savedPool; + pCB->createInfo = saveCBCI; pCB->lastVtxBinding = MAX_BINDING; } } @@ -1468,6 +1466,11 @@ VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCo // Validate that cmd buffers have been updated pCB = getCBNode(pCmdBuffers[i]); loader_platform_thread_lock_mutex(&globalLock); + pCB->submitCount++; // increment submit count + if ((pCB->beginInfo.flags & VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT) && (pCB->submitCount > 1)) { + log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_CMD_BUFFER_SINGLE_SUBMIT_VIOLATION, "DS", + "CB %#" PRIxLEAST64 " was created w/ VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT set, but has been submitted %#" PRIxLEAST64 " times.", reinterpret_cast(pCB->cmdBuffer), pCB->submitCount); + } if (CB_UPDATE_COMPLETE != pCB->state) { // Flag error for using CB w/o vkEndCommandBuffer() called // TODO : How to pass cb as srcObj? @@ -1986,8 +1989,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device, const VkCm GLOBAL_CB_NODE* pCB = new GLOBAL_CB_NODE; memset(pCB, 0, sizeof(GLOBAL_CB_NODE)); pCB->cmdBuffer = *pCmdBuffer; - pCB->flags = pCreateInfo->flags; - pCB->pool = pCreateInfo->cmdPool; + pCB->createInfo = *pCreateInfo; pCB->lastVtxBinding = MAX_BINDING; pCB->level = pCreateInfo->level; cmdBufferMap[*pCmdBuffer] = pCB; @@ -2015,19 +2017,17 @@ VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const "vkCreateCommandBuffer(): Secondary Command Buffers (%p) must specify framebuffer and renderpass parameters", (void*)cmdBuffer); } } + pCB->beginInfo = *pBeginInfo; + } else { + // TODO : Need to pass cmdBuffer as objType here + log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", + "In vkBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (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); - if (pCB) { - if (CB_NEW != pCB->state) - resetCB(cmdBuffer); - pCB->state = CB_UPDATE_ACTIVE; - } else { - // TODO : Need to pass cmdBuffer as objType here - log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", - "In vkBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer); - } + if (CB_NEW != pCB->state) + resetCB(cmdBuffer); + pCB->state = CB_UPDATE_ACTIVE; updateCBTracking(cmdBuffer); } return result; -- cgit v1.2.3