[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