Finished migration of validation checks out of cmd_pipeline.c
Added check to DrawState layer for submission of Primary cmd buffer in vkCmdExecuteCommands() call. Added a test to verify the check.
Replaced some other checks in cmd_pipeline.c with asserts and the checks themselves are already handled in ParamChecker.
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index cf101b7..10b56d8 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -3115,10 +3115,20 @@
if (!pCB->activeRenderPass) {
skipCall |= log_msg(mdd(pCB->cmdBuffer), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NO_ACTIVE_RENDERPASS, "DS",
"Incorrect call to vkCmdExecuteCommands() without an active RenderPass.");
- } else {
- updateCBTracking(cmdBuffer);
- skipCall |= addCmd(pCB, CMD_EXECUTECOMMANDS);
}
+ GLOBAL_CB_NODE* pSubCB = NULL;
+ for (uint32_t i=0; i<cmdBuffersCount; i++) {
+ pSubCB = getCBNode(pCmdBuffers[i]);
+ if (!pSubCB) {
+ skipCall |= log_msg(mdd(pCB->cmdBuffer), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_INVALID_SECONDARY_CMD_BUFFER, "DS",
+ "vkCmdExecuteCommands() called w/ invalid Cmd Buffer %p in element %u of pCmdBuffers array.", (void*)pCmdBuffers[i], i);
+ } else if (VK_CMD_BUFFER_LEVEL_PRIMARY == pSubCB->createInfo.level) {
+ skipCall |= log_msg(mdd(pCB->cmdBuffer), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_INVALID_SECONDARY_CMD_BUFFER, "DS",
+ "vkCmdExecuteCommands() called w/ Primary Cmd Buffer %p in element %u of pCmdBuffers array. All cmd buffers in pCmdBuffers array must be secondary.", (void*)pCmdBuffers[i], i);
+ }
+ }
+ updateCBTracking(cmdBuffer);
+ skipCall |= addCmd(pCB, CMD_EXECUTECOMMANDS);
}
if (VK_FALSE == skipCall)
get_dispatch_table(draw_state_device_table_map, cmdBuffer)->CmdExecuteCommands(cmdBuffer, cmdBuffersCount, pCmdBuffers);
@@ -3407,6 +3417,8 @@
return (PFN_vkVoidFunction) vkCmdNextSubpass;
if (!strcmp(funcName, "vkCmdEndRenderPass"))
return (PFN_vkVoidFunction) vkCmdEndRenderPass;
+ if (!strcmp(funcName, "vkCmdExecuteCommands"))
+ return (PFN_vkVoidFunction) vkCmdExecuteCommands;
VkLayerDispatchTable* pTable = get_dispatch_table(draw_state_device_table_map, dev);
if (deviceExtMap.size() == 0 || deviceExtMap[pTable].debug_marker_enabled)