[Intel-gfx] [PATCH i-g-t 3/3] tests: kms_crtc_background_color: add CRC based test

Lionel Landwerlin lionel.g.landwerlin at intel.com
Tue Mar 1 12:09:31 UTC 2016


Add an additional test using the CRC unit on the pipe to verify
setting the background color on the pipe produces the same CRCs as
setting a plane with cairo colored pixels.

Also only requires the CRC support for that test.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 tests/kms_crtc_background_color.c | 99 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 86 insertions(+), 13 deletions(-)

diff --git a/tests/kms_crtc_background_color.c b/tests/kms_crtc_background_color.c
index dbf9609..cab849d 100644
--- a/tests/kms_crtc_background_color.c
+++ b/tests/kms_crtc_background_color.c
@@ -37,7 +37,12 @@ typedef struct {
 } data_t;
 
 /* 8bpc values software rendered by Cairo */
+#define CAIRO_BLACK      0x000000
+#define CAIRO_CYAN       0xFFFF00
 #define CAIRO_PURPLE     0xFF00FF
+#define CAIRO_RED        0x0000FF
+#define CAIRO_WHITE      0xFFFFFF
+#define CAIRO_YELLOW     0x00FFFF
 
 /* 16bpc values (alpha is ignored) */
 #define BLACK64    DRM_RGBA16161616(0x0000, 0x0000, 0x0000, 0x0000)
@@ -49,6 +54,15 @@ typedef struct {
 #define GREEN64    DRM_RGBA16161616(0x0000, 0xFFFF, 0x0000, 0x0000)
 #define BLUE64     DRM_RGBA16161616(0x0000, 0x0000, 0xFFFF, 0x0000)
 
+/* 8bpc values (alpha is ignored) */
+#define CYAN8      DRM_RGBA8888(0x00, 0xFF, 0xFF, 0x00)
+#define PURPLE8    DRM_RGBA8888(0xFF, 0x00, 0xFF, 0x00)
+#define YELLOW8    DRM_RGBA8888(0xFF, 0xFF, 0x00, 0x00)
+#define WHITE8     DRM_RGBA8888(0xFF, 0xFF, 0xFF, 0x00)
+#define RED8       DRM_RGBA8888(0xFF, 0x00, 0x00, 0x00)
+#define GREEN8     DRM_RGBA8888(0x00, 0xFF, 0x00, 0x00)
+#define BLUE8      DRM_RGBA8888(0x00, 0x00, 0xFF, 0x00)
+
 static void
 paint_background(data_t *data, struct igt_fb *fb, drmModeModeInfo *mode,
 		uint32_t background, double alpha)
@@ -82,10 +96,6 @@ static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
 
 	igt_output_set_pipe(output, pipe);
 
-	/* create the pipe_crc object for this pipe */
-	igt_pipe_crc_free(data->pipe_crc);
-	data->pipe_crc = igt_pipe_crc_new(pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
-
 	mode = igt_output_get_mode(output);
 
 	fb_id = igt_create_fb(data->gfx_fd,
@@ -111,9 +121,6 @@ static void cleanup_crtc(data_t *data, igt_output_t *output, igt_plane_t *plane)
 {
 	igt_display_t *display = &data->display;
 
-	igt_pipe_crc_free(data->pipe_crc);
-	data->pipe_crc = NULL;
-
 	igt_remove_fb(data->gfx_fd, &data->fb);
 
 	igt_crtc_set_background(plane->pipe, BLACK64);
@@ -174,17 +181,83 @@ static void test_crtc_background(data_t *data)
 	igt_require_f(valid_tests, "no valid crtc/connector combinations found\n");
 }
 
-igt_simple_main
+static void verify_color_match(data_t *data,
+			       igt_output_t *output,
+			       uint64_t background_color,
+			       uint32_t plane_color)
+{
+	igt_plane_t *plane = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
+	enum pipe pipe = output->config.pipe;
+	igt_crc_t crc_plane, crc_background;
+
+	prepare_crtc(data, output, pipe, plane, 1, plane_color, RED64);
+	igt_wait_for_vblank(data->gfx_fd, pipe);
+	igt_pipe_crc_collect_crc(data->pipe_crc, &crc_plane);
+
+	igt_plane_set_fb(plane, NULL);
+	igt_crtc_set_background(&data->display.pipes[pipe], background_color);
+	igt_wait_for_vblank(data->gfx_fd, pipe);
+	igt_pipe_crc_collect_crc(data->pipe_crc, &crc_background);
+	cleanup_crtc(data, output, plane);
+
+	igt_assert_crc_equal(&crc_plane, &crc_background);
+}
+
+/*
+ * Verify colors set on a plane covering the entire the screen yield
+ * the same CRC as the same colors set on the background.
+ */
+static void test_crtc_background_crc(data_t *data)
+{
+
+	igt_display_t *display = &data->display;
+	igt_output_t *output;
+
+	igt_require_pipe_crc();
+	igt_require(data->display.has_universal_planes);
+
+	for_each_connected_output(display, output) {
+		enum pipe p = output->config.pipe;
+		igt_pipe_t *pipe = &display->pipes[p];
+
+		igt_output_set_pipe(output, p);
+
+		igt_require(pipe->background_property);
+
+		/* create the pipe_crc object for this pipe */
+		igt_pipe_crc_free(data->pipe_crc);
+		data->pipe_crc = igt_pipe_crc_new(p,
+						  INTEL_PIPE_CRC_SOURCE_AUTO);
+
+		verify_color_match(data, output, BLACK64, CAIRO_BLACK);
+		verify_color_match(data, output, CYAN8, CAIRO_CYAN);
+		verify_color_match(data, output, PURPLE8, CAIRO_PURPLE);
+		verify_color_match(data, output, YELLOW8, CAIRO_YELLOW);
+		verify_color_match(data, output, RED8, CAIRO_RED);
+
+		igt_pipe_crc_free(data->pipe_crc);
+		data->pipe_crc = NULL;
+	}
+}
+
+igt_main
 {
 	data_t data = {};
 
 	igt_skip_on_simulation();
 
-	data.gfx_fd = drm_open_driver(DRIVER_INTEL);
-	igt_require_pipe_crc();
-	igt_display_init(&data.display, data.gfx_fd);
+	igt_fixture {
+		data.gfx_fd = drm_open_driver(DRIVER_INTEL);
+		igt_display_init(&data.display, data.gfx_fd);
+	}
 
-	test_crtc_background(&data);
+	igt_subtest_f("crtc-background")
+		test_crtc_background(&data);
 
-	igt_display_fini(&data.display);
+	igt_subtest_f("crtc-background-crc")
+		test_crtc_background_crc(&data);
+
+	igt_fixture {
+		igt_display_fini(&data.display);
+	}
 }
-- 
2.7.0



More information about the Intel-gfx mailing list