[igt-dev] [PATCH i-g-t v5 07/22] lib/igt_fb: Add a stride-provisioned fashion of igt_fb_convert

Paul Kocialkowski
2019-02-20T15:39:49Z

The current implementation of igt_fb_convert does not allow passing
the destination stride, which is something we want to change for tests.

Add a new fashion of this function that allocates the desintation buffer
with a given stride. Since the current function does the same thing with
an unspecified stride (set to zero, which will be filled later), make it
call our new fashion with the stride set to zero to avoid duplication.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Maxime Ripard <maxime.ripard@bootlin.com>
---
lib/igt_fb.c | 38 ++++++++++++++++++++++++++++++++------
lib/igt_fb.h | 3 +++
2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 8a8875f8a5b2..20244a613fd3 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -2549,14 +2549,15 @@ void igt_remove_fb(int fd, struct igt_fb *fb)
}

/**
- * igt_fb_convert:
+ * igt_fb_convert_with_stride:
* @dst: pointer to the #igt_fb structure that will store the conversion result
* @src: pointer to the #igt_fb structure that stores the frame we convert
* @dst_fourcc: DRM format specifier to convert to
+ * @dst_stride: Stride for the resulting framebuffer (0 for automatic stride)
*
* This will convert a given @src content to the @dst_fourcc format,
* storing the result in the @dst fb, allocating the @dst fb
- * underlying buffer.
+ * underlying buffer with a stride of @dst_stride stride.
*
* Once done with @dst, the caller will have to call igt_remove_fb()
* on it to free the associated resources.
@@ -2564,15 +2565,18 @@ void igt_remove_fb(int fd, struct igt_fb *fb)
* Returns:
* The kms id of the created framebuffer.
*/
-unsigned int igt_fb_convert(struct igt_fb *dst, struct igt_fb *src,
- uint32_t dst_fourcc)
+unsigned int igt_fb_convert_with_stride(struct igt_fb *dst, struct igt_fb *src,
+ uint32_t dst_fourcc,
+ unsigned int dst_stride)
{
struct fb_convert cvt = { };
void *dst_ptr, *src_ptr;
int fb_id;

- fb_id = igt_create_fb(src->fd, src->width, src->height,
- dst_fourcc, LOCAL_DRM_FORMAT_MOD_NONE, dst);
+ fb_id = igt_create_fb_with_bo_size(src->fd, src->width, src->height,
+ dst_fourcc,
+ LOCAL_DRM_FORMAT_MOD_NONE,
+ dst, 0, dst_stride);
igt_assert(fb_id > 0);

src_ptr = igt_fb_map_buffer(src->fd, src);
@@ -2593,6 +2597,28 @@ unsigned int igt_fb_convert(struct igt_fb *dst, struct igt_fb *src,
return fb_id;
}

+/**
+ * igt_fb_convert:
+ * @dst: pointer to the #igt_fb structure that will store the conversion result
+ * @src: pointer to the #igt_fb structure that stores the frame we convert
+ * @dst_fourcc: DRM format specifier to convert to
+ *
+ * This will convert a given @src content to the @dst_fourcc format,
+ * storing the result in the @dst fb, allocating the @dst fb
+ * underlying buffer.
+ *
+ * Once done with @dst, the caller will have to call igt_remove_fb()
+ * on it to free the associated resources.
+ *
+ * Returns:
+ * The kms id of the created framebuffer.
+ */
+unsigned int igt_fb_convert(struct igt_fb *dst, struct igt_fb *src,
+ uint32_t dst_fourcc)
+{
+ return igt_fb_convert_with_stride(dst, src, dst_fourcc, 0);
+}
+
/**
* igt_bpp_depth_to_drm_format:
* @bpp: desired bits per pixel
diff --git a/lib/igt_fb.h b/lib/igt_fb.h
index 8c683db5e9ec..232370bd47a0 100644
--- a/lib/igt_fb.h
+++ b/lib/igt_fb.h
@@ -136,6 +136,9 @@ unsigned int igt_create_image_fb(int drm_fd, int width, int height,
struct igt_fb *fb /* out */);
unsigned int igt_create_stereo_fb(int drm_fd, drmModeModeInfo *mode,
uint32_t format, uint64_t tiling);
+unsigned int igt_fb_convert_with_stride(struct igt_fb *dst, struct igt_fb *src,
+ uint32_t dst_fourcc,
+ unsigned int stride);
unsigned int igt_fb_convert(struct igt_fb *dst, struct igt_fb *src,
uint32_t dst_fourcc);
void igt_remove_fb(int fd, struct igt_fb *fb);