[Intel-gfx] [i-g-t] tests/kms_plane_multiple: DDB corner testcase
Maarten Lankhorst
maarten.lankhorst at linux.intel.com
Thu Jun 28 13:23:24 UTC 2018
Op 28-06-18 om 15:03 schreef Karthik B S:
> This is to exercise DDB algorithm corner case where
> DDB allocation was not happening properly for varying size plane.
>
> Current DDB algorithm uses datarate based DDB division among
> planes, but planes with same width require same DDB allocation
> irrespective of their height.
>
> To address this a Multiplane flip is added, with all planes other
> than the topmost plane having full size, and the top most plane
> size and position is varied.
>
> Signed-off-by: Mahesh Kumar <mahesh1.kumar at intel.com>
> Signed-off-by: Karthik B S <karthik.b.s at intel.com>
> ---
> tests/kms_plane_multiple.c | 130 ++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 116 insertions(+), 14 deletions(-)
>
> diff --git a/tests/kms_plane_multiple.c b/tests/kms_plane_multiple.c
> index e61bc84..e9ebaeb 100644
> --- a/tests/kms_plane_multiple.c
> +++ b/tests/kms_plane_multiple.c
> @@ -35,6 +35,8 @@ IGT_TEST_DESCRIPTION("Test atomic mode setting with multiple planes ");
> #define SIZE_PLANE 256
> #define SIZE_CURSOR 128
> #define LOOP_FOREVER -1
> +#define TEST_DDB_ALGO 1
> +#define SIZE_PANE 10
>
> typedef struct {
> float red;
> @@ -48,6 +50,7 @@ typedef struct {
> igt_crc_t ref_crc;
> igt_pipe_crc_t *pipe_crc;
> igt_plane_t **plane;
> + unsigned int flag;
> struct igt_fb *fb;
> } data_t;
>
> @@ -62,6 +65,14 @@ struct {
> .seed = 1,
> };
>
> +enum position {
> + POS_TOP,
> + POS_LEFT,
> + POS_BOTTOM,
> + POS_RIGHT,
> + POS_MAX,
> +};
> +
> /*
> * Common code across all tests, acting on data_t
> */
> @@ -242,6 +253,80 @@ prepare_planes(data_t *data, enum pipe pipe_id, color_t *color,
> }
>
> static void
> +prepare_planes2(data_t *data, enum pipe pipe_id, color_t *color,
> + uint64_t tiling, int max_planes, igt_output_t *output,
> + enum position position)
> +{
> + drmModeModeInfo *mode;
> + int x;
> + int y;
> + int i;
> + int hsize, vsize;
> +
> + mode = igt_output_get_mode(output);
> +
> + for (i = 0; i < max_planes; i++) {
> + igt_plane_t *plane = igt_output_get_plane(output, i);
> + uint32_t format = DRM_FORMAT_XRGB8888;
> +
> + if (plane->type == DRM_PLANE_TYPE_CURSOR) {
> + format = DRM_FORMAT_ARGB8888;
> + tiling = LOCAL_DRM_FORMAT_MOD_NONE;
> + x = 0;
> + y = 0;
> + hsize = SIZE_CURSOR;
> + vsize = SIZE_CURSOR;
> + } else if ((plane->index == max_planes - 2) &&
> + (plane->type != DRM_PLANE_TYPE_PRIMARY)) {
> + /* Top most plane and not the primary plane */
> + switch (position) {
> + case POS_TOP:
> + x = 0;
> + y = 0;
> + hsize = mode->hdisplay;
> + vsize = SIZE_PANE;
> + break;
> + case POS_RIGHT:
> + x = mode->hdisplay - SIZE_PANE;
> + y = 0;
> + hsize = SIZE_PANE;
> + vsize = mode->vdisplay;
> + break;
> + case POS_BOTTOM:
> + x = 0;
> + y = mode->vdisplay - SIZE_PANE;
> + hsize = mode->hdisplay;
> + vsize = SIZE_PANE;
> + break;
> + case POS_LEFT:
> + x = 0;
> + y = 0;
> + hsize = SIZE_PANE;
> + vsize = mode->vdisplay;
> + break;
> + default:
> + igt_info("Invalid Position\n");
> + }
> +
> + } else {
> + x = 0;
> + y = 0;
> + hsize = mode->hdisplay;
> + vsize = mode->vdisplay;
> + }
> +
> + data->plane[i] = plane;
> + igt_create_color_fb(data->drm_fd,
> + hsize, vsize,
> + format, tiling,
> + color->red, color->green, color->blue,
> + &data->fb[i]);
> + igt_plane_set_position(data->plane[i], x, y);
> + igt_plane_set_fb(data->plane[i], &data->fb[i]);
> + }
> +}
> +
> +static void
> test_plane_position_with_output(data_t *data, enum pipe pipe,
> igt_output_t *output, int n_planes,
> uint64_t tiling)
> @@ -267,21 +352,29 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
> info, opt.seed);
>
> test_init(data, pipe, n_planes);
> -
> test_grab_crc(data, output, pipe, &blue, tiling);
>
> - i = 0;
> - while (i < iterations || loop_forever) {
> - prepare_planes(data, pipe, &blue, tiling, n_planes, output);
> + if (data->flag == TEST_DDB_ALGO) {
> + for (i = POS_TOP; i < POS_MAX; i++) {
> + prepare_planes2(data, pipe, &blue, tiling,
> + n_planes, output, i);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> + }
> + i = 0;
> + } else {
> + while (i < iterations || loop_forever) {
> + prepare_planes(data, pipe, &blue, tiling,
> + n_planes, output);
>
> - igt_display_commit2(&data->display, COMMIT_ATOMIC);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
>
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, &crc);
> + igt_pipe_crc_drain(data->pipe_crc);
> + igt_pipe_crc_get_single(data->pipe_crc, &crc);
>
> - igt_assert_crc_equal(&data->ref_crc, &crc);
> + igt_assert_crc_equal(&data->ref_crc, &crc);
>
> - i++;
> + i++;
> + }
> }
>
> test_fini(data, output, n_planes);
> @@ -318,7 +411,7 @@ test_plane_position(data_t *data, enum pipe pipe, uint64_t tiling)
> }
>
> static void
> -run_tests_for_pipe(data_t *data, enum pipe pipe)
> +run_tests_for_pipe(data_t *data, enum pipe pipe, bool test_ddb)
> {
> igt_output_t *output;
>
> @@ -334,15 +427,22 @@ run_tests_for_pipe(data_t *data, enum pipe pipe)
> igt_require(data->display.pipes[pipe].n_planes > 0);
> }
>
> - igt_subtest_f("atomic-pipe-%s-tiling-x", kmstest_pipe_name(pipe))
> + data->flag = 0;
> + if (test_ddb)
> + data->flag = TEST_DDB_ALGO;
> +
> + igt_subtest_f("atomic-pipe-%s-tiling-x%s", kmstest_pipe_name(pipe),
> + test_ddb ? "_ddb" : "")
> for_each_valid_output_on_pipe(&data->display, pipe, output)
> test_plane_position(data, pipe, LOCAL_I915_FORMAT_MOD_X_TILED);
>
> - igt_subtest_f("atomic-pipe-%s-tiling-y", kmstest_pipe_name(pipe))
> + igt_subtest_f("atomic-pipe-%s-tiling-y%s", kmstest_pipe_name(pipe),
> + test_ddb ? "_ddb" : "")
> for_each_valid_output_on_pipe(&data->display, pipe, output)
> test_plane_position(data, pipe, LOCAL_I915_FORMAT_MOD_Y_TILED);
>
> - igt_subtest_f("atomic-pipe-%s-tiling-yf", kmstest_pipe_name(pipe))
> + igt_subtest_f("atomic-pipe-%s-tiling-yf%s", kmstest_pipe_name(pipe),
> + test_ddb ? "_ddb" : "")
> for_each_valid_output_on_pipe(&data->display, pipe, output)
> test_plane_position(data, pipe, LOCAL_I915_FORMAT_MOD_Yf_TILED);
> }
> @@ -401,7 +501,9 @@ int main(int argc, char *argv[])
>
> for_each_pipe_static(pipe) {
> igt_subtest_group
> - run_tests_for_pipe(&data, pipe);
> + run_tests_for_pipe(&data, pipe, false);
> + igt_subtest_group
> + run_tests_for_pipe(&data, pipe, true);
Would brackets around igt_subtest_group suffice? I don't think we need to skip twice.
~Maarten
More information about the Intel-gfx
mailing list