[Intel-gfx] [PATCH i-g-t 3/3] kms_universal_plane: nastiness
Sun, Yi
yi.sun at intel.com
Wed Apr 16 08:36:18 CEST 2014
> - 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 at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list