aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2015-08-04 16:24:20 -0600
committerMark Lobodzinski <mark@lunarg.com>2015-08-04 16:32:44 -0600
commit4192027f9395f9512bf39cf46a7abcaae9957f2e (patch)
tree2a48c722c921f0c6965b7de3d70b498ad71e2fce
parent4143efcf4bff17100e3f8fa180f392577905775c (diff)
downloadusermoji-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.cpp18
-rw-r--r--layers/draw_state.h2
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;