* [igt-dev] [PATCH i-g-t 1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc.
@ 2018-07-24 13:59 Maarten Lankhorst
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current() Maarten Lankhorst
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Maarten Lankhorst @ 2018-07-24 13:59 UTC (permalink / raw)
To: igt-dev
A pair of igt_pipe_crc_drain() and igt_pipe_crc_get_single() has a bug in which
you're not sure whether the new CRC is captured because the vblank irq may race
against the CRC irq and delivered to userspace too soon.
When receiving a vblank event, igt_pipe_crc_drain() will then drain all crc's,
but not the new (stale) crc, which is then delivered and immediately returned
by igt_pipe_crc_get_single().
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
lib/igt_debugfs.c | 32 +++++++++++++++++++++++++++++++-
lib/igt_debugfs.h | 2 ++
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index f3196f4341f3..dc2c7df9da30 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -910,7 +910,7 @@ void igt_pipe_crc_drain(igt_pipe_crc_t *pipe_crc)
* look at igt_pipe_crc_collect_crc().
*
* If capturing has been going on for a while and a fresh crc is required,
- * you will need to call igt_pipe_crc_drain() first to remove stale entries.
+ * you should use igt_pipe_crc_get_current() instead.
*
* Returns:
* Whether a crc is captured, only false in non-blocking mode.
@@ -933,6 +933,36 @@ igt_pipe_crc_get_single(igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
return found;
}
+/**
+ * igt_pipe_crc_get_current:
+ * @drm_fd: Pointer to drm fd for vblank counter
+ * @pipe_crc: pipe CRC object
+ * @crc: buffer pointer for the captured CRC value
+ *
+ * Same as igt_pipe_crc_get_single(), but will wait until a new CRC can be captured.
+ * This is useful for retrieving the current CRC in a more race free way than
+ * igt_pipe_crc_drain() + igt_pipe_crc_get_single().
+ */
+void
+igt_pipe_crc_get_current(int drm_fd, igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
+{
+ unsigned vblank = kmstest_get_vblank(drm_fd, pipe_crc->pipe, 0);
+
+ igt_assert(!(pipe_crc->flags & O_NONBLOCK));
+ do {
+ read_one_crc(pipe_crc, crc);
+
+ /* Only works with valid frame counter */
+ if (!crc->has_valid_frame) {
+ igt_pipe_crc_drain(pipe_crc);
+ igt_pipe_crc_get_single(pipe_crc, crc);
+ return;
+ }
+ } while (crc->frame <= vblank);
+
+ crc_sanity_checks(crc);
+}
+
/*
* Drop caches
*/
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index 8d25abfe43c1..db634a827290 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -132,6 +132,8 @@ int igt_pipe_crc_get_crcs(igt_pipe_crc_t *pipe_crc, int n_crcs,
igt_crc_t **out_crcs);
void igt_pipe_crc_drain(igt_pipe_crc_t *pipe_crc);
bool igt_pipe_crc_get_single(igt_pipe_crc_t *pipe_crc, igt_crc_t *out_crc);
+void igt_pipe_crc_get_current(int drm_fd, igt_pipe_crc_t *pipe_crc, igt_crc_t *crc);
+
void igt_pipe_crc_collect_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out_crc);
void igt_hpd_storm_set_threshold(int fd, unsigned int threshold);
--
2.18.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current()
2018-07-24 13:59 [igt-dev] [PATCH i-g-t 1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Maarten Lankhorst
@ 2018-07-24 13:59 ` Maarten Lankhorst
2018-08-14 15:18 ` Daniel Vetter
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests Maarten Lankhorst
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Maarten Lankhorst @ 2018-07-24 13:59 UTC (permalink / raw)
To: igt-dev
This is a more race free of accomplishing the same.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
tests/kms_available_modes_crc.c | 3 +--
tests/kms_cursor_legacy.c | 3 +--
tests/kms_plane.c | 6 +-----
tests/kms_plane_lowres.c | 6 ++----
tests/kms_plane_multiple.c | 3 +--
tests/kms_rotation_crc.c | 13 +++++--------
6 files changed, 11 insertions(+), 23 deletions(-)
diff --git a/tests/kms_available_modes_crc.c b/tests/kms_available_modes_crc.c
index b70ef5d7d4c0..69a6a37d8ebd 100644
--- a/tests/kms_available_modes_crc.c
+++ b/tests/kms_available_modes_crc.c
@@ -400,8 +400,7 @@ test_one_mode(data_t* data, igt_output_t *output, igt_plane_t* plane,
igt_display_commit2(&data->display, data->commit);
if (do_crc) {
- igt_pipe_crc_drain(data->pipe_crc);
- igt_pipe_crc_get_single(data->pipe_crc, ¤t_crc);
+ igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, ¤t_crc);
if (plane->type != DRM_PLANE_TYPE_CURSOR) {
if (!igt_check_crc_equal(¤t_crc,
diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
index 85340d43e5b6..82ceebcb0809 100644
--- a/tests/kms_cursor_legacy.c
+++ b/tests/kms_cursor_legacy.c
@@ -1334,8 +1334,7 @@ static void flip_vs_cursor_busy_crc(igt_display_t *display, bool atomic)
igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
- igt_pipe_crc_drain(pipe_crc);
- igt_pipe_crc_get_single(pipe_crc, &test_crc);
+ igt_pipe_crc_get_current(display->drm_fd, pipe_crc, &test_crc);
igt_spin_batch_free(display->drm_fd, spin);
diff --git a/tests/kms_plane.c b/tests/kms_plane.c
index f9e123f0d1ea..3999dde8f694 100644
--- a/tests/kms_plane.c
+++ b/tests/kms_plane.c
@@ -419,11 +419,7 @@ static void test_format_plane_color(data_t *data, enum pipe pipe,
igt_plane_set_fb(plane, fb);
igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
-
- /* make sure the crc we get is for the new fb */
- igt_wait_for_vblank(data->drm_fd, pipe);
- igt_pipe_crc_drain(data->pipe_crc);
- igt_pipe_crc_get_single(data->pipe_crc, crc);
+ igt_pipe_crc_get_current(data->display.drm_fd, data->pipe_crc, crc);
igt_remove_fb(data->drm_fd, &old_fb);
}
diff --git a/tests/kms_plane_lowres.c b/tests/kms_plane_lowres.c
index d1e4b3ca536e..5e83ef5630b5 100644
--- a/tests/kms_plane_lowres.c
+++ b/tests/kms_plane_lowres.c
@@ -221,8 +221,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
check_mode(&mode_lowres, mode2);
igt_display_commit2(&data->display, COMMIT_ATOMIC);
- igt_pipe_crc_drain(pipe_crc);
- igt_pipe_crc_get_single(pipe_crc, &crc_lowres);
+ igt_pipe_crc_get_current(data->display.drm_fd, pipe_crc, &crc_lowres);
igt_assert_plane_visible(data->drm_fd, pipe, false);
@@ -236,8 +235,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
igt_display_commit2(&data->display, COMMIT_ATOMIC);
- igt_pipe_crc_drain(pipe_crc);
- igt_pipe_crc_get_single(pipe_crc, &crc_hires2);
+ igt_pipe_crc_get_current(data->display.drm_fd, pipe_crc, &crc_hires2);
igt_assert_plane_visible(data->drm_fd, pipe, true);
diff --git a/tests/kms_plane_multiple.c b/tests/kms_plane_multiple.c
index e61bc84624b3..a53be00141f0 100644
--- a/tests/kms_plane_multiple.c
+++ b/tests/kms_plane_multiple.c
@@ -276,8 +276,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
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_get_current(data->display.drm_fd, data->pipe_crc, &crc);
igt_assert_crc_equal(&data->ref_crc, &crc);
diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
index 6cb5858adb0f..b994cc5d24fe 100644
--- a/tests/kms_rotation_crc.c
+++ b/tests/kms_rotation_crc.c
@@ -235,8 +235,8 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
if (plane->type != DRM_PLANE_TYPE_CURSOR)
igt_plane_set_position(plane, data->pos_x, data->pos_y);
igt_display_commit2(display, COMMIT_ATOMIC);
- igt_pipe_crc_drain(data->pipe_crc);
- igt_pipe_crc_get_single(data->pipe_crc, &data->flip_crc);
+
+ igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);
/*
* Prepare the non-rotated flip fb.
@@ -259,8 +259,7 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
igt_plane_set_position(plane, data->pos_x, data->pos_y);
igt_display_commit2(display, COMMIT_ATOMIC);
- igt_pipe_crc_drain(data->pipe_crc);
- igt_pipe_crc_get_single(data->pipe_crc, &data->ref_crc);
+ igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);
/*
* Prepare the non-rotated reference fb.
@@ -310,8 +309,7 @@ static void test_single_case(data_t *data, enum pipe pipe,
igt_assert_eq(ret, 0);
/* Check CRC */
- igt_pipe_crc_drain(data->pipe_crc);
- igt_pipe_crc_get_single(data->pipe_crc, &crc_output);
+ igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
igt_assert_crc_equal(&data->ref_crc, &crc_output);
/*
@@ -334,8 +332,7 @@ static void test_single_case(data_t *data, enum pipe pipe,
igt_assert_eq(ret, 0);
}
kmstest_wait_for_pageflip(data->gfx_fd);
- igt_pipe_crc_drain(data->pipe_crc);
- igt_pipe_crc_get_single(data->pipe_crc, &crc_output);
+ igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
igt_assert_crc_equal(&data->flip_crc,
&crc_output);
}
--
2.18.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests.
2018-07-24 13:59 [igt-dev] [PATCH i-g-t 1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Maarten Lankhorst
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current() Maarten Lankhorst
@ 2018-07-24 13:59 ` Maarten Lankhorst
2018-07-26 6:55 ` Petri Latvala
2018-07-24 15:17 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Patchwork
2018-07-24 18:21 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
3 siblings, 1 reply; 9+ messages in thread
From: Maarten Lankhorst @ 2018-07-24 13:59 UTC (permalink / raw)
To: igt-dev
Add tests excercising switching between various scaled/unscaled
transitions to and from NV12, since some of the workarounds mention
this may fail.
We also add NV12 specific clipping/scaling tests, to make sure
that NV12 src coordinates are always programmed as a multiple of 4
correctly, and verify scaling/clipping works with CRC tests.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
tests/Makefile.sources | 1 +
tests/kms_nv12.c | 743 +++++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 745 insertions(+)
create mode 100644 tests/kms_nv12.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index c84933f1d971..dab9260f584d 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -190,6 +190,7 @@ TESTS_progs = \
kms_invalid_dotclock \
kms_legacy_colorkey \
kms_mmap_write_crc \
+ kms_nv12 \
kms_panel_fitting \
kms_pipe_b_c_ivb \
kms_pipe_crc_basic \
diff --git a/tests/kms_nv12.c b/tests/kms_nv12.c
new file mode 100644
index 000000000000..05ae83e53dda
--- /dev/null
+++ b/tests/kms_nv12.c
@@ -0,0 +1,743 @@
+/*
+ * 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 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.
+ *
+ * Authors:
+ * Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
+ */
+#include "config.h"
+
+#include "igt.h"
+#include <cairo.h>
+#include <errno.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+typedef struct {
+ igt_display_t display;
+
+ igt_pipe_crc_t *pipe_crc;
+ struct igt_fb fb[4];
+} data_t;
+
+static bool plane_supports_format(igt_plane_t *plane, uint32_t format)
+{
+ int i;
+
+ if (!igt_fb_supported_format(format))
+ return false;
+
+ for (i = 0; i < plane->drm_plane->count_formats; i++)
+ if (plane->drm_plane->formats[i] == format)
+ return true;
+
+ return false;
+}
+
+static bool pipe_supports_format(igt_display_t *display, enum pipe pipe, uint32_t format)
+{
+ igt_plane_t *plane;
+
+ for_each_plane_on_pipe(display, pipe, plane)
+ if (plane_supports_format(plane, format))
+ return true;
+
+ return false;
+}
+
+static void remove_fbs(data_t *data)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(data->fb); i++)
+ igt_remove_fb(data->display.drm_fd, &data->fb[i]);
+}
+
+static void prepare_crtc(data_t *data, enum pipe pipe, igt_output_t *output)
+{
+ igt_display_t *display = &data->display;
+
+ remove_fbs(data);
+ igt_display_reset(display);
+ igt_output_set_pipe(output, pipe);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_free(data->pipe_crc);
+ data->pipe_crc = igt_pipe_crc_new(display->drm_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
+}
+
+static void set_fb(igt_plane_t *plane, struct igt_fb *fb, bool scaled)
+{
+ igt_plane_set_fb(plane, fb);
+
+ if (scaled && fb)
+ igt_fb_set_size(fb, plane, fb->width, 16);
+
+ if (fb && fb->tiling == LOCAL_I915_FORMAT_MOD_Y_TILED) {
+ igt_plane_set_rotation(plane, IGT_ROTATION_90);
+ igt_plane_set_size(plane, fb->height, fb->width);
+ } else
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+}
+
+static void nv12_rgb_switch(data_t *data, enum pipe pipe, igt_output_t *output, bool scaled, unsigned format)
+{
+ drmModeModeInfo *mode = igt_output_get_mode(output);
+ igt_display_t *display = &data->display;
+ igt_plane_t *plane;
+ int i;
+ igt_crc_t ref_crc[4], crc;
+
+ prepare_crtc(data, pipe, output);
+
+ igt_create_pattern_fb(display->drm_fd, mode->hdisplay, mode->vdisplay,
+ format, LOCAL_I915_FORMAT_MOD_X_TILED,
+ &data->fb[0]);
+
+ igt_create_pattern_fb(display->drm_fd, mode->vdisplay, mode->hdisplay,
+ format, LOCAL_I915_FORMAT_MOD_Y_TILED,
+ &data->fb[1]);
+
+ igt_create_pattern_fb(display->drm_fd, mode->hdisplay, mode->vdisplay,
+ DRM_FORMAT_XRGB8888, LOCAL_I915_FORMAT_MOD_X_TILED,
+ &data->fb[2]);
+
+ igt_create_pattern_fb(display->drm_fd, mode->vdisplay, mode->hdisplay,
+ DRM_FORMAT_XRGB8888, LOCAL_I915_FORMAT_MOD_Y_TILED,
+ &data->fb[3]);
+
+ for_each_plane_on_pipe(display, pipe, plane) {
+ if (!plane_supports_format(plane, DRM_FORMAT_XRGB8888))
+ continue;
+
+ /* We only have few scalers, don't use 1 for unused planes */
+ if (plane->type != DRM_PLANE_TYPE_CURSOR && !scaled)
+ set_fb(plane, &data->fb[3], false);
+ }
+
+ for_each_plane_on_pipe(display, pipe, plane) {
+ const int seq[] = {
+ 2, 0, 2, 1, 3, 1, 3
+ };
+
+ if (!plane_supports_format(plane, format))
+ continue;
+
+ /* Collect reference crc with toggle in between. */
+ for (i = 0; i < ARRAY_SIZE(ref_crc); i++) {
+ set_fb(plane, &data->fb[i], scaled);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_collect_crc(data->pipe_crc, &ref_crc[i]);
+
+ set_fb(plane, NULL, scaled);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(seq); i++) {
+ int j = seq[i];
+
+ set_fb(plane, &data->fb[j], scaled);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_collect_crc(data->pipe_crc, &crc);
+ igt_assert_crc_equal(&ref_crc[j], &crc);
+ }
+
+ /* We only have few scalers, don't use 1 for unused planes */
+ if (scaled)
+ igt_plane_set_fb(plane, NULL);
+ }
+}
+
+#define assert_collected_crc_equal(pipe_crc, crc, ref_crc, rotation) \
+ do { \
+ igt_pipe_crc_get_current(display->drm_fd, pipe_crc, crc); \
+ igt_warn_on_f(!igt_check_crc_equal(ref_crc, crc), "mismatch with %x rotation!\n", rotation); \
+ } while (0)
+
+static void set_src_coords(igt_plane_t *plane, struct igt_fb *fb,
+ igt_rotation_t rot, int vis, int hidden)
+{
+ switch (rot) {
+ case IGT_ROTATION_0:
+ igt_fb_set_position(fb, plane, fb->width / 2 - vis, fb->height / 2 - vis);
+ break;
+ case IGT_ROTATION_90:
+ igt_fb_set_position(fb, plane, fb->width / 2 - hidden, fb->height / 2 - vis);
+ break;
+ case IGT_ROTATION_180:
+ igt_fb_set_position(fb, plane, fb->width / 2 - hidden, fb->height / 2 - hidden);
+ break;
+ case IGT_ROTATION_270:
+ igt_fb_set_position(fb, plane, fb->width / 2 - vis, fb->height / 2 - hidden);
+ break;
+ default: igt_assert(0);
+ }
+ igt_fb_set_size(fb, plane, vis + hidden, vis + hidden);
+}
+
+static void nv12_valid_width_plane(data_t *data, drmModeModeInfo *mode,
+ igt_plane_t *plane, struct igt_fb *fb,
+ igt_rotation_t rot, igt_crc_t *ref_crc)
+{
+ igt_display_t *display = &data->display;
+ igt_crc_t crc;
+ struct igt_fb *clip_fb = &data->fb[2];
+ int i;
+
+ igt_plane_set_fb(plane, fb);
+ igt_plane_set_rotation(plane, rot);
+ if (rot & (IGT_ROTATION_90 | IGT_ROTATION_270))
+ igt_plane_set_size(plane, fb->height, fb->width);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+
+ /* Just clipping.. */
+ igt_plane_set_fb(plane, clip_fb);
+ if (rot & (IGT_ROTATION_90 | IGT_ROTATION_270))
+ igt_plane_set_size(plane, clip_fb->height, clip_fb->width);
+ igt_plane_set_position(plane, mode->hdisplay - clip_fb->width / 2, mode->vdisplay - clip_fb->height / 2);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rot);
+
+ /* Clipping and scaling. */
+ igt_fb_set_position(clip_fb, plane, clip_fb->width / 2 - 16, clip_fb->height / 2 - 16);
+ igt_fb_set_size(clip_fb, plane, 32, 32);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rot);
+
+ /* Invalid < 16 src visible. */
+ set_src_coords(plane, clip_fb, rot, 8, 8);
+ igt_assert_eq(igt_display_try_commit2(display, COMMIT_ATOMIC), -EINVAL);
+
+ /* Try different alignments for x/y to see if any hit underruns */
+ for (i = 1; i < 4; i++) {
+ set_src_coords(plane, clip_fb, rot, 16 + 2 * i, 16 - 2 * i);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rot);
+
+ /* And also show more of the screen */
+ set_src_coords(plane, clip_fb, rot, 16 + i, 16 + i);
+ if (rot == IGT_ROTATION_270 || rot == (IGT_ROTATION_90 | IGT_REFLECT_X)) {
+ igt_assert_eq(igt_display_try_commit2(display, COMMIT_ATOMIC), -EINVAL);
+ continue;
+ }
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rot);
+ }
+
+ /*
+ * As a final test, try with 16 src visible, and various invisible
+ * components to check clipping doesn't drop the visible src below 16.
+ */
+ for (i = 0; i < 16; i += 4) {
+ set_src_coords(plane, clip_fb, rot, 16, i);
+ if (rot & (IGT_ROTATION_90 | IGT_ROTATION_270))
+ igt_plane_set_size(plane, (clip_fb->height / 32) * (16 + i),
+ (clip_fb->width / 32) * (16 + i));
+ else
+ igt_plane_set_size(plane, (clip_fb->width / 32) * (16 + i),
+ (clip_fb->height / 32) * (16 + i));
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rot);
+ }
+}
+
+static void nv12_valid_width(data_t *data, enum pipe pipe, igt_output_t *output, unsigned format)
+{
+ drmModeModeInfo *mode = igt_output_get_mode(output);
+ igt_display_t *display = &data->display;
+ igt_plane_t *plane;
+ struct igt_fb *clip_fb = &data->fb[2];
+ struct igt_fb *ref_fb = &data->fb[3];
+
+ prepare_crtc(data, pipe, output);
+
+ igt_create_pattern_fb(display->drm_fd, mode->hdisplay, mode->vdisplay,
+ format, LOCAL_I915_FORMAT_MOD_X_TILED,
+ &data->fb[0]);
+
+ igt_create_pattern_fb(display->drm_fd, mode->vdisplay, mode->hdisplay,
+ format, LOCAL_I915_FORMAT_MOD_Y_TILED,
+ &data->fb[1]);
+
+ igt_create_fb(display->drm_fd, 64, 64, format,
+ LOCAL_I915_FORMAT_MOD_Y_TILED, ref_fb);
+
+ igt_create_fb(display->drm_fd, 2 * ref_fb->width,
+ 2 * ref_fb->height, format,
+ LOCAL_I915_FORMAT_MOD_Y_TILED, clip_fb);
+
+ igt_pipe_crc_start(data->pipe_crc);
+
+ for_each_plane_on_pipe(display, pipe, plane) {
+ igt_crc_t ref_crc[4];
+ cairo_t *cr;
+ static const double colors[4][3] = {
+ { 1., 0., 0. },
+ { 0., 1., 0. },
+ { 0., 0., 1. },
+ { 1., 1., 1. }
+ };
+ int i;
+
+ if (!plane_supports_format(plane, format))
+ continue;
+
+ /* Draw the FB that will be used for clipping tests. */
+ cr = igt_get_cairo_ctx(display->drm_fd, clip_fb);
+ igt_paint_color(cr, 0, 0, clip_fb->width / 2, clip_fb->height / 2,
+ colors[0][0], colors[0][1], colors[0][2]);
+
+ igt_paint_color(cr, clip_fb->width / 2, 0,
+ clip_fb->width / 2, clip_fb->height / 2,
+ colors[1][0], colors[1][1], colors[1][2]);
+
+ igt_paint_color(cr, clip_fb->width / 2, clip_fb->height / 2,
+ clip_fb->width / 2, clip_fb->height / 2,
+ colors[2][0], colors[2][1], colors[2][2]);
+
+ igt_paint_color(cr, 0, clip_fb->height / 2,
+ clip_fb->width / 2, clip_fb->height / 2,
+ colors[3][0], colors[3][1], colors[3][2]);
+
+ igt_put_cairo_ctx(display->drm_fd, clip_fb, cr);
+
+ /* Draw all reference FB's to collect the CRC. */
+ for (i = 0; i < 4; i++) {
+ cr = igt_get_cairo_ctx(display->drm_fd, ref_fb);
+ igt_paint_color(cr, 0, 0, ref_fb->width, ref_fb->height,
+ colors[i][0], colors[i][1], colors[i][2]);
+ igt_put_cairo_ctx(display->drm_fd, &data->fb[3], cr);
+
+ if (!i) {
+ igt_plane_set_fb(plane, ref_fb);
+ igt_plane_set_position(plane, mode->hdisplay - ref_fb->width, mode->vdisplay - ref_fb->height);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ } else {
+ igt_dirty_fb(display->drm_fd, ref_fb);
+ igt_wait_for_vblank(display->drm_fd, pipe);
+ }
+
+ igt_pipe_crc_drain(data->pipe_crc);
+ igt_pipe_crc_get_single(data->pipe_crc, &ref_crc[i]);
+ }
+
+ igt_plane_set_fb(plane, NULL);
+ igt_plane_set_position(plane, 0, 0);
+
+ nv12_valid_width_plane(data, mode, plane, &data->fb[0], IGT_ROTATION_0, &ref_crc[0]);
+ nv12_valid_width_plane(data, mode, plane, &data->fb[1], IGT_ROTATION_90, &ref_crc[1]);
+ nv12_valid_width_plane(data, mode, plane, &data->fb[0], IGT_ROTATION_180, &ref_crc[2]);
+ nv12_valid_width_plane(data, mode, plane, &data->fb[1], IGT_ROTATION_270, &ref_crc[3]);
+
+ igt_plane_set_fb(plane, NULL);
+ }
+}
+
+static bool nv12_commit_rotated(igt_display_t *display, igt_rotation_t rot)
+{
+ if (igt_display_try_commit2(display, COMMIT_ATOMIC) < 0) {
+ igt_assert(rot == IGT_ROTATION_270 || rot == (IGT_ROTATION_90 | IGT_REFLECT_X));
+ igt_debug("Skipping rotated test, alignment is wrong.\n");
+ return false;
+ }
+
+ return true;
+}
+
+static void nv12_crop_scale_bug_plane(data_t *data, drmModeModeInfo *mode,
+ igt_plane_t *plane, struct igt_fb *fb,
+ igt_rotation_t rot, igt_crc_t *ref_crc)
+{
+ igt_display_t *display = &data->display;
+ igt_crc_t crc;
+
+ igt_plane_set_fb(plane, fb);
+ igt_plane_set_rotation(plane, rot);
+ igt_fb_set_position(fb, plane, fb->width / 4 + 1, fb->height / 4 + 1);
+ igt_fb_set_size(fb, plane, fb->width / 2 + 2, fb->height / 2 + 2);
+
+ igt_plane_set_position(plane, 64, 64);
+ igt_plane_set_size(plane, 256, 256);
+
+ if (nv12_commit_rotated(display, rot))
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rot);
+}
+
+static void nv12_crop_scale_bug(data_t *data, enum pipe pipe, igt_output_t *output, unsigned format)
+{
+ drmModeModeInfo *mode = igt_output_get_mode(output);
+ igt_display_t *display = &data->display;
+ igt_plane_t *plane;
+ struct igt_fb *clip_fb = &data->fb[2];
+ struct igt_fb *ref_fb = &data->fb[3];
+
+ prepare_crtc(data, pipe, output);
+
+ igt_create_pattern_fb(display->drm_fd, mode->hdisplay, mode->vdisplay,
+ format, LOCAL_I915_FORMAT_MOD_X_TILED, &data->fb[0]);
+
+ igt_create_pattern_fb(display->drm_fd, mode->vdisplay, mode->hdisplay,
+ format, LOCAL_I915_FORMAT_MOD_Y_TILED, &data->fb[1]);
+
+ igt_create_color_fb(display->drm_fd, 256, 256, format,
+ LOCAL_I915_FORMAT_MOD_Y_TILED, 1., 1., 1., ref_fb);
+
+ igt_create_fb(display->drm_fd, 80, 128, format,
+ LOCAL_I915_FORMAT_MOD_Y_TILED, clip_fb);
+
+ igt_pipe_crc_start(data->pipe_crc);
+
+ for_each_plane_on_pipe(display, pipe, plane) {
+ igt_crc_t ref_crc;
+ cairo_t *cr;
+
+ if (!plane_supports_format(plane, format))
+ continue;
+
+ /* Draw the FB that will be used for clipping tests. */
+ cr = igt_get_cairo_ctx(display->drm_fd, clip_fb);
+ igt_paint_color(cr, 0, 0, clip_fb->width, clip_fb->height, .5, .5, .5);
+
+ igt_paint_color(cr, clip_fb->width / 4, clip_fb->height / 4,
+ clip_fb->width / 2, clip_fb->height / 2, 1., 1., 1.);
+
+ igt_put_cairo_ctx(display->drm_fd, clip_fb, cr);
+
+ igt_plane_set_fb(plane, ref_fb);
+ igt_plane_set_position(plane, 64, 64);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_drain(data->pipe_crc);
+ igt_pipe_crc_get_single(data->pipe_crc, &ref_crc);
+
+ nv12_crop_scale_bug_plane(data, mode, plane, clip_fb, IGT_ROTATION_0, &ref_crc);
+ nv12_crop_scale_bug_plane(data, mode, plane, clip_fb, IGT_ROTATION_90, &ref_crc);
+ nv12_crop_scale_bug_plane(data, mode, plane, clip_fb, IGT_ROTATION_180, &ref_crc);
+ nv12_crop_scale_bug_plane(data, mode, plane, clip_fb, IGT_ROTATION_270, &ref_crc);
+
+ igt_plane_set_fb(plane, NULL);
+ }
+}
+
+static void nv12_chroma_subpixel_clip_plane_with_cursor(data_t *data,
+ igt_plane_t *plane,
+ struct igt_fb *clip_fb,
+ igt_plane_t *cursor,
+ struct igt_fb *cursor_fb,
+ igt_crc_t *ref_crc,
+ int cursor_x, int cursor_y)
+{
+ igt_display_t *display = &data->display;
+
+ igt_plane_set_fb(plane, clip_fb);
+ igt_plane_set_position(plane, 64, 64);
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+
+ igt_plane_set_fb(cursor, cursor_fb);
+ igt_plane_set_position(cursor, cursor_x, cursor_y);
+ igt_display_commit2(display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_drain(data->pipe_crc);
+ igt_pipe_crc_get_single(data->pipe_crc, ref_crc);
+
+ igt_plane_set_fb(cursor, NULL);
+}
+
+static void nv12_chroma_subpixel_clip_plane_right(data_t *data,
+ igt_rotation_t rotation,
+ igt_plane_t *plane,
+ struct igt_fb *clip_fb,
+ igt_crc_t *ref_crc)
+{
+ igt_display_t *display = &data->display;
+ igt_crc_t crc = {};
+
+ igt_plane_set_fb(plane, clip_fb);
+ igt_plane_set_position(plane, 64, 64);
+ igt_plane_set_rotation(plane, rotation);
+ igt_plane_set_size(plane, clip_fb->width - 1, clip_fb->height);
+
+ switch (rotation) {
+ case IGT_ROTATION_180:
+ igt_fb_set_position(clip_fb, plane, 1, 0);
+ case IGT_ROTATION_0:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width - 1, clip_fb->height);
+ break;
+
+ case IGT_ROTATION_270:
+ igt_fb_set_position(clip_fb, plane, 0, 1);
+ case IGT_ROTATION_90:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width, clip_fb->height - 1);
+ break;
+ default:
+ igt_assert_f(0, "Unhandled rotation %x\n", rotation);
+ }
+
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rotation);
+}
+
+static void nv12_chroma_subpixel_clip_plane_bottom(data_t *data,
+ igt_rotation_t rotation,
+ igt_plane_t *plane,
+ struct igt_fb *clip_fb,
+ igt_crc_t *ref_crc)
+{
+ igt_display_t *display = &data->display;
+ igt_crc_t crc = {};
+
+ igt_plane_set_fb(plane, clip_fb);
+ igt_plane_set_position(plane, 64, 64);
+ igt_plane_set_rotation(plane, rotation);
+ igt_plane_set_size(plane, clip_fb->width, clip_fb->height - 1);
+
+ switch (rotation) {
+ case IGT_ROTATION_180:
+ igt_fb_set_position(clip_fb, plane, 0, 1);
+ case IGT_ROTATION_0:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width, clip_fb->height - 1);
+ break;
+
+ case IGT_ROTATION_270:
+ igt_fb_set_position(clip_fb, plane, 1, 0);
+ case IGT_ROTATION_90:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width - 1, clip_fb->height);
+ break;
+ default:
+ igt_assert_f(0, "Unhandled rotation %x\n", rotation);
+ }
+
+ if (nv12_commit_rotated(display, rotation))
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rotation);
+}
+
+static void nv12_chroma_subpixel_clip_plane_left(data_t *data,
+ igt_rotation_t rotation,
+ igt_plane_t *plane,
+ struct igt_fb *clip_fb,
+ igt_crc_t *ref_crc)
+{
+ igt_display_t *display = &data->display;
+ igt_crc_t crc = {};
+
+ igt_plane_set_fb(plane, clip_fb);
+ igt_plane_set_position(plane, 65, 64);
+ igt_plane_set_rotation(plane, rotation);
+ igt_plane_set_size(plane, clip_fb->width - 1, clip_fb->height);
+
+ switch (rotation) {
+ case IGT_ROTATION_0:
+ igt_fb_set_position(clip_fb, plane, 1, 0);
+ case IGT_ROTATION_180:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width - 1, clip_fb->height);
+ break;
+
+ case IGT_ROTATION_90:
+ igt_fb_set_position(clip_fb, plane, 0, 1);
+ case IGT_ROTATION_270:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width, clip_fb->height - 1);
+ break;
+ default:
+ igt_assert_f(0, "Unhandled rotation %x\n", rotation);
+ }
+
+ igt_display_commit2(display, COMMIT_ATOMIC);
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rotation);
+}
+
+
+static void nv12_chroma_subpixel_clip_plane_top(data_t *data,
+ igt_rotation_t rotation,
+ igt_plane_t *plane,
+ struct igt_fb *clip_fb,
+ igt_crc_t *ref_crc)
+{
+ igt_display_t *display = &data->display;
+ igt_crc_t crc = {};
+
+ igt_plane_set_fb(plane, clip_fb);
+ igt_plane_set_position(plane, 64, 65);
+ igt_plane_set_rotation(plane, rotation);
+ igt_plane_set_size(plane, clip_fb->width, clip_fb->height - 1);
+
+ switch (rotation) {
+ case IGT_ROTATION_0:
+ igt_fb_set_position(clip_fb, plane, 0, 1);
+ case IGT_ROTATION_180:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width, clip_fb->height - 1);
+ break;
+
+ case IGT_ROTATION_90:
+ igt_fb_set_position(clip_fb, plane, 1, 0);
+ case IGT_ROTATION_270:
+ igt_fb_set_size(clip_fb, plane, clip_fb->width - 1, clip_fb->height);
+ break;
+ default:
+ igt_assert_f(0, "Unhandled rotation %x\n", rotation);
+ }
+
+ if (nv12_commit_rotated(display, rotation))
+ assert_collected_crc_equal(data->pipe_crc, &crc, ref_crc, rotation);
+}
+
+static void nv12_chroma_subpixel_clip(data_t *data, enum pipe pipe, igt_output_t *output, unsigned format)
+{
+ drmModeModeInfo *mode = igt_output_get_mode(output);
+ igt_display_t *display = &data->display;
+ igt_pipe_t *pipe_obj = &display->pipes[pipe];
+ struct igt_fb *bg_fb = &data->fb[0];
+ struct igt_fb *bg_cursor_fb = &data->fb[1];
+ struct igt_fb *black_cursor_fb = &data->fb[2];
+ struct igt_fb *clip_fb = &data->fb[3];
+ igt_plane_t *primary = igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_PRIMARY);
+ igt_plane_t *cursor = igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_CURSOR);
+ igt_plane_t *plane;
+ cairo_t *cr;
+
+ prepare_crtc(data, pipe, output);
+
+ igt_create_color_fb(display->drm_fd, mode->hdisplay, mode->vdisplay,
+ DRM_FORMAT_XRGB8888, LOCAL_I915_FORMAT_MOD_X_TILED,
+ .0, .0, 1., bg_fb);
+
+ igt_create_color_fb(display->drm_fd, 256, 256,
+ DRM_FORMAT_ARGB8888, LOCAL_DRM_FORMAT_MOD_NONE,
+ .0, .0, 1., bg_cursor_fb);
+
+ igt_create_color_fb(display->drm_fd, 256, 256,
+ DRM_FORMAT_ARGB8888, LOCAL_DRM_FORMAT_MOD_NONE,
+ .0, .0, .0, black_cursor_fb);
+
+ igt_create_fb(display->drm_fd, 256, 256,
+ format, LOCAL_I915_FORMAT_MOD_Y_TILED, clip_fb);
+
+ /* Draw the FB that will be used for clipping the chroma subpixel test. */
+ cr = igt_get_cairo_ctx(display->drm_fd, clip_fb);
+
+ igt_paint_color(cr, 0, 0, clip_fb->width, clip_fb->height, 1., 0., 0.);
+ igt_paint_color(cr, 2, 2, clip_fb->width - 4, clip_fb->height - 4, 0., 1., 1.);
+ igt_paint_color(cr, 4, 4, clip_fb->width - 8, clip_fb->height - 8, .75, .75, 1.);
+
+ /* White dots in the corners. */
+ igt_paint_color(cr, 0, 0, 6, 6, 1., 1., 1.);
+ igt_paint_color(cr, clip_fb->width - 6, 0, 6, 6, 1., 1., 1.);
+ igt_paint_color(cr, 0, clip_fb->height - 6, 6, 6, 1., 1., 1.);
+ igt_paint_color(cr, clip_fb->width - 6, clip_fb->height - 6, 6, 6, 1., 1., 1.);
+
+ igt_put_cairo_ctx(display->drm_fd, clip_fb, cr);
+
+ igt_pipe_crc_start(data->pipe_crc);
+
+ igt_plane_set_fb(primary, bg_fb);
+ for_each_plane_on_pipe(display, pipe, plane) {
+ struct igt_fb *cursor_fb = plane == primary ? black_cursor_fb : bg_cursor_fb;
+ igt_crc_t ref_crc;
+
+ if (!plane_supports_format(plane, format) || plane == cursor)
+ continue;
+
+ nv12_chroma_subpixel_clip_plane_with_cursor(data, plane, clip_fb, cursor, cursor_fb, &ref_crc, 63 + clip_fb->width, 64);
+ nv12_chroma_subpixel_clip_plane_right(data, IGT_ROTATION_0, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_right(data, IGT_ROTATION_90, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_right(data, IGT_ROTATION_180, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_right(data, IGT_ROTATION_270, plane, clip_fb, &ref_crc);
+
+ nv12_chroma_subpixel_clip_plane_with_cursor(data, plane, clip_fb, cursor, cursor_fb, &ref_crc, 64, 63 + clip_fb->height);
+ nv12_chroma_subpixel_clip_plane_bottom(data, IGT_ROTATION_0, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_bottom(data, IGT_ROTATION_90, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_bottom(data, IGT_ROTATION_180, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_bottom(data, IGT_ROTATION_270, plane, clip_fb, &ref_crc);
+
+ nv12_chroma_subpixel_clip_plane_with_cursor(data, plane, clip_fb, cursor, cursor_fb, &ref_crc, 65 - cursor_fb->width, 64);
+ nv12_chroma_subpixel_clip_plane_left(data, IGT_ROTATION_0, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_left(data, IGT_ROTATION_90, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_left(data, IGT_ROTATION_180, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_left(data, IGT_ROTATION_270, plane, clip_fb, &ref_crc);
+
+ nv12_chroma_subpixel_clip_plane_with_cursor(data, plane, clip_fb, cursor, cursor_fb, &ref_crc, 64, 65 - cursor_fb->height);
+ nv12_chroma_subpixel_clip_plane_top(data, IGT_ROTATION_0, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_top(data, IGT_ROTATION_90, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_top(data, IGT_ROTATION_180, plane, clip_fb, &ref_crc);
+ nv12_chroma_subpixel_clip_plane_top(data, IGT_ROTATION_270, plane, clip_fb, &ref_crc);
+
+ /* Reset to defaults */
+ igt_plane_set_position(plane, 0, 0);
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+ igt_plane_set_fb(plane, plane == primary ? bg_fb : NULL);
+ }
+}
+
+static void run_tests_for_pipe(data_t *data, enum pipe pipe)
+{
+ igt_output_t *output;
+ igt_display_t *display = &data->display;
+
+ igt_fixture {
+ igt_display_require_output_on_pipe(display, pipe);
+ igt_require(pipe_supports_format(display, pipe, DRM_FORMAT_NV12));
+ }
+
+ igt_subtest_f("pipe-%s-nv12-rgb-switch", kmstest_pipe_name(pipe))
+ for_each_valid_output_on_pipe(display, pipe, output)
+ nv12_rgb_switch(data, pipe, output, false, DRM_FORMAT_NV12);
+
+ igt_subtest_f("pipe-%s-nv12-rgb-scaled-switch", kmstest_pipe_name(pipe))
+ for_each_valid_output_on_pipe(display, pipe, output)
+ nv12_rgb_switch(data, pipe, output, true, DRM_FORMAT_NV12);
+
+ igt_subtest_f("pipe-%s-nv12-valid-width", kmstest_pipe_name(pipe))
+ for_each_valid_output_on_pipe(display, pipe, output)
+ nv12_valid_width(data, pipe, output, DRM_FORMAT_NV12);
+
+ igt_subtest_f("pipe-%s-nv12-crop-scale-bug", kmstest_pipe_name(pipe))
+ for_each_valid_output_on_pipe(display, pipe, output)
+ nv12_crop_scale_bug(data, pipe, output, DRM_FORMAT_NV12);
+
+ igt_subtest_f("pipe-%s-nv12-chroma-subpixel-clip", kmstest_pipe_name(pipe))
+ for_each_valid_output_on_pipe(display, pipe, output)
+ nv12_chroma_subpixel_clip(data, pipe, output, DRM_FORMAT_NV12);
+}
+
+igt_main
+{
+ data_t data = {};
+ enum pipe pipe;
+
+ igt_skip_on_simulation();
+
+ igt_fixture {
+ data.display.drm_fd = drm_open_driver_master(DRIVER_ANY);
+
+ kmstest_set_vt_graphics_mode();
+ igt_display_init(&data.display, data.display.drm_fd);
+ igt_require(data.display.is_atomic);
+ igt_require_pipe_crc(data.display.drm_fd);
+ }
+
+ for_each_pipe_static(pipe)
+ igt_subtest_group
+ run_tests_for_pipe(&data, pipe);
+
+ igt_fixture {
+ igt_display_fini(&data.display);
+ close(data.display.drm_fd);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 32c2156c6f4d..e5fab06bc2f2 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -166,6 +166,7 @@ test_progs = [
'kms_invalid_dotclock',
'kms_legacy_colorkey',
'kms_mmap_write_crc',
+ 'kms_nv12',
'kms_panel_fitting',
'kms_pipe_b_c_ivb',
'kms_pipe_crc_basic',
--
2.18.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc.
2018-07-24 13:59 [igt-dev] [PATCH i-g-t 1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Maarten Lankhorst
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current() Maarten Lankhorst
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests Maarten Lankhorst
@ 2018-07-24 15:17 ` Patchwork
2018-07-24 18:21 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
3 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2018-07-24 15:17 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: igt-dev
== Series Details ==
Series: series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc.
URL : https://patchwork.freedesktop.org/series/47129/
State : success
== Summary ==
= CI Bug Log - changes from CI_DRM_4534 -> IGTPW_1641 =
== Summary - SUCCESS ==
No regressions found.
External URL: https://patchwork.freedesktop.org/api/1.0/series/47129/revisions/1/mbox/
== Known issues ==
Here are the changes found in IGTPW_1641 that come from known issues:
=== IGT changes ===
==== Issues hit ====
igt@kms_chamelium@dp-edid-read:
fi-kbl-7500u: PASS -> FAIL (fdo#103841)
igt@kms_flip@basic-flip-vs-wf_vblank:
{fi-bsw-kefka}: PASS -> FAIL (fdo#100368)
==== Possible fixes ====
igt@gem_exec_flush@basic-wb-ro-default:
fi-glk-j4005: DMESG-WARN (fdo#105719) -> PASS
igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c:
fi-bxt-dsi: INCOMPLETE (fdo#103927) -> PASS
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
fdo#103841 https://bugs.freedesktop.org/show_bug.cgi?id=103841
fdo#103927 https://bugs.freedesktop.org/show_bug.cgi?id=103927
fdo#105719 https://bugs.freedesktop.org/show_bug.cgi?id=105719
== Participating hosts (52 -> 44) ==
Missing (8): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-skl-caroline fi-byt-clapper fi-bdw-samus
== Build changes ==
* IGT: IGT_4572 -> IGTPW_1641
CI_DRM_4534: a59bbda34ede6f5685fdc86b58f143bada751617 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_1641: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1641/
IGT_4572: 9b064015df14506b23cd2d7245a73e1b1d16ee1f @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@kms_nv12@pipe-a-nv12-chroma-subpixel-clip
+igt@kms_nv12@pipe-a-nv12-crop-scale-bug
+igt@kms_nv12@pipe-a-nv12-rgb-scaled-switch
+igt@kms_nv12@pipe-a-nv12-rgb-switch
+igt@kms_nv12@pipe-a-nv12-valid-width
+igt@kms_nv12@pipe-b-nv12-chroma-subpixel-clip
+igt@kms_nv12@pipe-b-nv12-crop-scale-bug
+igt@kms_nv12@pipe-b-nv12-rgb-scaled-switch
+igt@kms_nv12@pipe-b-nv12-rgb-switch
+igt@kms_nv12@pipe-b-nv12-valid-width
+igt@kms_nv12@pipe-c-nv12-chroma-subpixel-clip
+igt@kms_nv12@pipe-c-nv12-crop-scale-bug
+igt@kms_nv12@pipe-c-nv12-rgb-scaled-switch
+igt@kms_nv12@pipe-c-nv12-rgb-switch
+igt@kms_nv12@pipe-c-nv12-valid-width
+igt@kms_nv12@pipe-d-nv12-chroma-subpixel-clip
+igt@kms_nv12@pipe-d-nv12-crop-scale-bug
+igt@kms_nv12@pipe-d-nv12-rgb-scaled-switch
+igt@kms_nv12@pipe-d-nv12-rgb-switch
+igt@kms_nv12@pipe-d-nv12-valid-width
+igt@kms_nv12@pipe-e-nv12-chroma-subpixel-clip
+igt@kms_nv12@pipe-e-nv12-crop-scale-bug
+igt@kms_nv12@pipe-e-nv12-rgb-scaled-switch
+igt@kms_nv12@pipe-e-nv12-rgb-switch
+igt@kms_nv12@pipe-e-nv12-valid-width
+igt@kms_nv12@pipe-f-nv12-chroma-subpixel-clip
+igt@kms_nv12@pipe-f-nv12-crop-scale-bug
+igt@kms_nv12@pipe-f-nv12-rgb-scaled-switch
+igt@kms_nv12@pipe-f-nv12-rgb-switch
+igt@kms_nv12@pipe-f-nv12-valid-width
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1641/issues.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* [igt-dev] ✓ Fi.CI.IGT: success for series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc.
2018-07-24 13:59 [igt-dev] [PATCH i-g-t 1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Maarten Lankhorst
` (2 preceding siblings ...)
2018-07-24 15:17 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Patchwork
@ 2018-07-24 18:21 ` Patchwork
3 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2018-07-24 18:21 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: igt-dev
== Series Details ==
Series: series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc.
URL : https://patchwork.freedesktop.org/series/47129/
State : success
== Summary ==
= CI Bug Log - changes from IGT_4572_full -> IGTPW_1641_full =
== Summary - WARNING ==
Minor unknown changes coming with IGTPW_1641_full need to be verified
manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_1641_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://patchwork.freedesktop.org/api/1.0/series/47129/revisions/1/mbox/
== Possible new issues ==
Here are the unknown changes that may have been introduced in IGTPW_1641_full:
=== IGT changes ===
==== Possible regressions ====
{igt@kms_nv12@pipe-a-nv12-chroma-subpixel-clip}:
shard-kbl: NOTRUN -> DMESG-FAIL +3
{igt@kms_nv12@pipe-a-nv12-crop-scale-bug}:
shard-glk: NOTRUN -> WARN +2
{igt@kms_nv12@pipe-b-nv12-chroma-subpixel-clip}:
shard-glk: NOTRUN -> DMESG-FAIL +2
{igt@kms_nv12@pipe-b-nv12-crop-scale-bug}:
shard-kbl: NOTRUN -> WARN +1
==== Warnings ====
igt@gem_exec_schedule@deep-blt:
shard-apl: SKIP -> PASS +3
igt@gem_exec_schedule@deep-bsd:
shard-glk: SKIP -> PASS +3
igt@gem_exec_schedule@deep-bsd1:
shard-kbl: SKIP -> PASS +2
igt@pm_rc6_residency@rc6-accuracy:
shard-snb: PASS -> SKIP
== Known issues ==
Here are the changes found in IGTPW_1641_full that come from known issues:
=== IGT changes ===
==== Issues hit ====
igt@gem_exec_parallel@blt:
shard-snb: PASS -> INCOMPLETE (fdo#105411)
igt@kms_cursor_legacy@2x-long-cursor-vs-flip-atomic:
shard-hsw: PASS -> FAIL (fdo#105767)
igt@kms_cursor_legacy@2x-long-nonblocking-modeset-vs-cursor-atomic:
shard-glk: NOTRUN -> FAIL (fdo#105454, fdo#106509)
igt@kms_flip@2x-blocking-wf_vblank:
shard-glk: PASS -> FAIL (fdo#100368)
igt@kms_flip@2x-flip-vs-expired-vblank:
shard-glk: PASS -> FAIL (fdo#105363)
igt@kms_flip@flip-vs-expired-vblank:
shard-glk: PASS -> FAIL (fdo#105363, fdo#102887)
igt@kms_setmode@basic:
shard-kbl: PASS -> FAIL (fdo#99912)
igt@kms_vblank@pipe-c-ts-continuation-dpms-suspend:
shard-kbl: PASS -> INCOMPLETE (fdo#103665)
==== Possible fixes ====
igt@gem_ppgtt@blt-vs-render-ctxn:
shard-kbl: INCOMPLETE (fdo#103665, fdo#106023) -> PASS +1
igt@kms_flip@plain-flip-ts-check:
shard-glk: FAIL (fdo#100368) -> PASS
igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
shard-kbl: INCOMPLETE (fdo#103665) -> PASS
igt@kms_rotation_crc@sprite-rotation-180:
shard-snb: FAIL (fdo#103925) -> PASS +1
igt@kms_universal_plane@cursor-fb-leak-pipe-a:
shard-apl: FAIL (fdo#107241) -> PASS
igt@perf_pmu@rc6-runtime-pm-long:
shard-kbl: FAIL (fdo#105010) -> PASS
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
fdo#102887 https://bugs.freedesktop.org/show_bug.cgi?id=102887
fdo#103665 https://bugs.freedesktop.org/show_bug.cgi?id=103665
fdo#103925 https://bugs.freedesktop.org/show_bug.cgi?id=103925
fdo#105010 https://bugs.freedesktop.org/show_bug.cgi?id=105010
fdo#105363 https://bugs.freedesktop.org/show_bug.cgi?id=105363
fdo#105411 https://bugs.freedesktop.org/show_bug.cgi?id=105411
fdo#105454 https://bugs.freedesktop.org/show_bug.cgi?id=105454
fdo#105767 https://bugs.freedesktop.org/show_bug.cgi?id=105767
fdo#106023 https://bugs.freedesktop.org/show_bug.cgi?id=106023
fdo#106509 https://bugs.freedesktop.org/show_bug.cgi?id=106509
fdo#107241 https://bugs.freedesktop.org/show_bug.cgi?id=107241
fdo#99912 https://bugs.freedesktop.org/show_bug.cgi?id=99912
== Participating hosts (5 -> 5) ==
No changes in participating hosts
== Build changes ==
* IGT: IGT_4572 -> IGTPW_1641
* Linux: CI_DRM_4533 -> CI_DRM_4534
CI_DRM_4533: 712e7047cfc7a129df6d324f59cc5d4eb2879285 @ git://anongit.freedesktop.org/gfx-ci/linux
CI_DRM_4534: a59bbda34ede6f5685fdc86b58f143bada751617 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_1641: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1641/
IGT_4572: 9b064015df14506b23cd2d7245a73e1b1d16ee1f @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1641/shards.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests.
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests Maarten Lankhorst
@ 2018-07-26 6:55 ` Petri Latvala
2018-07-26 8:57 ` Maarten Lankhorst
0 siblings, 1 reply; 9+ messages in thread
From: Petri Latvala @ 2018-07-26 6:55 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: igt-dev
On Tue, Jul 24, 2018 at 03:59:27PM +0200, Maarten Lankhorst wrote:
> Add tests excercising switching between various scaled/unscaled
> transitions to and from NV12, since some of the workarounds mention
> this may fail.
>
> We also add NV12 specific clipping/scaling tests, to make sure
> that NV12 src coordinates are always programmed as a multiple of 4
> correctly, and verify scaling/clipping works with CRC tests.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
> tests/Makefile.sources | 1 +
> tests/kms_nv12.c | 743 +++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 3 files changed, 745 insertions(+)
> create mode 100644 tests/kms_nv12.c
>
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index c84933f1d971..dab9260f584d 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -190,6 +190,7 @@ TESTS_progs = \
> kms_invalid_dotclock \
> kms_legacy_colorkey \
> kms_mmap_write_crc \
> + kms_nv12 \
> kms_panel_fitting \
> kms_pipe_b_c_ivb \
> kms_pipe_crc_basic \
> diff --git a/tests/kms_nv12.c b/tests/kms_nv12.c
> new file mode 100644
> index 000000000000..05ae83e53dda
> --- /dev/null
> +++ b/tests/kms_nv12.c
> @@ -0,0 +1,743 @@
> +/*
> + * Permission is hereby granted, free of charge, to any person obtaining a
Where's the copyright line?
--
Petri Latvala
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests.
2018-07-26 6:55 ` Petri Latvala
@ 2018-07-26 8:57 ` Maarten Lankhorst
0 siblings, 0 replies; 9+ messages in thread
From: Maarten Lankhorst @ 2018-07-26 8:57 UTC (permalink / raw)
To: igt-dev
Op 26-07-18 om 08:55 schreef Petri Latvala:
> On Tue, Jul 24, 2018 at 03:59:27PM +0200, Maarten Lankhorst wrote:
>> Add tests excercising switching between various scaled/unscaled
>> transitions to and from NV12, since some of the workarounds mention
>> this may fail.
>>
>> We also add NV12 specific clipping/scaling tests, to make sure
>> that NV12 src coordinates are always programmed as a multiple of 4
>> correctly, and verify scaling/clipping works with CRC tests.
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> ---
>> tests/Makefile.sources | 1 +
>> tests/kms_nv12.c | 743 +++++++++++++++++++++++++++++++++++++++++
>> tests/meson.build | 1 +
>> 3 files changed, 745 insertions(+)
>> create mode 100644 tests/kms_nv12.c
>>
>> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
>> index c84933f1d971..dab9260f584d 100644
>> --- a/tests/Makefile.sources
>> +++ b/tests/Makefile.sources
>> @@ -190,6 +190,7 @@ TESTS_progs = \
>> kms_invalid_dotclock \
>> kms_legacy_colorkey \
>> kms_mmap_write_crc \
>> + kms_nv12 \
>> kms_panel_fitting \
>> kms_pipe_b_c_ivb \
>> kms_pipe_crc_basic \
>> diff --git a/tests/kms_nv12.c b/tests/kms_nv12.c
>> new file mode 100644
>> index 000000000000..05ae83e53dda
>> --- /dev/null
>> +++ b/tests/kms_nv12.c
>> @@ -0,0 +1,743 @@
>> +/*
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>
> Where's the copyright line?
>
>
>
Indeed, good catch. :)
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current()
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current() Maarten Lankhorst
@ 2018-08-14 15:18 ` Daniel Vetter
2018-08-14 15:36 ` Maarten Lankhorst
0 siblings, 1 reply; 9+ messages in thread
From: Daniel Vetter @ 2018-08-14 15:18 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: igt-dev
On Tue, Jul 24, 2018 at 03:59:26PM +0200, Maarten Lankhorst wrote:
> This is a more race free of accomplishing the same.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Grep says you missed a few. I'd also go even further and entirely remove
igt_pipe_crc_get_single - the only place it's safe to call is right after
_start, and there there's not really a functional difference between
get_single and get_current.
Anyway, on patch 1: Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Also Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> if you respin
this one here to convert all places where we have drain+get_single.
-Daniel
> ---
> tests/kms_available_modes_crc.c | 3 +--
> tests/kms_cursor_legacy.c | 3 +--
> tests/kms_plane.c | 6 +-----
> tests/kms_plane_lowres.c | 6 ++----
> tests/kms_plane_multiple.c | 3 +--
> tests/kms_rotation_crc.c | 13 +++++--------
> 6 files changed, 11 insertions(+), 23 deletions(-)
>
> diff --git a/tests/kms_available_modes_crc.c b/tests/kms_available_modes_crc.c
> index b70ef5d7d4c0..69a6a37d8ebd 100644
> --- a/tests/kms_available_modes_crc.c
> +++ b/tests/kms_available_modes_crc.c
> @@ -400,8 +400,7 @@ test_one_mode(data_t* data, igt_output_t *output, igt_plane_t* plane,
> igt_display_commit2(&data->display, data->commit);
>
> if (do_crc) {
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, ¤t_crc);
> + igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, ¤t_crc);
>
> if (plane->type != DRM_PLANE_TYPE_CURSOR) {
> if (!igt_check_crc_equal(¤t_crc,
> diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
> index 85340d43e5b6..82ceebcb0809 100644
> --- a/tests/kms_cursor_legacy.c
> +++ b/tests/kms_cursor_legacy.c
> @@ -1334,8 +1334,7 @@ static void flip_vs_cursor_busy_crc(igt_display_t *display, bool atomic)
>
> igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
>
> - igt_pipe_crc_drain(pipe_crc);
> - igt_pipe_crc_get_single(pipe_crc, &test_crc);
> + igt_pipe_crc_get_current(display->drm_fd, pipe_crc, &test_crc);
>
> igt_spin_batch_free(display->drm_fd, spin);
>
> diff --git a/tests/kms_plane.c b/tests/kms_plane.c
> index f9e123f0d1ea..3999dde8f694 100644
> --- a/tests/kms_plane.c
> +++ b/tests/kms_plane.c
> @@ -419,11 +419,7 @@ static void test_format_plane_color(data_t *data, enum pipe pipe,
> igt_plane_set_fb(plane, fb);
>
> igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> -
> - /* make sure the crc we get is for the new fb */
> - igt_wait_for_vblank(data->drm_fd, pipe);
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, crc);
> + igt_pipe_crc_get_current(data->display.drm_fd, data->pipe_crc, crc);
>
> igt_remove_fb(data->drm_fd, &old_fb);
> }
> diff --git a/tests/kms_plane_lowres.c b/tests/kms_plane_lowres.c
> index d1e4b3ca536e..5e83ef5630b5 100644
> --- a/tests/kms_plane_lowres.c
> +++ b/tests/kms_plane_lowres.c
> @@ -221,8 +221,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
> check_mode(&mode_lowres, mode2);
>
> igt_display_commit2(&data->display, COMMIT_ATOMIC);
> - igt_pipe_crc_drain(pipe_crc);
> - igt_pipe_crc_get_single(pipe_crc, &crc_lowres);
> + igt_pipe_crc_get_current(data->display.drm_fd, pipe_crc, &crc_lowres);
>
> igt_assert_plane_visible(data->drm_fd, pipe, false);
>
> @@ -236,8 +235,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
>
> igt_display_commit2(&data->display, COMMIT_ATOMIC);
>
> - igt_pipe_crc_drain(pipe_crc);
> - igt_pipe_crc_get_single(pipe_crc, &crc_hires2);
> + igt_pipe_crc_get_current(data->display.drm_fd, pipe_crc, &crc_hires2);
>
> igt_assert_plane_visible(data->drm_fd, pipe, true);
>
> diff --git a/tests/kms_plane_multiple.c b/tests/kms_plane_multiple.c
> index e61bc84624b3..a53be00141f0 100644
> --- a/tests/kms_plane_multiple.c
> +++ b/tests/kms_plane_multiple.c
> @@ -276,8 +276,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
>
> 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_get_current(data->display.drm_fd, data->pipe_crc, &crc);
>
> igt_assert_crc_equal(&data->ref_crc, &crc);
>
> diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
> index 6cb5858adb0f..b994cc5d24fe 100644
> --- a/tests/kms_rotation_crc.c
> +++ b/tests/kms_rotation_crc.c
> @@ -235,8 +235,8 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
> if (plane->type != DRM_PLANE_TYPE_CURSOR)
> igt_plane_set_position(plane, data->pos_x, data->pos_y);
> igt_display_commit2(display, COMMIT_ATOMIC);
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, &data->flip_crc);
> +
> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);
>
> /*
> * Prepare the non-rotated flip fb.
> @@ -259,8 +259,7 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
> igt_plane_set_position(plane, data->pos_x, data->pos_y);
> igt_display_commit2(display, COMMIT_ATOMIC);
>
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, &data->ref_crc);
> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);
>
> /*
> * Prepare the non-rotated reference fb.
> @@ -310,8 +309,7 @@ static void test_single_case(data_t *data, enum pipe pipe,
> igt_assert_eq(ret, 0);
>
> /* Check CRC */
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, &crc_output);
> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
> igt_assert_crc_equal(&data->ref_crc, &crc_output);
>
> /*
> @@ -334,8 +332,7 @@ static void test_single_case(data_t *data, enum pipe pipe,
> igt_assert_eq(ret, 0);
> }
> kmstest_wait_for_pageflip(data->gfx_fd);
> - igt_pipe_crc_drain(data->pipe_crc);
> - igt_pipe_crc_get_single(data->pipe_crc, &crc_output);
> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
> igt_assert_crc_equal(&data->flip_crc,
> &crc_output);
> }
> --
> 2.18.0
>
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current()
2018-08-14 15:18 ` Daniel Vetter
@ 2018-08-14 15:36 ` Maarten Lankhorst
0 siblings, 0 replies; 9+ messages in thread
From: Maarten Lankhorst @ 2018-08-14 15:36 UTC (permalink / raw)
To: Daniel Vetter; +Cc: igt-dev
Op 14-08-18 om 17:18 schreef Daniel Vetter:
> On Tue, Jul 24, 2018 at 03:59:26PM +0200, Maarten Lankhorst wrote:
>> This is a more race free of accomplishing the same.
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Grep says you missed a few. I'd also go even further and entirely remove
> igt_pipe_crc_get_single - the only place it's safe to call is right after
> _start, and there there's not really a functional difference between
> get_single and get_current.
>
> Anyway, on patch 1: Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
>
> Also Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> if you respin
> this one here to convert all places where we have drain+get_single.
> -Daniel
Thanks, pushed both with fixes :)
>> ---
>> tests/kms_available_modes_crc.c | 3 +--
>> tests/kms_cursor_legacy.c | 3 +--
>> tests/kms_plane.c | 6 +-----
>> tests/kms_plane_lowres.c | 6 ++----
>> tests/kms_plane_multiple.c | 3 +--
>> tests/kms_rotation_crc.c | 13 +++++--------
>> 6 files changed, 11 insertions(+), 23 deletions(-)
>>
>> diff --git a/tests/kms_available_modes_crc.c b/tests/kms_available_modes_crc.c
>> index b70ef5d7d4c0..69a6a37d8ebd 100644
>> --- a/tests/kms_available_modes_crc.c
>> +++ b/tests/kms_available_modes_crc.c
>> @@ -400,8 +400,7 @@ test_one_mode(data_t* data, igt_output_t *output, igt_plane_t* plane,
>> igt_display_commit2(&data->display, data->commit);
>>
>> if (do_crc) {
>> - igt_pipe_crc_drain(data->pipe_crc);
>> - igt_pipe_crc_get_single(data->pipe_crc, ¤t_crc);
>> + igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, ¤t_crc);
>>
>> if (plane->type != DRM_PLANE_TYPE_CURSOR) {
>> if (!igt_check_crc_equal(¤t_crc,
>> diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
>> index 85340d43e5b6..82ceebcb0809 100644
>> --- a/tests/kms_cursor_legacy.c
>> +++ b/tests/kms_cursor_legacy.c
>> @@ -1334,8 +1334,7 @@ static void flip_vs_cursor_busy_crc(igt_display_t *display, bool atomic)
>>
>> igt_assert_eq(get_vblank(display->drm_fd, pipe, 0), vblank_start);
>>
>> - igt_pipe_crc_drain(pipe_crc);
>> - igt_pipe_crc_get_single(pipe_crc, &test_crc);
>> + igt_pipe_crc_get_current(display->drm_fd, pipe_crc, &test_crc);
>>
>> igt_spin_batch_free(display->drm_fd, spin);
>>
>> diff --git a/tests/kms_plane.c b/tests/kms_plane.c
>> index f9e123f0d1ea..3999dde8f694 100644
>> --- a/tests/kms_plane.c
>> +++ b/tests/kms_plane.c
>> @@ -419,11 +419,7 @@ static void test_format_plane_color(data_t *data, enum pipe pipe,
>> igt_plane_set_fb(plane, fb);
>>
>> igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
>> -
>> - /* make sure the crc we get is for the new fb */
>> - igt_wait_for_vblank(data->drm_fd, pipe);
>> - igt_pipe_crc_drain(data->pipe_crc);
>> - igt_pipe_crc_get_single(data->pipe_crc, crc);
>> + igt_pipe_crc_get_current(data->display.drm_fd, data->pipe_crc, crc);
>>
>> igt_remove_fb(data->drm_fd, &old_fb);
>> }
>> diff --git a/tests/kms_plane_lowres.c b/tests/kms_plane_lowres.c
>> index d1e4b3ca536e..5e83ef5630b5 100644
>> --- a/tests/kms_plane_lowres.c
>> +++ b/tests/kms_plane_lowres.c
>> @@ -221,8 +221,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
>> check_mode(&mode_lowres, mode2);
>>
>> igt_display_commit2(&data->display, COMMIT_ATOMIC);
>> - igt_pipe_crc_drain(pipe_crc);
>> - igt_pipe_crc_get_single(pipe_crc, &crc_lowres);
>> + igt_pipe_crc_get_current(data->display.drm_fd, pipe_crc, &crc_lowres);
>>
>> igt_assert_plane_visible(data->drm_fd, pipe, false);
>>
>> @@ -236,8 +235,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
>>
>> igt_display_commit2(&data->display, COMMIT_ATOMIC);
>>
>> - igt_pipe_crc_drain(pipe_crc);
>> - igt_pipe_crc_get_single(pipe_crc, &crc_hires2);
>> + igt_pipe_crc_get_current(data->display.drm_fd, pipe_crc, &crc_hires2);
>>
>> igt_assert_plane_visible(data->drm_fd, pipe, true);
>>
>> diff --git a/tests/kms_plane_multiple.c b/tests/kms_plane_multiple.c
>> index e61bc84624b3..a53be00141f0 100644
>> --- a/tests/kms_plane_multiple.c
>> +++ b/tests/kms_plane_multiple.c
>> @@ -276,8 +276,7 @@ test_plane_position_with_output(data_t *data, enum pipe pipe,
>>
>> 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_get_current(data->display.drm_fd, data->pipe_crc, &crc);
>>
>> igt_assert_crc_equal(&data->ref_crc, &crc);
>>
>> diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
>> index 6cb5858adb0f..b994cc5d24fe 100644
>> --- a/tests/kms_rotation_crc.c
>> +++ b/tests/kms_rotation_crc.c
>> @@ -235,8 +235,8 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
>> if (plane->type != DRM_PLANE_TYPE_CURSOR)
>> igt_plane_set_position(plane, data->pos_x, data->pos_y);
>> igt_display_commit2(display, COMMIT_ATOMIC);
>> - igt_pipe_crc_drain(data->pipe_crc);
>> - igt_pipe_crc_get_single(data->pipe_crc, &data->flip_crc);
>> +
>> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);
>>
>> /*
>> * Prepare the non-rotated flip fb.
>> @@ -259,8 +259,7 @@ static void prepare_fbs(data_t *data, igt_output_t *output,
>> igt_plane_set_position(plane, data->pos_x, data->pos_y);
>> igt_display_commit2(display, COMMIT_ATOMIC);
>>
>> - igt_pipe_crc_drain(data->pipe_crc);
>> - igt_pipe_crc_get_single(data->pipe_crc, &data->ref_crc);
>> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);
>>
>> /*
>> * Prepare the non-rotated reference fb.
>> @@ -310,8 +309,7 @@ static void test_single_case(data_t *data, enum pipe pipe,
>> igt_assert_eq(ret, 0);
>>
>> /* Check CRC */
>> - igt_pipe_crc_drain(data->pipe_crc);
>> - igt_pipe_crc_get_single(data->pipe_crc, &crc_output);
>> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
>> igt_assert_crc_equal(&data->ref_crc, &crc_output);
>>
>> /*
>> @@ -334,8 +332,7 @@ static void test_single_case(data_t *data, enum pipe pipe,
>> igt_assert_eq(ret, 0);
>> }
>> kmstest_wait_for_pageflip(data->gfx_fd);
>> - igt_pipe_crc_drain(data->pipe_crc);
>> - igt_pipe_crc_get_single(data->pipe_crc, &crc_output);
>> + igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
>> igt_assert_crc_equal(&data->flip_crc,
>> &crc_output);
>> }
>> --
>> 2.18.0
>>
>> _______________________________________________
>> igt-dev mailing list
>> igt-dev@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/igt-dev
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-08-14 15:36 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-24 13:59 [igt-dev] [PATCH i-g-t 1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Maarten Lankhorst
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 2/3] tests: Replace calls to igt_pipe_crc_drain + get_single with igt_pipe_crc_get_current() Maarten Lankhorst
2018-08-14 15:18 ` Daniel Vetter
2018-08-14 15:36 ` Maarten Lankhorst
2018-07-24 13:59 ` [igt-dev] [PATCH i-g-t 3/3] tests/kms_nv12: Add nv12 specific tests Maarten Lankhorst
2018-07-26 6:55 ` Petri Latvala
2018-07-26 8:57 ` Maarten Lankhorst
2018-07-24 15:17 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/3] lib/igt_debugfs: Add igt_pipe_crc_get_current() to get a crc Patchwork
2018-07-24 18:21 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).