diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2015-08-04 16:24:20 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2015-08-04 16:32:44 -0600 |
| commit | 4192027f9395f9512bf39cf46a7abcaae9957f2e (patch) | |
| tree | 2a48c722c921f0c6965b7de3d70b498ad71e2fce | |
| parent | 4143efcf4bff17100e3f8fa180f392577905775c (diff) | |
| download | usermoji-4192027f9395f9512bf39cf46a7abcaae9957f2e.tar.xz | |
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.
| -rw-r--r-- | layers/draw_state.cpp | 18 | ||||
| -rw-r--r-- | layers/draw_state.h | 2 |
2 files changed, 20 insertions, 0 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index d21dc60b..714d578d 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 5491e488..63e814f2 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<VkDescriptorSet> boundDescriptorSets; } GLOBAL_CB_NODE; |
