[igt-dev] [PATCH i-g-t 1/2] tests/kms_rotation_crc: avoid recalculating refecence crcs
Juha-Pekka Heikkila
juhapekka.heikkila at gmail.com
Fri Jan 8 11:23:40 UTC 2021
Thanks for R-b, pushed this as well as optimization patch for kms_plane
scaling.
/Juha-Pekka
On 8.1.2021 6.23, Karthik B S wrote:
> On 1/7/2021 9:21 PM, Juha-Pekka Heikkila wrote:
>> Get those reference crcs only once since they stay the same.
>>
>> v2: Need to make exception for HSW, there crcs seem to vary across
>> rendering pipes.
>
> Since it is an optimization, this exception should be fine.
>
> Reviewed-by: Karthik B S <karthik.b.s at intel.com>
>
>>
>> This reduces generic rotation tests execution time on my ICL from 26s
>> to 14s
>>
>> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
>> ---
>> tests/kms_rotation_crc.c | 88 ++++++++++++++++++++++++----------------
>> 1 file changed, 52 insertions(+), 36 deletions(-)
>>
>> diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
>> index ffcc2cc2e..be27103fa 100644
>> --- a/tests/kms_rotation_crc.c
>> +++ b/tests/kms_rotation_crc.c
>> @@ -49,6 +49,14 @@ struct p_point{
>> float_t y;
>> };
>> +enum rectangle_type {
>> + rectangle,
>> + square,
>> + portrait,
>> + landscape,
>> + num_rectangle_types /* must be last */
>> +};
>> +
>> typedef struct {
>> int gfx_fd;
>> igt_display_t display;
>> @@ -70,6 +78,12 @@ typedef struct {
>> bool use_native_resolution;
>> bool extended;
>> +
>> + struct crc_rect_tag {
>> + bool valid;
>> + igt_crc_t ref_crc;
>> + igt_crc_t flip_crc;
>> + } crc_rect[num_rectangle_types];
>> } data_t;
>> typedef struct {
>> @@ -190,14 +204,6 @@ static void prepare_crtc(data_t *data,
>> igt_output_t *output, enum pipe pipe,
>> igt_pipe_crc_start(data->pipe_crc);
>> }
>> -enum rectangle_type {
>> - rectangle,
>> - square,
>> - portrait,
>> - landscape,
>> - num_rectangle_types /* must be last */
>> -};
>> -
>> static void prepare_fbs(data_t *data, igt_output_t *output,
>> igt_plane_t *plane, enum rectangle_type rect, uint32_t
>> format)
>> {
>> @@ -267,42 +273,49 @@ static void prepare_fbs(data_t *data,
>> igt_output_t *output,
>> igt_require(igt_display_has_format_mod(display, pixel_format,
>> tiling));
>> /*
>> - * Create a reference software rotated flip framebuffer.
>> + * HSW will need to have those CRCs calculated each time, it
>> + * seems to behave different from other platforms.
>> */
>> - igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format, tiling,
>> - &data->fb_flip);
>> - paint_squares(data, data->rotation, &data->fb_flip,
>> - flip_opacity);
>> - igt_plane_set_fb(plane, &data->fb_flip);
>> - if (plane->type != DRM_PLANE_TYPE_CURSOR)
>> - igt_plane_set_position(plane, data->pos_x, data->pos_y);
>> - igt_display_commit2(display, COMMIT_ATOMIC);
>> + if (!data->crc_rect[rect].valid || IS_HASWELL(data->devid)) {
>> + /*
>> + * Create a reference software rotated flip framebuffer.
>> + */
>> + igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format, tiling,
>> + &data->fb_flip);
>> + paint_squares(data, data->rotation, &data->fb_flip,
>> + flip_opacity);
>> + igt_plane_set_fb(plane, &data->fb_flip);
>> + if (plane->type != DRM_PLANE_TYPE_CURSOR)
>> + igt_plane_set_position(plane, data->pos_x, data->pos_y);
>> + igt_display_commit2(display, COMMIT_ATOMIC);
>> - igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc,
>> &data->flip_crc);
>> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc,
>> &data->crc_rect[rect].flip_crc);
>> + igt_remove_fb(data->gfx_fd, &data->fb_flip);
>> +
>> + /*
>> + * Create a reference CRC for a software-rotated fb.
>> + */
>> + igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,
>> + data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE,
>> &data->fb_reference);
>> + paint_squares(data, data->rotation, &data->fb_reference, 1.0);
>> +
>> + igt_plane_set_fb(plane, &data->fb_reference);
>> + if (plane->type != DRM_PLANE_TYPE_CURSOR)
>> + igt_plane_set_position(plane, data->pos_x, data->pos_y);
>> + igt_display_commit2(display, COMMIT_ATOMIC);
>> +
>> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc,
>> &data->crc_rect[rect].ref_crc);
>> + data->crc_rect[rect].valid = true;
>> + }
>> /*
>> * Prepare the non-rotated flip fb.
>> */
>> - igt_remove_fb(data->gfx_fd, &data->fb_flip);
>> igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling,
>> &data->fb_flip);
>> paint_squares(data, IGT_ROTATION_0, &data->fb_flip,
>> flip_opacity);
>> - /*
>> - * Create a reference CRC for a software-rotated fb.
>> - */
>> - igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,
>> - data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE,
>> &data->fb_reference);
>> - paint_squares(data, data->rotation, &data->fb_reference, 1.0);
>> -
>> - igt_plane_set_fb(plane, &data->fb_reference);
>> - if (plane->type != DRM_PLANE_TYPE_CURSOR)
>> - igt_plane_set_position(plane, data->pos_x, data->pos_y);
>> - igt_display_commit2(display, COMMIT_ATOMIC);
>> -
>> - igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc,
>> &data->ref_crc);
>> -
>> /*
>> * Prepare the plane with an non-rotated fb let the hw rotate it.
>> */
>> @@ -341,7 +354,7 @@ static void test_single_case(data_t *data, enum
>> pipe pipe,
>> /* Check CRC */
>> igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc,
>> &crc_output);
>> - igt_assert_crc_equal(&data->ref_crc, &crc_output);
>> + igt_assert_crc_equal(&data->crc_rect[rect].ref_crc, &crc_output);
>> /*
>> * If flips are requested flip to a different fb and
>> @@ -364,8 +377,7 @@ static void test_single_case(data_t *data, enum
>> pipe pipe,
>> }
>> kmstest_wait_for_pageflip(data->gfx_fd);
>> igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc,
>> &crc_output);
>> - igt_assert_crc_equal(&data->flip_crc,
>> - &crc_output);
>> + igt_assert_crc_equal(&data->crc_rect[rect].flip_crc,
>> &crc_output);
>> }
>> }
>> @@ -396,6 +408,10 @@ static void test_plane_rotation(data_t *data, int
>> plane_type, bool test_bad_form
>> igt_display_t *display = &data->display;
>> igt_output_t *output;
>> enum pipe pipe;
>> + int c;
>> +
>> + for (c = 0; c < num_rectangle_types; c++)
>> + data->crc_rect[c].valid = false;
>> if (plane_type == DRM_PLANE_TYPE_CURSOR)
>> igt_require(display->has_cursor_plane);
>
>
More information about the igt-dev
mailing list