diff options
author | Nanley Chery <[email protected]> | 2017-05-24 10:16:38 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-07-22 20:12:10 -0700 |
commit | be516ba9b1ed8cd0dd0c32ded138e9f92c928b72 (patch) | |
tree | ae9461ecb8c06c2133ebdc69adfa164dc8c900aa | |
parent | 597ff919e7d3540627da19a03ebaf2d6a24f4bd3 (diff) |
anv/cmd_buffer: Skip some input attachment transitions
Signed-off-by: Nanley Chery <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 3f4e92276fc..6e20416c490 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2773,14 +2773,12 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer, * this is not the last use of the buffer. The layout should not have * changed from the first call and no transition is necessary. */ - assert(att_ref->layout == att_state->current_layout); + assert(att_state->current_layout == att_ref->layout || + att_state->current_layout == + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); continue; } - /* Get the appropriate target layout for this attachment. */ - const VkImageLayout target_layout = subpass_end ? - att_desc->final_layout : att_ref->layout; - /* The attachment index must be less than the number of attachments * within the framebuffer. */ @@ -2790,6 +2788,29 @@ cmd_buffer_subpass_transition_layouts(struct anv_cmd_buffer * const cmd_buffer, cmd_state->framebuffer->attachments[att_ref->attachment]; const struct anv_image * const image = iview->image; + /* Get the appropriate target layout for this attachment. */ + VkImageLayout target_layout; + + /* A resolve is necessary before use as an input attachment if the clear + * color or auxiliary buffer usage isn't supported by the sampler. + */ + const bool input_needs_resolve = + (att_state->fast_clear && !att_state->clear_color_is_zero_one) || + att_state->input_aux_usage != att_state->aux_usage; + if (subpass_end) { + target_layout = att_desc->final_layout; + } else if (iview->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT && + !input_needs_resolve) { + /* Layout transitions before the final only help to enable sampling as + * an input attachment. If the input attachment supports sampling + * using the auxiliary surface, we can skip such transitions by making + * the target layout one that is CCS-aware. + */ + target_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + } else { + target_layout = att_ref->layout; + } + /* Perform the layout transition. */ if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { transition_depth_buffer(cmd_buffer, image, |