Message ID | 20180115142834.65798-9-maarten.lankhorst@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 2018-01-15 at 15:28 +0100, Maarten Lankhorst wrote: > From: Jyoti Yadav <jyoti.r.yadav@intel.com> > > Add a subtest to display primary and overlay planes on two > connected pipes and runs scaling test on both pipes > > Changes since v1: > - Commit first before trying any scaling. (Maarten) > - Use the same logic as kms_cursor_legacy to find a pipe and output. > (Maarten) > - Rework test to work with how cleanup is handled. (Maarten) > Changes since v2: > - Use get_num_scalers() to only use 2 scalers if available. (Maarten) > > Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com> > Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com> > Signed-off-by: Vidya Srinivas <vidya.srinivas@intel.com> > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > --- > tests/kms_plane_scaling.c | 93 > ++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 92 insertions(+), 1 deletion(-) > > diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c > index 36a6a8ef042b..8dbacf67b0a0 100644 > --- a/tests/kms_plane_scaling.c > +++ b/tests/kms_plane_scaling.c > @@ -38,10 +38,12 @@ typedef struct { > int image_w; > int image_h; > > - struct igt_fb fb[3]; > + struct igt_fb fb[4]; > + > igt_plane_t *plane1; > igt_plane_t *plane2; > igt_plane_t *plane3; > + igt_plane_t *plane4; > } data_t; > > static int get_num_scalers(uint32_t devid, enum pipe pipe) > @@ -456,6 +458,92 @@ > test_scaler_with_clipping_clamping_scenario(data_t *d, enum pipe > pipe, igt_outpu > igt_display_commit2(&d->display, COMMIT_ATOMIC); > } > > +static void find_connected_pipe(igt_display_t *display, bool second, > enum pipe *pipe, igt_output_t **output) > +{ > + enum pipe first = PIPE_NONE; > + igt_output_t *first_output = NULL; > + bool found = false; > + > + for_each_pipe_with_valid_output(display, *pipe, *output) { > + if (first == *pipe || *output == first_output) > + continue; > + > + if (second) { > + first = *pipe; > + first_output = *output; > + second = false; > + continue; > + } > + > + return; > + } > + > + if (first_output) > + igt_require_f(found, "No second valid output > found\n"); > + else > + igt_require_f(found, "No valid outputs found\n"); > +} > + > +static void test_scaler_with_multi_pipe_plane(data_t *d) > +{ > + igt_display_t *display = &d->display; > + igt_output_t *output1, *output2; > + drmModeModeInfo *mode1, *mode2; > + enum pipe pipe1, pipe2; > + > + cleanup_crtc(d); > + > + find_connected_pipe(display, false, &pipe1, &output1); > + find_connected_pipe(display, true, &pipe2, &output2); > + > + igt_skip_on(!output1 || !output2); > + > + igt_output_set_pipe(output1, pipe1); > + igt_output_set_pipe(output2, pipe2); > + > + d->plane1 = igt_output_get_plane(output1, 0); > + d->plane2 = get_num_scalers(d->devid, pipe1) >= 2 ? > igt_output_get_plane(output1, 1) : NULL; > + d->plane3 = igt_output_get_plane(output2, 0); > + d->plane4 = get_num_scalers(d->devid, pipe2) >= 2 ? > igt_output_get_plane(output2, 1) : NULL; Maybe use DRM plane type definitions DRM_PLANE_TYPE_OVERLAY and DRM_PLANE_TYPE_PRIMARY instead of 0 and 1 to better indicate what plane we are referring to. > + > + mode1 = igt_output_get_mode(output1); > + mode2 = igt_output_get_mode(output2); > + > + igt_create_pattern_fb(d->drm_fd, 600, 600, > + DRM_FORMAT_XRGB8888, > + LOCAL_I915_FORMAT_MOD_Y_TILED, &d- > >fb[0]); > + > + igt_create_pattern_fb(d->drm_fd, 500, 500, > + DRM_FORMAT_XRGB8888, > + LOCAL_I915_FORMAT_MOD_Y_TILED, &d- > >fb[1]); > + > + igt_create_pattern_fb(d->drm_fd, 700, 700, > + DRM_FORMAT_XRGB8888, > + LOCAL_I915_FORMAT_MOD_Y_TILED, &d- > >fb[2]); > + > + igt_create_pattern_fb(d->drm_fd, 400, 400, > + DRM_FORMAT_XRGB8888, > + LOCAL_I915_FORMAT_MOD_Y_TILED, &d- > >fb[3]); > + > + igt_plane_set_fb(d->plane1, &d->fb[0]); > + if (d->plane2) > + igt_plane_set_fb(d->plane2, &d->fb[1]); > + igt_plane_set_fb(d->plane3, &d->fb[2]); > + if (d->plane4) > + igt_plane_set_fb(d->plane4, &d->fb[3]); > + igt_display_commit2(display, COMMIT_ATOMIC); > + > + /* Upscaling Primary */ > + igt_plane_set_size(d->plane1, mode1->hdisplay, mode1- > >vdisplay); > + igt_plane_set_size(d->plane3, mode2->hdisplay, mode2- > >vdisplay); > + igt_display_commit2(display, COMMIT_ATOMIC); > + > + /* Upscaling Sprites */ > + igt_plane_set_size(d->plane2 ?: d->plane1, mode1->hdisplay, > mode1->vdisplay); > + igt_plane_set_size(d->plane4 ?: d->plane3, mode2->hdisplay, > mode2->vdisplay); > + igt_display_commit2(display, COMMIT_ATOMIC); > +} > + > igt_main > { > data_t data = {}; > @@ -497,6 +585,9 @@ igt_main > test_scaler_with_clipping_clamping_s > cenario(&data, pipe, output); > } > > + igt_subtest_f("2x-scaler-multi-pipe") > + test_scaler_with_multi_pipe_plane(&data); > + > igt_fixture > igt_display_fini(&data.display); > }
Op 16-01-18 om 14:46 schreef Mika Kahola: > On Mon, 2018-01-15 at 15:28 +0100, Maarten Lankhorst wrote: >> From: Jyoti Yadav <jyoti.r.yadav@intel.com> >> >> Add a subtest to display primary and overlay planes on two >> connected pipes and runs scaling test on both pipes >> >> Changes since v1: >> - Commit first before trying any scaling. (Maarten) >> - Use the same logic as kms_cursor_legacy to find a pipe and output. >> (Maarten) >> - Rework test to work with how cleanup is handled. (Maarten) >> Changes since v2: >> - Use get_num_scalers() to only use 2 scalers if available. (Maarten) >> >> Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com> >> Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com> >> Signed-off-by: Vidya Srinivas <vidya.srinivas@intel.com> >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> >> --- >> tests/kms_plane_scaling.c | 93 >> ++++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 92 insertions(+), 1 deletion(-) >> >> diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c >> index 36a6a8ef042b..8dbacf67b0a0 100644 >> --- a/tests/kms_plane_scaling.c >> +++ b/tests/kms_plane_scaling.c >> @@ -38,10 +38,12 @@ typedef struct { >> int image_w; >> int image_h; >> >> - struct igt_fb fb[3]; >> + struct igt_fb fb[4]; >> + >> igt_plane_t *plane1; >> igt_plane_t *plane2; >> igt_plane_t *plane3; >> + igt_plane_t *plane4; >> } data_t; >> >> static int get_num_scalers(uint32_t devid, enum pipe pipe) >> @@ -456,6 +458,92 @@ >> test_scaler_with_clipping_clamping_scenario(data_t *d, enum pipe >> pipe, igt_outpu >> igt_display_commit2(&d->display, COMMIT_ATOMIC); >> } >> >> +static void find_connected_pipe(igt_display_t *display, bool second, >> enum pipe *pipe, igt_output_t **output) >> +{ >> + enum pipe first = PIPE_NONE; >> + igt_output_t *first_output = NULL; >> + bool found = false; >> + >> + for_each_pipe_with_valid_output(display, *pipe, *output) { >> + if (first == *pipe || *output == first_output) >> + continue; >> + >> + if (second) { >> + first = *pipe; >> + first_output = *output; >> + second = false; >> + continue; >> + } >> + >> + return; >> + } >> + >> + if (first_output) >> + igt_require_f(found, "No second valid output >> found\n"); >> + else >> + igt_require_f(found, "No valid outputs found\n"); >> +} >> + >> +static void test_scaler_with_multi_pipe_plane(data_t *d) >> +{ >> + igt_display_t *display = &d->display; >> + igt_output_t *output1, *output2; >> + drmModeModeInfo *mode1, *mode2; >> + enum pipe pipe1, pipe2; >> + >> + cleanup_crtc(d); >> + >> + find_connected_pipe(display, false, &pipe1, &output1); >> + find_connected_pipe(display, true, &pipe2, &output2); >> + >> + igt_skip_on(!output1 || !output2); >> + >> + igt_output_set_pipe(output1, pipe1); >> + igt_output_set_pipe(output2, pipe2); >> + >> + d->plane1 = igt_output_get_plane(output1, 0); >> + d->plane2 = get_num_scalers(d->devid, pipe1) >= 2 ? >> igt_output_get_plane(output1, 1) : NULL; >> + d->plane3 = igt_output_get_plane(output2, 0); >> + d->plane4 = get_num_scalers(d->devid, pipe2) >= 2 ? >> igt_output_get_plane(output2, 1) : NULL; > Maybe use DRM plane type definitions DRM_PLANE_TYPE_OVERLAY and > DRM_PLANE_TYPE_PRIMARY instead of 0 and 1 to better indicate what plane > we are referring to. igt_output_get_plane takes an index, igt_output_get_plane_type takes those definitions. I've been bit a few times by that as well. :) ~Maarten
On Tue, 2018-01-16 at 14:47 +0100, Maarten Lankhorst wrote: > Op 16-01-18 om 14:46 schreef Mika Kahola: > > > > On Mon, 2018-01-15 at 15:28 +0100, Maarten Lankhorst wrote: > > > > > > From: Jyoti Yadav <jyoti.r.yadav@intel.com> > > > > > > Add a subtest to display primary and overlay planes on two > > > connected pipes and runs scaling test on both pipes > > > > > > Changes since v1: > > > - Commit first before trying any scaling. (Maarten) > > > - Use the same logic as kms_cursor_legacy to find a pipe and > > > output. > > > (Maarten) > > > - Rework test to work with how cleanup is handled. (Maarten) > > > Changes since v2: > > > - Use get_num_scalers() to only use 2 scalers if available. > > > (Maarten) > > > > > > Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com> > > > Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com> > > > Signed-off-by: Vidya Srinivas <vidya.srinivas@intel.com> > > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.c > > > om> > > > --- > > > tests/kms_plane_scaling.c | 93 > > > ++++++++++++++++++++++++++++++++++++++++++++++- > > > 1 file changed, 92 insertions(+), 1 deletion(-) > > > > > > diff --git a/tests/kms_plane_scaling.c > > > b/tests/kms_plane_scaling.c > > > index 36a6a8ef042b..8dbacf67b0a0 100644 > > > --- a/tests/kms_plane_scaling.c > > > +++ b/tests/kms_plane_scaling.c > > > @@ -38,10 +38,12 @@ typedef struct { > > > int image_w; > > > int image_h; > > > > > > - struct igt_fb fb[3]; > > > + struct igt_fb fb[4]; > > > + > > > igt_plane_t *plane1; > > > igt_plane_t *plane2; > > > igt_plane_t *plane3; > > > + igt_plane_t *plane4; > > > } data_t; > > > > > > static int get_num_scalers(uint32_t devid, enum pipe pipe) > > > @@ -456,6 +458,92 @@ > > > test_scaler_with_clipping_clamping_scenario(data_t *d, enum pipe > > > pipe, igt_outpu > > > igt_display_commit2(&d->display, COMMIT_ATOMIC); > > > } > > > > > > +static void find_connected_pipe(igt_display_t *display, bool > > > second, > > > enum pipe *pipe, igt_output_t **output) > > > +{ > > > + enum pipe first = PIPE_NONE; > > > + igt_output_t *first_output = NULL; > > > + bool found = false; > > > + > > > + for_each_pipe_with_valid_output(display, *pipe, *output) > > > { > > > + if (first == *pipe || *output == first_output) > > > + continue; > > > + > > > + if (second) { > > > + first = *pipe; > > > + first_output = *output; > > > + second = false; > > > + continue; > > > + } > > > + > > > + return; > > > + } > > > + > > > + if (first_output) > > > + igt_require_f(found, "No second valid output > > > found\n"); > > > + else > > > + igt_require_f(found, "No valid outputs > > > found\n"); > > > +} > > > + > > > +static void test_scaler_with_multi_pipe_plane(data_t *d) > > > +{ > > > + igt_display_t *display = &d->display; > > > + igt_output_t *output1, *output2; > > > + drmModeModeInfo *mode1, *mode2; > > > + enum pipe pipe1, pipe2; > > > + > > > + cleanup_crtc(d); > > > + > > > + find_connected_pipe(display, false, &pipe1, &output1); > > > + find_connected_pipe(display, true, &pipe2, &output2); > > > + > > > + igt_skip_on(!output1 || !output2); > > > + > > > + igt_output_set_pipe(output1, pipe1); > > > + igt_output_set_pipe(output2, pipe2); > > > + > > > + d->plane1 = igt_output_get_plane(output1, 0); > > > + d->plane2 = get_num_scalers(d->devid, pipe1) >= 2 ? > > > igt_output_get_plane(output1, 1) : NULL; > > > + d->plane3 = igt_output_get_plane(output2, 0); > > > + d->plane4 = get_num_scalers(d->devid, pipe2) >= 2 ? > > > igt_output_get_plane(output2, 1) : NULL; > > Maybe use DRM plane type definitions DRM_PLANE_TYPE_OVERLAY and > > DRM_PLANE_TYPE_PRIMARY instead of 0 and 1 to better indicate what > > plane > > we are referring to. > igt_output_get_plane takes an index, igt_output_get_plane_type takes > those definitions. > I've been bit a few times by that as well. :) yeah, you're absolutely right. Should have read more carefully :) You can bash my r-b. Reviewed-by: Mika Kahola <mika.kahola@intel.com> > > ~Maarten
Op 16-01-18 om 14:56 schreef Mika Kahola: > On Tue, 2018-01-16 at 14:47 +0100, Maarten Lankhorst wrote: >> Op 16-01-18 om 14:46 schreef Mika Kahola: >>> On Mon, 2018-01-15 at 15:28 +0100, Maarten Lankhorst wrote: >>>> From: Jyoti Yadav <jyoti.r.yadav@intel.com> >>>> >>>> Add a subtest to display primary and overlay planes on two >>>> connected pipes and runs scaling test on both pipes >>>> >>>> Changes since v1: >>>> - Commit first before trying any scaling. (Maarten) >>>> - Use the same logic as kms_cursor_legacy to find a pipe and >>>> output. >>>> (Maarten) >>>> - Rework test to work with how cleanup is handled. (Maarten) >>>> Changes since v2: >>>> - Use get_num_scalers() to only use 2 scalers if available. >>>> (Maarten) >>>> >>>> Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com> >>>> Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com> >>>> Signed-off-by: Vidya Srinivas <vidya.srinivas@intel.com> >>>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.c >>>> om> >>>> --- >>>> tests/kms_plane_scaling.c | 93 >>>> ++++++++++++++++++++++++++++++++++++++++++++++- >>>> 1 file changed, 92 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/tests/kms_plane_scaling.c >>>> b/tests/kms_plane_scaling.c >>>> index 36a6a8ef042b..8dbacf67b0a0 100644 >>>> --- a/tests/kms_plane_scaling.c >>>> +++ b/tests/kms_plane_scaling.c >>>> @@ -38,10 +38,12 @@ typedef struct { >>>> int image_w; >>>> int image_h; >>>> >>>> - struct igt_fb fb[3]; >>>> + struct igt_fb fb[4]; >>>> + >>>> igt_plane_t *plane1; >>>> igt_plane_t *plane2; >>>> igt_plane_t *plane3; >>>> + igt_plane_t *plane4; >>>> } data_t; >>>> >>>> static int get_num_scalers(uint32_t devid, enum pipe pipe) >>>> @@ -456,6 +458,92 @@ >>>> test_scaler_with_clipping_clamping_scenario(data_t *d, enum pipe >>>> pipe, igt_outpu >>>> igt_display_commit2(&d->display, COMMIT_ATOMIC); >>>> } >>>> >>>> +static void find_connected_pipe(igt_display_t *display, bool >>>> second, >>>> enum pipe *pipe, igt_output_t **output) >>>> +{ >>>> + enum pipe first = PIPE_NONE; >>>> + igt_output_t *first_output = NULL; >>>> + bool found = false; >>>> + >>>> + for_each_pipe_with_valid_output(display, *pipe, *output) >>>> { >>>> + if (first == *pipe || *output == first_output) >>>> + continue; >>>> + >>>> + if (second) { >>>> + first = *pipe; >>>> + first_output = *output; >>>> + second = false; >>>> + continue; >>>> + } >>>> + >>>> + return; >>>> + } >>>> + >>>> + if (first_output) >>>> + igt_require_f(found, "No second valid output >>>> found\n"); >>>> + else >>>> + igt_require_f(found, "No valid outputs >>>> found\n"); >>>> +} >>>> + >>>> +static void test_scaler_with_multi_pipe_plane(data_t *d) >>>> +{ >>>> + igt_display_t *display = &d->display; >>>> + igt_output_t *output1, *output2; >>>> + drmModeModeInfo *mode1, *mode2; >>>> + enum pipe pipe1, pipe2; >>>> + >>>> + cleanup_crtc(d); >>>> + >>>> + find_connected_pipe(display, false, &pipe1, &output1); >>>> + find_connected_pipe(display, true, &pipe2, &output2); >>>> + >>>> + igt_skip_on(!output1 || !output2); >>>> + >>>> + igt_output_set_pipe(output1, pipe1); >>>> + igt_output_set_pipe(output2, pipe2); >>>> + >>>> + d->plane1 = igt_output_get_plane(output1, 0); >>>> + d->plane2 = get_num_scalers(d->devid, pipe1) >= 2 ? >>>> igt_output_get_plane(output1, 1) : NULL; >>>> + d->plane3 = igt_output_get_plane(output2, 0); >>>> + d->plane4 = get_num_scalers(d->devid, pipe2) >= 2 ? >>>> igt_output_get_plane(output2, 1) : NULL; >>> Maybe use DRM plane type definitions DRM_PLANE_TYPE_OVERLAY and >>> DRM_PLANE_TYPE_PRIMARY instead of 0 and 1 to better indicate what >>> plane >>> we are referring to. >> igt_output_get_plane takes an index, igt_output_get_plane_type takes >> those definitions. >> I've been bit a few times by that as well. :) > yeah, you're absolutely right. Should have read more carefully :) > > You can bash my r-b. > > Reviewed-by: Mika Kahola <mika.kahola@intel.com> Thanks for review, pushed.
diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c index 36a6a8ef042b..8dbacf67b0a0 100644 --- a/tests/kms_plane_scaling.c +++ b/tests/kms_plane_scaling.c @@ -38,10 +38,12 @@ typedef struct { int image_w; int image_h; - struct igt_fb fb[3]; + struct igt_fb fb[4]; + igt_plane_t *plane1; igt_plane_t *plane2; igt_plane_t *plane3; + igt_plane_t *plane4; } data_t; static int get_num_scalers(uint32_t devid, enum pipe pipe) @@ -456,6 +458,92 @@ test_scaler_with_clipping_clamping_scenario(data_t *d, enum pipe pipe, igt_outpu igt_display_commit2(&d->display, COMMIT_ATOMIC); } +static void find_connected_pipe(igt_display_t *display, bool second, enum pipe *pipe, igt_output_t **output) +{ + enum pipe first = PIPE_NONE; + igt_output_t *first_output = NULL; + bool found = false; + + for_each_pipe_with_valid_output(display, *pipe, *output) { + if (first == *pipe || *output == first_output) + continue; + + if (second) { + first = *pipe; + first_output = *output; + second = false; + continue; + } + + return; + } + + if (first_output) + igt_require_f(found, "No second valid output found\n"); + else + igt_require_f(found, "No valid outputs found\n"); +} + +static void test_scaler_with_multi_pipe_plane(data_t *d) +{ + igt_display_t *display = &d->display; + igt_output_t *output1, *output2; + drmModeModeInfo *mode1, *mode2; + enum pipe pipe1, pipe2; + + cleanup_crtc(d); + + find_connected_pipe(display, false, &pipe1, &output1); + find_connected_pipe(display, true, &pipe2, &output2); + + igt_skip_on(!output1 || !output2); + + igt_output_set_pipe(output1, pipe1); + igt_output_set_pipe(output2, pipe2); + + d->plane1 = igt_output_get_plane(output1, 0); + d->plane2 = get_num_scalers(d->devid, pipe1) >= 2 ? igt_output_get_plane(output1, 1) : NULL; + d->plane3 = igt_output_get_plane(output2, 0); + d->plane4 = get_num_scalers(d->devid, pipe2) >= 2 ? igt_output_get_plane(output2, 1) : NULL; + + mode1 = igt_output_get_mode(output1); + mode2 = igt_output_get_mode(output2); + + igt_create_pattern_fb(d->drm_fd, 600, 600, + DRM_FORMAT_XRGB8888, + LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb[0]); + + igt_create_pattern_fb(d->drm_fd, 500, 500, + DRM_FORMAT_XRGB8888, + LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb[1]); + + igt_create_pattern_fb(d->drm_fd, 700, 700, + DRM_FORMAT_XRGB8888, + LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb[2]); + + igt_create_pattern_fb(d->drm_fd, 400, 400, + DRM_FORMAT_XRGB8888, + LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb[3]); + + igt_plane_set_fb(d->plane1, &d->fb[0]); + if (d->plane2) + igt_plane_set_fb(d->plane2, &d->fb[1]); + igt_plane_set_fb(d->plane3, &d->fb[2]); + if (d->plane4) + igt_plane_set_fb(d->plane4, &d->fb[3]); + igt_display_commit2(display, COMMIT_ATOMIC); + + /* Upscaling Primary */ + igt_plane_set_size(d->plane1, mode1->hdisplay, mode1->vdisplay); + igt_plane_set_size(d->plane3, mode2->hdisplay, mode2->vdisplay); + igt_display_commit2(display, COMMIT_ATOMIC); + + /* Upscaling Sprites */ + igt_plane_set_size(d->plane2 ?: d->plane1, mode1->hdisplay, mode1->vdisplay); + igt_plane_set_size(d->plane4 ?: d->plane3, mode2->hdisplay, mode2->vdisplay); + igt_display_commit2(display, COMMIT_ATOMIC); +} + igt_main { data_t data = {}; @@ -497,6 +585,9 @@ igt_main test_scaler_with_clipping_clamping_scenario(&data, pipe, output); } + igt_subtest_f("2x-scaler-multi-pipe") + test_scaler_with_multi_pipe_plane(&data); + igt_fixture igt_display_fini(&data.display); }