panfrost: Allow bpp24 tiling
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>
This commit is contained in:
parent
48cc608859
commit
c41cf03589
|
@ -411,7 +411,7 @@ panfrost_resource_create_bo(struct panfrost_device *dev, struct panfrost_resourc
|
||||||
|
|
||||||
unsigned bpp = util_format_get_blocksizebits(res->format);
|
unsigned bpp = util_format_get_blocksizebits(res->format);
|
||||||
bool is_2d = (res->target == PIPE_TEXTURE_2D);
|
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 should_tile = (res->usage != PIPE_USAGE_STREAM);
|
||||||
bool must_tile = (res->bind & PIPE_BIND_DEPTH_STENCIL) && (dev->quirks & MIDGARD_SFBD);
|
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 can_tile = is_2d && is_sane_bpp && ((res->bind & ~valid_binding) == 0);
|
||||||
|
|
|
@ -143,6 +143,11 @@ typedef struct {
|
||||||
} __attribute__((packed)) pan_uint128_t;
|
} __attribute__((packed)) pan_uint128_t;
|
||||||
#endif
|
#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:
|
/* Optimized routine to tile an aligned (w & 0xF == 0) texture. Explanation:
|
||||||
*
|
*
|
||||||
* dest_start precomputes the offset to the beginning of the first horizontal
|
* 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) \
|
TILED_UNALIGNED_TYPE(uint8_t, store, shift) \
|
||||||
else if (bpp == 16) \
|
else if (bpp == 16) \
|
||||||
TILED_UNALIGNED_TYPE(uint16_t, store, shift) \
|
TILED_UNALIGNED_TYPE(uint16_t, store, shift) \
|
||||||
|
else if (bpp == 24) \
|
||||||
|
TILED_UNALIGNED_TYPE(pan_uint24_t, store, shift) \
|
||||||
else if (bpp == 32) \
|
else if (bpp == 32) \
|
||||||
TILED_UNALIGNED_TYPE(uint32_t, store, shift) \
|
TILED_UNALIGNED_TYPE(uint32_t, store, shift) \
|
||||||
else if (bpp == 64) \
|
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,
|
panfrost_access_tiled_image_generic(dst, (void *) src,
|
||||||
x, y, w, h,
|
x, y, w, h,
|
||||||
dst_stride, src_stride, desc, is_store);
|
dst_stride, src_stride, desc, is_store);
|
||||||
|
|
Loading…
Reference in New Issue