> - primary plane set_plane calls vs. legacy setcrtc primary plane updates. > We'll very likely have mixed userspace (e.g. boot splash vs. display > manager). E.g. disable primary plane (but keep everything working), then > setCrtc a new plane framebuffer. [Sun, Yi] Did you mean we can mix using the two APIs drmModeSetPlane and drmModeSetCrtc for testing primary plane? Another idea here: is it helpful if we lighten on display on each available pipe respectively?
Thanks --Sun, Yi > > - primary plane vs. other ioctls. Might be easier to extend existing tests > for this. E.g. doing a pageflip ioctl if the primary plane is off > (might need to decide what we really want to do and if we decide that it > should enable the primary plane then we need a CRC based test to make > sure that the transition is perfect). > > Or primary plane changes vs. dpms and suspend/resume. For those > functional checks based on CRC would be good to make sure we properly > restore everything. > [Sun, Yi] That is good idea. But do you know how to make display power saving with dpms and come back? > - Maybe exercise some of the checks in the primary plane helper to make > sure they work. In the future we'll probably lift those limitations (not > on current hw afaik though), but then we can adjust those tests to skip > on these platforms. > > - Anything else that was pointed out in review or was tricky while > developing this stuff. > > Cheers, Daniel > > --- > > tests/Makefile.sources | 1 + > > tests/kms_universal_plane.c | 211 > > ++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 212 insertions(+) > > create mode 100644 tests/kms_universal_plane.c > > > > diff --git a/tests/Makefile.sources b/tests/Makefile.sources index > > bf02a48..4911914 100644 > > --- a/tests/Makefile.sources > > +++ b/tests/Makefile.sources > > @@ -63,6 +63,7 @@ TESTS_progs_M = \ > > kms_plane \ > > kms_render \ > > kms_setmode \ > > + kms_universal_plane \ > > pm_lpsp \ > > pm_pc8 \ > > pm_rps \ > > diff --git a/tests/kms_universal_plane.c b/tests/kms_universal_plane.c > > new file mode 100644 index 0000000..f1ec6fb > > --- /dev/null > > +++ b/tests/kms_universal_plane.c > > @@ -0,0 +1,211 @@ > > +/* > > + * Copyright (c) 2014 Intel Corporation > > + * > > + * Permission is hereby granted, free of charge, to any person > > +obtaining a > > + * copy of this software and associated documentation files (the > > +"Software"), > > + * to deal in the Software without restriction, including without > > +limitation > > + * the rights to use, copy, modify, merge, publish, distribute, > > +sublicense, > > + * and/or sell copies of the Software, and to permit persons to whom > > +the > > + * Software is furnished to do so, subject to the following conditions: > > + * > > + * The above copyright notice and this permission notice (including > > +the next > > + * paragraph) shall be included in all copies or substantial portions > > +of the > > + * Software. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY > KIND, > > +EXPRESS OR > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > > +MERCHANTABILITY, > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO > EVENT > > +SHALL > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, > DAMAGES > > +OR OTHER > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR > OTHERWISE, > > +ARISING > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE > OR > > +OTHER DEALINGS > > + * IN THE SOFTWARE. > > + */ > > + > > +#include <errno.h> > > +#include <stdbool.h> > > +#include <stdio.h> > > +#include <string.h> > > + > > +#include "drmtest.h" > > +#include "igt_debugfs.h" > > +#include "igt_kms.h" > > + > > +typedef struct { > > + int drm_fd; > > + igt_display_t display; > > +} data_t; > > + > > +/* > > + * Universal plane testing. > > + * - Black primary plane via traditional interfaces, red sprite, grab > > CRC:1. > > + * - Blue primary plane via traditional interfaces, red sprite, grab > > CRC:2. > > + * - Yellow primary via traditional interfaces > > + * - Blue primary plane, red sprite via universal planes, grab CRC:3 and > compare > > + * with CRC:2 (should be the same) > > + * - Disable primary plane, grab CRC:4 (should be same as CRC:1) > > + * - Reenable primary, grab CRC:5 (should be same as CRC:2 and CRC:3) > > + */ > > + > > +typedef struct { > > + data_t *data; > > + igt_pipe_crc_t *pipe_crc; > > + igt_crc_t crc_1, crc_2, crc_3, crc_4, crc_5; > > + struct igt_fb red_fb, blue_fb, black_fb, yellow_fb; } test_t; > > + > > +static void > > +test_init(test_t *test, igt_output_t *output, enum pipe pipe) { > > + data_t *data = test->data; > > + drmModeModeInfo *mode; > > + > > + test->pipe_crc = igt_pipe_crc_new(pipe, > INTEL_PIPE_CRC_SOURCE_AUTO); > > + > > + igt_output_set_pipe(output, pipe); > > + > > + mode = igt_output_get_mode(output); > > + igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay, > > + DRM_FORMAT_XRGB8888, > > + false, /* tiled */ > > + 0.0, 0.0, 0.0, > > + &test->black_fb); > > + igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay, > > + DRM_FORMAT_XRGB8888, > > + false, /* tiled */ > > + 0.0, 0.0, 1.0, > > + &test->blue_fb); > > + igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay, > > + DRM_FORMAT_XRGB8888, > > + false, /* tiled */ > > + 1.0, 1.0, 0.0, > > + &test->yellow_fb); > > + igt_create_color_fb(data->drm_fd, 100, 100, > > + DRM_FORMAT_XRGB8888, > > + false, /* tiled */ > > + 1.0, 0.0, 0.0, > > + &test->red_fb); > > +} > > + > > +static void > > +test_fini(test_t *test, igt_output_t *output) { > > + igt_pipe_crc_free(test->pipe_crc); > > + > > + igt_remove_fb(test->data->drm_fd, &test->black_fb); > > + igt_remove_fb(test->data->drm_fd, &test->blue_fb); > > + igt_remove_fb(test->data->drm_fd, &test->red_fb); > > + igt_remove_fb(test->data->drm_fd, &test->yellow_fb); > > + > > + igt_display_use_universal_commits(&test->data->display, false); > > + igt_output_set_pipe(output, PIPE_ANY); > > + igt_display_commit(&test->data->display); > > +} > > + > > +static void > > +test_pipe(data_t *data, enum pipe pipe, igt_output_t *output) { > > + test_t test = { .data = data }; > > + igt_plane_t *primary, *sprite; > > + > > + igt_skip_on(pipe >= data->display.n_pipes); > > + > > + fprintf(stdout, "Testing connector %s using pipe %c\n", > > + igt_output_name(output), pipe_name(pipe)); > > + > > + test_init(&test, output, pipe); > > + > > + primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY); > > + sprite = igt_output_get_plane(output, IGT_PLANE_2); > > + if (!sprite) { > > + test_fini(&test, output); > > + igt_skip("No sprite plane available\n"); > > + } > > + > > + igt_plane_set_position(sprite, 100, 100); > > + > > + /* Step 1: Legacy API's, black primary, red sprite (CRC 1) */ > > + igt_plane_set_fb(primary, &test.black_fb); > > + igt_plane_set_fb(sprite, &test.red_fb); > > + igt_display_commit(&data->display); > > + igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_1); > > + > > + /* Step 2: Legacy API', blue primary, red sprite (CRC 2) */ > > + igt_plane_set_fb(primary, &test.blue_fb); > > + igt_plane_set_fb(sprite, &test.red_fb); > > + igt_display_commit(&data->display); > > + igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_2); > > + > > + /* Step 3: Legacy API's, yellow primary */ > > + igt_plane_set_fb(primary, &test.yellow_fb); > > + igt_display_commit(&data->display); > > + > > + /* Step 4: Universal API's, blue primary, red sprite (CRC 3) */ > > + igt_display_use_universal_commits(&test.data->display, true); > > + igt_plane_set_fb(primary, &test.blue_fb); > > + igt_plane_set_fb(sprite, &test.red_fb); > > + igt_display_commit(&data->display); > > + igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_3); > > + > > + /* Step 5: Universal API's, disable primary plane (CRC 4) */ > > + igt_plane_set_fb(primary, NULL); > > + igt_display_commit(&data->display); > > + igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_4); > > + > > + /* Step 6: Universal API's, re-enable primary with blue (CRC 5) */ > > + igt_display_use_universal_commits(&test.data->display, true); > > + igt_plane_set_fb(primary, &test.blue_fb); > > + igt_display_commit(&data->display); > > + igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_5); > > + > > + /* Blue bg + red sprite should be same under both types of API's */ > > + igt_assert(igt_crc_equal(&test.crc_2, &test.crc_3)); > > + > > + /* Disabling primary plane should be same as black primary */ > > + igt_assert(igt_crc_equal(&test.crc_1, &test.crc_4)); > > + > > + /* Re-enabling primary should return to blue properly */ > > + igt_assert(igt_crc_equal(&test.crc_2, &test.crc_5)); > > + > > + igt_plane_set_fb(primary, NULL); > > + igt_plane_set_fb(sprite, NULL); > > + > > + test_fini(&test, output); > > +} > > + > > +static void > > +run_tests_for_pipe(data_t *data, enum pipe pipe) { > > + igt_output_t *output; > > + > > + igt_assert(data->display.has_universal_planes); > > + > > + igt_subtest_f("universal-plane-pipe-%c", pipe_name(pipe)) > > + for_each_connected_output(&data->display, output) > > + test_pipe(data, pipe, output); > > +} > > + > > +static data_t data; > > + > > +igt_main > > +{ > > + > > + igt_skip_on_simulation(); > > + > > + igt_fixture { > > + data.drm_fd = drm_open_any(); > > + > > + igt_set_vt_graphics_mode(); > > + > > + igt_require_pipe_crc(); > > + igt_display_init(&data.display, data.drm_fd); > > + > > + igt_require(data.display.has_universal_planes); > > + } > > + > > + for (int pipe = 0; pipe < 3; pipe++) > > + run_tests_for_pipe(&data, pipe); > > + > > + igt_fixture { > > + igt_display_fini(&data.display); > > + } > > +} > > -- > > 1.8.5.1 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- > Daniel Vetter > Software Engineer, Intel Corporation > +41 (0) 79 365 57 48 - http://blog.ffwll.ch > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx