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);
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);
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;
VkRenderPass activeRenderPass;
uint32_t activeSubpass;
VkFramebuffer framebuffer;
+ VkCmdBufferLevel level;
vector<VkDescriptorSet> boundDescriptorSets;
} GLOBAL_CB_NODE;