All of lore.kernel.org
 help / color / mirror / Atom feed
From: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	igt-dev@lists.freedesktop.org
Subject: Re: [igt-dev] [PATCH v2 2/4] lib/igt_fb: Add support for P01x formats, v4.
Date: Thu, 7 Feb 2019 14:20:50 +0200	[thread overview]
Message-ID: <2f85ca13-07eb-1878-da05-a74470e56e15@gmail.com> (raw)
In-Reply-To: <f7f2d229-0712-8b4e-4c36-593e9c8ff851@linux.intel.com>

On 7.2.2019 14.10, Maarten Lankhorst wrote:
> Op 07-02-2019 om 12:52 schreef Juha-Pekka Heikkila:
>> On 7.2.2019 11.21, Maarten Lankhorst wrote:
>>> The P01x formats are planar 16 bits per component, with the unused lower bits set to 0.
>>> This means they can all be converted the same way. Only the range is slightly different,
>>> and this is handled in the color_encoding implementation.
>>>
>>> This requires cairo 1.17.2 and pixman 0.36. This works but doesn't give extra precision.
>>> For more than 8 bits precision a few more patches are required to pixman, pending review:
>>> https://lists.freedesktop.org/archives/pixman/2019-January/004815.html
>>> https://lists.freedesktop.org/archives/pixman/2019-January/004809.html
>>>
>>> Once those are merged, we will require the next pixman release for better precision.
>>>
>>> Changes since v1:
>>> - Add fallback color definitions when compiling on cairo version < 1.17.2.
>>> - Skip when FB creation fails on HDR formats, instead of failing.
>>> Changes since v2:
>>> - Complain slightly harder when pixman/cairo are out of date.
>>> - Create a fb with alpha when converting to pixman formats with alpha.
>>> - Oops, s/pixman_format_code_t/cairo_format_t/
>>> Changes since v3:
>>> - Rebase on top of upstream YUV changes.
>>>
>>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>>> ---
>>>    configure.ac                  |  11 +-
>>>    include/drm-uapi/drm_fourcc.h |  10 ++
>>>    lib/igt_color_encoding.c      |   4 +
>>>    lib/igt_fb.c                  | 293 +++++++++++++++++++++++++++++++++-
>>>    lib/igt_fb.h                  |   6 +
>>>    meson.build                   |  10 ++
>>>    6 files changed, 329 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/configure.ac b/configure.ac
>>> index b46f024f875a..a333cf8d6dbb 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -136,10 +136,17 @@ fi
>>>    PKG_CHECK_MODULES(XRANDR, xrandr >= 1.3, AC_DEFINE(HAVE_XRANDR, 1, [Have libXrandr]), [have_xrandr=no])
>>>      # for testdisplay
>>> -PKG_CHECK_MODULES(CAIRO, [cairo >= 1.12.0])
>>> +PKG_CHECK_MODULES(CAIRO, [cairo >= 1.17.2], [],
>>> +    [AC_MSG_WARN([Cairo too old, HDR formats not available. Upgrade to cairo 1.17.2])
>>> +    PKG_CHECK_MODULES(CAIRO, [cairo >= 1.12.0])]
>>> +)
>>>    PKG_CHECK_MODULES(LIBUDEV, [libudev])
>>>    PKG_CHECK_MODULES(GLIB, [glib-2.0])
>>> -PKG_CHECK_MODULES(PIXMAN, [pixman-1])
>>> +PKG_CHECK_MODULES(PIXMAN, [pixman-1 >= 0.36.0], [], [
>>> +    AC_MSG_WARN([Pixman too old, HDR formats not available. Upgrade to pixman 0.36.0])
>>> +    PKG_CHECK_MODULES(PIXMAN, [pixman-1])
>>> +])
>>> +
>>>    PKG_CHECK_MODULES(GSL, [gsl], [gsl=yes], [gsl=no])
>>>    AM_CONDITIONAL(HAVE_GSL, [test "x$gsl" = xyes])
>>>    diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h
>>> index 41106c835747..fe6b66ef1756 100644
>>> --- a/include/drm-uapi/drm_fourcc.h
>>> +++ b/include/drm-uapi/drm_fourcc.h
>>> @@ -195,6 +195,16 @@ extern "C" {
>>>    #define DRM_FORMAT_NV24        fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */
>>>    #define DRM_FORMAT_NV42        fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */
>>>    +/*
>>> + * 2 plane YCbCr
>>> + * index 0 = Y plane, [15:0] Y little endian where Pxxx indicate
>>> + * component xxx msb Y [xxx:16-xxx]
>>> + * index 1 = Cr:Cb plane, [31:0] Cr:Cb little endian [xxx:16-xxx:xxx:16-xxx]
>>> + */
>>> +#define DRM_FORMAT_P010        fourcc_code('P', '0', '1', '0') /* 2x2 subsampled Cr:Cb plane, 10 bit per channel */
>>> +#define DRM_FORMAT_P012        fourcc_code('P', '0', '1', '2') /* 2x2 subsampled Cr:Cb plane, 12 bit per channel */
>>> +#define DRM_FORMAT_P016        fourcc_code('P', '0', '1', '6') /* 2x2 subsampled Cr:Cb plane, 16 bit per channel */
>>> +
>>>    /*
>>>     * 3 plane YCbCr
>>>     * index 0: Y plane, [7:0] Y
>>> diff --git a/lib/igt_color_encoding.c b/lib/igt_color_encoding.c
>>> index 4cbe18e217e3..b7a12a1e07f7 100644
>>> --- a/lib/igt_color_encoding.c
>>> +++ b/lib/igt_color_encoding.c
>>> @@ -135,11 +135,15 @@ static const struct color_encoding_format {
>>>        float ofs_y, max_y, ofs_cbcr, mid_cbcr, max_cbcr;
>>>    } formats[] = {
>>>        { DRM_FORMAT_XRGB8888, 255.f, },
>>> +    { IGT_FORMAT_FLOAT, 1.f, },
>>>        { DRM_FORMAT_NV12, 255.f, 16.f, 235.f, 16.f, 128.f, 240.f },
>>>        { DRM_FORMAT_YUYV, 255.f, 16.f, 235.f, 16.f, 128.f, 240.f },
>>>        { DRM_FORMAT_YVYU, 255.f, 16.f, 235.f, 16.f, 128.f, 240.f },
>>>        { DRM_FORMAT_UYVY, 255.f, 16.f, 235.f, 16.f, 128.f, 240.f },
>>>        { DRM_FORMAT_VYUY, 255.f, 16.f, 235.f, 16.f, 128.f, 240.f },
>>> +    { DRM_FORMAT_P010, 65472.f, 4096.f, 60160.f, 4096.f, 32768.f, 61440.f },
>>> +    { DRM_FORMAT_P012, 65520.f, 4096.f, 60160.f, 4096.f, 32768.f, 61440.f },
>>> +    { DRM_FORMAT_P016, 65535.f, 4096.f, 60160.f, 4096.f, 32768.f, 61440.f },
>>>    };
>>>      static const struct color_encoding_format *lookup_fourcc(uint32_t fourcc)
>>> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
>>> index db3ae06748d1..12763cc85c86 100644
>>> --- a/lib/igt_fb.c
>>> +++ b/lib/igt_fb.c
>>> @@ -62,6 +62,20 @@
>>>      #define PIXMAN_invalid    0
>>>    +#if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 17, 2)
>>> +/*
>>> + * We need cairo 1.17.2 to use HDR formats, but the only thing added is a value
>>> + * to cairo_format_t.
>>> + *
>>> + * To prevent going outside the enum, make cairo_format_t an int and define
>>> + * ourselves.
>>> + */
>>> +
>>> +#define CAIRO_FORMAT_RGB96F (6)
>>> +#define CAIRO_FORMAT_RGBA128F (7)
>>> +#define cairo_format_t int
>>> +#endif
>>> +
>>>    /* drm fourcc/cairo format maps */
>>>    static const struct format_desc_struct {
>>>        const char *name;
>>> @@ -170,6 +184,25 @@ static const struct format_desc_struct {
>>>          .num_planes = 1, .plane_bpp = { 16, },
>>>          .hsub = 2, .vsub = 1,
>>>        },
>>> +    { .name = "P010", .depth = -1, .drm_id = DRM_FORMAT_P010,
>>> +      .cairo_id = CAIRO_FORMAT_RGB96F,
>>> +      .num_planes = 2, .plane_bpp = { 16, 32 },
>>> +      .vsub = 2, .hsub = 2,
>>> +    },
>>> +    { .name = "P012", .depth = -1, .drm_id = DRM_FORMAT_P012,
>>> +      .cairo_id = CAIRO_FORMAT_RGB96F,
>>> +      .num_planes = 2, .plane_bpp = { 16, 32 },
>>> +      .vsub = 2, .hsub = 2,
>>> +    },
>>> +    { .name = "P016", .depth = -1, .drm_id = DRM_FORMAT_P016,
>>> +      .cairo_id = CAIRO_FORMAT_RGB96F,
>>> +      .num_planes = 2, .plane_bpp = { 16, 32 },
>>> +      .vsub = 2, .hsub = 2,
>>> +    },
>>> +    { .name = "IGT-FLOAT", .depth = -1, .drm_id = IGT_FORMAT_FLOAT,
>>> +      .cairo_id = CAIRO_FORMAT_INVALID,
>>> +      .num_planes = 1, .plane_bpp = { 128 },
>>> +    },
>>>    };
>>>    #define for_each_format(f)    \
>>>        for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++)
>>> @@ -520,6 +553,14 @@ static void clear_yuv_buffer(struct igt_fb *fb)
>>>                full_range ? 0x00800080 : 0x10801080,
>>>                fb->strides[0] * fb->plane_height[0] / sizeof(wchar_t));
>>>            break;
>>> +    case DRM_FORMAT_P010:
>>> +    case DRM_FORMAT_P012:
>>> +    case DRM_FORMAT_P016:
>>> +        wmemset(ptr, full_range ? 0 : 0x10001000,
>>> +            fb->offsets[1] / sizeof(wchar_t));
>>> +        wmemset(ptr + fb->offsets[1], 0x80008000,
>>> +            fb->strides[1] * fb->plane_height[1] / sizeof(wchar_t));
>>> +        break;
>>>        }
>>>          igt_fb_unmap_buffer(fb, ptr);
>>> @@ -1496,6 +1537,7 @@ struct fb_convert_blit_upload {
>>>    };
>>>      static void *igt_fb_create_cairo_shadow_buffer(int fd,
>>> +                           unsigned drm_format,
>>>                               unsigned int width,
>>>                               unsigned int height,
>>>                               struct igt_fb *shadow)
>>> @@ -1505,7 +1547,7 @@ static void *igt_fb_create_cairo_shadow_buffer(int fd,
>>>        igt_assert(shadow);
>>>          fb_init(shadow, fd, width, height,
>>> -        DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE,
>>> +        drm_format, LOCAL_DRM_FORMAT_MOD_NONE,
>>>            IGT_COLOR_YCBCR_BT709, IGT_COLOR_YCBCR_LIMITED_RANGE);
>>>          shadow->strides[0] = ALIGN(width * shadow->plane_bpp[0], 16);
>>> @@ -1599,6 +1641,9 @@ static void get_yuv_parameters(struct igt_fb *fb, struct yuv_parameters *params)
>>>          switch (fb->drm_format) {
>>>        case DRM_FORMAT_NV12:
>>> +    case DRM_FORMAT_P010:
>>> +    case DRM_FORMAT_P012:
>>> +    case DRM_FORMAT_P016:
>>>            params->y_inc = 1;
>>>            params->uv_inc = 2;
>>
>> Hi Maarten,
>>
>> I was wondering if above y_inc and uv_inc for Pxxx should be 2x of those for NV12?
>>
>> I noticed they're used below like "y_tmp += params.y_inc" where y_tmp is uint8_t*.
>>
>> Other than this all look good to me in this patch. I don't have HW to test with so I cannot go see how it work.
> 
> Well we increase uint16_t pointers, so it worked out. Tested it myself for P010, didn't test the Y21x Y41x formats but should be correct. :)

Ah, now I got it. I was looking just at first instance where the call 
was made to get those parameters.

This patch is
Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>

/Juha-Pekka


_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  reply	other threads:[~2019-02-07 12:21 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-07  9:21 [igt-dev] [PATCH v2 1/4] lib/color_encoding: Prepare support for HDR modes Maarten Lankhorst
2019-02-07  9:21 ` [igt-dev] [PATCH v2 2/4] lib/igt_fb: Add support for P01x formats, v4 Maarten Lankhorst
2019-02-07 11:52   ` Juha-Pekka Heikkila
2019-02-07 12:10     ` Maarten Lankhorst
2019-02-07 12:20       ` Juha-Pekka Heikkila [this message]
2019-02-08  8:07   ` Sharma, Swati2
2019-02-07  9:21 ` [igt-dev] [PATCH v2 3/4] lib/igt_fb: Add support for Y21x formats as well, v2 Maarten Lankhorst
2019-02-07 12:29   ` Juha-Pekka Heikkila
2019-02-08  8:15   ` Sharma, Swati2
2019-02-07  9:21 ` [igt-dev] [PATCH v2 4/4] lib/igt_fb: Add support for Y410/Y416 formats, v2 Maarten Lankhorst
2019-02-07 12:43   ` Juha-Pekka Heikkila
2019-02-08  9:29   ` Sharma, Swati2
2019-02-07  9:46 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [v2,1/4] lib/color_encoding: Prepare support for HDR modes Patchwork
2019-02-07 12:45 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2019-02-07 13:12 ` [igt-dev] [PATCH v2 1/4] " Juha-Pekka Heikkila
2019-02-08  7:06 ` Sharma, Swati2
2019-02-08  7:10 ` Sharma, Swati2

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=2f85ca13-07eb-1878-da05-a74470e56e15@gmail.com \
    --to=juhapekka.heikkila@gmail.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=maarten.lankhorst@linux.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.