[igt-dev] [PATCH i-g-t v2 8/8] tests/kms_plane: crc check plane pixel formats

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Thu Jun 7 15:18:41 UTC 2018


Op 24-05-18 om 12:48 schreef Ville Syrjala:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Insted of just trying out each pixel format once, let's try each one
> with a set of colors (RGB,CMY,white,black). We'll grab a reference CRC
> for each using XRGB8888, and then compare that with the CRC we get
> with any other format.
>
> We have to use a solid color fb because chroma subsampling would
> generally prevent us from getting a match if we had any color
> transitions in the fb contents.
>
> We also abuse the legacy LUT to drop the precision down to 7 bits
> so that still errors causes by the RGB<->YCbCr conversion end up
> being ignored.
>
> v2: don't set Broadcast RGB prop if it's not there
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Broadcast RGB is always set to full why are you touching this?

With wmemset in patch 1, and broadcast rgb calls removed on thi sseries:

Reviewed-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>

> ---
>  tests/kms_plane.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 109 insertions(+), 18 deletions(-)
>
> diff --git a/tests/kms_plane.c b/tests/kms_plane.c
> index 23173b966eab..aa2ba64f4896 100644
> --- a/tests/kms_plane.c
> +++ b/tests/kms_plane.c
> @@ -366,21 +366,83 @@ test_plane_panning(data_t *data, enum pipe pipe, unsigned int flags)
>  	igt_skip_on(connected_outs == 0);
>  }
>  
> +static const color_t colors[] = {
> +	{ 1.0f, 0.0f, 0.0f, },
> +	{ 0.0f, 1.0f, 0.0f, },
> +	{ 0.0f, 0.0f, 1.0f, },
> +	{ 1.0f, 1.0f, 1.0f, },
> +	{ 0.0f, 0.0f, 0.0f, },
> +	{ 0.0f, 1.0f, 1.0f, },
> +	{ 1.0f, 0.0f, 1.0f, },
> +	{ 1.0f, 1.0f, 0.0f, },
> +};
> +
> +static void set_legacy_lut(data_t *data, enum pipe pipe,
> +			   uint16_t mask)
> +{
> +	igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
> +	drmModeCrtc *crtc;
> +	uint16_t *lut;
> +	int i, lut_size;
> +
> +	crtc = drmModeGetCrtc(data->drm_fd, pipe_obj->crtc_id);
> +	lut_size = crtc->gamma_size;
> +	drmModeFreeCrtc(crtc);
> +
> +	lut = malloc(sizeof(uint16_t) * lut_size);
> +
> +	for (i = 0; i < lut_size; i++)
> +		lut[i] = (i * 0xffff / (lut_size - 1)) & mask;
> +
> +	igt_assert_eq(drmModeCrtcSetGamma(data->drm_fd, pipe_obj->crtc_id,
> +					  lut_size, lut, lut, lut), 0);
> +
> +	free(lut);
> +}
> +
> +#define IGT_FORMAT_FMT "%c%c%c%c (0x%08x)"
> +#define IGT_FORMAT_ARGS(f) ((f) >> 0) & 0xff, ((f) >> 8) & 0xff, \
> +		((f) >> 16) & 0xff, ((f) >> 24) & 0xff, (f)
> +
> +static void test_format_plane_color(data_t *data, enum pipe pipe,
> +				    igt_plane_t *plane,
> +				    uint32_t format, int width, int height,
> +				    int color, igt_crc_t *crc)
> +{
> +	const color_t *c = &colors[color];
> +	struct igt_fb fb;
> +
> +	igt_create_color_fb(data->drm_fd, width, height,
> +			    format, LOCAL_DRM_FORMAT_MOD_NONE,
> +			    c->red, c->green, c->blue, &fb);
> +
> +	igt_plane_set_fb(plane, &fb);
> +	igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> +
> +	igt_pipe_crc_drain(data->pipe_crc);
> +	igt_pipe_crc_get_single(data->pipe_crc, crc);
> +
> +	igt_plane_set_fb(plane, NULL);
> +	igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> +
> +	igt_remove_fb(data->drm_fd, &fb);
> +}
> +
>  static void test_format_plane(data_t *data, enum pipe pipe,
>  			      igt_output_t *output, igt_plane_t *plane)
>  {
>  	igt_plane_t *primary;
> -	struct igt_fb primary_fb, fb;
> +	struct igt_fb primary_fb;
>  	drmModeModeInfo *mode;
> -	cairo_t *cr;
> -	int i;
>  	uint32_t format;
>  	uint64_t width, height;
> +	igt_crc_t ref_crc[ARRAY_SIZE(colors)];
>  
>  	mode = igt_output_get_mode(output);
>  	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
>  		width = mode->hdisplay;
>  		height = mode->vdisplay;
> +		format = DRM_FORMAT_XRGB8888;
>  	} else {
>  		if (!plane->drm_plane) {
>  			igt_debug("Only legacy cursor ioctl supported, skipping cursor plane\n");
> @@ -388,6 +450,7 @@ static void test_format_plane(data_t *data, enum pipe pipe,
>  		}
>  		do_or_die(drmGetCap(data->drm_fd, DRM_CAP_CURSOR_WIDTH, &width));
>  		do_or_die(drmGetCap(data->drm_fd, DRM_CAP_CURSOR_HEIGHT, &height));
> +		format = DRM_FORMAT_ARGB8888;
>  	}
>  
>  	igt_debug("Testing connector %s on %s plane %s.%u\n",
> @@ -401,35 +464,63 @@ static void test_format_plane(data_t *data, enum pipe pipe,
>  	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
>  	igt_plane_set_fb(primary, &primary_fb);
>  
> +	if (igt_output_has_prop(output, IGT_CONNECTOR_BROADCAST_RGB))
> +		igt_output_set_prop_value(output, IGT_CONNECTOR_BROADCAST_RGB,
> +					  BROADCAST_RGB_FULL);
> +
>  	igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
>  
> -	for (i = 0; i < plane->drm_plane->count_formats; i++) {
> +	set_legacy_lut(data, pipe, 0xfc00);
> +
> +	test_init(data, pipe);
> +	igt_pipe_crc_start(data->pipe_crc);
> +
> +	igt_info("Testing format " IGT_FORMAT_FMT " on %s.%u\n",
> +		 IGT_FORMAT_ARGS(format),
> +		 kmstest_pipe_name(pipe), plane->index);
> +
> +	for (int i = 0; i < ARRAY_SIZE(colors); i++) {
> +		test_format_plane_color(data, pipe, plane,
> +					format, width, height,
> +					i, &ref_crc[i]);
> +	}
> +
> +	for (int i = 0; i < plane->drm_plane->count_formats; i++) {
> +		igt_crc_t crc;
> +
>  		format = plane->drm_plane->formats[i];
>  
> +		if (format == DRM_FORMAT_XRGB8888)
> +			continue;
> +
>  		if (!igt_fb_supported_format(format))
>  			continue;
>  
> -		igt_debug("Testing format 0x%x on %s.%u\n",
> -			  format, kmstest_pipe_name(pipe), plane->index);
> +		igt_info("Testing format " IGT_FORMAT_FMT " on %s.%u\n",
> +			 IGT_FORMAT_ARGS(format),
> +			 kmstest_pipe_name(pipe), plane->index);
>  
> -		igt_create_fb(data->drm_fd, width, height,
> -			      format, LOCAL_DRM_FORMAT_MOD_NONE, &fb);
> +		for (int j = 0; j < ARRAY_SIZE(colors); j++) {
> +			test_format_plane_color(data, pipe, plane,
> +						format, width, height,
> +						j, &crc);
>  
> -		cr = igt_get_cairo_ctx(data->drm_fd, &fb);
> -		igt_paint_color(cr, 0, 0, width, height,
> -				0.0, 1.0, 0.0);
> -		if (width >= 164 && height >= 164)
> -			igt_paint_color(cr, 100, 100, 64, 64, 0.0, 0.0, 0.0);
> -		igt_put_cairo_ctx(data->drm_fd, &fb, cr);
> +			igt_assert_crc_equal(&crc, &ref_crc[j]);
> +		}
> +	}
>  
> -		igt_plane_set_fb(plane, &fb);
> -		igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
> +	igt_pipe_crc_stop(data->pipe_crc);
> +	test_fini(data);
>  
> -		igt_remove_fb(data->drm_fd, &fb);
> -	}
> +	set_legacy_lut(data, pipe, 0xffff);
>  
> +	if (igt_output_has_prop(output, IGT_CONNECTOR_BROADCAST_RGB))
> +		igt_output_set_prop_value(output, IGT_CONNECTOR_BROADCAST_RGB,
> +					  BROADCAST_RGB_AUTO);
>  	igt_plane_set_fb(primary, NULL);
>  	igt_plane_set_fb(plane, NULL);
> +	igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> +
>  	igt_remove_fb(data->drm_fd, &primary_fb);
>  }
>  




More information about the igt-dev mailing list