diff options
| author | Tobin Ehlis <tobin@lunarg.com> | 2015-08-18 07:10:58 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobin@lunarg.com> | 2015-08-18 09:37:46 -0600 |
| commit | 418c2e8d72f3e052c292053352b1fbf5593ddc49 (patch) | |
| tree | 5f25a79b87f4d964b9fe00a8bcd21e0dec8902a5 | |
| parent | d311fd0902c3638f2b81a310cd0e5e9a010b6e27 (diff) | |
| download | usermoji-418c2e8d72f3e052c292053352b1fbf5593ddc49.tar.xz | |
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.
| -rw-r--r-- | layers/draw_state.cpp | 34 | ||||
| -rw-r--r-- | layers/draw_state.h | 6 |
2 files changed, 21 insertions, 19 deletions
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<VkUintPtrLeast64>(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; diff --git a/layers/draw_state.h b/layers/draw_state.h index 63e814f2..ebc60f7b 100644 --- a/layers/draw_state.h +++ b/layers/draw_state.h @@ -50,6 +50,7 @@ typedef enum _DRAW_STATE_ERROR DRAWSTATE_NUM_SAMPLES_MISMATCH, // Number of samples in bound PSO does not match number in FB of current RenderPass DRAWSTATE_NO_END_CMD_BUFFER, // Must call vkEndCommandBuffer() before QueueSubmit on that cmdBuffer DRAWSTATE_NO_BEGIN_CMD_BUFFER, // Binding cmds or calling End on CB that never had vkBeginCommandBuffer() called on it + DRAWSTATE_CMD_BUFFER_SINGLE_SUBMIT_VIOLATION, // Cmd Buffer created with VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT flag is submitted multiple times DRAWSTATE_VIEWPORT_NOT_BOUND, // Draw submitted with no viewport state object bound DRAWSTATE_RASTER_NOT_BOUND, // Draw submitted with no raster state object bound DRAWSTATE_COLOR_BLEND_NOT_BOUND, // Draw submitted with no color blend state object bound when color write enabled @@ -235,12 +236,13 @@ typedef enum _CBStatusFlagBits // Cmd Buffer Wrapper Struct typedef struct _GLOBAL_CB_NODE { VkCmdBuffer cmdBuffer; - VkCmdPool pool; - VkFlags flags; + VkCmdBufferCreateInfo createInfo; + VkCmdBufferBeginInfo beginInfo; VkFence fence; // fence tracking this cmd buffer uint64_t numCmds; // number of cmds in this CB uint64_t drawCount[NUM_DRAW_TYPES]; // Count of each type of draw in this CB CB_STATE state; // Track cmd buffer update state + uint64_t submitCount; // Number of times CB has been submitted CBStatusFlags status; // Track status of various bindings on cmd buffer vector<CMD_NODE*> pCmds; // Currently storing "lastBound" objects on per-CB basis |
