[PATCH v2 1/3] drm/tests: Do not use drm_fb_blit() in format-helper tests
José Expósito
jose.exposito89 at gmail.com
Fri Jun 13 14:00:23 UTC 2025
Hi Thomas,
On Thu, Jun 12, 2025 at 03:52:22PM +0200, Thomas Zimmermann wrote:
> Export additional helpers from the format-helper library and open-code
> drm_fb_blit() in tests. Prepares for the removal of drm_fb_blit(). Only
> sysfb drivers use drm_fb_blit(). The function will soon be removed from
> format helpers and be refactored within sysfb helpers.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> Acked-by: Maxime Ripard <mripard at kernel.org>
Reviewed and run the tests, they work, thanks.
Reviewed-by: José Expósito <jose.exposito89 at gmail.com>
> ---
> drivers/gpu/drm/drm_format_helper.c | 108 ++++++++++++++++--
> drivers/gpu/drm/drm_format_internal.h | 8 ++
> .../gpu/drm/tests/drm_format_helper_test.c | 108 +++---------------
> include/drm/drm_format_helper.h | 9 ++
> 4 files changed, 131 insertions(+), 102 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c
> index d36e6cacc575..73b5a80771cc 100644
> --- a/drivers/gpu/drm/drm_format_helper.c
> +++ b/drivers/gpu/drm/drm_format_helper.c
> @@ -857,11 +857,33 @@ static void drm_fb_xrgb8888_to_abgr8888_line(void *dbuf, const void *sbuf, unsig
> drm_fb_xfrm_line_32to32(dbuf, sbuf, pixels, drm_pixel_xrgb8888_to_abgr8888);
> }
>
> -static void drm_fb_xrgb8888_to_abgr8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> - const struct iosys_map *src,
> - const struct drm_framebuffer *fb,
> - const struct drm_rect *clip,
> - struct drm_format_conv_state *state)
> +/**
> + * drm_fb_xrgb8888_to_abgr8888 - Convert XRGB8888 to ABGR8888 clip buffer
> + * @dst: Array of ABGR8888 destination buffers
> + * @dst_pitch: Array of numbers of bytes between the start of two consecutive scanlines
> + * within @dst; can be NULL if scanlines are stored next to each other.
> + * @src: Array of XRGB8888 source buffer
> + * @fb: DRM framebuffer
> + * @clip: Clip rectangle area to copy
> + * @state: Transform and conversion state
> + *
> + * This function copies parts of a framebuffer to display memory and converts the
> + * color format during the process. The parameters @dst, @dst_pitch and @src refer
> + * to arrays. Each array must have at least as many entries as there are planes in
> + * @fb's format. Each entry stores the value for the format's respective color plane
> + * at the same index.
> + *
> + * This function does not apply clipping on @dst (i.e. the destination is at the
> + * top-left corner).
> + *
> + * Drivers can use this function for ABGR8888 devices that don't support XRGB8888
> + * natively. It sets an opaque alpha channel as part of the conversion.
> + */
> +void drm_fb_xrgb8888_to_abgr8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> + const struct iosys_map *src,
> + const struct drm_framebuffer *fb,
> + const struct drm_rect *clip,
> + struct drm_format_conv_state *state)
> {
> static const u8 dst_pixsize[DRM_FORMAT_MAX_PLANES] = {
> 4,
> @@ -870,17 +892,40 @@ static void drm_fb_xrgb8888_to_abgr8888(struct iosys_map *dst, const unsigned in
> drm_fb_xfrm(dst, dst_pitch, dst_pixsize, src, fb, clip, false, state,
> drm_fb_xrgb8888_to_abgr8888_line);
> }
> +EXPORT_SYMBOL(drm_fb_xrgb8888_to_abgr8888);
>
> static void drm_fb_xrgb8888_to_xbgr8888_line(void *dbuf, const void *sbuf, unsigned int pixels)
> {
> drm_fb_xfrm_line_32to32(dbuf, sbuf, pixels, drm_pixel_xrgb8888_to_xbgr8888);
> }
>
> -static void drm_fb_xrgb8888_to_xbgr8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> - const struct iosys_map *src,
> - const struct drm_framebuffer *fb,
> - const struct drm_rect *clip,
> - struct drm_format_conv_state *state)
> +/**
> + * drm_fb_xrgb8888_to_xbgr8888 - Convert XRGB8888 to XBGR8888 clip buffer
> + * @dst: Array of XBGR8888 destination buffers
> + * @dst_pitch: Array of numbers of bytes between the start of two consecutive scanlines
> + * within @dst; can be NULL if scanlines are stored next to each other.
> + * @src: Array of XRGB8888 source buffer
> + * @fb: DRM framebuffer
> + * @clip: Clip rectangle area to copy
> + * @state: Transform and conversion state
> + *
> + * This function copies parts of a framebuffer to display memory and converts the
> + * color format during the process. The parameters @dst, @dst_pitch and @src refer
> + * to arrays. Each array must have at least as many entries as there are planes in
> + * @fb's format. Each entry stores the value for the format's respective color plane
> + * at the same index.
> + *
> + * This function does not apply clipping on @dst (i.e. the destination is at the
> + * top-left corner).
> + *
> + * Drivers can use this function for XBGR8888 devices that don't support XRGB8888
> + * natively.
> + */
> +void drm_fb_xrgb8888_to_xbgr8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> + const struct iosys_map *src,
> + const struct drm_framebuffer *fb,
> + const struct drm_rect *clip,
> + struct drm_format_conv_state *state)
> {
> static const u8 dst_pixsize[DRM_FORMAT_MAX_PLANES] = {
> 4,
> @@ -889,6 +934,49 @@ static void drm_fb_xrgb8888_to_xbgr8888(struct iosys_map *dst, const unsigned in
> drm_fb_xfrm(dst, dst_pitch, dst_pixsize, src, fb, clip, false, state,
> drm_fb_xrgb8888_to_xbgr8888_line);
> }
> +EXPORT_SYMBOL(drm_fb_xrgb8888_to_xbgr8888);
> +
> +static void drm_fb_xrgb8888_to_bgrx8888_line(void *dbuf, const void *sbuf, unsigned int pixels)
> +{
> + drm_fb_xfrm_line_32to32(dbuf, sbuf, pixels, drm_pixel_xrgb8888_to_bgrx8888);
> +}
> +
> +/**
> + * drm_fb_xrgb8888_to_bgrx8888 - Convert XRGB8888 to BGRX8888 clip buffer
> + * @dst: Array of BGRX8888 destination buffers
> + * @dst_pitch: Array of numbers of bytes between the start of two consecutive scanlines
> + * within @dst; can be NULL if scanlines are stored next to each other.
> + * @src: Array of XRGB8888 source buffer
> + * @fb: DRM framebuffer
> + * @clip: Clip rectangle area to copy
> + * @state: Transform and conversion state
> + *
> + * This function copies parts of a framebuffer to display memory and converts the
> + * color format during the process. The parameters @dst, @dst_pitch and @src refer
> + * to arrays. Each array must have at least as many entries as there are planes in
> + * @fb's format. Each entry stores the value for the format's respective color plane
> + * at the same index.
> + *
> + * This function does not apply clipping on @dst (i.e. the destination is at the
> + * top-left corner).
> + *
> + * Drivers can use this function for BGRX8888 devices that don't support XRGB8888
> + * natively.
> + */
> +void drm_fb_xrgb8888_to_bgrx8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> + const struct iosys_map *src,
> + const struct drm_framebuffer *fb,
> + const struct drm_rect *clip,
> + struct drm_format_conv_state *state)
> +{
> + static const u8 dst_pixsize[DRM_FORMAT_MAX_PLANES] = {
> + 4,
> + };
> +
> + drm_fb_xfrm(dst, dst_pitch, dst_pixsize, src, fb, clip, false, state,
> + drm_fb_xrgb8888_to_bgrx8888_line);
> +}
> +EXPORT_SYMBOL(drm_fb_xrgb8888_to_bgrx8888);
>
> static void drm_fb_xrgb8888_to_xrgb2101010_line(void *dbuf, const void *sbuf, unsigned int pixels)
> {
> diff --git a/drivers/gpu/drm/drm_format_internal.h b/drivers/gpu/drm/drm_format_internal.h
> index 9f857bfa368d..0aa458b8a3e0 100644
> --- a/drivers/gpu/drm/drm_format_internal.h
> +++ b/drivers/gpu/drm/drm_format_internal.h
> @@ -111,6 +111,14 @@ static inline u32 drm_pixel_xrgb8888_to_xbgr8888(u32 pix)
> ((pix & 0x000000ff) << 16);
> }
>
> +static inline u32 drm_pixel_xrgb8888_to_bgrx8888(u32 pix)
> +{
> + return ((pix & 0xff000000) >> 24) | /* also copy filler bits */
> + ((pix & 0x00ff0000) >> 8) |
> + ((pix & 0x0000ff00) << 8) |
> + ((pix & 0x000000ff) << 24);
> +}
> +
> static inline u32 drm_pixel_xrgb8888_to_abgr8888(u32 pix)
> {
> return GENMASK(31, 24) | /* fill alpha bits */
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index 35cd3405d045..8aacc1ffa93a 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -748,14 +748,9 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
> buf = dst.vaddr;
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_RGB565, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_rgb565(&dst, dst_pitch, &src, &fb, ¶ms->clip,
> + &fmtcnv_state, false);
> buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -795,14 +790,8 @@ static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_XRGB1555, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_xrgb1555(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -842,14 +831,8 @@ static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_ARGB1555, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_argb1555(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -889,14 +872,8 @@ static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_RGBA5551, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_rgba5551(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -939,12 +916,7 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_RGB888, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> + drm_fb_xrgb8888_to_rgb888(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -985,12 +957,8 @@ static void drm_test_fb_xrgb8888_to_bgr888(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, &result->dst_pitch, DRM_FORMAT_BGR888, &src, &fb, ¶ms->clip,
> + drm_fb_xrgb8888_to_bgr888(&dst, &result->dst_pitch, &src, &fb, ¶ms->clip,
> &fmtcnv_state);
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1030,14 +998,8 @@ static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_ARGB8888, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_argb8888(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1077,12 +1039,7 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_XRGB2101010, &src, &fb,
> - ¶ms->clip, &fmtcnv_state);
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> + drm_fb_xrgb8888_to_xrgb2101010(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1122,14 +1079,8 @@ static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_ARGB2101010, &src, &fb,
> - ¶ms->clip, &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_argb2101010(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1202,23 +1153,15 @@ static void drm_test_fb_swab(struct kunit *test)
> buf = dst.vaddr; /* restore original value of buf */
> memset(buf, 0, dst_size);
>
> - int blit_result;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_XRGB8888 | DRM_FORMAT_BIG_ENDIAN,
> - &src, &fb, ¶ms->clip, &fmtcnv_state);
> + drm_fb_swab(&dst, dst_pitch, &src, &fb, ¶ms->clip, false, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>
> buf = dst.vaddr;
> memset(buf, 0, dst_size);
>
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_BGRX8888, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> + drm_fb_xrgb8888_to_bgrx8888(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>
> buf = dst.vaddr;
> @@ -1229,11 +1172,8 @@ static void drm_test_fb_swab(struct kunit *test)
> mock_format.format |= DRM_FORMAT_BIG_ENDIAN;
> fb.format = &mock_format;
>
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_XRGB8888, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> + drm_fb_swab(&dst, dst_pitch, &src, &fb, ¶ms->clip, false, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1266,14 +1206,8 @@ static void drm_test_fb_xrgb8888_to_abgr8888(struct kunit *test)
> const unsigned int *dst_pitch = (result->dst_pitch == TEST_USE_DEFAULT_PITCH) ?
> NULL : &result->dst_pitch;
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_ABGR8888, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_abgr8888(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1306,14 +1240,8 @@ static void drm_test_fb_xrgb8888_to_xbgr8888(struct kunit *test)
> const unsigned int *dst_pitch = (result->dst_pitch == TEST_USE_DEFAULT_PITCH) ?
> NULL : &result->dst_pitch;
>
> - int blit_result = 0;
> -
> - blit_result = drm_fb_blit(&dst, dst_pitch, DRM_FORMAT_XBGR8888, &src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> -
> + drm_fb_xrgb8888_to_xbgr8888(&dst, dst_pitch, &src, &fb, ¶ms->clip, &fmtcnv_state);
> buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> -
> - KUNIT_EXPECT_FALSE(test, blit_result);
> KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> }
>
> @@ -1910,12 +1838,8 @@ static void drm_test_fb_memcpy(struct kunit *test)
> memset(buf[i], 0, dst_size[i]);
> }
>
> - int blit_result;
> -
> - blit_result = drm_fb_blit(dst, dst_pitches, params->format, src, &fb, ¶ms->clip,
> - &fmtcnv_state);
> + drm_fb_memcpy(dst, dst_pitches, src, &fb, ¶ms->clip);
>
> - KUNIT_EXPECT_FALSE(test, blit_result);
> for (size_t i = 0; i < fb.format->num_planes; i++) {
> expected[i] = cpubuf_to_le32(test, params->expected[i], TEST_BUF_SIZE);
> KUNIT_EXPECT_MEMEQ_MSG(test, buf[i], expected[i], dst_size[i],
> diff --git a/include/drm/drm_format_helper.h b/include/drm/drm_format_helper.h
> index d8539174ca11..49a2e09155d1 100644
> --- a/include/drm/drm_format_helper.h
> +++ b/include/drm/drm_format_helper.h
> @@ -102,6 +102,15 @@ void drm_fb_xrgb8888_to_bgr888(struct iosys_map *dst, const unsigned int *dst_pi
> void drm_fb_xrgb8888_to_argb8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> const struct iosys_map *src, const struct drm_framebuffer *fb,
> const struct drm_rect *clip, struct drm_format_conv_state *state);
> +void drm_fb_xrgb8888_to_abgr8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> + const struct iosys_map *src, const struct drm_framebuffer *fb,
> + const struct drm_rect *clip, struct drm_format_conv_state *state);
> +void drm_fb_xrgb8888_to_xbgr8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> + const struct iosys_map *src, const struct drm_framebuffer *fb,
> + const struct drm_rect *clip, struct drm_format_conv_state *state);
> +void drm_fb_xrgb8888_to_bgrx8888(struct iosys_map *dst, const unsigned int *dst_pitch,
> + const struct iosys_map *src, const struct drm_framebuffer *fb,
> + const struct drm_rect *clip, struct drm_format_conv_state *state);
> void drm_fb_xrgb8888_to_xrgb2101010(struct iosys_map *dst, const unsigned int *dst_pitch,
> const struct iosys_map *src, const struct drm_framebuffer *fb,
> const struct drm_rect *clip,
> --
> 2.49.0
>
More information about the dri-devel
mailing list