Mesa (master): intel/common: Add get_aux_map_format_bits()

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Sep 9 20:18:48 UTC 2020


Module: Mesa
Branch: master
Commit: 1ddb1a6cf98bf15112901edd14965f04f6ed9a46
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ddb1a6cf98bf15112901edd14965f04f6ed9a46

Author: Nanley Chery <nanley.g.chery at intel.com>
Date:   Tue Nov 19 16:05:38 2019 -0800

intel/common: Add get_aux_map_format_bits()

Add a function suitable for planar YUV surfaces. For these surfaces,
drivers remap each plane to an RGB-formatted surface. Enable drivers to
pass the plane index and the original YUV format to get the right
aux-map format bits.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6486>

---

 src/intel/common/gen_aux_map.c | 65 ++++++++++++++++++++++++++----------------
 src/intel/common/gen_aux_map.h |  4 +++
 2 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/src/intel/common/gen_aux_map.c b/src/intel/common/gen_aux_map.c
index c3e7d8257a5..d84bc7bf8e0 100644
--- a/src/intel/common/gen_aux_map.c
+++ b/src/intel/common/gen_aux_map.c
@@ -67,7 +67,7 @@
  *
  * Where:
  *  - Format: See `get_format_encoding`
- *  - Y/Cr: 0=not-Y/Cr, 1=Y/Cr
+ *  - Y/Cr: 0=Y(Luma), 1=Cr(Chroma)
  *  - (bit) Depth: See `get_bpp_encoding`
  *  - TM (Tile-mode): 0=Ys, 1=Y, 2=rsvd, 3=rsvd
  *  - aux-data-addr: VMA/GPU address for the aux-data
@@ -282,41 +282,51 @@ get_u64_entry_ptr(struct gen_aux_map_context *ctx, uint64_t addr)
 }
 
 static uint8_t
-get_bpp_encoding(uint16_t bpp)
+get_bpp_encoding(enum isl_format format)
 {
-   switch (bpp) {
-   case 16:  return 0;
-   case 10:  return 1;
-   case 12:  return 2;
-   case 8:   return 4;
-   case 32:  return 5;
-   case 64:  return 6;
-   case 128: return 7;
-   default:
-      unreachable("Unsupported bpp!");
-      return 0;
+   if (isl_format_is_yuv(format)) {
+      switch (format) {
+      case ISL_FORMAT_YCRCB_NORMAL:
+      case ISL_FORMAT_YCRCB_SWAPY:
+      case ISL_FORMAT_PLANAR_420_8: return 3;
+      case ISL_FORMAT_PLANAR_420_12: return 2;
+      case ISL_FORMAT_PLANAR_420_10: return 1;
+      case ISL_FORMAT_PLANAR_420_16: return 0;
+      default:
+         unreachable("Unsupported format!");
+         return 0;
+      }
+   } else {
+      switch (isl_format_get_layout(format)->bpb) {
+      case 16:  return 0;
+      case 8:   return 4;
+      case 32:  return 5;
+      case 64:  return 6;
+      case 128: return 7;
+      default:
+         unreachable("Unsupported bpp!");
+         return 0;
+      }
    }
 }
 
 #define GEN_AUX_MAP_ENTRY_Y_TILED_BIT  (0x1ull << 52)
 
 uint64_t
-gen_aux_map_format_bits_for_isl_surf(const struct isl_surf *isl_surf)
+gen_aux_map_format_bits(enum isl_tiling tiling, enum isl_format format,
+                        uint8_t plane)
 {
-   const struct isl_format_layout *fmtl =
-      isl_format_get_layout(isl_surf->format);
-
-   uint16_t bpp = fmtl->bpb;
-   assert(fmtl->bw == 1 && fmtl->bh == 1 && fmtl->bd == 1);
    if (aux_map_debug)
-      fprintf(stderr, "AUX-MAP entry %s, bpp=%d\n",
-              isl_format_get_name(isl_surf->format), bpp);
+      fprintf(stderr, "AUX-MAP entry %s, bpp_enc=%d\n",
+              isl_format_get_name(format),
+              isl_format_get_aux_map_encoding(format));
 
-   assert(isl_tiling_is_any_y(isl_surf->tiling));
+   assert(isl_tiling_is_any_y(tiling));
 
    uint64_t format_bits =
-      ((uint64_t)isl_format_get_aux_map_encoding(isl_surf->format) << 58) |
-      ((uint64_t)get_bpp_encoding(bpp) << 54) |
+      ((uint64_t)isl_format_get_aux_map_encoding(format) << 58) |
+      ((uint64_t)(plane > 0) << 57) |
+      ((uint64_t)get_bpp_encoding(format) << 54) |
       GEN_AUX_MAP_ENTRY_Y_TILED_BIT;
 
    assert((format_bits & GEN_AUX_MAP_FORMAT_BITS_MASK) == format_bits);
@@ -324,6 +334,13 @@ gen_aux_map_format_bits_for_isl_surf(const struct isl_surf *isl_surf)
    return format_bits;
 }
 
+uint64_t
+gen_aux_map_format_bits_for_isl_surf(const struct isl_surf *isl_surf)
+{
+   assert(!isl_format_is_planar(isl_surf->format));
+   return gen_aux_map_format_bits(isl_surf->tiling, isl_surf->format, 0);
+}
+
 static void
 get_aux_entry(struct gen_aux_map_context *ctx, uint64_t address,
               uint32_t *l1_index_out, uint64_t *l1_entry_addr_out,
diff --git a/src/intel/common/gen_aux_map.h b/src/intel/common/gen_aux_map.h
index 70ff34aab5e..271d4296fc5 100644
--- a/src/intel/common/gen_aux_map.h
+++ b/src/intel/common/gen_aux_map.h
@@ -84,6 +84,10 @@ gen_aux_map_fill_bos(struct gen_aux_map_context *ctx, void **driver_bos,
 uint64_t
 gen_aux_map_get_base(struct gen_aux_map_context *ctx);
 
+uint64_t
+gen_aux_map_format_bits(enum isl_tiling tiling, enum isl_format format,
+                        uint8_t plane);
+
 uint64_t
 gen_aux_map_format_bits_for_isl_surf(const struct isl_surf *isl_surf);
 



More information about the mesa-commit mailing list