[igt-dev] [PATCH i-g-t 4/5] lib/igt_fb: Pass around igt_fb internally

Paulo Zanoni paulo.r.zanoni at intel.com
Wed Sep 26 00:49:10 UTC 2018


Em Ter, 2018-09-25 às 16:47 +0300, Ville Syrjala escreveu:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Instead of passing around a boatload of integers everywhere let's
> just pass around the igt_fb struct. That obviously means we have to
> populate it first sufficiently, to which end we'll add a small
> helper.
> Later on the stride/size calculations will consult the already
> pre-populated igt_fb and fill in the rest as needed.
> 
> This makes the whole thing a lot less error prone as it's impossible
> to accidentally pass the arguments in the wrong order when there's
> just the one of them, and it's a pointer.

While I completely agree with these arguments, this change does not
come without its own minor downsides. Code that deals-with/initializes
igt_fb_t is now a little riskier due to the the fact that the order
which things are initialized is way more important now. And we also
moved a whole layer of our abstractions up, but that didn't seem to be
a problem now so let's hope it still won't be a problem later.

Still, a positive change even when downsides are considered.

> 
> v2: Rebase due to uint64_t size
> 
> Cc: Paulo Zanoni <paulo.r.zanoni at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  lib/igt_draw.c                   |   2 +-
>  lib/igt_fb.c                     | 408 +++++++++++++++++++--------
> ------------
>  lib/igt_fb.h                     |   4 +-
>  tests/kms_ccs.c                  |   2 +-
>  tests/kms_flip.c                 |   4 +-
>  tests/kms_frontbuffer_tracking.c |   6 +-
>  tests/pm_rpm.c                   |   2 +-
>  7 files changed, 207 insertions(+), 221 deletions(-)
> 
> diff --git a/lib/igt_draw.c b/lib/igt_draw.c
> index c7d5770dca28..05821480bc80 100644
> --- a/lib/igt_draw.c
> +++ b/lib/igt_draw.c
> @@ -720,7 +720,7 @@ void igt_draw_rect_fb(int fd, drm_intel_bufmgr
> *bufmgr,
>  		      enum igt_draw_method method, int rect_x, int
> rect_y,
>  		      int rect_w, int rect_h, uint32_t color)
>  {
> -	igt_draw_rect(fd, bufmgr, context, fb->gem_handle, fb->size, 
> fb->stride,
> +	igt_draw_rect(fd, bufmgr, context, fb->gem_handle, fb->size, 
> fb->strides[0],
>  		      method, rect_x, rect_y, rect_w, rect_h, color,
>  		      igt_drm_format_to_bpp(fb->drm_format));
>  }
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index 3c6974503313..26019f0420dc 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -190,50 +190,72 @@ void igt_get_fb_tile_size(int fd, uint64_t
> tiling, int fb_bpp,
>  	}
>  }
>  
> -static unsigned fb_plane_width(const struct format_desc_struct
> *format,
> -			       int plane, unsigned width)
> +static unsigned fb_plane_width(const struct igt_fb *fb, int plane)
>  {
> -	if (format->drm_id == DRM_FORMAT_NV12 && plane == 1)
> -		return DIV_ROUND_UP(width, 2);
> +	if (fb->drm_format == DRM_FORMAT_NV12 && plane == 1)
> +		return DIV_ROUND_UP(fb->width, 2);
>  
> -	return width;
> +	return fb->width;
>  }
>  
> -static unsigned fb_plane_bpp(const struct format_desc_struct
> *format, int plane)
> +static unsigned fb_plane_bpp(const struct igt_fb *fb, int plane)
>  {
> +	const struct format_desc_struct *format =
> lookup_drm_format(fb->drm_format);
> +
>  	return format->plane_bpp[plane];
>  }
>  
> -static unsigned fb_plane_min_stride(const struct format_desc_struct
> *format,
> -				    int plane, unsigned width)
> +static unsigned fb_plane_height(const struct igt_fb *fb, int plane)
>  {
> -	unsigned cpp = fb_plane_bpp(format, plane) / 8;
> +	if (fb->drm_format == DRM_FORMAT_NV12 && plane == 1)
> +		return DIV_ROUND_UP(fb->height, 2);
>  
> -	return fb_plane_width(format, width, plane) * cpp;
> +	return fb->height;
>  }
>  
> -static unsigned fb_plane_height(const struct format_desc_struct
> *format,
> -				int plane, unsigned height)
> +static int fb_num_planes(const struct igt_fb *fb)
>  {
> -	if (format->drm_id == DRM_FORMAT_NV12 && plane == 1)
> -		return DIV_ROUND_UP(height, 2);
> +	const struct format_desc_struct *format =
> lookup_drm_format(fb->drm_format);
>  
> -	return height;
> -}
> -
> -static int fb_num_planes(const struct format_desc_struct *format)
> -{
>  	return format->num_planes;
>  }
>  
> -static unsigned calc_plane_stride(int fd,
> -				  const struct format_desc_struct
> *format,
> -				  int width, uint64_t tiling, int
> plane)
> +static void fb_init(struct igt_fb *fb,
> +		    int fd, int width, int height,
> +		    uint32_t drm_format,
> +		    uint64_t modifier,
> +		    enum igt_color_encoding color_encoding,
> +		    enum igt_color_range color_range)
>  {
> -	uint32_t min_stride = fb_plane_min_stride(format, width,
> plane);
> +	const struct format_desc_struct *f =
> lookup_drm_format(drm_format);
>  
> -	if (tiling != LOCAL_DRM_FORMAT_MOD_NONE &&
> -	    intel_gen(intel_get_drm_devid(fd)) <= 3) {
> +	igt_assert_f(f, "DRM format %08x not found\n", drm_format);
> +
> +	memset(fb, 0, sizeof(*fb));
> +
> +	fb->width = width;
> +	fb->height = height;
> +	fb->tiling = modifier;

Shouldn't we rename fb->tiling now? (of course, in a separate patch)

Everything else looks correct.

Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>

> +	fb->drm_format = drm_format;
> +	fb->fd = fd;
> +	fb->num_planes = fb_num_planes(fb);
> +	fb->color_encoding = color_encoding;
> +	fb->color_range = color_range;
> +
> +	for (int i = 0; i < fb->num_planes; i++) {
> +		fb->plane_bpp[i] = fb_plane_bpp(fb, i);
> +		fb->plane_height[i] = fb_plane_height(fb, i);
> +		fb->plane_width[i] = fb_plane_width(fb, i);
> +	}
> +}
> +
> +static uint32_t calc_plane_stride(struct igt_fb *fb, int plane)
> +{
> +	uint32_t min_stride = fb->plane_width[plane] *
> +		(fb->plane_bpp[plane] / 8);
> +
> +	if (fb->tiling != LOCAL_DRM_FORMAT_MOD_NONE &&
> +	    intel_gen(intel_get_drm_devid(fb->fd)) <= 3) {
>  		uint32_t stride;
>  
>  		/* Round the tiling up to the next power-of-two and
> the region
> @@ -251,22 +273,19 @@ static unsigned calc_plane_stride(int fd,
>  	} else {
>  		unsigned int tile_width, tile_height;
>  
> -		igt_get_fb_tile_size(fd, tiling,
> -				     fb_plane_bpp(format, plane),
> +		igt_get_fb_tile_size(fb->fd, fb->tiling, fb-
> >plane_bpp[plane],
>  				     &tile_width, &tile_height);
>  
>  		return ALIGN(min_stride, tile_width);
>  	}
>  }
>  
> -static uint64_t calc_plane_size(int fd, int width, int height,
> -				const struct format_desc_struct
> *format,
> -				uint64_t tiling, int plane,
> -				uint32_t stride)
> +static uint64_t calc_plane_size(struct igt_fb *fb, int plane)
>  {
> -	if (tiling != LOCAL_DRM_FORMAT_MOD_NONE &&
> -	    intel_gen(intel_get_drm_devid(fd)) <= 3) {
> -		uint64_t min_size = (uint64_t) stride * height;
> +	if (fb->tiling != LOCAL_DRM_FORMAT_MOD_NONE &&
> +	    intel_gen(intel_get_drm_devid(fb->fd)) <= 3) {
> +		uint64_t min_size = (uint64_t) fb->strides[plane] *
> +			fb->plane_height[plane];
>  		uint64_t size;
>  
>  		/* Round the tiling up to the next power-of-two and
> the region
> @@ -284,38 +303,27 @@ static uint64_t calc_plane_size(int fd, int
> width, int height,
>  	} else {
>  		unsigned int tile_width, tile_height;
>  
> -		igt_get_fb_tile_size(fd, tiling,
> fb_plane_bpp(format, plane),
> +		igt_get_fb_tile_size(fb->fd, fb->tiling, fb-
> >plane_bpp[plane],
>  				     &tile_width, &tile_height);
>  
> -		return (uint64_t) stride * ALIGN(height,
> tile_height);
> +		return (uint64_t) fb->strides[plane] *
> +			ALIGN(fb->plane_height[plane], tile_height);
>  	}
>  }
>  
> -static uint64_t calc_fb_size(int fd, int width, int height,
> -			     const struct format_desc_struct
> *format,
> -			     uint64_t tiling,
> -			     uint32_t strides[4], uint32_t
> offsets[4])
> +static uint64_t calc_fb_size(struct igt_fb *fb)
>  {
>  	uint64_t size = 0;
>  	int plane;
>  
> -	for (plane = 0; plane < fb_num_planes(format); plane++) {
> -		if (!strides[plane])
> -			strides[plane] = calc_plane_stride(fd,
> format,
> -							   width,
> tiling, plane);
> +	for (plane = 0; plane < fb->num_planes; plane++) {
> +		/* respect the stride requested by the caller */
> +		if (!fb->strides[plane])
> +			fb->strides[plane] = calc_plane_stride(fb,
> plane);
>  
> -		if (offsets)
> -			offsets[plane] = size;
> +		fb->offsets[plane] = size;
>  
> -		size += calc_plane_size(fd, width, height,
> -					format, tiling, plane,
> -					strides[plane]);
> -	}
> -
> -	for (; plane < ARRAY_SIZE(format->plane_bpp); plane++) {
> -		strides[plane] = 0;
> -		if (offsets)
> -			offsets[plane] = 0;
> +		size += calc_plane_size(fb, plane);
>  	}
>  
>  	return size;
> @@ -337,13 +345,17 @@ static uint64_t calc_fb_size(int fd, int width,
> int height,
>  void igt_calc_fb_size(int fd, int width, int height, uint32_t
> drm_format, uint64_t tiling,
>  		      uint64_t *size_ret, unsigned *stride_ret)
>  {
> -	const struct format_desc_struct *format =
> lookup_drm_format(drm_format);
> -	uint32_t strides[4] = {};
> +	struct igt_fb fb;
>  
> -	igt_assert(format);
> +	fb_init(&fb, fd, width, height, drm_format, tiling,
> +		IGT_COLOR_YCBCR_BT709,
> IGT_COLOR_YCBCR_LIMITED_RANGE);
>  
> -	*size_ret = calc_fb_size(fd, width, height, format, tiling,
> strides, NULL);
> -	*stride_ret = strides[0];
> +	fb.size = calc_fb_size(&fb);
> +
> +	if (size_ret)
> +		*size_ret = fb.size;
> +	if (stride_ret)
> +		*stride_ret = fb.strides[0];
>  }
>  
>  /**
> @@ -399,80 +411,64 @@ uint64_t igt_fb_tiling_to_mod(uint64_t tiling)
>  }
>  
>  /* helpers to create nice-looking framebuffers */
> -static int create_bo_for_fb(int fd, int width, int height,
> -			    enum igt_color_encoding color_encoding,
> -			    enum igt_color_range color_range,
> -			    const struct format_desc_struct *format,
> -			    uint64_t tiling, uint64_t size, unsigned
> stride,
> -			    uint64_t *size_ret, unsigned
> *stride_ret,
> -			    uint32_t offsets[4], bool *is_dumb)
> +static int create_bo_for_fb(struct igt_fb *fb)
>  {
> -	int bo;
> +	int fd = fb->fd;
>  
> -	igt_assert(format);
> +	if (fb->tiling || fb->size || fb->strides[0] ||
> igt_format_is_yuv(fb->drm_format)) {
> +		uint64_t size;
>  
> -	if (offsets)
> -		memset(offsets, 0, ARRAY_SIZE(format->plane_bpp) *
> sizeof(*offsets));
> +		size = calc_fb_size(fb);
>  
> -	if (tiling || size || stride || igt_format_is_yuv(format-
> >drm_id)) {
> -		uint64_t calculated_size;
> -		uint32_t strides[4] = {
> -			stride,
> -		};
> +		/* respect the size requested by the caller */
> +		if (fb->size == 0)
> +			fb->size = size;
>  
> -		calculated_size = calc_fb_size(fd, width, height,
> -					       format, tiling,
> -					       strides, offsets);
> -
> -		if (stride == 0)
> -			stride = strides[0];
> -		if (size == 0)
> -			size = calculated_size;
> -
> -		if (is_dumb)
> -			*is_dumb = false;
> +		fb->is_dumb = false;
>  
>  		if (is_i915_device(fd)) {
>  			void *ptr;
> -			bool full_range = color_range ==
> IGT_COLOR_YCBCR_FULL_RANGE;
> +			bool full_range = fb->color_range ==
> IGT_COLOR_YCBCR_FULL_RANGE;
>  
> -			bo = gem_create(fd, size);
> -			gem_set_tiling(fd, bo,
> igt_fb_mod_to_tiling(tiling), stride);
> +			fb->gem_handle = gem_create(fd, fb->size);
>  
> -			gem_set_domain(fd, bo,
> +			gem_set_tiling(fd, fb->gem_handle,
> +				       igt_fb_mod_to_tiling(fb-
> >tiling),
> +				       fb->strides[0]);
> +
> +			gem_set_domain(fd, fb->gem_handle,
>  				       I915_GEM_DOMAIN_GTT,
> I915_GEM_DOMAIN_GTT);
>  
>  			/* Ensure the framebuffer is preallocated */
> -			ptr = gem_mmap__gtt(fd, bo, size, PROT_READ
> | PROT_WRITE);
> +			ptr = gem_mmap__gtt(fd, fb->gem_handle,
> +					    fb->size, PROT_READ |
> PROT_WRITE);
>  			igt_assert(*(uint32_t *)ptr == 0);
>  
> -			switch (format->drm_id) {
> +			switch (fb->drm_format) {
>  			case DRM_FORMAT_NV12:
> -				memset(ptr + offsets[0], full_range
> ? 0x00 : 0x10,
> -				       strides[0] * height);
> -				memset(ptr + offsets[1], 0x80,
> -				       strides[1] * height/2);
> +				memset(ptr + fb->offsets[0],
> +				       full_range ? 0x00 : 0x10,
> +				       fb->strides[0] * fb-
> >plane_height[0]);
> +				memset(ptr + fb->offsets[1],
> +				       0x80,
> +				       fb->strides[1] * fb-
> >plane_height[1]);
>  				break;
>  			case DRM_FORMAT_YUYV:
>  			case DRM_FORMAT_YVYU:
> -				wmemset(ptr, full_range ? 0x80008000
> : 0x80108010,
> -					strides[0] * height /
> sizeof(wchar_t));
> +				wmemset(ptr + fb->offsets[0],
> +					full_range ? 0x80008000 :
> 0x80108010,
> +					fb->strides[0] * fb-
> >plane_height[0] / sizeof(wchar_t));
>  				break;
>  			case DRM_FORMAT_UYVY:
>  			case DRM_FORMAT_VYUY:
> -				wmemset(ptr, full_range ? 0x00800080
> : 0x10801080,
> -					strides[0] * height /
> sizeof(wchar_t));
> +				wmemset(ptr + fb->offsets[0],
> +					full_range ? 0x00800080 :
> 0x10801080,
> +					fb->strides[0] * fb-
> >plane_height[0] / sizeof(wchar_t));
>  				break;
>  			}
> -			gem_munmap(ptr, size);
> +			gem_munmap(ptr, fb->size);
>  
> -			if (size_ret)
> -				*size_ret = size;
> -
> -			if (stride_ret)
> -				*stride_ret = strides[0];
> -
> -			return bo;
> +			return fb->gem_handle;
>  		} else {
>  			bool driver_has_gem_api = false;
>  
> @@ -480,12 +476,13 @@ static int create_bo_for_fb(int fd, int width,
> int height,
>  			return -EINVAL;
>  		}
>  	} else {
> -		if (is_dumb)
> -			*is_dumb = true;
> +		fb->is_dumb = true;
>  
> -		return kmstest_dumb_create(fd, width, height,
> -					   fb_plane_bpp(format, 0),
> -					   stride_ret, size_ret);
> +		fb->gem_handle = kmstest_dumb_create(fd, fb->width,
> fb->height,
> +						     fb-
> >plane_bpp[0],
> +						     &fb-
> >strides[0], &fb->size);
> +
> +		return fb->gem_handle;
>  	}
>  }
>  
> @@ -512,11 +509,24 @@ int igt_create_bo_with_dimensions(int fd, int
> width, int height,
>  				  unsigned stride, uint64_t
> *size_ret,
>  				  unsigned *stride_ret, bool
> *is_dumb)
>  {
> -	return create_bo_for_fb(fd, width, height,
> -				IGT_COLOR_YCBCR_BT709,
> -				IGT_COLOR_YCBCR_LIMITED_RANGE,
> -				lookup_drm_format(format),
> -				modifier, 0, stride, size_ret,
> stride_ret, NULL, is_dumb);
> +	struct igt_fb fb;
> +
> +	fb_init(&fb, fd, width, height, format, modifier,
> +		IGT_COLOR_YCBCR_BT709,
> IGT_COLOR_YCBCR_LIMITED_RANGE);
> +
> +	for (int i = 0; i < fb.num_planes; i++)
> +		fb.strides[i] = stride;
> +
> +	create_bo_for_fb(&fb);
> +
> +	if (size_ret)
> +		*size_ret = fb.size;
> +	if (stride_ret)
> +		*stride_ret = fb.strides[0];
> +	if (is_dumb)
> +		*is_dumb = fb.is_dumb;
> +
> +	return fb.gem_handle;
>  }
>  
>  /**
> @@ -860,52 +870,32 @@ igt_create_fb_with_bo_size(int fd, int width,
> int height,
>  	/* FIXME allow the caller to pass these in */
>  	enum igt_color_encoding color_encoding =
> IGT_COLOR_YCBCR_BT709;
>  	enum igt_color_range color_range =
> IGT_COLOR_YCBCR_LIMITED_RANGE;
> -	const struct format_desc_struct *f =
> lookup_drm_format(format);
> -	uint32_t pitches[4];
> -	uint32_t fb_id;
> -	int i;
>  
> -	igt_assert_f(f, "DRM format %08x not found\n", format);
> +	fb_init(fb, fd, width, height, format, tiling,
> +		color_encoding, color_range);
>  
> -	memset(fb, 0, sizeof(*fb));
> +	for (int i = 0; i < fb->num_planes; i++)
> +		fb->strides[i] = bo_stride;
> +
> +	fb->size = bo_size;
>  
>  	igt_debug("%s(width=%d, height=%d, format=0x%x,
> tiling=0x%"PRIx64", size=%"PRIu64")\n",
>  		  __func__, width, height, format, tiling, bo_size);
> -	fb->gem_handle = create_bo_for_fb(fd, width, height,
> -					  color_encoding,
> color_range,
> -					  f, tiling, bo_size,
> bo_stride,
> -					  &fb->size, &fb->stride,
> -					  fb->offsets, &fb-
> >is_dumb);
> +
> +	create_bo_for_fb(fb);
>  	igt_assert(fb->gem_handle > 0);
>  
>  	igt_debug("%s(handle=%d, pitch=%d)\n",
> -		  __func__, fb->gem_handle, fb->stride);
> +		  __func__, fb->gem_handle, fb->strides[0]);
>  
> -	for (i = 0; i < fb_num_planes(f); i++)
> -		pitches[i] = fb->stride;
> +	do_or_die(__kms_addfb(fb->fd, fb->gem_handle,
> +			      fb->width, fb->height,
> +			      fb->drm_format, fb->tiling,
> +			      fb->strides, fb->offsets, fb-
> >num_planes,
> +			      LOCAL_DRM_MODE_FB_MODIFIERS,
> +			      &fb->fb_id));
>  
> -	do_or_die(__kms_addfb(fd, fb->gem_handle, width, height,
> -			      format, tiling, pitches, fb->offsets,
> -			      fb_num_planes(f),
> -			      LOCAL_DRM_MODE_FB_MODIFIERS, &fb_id));
> -
> -	fb->width = width;
> -	fb->height = height;
> -	fb->tiling = tiling;
> -	fb->drm_format = format;
> -	fb->fb_id = fb_id;
> -	fb->fd = fd;
> -	fb->num_planes = fb_num_planes(f);
> -	fb->color_encoding = color_encoding;
> -	fb->color_range = color_range;
> -
> -	for (i = 0; i < fb_num_planes(f); i++) {
> -		fb->plane_bpp[i] = fb_plane_bpp(f, i);
> -		fb->plane_height[i] = fb_plane_height(f, height, i);
> -		fb->plane_width[i] = fb_plane_width(f, width, i);
> -	}
> -
> -	return fb_id;
> +	return fb->fb_id;
>  }
>  
>  /**
> @@ -1211,12 +1201,8 @@ static cairo_format_t
> drm_format_to_cairo(uint32_t drm_format)
>  }
>  
>  struct fb_blit_linear {
> -	uint64_t size;
> -	uint32_t handle;
> -	unsigned int stride;
> +	struct igt_fb fb;
>  	uint8_t *map;
> -	bool is_dumb;
> -	uint32_t offsets[4];
>  };
>  
>  struct fb_blit_upload {
> @@ -1233,27 +1219,27 @@ static void free_linear_mapping(struct
> fb_blit_upload *blit)
>  	unsigned int obj_tiling = igt_fb_mod_to_tiling(fb->tiling);
>  	int i;
>  
> -	gem_munmap(linear->map, linear->size);
> -	gem_set_domain(fd, linear->handle,
> +	gem_munmap(linear->map, linear->fb.size);
> +	gem_set_domain(fd, linear->fb.gem_handle,
>  		       I915_GEM_DOMAIN_GTT, 0);
>  
>  	for (i = 0; i < fb->num_planes; i++)
>  		igt_blitter_fast_copy__raw(fd,
> -					   linear->handle,
> -					   linear->offsets[i],
> -					   linear->stride,
> +					   linear->fb.gem_handle,
> +					   linear->fb.offsets[i],
> +					   linear->fb.strides[i],
>  					   I915_TILING_NONE,
>  					   0, 0, /* src_x, src_y */
>  					   fb->plane_width[i], fb-
> >plane_height[i],
>  					   fb->plane_bpp[i],
>  					   fb->gem_handle,
>  					   fb->offsets[i],
> -					   fb->stride,
> +					   fb->strides[i],
>  					   obj_tiling,
>  					   0, 0 /* dst_x, dst_y */);
>  
> -	gem_sync(fd, linear->handle);
> -	gem_close(fd, linear->handle);
> +	gem_sync(fd, linear->fb.gem_handle);
> +	gem_close(fd, linear->fb.gem_handle);
>  }
>  
>  static void destroy_cairo_surface__blit(void *arg)
> @@ -1277,42 +1263,42 @@ static void setup_linear_mapping(int fd,
> struct igt_fb *fb, struct fb_blit_linea
>  	 * cairo). This linear bo will be then blitted to its final
>  	 * destination, tiling it at the same time.
>  	 */
> -	linear->handle = create_bo_for_fb(fd, fb->width, fb->height,
> -					  fb->color_encoding, fb-
> >color_range,
> -					  lookup_drm_format(fb-
> >drm_format),
> -					  LOCAL_DRM_FORMAT_MOD_NONE,
> 0,
> -					  0, &linear->size,
> -					  &linear->stride,
> -					  linear->offsets, &linear-
> >is_dumb);
>  
> -	igt_assert(linear->handle > 0);
> +	fb_init(&linear->fb, fb->fd, fb->width, fb->height,
> +		fb->drm_format, LOCAL_DRM_FORMAT_MOD_NONE,
> +		fb->color_encoding, fb->color_range);
> +
> +	create_bo_for_fb(&linear->fb);
> +
> +	igt_assert(linear->fb.gem_handle > 0);
>  
>  	/* Copy fb content to linear BO */
> -	gem_set_domain(fd, linear->handle,
> +	gem_set_domain(fd, linear->fb.gem_handle,
>  			I915_GEM_DOMAIN_GTT, 0);
>  
>  	for (i = 0; i < fb->num_planes; i++)
>  		igt_blitter_fast_copy__raw(fd,
> -					  fb->gem_handle,
> -					  fb->offsets[i],
> -					  fb->stride,
> -					  obj_tiling,
> -					  0, 0, /* src_x, src_y */
> -					  fb->plane_width[i], fb-
> >plane_height[i],
> -					  fb->plane_bpp[i],
> -					  linear->handle, linear-
> >offsets[i],
> -					  linear->stride,
> -					  I915_TILING_NONE,
> -					  0, 0 /* dst_x, dst_y */);
> +					   fb->gem_handle,
> +					   fb->offsets[i],
> +					   fb->strides[i],
> +					   obj_tiling,
> +					   0, 0, /* src_x, src_y */
> +					   fb->plane_width[i], fb-
> >plane_height[i],
> +					   fb->plane_bpp[i],
> +					   linear->fb.gem_handle,
> +					   linear->fb.offsets[i],
> +					   linear->fb.strides[i],
> +					   I915_TILING_NONE,
> +					   0, 0 /* dst_x, dst_y */);
>  
> -	gem_sync(fd, linear->handle);
> +	gem_sync(fd, linear->fb.gem_handle);
>  
> -	gem_set_domain(fd, linear->handle,
> +	gem_set_domain(fd, linear->fb.gem_handle,
>  		       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
>  
>  	/* Setup cairo context */
> -	linear->map = gem_mmap__cpu(fd, linear->handle,
> -				    0, linear->size, PROT_READ |
> PROT_WRITE);
> +	linear->map = gem_mmap__cpu(fd, linear->fb.gem_handle,
> +				    0, linear->fb.size, PROT_READ |
> PROT_WRITE);
>  }
>  
>  static void create_cairo_surface__blit(int fd, struct igt_fb *fb)
> @@ -1332,7 +1318,7 @@ static void create_cairo_surface__blit(int fd,
> struct igt_fb *fb)
>  		cairo_image_surface_create_for_data(blit-
> >linear.map,
>  						    cairo_format,
>  						    fb->width, fb-
> >height,
> -						    blit-
> >linear.stride);
> +						    blit-
> >linear.fb.strides[0]);
>  	fb->domain = I915_GEM_DOMAIN_GTT;
>  
>  	cairo_surface_set_user_data(fb->cairo_surface,
> @@ -1382,7 +1368,7 @@ static void create_cairo_surface__gtt(int fd,
> struct igt_fb *fb)
>  	fb->cairo_surface =
>  		cairo_image_surface_create_for_data(ptr,
>  						    drm_format_to_ca
> iro(fb->drm_format),
> -						    fb->width, fb-
> >height, fb->stride);
> +						    fb->width, fb-
> >height, fb->strides[0]);
>  	fb->domain = I915_GEM_DOMAIN_GTT;
>  
>  	cairo_surface_set_user_data(fb->cairo_surface,
> @@ -1425,8 +1411,8 @@ static void convert_nv12_to_rgb24(struct igt_fb
> *fb, struct fb_convert_blit_uplo
>  	int i, j;
>  	const uint8_t *y, *uv;
>  	uint8_t *rgb24 = blit->rgb24.map;
> -	unsigned rgb24_stride = blit->rgb24.stride, planar_stride =
> blit->base.linear.stride;
> -	uint8_t *buf = malloc(blit->base.linear.size);
> +	unsigned rgb24_stride = blit->rgb24.stride, planar_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);
>  
> @@ -1435,9 +1421,9 @@ static void convert_nv12_to_rgb24(struct igt_fb
> *fb, struct fb_convert_blit_uplo
>  	 * 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.size);
> -	y = &buf[blit->base.linear.offsets[0]];
> -	uv = &buf[blit->base.linear.offsets[1]];
> +	igt_memcpy_from_wc(buf, blit->base.linear.map, blit-
> >base.linear.fb.size);
> +	y = &buf[blit->base.linear.fb.offsets[0]];
> +	uv = &buf[blit->base.linear.fb.offsets[1]];
>  
>  	for (i = 0; i < fb->height / 2; i++) {
>  		for (j = 0; j < fb->width / 2; j++) {
> @@ -1531,11 +1517,11 @@ static void convert_nv12_to_rgb24(struct
> igt_fb *fb, struct fb_convert_blit_uplo
>  static void convert_rgb24_to_nv12(struct igt_fb *fb, struct
> fb_convert_blit_upload *blit)
>  {
>  	int i, j;
> -	uint8_t *y = &blit->base.linear.map[blit-
> >base.linear.offsets[0]];
> -	uint8_t *uv = &blit->base.linear.map[blit-
> >base.linear.offsets[1]];
> +	uint8_t *y = &blit->base.linear.map[blit-
> >base.linear.fb.offsets[0]];
> +	uint8_t *uv = &blit->base.linear.map[blit-
> >base.linear.fb.offsets[1]];
>  	const uint8_t *rgb24 = blit->rgb24.map;
>  	unsigned rgb24_stride = blit->rgb24.stride;
> -	unsigned planar_stride = blit->base.linear.stride;
> +	unsigned planar_stride = blit->base.linear.fb.strides[0];
>  	struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb-
> >color_encoding,
>  						    fb-
> >color_range);
>  
> @@ -1662,8 +1648,8 @@ static void convert_yuyv_to_rgb24(struct igt_fb
> *fb, struct fb_convert_blit_uplo
>  	int i, j;
>  	const uint8_t *yuyv;
>  	uint8_t *rgb24 = blit->rgb24.map;
> -	unsigned rgb24_stride = blit->rgb24.stride, yuyv_stride =
> blit->base.linear.stride;
> -	uint8_t *buf = malloc(blit->base.linear.size);
> +	unsigned rgb24_stride = blit->rgb24.stride, yuyv_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);
>  
> @@ -1672,7 +1658,7 @@ static void convert_yuyv_to_rgb24(struct igt_fb
> *fb, struct fb_convert_blit_uplo
>  	 * 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.size);
> +	igt_memcpy_from_wc(buf, blit->base.linear.map, blit-
> >base.linear.fb.size);
>  	yuyv = buf;
>  
>  	for (i = 0; i < fb->height; i++) {
> @@ -1722,7 +1708,7 @@ static void convert_rgb24_to_yuyv(struct igt_fb
> *fb, struct fb_convert_blit_uplo
>  	uint8_t *yuyv = blit->base.linear.map;
>  	const uint8_t *rgb24 = blit->rgb24.map;
>  	unsigned rgb24_stride = blit->rgb24.stride;
> -	unsigned yuyv_stride = blit->base.linear.stride;
> +	unsigned yuyv_stride = blit->base.linear.fb.strides[0];
>  	struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb-
> >color_encoding,
>  						    fb-
> >color_range);
>  
> @@ -1791,7 +1777,7 @@ static void destroy_cairo_surface__convert(void
> *arg)
>  
>  	munmap(blit->rgb24.map, blit->rgb24.size);
>  
> -	if (blit->base.linear.handle)
> +	if (blit->base.linear.fb.gem_handle)
>  		free_linear_mapping(&blit->base);
>  	else
>  		gem_munmap(blit->base.linear.map, fb->size);
> @@ -1817,15 +1803,15 @@ static void create_cairo_surface__convert(int
> fd, struct igt_fb *fb)
>  	    fb->tiling == LOCAL_I915_FORMAT_MOD_Yf_TILED) {
>  		setup_linear_mapping(fd, fb, &blit->base.linear);
>  	} else {
> -		blit->base.linear.handle = 0;
> +		blit->base.linear.fb.gem_handle = 0;
>  		gem_set_domain(fd, fb->gem_handle,
>  			       I915_GEM_DOMAIN_GTT,
> I915_GEM_DOMAIN_GTT);
>  		blit->base.linear.map = gem_mmap__gtt(fd, fb-
> >gem_handle, fb->size,
>  						      PROT_READ |
> PROT_WRITE);
>  		igt_assert(blit->base.linear.map);
> -		blit->base.linear.stride = fb->stride;
> -		blit->base.linear.size = fb->size;
> -		memcpy(blit->base.linear.offsets, fb->offsets,
> sizeof(fb->offsets));
> +		blit->base.linear.fb.size = fb->size;
> +		memcpy(blit->base.linear.fb.strides, fb->strides,
> sizeof(fb->strides));
> +		memcpy(blit->base.linear.fb.offsets, fb->offsets,
> sizeof(fb->offsets));
>  	}
>  
>  	/* Convert to linear rgb! */
> diff --git a/lib/igt_fb.h b/lib/igt_fb.h
> index 2343fe505f28..35bf307a930b 100644
> --- a/lib/igt_fb.h
> +++ b/lib/igt_fb.h
> @@ -47,12 +47,12 @@
>   * @drm_format: DRM FOURCC code
>   * @width: width in pixels
>   * @height: height in pixels
> - * @stride: line stride in bytes
>   * @tiling: tiling mode as a DRM framebuffer modifier
>   * @size: size in bytes of the underlying backing storage
>   * @cairo_surface: optionally attached cairo drawing surface
>   * @domain: current domain for cache flushing tracking on i915.ko
>   * @num_planes: Amount of planes on this fb. >1 for planar formats.
> + * @strides: line stride for each plane in bytes
>   * @offsets: Offset for each plane in bytes.
>   * @plane_bpp: The bpp for each plane.
>   * @plane_width: The width for each plane.
> @@ -70,12 +70,12 @@ typedef struct igt_fb {
>  	int height;
>  	enum igt_color_encoding color_encoding;
>  	enum igt_color_range color_range;
> -	unsigned int stride;
>  	uint64_t tiling;
>  	uint64_t size;
>  	cairo_surface_t *cairo_surface;
>  	unsigned int domain;
>  	unsigned int num_planes;
> +	uint32_t strides[4];
>  	uint32_t offsets[4];
>  	unsigned int plane_bpp[4];
>  	unsigned int plane_width[4];
> diff --git a/tests/kms_ccs.c b/tests/kms_ccs.c
> index e1ee58801ac3..e03f947eae11 100644
> --- a/tests/kms_ccs.c
> +++ b/tests/kms_ccs.c
> @@ -378,7 +378,7 @@ static void generate_fb(data_t *data, struct
> igt_fb *fb,
>  	fb->drm_format = f.pixel_format;
>  	fb->width = f.width;
>  	fb->height = f.height;
> -	fb->stride = f.pitches[0];
> +	fb->strides[0] = f.pitches[0];
>  	fb->tiling = f.modifier[0];
>  	fb->size = size[0];
>  	fb->cairo_surface = NULL;
> diff --git a/tests/kms_flip.c b/tests/kms_flip.c
> index 393d690ab535..f7d08a60aeea 100644
> --- a/tests/kms_flip.c
> +++ b/tests/kms_flip.c
> @@ -592,7 +592,7 @@ static void recreate_fb(struct test_output *o)
>  	igt_assert(r);
>  
>  	do_or_die(drmModeAddFB(drm_fd, o->fb_width, o->fb_height, o-
> >depth,
> -			       o->bpp, fb_info->stride,
> +			       o->bpp, fb_info->strides[0],
>  			       r->handle, &new_fb_id));
>  
>  	gem_close(drm_fd, r->handle);
> @@ -612,7 +612,7 @@ static void set_y_tiling(struct test_output *o,
> int fb_idx)
>  	r = drmModeGetFB(drm_fd, fb_info->fb_id);
>  	igt_assert(r);
>  	/* Newer kernels don't allow such shenagians any more, so
> skip the test. */
> -	igt_require(__gem_set_tiling(drm_fd, r->handle,
> I915_TILING_Y, fb_info->stride) == 0);
> +	igt_require(__gem_set_tiling(drm_fd, r->handle,
> I915_TILING_Y, fb_info->strides[0]) == 0);
>  	gem_close(drm_fd, r->handle);
>  	drmFree(r);
>  }
> diff --git a/tests/kms_frontbuffer_tracking.c
> b/tests/kms_frontbuffer_tracking.c
> index 1bce676081b4..265c313a3886 100644
> --- a/tests/kms_frontbuffer_tracking.c
> +++ b/tests/kms_frontbuffer_tracking.c
> @@ -1157,7 +1157,7 @@ static void start_busy_thread(struct igt_fb
> *fb)
>  	busy_thread.stop = false;
>  	busy_thread.handle = fb->gem_handle;
>  	busy_thread.size = fb->size;
> -	busy_thread.stride = fb->stride;
> +	busy_thread.stride = fb->strides[0];
>  	busy_thread.width = fb->width;
>  	busy_thread.height = fb->height;
>  	busy_thread.color = pick_color(fb, COLOR_PRIM_BG);
> @@ -2859,7 +2859,7 @@ static void badstride_subtest(const struct
> test_mode *t)
>  
>  	create_fb(t->format, params->primary.fb->width + 4096,
> params->primary.fb->height,
>  		  opt.tiling, t->plane, &wide_fb);
> -	igt_assert(wide_fb.stride > 16384);
> +	igt_assert(wide_fb.strides[0] > 16384);
>  
>  	fill_fb(&wide_fb, COLOR_PRIM_BG);
>  
> @@ -2928,7 +2928,7 @@ static void stridechange_subtest(const struct
> test_mode *t)
>  		  opt.tiling, t->plane, &new_fb);
>  	fill_fb(&new_fb, COLOR_PRIM_BG);
>  
> -	igt_assert(old_fb->stride != new_fb.stride);
> +	igt_assert(old_fb->strides[0] != new_fb.strides[0]);
>  
>  	/* We can't assert that FBC will be enabled since there may
> not be
>  	 * enough space for the CFB, but we can check the CRC. */
> diff --git a/tests/pm_rpm.c b/tests/pm_rpm.c
> index c24fd95bb0f3..2d6c5b49c9d5 100644
> --- a/tests/pm_rpm.c
> +++ b/tests/pm_rpm.c
> @@ -1547,7 +1547,7 @@ static void cursor_subtest(bool dpms)
>  	 * hopefully it has some fences around it. */
>  	rc = drmModeRmFB(drm_fd, cursor_fb3.fb_id);
>  	igt_assert_eq(rc, 0);
> -	gem_set_tiling(drm_fd, cursor_fb3.gem_handle, false,
> cursor_fb3.stride);
> +	gem_set_tiling(drm_fd, cursor_fb3.gem_handle, false,
> cursor_fb3.strides[0]);
>  	igt_assert(wait_for_suspended());
>  
>  	rc = drmModeSetCursor(drm_fd, crtc_id,
> cursor_fb3.gem_handle,


More information about the igt-dev mailing list