From: Tvrtko Ursulin <tvrtko.ursu...@intel.com>

Or in other words tests that display programming remains
correct when page flipping between tiled frame buffers.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
Cc: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 tests/kms_flip_tiling.c | 107 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 95 insertions(+), 12 deletions(-)

diff --git a/tests/kms_flip_tiling.c b/tests/kms_flip_tiling.c
index 8345505..909e3fc 100644
--- a/tests/kms_flip_tiling.c
+++ b/tests/kms_flip_tiling.c
@@ -35,8 +35,7 @@
 #include "ioctl_wrappers.h"
 #include "intel_chipset.h"
 
-IGT_TEST_DESCRIPTION("Test that a page flip from a tiled buffer to a linear"
-                    " one works correctly.");
+IGT_TEST_DESCRIPTION("Test page flips and tiling scenarios");
 
 typedef struct {
        int drm_fd;
@@ -44,16 +43,8 @@ typedef struct {
        int gen;
 } data_t;
 
-/*
- * Test that a page flip from a tiled buffer to a linear one works
- * correctly. First, it sets the crtc with the linear buffer and generate
- * a reference crc for the pipe. Then, the crtc is set with the tiled one
- * and page flip to the linear one issued. A new crc is generated and
- * compared to the rerence one.
- */
-
 static void
-fill_linear_fb(struct igt_fb *fb, data_t *data, drmModeModeInfo *mode)
+fill_fb(struct igt_fb *fb, data_t *data, drmModeModeInfo *mode)
 {
        cairo_t *cr;
 
@@ -62,6 +53,13 @@ fill_linear_fb(struct igt_fb *fb, data_t *data, 
drmModeModeInfo *mode)
        cairo_destroy(cr);
 }
 
+/*
+ * Test that a page flip from a tiled buffer to a linear one works
+ * correctly. First, it sets the crtc with the linear buffer and generate
+ * a reference crc for the pipe. Then, the crtc is set with the tiled one
+ * and page flip to the linear one issued. A new crc is generated and
+ * compared to the rerence one.
+ */
 static void
 test_flip_changes_tiling(data_t *data, igt_output_t *output, uint64_t tiling)
 {
@@ -90,7 +88,7 @@ test_flip_changes_tiling(data_t *data, igt_output_t *output, 
uint64_t tiling)
                              &linear);
 
        /* fill it with a pattern that will look wrong if tiling is wrong */
-       fill_linear_fb(&linear, data, mode);
+       fill_fb(&linear, data, mode);
 
        /* set the crtc and generate a reference crc */
        igt_plane_set_fb(primary, &linear);
@@ -125,6 +123,67 @@ test_flip_changes_tiling(data_t *data, igt_output_t 
*output, uint64_t tiling)
        igt_remove_fb(data->drm_fd, &linear);
 }
 
+/*
+ * Test that tiled page flips work.
+ */
+static void
+test_tiled_flip(data_t *data, igt_output_t *output, uint64_t tiling)
+{
+       drmModeModeInfo *mode;
+       igt_plane_t *primary;
+       igt_pipe_crc_t *pipe_crc;
+       igt_crc_t reference_crc, crc;
+       struct igt_fb fb[2];
+       int fb_id[2], pipe, ret, width, height;
+
+       pipe = output->config.pipe;
+       pipe_crc = igt_pipe_crc_new(pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
+       igt_output_set_pipe(output, pipe);
+
+       mode = igt_output_get_mode(output);
+       primary = igt_output_get_plane(output, 0);
+
+       width = mode->hdisplay;
+       height = mode->vdisplay;
+
+       /* create two identical fbs */
+       fb_id[0] = igt_create_fb(data->drm_fd, width, height,
+                                DRM_FORMAT_XRGB8888, tiling, &fb[0]);
+       igt_assert(fb_id[0]);
+
+       fb_id[1] = igt_create_fb(data->drm_fd, width, height,
+                                DRM_FORMAT_XRGB8888, tiling, &fb[1]);
+       igt_assert(fb_id[1]);
+
+       fill_fb(&fb[0], data, mode);
+       fill_fb(&fb[1], data, mode);
+
+       /* set the crtc and generate a reference crc */
+       igt_plane_set_fb(primary, &fb[0]);
+       igt_display_commit(&data->display);
+       igt_pipe_crc_collect_crc(pipe_crc, &reference_crc);
+
+       /* flip to the other fb */
+       ret = drmModePageFlip(data->drm_fd, output->config.crtc->crtc_id,
+                             fb_id[1], 0, NULL);
+       igt_assert_eq(ret, 0);
+
+       igt_wait_for_vblank(data->drm_fd, pipe);
+
+       /* get a crc and compare with the reference */
+       igt_pipe_crc_collect_crc(pipe_crc, &crc);
+       igt_assert_crc_equal(&reference_crc, &crc);
+
+       /* clean up */
+       igt_plane_set_fb(primary, NULL);
+       igt_pipe_crc_free(pipe_crc);
+       igt_output_set_pipe(output, PIPE_ANY);
+       igt_display_commit(&data->display);
+
+       igt_remove_fb(data->drm_fd, &fb[0]);
+       igt_remove_fb(data->drm_fd, &fb[1]);
+}
+
 static data_t data;
 igt_output_t *output;
 
@@ -166,6 +225,30 @@ igt_main
                                                LOCAL_I915_FORMAT_MOD_Yf_TILED);
        }
 
+       igt_subtest_f("flip-X-tiled") {
+               for_each_connected_output(&data.display, output)
+                       test_tiled_flip(&data, output,
+                                       LOCAL_I915_FORMAT_MOD_X_TILED);
+       }
+
+       igt_subtest_f("flip-Y-tiled") {
+               igt_require_fb_modifiers(data.drm_fd);
+               igt_require(data.gen >= 9);
+
+               for_each_connected_output(&data.display, output)
+                       test_tiled_flip(&data, output,
+                                       LOCAL_I915_FORMAT_MOD_Y_TILED);
+       }
+
+       igt_subtest_f("flip-Yf-tiled") {
+               igt_require_fb_modifiers(data.drm_fd);
+               igt_require(data.gen >= 9);
+
+               for_each_connected_output(&data.display, output)
+                       test_tiled_flip(&data, output,
+                                       LOCAL_I915_FORMAT_MOD_Yf_TILED);
+       }
+
        igt_fixture {
                igt_display_fini(&data.display);
        }
-- 
2.3.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to