aboutsummaryrefslogtreecommitdiff
path: root/layers/draw_state.cpp
diff options
context:
space:
mode:
authorCourtney Goeltzenleuchter <courtney@LunarG.com>2015-10-15 16:51:05 -0600
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2015-10-23 17:31:13 -0600
commit21eb93d89a7ac0cd281d7bb3ca277c7fc7163380 (patch)
treeed2b12c9c8e9ba82ce9360cb1c15be6b2083d5a6 /layers/draw_state.cpp
parent0db2c910ea48122e229ea45ad3301bf9a70a5331 (diff)
downloadusermoji-21eb93d89a7ac0cd281d7bb3ca277c7fc7163380.tar.xz
bug-14291: combine color and depth/stencil clears
Diffstat (limited to 'layers/draw_state.cpp')
-rwxr-xr-xlayers/draw_state.cpp108
1 files changed, 43 insertions, 65 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index edba3896..a6f8bbf2 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -173,12 +173,10 @@ static string cmdTypeToString(CMD_TYPE cmd)
return "CMD_FILLBUFFER";
case CMD_CLEARCOLORIMAGE:
return "CMD_CLEARCOLORIMAGE";
- case CMD_CLEARCOLORATTACHMENT:
+ case CMD_CLEARATTACHMENTS:
return "CMD_CLEARCOLORATTACHMENT";
case CMD_CLEARDEPTHSTENCILIMAGE:
return "CMD_CLEARDEPTHSTENCILIMAGE";
- case CMD_CLEARDEPTHSTENCILATTACHMENT:
- return "CMD_CLEARDEPTHSTENCILATTACHMENT";
case CMD_RESOLVEIMAGE:
return "CMD_RESOLVEIMAGE";
case CMD_SETEVENT:
@@ -2761,11 +2759,10 @@ VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destB
dev_data->device_dispatch_table->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
}
-VK_LAYER_EXPORT void VKAPI vkCmdClearColorAttachment(
+VK_LAYER_EXPORT void VKAPI vkCmdClearAttachments(
VkCmdBuffer cmdBuffer,
- uint32_t colorAttachment,
- VkImageLayout imageLayout,
- const VkClearColorValue* pColor,
+ uint32_t attachmentCount,
+ const VkClearAttachment* pAttachments,
uint32_t rectCount,
const VkRect3D* pRects)
{
@@ -2776,70 +2773,53 @@ VK_LAYER_EXPORT void VKAPI vkCmdClearColorAttachment(
if (pCB->state == CB_UPDATE_ACTIVE) {
// Warn if this is issued prior to Draw Cmd
if (!hasDrawCmd(pCB)) {
- skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0, DRAWSTATE_CLEAR_CMD_BEFORE_DRAW, "DS",
- "vkCmdClearColorAttachment() issued on CB object 0x%" PRIxLEAST64 " prior to any Draw Cmds."
- " It is recommended you use RenderPass LOAD_OP_CLEAR on Color Attachments prior to any Draw.", reinterpret_cast<uint64_t>(cmdBuffer));
+ // TODO : cmdBuffer should be srcObj
+ skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_CLEAR_CMD_BEFORE_DRAW, "DS",
+ "vkCmdClearAttachments() issued on CB object 0x%" PRIxLEAST64 " prior to any Draw Cmds."
+ " It is recommended you use RenderPass LOAD_OP_CLEAR on Attachments prior to any Draw.", reinterpret_cast<uint64_t>(cmdBuffer));
}
updateCBTracking(pCB);
- skipCall |= addCmd(dev_data, pCB, CMD_CLEARCOLORATTACHMENT);
+ skipCall |= addCmd(dev_data, pCB, CMD_CLEARATTACHMENTS);
} else {
- skipCall |= report_error_no_cb_begin(dev_data, cmdBuffer, "vkCmdClearColorAttachment()");
- }
-
- // Validate that attachment is in reference list of active subpass
- if (pCB->activeRenderPass) {
- const VkRenderPassCreateInfo *pRPCI = dev_data->renderPassMap[pCB->activeRenderPass.handle];
- const VkSubpassDescription *pSD = &pRPCI->pSubpasses[pCB->activeSubpass];
-
- VkBool32 found = VK_FALSE;
- for (uint32_t i = 0; i < pSD->colorCount; i++) {
- if (colorAttachment == pSD->pColorAttachments[i].attachment) {
- found = VK_TRUE;
- break;
- }
- }
- if (VK_FALSE == found) {
- skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER,
- (uint64_t)cmdBuffer, 0, DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "DS",
- "vkCmdClearColorAttachment() attachment index %d not found in attachment reference array of active subpass %d",
- colorAttachment, pCB->activeSubpass);
- }
+ skipCall |= report_error_no_cb_begin(dev_data, cmdBuffer, "vkCmdClearAttachments()");
}
- skipCall |= outsideRenderPass(dev_data, pCB, "vkCmdClearColorAttachment");
+ skipCall |= outsideRenderPass(dev_data, pCB, "vkCmdClearAttachments");
}
- if (VK_FALSE == skipCall)
- dev_data->device_dispatch_table->CmdClearColorAttachment(cmdBuffer, colorAttachment, imageLayout, pColor, rectCount, pRects);
-}
-VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencilAttachment(
- VkCmdBuffer cmdBuffer,
- VkImageAspectFlags imageAspectMask,
- VkImageLayout imageLayout,
- const VkClearDepthStencilValue* pDepthStencil,
- uint32_t rectCount,
- const VkRect3D* pRects)
-{
- VkBool32 skipCall = VK_FALSE;
- layer_data* dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
- GLOBAL_CB_NODE* pCB = getCBNode(dev_data, cmdBuffer);
- if (pCB) {
- if (pCB->state == CB_UPDATE_ACTIVE) {
- // Warn if this is issued prior to Draw Cmd
- if (!hasDrawCmd(pCB)) {
- // TODO : cmdBuffer should be srcObj
- skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_CLEAR_CMD_BEFORE_DRAW, "DS",
- "vkCmdClearDepthStencilAttachment() issued on CB object 0x%" PRIxLEAST64 " prior to any Draw Cmds."
- " It is recommended you use RenderPass LOAD_OP_CLEAR on DS Attachment prior to any Draw.", reinterpret_cast<uint64_t>(cmdBuffer));
+ // Validate that attachment is in reference list of active subpass
+ if (pCB->activeRenderPass) {
+ const VkRenderPassCreateInfo *pRPCI = dev_data->renderPassMap[pCB->activeRenderPass.handle];
+ const VkSubpassDescription *pSD = &pRPCI->pSubpasses[pCB->activeSubpass];
+
+ for (uint32_t attachment_idx = 0; attachment_idx < attachmentCount; attachment_idx++) {
+ const VkClearAttachment *attachment = &pAttachments[attachment_idx];
+ if (attachment->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
+ VkBool32 found = VK_FALSE;
+ for (uint32_t i = 0; i < pSD->colorCount; i++) {
+ if (attachment->colorAttachment == pSD->pColorAttachments[i].attachment) {
+ found = VK_TRUE;
+ break;
+ }
+ }
+ if (VK_FALSE == found) {
+ skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER,
+ (uint64_t)cmdBuffer, 0, DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "DS",
+ "vkCmdClearAttachments() attachment index %d not found in attachment reference array of active subpass %d",
+ attachment->colorAttachment, pCB->activeSubpass);
+ }
+ } else if (attachment->aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
+ /* TODO: Is this a good test for depth/stencil? */
+ if (pSD->depthStencilAttachment.attachment != attachment->colorAttachment) {
+ skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER,
+ (uint64_t)cmdBuffer, 0, DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "DS",
+ "vkCmdClearAttachments() attachment index %d does not match depthStencilAttachment.attachment (%d) found in active subpass %d",
+ attachment->colorAttachment, pSD->depthStencilAttachment.attachment, pCB->activeSubpass);
+ }
}
- updateCBTracking(pCB);
- skipCall |= addCmd(dev_data, pCB, CMD_CLEARDEPTHSTENCILATTACHMENT);
- } else {
- skipCall |= report_error_no_cb_begin(dev_data, cmdBuffer, "vkCmdClearDepthStencilAttachment()");
}
- skipCall |= outsideRenderPass(dev_data, pCB, "vkCmdClearDepthStencilAttachment");
}
if (VK_FALSE == skipCall)
- dev_data->device_dispatch_table->CmdClearDepthStencilAttachment(cmdBuffer, imageAspectMask, imageLayout, pDepthStencil, rectCount, pRects);
+ dev_data->device_dispatch_table->CmdClearAttachments(cmdBuffer, attachmentCount, pAttachments, rectCount, pRects);
}
VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(
@@ -3621,10 +3601,8 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice dev, const
return (PFN_vkVoidFunction) vkCmdClearColorImage;
if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
return (PFN_vkVoidFunction) vkCmdClearDepthStencilImage;
- if (!strcmp(funcName, "vkCmdClearColorAttachment"))
- return (PFN_vkVoidFunction) vkCmdClearColorAttachment;
- if (!strcmp(funcName, "vkCmdClearDepthStencilAttachment"))
- return (PFN_vkVoidFunction) vkCmdClearDepthStencilAttachment;
+ if (!strcmp(funcName, "vkCmdClearAttachments"))
+ return (PFN_vkVoidFunction) vkCmdClearAttachments;
if (!strcmp(funcName, "vkCmdResolveImage"))
return (PFN_vkVoidFunction) vkCmdResolveImage;
if (!strcmp(funcName, "vkCmdSetEvent"))