From: Tvrtko Ursulin <tursulin@ursulin.net>
To: Intel-gfx@lists.freedesktop.org
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: [PATCH i-g-t v4] kms_rotation_crc: 90 degree flip test is not a stress test
Date: Mon, 11 Sep 2017 18:14:57 +0100 [thread overview]
Message-ID: <20170911171457.7660-1-tvrtko.ursulin@linux.intel.com> (raw)
In-Reply-To: <d5031d5a-bae8-f963-3eff-1f9222c9f8ed@linux.intel.com>
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
To the best of my recollection the page flipping test was added
simply to start exercising page flips with 90/270 rotation.
There is no need to do 60 flips which can take quite some time,
because we do 60 flips against each pipe and each fb geometry.
Also, calling this a stress test is also not matching the
original idea of the test.
v2:
Several changes:
1. Remove the stress from the name and reduce the number of
flips to one only.
2. Move the page flip before CRC collection for a more useful
test.
3. Add more flipping tests, for different rotation and sprite
planes.
4. Convert to table driven subtest generation.
v3: Remove extended.testlist from the patch.
v4:
Collect a flip fb crc and check it after flip. This way we test
not only the flip succeeded but the right image is displayed.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Katarzyna Dec <katarzyna.dec@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> (v3)
---
tests/kms_rotation_crc.c | 194 +++++++++++++++++++++++++++++------------------
1 file changed, 122 insertions(+), 72 deletions(-)
diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
index 83e37f126f40..21e264addc09 100644
--- a/tests/kms_rotation_crc.c
+++ b/tests/kms_rotation_crc.c
@@ -35,13 +35,14 @@ typedef struct {
struct igt_fb fb_modeset;
struct igt_fb fb_flip;
igt_crc_t ref_crc;
+ igt_crc_t flip_crc;
igt_pipe_crc_t *pipe_crc;
igt_rotation_t rotation;
int pos_x;
int pos_y;
uint32_t override_fmt;
uint64_t override_tiling;
- unsigned int flip_stress;
+ bool flips;
} data_t;
static void
@@ -163,6 +164,7 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
unsigned int w, h, ref_w, ref_h, min_w, min_h;
uint64_t tiling = data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE;
uint32_t pixel_format = data->override_fmt ?: DRM_FORMAT_XRGB8888;
+ const float flip_opacity = 0.75;
if (data->fb.fb_id) {
igt_plane_set_fb(plane, NULL);
@@ -219,12 +221,28 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling, &data->fb);
- if (data->flip_stress) {
- igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling, &data->fb_flip);
- paint_squares(data, IGT_ROTATION_0, &data->fb_flip, 0.92);
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+
+ /*
+ * Create a reference software rotated flip framebuffer.
+ */
+ if (data->flips) {
+ 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,
+ display->is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+ igt_pipe_crc_collect_crc(data->pipe_crc, &data->flip_crc);
}
- /* Step 1: create a reference CRC for a software-rotated fb */
+ /*
+ * 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);
@@ -232,20 +250,30 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
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_plane_set_rotation(plane, IGT_ROTATION_0);
igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc);
/*
- * Step 2: prepare the plane with an non-rotated fb let the hw
- * rotate it.
+ * Prepare the plane with an non-rotated fb let the hw rotate it.
*/
paint_squares(data, IGT_ROTATION_0, &data->fb, 1.0);
igt_plane_set_fb(plane, &data->fb);
if (plane->type != DRM_PLANE_TYPE_CURSOR)
igt_plane_set_position(plane, data->pos_x, data->pos_y);
+
+ /*
+ * Prepare the non-rotated flip fb.
+ */
+ if (data->flips) {
+ 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);
+ }
+
}
static void cleanup_crtc(data_t *data, igt_output_t *output, igt_plane_t *plane)
@@ -300,9 +328,8 @@ static void test_plane_rotation(data_t *data, int plane_type)
igt_output_t *output;
enum pipe pipe;
int valid_tests = 0;
- igt_crc_t crc_output, crc_unrotated;
+ igt_crc_t crc_output;
enum igt_commit_style commit = COMMIT_LEGACY;
- unsigned int flip_count;
int ret;
if (plane_type == DRM_PLANE_TYPE_PRIMARY || plane_type == DRM_PLANE_TYPE_CURSOR)
@@ -341,9 +368,6 @@ static void test_plane_rotation(data_t *data, int plane_type)
igt_display_commit2(display, commit);
- /* collect unrotated CRC */
- igt_pipe_crc_collect_crc(data->pipe_crc, &crc_unrotated);
-
igt_plane_set_rotation(plane, data->rotation);
if (data->rotation == IGT_ROTATION_90 || data->rotation == IGT_ROTATION_270)
igt_plane_set_size(plane, data->fb.height, data->fb.width);
@@ -351,16 +375,21 @@ static void test_plane_rotation(data_t *data, int plane_type)
ret = igt_display_try_commit2(display, commit);
if (data->override_fmt || data->override_tiling) {
igt_assert_eq(ret, -EINVAL);
- } else {
- igt_assert_eq(ret, 0);
- igt_pipe_crc_collect_crc(data->pipe_crc,
- &crc_output);
- igt_assert_crc_equal(&data->ref_crc,
- &crc_output);
+ continue;
}
- flip_count = data->flip_stress;
- while (flip_count--) {
+ /* Verify commit was ok. */
+ igt_assert_eq(ret, 0);
+
+ /* Check CRC */
+ igt_pipe_crc_collect_crc(data->pipe_crc, &crc_output);
+ igt_assert_crc_equal(&data->ref_crc, &crc_output);
+
+ /*
+ * If flips are requested flip to a different fb and
+ * check CRC against that one as well.
+ */
+ if (data->flips) {
ret = drmModePageFlip(data->gfx_fd,
output->config.crtc->crtc_id,
data->fb_flip.fb_id,
@@ -368,13 +397,10 @@ static void test_plane_rotation(data_t *data, int plane_type)
NULL);
igt_assert_eq(ret, 0);
wait_for_pageflip(data->gfx_fd);
- ret = drmModePageFlip(data->gfx_fd,
- output->config.crtc->crtc_id,
- data->fb.fb_id,
- DRM_MODE_PAGE_FLIP_EVENT,
- NULL);
- igt_assert_eq(ret, 0);
- wait_for_pageflip(data->gfx_fd);
+ igt_pipe_crc_collect_crc(data->pipe_crc,
+ &crc_output);
+ igt_assert_crc_equal(&data->flip_crc,
+ &crc_output);
}
}
@@ -569,8 +595,64 @@ err_commit:
igt_assert_eq(ret, 0);
}
+static const char *plane_test_str(unsigned plane)
+{
+ switch (plane) {
+ case DRM_PLANE_TYPE_PRIMARY:
+ return "primary";
+ case DRM_PLANE_TYPE_OVERLAY:
+ return "sprite";
+ case DRM_PLANE_TYPE_CURSOR:
+ return "cursor";
+ default:
+ igt_assert(0);
+ }
+}
+
+static const char *rot_test_str(igt_rotation_t rot)
+{
+ switch (rot) {
+ case IGT_ROTATION_90:
+ return "90";
+ case IGT_ROTATION_180:
+ return "180";
+ case IGT_ROTATION_270:
+ return "270";
+ default:
+ igt_assert(0);
+ }
+}
+
+static const char *flip_test_str(unsigned flips)
+{
+ if (flips)
+ return "-flip";
+ else
+ return "";
+}
+
igt_main
{
+ struct rot_subtest {
+ unsigned plane;
+ igt_rotation_t rot;
+ unsigned flips;
+ } *subtest, subtests[] = {
+ { DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_90, 0 },
+ { DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_180, 0 },
+ { DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_270, 0 },
+ { DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_90, 1 },
+ { DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_180, 1 },
+ { DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_270, 1 },
+ { DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_90, 0 },
+ { DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_180, 0 },
+ { DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_270, 0 },
+ { DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_90, 1 },
+ { DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_180, 1 },
+ { DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_270, 1 },
+ { DRM_PLANE_TYPE_CURSOR, IGT_ROTATION_180, 0 },
+ { 0, 0, 0}
+ };
data_t data = {};
int gen = 0;
@@ -586,43 +668,19 @@ igt_main
igt_display_init(&data.display, data.gfx_fd);
}
- igt_subtest_f("primary-rotation-180") {
- data.rotation = IGT_ROTATION_180;
- test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY);
- }
-
- igt_subtest_f("sprite-rotation-180") {
- data.rotation = IGT_ROTATION_180;
- test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY);
- }
-
- igt_subtest_f("cursor-rotation-180") {
- data.rotation = IGT_ROTATION_180;
- test_plane_rotation(&data, DRM_PLANE_TYPE_CURSOR);
- }
-
- igt_subtest_f("primary-rotation-90") {
- igt_require(gen >= 9);
- data.rotation = IGT_ROTATION_90;
- test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY);
- }
- igt_subtest_f("primary-rotation-270") {
- igt_require(gen >= 9);
- data.rotation = IGT_ROTATION_270;
- test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY);
- }
-
- igt_subtest_f("sprite-rotation-90") {
- igt_require(gen >= 9);
- data.rotation = IGT_ROTATION_90;
- test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY);
- }
-
- igt_subtest_f("sprite-rotation-270") {
- igt_require(gen >= 9);
- data.rotation = IGT_ROTATION_270;
- test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY);
+ for (subtest = subtests; subtest->rot; subtest++) {
+ igt_subtest_f("%s-rotation-%s%s",
+ plane_test_str(subtest->plane),
+ rot_test_str(subtest->rot),
+ flip_test_str(subtest->flips)) {
+ igt_require(!(subtest->rot &
+ (IGT_ROTATION_90 | IGT_ROTATION_270)) ||
+ gen >= 9);
+ data.rotation = subtest->rot;
+ data.flips = subtest->flips;
+ test_plane_rotation(&data, subtest->plane);
+ }
}
igt_subtest_f("sprite-rotation-90-pos-100-0") {
@@ -650,14 +708,6 @@ igt_main
test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY);
}
- igt_subtest_f("primary-rotation-90-flip-stress") {
- igt_require(gen >= 9);
- data.override_tiling = 0;
- data.flip_stress = 60;
- data.rotation = IGT_ROTATION_90;
- test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY);
- }
-
igt_subtest_f("primary-rotation-90-Y-tiled") {
enum pipe pipe;
igt_output_t *output;
--
2.9.5
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2017-09-11 17:15 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-08 11:10 [PATCH i-g-t v2] kms_rotation_crc: 90 degree flip test is not a stress test Tvrtko Ursulin
2017-09-08 11:24 ` [PATCH i-g-t v3] " Tvrtko Ursulin
2017-09-08 14:06 ` Chris Wilson
2017-09-08 14:54 ` Tvrtko Ursulin
2017-09-08 16:05 ` Chris Wilson
2017-09-11 17:14 ` Tvrtko Ursulin [this message]
2017-09-12 8:49 ` [PATCH i-g-t v4] " Katarzyna Dec
2017-09-08 11:45 ` ✓ Fi.CI.BAT: success for kms_rotation_crc: 90 degree flip test is not a stress test (rev4) Patchwork
2017-09-08 13:58 ` ✗ Fi.CI.IGT: failure " Patchwork
2017-09-11 17:54 ` ✓ Fi.CI.BAT: success for kms_rotation_crc: 90 degree flip test is not a stress test (rev5) Patchwork
2017-09-11 21:59 ` ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170911171457.7660-1-tvrtko.ursulin@linux.intel.com \
--to=tursulin@ursulin.net \
--cc=Intel-gfx@lists.freedesktop.org \
--cc=daniel.vetter@ffwll.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox