Mesa (main): v3dv: don't overallocate tile state for meta TLB operations

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 16 09:51:41 UTC 2021


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

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Fri Jul 16 08:29:08 2021 +0200

v3dv: don't overallocate tile state for meta TLB operations

Generally, all meta operations that are implemented via the TLB and
only involve tile load/store operations only need one layer worth
of tile state memory and a single frame setup pointing the binner
to that memory.

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11923>

---

 src/broadcom/vulkan/v3dv_meta_clear.c   |  2 +-
 src/broadcom/vulkan/v3dv_meta_copy.c    | 13 ++++++++-----
 src/broadcom/vulkan/v3dvx_meta_common.c | 10 +++++-----
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c
index 759d4bfa46d..f6d24d519f7 100644
--- a/src/broadcom/vulkan/v3dv_meta_clear.c
+++ b/src/broadcom/vulkan/v3dv_meta_clear.c
@@ -124,7 +124,7 @@ clear_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
       if (!job)
          return true;
 
-      v3dv_job_start_frame(job, width, height, max_layer, true,
+      v3dv_job_start_frame(job, width, height, max_layer, false,
                            1, internal_bpp,
                            image->samples > VK_SAMPLE_COUNT_1_BIT);
 
diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index 39b92af8991..a2dfbb18ff3 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -408,7 +408,7 @@ copy_image_to_buffer_tlb(struct v3dv_cmd_buffer *cmd_buffer,
    const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w);
    const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h);
 
-   v3dv_job_start_frame(job, width, height, num_layers, true,
+   v3dv_job_start_frame(job, width, height, num_layers, false,
                         1, internal_bpp, false);
 
    struct v3dv_meta_framebuffer framebuffer;
@@ -916,7 +916,7 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
    const uint32_t width = DIV_ROUND_UP(region->extent.width, block_w);
    const uint32_t height = DIV_ROUND_UP(region->extent.height, block_h);
 
-   v3dv_job_start_frame(job, width, height, num_layers, true, 1, internal_bpp,
+   v3dv_job_start_frame(job, width, height, num_layers, false, 1, internal_bpp,
                         src->samples > VK_SAMPLE_COUNT_1_BIT);
 
    struct v3dv_meta_framebuffer framebuffer;
@@ -1420,7 +1420,8 @@ copy_buffer_to_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
    const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w);
    const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h);
 
-   v3dv_job_start_frame(job, width, height, num_layers, true, 1, internal_bpp, false);
+   v3dv_job_start_frame(job, width, height, num_layers, false,
+                        1, internal_bpp, false);
 
    struct v3dv_meta_framebuffer framebuffer;
    v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format,
@@ -4251,14 +4252,16 @@ resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
       (fb_format, region->srcSubresource.aspectMask,
        &internal_type, &internal_bpp);
 
-   v3dv_job_start_frame(job, width, height, num_layers, true, 1, internal_bpp, true);
+   v3dv_job_start_frame(job, width, height, num_layers, false,
+                        1, internal_bpp, true);
 
    struct v3dv_meta_framebuffer framebuffer;
    v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format,
                                               internal_type, &job->frame_tiling);
 
    v3dv_X(job->device, job_emit_binning_flush)(job);
-   v3dv_X(job->device, meta_emit_resolve_image_rcl)(job, dst, src, &framebuffer, region);
+   v3dv_X(job->device, meta_emit_resolve_image_rcl)(job, dst, src,
+                                                    &framebuffer, region);
 
    v3dv_cmd_buffer_finish_job(cmd_buffer);
    return true;
diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c
index c652377e10b..c115f9efa78 100644
--- a/src/broadcom/vulkan/v3dvx_meta_common.c
+++ b/src/broadcom/vulkan/v3dvx_meta_common.c
@@ -545,7 +545,6 @@ emit_copy_layer_to_buffer(struct v3dv_job *job,
                           uint32_t layer,
                           const VkBufferImageCopy2KHR *region)
 {
-   emit_frame_setup(job, layer, NULL);
    emit_copy_layer_to_buffer_per_tile_list(job, framebuffer, buffer,
                                            image, layer, region);
    emit_supertile_coordinates(job, framebuffer);
@@ -561,6 +560,7 @@ v3dX(meta_emit_copy_image_to_buffer_rcl)(struct v3dv_job *job,
    struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, NULL);
    v3dv_return_if_oom(NULL, job);
 
+   emit_frame_setup(job, 0, NULL);
    for (int layer = 0; layer < job->frame_tiling.layers; layer++)
       emit_copy_layer_to_buffer(job, buffer, image, framebuffer, layer, region);
    cl_emit(rcl, END_OF_RENDERING, end);
@@ -632,7 +632,6 @@ emit_resolve_image_layer(struct v3dv_job *job,
                          uint32_t layer,
                          const VkImageResolve2KHR *region)
 {
-   emit_frame_setup(job, layer, NULL);
    emit_resolve_image_layer_per_tile_list(job, framebuffer,
                                           dst, src, layer, region);
    emit_supertile_coordinates(job, framebuffer);
@@ -648,6 +647,7 @@ v3dX(meta_emit_resolve_image_rcl)(struct v3dv_job *job,
    struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, NULL);
    v3dv_return_if_oom(NULL, job);
 
+   emit_frame_setup(job, 0, NULL);
    for (int layer = 0; layer < job->frame_tiling.layers; layer++)
       emit_resolve_image_layer(job, dst, src, framebuffer, layer, region);
    cl_emit(rcl, END_OF_RENDERING, end);
@@ -793,7 +793,6 @@ emit_copy_image_layer(struct v3dv_job *job,
                       uint32_t layer,
                       const VkImageCopy2KHR *region)
 {
-   emit_frame_setup(job, layer, NULL);
    emit_copy_image_layer_per_tile_list(job, framebuffer, dst, src, layer, region);
    emit_supertile_coordinates(job, framebuffer);
 }
@@ -808,6 +807,7 @@ v3dX(meta_emit_copy_image_rcl)(struct v3dv_job *job,
    struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, NULL);
    v3dv_return_if_oom(NULL, job);
 
+   emit_frame_setup(job, 0, NULL);
    for (int layer = 0; layer < job->frame_tiling.layers; layer++)
       emit_copy_image_layer(job, dst, src, framebuffer, layer, region);
    cl_emit(rcl, END_OF_RENDERING, end);
@@ -961,7 +961,7 @@ v3dX(meta_emit_clear_image_rcl)(struct v3dv_job *job,
    struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, &clear_info);
    v3dv_return_if_oom(NULL, job);
 
-   emit_frame_setup(job, min_layer, clear_value);
+   emit_frame_setup(job, 0, clear_value);
    emit_clear_image_layers(job, image, framebuffer, aspects,
                            min_layer, max_layer, level);
    cl_emit(rcl, END_OF_RENDERING, end);
@@ -1153,7 +1153,6 @@ emit_copy_buffer_to_layer(struct v3dv_job *job,
                           uint32_t layer,
                           const VkBufferImageCopy2KHR *region)
 {
-   emit_frame_setup(job, layer, NULL);
    emit_copy_buffer_to_layer_per_tile_list(job, framebuffer, image, buffer,
                                            layer, region);
    emit_supertile_coordinates(job, framebuffer);
@@ -1169,6 +1168,7 @@ v3dX(meta_emit_copy_buffer_to_image_rcl)(struct v3dv_job *job,
    struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, NULL);
    v3dv_return_if_oom(NULL, job);
 
+   emit_frame_setup(job, 0, NULL);
    for (int layer = 0; layer < job->frame_tiling.layers; layer++)
       emit_copy_buffer_to_layer(job, image, buffer, framebuffer, layer, region);
    cl_emit(rcl, END_OF_RENDERING, end);



More information about the mesa-commit mailing list