[PATCH i-g-t 25/37] lib/igt_fb: Try to fix block copy media compression handling
Juha-Pekka Heikkila
juhapekka.heikkila at gmail.com
Tue Aug 27 17:04:39 UTC 2024
Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
On 3.7.2024 2.28, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> The media compression format handling for the block
> copy seems to be very broken.
>
> Empirical findings from dg2:
> - the compression format needs to be based on bspec's
> render compression format list even when doing media
> compression
> - 0x8/B8G8G8A8 doesn't work correctly for XYUV8888 for
> some reason, but using 0x18/R8 does seem to work
> - YUYV/etc. packed formats don't work any which way
> - planar formats can be handled as R8/R8G8/etc.
> - RGB+media compression is a lost cause (black turns white
> when you try it)
>
> This is all based on very cursory testing, so no idea if any
> of it is actually correct. Doesn't actually matter currently
> as we take the enginecopy path for media compression always.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> lib/igt_fb.c | 30 ++++++++++++++++++------------
> 1 file changed, 18 insertions(+), 12 deletions(-)
>
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index 3b2077910349..5a1f3d5d8207 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -2872,23 +2872,29 @@ static enum blt_color_depth blt_get_bpp(const struct igt_fb *fb,
>
> const struct {
> uint32_t format;
> + int color_plane;
> enum blt_compression_type type;
> uint32_t return_value;
> } compression_mappings[] = {
> - { DRM_FORMAT_XRGB16161616F, COMPRESSION_TYPE_3D, 0x5 },
> - { DRM_FORMAT_XRGB2101010, COMPRESSION_TYPE_3D, 0xc },
> - { DRM_FORMAT_XRGB8888, COMPRESSION_TYPE_3D, 0x8 },
> - { DRM_FORMAT_XRGB8888, COMPRESSION_TYPE_MEDIA, 8 },
> - { DRM_FORMAT_XYUV8888, COMPRESSION_TYPE_MEDIA, 9 },
> - { DRM_FORMAT_NV12, COMPRESSION_TYPE_MEDIA, 9 },
> - { DRM_FORMAT_P010, COMPRESSION_TYPE_MEDIA, 8 },
> + { DRM_FORMAT_XRGB16161616F, 0, COMPRESSION_TYPE_3D, 0x5 }, /* R16G16B16A16_FLOAT */
> + { DRM_FORMAT_XRGB2101010, 0, COMPRESSION_TYPE_3D, 0xc }, /* B10G10R10A2_UNORM */
> + { DRM_FORMAT_XRGB8888, 0, COMPRESSION_TYPE_3D, 0x8 }, /* B8G8R8A8_UNORM */
> +
> + /* FIXME why doesn't 0x8/B8G8R8A8_UNORM work here? */
> + { DRM_FORMAT_XYUV8888, 0, COMPRESSION_TYPE_MEDIA, 0x18 }, /* R8_UNORM */
> +
> + { DRM_FORMAT_NV12, 0, COMPRESSION_TYPE_MEDIA, 0x18 }, /* R8_UNORM */
> + { DRM_FORMAT_NV12, 1, COMPRESSION_TYPE_MEDIA, 0xa }, /* R8G8_UNORM */
> + { DRM_FORMAT_P010, 0, COMPRESSION_TYPE_MEDIA, 0x14 }, /* R16_UNORM */
> + { DRM_FORMAT_P010, 1, COMPRESSION_TYPE_MEDIA, 0x6 }, /* R16G16_UNORM */
> };
>
> -static uint32_t get_compression_return_value(uint32_t format,
> +static uint32_t get_compression_return_value(uint32_t format, int color_plane,
> enum blt_compression_type type)
> {
> for (int i = 0; i < ARRAY_SIZE(compression_mappings); i++) {
> if (compression_mappings[i].format == format &&
> + compression_mappings[i].color_plane == color_plane &&
> compression_mappings[i].type == type) {
> return compression_mappings[i].return_value;
> }
> @@ -2898,13 +2904,13 @@ static uint32_t get_compression_return_value(uint32_t format,
> }
>
> static uint32_t blt_compression_format(const struct blt_copy_object *obj,
> - const struct igt_fb *fb)
> + const struct igt_fb *fb, int color_plane)
> {
> if (obj->compression == COMPRESSION_DISABLED)
> return 0;
>
> return get_compression_return_value(igt_reduce_format(fb->drm_format),
> - obj->compression_type);
> + color_plane, obj->compression_type);
> }
>
> static void setup_context_and_memory_region(const struct igt_fb *fb, uint32_t *ctx,
> @@ -2990,12 +2996,12 @@ static void do_block_copy(const struct igt_fb *src_fb,
>
> if (blt_uses_extended_block_copy(src_fb->fd)) {
> blt_set_object_ext(&ext.src,
> - blt_compression_format(&blt.src, src_fb),
> + blt_compression_format(&blt.src, src_fb, i),
> src_fb->plane_width[i], src_fb->plane_height[i],
> SURFACE_TYPE_2D);
>
> blt_set_object_ext(&ext.dst,
> - blt_compression_format(&blt.dst, dst_fb),
> + blt_compression_format(&blt.dst, dst_fb, i),
> dst_fb->plane_width[i], dst_fb->plane_height[i],
> SURFACE_TYPE_2D);
> pext = &ext;
More information about the igt-dev
mailing list