[PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list()
Maira Canal
mairacanal at riseup.net
Sat Aug 5 13:21:49 UTC 2023
On 7/21/23 15:23, Arthur Grillo wrote:> Insert parameterized test for
the drm_fb_build_fourcc_list() to ensure
> correctness and prevent future regressions.
>
> Signed-off-by: Arthur Grillo <arthurgrillo at riseup.net>
> ---
> .../gpu/drm/tests/drm_format_helper_test.c | 143 ++++++++++++++++++
> 1 file changed, 143 insertions(+)
>
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index 2e1c5463f063..de4677868647 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -3,6 +3,7 @@
> #include <kunit/test.h>
>
> #include <drm/drm_device.h>
> +#include <drm/drm_drv.h>
> #include <drm/drm_file.h>
> #include <drm/drm_format_helper.h>
> #include <drm/drm_fourcc.h>
> @@ -11,6 +12,7 @@
> #include <drm/drm_mode.h>
> #include <drm/drm_print.h>
> #include <drm/drm_rect.h>
> +#include <drm/drm_kunit_helpers.h>
>
> #include "../drm_crtc_internal.h"
>
> @@ -1047,6 +1049,146 @@ static void drm_test_fb_clip_offset(struct kunit *test)
> KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
> }
>
> +struct fb_build_fourcc_list_case {
> + const char *name;
> + u32 native_fourccs[TEST_BUF_SIZE];
> + u32 expected[TEST_BUF_SIZE];
> +};
> +
> +struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = {
> + {
> + .name = "no native formats",
> + .native_fourccs = { },
> + .expected = { DRM_FORMAT_XRGB8888 },
> + },
> + {
> + .name = "XRGB8888 as native format",
> + .native_fourccs = { DRM_FORMAT_XRGB8888 },
> + .expected = { DRM_FORMAT_XRGB8888 },
> + },
> + {
> + .name = "remove duplicates",
> + .native_fourccs = {
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_RGB888,
> + DRM_FORMAT_RGB888,
> + DRM_FORMAT_RGB888,
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_RGB888,
> + DRM_FORMAT_RGB565,
> + DRM_FORMAT_RGB888,
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_RGB565,
> + DRM_FORMAT_RGB565,
> + DRM_FORMAT_XRGB8888,
> + },
> + .expected = {
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_RGB888,
> + DRM_FORMAT_RGB565,
> + },
> + },
> + {
> + .name = "convert alpha formats",
> + .native_fourccs = {
> + DRM_FORMAT_ARGB1555,
> + DRM_FORMAT_ABGR1555,
> + DRM_FORMAT_RGBA5551,
> + DRM_FORMAT_BGRA5551,
> + DRM_FORMAT_ARGB8888,
> + DRM_FORMAT_ABGR8888,
> + DRM_FORMAT_RGBA8888,
> + DRM_FORMAT_BGRA8888,
> + DRM_FORMAT_ARGB2101010,
> + DRM_FORMAT_ABGR2101010,
> + DRM_FORMAT_RGBA1010102,
> + DRM_FORMAT_BGRA1010102,
> + },
> + .expected = {
> + DRM_FORMAT_XRGB1555,
> + DRM_FORMAT_XBGR1555,
> + DRM_FORMAT_RGBX5551,
> + DRM_FORMAT_BGRX5551,
> + DRM_FORMAT_XRGB8888,
> + DRM_FORMAT_XBGR8888,
> + DRM_FORMAT_RGBX8888,
> + DRM_FORMAT_BGRX8888,
> + DRM_FORMAT_XRGB2101010,
> + DRM_FORMAT_XBGR2101010,
> + DRM_FORMAT_RGBX1010102,
> + DRM_FORMAT_BGRX1010102,
> + },
> + },
> + {
> + .name = "random formats",
> + .native_fourccs = {
> + DRM_FORMAT_Y212,
> + DRM_FORMAT_ARGB1555,
> + DRM_FORMAT_ABGR16161616F,
> + DRM_FORMAT_C8,
> + DRM_FORMAT_BGR888,
> + DRM_FORMAT_XRGB1555,
> + DRM_FORMAT_RGBA5551,
> + DRM_FORMAT_BGR565_A8,
> + DRM_FORMAT_R10,
> + DRM_FORMAT_XYUV8888,
> + },
> + .expected = {
> + DRM_FORMAT_Y212,
> + DRM_FORMAT_XRGB1555,
> + DRM_FORMAT_ABGR16161616F,
> + DRM_FORMAT_C8,
> + DRM_FORMAT_BGR888,
> + DRM_FORMAT_RGBX5551,
> + DRM_FORMAT_BGR565_A8,
> + DRM_FORMAT_R10,
> + DRM_FORMAT_XYUV8888,
> + DRM_FORMAT_XRGB8888,
> + },
> + },
> +};
> +
> +static void fb_build_fourcc_list_case_desc(struct fb_build_fourcc_list_case *t, char *desc)
> +{
> + strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
> +}
> +
> +KUNIT_ARRAY_PARAM(fb_build_fourcc_list, fb_build_fourcc_list_cases, fb_build_fourcc_list_case_desc);
> +
> +static size_t get_nfourccs(const u32 *fourccs)
> +{
> + size_t i;
> +
> + for (i = 0; i < TEST_BUF_SIZE && fourccs[i]; ++i)
> + ;
> +
> + return i;
> +}
> +
> +static void drm_test_fb_build_fourcc_list(struct kunit *test)
> +{
> + const struct fb_build_fourcc_list_case *params = test->param_value;
> + u32 fourccs_out[TEST_BUF_SIZE];
> + size_t nfourccs_out;
> + struct drm_device *drm;
> + struct device *dev;
> +
> + dev = drm_kunit_helper_alloc_device(test);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
> +
> + drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
> +
> + nfourccs_out = drm_fb_build_fourcc_list(drm, params->native_fourccs,
> + get_nfourccs(params->native_fourccs),
> + fourccs_out, TEST_BUF_SIZE);
> +
> + drm_kunit_helper_free_device(test, dev);
I believe that this function is no longer needed after Maxime's patches.
> + KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected));
Instead of using this get_fourccs() functions, wouldn't it be better to
hardcode the number of expected fourccs in the cases?
Best Regards,
- Maíra
> + KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
> +}
> +
> static struct kunit_case drm_format_helper_test_cases[] = {
> KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_gray8, convert_xrgb8888_gen_params),
> KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgb332, convert_xrgb8888_gen_params),
> @@ -1061,6 +1203,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
> KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
> KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
> KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
> + KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
> {}
> };
>
More information about the dri-devel
mailing list