aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2020-05-19 17:52:29 -0400
committerAlyssa Rosenzweig <[email protected]>2020-05-21 14:43:32 -0400
commitc41cf03589bdf030f9e3ca312d86f7078a9d06bd (patch)
tree1e1e0882ed9c563e0d3fb2cac8715d29d4cc4b3a /src
parent48cc608859cceb523da1a5e74c0e4aad91f3984c (diff)
panfrost: Allow bpp24 tiling
It's dumb that we have to but it does help RGB8 nontrivially. Alas. Signed-off-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5124>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.c2
-rw-r--r--src/panfrost/shared/pan_tiling.c9
2 files changed, 9 insertions, 2 deletions
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index 3e68cbdbef4..983292f9fb7 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -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);
- 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);
diff --git a/src/panfrost/shared/pan_tiling.c b/src/panfrost/shared/pan_tiling.c
index ad7b202faa2..1275fdcf62a 100644
--- a/src/panfrost/shared/pan_tiling.c
+++ b/src/panfrost/shared/pan_tiling.c
@@ -143,6 +143,11 @@ typedef struct {
} __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
@@ -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) \
+ 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) \
@@ -283,7 +290,7 @@ panfrost_access_tiled_image(void *dst, void *src,
{
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);