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

Juha-Pekka Heikkilä juha-pekka.heikkila at intel.com
Thu May 24 09:50:11 UTC 2018


Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>

On 24.05.2018 11:40, Maarten Lankhorst wrote:
> 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) {
> 
---------------------------------------------------------------------
Intel Finland Oy
Registered Address: PL 281, 00181 Helsinki 
Business Identity Code: 0357606 - 4 
Domiciled in Helsinki 

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.


More information about the igt-dev mailing list