Module: Mesa
Branch: main
Commit: 4ad9ccd28a5fec47008a0c66b3c11e4afa7313fd
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4ad9ccd28a5fec47008a0c66b3c11e4afa7313fd

Author: Iván Briano <[email protected]>
Date:   Mon Nov  8 13:10:00 2021 -0800

anv: split end_subpass into more discrete components

v3: Split cmd_buffer_end_subpass instead of doing parts conditionally (Lionel)

Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13980>

---

 src/intel/vulkan/genX_cmd_buffer.c | 47 +++++++++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 6 deletions(-)

diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index eb23f1237cb..6ececf2e8e5 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -6485,13 +6485,8 @@ vk_to_blorp_resolve_mode(VkResolveModeFlagBitsKHR 
vk_mode)
 }
 
 static void
-cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
+cmd_buffer_clear_state_pointers(struct anv_cmd_state *cmd_state)
 {
-   struct anv_cmd_state *cmd_state = &cmd_buffer->state;
-   struct anv_subpass *subpass = cmd_state->subpass;
-   uint32_t subpass_id = anv_get_subpass_id(&cmd_buffer->state);
-   struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
-
    /* We are done with the previous subpass and all rendering directly to that
     * subpass is now complete.  Zero out all the surface states so we don't
     * accidentally use them between now and the next subpass.
@@ -6504,7 +6499,14 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
    }
    cmd_state->null_surface_state = ANV_STATE_NULL;
    cmd_state->attachment_states = ANV_STATE_NULL;
+}
 
+static void
+cmd_buffer_mark_images_written(struct anv_cmd_buffer *cmd_buffer,
+                               struct anv_cmd_state *cmd_state,
+                               struct anv_subpass *subpass,
+                               struct anv_framebuffer *fb)
+{
    for (uint32_t i = 0; i < subpass->attachment_count; ++i) {
       const uint32_t a = subpass->attachments[i].attachment;
       if (a == VK_ATTACHMENT_UNUSED)
@@ -6557,7 +6559,15 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
          }
       }
    }
+}
 
+static void
+cmd_buffer_resolve_attachments(struct anv_cmd_buffer *cmd_buffer,
+                               struct anv_cmd_state *cmd_state,
+                               struct anv_subpass *subpass,
+                               struct anv_framebuffer *fb,
+                               uint32_t subpass_id)
+{
    if (subpass->has_color_resolve) {
       /* We are about to do some MSAA resolves.  We need to flush so that the
        * result of writes to the MSAA color attachments show up in the sampler
@@ -6793,7 +6803,15 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
       }
    }
 #endif /* GFX_VER == 7 */
+}
 
+static void
+cmd_buffer_do_layout_transitions(struct anv_cmd_buffer *cmd_buffer,
+                                 struct anv_cmd_state *cmd_state,
+                                 struct anv_subpass *subpass,
+                                 struct anv_framebuffer *fb,
+                                 uint32_t subpass_id)
+{
    for (uint32_t i = 0; i < subpass->attachment_count; ++i) {
       const uint32_t a = subpass->attachments[i].attachment;
       if (a == VK_ATTACHMENT_UNUSED)
@@ -6850,6 +6868,23 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
                                    false /* will_full_fast_clear */);
       }
    }
+}
+
+static void
+cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer)
+{
+   struct anv_cmd_state *cmd_state = &cmd_buffer->state;
+   struct anv_subpass *subpass = cmd_state->subpass;
+   uint32_t subpass_id = anv_get_subpass_id(&cmd_buffer->state);
+   struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
+
+   cmd_buffer_clear_state_pointers(cmd_state);
+
+   cmd_buffer_mark_images_written(cmd_buffer, cmd_state, subpass, fb);
+
+   cmd_buffer_resolve_attachments(cmd_buffer, cmd_state, subpass, fb, 
subpass_id);
+
+   cmd_buffer_do_layout_transitions(cmd_buffer, cmd_state, subpass, fb, 
subpass_id);
 
    /* Accumulate any subpass flushes that need to happen after the subpass.
     * Yes, they do get accumulated twice in the NextSubpass case but since

Reply via email to