[igt-dev] [PATCH i-g-t v4 12/21] lib/igt_fb: Support converting to VC4 modifiers in igt_fb_convert
Lyude Paul
lyude at redhat.com
Tue Jan 29 19:19:28 UTC 2019
Reviewed-by: Lyude Paul <lyude at redhat.com>
On Fri, 2019-01-25 at 15:06 +0100, Paul Kocialkowski wrote:
> This pipes-in support for the VC4 modifiers that we have conversion
> helpers for. A new temporary linear framebuffer is introduced, that
> is either freed later or copied to the destination framebuffer
> pointer.
>
> Signed-off-by: Paul Kocialkowski <paul.kocialkowski at bootlin.com>
> ---
> lib/igt_fb.c | 36 +++++++++++++++++++++++++++++++-----
> 1 file changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index b24356fa07e4..42c758cadfdd 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -2273,23 +2273,30 @@ unsigned int igt_fb_convert_with_stride(struct
> igt_fb *dst, struct igt_fb *src,
> unsigned int dst_stride)
> {
> struct fb_convert cvt = { };
> + struct igt_fb linear;
> void *dst_ptr, *src_ptr;
> + uint64_t base_modifier;
> int fb_id;
>
> + if (is_vc4_device(src->fd))
> + base_modifier = fourcc_mod_broadcom_mod(dst_modifier);
> + else
> + base_modifier = dst_modifier;
> +
> 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);
> + LOCAL_DRM_FORMAT_MOD_NONE, &linear,
> + 0, dst_stride);
> igt_assert(fb_id > 0);
>
> src_ptr = igt_fb_map_buffer(src->fd, src);
> igt_assert(src_ptr);
>
> - dst_ptr = igt_fb_map_buffer(dst->fd, dst);
> + dst_ptr = igt_fb_map_buffer(linear.fd, &linear);
> igt_assert(dst_ptr);
>
> cvt.dst.ptr = dst_ptr;
> - cvt.dst.fb = dst;
> + cvt.dst.fb = &linear;
> cvt.src.ptr = src_ptr;
> cvt.src.fb = src;
> fb_convert(&cvt);
> @@ -2297,7 +2304,26 @@ unsigned int igt_fb_convert_with_stride(struct igt_fb
> *dst, struct igt_fb *src,
> igt_fb_unmap_buffer(dst, dst_ptr);
> igt_fb_unmap_buffer(src, src_ptr);
>
> - igt_assert(dst_modifier == LOCAL_DRM_FORMAT_MOD_NONE);
> + switch (base_modifier) {
> + case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:
> + fb_id = igt_vc4_fb_t_tiled_convert(dst, &linear);
> + break;
> + case DRM_FORMAT_MOD_BROADCOM_SAND32:
> + case DRM_FORMAT_MOD_BROADCOM_SAND64:
> + case DRM_FORMAT_MOD_BROADCOM_SAND128:
> + case DRM_FORMAT_MOD_BROADCOM_SAND256:
> + fb_id = vc4_fb_sand_tiled_convert(dst, &linear, dst_modifier);
> + break;
> + default:
> + igt_assert(dst_modifier == LOCAL_DRM_FORMAT_MOD_NONE);
> + }
> +
> + igt_assert(fb_id > 0);
> +
> + if (dst_modifier == LOCAL_DRM_FORMAT_MOD_NONE)
> + *dst = linear;
> + else
> + igt_remove_fb(linear.fd, &linear);
>
> return fb_id;
> }
--
Cheers,
Lyude Paul
More information about the igt-dev
mailing list