On 2025-11-21 04:13, Louis Chauvet wrote:
>
>
> On 11/20/25 20:11, Harry Wentland wrote:
>>
>>
>> On 2025-11-14 19:01, Alex Hung wrote:
>>> Both kernel patches and IGT patches are reviewed and the API is stable
>>> for a few revisions. Does anyone have concerns if kernel and IGT patches
>>> are to be merged?
>>>
>>
>> Xaver, are the kwin patches ready to be merged?
>>
>> I'm planning to have a last look over the kernel and IGT series and merge
>> them to drm-misc-next next week if there are no objections. I believe
>> I still have committer rights to drm-misc and Alex should have IGT committer
>> rights.
>
> Hi,
>
> I have commit rights on drm-misc if you don't have them anymore. I just need
> confirmation that I can apply amd patches on drm-misc-next.
>
Thanks for the offer. I might take you up on it.
Alex D., any objections to taking the AMD patches through drm-misc-next?
Harry
> Thanks for this work,
> Louis Chauvet
>
>> Harry
>>
>>> This is an RFC set for a color pipeline API, along with implementations
>>> in VKMS and amdgpu. It is tested with a set of IGT tests that can be
>>> found at [1]. The IGT tests run a pixel-by-pixel comparison with an
>>> allowable delta variation as the goal for these transformations is
>>> perceptual correctness, not complete pixel accuracy.
>>>
>>> v5 of this patchset fleshed out documentation for colorops and the
>>> various defines that are being introduced.
>>>
>>> v6 addresses a few comments from various reviewers.
>>>
>>> v7 simplifies 3D LUT and addresses more comments from various reviewers.
>>>
>>> v8 fixes typo and errors and address comments from reviewers.
>>>
>>> v9 refactors cleanup functions, fixes typo and errors, and addresses
>>> comments from reviewers.
>>>
>>> v10 add 32BIT RGB (drm_color_lut_32) to 1D & 3D LUTs, addresses comments
>>> from reviewers, and fixes typo and errors.
>>>
>>> v11 change names from *_lut_32_* to *_lut32_* and fix RGB 32bit
>>> extractions.
>>>
>>> v12 add gamma 2.2 to 1D curve
>>>
>>> v13 add two vkms patches
>>>
>>> VKMS supports two named transfer function colorops and two matrix
>>> colorops.
>>>
>>> Amdgpu advertises the following pipeline for GPUs with DCN 3 or newer:
>>>
>>> 1. 1D Curve EOTF
>>> 2. 3x4 CTM
>>> 3. Multiplier
>>> 4. 1D Curve Inverse EOTF
>>> 5. 1D LUT
>>> 6. 3D LUT
>>> 7. 1D Curve EOTF
>>> 8. 1D LUT
>>>
>>> The supported curves for the 1D Curve type are:
>>> - sRGB EOTF and its inverse
>>> - PQ EOTF, scaled to [0.0, 125.0] and its inverse
>>> - BT.2020/BT.709 OETF and its inverse
>>> - Gamma 2.2 and its inverse
>>>
>>> Note that the 1st and 5th colorops take the EOTF or Inverse
>>> OETF while the 3rd colorop takes the Inverse EOTF or OETF.
>>>
>>> The 3D LUT is a 17^3 tetrahedrally interpolated LUT but the mechanism
>>> exists for other drivers to describe their own 3D LUT capability.
>>>
>>> This mirrors the color pipeline used by gamescope and presented by
>>> Melissa Wen, with the exception of the DEGAM LUT, which is not currently
>>> used. See [1]
>>> https://indico.freedesktop.org/event/4/contributions/186/attachments/138/218/xdc2023-TheRainbowTreasureMap-MelissaWen.pdf
>>>
>>> At this point we're hoping to see gamescope, kwin and weston implementations
>>> take shape. The existing pipeline should be enough to satisfy the
>>> gamescope use-cases on the drm_plane.
>>>
>>> In order to support YUV we'll need to add COLOR_ENCODING and COLOR_RANGE
>>> support to the color pipeline. I have sketched these out already but
>>> don't have it all hooked up yet. This should not hinder adoption of this
>>> API for gaming use-cases.
>>>
>>> We'll also want to advertise IN_FORMATS on a color pipeline as some
>>> color pipelines won't be able to work for all IN_FORMATS on a plane.
>>> Again, I have a sketch but no full implementation yet. This is not
>>> currently required by the AMD color pipeline and could be added after
>>> the merge of this set.
>>>
>>> VKMS patches could still be improved in a few ways, though the
>>> payoff might be limited and I would rather focus on other work
>>> at the moment. The most obvious thing to improve would be to
>>> eliminate the hard-coded LUTs for identity, and sRGB, and replace
>>> them with fixed-point math instead.
>>>
>>> There are plenty of things that I would like to see, but they could
>>> be added after the merge of this patchset:
>>> - COLOR_ENCODING and COLOR_RANGE
>>> - IN_FORMATS for a color pipeline
>>> - Is it possible to support HW which can't bypass entire pipeline?
>>> - Can we do a LOAD / COMMIT model for LUTs (and other properties)?
>>> - read-only scaling colorop which defines scaling taps and position
>>> - named matrices, for things like converting YUV to RGB
>>> - Add custom LUT colorops to VKMS
>>>
>>> IGT tests can be found at [1] or on the igt-dev mailing list. There
>>> have been no updates since v5 and rebase on latest main is straight-
>>> forward.
>>>
>>> A kernel branch can be found at [2].
>>>
>>> [1]
>>> https://gitlab.freedesktop.org/alex.hung/igt-gpu-tools/-/tree/amd-color-pipeline-v12
>>> [2]
>>> https://gitlab.freedesktop.org/alex.hung/linux/-/tree/amd-color-pipeline-v13
>>>
>>> v13:
>>> - Update vkms test Makefile (Louis Chauvet)
>>> - Include two vkms patches (Louis Chauvet)
>>> - Remove redundant ternary null check for drm_color_ctm_3x4 blob
>>> (Coverity Scan)
>>>
>>> v12:
>>> - Reorder header files (Louis Chauvet)
>>> - Add header file "vkms_drv.h" to vkms_composer.h to avoid compile
>>> errors (kernel test robot)
>>> - drm_colorop_cleanup is no longer static (Nícolas Prado)
>>> - Rework cleanup in vkms_initialize_color_pipeline (Louis Chauvet)
>>> - Add drm_colorop_pipeline_destroy in vkms_destroy (Louis Chauvet)
>>> - Remove outdated commit messages (Pekka)
>>> - Initialize the variable 'blend_lut' to NULL (kernel test robot)
>>> - Change lut_size to size (Sebastian Wick & Xaver Hugl)
>>> - Update comments for bypass_property (Sebastian Wick)
>>> - Update lut_size to size (Sebastian Wick & Xaver Hugl)
>>> - Add gamma 2.2 (Sebastian Wick & Xaver Hugl & Pekka)
>>>
>>> v11:
>>> - Refactor vkms_color_test_lerp() to parametized tests (Maíra Canal)
>>> - Sort include file alphabetically (Maíra Canal)
>>> - Skip color_encoding/range_property in drm_mode_object_get_properties
>>> when plane_color_pipeline is present (Harry Wentland)
>>> - destroy function takes drm_device *dev instead of drm_plane *plane
>>> (Nícolas Prado)
>>> - Fix undefined errors by EXPORT_SYMBOL symbols (kernel test robot)
>>> - Fix comments to "2nd op 3x4 matrix" (Nícolas Prado)
>>> - Update outdated "drm_rect_test_suite" to "drm_fixp_test_suite" (Maíra
>>> Canal)
>>> - Update outdated MODULE_LICENSE to Dual MIT/GPL (Maíra Canal)
>>> - Create color pipeline on supported hardware only (Melissa Wen)
>>> - Update names from *_lut_32_* to *_lut32_* (Simon Ser)
>>> - Include help function drm_color_lut32_extract (Uma Shankar)
>>> - Remove redundant is_legacy from __drm_lut_32_to_dc_gamma (kernel bot)
>>> - Fix RGB 32bit extraction from LUT (Xaver Hugl)
>>> - Handle errors in __set_colorop_3dlut (Nícolas Prado)
>>> - Merged enable condition for drm_crtc_enable_color_mgmt (Melissa Wen)
>>>
>>> v10:
>>> - remove duplicated "is useful" in comments (Melissa Wen)
>>> - guard "dm_plane_init_colorops" function when !AMD_PRIVATE_COLOR
>>> (Melissa Wen)
>>> - Replace DRM_ERROR by drm_err
>>> - Creaet color pipeline when >= DCN_VERSION_3_0 (Melissa Wen)
>>> - Relocate amdgpu_dm_supported_*_tfs check (Melissa Wen)
>>> - Support 32BIT RGB for 1D LUTs (Uma Shankar)
>>> - Support 32BIT RGB for 3D LUTs (Harry Wentland)
>>> - Fix typo mutliplier to multiplier in subject (Melissa Wen)
>>> - 1D & 3D LUTs are no longer immutable ((Xaver Hugl)
>>> - Fix 3D LUT kernel doc (Leandro Ribeiro)
>>> - Check dpp.hw_3d_lut before creating shaper tf/lut and 3dlut colorops
>>> (Melissa Wen)
>>> - Disable CRTC degamma when color pipeline is enabled (Melissa Wen)
>>>
>>> v9:
>>> - Update RFC documents for 3DLUT and fallback behaviours (Simon Ser)
>>> - Specify colorop function names by _plane_ (Chaitanya Kumar Borah)
>>> - Remove redundant comments (Simon Ser)
>>> - Fix typo in commit description (Shengyu Qu)
>>> - Move destroy and cleanup functions earlier (Simon Ser)
>>> - Move DRM_COLOROP_1D_CURVE_BT2020_* from middle to end (Simon Ser)
>>> - Chagne "bool allow_bypass" to "uint32_t flags" for better extensibility
>>> (Simon Ser)
>>> - Return a value in __set_dm_plane_colorop_3dlut
>>>
>>> v8:
>>> - Change VKMS config names (Louis Chauvet)
>>> - Remove deprecated function "drm_atomic_get_existing_colorop_state"
>>> (Louis Chauvet)
>>> - Remove null check in drm_colorop_set_next_property (Simon Ser)
>>> - Remove MAX_COLOR_PIPELINES in drm (Simon Ser)
>>> - Update kernel docs and documents for DRM_COLOROP_3D_LUT (Simon Ser)
>>> - Add comments for dmr_color_lut (Louis Chauvet)
>>> - Fix typos and replace DRM_ERROR and DRM_WARN_ONCE by drm_err
>>> drm_WARN_ONCE (Louis Chauvet)
>>> - Fix incorrect conditions in __set_colorop_in_tf_1d_curve (Leo Li)
>>> - Add DRM_MODE_PROP_ATOMIC to drm_property_create_range (Simon Ser)
>>> - Change "1D Curve Custom LUT" to "1D LUT" (Simon Ser)
>>> - Return error when __set_output_tf fails (Leo Li)
>>> - Return -EINVAL when drm_color_ctm_3x4's size mismatches (Leo Li)
>>> - Set initialized to 0 and return when drm_lut3d_size is 0 (Harry
>>> Wentland)
>>> - Rework tf->type = TF_TYPE_BYPASS for shaper (Harry Wentland & Leo Li)
>>>
>>> v7:
>>> - Simplify 3D LUT by removing lut_3d_modes and update doc accordingly
>>> (Simon Ser)
>>> - Add destroy / cleanup functions when color pipeline initialization
>>> fails (Louis Chauvet)
>>> - Fix checkpatch errors and warning (spaces, long lines, {}, and etc)
>>> - Change lut's size from drm_colorop_state->size to drm_colorop->lut_size
>>> and from size_property to lut_size_property
>>> - Update some kernel updates and commit messagesa (Louis Chauvet)
>>> - Squash "drm/colorop: Add atomic state print for drm_colorop" and
>>> "drm/colorop: Add NEXT to colorop state print" (Simon Ser)
>>> - Add missing MODULE_DESCRIPTION (Jeff Johnson)
>>>
>>> v6:
>>> - Eliminate need to include test as .c file (Louis Chauvet)
>>> - some doc updates
>>> - cleanup if colorop alloc or init fails in VKMS and amdgpu (Louis
>>> Chauvet)
>>> - couple other small improvements in VKMS, such as rounding (Louis
>>> Chauvet)
>>> - take ref for DATA blob in duplicate_state func & fix refcount issues
>>> (Xaver Hugl)
>>>
>>> v5:
>>> - amdgpu 3D LUT
>>> - Don't require BYPASS
>>> - update RFC docs and add to TOC tree
>>> - add drm_colorop and COLOR_PIPELINE kernel docs (non-RFC)
>>> - add amdgpu color pipeline doc
>>> - define SIZE property similar to drm_crtc's GAMMA_SIZE
>>> - various minor fixes and cleanups
>>>
>>> v4:
>>> - Add amdgpu color pipeline (WIP)
>>> - Don't block setting of deprecated properties, instead pass client cap
>>> to atomic check so drivers can ignore these props
>>> - Drop IOCTL definitions (Pekka)
>>> - Use enum property for colorop TYPE (Pekka)
>>> - A few cleanups to the docs (Pekka)
>>> - Rework the TYPE enum to name relation to avoid code duplication (Pekka)
>>> - Add missing function declarations (Chaitanya Kumar Borah)
>>> - Allow setting of NEXT property to NULL in _set_ function (Chaitanya
>>> Kumar Borah)
>>> - Add helper for creation of pipeline drm_plane property (Pekka)
>>> - Always create Bypass pipeline (Pekka)
>>> - A bunch of changes to VKMS kunit tests (Pekka)
>>> - Fix index in CTM doc (Pekka)
>>>
>>> v3:
>>> - Abandon IOCTLs and discover colorops as clients iterate the pipeline
>>> - Remove need for libdrm
>>> - Add color_pipeline client cap and make mutually exclusive with
>>> COLOR_RANGE and COLOR_ENCODING properties
>>> - add CTM colorop to VKMS
>>> - Use include way for kunit testing static functions (Arthur)
>>> - Make TYPE a range property
>>> - Move enum drm_colorop_type to uapi header
>>> - and a bunch of smaller bits that are highlighted in the relevant commit
>>> description
>>>
>>> v2:
>>> - Rebased on drm-misc-next
>>> - Introduce a VKMS Kunit so we can test LUT functionality in vkms_composer
>>> - Incorporate feedback in color_pipeline.rst doc
>>> - Add support for sRGB inverse EOTF
>>> - Add 2nd enumerated TF colorop to VKMS
>>> - Fix LUTs and some issues with applying LUTs in VKMS
>>>
>>> Cc: Ville Syrjala <[email protected]>
>>> Cc: Pekka Paalanen <[email protected]>
>>> Cc: Simon Ser <[email protected]>
>>> Cc: Harry Wentland <[email protected]>
>>> Cc: Melissa Wen <[email protected]>
>>> Cc: Jonas Ådahl <[email protected]>
>>> Cc: Sebastian Wick <[email protected]>
>>> Cc: Shashank Sharma <[email protected]>
>>> Cc: Alexander Goins <[email protected]>
>>> Cc: Joshua Ashton <[email protected]>
>>> Cc: Michel Dänzer <[email protected]>
>>> Cc: Aleix Pol <[email protected]>
>>> Cc: Xaver Hugl <[email protected]>
>>> Cc: Victoria Brekenfeld <[email protected]>
>>> Cc: Sima <[email protected]>
>>> Cc: Uma Shankar <[email protected]>
>>> Cc: Naseer Ahmed <[email protected]>
>>> Cc: Christopher Braga <[email protected]>
>>> Cc: Abhinav Kumar <[email protected]>
>>> Cc: Arthur Grillo <[email protected]>
>>> Cc: Hector Martin <[email protected]>
>>> Cc: Liviu Dudau <[email protected]>
>>> Cc: Sasha McIntosh <[email protected]>
>>> Cc: Chaitanya Kumar Borah <[email protected]>
>>>
>>> Alex Hung (18):
>>> drm/colorop: Add destroy functions for color pipeline
>>> drm/colorop: define a new macro for_each_new_colorop_in_state
>>> drm/amd/display: Skip color pipeline initialization for cursor plane
>>> drm/amd/display: Add support for sRGB EOTF in DEGAM block
>>> drm/amd/display: Add support for sRGB Inverse EOTF in SHAPER block
>>> drm/amd/display: Add support for sRGB EOTF in BLND block
>>> drm/colorop: Add 1D Curve Custom LUT type
>>> drm/amd/display: add shaper and blend colorops for 1D Curve Custom LUT
>>> drm/amd/display: add 3x4 matrix colorop
>>> drm/colorop: Add multiplier type
>>> drm/amd/display: add multiplier colorop
>>> drm/amd/display: Swap matrix and multiplier
>>> drm/colorop: Add 3D LUT support to color pipeline
>>> drm/amd/display: add 3D LUT colorop
>>> drm/amd/display: Ensure 3D LUT for color pipeline
>>> drm/amd/display: Disable CRTC degamma when color pipeline is enabled
>>> drm/colorop: Add DRM_COLOROP_1D_CURVE_GAMMA22 to 1D Curve
>>> drm/amd/display: Enable support for Gamma 2.2
>>>
>>> Chaitanya Kumar Borah (1):
>>> drm: Add helper to extract lut from struct drm_color_lut32
>>>
>>> Harry Wentland (29):
>>> drm: Add helper for conversion from signed-magnitude
>>> drm/vkms: Add kunit tests for VKMS LUT handling
>>> drm/doc/rfc: Describe why prescriptive color pipeline is needed
>>> drm/colorop: Introduce new drm_colorop mode object
>>> drm/colorop: Add TYPE property
>>> drm/colorop: Add 1D Curve subtype
>>> drm/colorop: Add BYPASS property
>>> drm/colorop: Add NEXT property
>>> drm/colorop: Add atomic state print for drm_colorop
>>> drm/plane: Add COLOR PIPELINE property
>>> drm/colorop: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
>>> Documentation/gpu: document drm_colorop
>>> drm/vkms: Add enumerated 1D curve colorop
>>> drm/vkms: Add kunit tests for linear and sRGB LUTs
>>> drm/colorop: Add 3x4 CTM type
>>> drm/vkms: Use s32 for internal color pipeline precision
>>> drm/vkms: add 3x4 matrix in color pipeline
>>> drm/tests: Add a few tests around drm_fixed.h
>>> drm/vkms: Add tests for CTM handling
>>> drm/colorop: pass plane_color_pipeline client cap to atomic check
>>> drm/amd/display: Ignore deprecated props when plane_color_pipeline set
>>> drm/amd/display: Add bypass COLOR PIPELINE
>>> drm/colorop: Add PQ 125 EOTF and its inverse
>>> drm/amd/display: Enable support for PQ 125 EOTF and Inverse
>>> drm/colorop: add BT2020/BT709 OETF and Inverse OETF
>>> drm/amd/display: Add support for BT.709 and BT.2020 TFs
>>> drm/colorop: Define LUT_1D interpolation
>>> drm/colorop: allow non-bypass colorops
>>> drm/amd/display: Add AMD color pipeline doc
>>>
>>> Louis Chauvet (2):
>>> drm/vkms: Pass plane_cfg to plane initialization
>>> drm/vkms: Add config for default plane pipeline
>>>
>>> Uma Shankar (1):
>>> drm: Add Enhanced LUT precision structure
>>>
>>> Documentation/gpu/drm-kms.rst | 15 +
>>> Documentation/gpu/rfc/color_pipeline.rst | 378 ++++++++
>>> Documentation/gpu/rfc/index.rst | 3 +
>>> drivers/gpu/drm/Makefile | 1 +
>>> .../gpu/drm/amd/display/amdgpu_dm/Makefile | 3 +-
>>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 +
>>> .../amd/display/amdgpu_dm/amdgpu_dm_color.c | 768 ++++++++++++++++-
>>> .../amd/display/amdgpu_dm/amdgpu_dm_colorop.c | 208 +++++
>>> .../amd/display/amdgpu_dm/amdgpu_dm_colorop.h | 36 +
>>> .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 26 +-
>>> .../amd/display/amdgpu_dm/amdgpu_dm_plane.c | 39 +
>>> drivers/gpu/drm/drm_atomic.c | 170 +++-
>>> drivers/gpu/drm/drm_atomic_helper.c | 12 +
>>> drivers/gpu/drm/drm_atomic_state_helper.c | 5 +
>>> drivers/gpu/drm/drm_atomic_uapi.c | 159 ++++
>>> drivers/gpu/drm/drm_color_mgmt.c | 43 +
>>> drivers/gpu/drm/drm_colorop.c | 600 +++++++++++++
>>> drivers/gpu/drm/drm_connector.c | 1 +
>>> drivers/gpu/drm/drm_crtc_internal.h | 1 +
>>> drivers/gpu/drm/drm_ioctl.c | 7 +
>>> drivers/gpu/drm/drm_mode_config.c | 7 +
>>> drivers/gpu/drm/drm_mode_object.c | 18 +
>>> drivers/gpu/drm/drm_plane.c | 59 ++
>>> drivers/gpu/drm/tests/Makefile | 3 +-
>>> drivers/gpu/drm/tests/drm_fixp_test.c | 71 ++
>>> drivers/gpu/drm/vkms/Makefile | 4 +-
>>> drivers/gpu/drm/vkms/tests/Makefile | 3 +-
>>> drivers/gpu/drm/vkms/tests/vkms_color_test.c | 417 +++++++++
>>> drivers/gpu/drm/vkms/tests/vkms_config_test.c | 47 +-
>>> drivers/gpu/drm/vkms/vkms_colorop.c | 120 +++
>>> drivers/gpu/drm/vkms/vkms_composer.c | 135 ++-
>>> drivers/gpu/drm/vkms/vkms_composer.h | 28 +
>>> drivers/gpu/drm/vkms/vkms_config.c | 7 +-
>>> drivers/gpu/drm/vkms/vkms_config.h | 28 +-
>>> drivers/gpu/drm/vkms/vkms_drv.c | 7 +-
>>> drivers/gpu/drm/vkms/vkms_drv.h | 12 +-
>>> drivers/gpu/drm/vkms/vkms_luts.c | 811 ++++++++++++++++++
>>> drivers/gpu/drm/vkms/vkms_luts.h | 12 +
>>> drivers/gpu/drm/vkms/vkms_output.c | 6 +-
>>> drivers/gpu/drm/vkms/vkms_plane.c | 9 +-
>>> include/drm/drm_atomic.h | 111 +++
>>> include/drm/drm_atomic_uapi.h | 3 +
>>> include/drm/drm_color_mgmt.h | 29 +
>>> include/drm/drm_colorop.h | 462 ++++++++++
>>> include/drm/drm_file.h | 7 +
>>> include/drm/drm_fixed.h | 18 +
>>> include/drm/drm_mode_config.h | 18 +
>>> include/drm/drm_plane.h | 19 +
>>> include/uapi/drm/amdgpu_drm.h | 9 -
>>> include/uapi/drm/drm.h | 15 +
>>> include/uapi/drm/drm_mode.h | 134 +++
>>> 51 files changed, 5014 insertions(+), 94 deletions(-)
>>> create mode 100644 Documentation/gpu/rfc/color_pipeline.rst
>>> create mode 100644
>>> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
>>> create mode 100644
>>> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.h
>>> create mode 100644 drivers/gpu/drm/drm_colorop.c
>>> create mode 100644 drivers/gpu/drm/tests/drm_fixp_test.c
>>> create mode 100644 drivers/gpu/drm/vkms/tests/vkms_color_test.c
>>> create mode 100644 drivers/gpu/drm/vkms/vkms_colorop.c
>>> create mode 100644 drivers/gpu/drm/vkms/vkms_composer.h
>>> create mode 100644 drivers/gpu/drm/vkms/vkms_luts.c
>>> create mode 100644 drivers/gpu/drm/vkms/vkms_luts.h
>>> create mode 100644 include/drm/drm_colorop.h
>>>
>>
>