From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 61A7DC43460 for ; Wed, 12 May 2021 14:53:11 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A026261413 for ; Wed, 12 May 2021 14:53:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A026261413 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=tuxedocomputers.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 460BF6EC24; Wed, 12 May 2021 14:53:08 +0000 (UTC) X-Greylist: delayed 9963 seconds by postgrey-1.36 at gabe; Wed, 12 May 2021 14:53:06 UTC Received: from srv6.fidu.org (srv6.fidu.org [IPv6:2a01:4f8:231:de0::2]) by gabe.freedesktop.org (Postfix) with ESMTPS id 965716E095; Wed, 12 May 2021 14:53:06 +0000 (UTC) Received: from localhost (localhost.localdomain [127.0.0.1]) by srv6.fidu.org (Postfix) with ESMTP id 09121C800DD; Wed, 12 May 2021 16:53:05 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at srv6.fidu.org Received: from srv6.fidu.org ([127.0.0.1]) by localhost (srv6.fidu.org [127.0.0.1]) (amavisd-new, port 10024) with LMTP id lGM8HwLdan0L; Wed, 12 May 2021 16:53:04 +0200 (CEST) Received: from [IPv6:2003:e3:7f15:cc00:73bb:e3c1:c946:13a6] (p200300E37f15CC0073bBe3c1c94613a6.dip0.t-ipconnect.de [IPv6:2003:e3:7f15:cc00:73bb:e3c1:c946:13a6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: wse@tuxedocomputers.com) by srv6.fidu.org (Postfix) with ESMTPSA id 918EDC800D9; Wed, 12 May 2021 16:53:04 +0200 (CEST) From: Werner Sembach To: Maling list - DRI developers , LKML References: <8c0d7ad8-7ade-bf8a-0414-cc795fbb6aa2@tuxedocomputers.com> Subject: Re: New uAPI for color management proposal and feedback request Message-ID: <7fdd5404-9f55-9d54-524b-10364c1f4f2d@tuxedocomputers.com> Date: Wed, 12 May 2021 16:53:03 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: <8c0d7ad8-7ade-bf8a-0414-cc795fbb6aa2@tuxedocomputers.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Content-Language: en-US X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org, emil.l.velikov@gmail.com, amd-gfx list , "Deucher, Alexander" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Am 12.05.21 um 14:06 schrieb Werner Sembach: > Hello, > > In addition to the existing "max bpc", and "Broadcast RGB/output_csc" d= rm properties I propose 4 new properties: > "preferred pixel encoding", "active color depth", "active color range",= and "active pixel encoding" > > > Motivation: > > Current monitors have a variety pixel encodings available: RGB, YCbCr 4= :4:4, YCbCr 4:2:2, YCbCr 4:2:0. > > In addition they might be full or limited RGB range and the monitors ac= cept different bit depths. > > Currently the kernel driver for AMD and Intel GPUs automatically config= ure the color settings automatically with little > to no influence of the user. However there are several real world scena= rios where the user might disagree with the > default chosen by the drivers and wants to set his or her own preferenc= e. > > Some examples: > > 1. While RGB and YCbCr 4:4:4 in theory carry the same amount of color i= nformation, some screens might look better on one > than the other because of bad internal conversion. The driver currently= however has a fixed default that is chosen if > available (RGB for Intel and YCbCr 4:4:4 for AMD). The only way to chan= ge this currently is by editing and overloading > the edid reported by the monitor to the kernel. > > 2. RGB and YCbCr 4:4:4 need a higher port clock then YCbCr 4:2:0. Some = hardware might report that it supports the higher > port clock, but because of bad shielding on the PC, the cable, or the m= onitor the screen cuts out every few seconds when > RGB or YCbCr 4:4:4 encoding is used, while YCbCr 4:2:0 might just work = fine without changing hardware. The drivers > currently however always default to the "best available" option even if= it might be broken. > > 3. Some screens natively only supporting 8-bit color, simulate 10-Bit c= olor by rapidly switching between 2 adjacent > colors. They advertise themselves to the kernel as 10-bit monitors but = the user might not like the "fake" 10-bit effect > and prefer running at the native 8-bit per color. > > 4. Some screens are falsely classified as full RGB range wile they actu= ally use limited RGB range. This results in > washed out colors in dark and bright scenes. A user override can be hel= pful to manually fix this issue when it occurs. > > There already exist several requests, discussion, and patches regarding= the thematic: > > - https://gitlab.freedesktop.org/drm/amd/-/issues/476 > > - https://gitlab.freedesktop.org/drm/amd/-/issues/1548 > > - https://lkml.org/lkml/2021/5/7/695 > > - https://lkml.org/lkml/2021/5/11/416 > > > Current State: > > I only know bits about the Intel i915 and AMD amdgpu driver. I don't kn= ow how other driver handle color management > > - "max bpc", global setting applied by both i915 (only on dp i think?) = and amdgpu. Default value is "8". For every > resolution + frequency combination the highest possible even number bet= ween 6 and max_bpc is chosen. If the range > doesn't contain a valid mode the resolution + frequency combination is = discarded (but I guess that would be a very > special edge case, if existent at all, when 6 doesn't work but 10 would= work). Intel HDMI code always checks 8, 12, and > 10 and does not check the max_bpc setting. > > - "Broadcast RGB" for i915 and "output_csc" for the old radeon driver (= not amdgpu), overwrites the kernel chosen color > range setting (full or limited). If I recall correctly Intel HDMI code = defaults to full unless this property is set, > Intel dp code tries to probe the monitor to find out what to use. amdgp= u has no corresponding setting (I don't know how > it's decided there). > > - RGB pixel encoding can be forced by overloading a Monitors edid with = one that tells the kernel that only RGB is > possible. That doesn't work for YCbCr 4:4:4 however because of the edid= specification. Forcing YCbCr 4:2:0 would > theoretically also be possible this way. amdgpu has a debugfs switch "f= orce_ycbcr_420" which makes the driver default to > YCbCr 4:2:0 on all monitors if possible. > > > Proposed Solution: > > 1. Add a new uAPI property "preferred pixel encoding", as a per port se= tting. > > =C2=A0=C2=A0=C2=A0 - An amdgpu specific implementation was already shar= ed here: https://gitlab.freedesktop.org/drm/amd/-/issues/476 > > =C2=A0=C2=A0=C2=A0 - It also writes back the actually used encoding if = the one requested was not possible, overwriting the requested > value in the process. I think it would be better to have this feedback = channel as a different, read-only property. > > =C2=A0=C2=A0=C2=A0 - Make this solution vendor agnostic by putting it i= n the drm_connector_state struct next do max_bpc > https://elixir.bootlin.com/linux/v5.13-rc1/source/include/drm/drm_conne= ctor.h#L654 and add patches to amdgpu and i915 to > respect this setting > > 2. Convert "Broadcast RGB" to a vendor agnostic setting/replace with a = vendor agnostic setting. > > =C2=A0=C2=A0=C2=A0 - Imho the name is not very fitting, but it pops up = in many tutorials throughout the web (some other opinions? how > could a rename be handled?". > > =C2=A0=C2=A0=C2=A0 - Also move it from Intel specific structs to the dr= m_connector_state struct (please let me know if there is a > better place) > > 3. Strive for full implementation of "max bpc" > > =C2=A0=C2=A0=C2=A0 - I need to double check the Intel HDMI code. > > 4. Add 3 feedback channels "active color depth", "active color range", = and "active pixel encoding" as vendor agnostic > settings in the drm_connector_state struct > > =C2=A0=C2=A0=C2=A0 - Possible values are: > > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 - unknown, undefined, 6-bit, 8-bi= t, 9-bit, 10-bit, 11-bit, 12-bit, 14-bit, 16-bit (alternatively: an integ= er > from -1 (unknown), 0 (undefined) to 16, let me know what would be more = suitable) > > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 - unknown, undefined, full, limit= ed > > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 - unknown, undefined, rgb, ycbcr4= 44, ycbcr422, ycbcr420 > > =C2=A0=C2=A0=C2=A0 - it's the responsibility of the driver to update th= e values once the port configuration changes > > =C2=A0=C2=A0=C2=A0 - if the driver does not support the feedback channe= ls they are set to unknown > > =C2=A0=C2=A0=C2=A0 - if the driver uses a non listed setting it should = set the property to undefined > > =C2=A0=C2=A0=C2=A0 - A more detailed description why I think these feed= back channel are important and should be their own read-only > property can be found here: https://lkml.org/lkml/2021/5/11/339 > > > Adoption: > > A KDE dev wants to implement the settings in the KDE settings GUI: > https://gitlab.freedesktop.org/drm/amd/-/issues/476#note_912370 > > Tuxedo Computers (my employer) wants to implement the settings desktop = environment agnostic in Tuxedo Control Center. I > will start work on this in parallel to implementing the new kernel code= =2E > > > Questions: > > I'm very curious about feedback from the dri-devel community. Would the= concept outlaid above be accepted as new uAPI > once it's fully implemented? > > Where would be the best way to store the new vendor agnostic settings? = Following the implementation of max_bpc i would > put it in the drm_connector_state struct. > > My way forward would be to implement the feedback channels first, becau= se they can be very useful for debugging the > setting properties afterwards. I will split each of it up it in 3 or 5 = patch sets: 1 for the vendor agnostic part, 1 for > Intel (or 2 split up between HDMI and DP), and 1 for AMD (or 2 split up= between HDMI and DP) > > Kind regards, > > Werner Sembach > > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx I found this: https://dri.freedesktop.org/docs/drm/gpu/todo.html#consolid= ate-custom-driver-modeset-properties as an additional reference. (Thanks @emersion in https://github.com/swaywm/wlro= ots/pull/2310)