diff options
author | Jason Ekstrand <[email protected]> | 2017-04-06 14:15:55 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-04-14 14:20:42 -0700 |
commit | 220974b38dfcd557f4a6bc723e4b5d15add39f84 (patch) | |
tree | 9014dab4e9da274facd0ef8d5f081c59e83c92e3 /src | |
parent | 21d2ca72d88e00ddf37c7e1030472e184a038195 (diff) |
anv/blorp: Properly handle VK_ATTACHMENT_UNUSED
The Vulkan driver was originally written under the assumption that
VK_ATTACHMENT_UNUSED was basically just for depth-stencil attachments.
However, the way things fell together, VK_ATTACHMENT_UNUSED can be used
anywhere in the subpass description. The blorp-based clear and resolve
code has a bunch of places where we walk lists of attachments and we
weren't handling VK_ATTACHMENT_UNUSED everywhere. This commit should
fix all of them.
Reviewed-by: Nanley Chery <[email protected]>
Cc: <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/intel/vulkan/anv_blorp.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 1755663e2ac..257ed9bbcf8 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1108,14 +1108,19 @@ subpass_needs_clear(const struct anv_cmd_buffer *cmd_buffer) for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) { uint32_t a = cmd_state->subpass->color_attachments[i].attachment; + if (a == VK_ATTACHMENT_UNUSED) + continue; + + assert(a < cmd_state->pass->attachment_count); if (cmd_state->attachments[a].pending_clear_aspects) { return true; } } - if (ds != VK_ATTACHMENT_UNUSED && - cmd_state->attachments[ds].pending_clear_aspects) { - return true; + if (ds != VK_ATTACHMENT_UNUSED) { + assert(ds < cmd_state->pass->attachment_count); + if (cmd_state->attachments[ds].pending_clear_aspects) + return true; } return false; @@ -1147,6 +1152,10 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer) struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) { const uint32_t a = cmd_state->subpass->color_attachments[i].attachment; + if (a == VK_ATTACHMENT_UNUSED) + continue; + + assert(a < cmd_state->pass->attachment_count); struct anv_attachment_state *att_state = &cmd_state->attachments[a]; if (!att_state->pending_clear_aspects) @@ -1206,6 +1215,7 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer) } const uint32_t ds = cmd_state->subpass->depth_stencil_attachment.attachment; + assert(ds == VK_ATTACHMENT_UNUSED || ds < cmd_state->pass->attachment_count); if (ds != VK_ATTACHMENT_UNUSED && cmd_state->attachments[ds].pending_clear_aspects) { @@ -1520,8 +1530,12 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer) blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); for (uint32_t i = 0; i < subpass->color_count; ++i) { - ccs_resolve_attachment(cmd_buffer, &batch, - subpass->color_attachments[i].attachment); + const uint32_t att = subpass->color_attachments[i].attachment; + if (att == VK_ATTACHMENT_UNUSED) + continue; + + assert(att < cmd_buffer->state.pass->attachment_count); + ccs_resolve_attachment(cmd_buffer, &batch, att); } if (subpass->has_resolve) { @@ -1540,6 +1554,9 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer) if (dst_att == VK_ATTACHMENT_UNUSED) continue; + assert(src_att < cmd_buffer->state.pass->attachment_count); + assert(dst_att < cmd_buffer->state.pass->attachment_count); + if (cmd_buffer->state.attachments[dst_att].pending_clear_aspects) { /* From the Vulkan 1.0 spec: * |