[PATCH i-g-t v2 1/3] tests/intel/kms_ccs: recycle framebuffers
Kahola, Mika
mika.kahola at intel.com
Tue Oct 22 10:28:42 UTC 2024
> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Juha-Pekka
> Heikkila
> Sent: Thursday, 17 October 2024 14.27
> To: igt-dev at lists.freedesktop.org
> Cc: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
> Subject: [PATCH i-g-t v2 1/3] tests/intel/kms_ccs: recycle framebuffers
>
> framebuffers used in tests don't need to be recreated for each rendering pipe.
> Here all framebuffers are buffered and recycled.
> This cut execution time of crc tests to roughtly half when running on discrete
> graphics.
>
Reviewed-by: Mika Kahola <mika.kahola at intel.com>
> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
> ---
> tests/intel/kms_ccs.c | 178 +++++++++++++++++++++++++++++-------------
> 1 file changed, 125 insertions(+), 53 deletions(-)
>
> diff --git a/tests/intel/kms_ccs.c b/tests/intel/kms_ccs.c index
> 49c8828d2..cd65ba7b4 100644
> --- a/tests/intel/kms_ccs.c
> +++ b/tests/intel/kms_ccs.c
> @@ -186,6 +186,15 @@ typedef struct {
> uint64_t ccs_modifier;
> unsigned int seed;
> bool user_seed;
> + enum igt_commit_style commit;
> + int fb_list_length;
> + struct {
> + struct igt_fb fb;
> + int width, height;
> + double r, g, b;
> + u64 modifier;
> + u32 format;
> + } *fb_list;
> } data_t;
>
> static const struct {
> @@ -750,13 +759,57 @@ static void xe2_ccs_blit(data_t *data, struct igt_fb *fb,
> struct igt_fb *temp_fb
> access_flat_ccs_surface(fb, true);
> }
>
> +static struct igt_fb *get_fb(data_t *data, u64 modifier, double r, double g,
> + double b, int width, int height, u32 format,
> + int *goodfb)
> +{
> + for (int i = 0; i < data->fb_list_length; i++) {
> + if (data->fb_list[i].width == width &&
> + data->fb_list[i].height == height &&
> + data->fb_list[i].modifier == modifier &&
> + data->fb_list[i].format == format &&
> + data->fb_list[i].r == r && data->fb_list[i].g == g &&
> + data->fb_list[i].b == b) {
> + if (goodfb)
> + *goodfb = true;
> +
> + return &data->fb_list[i].fb;
> + }
> + }
> +
> + data->fb_list = realloc(data->fb_list, sizeof(*data->fb_list) *
> + (data->fb_list_length + 1));
> + data->fb_list[data->fb_list_length].width = width;
> + data->fb_list[data->fb_list_length].height = height;
> + data->fb_list[data->fb_list_length].r = r;
> + data->fb_list[data->fb_list_length].g = g;
> + data->fb_list[data->fb_list_length].b = b;
> + data->fb_list[data->fb_list_length].modifier = modifier;
> + data->fb_list[data->fb_list_length].format = format;
> +
> + if (r + g + b == 0)
> + igt_create_pattern_fb(data->drm_fd, width, height, format,
> + modifier,
> + &data->fb_list[data->fb_list_length].fb);
> + else
> + igt_create_color_fb(data->drm_fd, width, height, format,
> + modifier, r, g, b,
> + &data->fb_list[data->fb_list_length].fb);
> +
> + return &data->fb_list[data->fb_list_length++].fb;
> +}
> +
> static void generate_fb(data_t *data, struct igt_fb *fb,
> int width, int height,
> enum test_fb_flags fb_flags)
> {
> struct drm_mode_fb_cmd2 f = {0};
> uint64_t modifier;
> - cairo_t *cr;
> + struct igt_fb *temp_fb;
> + bool do_fast_clear = igt_fb_is_gen12_rc_ccs_cc_modifier(data-
> >ccs_modifier);
> + bool do_solid_fill = do_fast_clear || data->plane;
> + int c = !!data->plane;
> + int goodfb = false;
> const float cc_color[4] = {colors[!!data->plane].r,
> colors[!!data->plane].g,
> colors[!!data->plane].b,
> @@ -772,48 +825,46 @@ static void generate_fb(data_t *data, struct igt_fb *fb,
> else
> modifier = DRM_FORMAT_MOD_LINEAR;
>
> - create_fb_prepare_add(data->drm_fd, width, height,
> - data->format, modifier,
> - fb, &f);
> + if (data->flags & TEST_RANDOM) {
> + create_fb_prepare_add(data->drm_fd, width, height,
> + data->format, modifier,
> + fb, &f);
> + } else {
> + if (do_solid_fill)
> + temp_fb = get_fb(data, modifier,
> + colors[c].r, colors[c].g, colors[c].b,
> + width, height, data->format, &goodfb);
> + else
> + temp_fb = get_fb(data, modifier, 0.0, 0.0, 0.0,
> + width, height, data->format, &goodfb);
> +
> + *fb = *temp_fb;
> + addfb_init(fb, &f);
> + }
>
> if (data->flags & TEST_RANDOM) {
> srand(data->seed);
> fill_fb_random(data->drm_fd, fb);
> } else {
> - bool do_fast_clear = igt_fb_is_gen12_rc_ccs_cc_modifier(data-
> >ccs_modifier);
> - bool do_solid_fill = do_fast_clear || data->plane;
> - int c = !!data->plane;
> -
> if (do_fast_clear && (fb_flags & FB_COMPRESSED)) {
> fast_clear_fb(data->drm_fd, fb, cc_color);
> - } else {
> - if (modifier == I915_FORMAT_MOD_4_TILED_BMG_CCS
> ||
> - modifier == I915_FORMAT_MOD_4_TILED_LNL_CCS)
> {
> - struct igt_fb temp_fb;
> - // non compressed temporary pattern image
> - if (do_solid_fill)
> - igt_create_color_fb(data->drm_fd,
> width, height,
> - fb->drm_format,
> I915_FORMAT_MOD_4_TILED,
> - colors[c].r, colors[c].g,
> colors[c].b,
> - &temp_fb);
> - else
> - igt_create_pattern_fb(data->drm_fd,
> width, height,
> - fb->drm_format,
> I915_FORMAT_MOD_4_TILED,
> - &temp_fb);
> -
> - xe2_ccs_blit(data, fb, &temp_fb);
> - igt_remove_fb(data->drm_fd, &temp_fb);
> - } else {
> - cr = igt_get_cairo_ctx(data->drm_fd, fb);
> -
> - if (do_solid_fill)
> - igt_paint_color(cr, 0, 0, width, height,
> - colors[c].r, colors[c].g,
> colors[c].b);
> - else
> - igt_paint_test_pattern(cr, width,
> height);
> -
> - igt_put_cairo_ctx(cr);
> - }
> + } else if (!goodfb &&
> + (modifier == I915_FORMAT_MOD_4_TILED_BMG_CCS
> ||
> + modifier == I915_FORMAT_MOD_4_TILED_LNL_CCS))
> {
> + if (do_solid_fill)
> + temp_fb = get_fb(data,
> I915_FORMAT_MOD_4_TILED,
> + colors[c].r,
> + colors[c].g,
> + colors[c].b,
> + width, height,
> + data->format, NULL);
> + else
> + temp_fb = get_fb(data,
> I915_FORMAT_MOD_4_TILED,
> + 0.0, 0.0, 0.0,
> + width, height,
> + data->format, NULL);
> +
> + xe2_ccs_blit(data, fb, temp_fb);
> }
> }
>
> @@ -856,16 +907,10 @@ static bool try_config(data_t *data, enum test_fb_flags
> fb_flags,
> igt_plane_t *primary = compatible_main_plane(data);
> drmModeModeInfo *drm_mode = igt_output_get_mode(data->output);
> int fb_width = drm_mode->hdisplay;
> - enum igt_commit_style commit;
> struct igt_fb fb = {};
> struct igt_fb fb_sprite = {};
> int ret;
>
> - if (data->display.is_atomic)
> - commit = COMMIT_ATOMIC;
> - else
> - commit = COMMIT_UNIVERSAL;
> -
> if (primary == data->plane)
> return false;
>
> @@ -922,7 +967,7 @@ static bool try_config(data_t *data, enum test_fb_flags
> fb_flags,
> if (data->flags & TEST_BAD_ROTATION_90)
> igt_plane_set_rotation(primary, IGT_ROTATION_90);
>
> - ret = igt_display_try_commit2(display, commit);
> + ret = igt_display_try_commit2(display, data->commit);
>
> if (ret == 0 && !(fb_flags & TEST_BAD_ROTATION_90) && crc)
> igt_pipe_crc_collect_crc(data->pipe_crc, crc); @@ -937,10
> +982,11 @@ static bool try_config(data_t *data, enum test_fb_flags fb_flags,
>
> igt_plane_set_fb(primary, NULL);
> igt_plane_set_rotation(primary, IGT_ROTATION_0);
> - igt_display_commit2(display, commit);
>
> - igt_remove_fb(data->drm_fd, &fb_sprite);
> - igt_remove_fb(data->drm_fd, &fb);
> + if (data->flags & TEST_RANDOM) {
> + igt_display_commit2(display, data->commit);
> + igt_remove_fb(data->drm_fd, &fb);
> + }
>
> igt_assert_eq(ret, data->flags & TEST_BAD_ROTATION_90 ? -EINVAL : 0);
>
> @@ -1006,6 +1052,27 @@ static bool skip_plane(data_t *data, igt_plane_t
> *plane)
> return index != 0 && index != 3 && index != 5; }
>
> +static bool valid_modifier_test(u64 modifier, const enum test_flags
> +flags) {
> + switch (modifier) {
> + case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS:
> + case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS:
> + case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC:
> + if (flags & TEST_BAD_CCS_PLANE)
> + return false;
> + break;
> + case I915_FORMAT_MOD_4_TILED_BMG_CCS:
> + case I915_FORMAT_MOD_4_TILED_LNL_CCS:
> + if (flags & TEST_FAIL_ON_ADDFB2)
> + return false;
> + break;
> + default:
> + break;
> + }
> +
> + return true;
> +}
> +
> static void test_output(data_t *data, const int testnum) {
> uint16_t dev_id;
> @@ -1016,13 +1083,8 @@ static void test_output(data_t *data, const int
> testnum)
> data->flags = tests[testnum].flags;
>
> for (int i = 0; i < ARRAY_SIZE(ccs_modifiers); i++) {
> - if (((ccs_modifiers[i].modifier ==
> I915_FORMAT_MOD_4_TILED_DG2_RC_CCS ||
> - ccs_modifiers[i].modifier ==
> I915_FORMAT_MOD_4_TILED_DG2_MC_CCS ||
> - ccs_modifiers[i].modifier ==
> I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC) &&
> - tests[testnum].flags & TEST_BAD_CCS_PLANE) ||
> - (tests[testnum].flags & TEST_FAIL_ON_ADDFB2 &&
> - (ccs_modifiers[i].modifier ==
> I915_FORMAT_MOD_4_TILED_BMG_CCS ||
> - ccs_modifiers[i].modifier ==
> I915_FORMAT_MOD_4_TILED_LNL_CCS)))
> + if (!valid_modifier_test(ccs_modifiers[i].modifier,
> + data->flags))
> continue;
>
> data->ccs_modifier = ccs_modifiers[i].modifier; @@ -1123,12
> +1185,22 @@ igt_main_args("cs:", NULL, help_str, opt_handler, &data)
>
> if (!data.user_seed)
> data.seed = time(NULL);
> +
> + data.commit = data.display.is_atomic ? COMMIT_ATOMIC :
> + COMMIT_UNIVERSAL;
> +
> + data.fb_list_length = 0;
> }
>
> for (int c = 0; c < ARRAY_SIZE(tests); c++)
> test_output(&data, c);
>
> igt_fixture {
> + igt_display_commit2(&data.display, data.commit);
> + for (int i = 0; i < data.fb_list_length; i++)
> + igt_remove_fb(data.drm_fd, &data.fb_list[i].fb);
> + free(data.fb_list);
> +
> igt_display_fini(&data.display);
> drm_close_driver(data.drm_fd);
> }
> --
> 2.45.2
More information about the igt-dev
mailing list