From: Harry Wentland <harry.wentland@amd.com>
To: Pekka Paalanen <pekka.paalanen@collabora.com>
Cc: Melissa Wen <mwen@igalia.com>,
amd-gfx@lists.freedesktop.org,
Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>,
sunpeng.li@amd.com, Alex Deucher <alexander.deucher@amd.com>,
dri-devel@lists.freedesktop.org, christian.koenig@amd.com,
Xinhui.Pan@amd.com, airlied@gmail.com, daniel@ffwll.ch,
Joshua Ashton <joshua@froggi.es>,
Sebastian Wick <sebastian.wick@redhat.com>,
Xaver Hugl <xaver.hugl@gmail.com>,
Shashank Sharma <Shashank.Sharma@amd.com>,
Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>,
sungjoon.kim@amd.com, Alex Hung <alex.hung@amd.com>,
Simon Ser <contact@emersion.fr>,
kernel-dev@igalia.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 07/34] drm/amd/display: explicitly define EOTF and inverse EOTF
Date: Thu, 7 Sep 2023 10:10:50 -0400 [thread overview]
Message-ID: <b8d1e0b8-61b5-4e6a-a95c-3095f97bb376@amd.com> (raw)
In-Reply-To: <20230907104917.7cf8e22e.pekka.paalanen@collabora.com>
On 2023-09-07 03:49, Pekka Paalanen wrote:
> On Wed, 6 Sep 2023 16:15:10 -0400
> Harry Wentland <harry.wentland@amd.com> wrote:
>
>> On 2023-08-25 10:18, Melissa Wen wrote:
>>> On 08/22, Pekka Paalanen wrote:
>>>> On Thu, 10 Aug 2023 15:02:47 -0100
>>>> Melissa Wen <mwen@igalia.com> wrote:
>>>>
>>>>> Instead of relying on color block names to get the transfer function
>>>>> intention regarding encoding pixel's luminance, define supported
>>>>> Electro-Optical Transfer Functions (EOTFs) and inverse EOTFs, that
>>>>> includes pure gamma or standardized transfer functions.
>>>>>
>>>>> Suggested-by: Harry Wentland <harry.wentland@amd.com>
>>>>> Signed-off-by: Melissa Wen <mwen@igalia.com>
>>>>> ---
>>>>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 19 +++--
>>>>> .../amd/display/amdgpu_dm/amdgpu_dm_color.c | 69 +++++++++++++++----
>>>>> 2 files changed, 67 insertions(+), 21 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
>>>>> index c749c9cb3d94..f6251ed89684 100644
>>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
>>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
>>>>> @@ -718,14 +718,21 @@ extern const struct amdgpu_ip_block_version dm_ip_block;
>>>>>
>>>>> enum amdgpu_transfer_function {
>>>>> AMDGPU_TRANSFER_FUNCTION_DEFAULT,
>>>>> - AMDGPU_TRANSFER_FUNCTION_SRGB,
>>>>> - AMDGPU_TRANSFER_FUNCTION_BT709,
>>>>> - AMDGPU_TRANSFER_FUNCTION_PQ,
>>>>> + AMDGPU_TRANSFER_FUNCTION_SRGB_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_BT709_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_PQ_EOTF,
>>>>> AMDGPU_TRANSFER_FUNCTION_LINEAR,
>>>>> AMDGPU_TRANSFER_FUNCTION_UNITY,
>>>>> - AMDGPU_TRANSFER_FUNCTION_GAMMA22,
>>>>> - AMDGPU_TRANSFER_FUNCTION_GAMMA24,
>>>>> - AMDGPU_TRANSFER_FUNCTION_GAMMA26,
>>>>> + AMDGPU_TRANSFER_FUNCTION_GAMMA22_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_GAMMA24_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_GAMMA26_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_SRGB_INV_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_BT709_INV_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_PQ_INV_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_GAMMA22_INV_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_GAMMA24_INV_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_GAMMA26_INV_EOTF,
>>>>> + AMDGPU_TRANSFER_FUNCTION_COUNT
>>>>> };
>>>>>
>>>>> struct dm_plane_state {
>>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
>>>>> index 56ce008b9095..cc2187c0879a 100644
>>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
>>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
>>>>> @@ -85,18 +85,59 @@ void amdgpu_dm_init_color_mod(void)
>>>>> }
>>>>>
>>>>> #ifdef AMD_PRIVATE_COLOR
>>>>> -static const struct drm_prop_enum_list amdgpu_transfer_function_enum_list[] = {
>>>>> - { AMDGPU_TRANSFER_FUNCTION_DEFAULT, "Default" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_SRGB, "sRGB" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_BT709, "BT.709" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_PQ, "PQ (Perceptual Quantizer)" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_LINEAR, "Linear" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_UNITY, "Unity" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_GAMMA22, "Gamma 2.2" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_GAMMA24, "Gamma 2.4" },
>>>>> - { AMDGPU_TRANSFER_FUNCTION_GAMMA26, "Gamma 2.6" },
>>>>> +static const char * const
>>>>> +amdgpu_transfer_function_names[] = {
>>>>> + [AMDGPU_TRANSFER_FUNCTION_DEFAULT] = "Default",
>>>>> + [AMDGPU_TRANSFER_FUNCTION_LINEAR] = "Linear",
>>>>
>>>> Hi,
>>>>
>>>> if the below is identity, then what is linear? Is there a coefficient
>>>> (multiplier) somewhere? Offset?
>>>>
>>>>> + [AMDGPU_TRANSFER_FUNCTION_UNITY] = "Unity",
>>>>
>>>> Should "Unity" be called "Identity"?
>>>
>>> AFAIU, AMD treats Linear and Unity as the same: Identity. So, IIUC,
>>> indeed merging both as identity sounds the best approach.
>>
>> Agreed.
>>
>>>>
>>>> Doesn't unity mean that the output is always 1.0 regardless of input?
>>>>
>>>>> + [AMDGPU_TRANSFER_FUNCTION_SRGB_EOTF] = "sRGB EOTF",
>>>>> + [AMDGPU_TRANSFER_FUNCTION_BT709_EOTF] = "BT.709 EOTF",
>>>>
>>>> BT.709 says about "Overall opto-electronic transfer characteristics at
>>>> source":
>>>>
>>>> In typical production practice the encoding function of image
>>>> sources is adjusted so that the final picture has the desired
>>>> look, as viewed on a reference monitor having the reference
>>>> decoding function of Recommendation ITU-R BT.1886, in the
>>>> reference viewing environment defined in Recommendation ITU-R
>>>> BT.2035.
>>>>
>>>> IOW, typically people tweak the encoding function instead of using
>>>> BT.709 OETF as is, which means that inverting the BT.709 OETF produces
>>>> something slightly unknown. The note about BT.1886 means that that
>>>> something is also not quite how it's supposed to be turned into light.
>>>>
>>>> Should this enum item be "BT.709 inverse OETF" and respectively below a
>>>> "BT.709 OETF"?
>>>>
>>>> What curve does the hardware actually implement?
>>>
>>> Hmmmm.. I think I got confused in using OETF here since it's done within
>>> a camera. Looking at the coefficients used by AMD color module when not
>>> using ROM but build encoding and decoding curves[1] on pre-defined TF
>>> setup, I understand it's using OETF parameters for building both sRGB
>>> and BT 709:
>>>
>>> ```
>>> /*sRGB 709 2.2 2.4 P3*/
>>> static const int32_t numerator01[] = { 31308, 180000, 0, 0, 0};
>>> static const int32_t numerator02[] = { 12920, 4500, 0, 0, 0};
>>> static const int32_t numerator03[] = { 55, 99, 0, 0, 0};
>>> static const int32_t numerator04[] = { 55, 99, 0, 0, 0};
>>> static const int32_t numerator05[] = { 2400, 2222, 2200, 2400, 2600};
>>> ```
>>>
>>
>> The first column here looks like the sRGB coefficients in Skia:
>> https://skia.googlesource.com/skia/+/19936eb1b23fef5187b07fb2e0e67dcf605c0672/include/core/SkColorSpace.h#46
>>
>> The color module uses the same coefficients to calculate the transform
>> to linear space and from linear space. So it would support a TF and its
>> inverse.
>>
>> From what I understand for sRGB and PQ its the EOTF and its inverse.
>>
>> For BT.709 we should probably call it BT.709 inverse OETF (instead of
>> EOTF) and BT.709 OETF (instead of inverse EOTF).
>>
>> While I'm okay to move ahead with these AMD driver-specific properties
>> without IGT tests (since they're not enabled and not UABI) we really
>> need IGT tests once they become UABI with the Color Pipeline API. And we
>> need more than just CRC testing. We'll need to do pixel-by-pixel comparison
>> so we can verify that the KMS driver behaves exactly how we expect for a
>> large range of values.
>
> Yes, please, very much, about the generic color UAPI.
>
> I believe IGT should contain the reference curve for all named fixed
> curves computed with standard libc math functions in double precision,
> and compute error statistics between that and hardware results.
> The actual test image would iterate through e.g. 1024 (all 10-bit
> values for integer format framebuffer) different values - 1024 is
> nothing as a number of pixels. Then we decide on acceptable error
> thresholds.
>
1024 isn't a lot of values and fine if we test R, G, and B independently.
Unfortunately 1024^3 is about a billion pixels, so for testing 3DLUTs
(or other cases where we need to test the combination of RGB together)
we won't be able to cover all inputs with a single framebuffer.
> It should also be tested with a floating-point framebuffer format, FP16
> or FP32, with a value distribution designed to be sensitive to typical
> numerical problems. For example, an inverse EOTF should be carefully
> tested with values near zero, since those are the most problematic and
> likely cause the most visible errors.
>
> Once all that is done, we can be very sure of what curve any hardware
> actually implements.
>
> I might even go far enough to suggest that any generic color UAPI with
> named fixed curves cannot land without such tests.
>
I tend to agree, though I think the same should on some level apply to
custom LUTs or other custom transforms.
The IGT tests I'm writing will each have a "transform" function that does
the transform in CPU as reference.
Harry
>
> Thanks,
> pq
>
>>
>> Harry
>>
>>> Then EOTF and inverse EOTF for PQ [2], and OETF and it seems an inverse
>>> OETF but called EOTF for HLG[3]. But I'm an external dev, better if
>>> Harry can confirm.
>>>
>>> Thank you for pointing it out.
>>>
>>> [1] https://cgit.freedesktop.org/drm/drm-misc/tree/drivers/gpu/drm/amd/display/modules/color/color_gamma.c#n55
>>> [2] https://cgit.freedesktop.org/drm/drm-misc/tree/drivers/gpu/drm/amd/display/modules/color/color_gamma.c#n106
>>> [3] https://cgit.freedesktop.org/drm/drm-misc/tree/drivers/gpu/drm/amd/display/modules/color/color_gamma.c#n174
>>>
>>>>
>>>> The others seem fine to me.
>>>>
>>>>
>>>> Thanks,
>>>> pq
next prev parent reply other threads:[~2023-09-07 15:36 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-10 16:02 [PATCH v2 00/34] drm/amd/display: add AMD driver-specific properties for color mgmt Melissa Wen
2023-08-10 16:02 ` [PATCH v2 01/34] drm/amd/display: fix segment distribution for linear LUTs Melissa Wen
2023-09-06 19:15 ` Harry Wentland
2023-09-08 14:11 ` Melissa Wen
2023-09-08 14:40 ` Harry Wentland
2023-08-10 16:02 ` [PATCH v2 02/34] drm/drm_mode_object: increase max objects to accommodate new color props Melissa Wen
2023-08-10 16:02 ` [PATCH v2 03/34] drm/drm_property: make replace_property_blob_from_id a DRM helper Melissa Wen
2023-08-10 16:02 ` [PATCH v2 04/34] drm/drm_plane: track color mgmt changes per plane Melissa Wen
2023-08-10 16:02 ` [PATCH v2 05/34] drm/amd/display: add driver-specific property for plane degamma LUT Melissa Wen
2023-08-10 16:02 ` [PATCH v2 06/34] drm/amd/display: add plane degamma TF driver-specific property Melissa Wen
2023-08-10 16:02 ` [PATCH v2 07/34] drm/amd/display: explicitly define EOTF and inverse EOTF Melissa Wen
2023-08-22 11:02 ` Pekka Paalanen
2023-08-25 14:18 ` Melissa Wen
2023-09-06 20:15 ` Harry Wentland
2023-09-07 7:49 ` Pekka Paalanen
2023-09-07 14:10 ` Harry Wentland [this message]
2023-09-08 7:45 ` Pekka Paalanen
2023-09-08 14:14 ` Melissa Wen
2023-08-10 16:02 ` [PATCH v2 08/34] drm/amd/display: document AMDGPU pre-defined transfer functions Melissa Wen
2023-08-22 11:45 ` Pekka Paalanen
2023-08-10 16:02 ` [PATCH v2 09/34] drm/amd/display: add plane HDR multiplier driver-specific property Melissa Wen
2023-08-22 11:54 ` Pekka Paalanen
2023-08-10 16:02 ` [PATCH v2 10/34] drm/amd/display: add plane 3D LUT driver-specific properties Melissa Wen
2023-09-06 19:30 ` Harry Wentland
2023-09-07 7:57 ` Pekka Paalanen
2023-09-08 14:19 ` Melissa Wen
2023-08-10 16:02 ` [PATCH v2 11/34] drm/amd/display: add plane shaper LUT and TF " Melissa Wen
2023-09-06 19:33 ` Harry Wentland
2023-09-08 14:21 ` Melissa Wen
2023-08-10 16:02 ` [PATCH v2 12/34] drm/amd/display: add plane blend " Melissa Wen
2023-08-10 16:02 ` [PATCH v2 13/34] drm/amd/display: add CRTC gamma TF driver-specific property Melissa Wen
2023-08-10 16:02 ` [PATCH v2 14/34] drm/amd/display: add comments to describe DM crtc color mgmt behavior Melissa Wen
2023-08-10 16:02 ` [PATCH v2 15/34] drm/amd/display: encapsulate atomic regamma operation Melissa Wen
2023-08-10 16:02 ` [PATCH v2 16/34] drm/amd/display: add CRTC gamma TF support Melissa Wen
2023-08-10 16:02 ` [PATCH v2 17/34] drm/amd/display: set sdr_ref_white_level to 80 for out_transfer_func Melissa Wen
2023-08-10 16:02 ` [PATCH v2 18/34] drm/amd/display: mark plane as needing reset if color props change Melissa Wen
2023-08-10 16:02 ` [PATCH v2 19/34] drm/amd/display: decouple steps for mapping CRTC degamma to DC plane Melissa Wen
2023-08-22 12:11 ` Pekka Paalanen
2023-08-25 14:29 ` Melissa Wen
2023-08-28 8:17 ` Pekka Paalanen
2023-08-30 10:59 ` Michel Dänzer
2023-09-06 14:46 ` Harry Wentland
[not found] ` <CAEZNXZCfvc909iFZQMdNEz=P_T=rYEYKq1Tdrt+8RNQpBSNt_g@mail.gmail.com>
2023-08-28 10:23 ` Pekka Paalanen
2023-08-28 13:56 ` Melissa Wen
2023-08-29 8:51 ` Pekka Paalanen
2023-09-06 14:52 ` Harry Wentland
2023-08-10 16:03 ` [PATCH v2 20/34] drm/amd/display: add plane degamma TF and LUT support Melissa Wen
2023-08-10 16:03 ` [PATCH v2 21/34] drm/amd/display: reject atomic commit if setting both plane and CRTC degamma Melissa Wen
2023-08-10 16:03 ` [PATCH v2 22/34] drm/amd/display: add dc_fixpt_from_s3132 helper Melissa Wen
2023-08-10 16:03 ` [PATCH v2 23/34] drm/amd/display: add HDR multiplier support Melissa Wen
2023-08-10 16:03 ` [PATCH v2 24/34] drm/amd/display: add plane shaper LUT support Melissa Wen
2023-08-10 16:03 ` [PATCH v2 25/34] drm/amd/display: add plane shaper TF support Melissa Wen
2023-08-10 16:03 ` [PATCH v2 26/34] drm/amd/display: add plane 3D LUT support Melissa Wen
2023-08-10 16:03 ` [PATCH v2 27/34] drm/amd/display: handle empty LUTs in __set_input_tf Melissa Wen
2023-08-10 16:03 ` [PATCH v2 28/34] drm/amd/display: add plane blend LUT and TF support Melissa Wen
2023-08-10 16:03 ` [PATCH v2 29/34] drm/amd/display: allow newer DC hardware to use degamma ROM for PQ/HLG Melissa Wen
2023-09-06 18:01 ` Harry Wentland
2023-09-08 14:28 ` Melissa Wen
2023-08-10 16:03 ` [PATCH v2 30/34] drm/amd/display: copy 3D LUT settings from crtc state to stream_update Melissa Wen
2023-08-10 16:03 ` [PATCH v2 31/34] drm/amd/display: set stream gamut remap matrix to MPC for DCN301 Melissa Wen
2023-08-22 12:30 ` Pekka Paalanen
2023-08-25 14:37 ` Melissa Wen
2023-08-28 8:20 ` Pekka Paalanen
2023-09-06 18:10 ` Harry Wentland
2023-08-10 16:03 ` [PATCH v2 32/34] drm/amd/display: add plane CTM driver-specific property Melissa Wen
2023-09-06 18:14 ` Harry Wentland
2023-09-08 14:41 ` Melissa Wen
2023-09-08 14:42 ` Harry Wentland
2023-08-10 16:03 ` [PATCH v2 33/34] drm/amd/display: add plane CTM support Melissa Wen
2023-09-06 18:18 ` Harry Wentland
2023-09-08 14:49 ` Melissa Wen
2023-08-10 16:03 ` [PATCH v2 34/34] drm/amd/display: Use 3x4 CTM for plane CTM Melissa Wen
2023-09-06 18:28 ` Harry Wentland
2023-09-06 19:33 ` [PATCH v2 00/34] drm/amd/display: add AMD driver-specific properties for color mgmt Harry Wentland
2023-09-08 14:52 ` Melissa Wen
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=b8d1e0b8-61b5-4e6a-a95c-3095f97bb376@amd.com \
--to=harry.wentland@amd.com \
--cc=Rodrigo.Siqueira@amd.com \
--cc=Shashank.Sharma@amd.com \
--cc=Xinhui.Pan@amd.com \
--cc=airlied@gmail.com \
--cc=alex.hung@amd.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=contact@emersion.fr \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=joshua@froggi.es \
--cc=kernel-dev@igalia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mwen@igalia.com \
--cc=nicholas.kazlauskas@amd.com \
--cc=pekka.paalanen@collabora.com \
--cc=sebastian.wick@redhat.com \
--cc=sungjoon.kim@amd.com \
--cc=sunpeng.li@amd.com \
--cc=xaver.hugl@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome