panfrost: Allow bpp24 tiling
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 19 May 2020 21:52:29 +0000 (17:52 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 21 May 2020 18:43:32 +0000 (14:43 -0400)
It's dumb that we have to but it does help RGB8 nontrivially. Alas.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5124>

src/gallium/drivers/panfrost/pan_resource.c
src/panfrost/shared/pan_tiling.c

index 3e68cbdbef4e4363db173f9c27728f239b2032ad..983292f9fb7e3fd9222669011a6d930a4e6ff538 100644 (file)
@@ -411,7 +411,7 @@ panfrost_resource_create_bo(struct panfrost_device *dev, struct panfrost_resourc
 
         unsigned bpp = util_format_get_blocksizebits(res->format);
         bool is_2d = (res->target == PIPE_TEXTURE_2D);
 
         unsigned bpp = util_format_get_blocksizebits(res->format);
         bool is_2d = (res->target == PIPE_TEXTURE_2D);
-        bool is_sane_bpp = bpp == 8 || bpp == 16 || bpp == 32 || bpp == 64 || bpp == 128;
+        bool is_sane_bpp = bpp == 8 || bpp == 16 || bpp == 24 || bpp == 32 || bpp == 64 || bpp == 128;
         bool should_tile = (res->usage != PIPE_USAGE_STREAM);
         bool must_tile = (res->bind & PIPE_BIND_DEPTH_STENCIL) && (dev->quirks & MIDGARD_SFBD);
         bool can_tile = is_2d && is_sane_bpp && ((res->bind & ~valid_binding) == 0);
         bool should_tile = (res->usage != PIPE_USAGE_STREAM);
         bool must_tile = (res->bind & PIPE_BIND_DEPTH_STENCIL) && (dev->quirks & MIDGARD_SFBD);
         bool can_tile = is_2d && is_sane_bpp && ((res->bind & ~valid_binding) == 0);
index ad7b202faa280bf51fe9fca09bdf485971ac97ed..1275fdcf62a109507b09cff63b63b84fba4bdb05 100644 (file)
@@ -143,6 +143,11 @@ typedef struct {
 } __attribute__((packed)) pan_uint128_t;
 #endif
 
 } __attribute__((packed)) pan_uint128_t;
 #endif
 
+typedef struct {
+  uint16_t lo;
+  uint8_t hi;
+} __attribute__((packed)) pan_uint24_t;
+
 /* Optimized routine to tile an aligned (w & 0xF == 0) texture. Explanation:
  *
  * dest_start precomputes the offset to the beginning of the first horizontal
 /* Optimized routine to tile an aligned (w & 0xF == 0) texture. Explanation:
  *
  * dest_start precomputes the offset to the beginning of the first horizontal
@@ -235,6 +240,8 @@ TILED_ACCESS_TYPE(pan_uint128_t, 4);
       TILED_UNALIGNED_TYPE(uint8_t, store, shift) \
    else if (bpp == 16) \
       TILED_UNALIGNED_TYPE(uint16_t, store, shift) \
       TILED_UNALIGNED_TYPE(uint8_t, store, shift) \
    else if (bpp == 16) \
       TILED_UNALIGNED_TYPE(uint16_t, store, shift) \
+   else if (bpp == 24) \
+      TILED_UNALIGNED_TYPE(pan_uint24_t, store, shift) \
    else if (bpp == 32) \
       TILED_UNALIGNED_TYPE(uint32_t, store, shift) \
    else if (bpp == 64) \
    else if (bpp == 32) \
       TILED_UNALIGNED_TYPE(uint32_t, store, shift) \
    else if (bpp == 64) \
@@ -283,7 +290,7 @@ panfrost_access_tiled_image(void *dst, void *src,
 {
    const struct util_format_description *desc = util_format_description(format);
 
 {
    const struct util_format_description *desc = util_format_description(format);
 
-   if (desc->block.width > 1) {
+   if (desc->block.width > 1 || desc->block.bits == 24) {
       panfrost_access_tiled_image_generic(dst, (void *) src,
             x, y, w, h,
             dst_stride, src_stride, desc, is_store);
       panfrost_access_tiled_image_generic(dst, (void *) src,
             x, y, w, h,
             dst_stride, src_stride, desc, is_store);