From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Cc: igt-dev@lists.freedesktop.org, ville.syrjala@intel.com,
juha-pekka.heikkila@intel.com
Subject: Re: [igt-dev] [PATCH i-g-t v3] lib/igt_fb: Added XYUV format support for testing
Date: Wed, 5 Sep 2018 15:49:16 +0300 [thread overview]
Message-ID: <20180905124916.GP5565@intel.com> (raw)
In-Reply-To: <20180905120300.3383-1-stanislav.lisovskiy@intel.com>
On Wed, Sep 05, 2018 at 03:03:00PM +0300, Stanislav Lisovskiy wrote:
> XYUV format support has been added to DRM, modified
> IGT to reflect those changes.
>
> v2: Fixed merge conflict, started to use new yuv<=>rgb
> conversion functions.
>
> v3: Fixed kms_available_modes_crc test to support new XYUV
> format. Fixed a problem, where test complains that two
> outputs might use same pipe at the same time.
>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> ---
> include/drm-uapi/drm_fourcc.h | 1 +
> lib/igt_fb.c | 93 +++++++++++++++++++++++++++++++++
> tests/kms_available_modes_crc.c | 2 +
> 3 files changed, 96 insertions(+)
>
> diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h
> index e04613d3..0bf66de2 100644
> --- a/include/drm-uapi/drm_fourcc.h
> +++ b/include/drm-uapi/drm_fourcc.h
> @@ -112,6 +112,7 @@ extern "C" {
> #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
>
> #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
> +#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
>
> /*
> * 2 plane RGB + A
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index ae71d967..2d0311ae 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -72,6 +72,10 @@ static struct format_desc_struct {
> .cairo_id = CAIRO_FORMAT_RGB16_565,
> .num_planes = 1, .plane_bpp = { 16, },
> },
> + { .name = "XYUV", .depth = 24, .drm_id = DRM_FORMAT_XYUV,
> + .cairo_id = CAIRO_FORMAT_RGB24,
> + .num_planes = 1, .plane_bpp = { 32, },
> + },
> { .name = "XRGB8888", .depth = 24, .drm_id = DRM_FORMAT_XRGB8888,
> .cairo_id = CAIRO_FORMAT_RGB24,
> .num_planes = 1, .plane_bpp = { 32, },
> @@ -1500,6 +1504,88 @@ static void convert_nv12_to_rgb24(struct igt_fb *fb, struct fb_convert_blit_uplo
> free(buf);
> }
>
> +static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct fb_convert_blit_upload *blit)
> +{
> + int i, j;
> + uint8_t *yuv24;
> + uint8_t *rgb24 = blit->rgb24.map;
> + unsigned rgb24_stride = blit->rgb24.stride, planar_stride = blit->linear.stride;
> + uint8_t *buf = malloc(blit->linear.size);
> + struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb->color_encoding,
> + fb->color_range);
> +
> + /*
> + * Reading from the BO is awfully slow because of lack of read caching,
> + * it's faster to copy the whole BO to a temporary buffer and convert
> + * from there.
> + */
> + igt_memcpy_from_wc(buf, blit->linear.map, blit->linear.size);
> + yuv24 = &buf[blit->linear.offsets[0]];
> +
> + for (i = 0; i < fb->plane_height[0]; i++) {
> + for (j = 0; j < fb->plane_width[0]; j++) {
> + float y, u, v;
> + struct igt_vec4 yuv;
> + struct igt_vec4 rgb;
> +
> + v = yuv24[i * planar_stride + j*sizeof(uint32_t)];
> + u = yuv24[i * planar_stride + j*sizeof(uint32_t) + 1];
> + y = yuv24[i * planar_stride + j*sizeof(uint32_t) + 2];
> + yuv.d[0] = v;
> + yuv.d[1] = u;
> + yuv.d[2] = y;
This should be [0]=y [1]=u [2]=v.
> + yuv.d[3] = 1.0f;
> +
> + rgb = igt_matrix_transform(&m, &yuv);
> +
> + write_rgb(&rgb24[i * rgb24_stride + j*sizeof(uint32_t)], &rgb);
> + }
> + }
> +
> + free(buf);
> +}
> +
> +
> +static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct fb_convert_blit_upload *blit)
> +{
> + int i, j;
> + uint8_t *rgb24;
> + uint8_t *yuv444 = blit->linear.map;
> + unsigned rgb24_stride = blit->rgb24.stride, planar_stride = blit->linear.stride;
> + uint8_t *buf = malloc(blit->linear.size);
> + struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb->color_encoding,
> + fb->color_range);
> +
> + /*
> + * Reading from the BO is awfully slow because of lack of read caching,
> + * it's faster to copy the whole BO to a temporary buffer and convert
> + * from there.
> + */
> + igt_memcpy_from_wc(buf, blit->rgb24.map, blit->linear.size);
> + rgb24 = &buf[blit->linear.offsets[0]];
> +
> + for (i = 0; i < fb->plane_height[0]; i++) {
> + for (j = 0; j < fb->plane_width[0]; j++) {
> + struct igt_vec4 rgb;
> + struct igt_vec4 yuv;
> + float y, u, v;
> +
> + read_rgb(&rgb, &rgb24[i * rgb24_stride + j*sizeof(uint32_t)]);
> +
> + yuv = igt_matrix_transform(&m, &rgb);
> +
> + yuv444[i * planar_stride + j*sizeof(uint32_t)] = yuv.d[0];
> + yuv444[i * planar_stride + j*sizeof(uint32_t) + 1] = yuv.d[1];
> + yuv444[i * planar_stride + j*sizeof(uint32_t) + 2] = yuv.d[2];
And looks like the vector elements are swapped here as well.
Also you should add xuyv handling to create_bo_for_fb() so that a
freshly allocated xuyv fb contains all black.
> + }
> + }
> +
> + free(buf);
> +}
> +
> +
> +
> +
> static void convert_rgb24_to_nv12(struct igt_fb *fb, struct fb_convert_blit_upload *blit)
> {
> int i, j;
> @@ -1756,6 +1842,9 @@ static void destroy_cairo_surface__convert(void *arg)
> case DRM_FORMAT_VYUY:
> convert_rgb24_to_yuyv(fb, blit, yuyv_swizzle(fb->drm_format));
> break;
> + case DRM_FORMAT_XYUV:
> + convert_rgb24_to_yuv444(fb, blit);
> + break;
> default:
> igt_assert_f(false, "Conversion not implemented for formats 0x%x\n",
> fb->drm_format);
> @@ -1809,6 +1898,9 @@ static void create_cairo_surface__convert(int fd, struct igt_fb *fb)
> case DRM_FORMAT_VYUY:
> convert_yuyv_to_rgb24(fb, blit, yuyv_swizzle(fb->drm_format));
> break;
> + case DRM_FORMAT_XYUV:
> + convert_yuv444_to_rgb24(fb, blit);
> + break;
> default:
> igt_assert_f(false, "Conversion not implemented for formats 0x%x\n",
> fb->drm_format);
> @@ -1825,6 +1917,7 @@ static void create_cairo_surface__convert(int fd, struct igt_fb *fb)
> blit, destroy_cairo_surface__convert);
> }
>
> +
> /**
> * igt_get_cairo_surface:
> * @fd: open drm file descriptor
> diff --git a/tests/kms_available_modes_crc.c b/tests/kms_available_modes_crc.c
> index b67b4f83..514bf372 100644
> --- a/tests/kms_available_modes_crc.c
> +++ b/tests/kms_available_modes_crc.c
This should be a separate patch.
> @@ -150,6 +150,7 @@ static const struct {
> { DRM_FORMAT_YVYU, 0, BYTES_PP_4, 0x80eb80eb},
> { DRM_FORMAT_VYUY, 0, BYTES_PP_4, 0xeb80eb80},
> { DRM_FORMAT_UYVY, 0, BYTES_PP_4, 0xeb80eb80},
> + { DRM_FORMAT_XYUV, 0, BYTES_PP_4, 0xffffffff},
>
> /*
> * (semi-)planar formats
> @@ -479,6 +480,7 @@ test_available_modes(data_t* data)
> }
> igt_pipe_crc_stop(data->pipe_crc);
> igt_pipe_crc_free(data->pipe_crc);
> + igt_output_set_pipe(output, PIPE_NONE);
> igt_display_commit2(&data->display, data->commit);
> }
> igt_assert(invalids == 0);
> --
> 2.17.0
>
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
--
Ville Syrjälä
Intel
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
next prev parent reply other threads:[~2018-09-05 12:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-05 12:03 [igt-dev] [PATCH i-g-t v3] lib/igt_fb: Added XYUV format support for testing Stanislav Lisovskiy
2018-09-05 12:49 ` Ville Syrjälä [this message]
2018-09-07 8:31 ` Lisovskiy, Stanislav
2018-09-05 13:01 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_fb: Added XYUV format support for testing (rev3) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180905124916.GP5565@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=juha-pekka.heikkila@intel.com \
--cc=stanislav.lisovskiy@intel.com \
--cc=ville.syrjala@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.