[igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Fix test to work correctly on GLK.

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Thu May 24 08:40:39 UTC 2018


As the test notes, DRM_FORMAT_ARGB8888 is broken for CRC comparison,
and should not be used on gen9-gen10.

DRM_FORMAT_C8 failed on my glk, because it was running into the pitch
pixel limit when 4 * width is used. Track bpp correctly, and use it with
igt_get_fb_tile_size to get a more accurate size without reinventing
the wheel.

Cc: Juha-Pekka Heikkilä <juha-pekka.heikkila at intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 tests/kms_available_modes_crc.c | 181 +++++++++++++++-----------------
 1 file changed, 86 insertions(+), 95 deletions(-)

diff --git a/tests/kms_available_modes_crc.c b/tests/kms_available_modes_crc.c
index da58ee563d4d..b70ef5d7d4c0 100644
--- a/tests/kms_available_modes_crc.c
+++ b/tests/kms_available_modes_crc.c
@@ -81,7 +81,7 @@ static void generate_comparison_crc_list(data_t *data, igt_output_t *output)
 	fbid = igt_create_color_fb(data->gfx_fd,
 				   mode->hdisplay,
 				   mode->vdisplay,
-				   intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9 ? DRM_FORMAT_XRGB8888 : DRM_FORMAT_ARGB8888,
+				   DRM_FORMAT_XRGB8888,
 				   LOCAL_DRM_FORMAT_MOD_NONE,
 				   0, 0, 0,
 				   &data->primary_fb);
@@ -120,67 +120,65 @@ static void generate_comparison_crc_list(data_t *data, igt_output_t *output)
 	igt_remove_fb(data->gfx_fd, &data->primary_fb);
 }
 
-/*
- * fill_in_fb tell in return value if selected mode should be
- * proceed to crc check
- */
-static bool fill_in_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
-		       uint32_t format)
-{
-	signed i, c, writesize;
-	unsigned short* ptemp_16_buf;
-	unsigned int* ptemp_32_buf;
+static const struct {
+	uint32_t	fourcc;
+	char		zeropadding;
+	enum		{ BYTES_PP_1=1,
+				BYTES_PP_2=2,
+				BYTES_PP_4=4,
+				NV12,
+				P010,
+				SKIP4 } bpp;
+	uint32_t	value;
+} fillers[] = {
+	{ DRM_FORMAT_C8, 0, BYTES_PP_1, 0xff},
+	{ DRM_FORMAT_RGB565, 0, BYTES_PP_2, 0xffff},
+	{ DRM_FORMAT_XRGB8888, 0, BYTES_PP_4, 0xffffffff},
+	{ DRM_FORMAT_XBGR8888, 0, BYTES_PP_4, 0xffffffff},
 
-	const struct {
-		uint32_t	fourcc;
-		char		zeropadding;
-		enum		{ BYTES_PP_1=1,
-				  BYTES_PP_2=2,
-				  BYTES_PP_4=4,
-				  NV12,
-#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) || defined(DRM_FORMAT_P016)
-				  P010,
-#endif
-				  SKIP } bpp;
-		uint32_t	value;
-	} fillers[] = {
-		{ DRM_FORMAT_C8, 0, BYTES_PP_1, 0xff},
-		{ DRM_FORMAT_RGB565, 0, BYTES_PP_2, 0xffff},
-		{ DRM_FORMAT_XRGB8888, 0, BYTES_PP_4, 0xffffffff},
-		{ DRM_FORMAT_XBGR8888, 0, BYTES_PP_4, 0xffffffff},
-
-		/*
-		 * following two are skipped because blending seems to work
-		 * incorrectly with exception of AR24 on cursor plane.
-		 * Test still creates the planes, just filling plane
-		 * and getting crc is skipped.
-		 */
-		{ DRM_FORMAT_ARGB8888, 0, SKIP, 0xffffffff},
-		{ DRM_FORMAT_ABGR8888, 0, SKIP, 0x00ffffff},
+	/*
+	 * following two are skipped because blending seems to work
+	 * incorrectly with exception of AR24 on cursor plane.
+	 * Test still creates the planes, just filling plane
+	 * and getting crc is skipped.
+	 */
+	{ DRM_FORMAT_ARGB8888, 0, SKIP4, 0xffffffff},
+	{ DRM_FORMAT_ABGR8888, 0, SKIP4, 0x00ffffff},
 
-		{ DRM_FORMAT_XRGB2101010, 0, BYTES_PP_4, 0xffffffff},
-		{ DRM_FORMAT_XBGR2101010, 0, BYTES_PP_4, 0xffffffff},
+	{ DRM_FORMAT_XRGB2101010, 0, BYTES_PP_4, 0xffffffff},
+	{ DRM_FORMAT_XBGR2101010, 0, BYTES_PP_4, 0xffffffff},
 
-		{ DRM_FORMAT_YUYV, 0, BYTES_PP_4, 0x80eb80eb},
-		{ DRM_FORMAT_YVYU, 0, BYTES_PP_4, 0x80eb80eb},
-		{ DRM_FORMAT_VYUY, 0, BYTES_PP_4, 0xeb80eb80},
-		{ DRM_FORMAT_UYVY, 0, BYTES_PP_4, 0xeb80eb80},
+	{ DRM_FORMAT_YUYV, 0, BYTES_PP_4, 0x80eb80eb},
+	{ DRM_FORMAT_YVYU, 0, BYTES_PP_4, 0x80eb80eb},
+	{ DRM_FORMAT_VYUY, 0, BYTES_PP_4, 0xeb80eb80},
+	{ DRM_FORMAT_UYVY, 0, BYTES_PP_4, 0xeb80eb80},
 
-		/*
-		 * (semi-)planar formats
-		 */
-		{ DRM_FORMAT_NV12, 0, NV12, 0x80eb},
+	/*
+	 * (semi-)planar formats
+	 */
+	{ DRM_FORMAT_NV12, 0, NV12, 0x80eb},
 #ifdef DRM_FORMAT_P010
-		{ DRM_FORMAT_P010, 0, P010, 0x8000eb00},
+	{ DRM_FORMAT_P010, 0, P010, 0x8000eb00},
 #endif
 #ifdef DRM_FORMAT_P012
-		{ DRM_FORMAT_P012, 0, P010, 0x8000eb00},
+	{ DRM_FORMAT_P012, 0, P010, 0x8000eb00},
 #endif
 #ifdef DRM_FORMAT_P016
-		{ DRM_FORMAT_P016, 0, P010, 0x8000eb00},
+	{ DRM_FORMAT_P016, 0, P010, 0x8000eb00},
 #endif
-		{ 0, 0, 0, 0 }
-	};
+	{ 0, 0, 0, 0 }
+};
+
+/*
+ * fill_in_fb tell in return value if selected mode should be
+ * proceed to crc check
+ */
+static bool fill_in_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
+		       uint32_t format)
+{
+	signed i, c, writesize;
+	unsigned short* ptemp_16_buf;
+	unsigned int* ptemp_32_buf;
 
 	for( i = 0; fillers[i].fourcc != 0; i++ ) {
 		if( fillers[i].fourcc == format )
@@ -213,7 +211,6 @@ static bool fill_in_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
 
 		writesize = data->size+data->size/2;
 		break;
-#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) || defined(DRM_FORMAT_P016)
 	case P010:
 		ptemp_16_buf = (unsigned short*)data->buf;
 		for (c = 0; c < data->size/2; c++)
@@ -225,8 +222,7 @@ static bool fill_in_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
 
 		writesize = data->size+data->size/2;
 		break;
-#endif
-	case SKIP:
+	case SKIP4:
 		if (fillers[i].fourcc == DRM_FORMAT_ARGB8888 &&
 		    plane->type == DRM_PLANE_TYPE_CURSOR) {
 		/*
@@ -261,67 +257,62 @@ static bool setup_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
 	signed ret, gemsize = 0;
 	unsigned tile_width, tile_height, stride;
 	uint32_t offsets[4] = {};
-	uint32_t* offsetpointer = NULL;
+	uint64_t tiling;
+	int bpp = 0;
+	int i;
 
 	mode = igt_output_get_mode(output);
 	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
-		w = mode->hdisplay ;
+		w = mode->hdisplay;
 		h = mode->vdisplay;
+		tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
 	} else {
 		drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_WIDTH, &w);
 		drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_HEIGHT, &h);
+		tiling = LOCAL_DRM_FORMAT_MOD_NONE;
 	}
 
-	switch(format) {
-#ifdef DRM_FORMAT_P010
-	case DRM_FORMAT_P010:
-#endif
-#ifdef DRM_FORMAT_P012
-	case DRM_FORMAT_P012:
-#endif
-#ifdef DRM_FORMAT_P016
-	case DRM_FORMAT_P016:
-#endif
-#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) || defined(DRM_FORMAT_P016)
-		tile_width = 512;
-		tile_height = 16;
-		stride = ALIGN(w*2, tile_width);
-		data->size = offsets[1] = stride*ALIGN(h, tile_height);
-		gemsize = data->size*2;
-		offsetpointer = (uint32_t*)&offsets;
+	for (i = 0; fillers[i].fourcc != 0; i++) {
+		if (fillers[i].fourcc == format)
+			break;
+	}
+
+	switch (fillers[i].bpp) {
+	case NV12:
+	case BYTES_PP_1:
+		bpp = 8;
 		break;
-#endif
-	case DRM_FORMAT_NV12:
-		tile_width = 512;
-		tile_height = 16;
-		stride = ALIGN(w, tile_width);
-		data->size = offsets[1] = stride*ALIGN(h, tile_height);
-		gemsize = data->size*2;
-		offsetpointer = (uint32_t*)&offsets;
+
+	case P010:
+	case BYTES_PP_2:
+		bpp = 16;
 		break;
-	default:
-		tile_width = 512;
-		tile_height = 16;
 
-		/*
-		 * w*4 so there's enough space
-		 */
-		stride = ALIGN(w*4, tile_width);
-		data->size = stride*ALIGN(h, tile_height);
-		offsetpointer = NULL;
-		gemsize = data->size;
+	case SKIP4:
+	case BYTES_PP_4:
+		bpp = 32;
 		break;
 	}
 
+	igt_get_fb_tile_size(data->gfx_fd, tiling, bpp,
+			     &tile_width, &tile_height);
+	stride = ALIGN(w * bpp / 8, tile_width);
+	gemsize = data->size = stride * ALIGN(h, tile_height);
+
+	if (fillers[i].bpp == P010 || fillers[i].bpp == NV12) {
+		offsets[1] = data->size;
+		gemsize = data->size * 2;
+	}
+
 	data->gem_handle = gem_create(data->gfx_fd, gemsize);
 	ret = __gem_set_tiling(data->gfx_fd, data->gem_handle,
-			       I915_TILING_NONE, stride);
+			       igt_fb_mod_to_tiling(tiling), stride);
 
 	igt_assert_eq(ret, 0);
 
 	ret = __kms_addfb(data->gfx_fd, data->gem_handle, w, h,
-			  stride, format, LOCAL_DRM_FORMAT_MOD_NONE,
-			  offsetpointer, LOCAL_DRM_MODE_FB_MODIFIERS,
+			  stride, format, tiling,
+			  offsets, LOCAL_DRM_MODE_FB_MODIFIERS,
 			  &data->fb.fb_id);
 
 	if(ret < 0) {
-- 
2.17.0



More information about the igt-dev mailing list