[igt-dev] [PATCH i-g-t v10] lib/igt_fb: Added XYUV format support for testing

Lisovskiy, Stanislav stanislav.lisovskiy at intel.com
Tue Oct 23 13:51:22 UTC 2018


On Tue, 2018-10-23 at 13:33 +0200, Maarten Lankhorst wrote:
> Op 08-10-18 om 10:18 schreef Stanislav Lisovskiy:
> > XYUV format support has been added to DRM, modified
> > IGT to reflect those changes.
> > 
> > v2: Fixed merge conflict, started to use new yuv<=>rgb
> >     conversion functions.
> > 
> > v3: Fixed kms_available_modes_crc test to support new XYUV
> >     format. Fixed a problem, where test complains that two
> >     outputs might use same pipe at the same time.
> > 
> > v4: Fixed convertion procedure in igt_fb to support XYUV
> >     properly.
> > 
> > v5: Fixed a coding typo.
> > 
> > v6: Set depth equal to -1 for XYUV format in order to prevent
> >     it to be used by igt_bpp_depth_to_drm_format, as we do not
> >     want YUV formats to be used in that case.
> > 
> > v7: Fix "black" color initialization for create_bo_for_fb with
> >     proper value. Changed naming "planar_stride" to "xyuv_stride".
> > 
> > v8: Change naming from DRM_FORMAT_XYUV to DRM_FORMAT_XYUV8888
> > 
> > v9: Fixed compilation errors by rebasing to recent master.
> > 
> > v10: Adding reference to correspondent kernel commit with the new
> > format
> >      in include/drm-uapi
> > 
> > drm-tip:
> > 	commit f75df2cad986f40e190ee97fe3b49dd17174f1af
> > 	Author: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
> > 	Date:   Fri Jul 6 11:57:27 2018 +0300
> > 
> > 	    drm: Introduce new DRM_FORMAT_XYUV
> 
> In what tree is this commit included? I don't see it in drm-tip, drm-
> intel or drm-misc.

The patch is under review still. It got "Reviewed-by" just last week.

> > 
> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
> > ---
> >  include/drm-uapi/drm_fourcc.h |  1 +
> >  lib/igt_fb.c                  | 89
> > +++++++++++++++++++++++++++++++++++
> >  2 files changed, 90 insertions(+)
> > 
> > diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-
> > uapi/drm_fourcc.h
> > index e04613d3..03e5466c 100644
> > --- a/include/drm-uapi/drm_fourcc.h
> > +++ b/include/drm-uapi/drm_fourcc.h
> > @@ -112,6 +112,7 @@ extern "C" {
> >  #define DRM_FORMAT_VYUY		fourcc_code('V', 'Y', 'U',
> > 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
> >  
> >  #define DRM_FORMAT_AYUV		fourcc_code('A', 'Y', 'U',
> > 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
> > +#define DRM_FORMAT_XYUV8888	fourcc_code('X', 'Y', 'U', 'V')
> > /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
> >  
> >  /*
> >   * 2 plane RGB + A
> > diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> > index cba67f41..7d72ee2f 100644
> > --- a/lib/igt_fb.c
> > +++ b/lib/igt_fb.c
> > @@ -72,6 +72,10 @@ static const struct format_desc_struct {
> >  	  .cairo_id = CAIRO_FORMAT_RGB16_565,
> >  	  .num_planes = 1, .plane_bpp = { 16, },
> >  	},
> > +	{ .name = "XYUV8888", .depth = -1, .drm_id =
> > DRM_FORMAT_XYUV8888,
> > +	  .cairo_id = CAIRO_FORMAT_RGB24,
> > +	  .num_planes = 1, .plane_bpp = { 32, },
> > +	},
> >  	{ .name = "XRGB8888", .depth = 24, .drm_id =
> > DRM_FORMAT_XRGB8888,
> >  	  .cairo_id = CAIRO_FORMAT_RGB24,
> >  	  .num_planes = 1, .plane_bpp = { 32, },
> > @@ -453,6 +457,10 @@ static int create_bo_for_fb(struct igt_fb *fb)
> >  				       0x80,
> >  				       fb->strides[1] * fb-
> > >plane_height[1]);
> >  				break;
> > +			case DRM_FORMAT_XYUV8888:
> > +				wmemset(ptr + fb->offsets[0],
> > full_range ? 0x00008080 : 0x00108080,
> > +					fb->strides[0] * fb-
> > >plane_height[0] / sizeof(wchar_t));
> > +				break;
> >  			case DRM_FORMAT_YUYV:
> >  			case DRM_FORMAT_YVYU:
> >  				wmemset(ptr + fb->offsets[0],
> > @@ -1510,6 +1518,79 @@ static void convert_nv12_to_rgb24(struct
> > igt_fb *fb, struct fb_convert_blit_uplo
> >  	free(buf);
> >  }
> >  
> > +static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct
> > fb_convert_blit_upload *blit)
> > +{
> > +	int i, j;
> > +	uint8_t *yuv24;
> > +	uint8_t *rgb24 = blit->rgb24.map;
> > +	unsigned rgb24_stride = blit->rgb24.stride, xyuv_stride =
> > blit->base.linear.fb.strides[0];
> > +	uint8_t *buf = malloc(blit->base.linear.fb.size);
> > +	struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb-
> > >color_encoding,
> > +						    fb-
> > >color_range);
> > +
> > +	/*
> > +	 * Reading from the BO is awfully slow because of lack of
> > read caching,
> > +	 * it's faster to copy the whole BO to a temporary buffer
> > and convert
> > +	 * from there.
> > +	 */
> > +	igt_memcpy_from_wc(buf, &blit->base.linear.map[blit-
> > >base.linear.fb.offsets[0]], blit->base.linear.fb.size);
> > +	yuv24 = buf;
> > +
> > +	for (i = 0; i < fb->plane_height[0]; i++) {
> > +		for (j = 0; j < fb->plane_width[0]; j++) {
> > +			float y, u, v;
> > +			struct igt_vec4 yuv;
> > +			struct igt_vec4 rgb;
> > +
> > +			v = yuv24[i * xyuv_stride +
> > j*sizeof(uint32_t)];
> > +			u = yuv24[i * xyuv_stride +
> > j*sizeof(uint32_t) + 1];
> > +			y = yuv24[i * xyuv_stride +
> > j*sizeof(uint32_t) + 2];
> 
> Just use '4' here.

Didn't want to use magic numbers, however you right - being 32-bit
usually means the same thing anyway :)

> > +			yuv.d[0] = y;
> > +			yuv.d[1] = u;
> > +			yuv.d[2] = v;
> > +			yuv.d[3] = 1.0f;
> > +
> > +			rgb = igt_matrix_transform(&m, &yuv);
> > +
> > +			write_rgb(&rgb24[i * rgb24_stride +
> > j*sizeof(uint32_t)], &rgb);
> 
> ^Ditto.
> > +		}
> > +	}
> > +
> > +	free(buf);
> > +}
> > +
> > +
> > +static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct
> > fb_convert_blit_upload *blit)
> > +{
> > +	int i, j;
> > +	uint8_t *rgb24;
> > +	uint8_t *yuv444 = &blit->base.linear.map[blit-
> > >base.linear.fb.offsets[0]];
> > +	unsigned int rgb24_stride = blit->rgb24.stride,
> > xyuv_stride = blit->base.linear.fb.strides[0];
> > +	struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb-
> > >color_encoding,
> > +						    fb-
> > >color_range);
> > +
> > +	rgb24 = blit->rgb24.map;
> > +
> > +	for (i = 0; i < fb->plane_height[0]; i++) {
> > +		for (j = 0; j < fb->plane_width[0]; j++) {
> > +			struct igt_vec4 rgb;
> > +			struct igt_vec4 yuv;
> > +			float y, u, v;
> > +
> > +			read_rgb(&rgb, &rgb24[i * rgb24_stride +
> > j*sizeof(uint32_t)]);
> 
> ^
> > +			yuv = igt_matrix_transform(&m, &rgb);
> > +
> > +			yuv444[i * xyuv_stride +
> > j*sizeof(uint32_t)] = yuv.d[2];
> > +			yuv444[i * xyuv_stride +
> > j*sizeof(uint32_t) + 1] = yuv.d[1];
> > +			yuv444[i * xyuv_stride +
> > j*sizeof(uint32_t) + 2] = yuv.d[0];
> 
> Ditto.
> 
> Otherwise looks good, so with that fixed:
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
-- 
Best Regards,

Lisovskiy Stanislav


More information about the igt-dev mailing list