diff options
author | Jason Ekstrand <[email protected]> | 2017-11-21 20:29:36 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-02-20 13:49:25 -0800 |
commit | bd356e1bcf5f481775ef26b0f8ad29a48cf6f685 (patch) | |
tree | 04332162c954a2b66cc13b5ab103048878baf4df | |
parent | e526d49edd9fe7ccf37ae22fd698a6c24de66ac4 (diff) |
anv/cmd_buffer: Add a concept of pending load aspects
These are the same as pending clear aspects only for the "load"
operation.
Reviewed-by: Nanley Chery <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_private.h | 1 | ||||
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 22 |
2 files changed, 17 insertions, 6 deletions
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d9c855b9690..020f293f0f0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1689,6 +1689,7 @@ struct anv_attachment_state { VkImageLayout current_layout; VkImageAspectFlags pending_clear_aspects; + VkImageAspectFlags pending_load_aspects; bool fast_clear; VkClearValue clear_value; bool clear_color_is_zero_one; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index f21eaa4b3cf..db93210d2aa 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -1132,26 +1132,36 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer, struct anv_render_pass_attachment *att = &pass->attachments[i]; VkImageAspectFlags att_aspects = vk_format_aspects(att->format); VkImageAspectFlags clear_aspects = 0; + VkImageAspectFlags load_aspects = 0; if (att_aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) { /* color attachment */ if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { clear_aspects |= VK_IMAGE_ASPECT_COLOR_BIT; + } else if (att->load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { + load_aspects |= VK_IMAGE_ASPECT_COLOR_BIT; } } else { /* depthstencil attachment */ - if ((att_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) && - att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { - clear_aspects |= VK_IMAGE_ASPECT_DEPTH_BIT; + if (att_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { + if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { + clear_aspects |= VK_IMAGE_ASPECT_DEPTH_BIT; + } else if (att->load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { + load_aspects |= VK_IMAGE_ASPECT_DEPTH_BIT; + } } - if ((att_aspects & VK_IMAGE_ASPECT_STENCIL_BIT) && - att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { - clear_aspects |= VK_IMAGE_ASPECT_STENCIL_BIT; + if (att_aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { + if (att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { + clear_aspects |= VK_IMAGE_ASPECT_STENCIL_BIT; + } else if (att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { + load_aspects |= VK_IMAGE_ASPECT_STENCIL_BIT; + } } } state->attachments[i].current_layout = att->initial_layout; state->attachments[i].pending_clear_aspects = clear_aspects; + state->attachments[i].pending_load_aspects = load_aspects; if (clear_aspects) state->attachments[i].clear_value = begin->pClearValues[i]; |