mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 22:08:26 +02:00
panfrost: add 422 AFBC formats
Most of the infrastructure was already in place for 8 bit (we just had to add the AFBC mode to use). We also needed to add support for the 10 bit format (X6R10X6G10_X6R10X6B10_UNORM). Note that this 10 bit format is only supported for AFBC, for linear we have to fall back to the old multi-plane way of handling it. Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35771>
This commit is contained in:
parent
417be4f77e
commit
6f24dad00e
5 changed files with 28 additions and 1 deletions
|
|
@ -344,8 +344,12 @@ panfrost_lower_yuv_format(struct panfrost_device *dev,
|
|||
TRY_LOWERING(PIPE_FORMAT_R10G10B10_420_UNORM_PACKED);
|
||||
break;
|
||||
case PIPE_FORMAT_Y210:
|
||||
TRY_LOWERING(PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM);
|
||||
TRY_LOWERING(PIPE_FORMAT_RG1616_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM);
|
||||
break;
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
TRY_LOWERING(PIPE_FORMAT_R16G16_R16B16_422_UNORM);
|
||||
TRY_LOWERING(PIPE_FORMAT_RG1616_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM);
|
||||
break;
|
||||
case PIPE_FORMAT_P010:
|
||||
|
|
@ -519,12 +523,16 @@ panfrost_is_dmabuf_modifier_supported(struct pipe_screen *screen,
|
|||
unsigned int uint_extern_only = 0;
|
||||
int count;
|
||||
|
||||
if (format_requires_afbc(format) && !drm_is_afbc(modifier))
|
||||
return false;
|
||||
|
||||
panfrost_walk_dmabuf_modifiers(screen, format, 1, &unused, &uint_extern_only,
|
||||
&count, modifier, true);
|
||||
|
||||
if (external_only)
|
||||
*external_only = uint_extern_only ? true : false;
|
||||
|
||||
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -524,6 +524,11 @@ pan_afbc_format(unsigned arch, enum pipe_format format, unsigned plane_idx)
|
|||
return PAN_AFBC_MODE_YUV420_6C8;
|
||||
case PIPE_FORMAT_R10G10B10_420_UNORM_PACKED:
|
||||
return PAN_AFBC_MODE_YUV420_6C10;
|
||||
case PIPE_FORMAT_R8G8_R8B8_UNORM:
|
||||
case PIPE_FORMAT_R8B8_R8G8_UNORM:
|
||||
return PAN_AFBC_MODE_YUV422_4C8;
|
||||
case PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM:
|
||||
return PAN_AFBC_MODE_YUV422_4C10;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -759,6 +764,18 @@ pan_afbc_decompression_mode(enum pipe_format view_format,
|
|||
}
|
||||
#endif
|
||||
|
||||
static inline bool
|
||||
format_requires_afbc(enum pipe_format format) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_R8G8B8_420_UNORM_PACKED:
|
||||
case PIPE_FORMAT_R10G10B10_420_UNORM_PACKED:
|
||||
case PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ const struct pan_format GENX(pan_pipe_format)[PIPE_FORMAT_COUNT] = {
|
|||
/* special internal formats */
|
||||
FMT_YUV(R8G8B8_420_UNORM_PACKED, Y8_UV8_420, YUVA, NO_SWAP, CENTER, _T___),
|
||||
FMT_YUV(R10G10B10_420_UNORM_PACKED, Y10_UV10_420, YUVA, NO_SWAP, CENTER, _T___),
|
||||
FMT_YUV(X6R10X6G10_X6R10X6B10_422_UNORM, YUYV10, UVYA, NO_SWAP, CENTER_422, _T___),
|
||||
#endif
|
||||
|
||||
FMTC(ETC1_RGB8, ETC2_RGB8, RGBA8_UNORM, RGB1, L),
|
||||
|
|
|
|||
|
|
@ -586,8 +586,8 @@ pan_mod_linear_test_props(const struct pan_kmod_dev_props *dprops,
|
|||
/* AFBC-only formats. */
|
||||
case PIPE_FORMAT_R8G8B8_420_UNORM_PACKED:
|
||||
case PIPE_FORMAT_R10G10B10_420_UNORM_PACKED:
|
||||
case PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM:
|
||||
return PAN_MOD_NOT_SUPPORTED;
|
||||
|
||||
default:
|
||||
/* We assume that all "better" mods have been tested before linear, and
|
||||
* declare it as optimal so it's always picked when tested, unless it's
|
||||
|
|
|
|||
|
|
@ -281,6 +281,7 @@ pan_clump_format(enum pipe_format format)
|
|||
case PIPE_FORMAT_R10G10B10_420_UNORM_PACKED:
|
||||
return MALI_CLUMP_FORMAT_Y10_UV10_420;
|
||||
case PIPE_FORMAT_R10_G10B10_422_UNORM:
|
||||
case PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM:
|
||||
return MALI_CLUMP_FORMAT_Y10_UV10_422;
|
||||
default:
|
||||
UNREACHABLE("unhandled clump format");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue