[igt-dev] [PATCH i-g-t 06/25] lib/igt_fb: Respect the users choice of stride

Paulo Zanoni paulo.r.zanoni at intel.com
Fri Sep 21 00:04:59 UTC 2018


Em Qui, 2018-07-19 às 18:03 +0300, Ville Syrjala escreveu:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> We prented to allow the caller to specify the stride explicitly for
> the
> fb. But we don't actually use that user specified stride when we
> calculate the require bo size. Fix that oversight.
> 

Requires simple rebase.

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

> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  lib/igt_fb.c | 37 ++++++++++++++++++++++---------------
>  1 file changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index ae71d9673228..6748357ad16b 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -215,11 +215,12 @@ static unsigned planar_height(struct
> format_desc_struct *format, unsigned height
>  
>  static void calc_fb_size_planar(int fd, int width, int height,
>  				struct format_desc_struct *format,
> -				uint64_t tiling, unsigned *size_ret,
> -				unsigned *stride_ret, unsigned
> *offsets)
> +				uint64_t tiling, unsigned stride,
> +				unsigned *size_ret, unsigned
> *stride_ret,
> +				unsigned *offsets)
>  {
>  	int plane;
> -	unsigned stride = 0, tile_width, tile_height;
> +	unsigned max_stride = 0, tile_width, tile_height;
>  
>  	*size_ret = 0;
>  
> @@ -229,10 +230,13 @@ static void calc_fb_size_planar(int fd, int
> width, int height,
>  		igt_get_fb_tile_size(fd, tiling, format-
> >plane_bpp[plane], &tile_width, &tile_height);
>  
>  		plane_stride = ALIGN(planar_stride(format, width,
> plane), tile_width);
> -		if (stride < plane_stride)
> -			stride = plane_stride;
> +		if (max_stride < plane_stride)
> +			max_stride = plane_stride;
>  	}
>  
> +	if (!stride)
> +		stride = max_stride;
> +
>  	for (plane = 0; plane < format->num_planes; plane++) {
>  		if (offsets)
>  			offsets[plane] = *size_ret;
> @@ -251,9 +255,9 @@ static void calc_fb_size_planar(int fd, int
> width, int height,
>  
>  static void calc_fb_size_packed(int fd, int width, int height,
>  				struct format_desc_struct *format,
> uint64_t tiling,
> -				unsigned *size_ret, unsigned
> *stride_ret)
> +				unsigned stride, unsigned *size_ret,
> unsigned *stride_ret)
>  {
> -	unsigned int tile_width, tile_height, stride, size;
> +	unsigned int tile_width, tile_height, size;
>  	int byte_width = width * (format->plane_bpp[0] / 8);
>  
>  	igt_get_fb_tile_size(fd, tiling, format->plane_bpp[0],
> &tile_width, &tile_height);
> @@ -270,15 +274,18 @@ static void calc_fb_size_packed(int fd, int
> width, int height,
>  		 * tiled. But then that failure is expected.
>  		 */
>  
> -		v = byte_width;
> -		for (stride = 512; stride < v; stride *= 2)
> -			;
> +		if (!stride) {
> +			v = byte_width;
> +			for (stride = 512; stride < v; stride *= 2)
> +				;
> +		}
>  
>  		v = stride * height;
>  		for (size = 1024*1024; size < v; size *= 2)
>  			;
>  	} else {
> -		stride = ALIGN(byte_width, tile_width);
> +		if (!stride)
> +			stride = ALIGN(byte_width, tile_width);
>  		size = stride * ALIGN(height, tile_height);
>  	}
>  
> @@ -306,9 +313,9 @@ void igt_calc_fb_size(int fd, int width, int
> height, uint32_t drm_format, uint64
>  	igt_assert(format);
>  
>  	if (format->num_planes > 1)
> -		calc_fb_size_planar(fd, width, height, format,
> tiling, size_ret, stride_ret, NULL);
> +		calc_fb_size_planar(fd, width, height, format,
> tiling, 0, size_ret, stride_ret, NULL);
>  	else
> -		calc_fb_size_packed(fd, width, height, format,
> tiling, size_ret, stride_ret);
> +		calc_fb_size_packed(fd, width, height, format,
> tiling, 0, size_ret, stride_ret);
>  }
>  
>  /**
> @@ -383,10 +390,10 @@ static int create_bo_for_fb(int fd, int width,
> int height,
>  		unsigned calculated_size, calculated_stride;
>  
>  		if (format->num_planes > 1)
> -			calc_fb_size_planar(fd, width, height,
> format, tiling,
> +			calc_fb_size_planar(fd, width, height,
> format, tiling, stride,
>  					    &calculated_size,
> &calculated_stride, offsets);
>  		else
> -			calc_fb_size_packed(fd, width, height,
> format, tiling,
> +			calc_fb_size_packed(fd, width, height,
> format, tiling, stride,
>  					    &calculated_size,
> &calculated_stride);
>  
>  		if (stride == 0)


More information about the igt-dev mailing list