Mesa (main): freedreno/a6xx: Clean up sysmem fb read patching using fd6_view.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Nov 11 00:48:00 UTC 2021


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

Author: Emma Anholt <emma at anholt.net>
Date:   Tue Nov  9 14:10:36 2021 -0800

freedreno/a6xx: Clean up sysmem fb read patching using fd6_view.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13443>

---

 src/gallium/drivers/freedreno/a6xx/fd6_gmem.c | 54 ++++++++++++---------------
 1 file changed, 24 insertions(+), 30 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c
index 0e39bd486a4..87c9ba8c717 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c
@@ -299,45 +299,39 @@ patch_fb_read_sysmem(struct fd_batch *batch)
       return;
 
    struct fd_resource *rsc = fd_resource(psurf->texture);
-   unsigned lvl = psurf->u.tex.level;
-   unsigned layer = psurf->u.tex.first_layer;
-   bool ubwc_enabled = fd_resource_ubwc_enabled(rsc, lvl);
-   uint64_t iova = fd_bo_get_iova(rsc->bo) + fd_resource_offset(rsc, lvl, layer);
-   uint64_t ubwc_iova = fd_bo_get_iova(rsc->bo) + fd_resource_ubwc_offset(rsc, lvl, layer);
-   uint32_t texconst0 = fd6_tex_const_0(
-      psurf->texture, psurf->u.tex.level, psurf->format, PIPE_SWIZZLE_X,
-      PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W);
+
    uint32_t block_width, block_height;
    fdl6_get_ubwc_blockwidth(&rsc->layout, &block_width, &block_height);
 
+   struct fdl_view_args args = {
+      .iova = fd_bo_get_iova(rsc->bo),
+
+      .base_miplevel = psurf->u.tex.level,
+      .level_count = 1,
+
+      .base_array_layer = psurf->u.tex.first_layer,
+      .layer_count = 1,
+
+      .format = psurf->format,
+      .swiz = {PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W},
+
+      .type = FDL_VIEW_TYPE_2D,
+      .chroma_offsets = {FDL_CHROMA_LOCATION_COSITED_EVEN,
+                         FDL_CHROMA_LOCATION_COSITED_EVEN},
+   };
+   const struct fdl_layout *layouts[3] = {&rsc->layout, NULL, NULL};
+   struct fdl6_view view;
+   fdl6_view_init(&view, layouts, &args,
+                  batch->ctx->screen->info->a6xx.has_z24uint_s8uint);
+
    for (unsigned i = 0; i < num_patches; i++) {
       struct fd_cs_patch *patch = fd_patch_element(&batch->fb_read_patches, i);
-      patch->cs[0] = texconst0;
-      patch->cs[2] = A6XX_TEX_CONST_2_PITCH(fd_resource_pitch(rsc, lvl)) |
-                     A6XX_TEX_CONST_2_TYPE(A6XX_TEX_2D);
+
       /* This is cheating a bit, since we can't use OUT_RELOC() here.. but
        * the render target will already have a reloc emitted for RB_MRT state,
        * so we can get away with manually patching in the address here:
        */
-      patch->cs[4] = A6XX_TEX_CONST_4_BASE_LO(iova);
-      patch->cs[5] = A6XX_TEX_CONST_5_BASE_HI(iova >> 32) |
-                     A6XX_TEX_CONST_5_DEPTH(1);
-
-      if (!ubwc_enabled)
-         continue;
-
-      patch->cs[3] |= A6XX_TEX_CONST_3_FLAG;
-      patch->cs[7] = A6XX_TEX_CONST_7_FLAG_LO(ubwc_iova);
-      patch->cs[8] = A6XX_TEX_CONST_8_FLAG_HI(ubwc_iova >> 32);
-      patch->cs[9] = A6XX_TEX_CONST_9_FLAG_BUFFER_ARRAY_PITCH(
-            rsc->layout.ubwc_layer_size >> 2);
-      patch->cs[10] =
-            A6XX_TEX_CONST_10_FLAG_BUFFER_PITCH(
-               fdl_ubwc_pitch(&rsc->layout, lvl)) |
-            A6XX_TEX_CONST_10_FLAG_BUFFER_LOGW(util_logbase2_ceil(
-               DIV_ROUND_UP(u_minify(psurf->texture->width0, lvl), block_width))) |
-            A6XX_TEX_CONST_10_FLAG_BUFFER_LOGH(util_logbase2_ceil(
-               DIV_ROUND_UP(u_minify(psurf->texture->height0, lvl), block_height)));
+      memcpy(patch->cs, view.descriptor, FDL6_TEX_CONST_DWORDS * 4);
    }
    util_dynarray_clear(&batch->fb_read_patches);
 }



More information about the mesa-commit mailing list