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

Ville Syrjala ville.syrjala at linux.intel.com
Thu Jul 19 15:03:56 UTC 2018


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.

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)
-- 
2.16.4



More information about the igt-dev mailing list