That's great to hear! Maybe still a happy end for my users and Ubuntu
26.04-LTS.

Thanks Harry!

On Wed, Apr 1, 2026 at 9:32 PM Harry Wentland <[email protected]>
wrote:

>
>
> On 2026-03-21 01:20, Mario Kleiner wrote:
> > Commit d5df648ec830 ("drm/amd/display: Change dither policy for 10bpc to
> > round") degraded display of 12 bpc color precision output to 10 bpc sinks
> > by switching 10 bpc output from dithering to "truncate to 10 bpc".
> >
> > I don't find the argumentation in that commit convincing, but the
> > consequences highly unfortunate, especially for applications that
> > require effective > 10 bpc precision output of > 10 bpc framebuffers.
> >
> > The argument wasn't something strong like "there are hardware design
> > defects or limitations which require us to work around broken dithering
> > to 10 bpc", or "there are some special use cases which do require
> > truncation to 10 bpc", but essentially "at some point in the past we
> > used truncation in Polaris/Vega times and it looks like it got
> > inadvertently changed for Navi, so let's do that again". I couldn't find
> > evidence for that in the git commit logs for this. The commit message
> also
> > acknowledges that using dithering "...makes some sense for FP16...
> > ...but not for ARGB2101010 surfaces..."
> >
> > The problem with this is that it makes fp16 surfaces, and especially
> > rgba16 fixed point surfaces, less useful. These are now well
> > supported by Mesa 25.3 and later via OpenGL + EGL, Vulkan/WSI, and by
> > OSS AMDVLK Vulkan/WSI/display, and also by GNOME 50 mutter under Wayland,
> > and they used to provide more than 10 bpc effective precision at the
> > output.
> >
> > Even for 8 or 10 bpc surfaces, the color pipeline behind the framebuffer,
> > e.g., gamma tables, CTM, can be used for color correction and will
> > benefit from an effective > 10 bpc output precision via dithering,
> > retaining some precision that would get lost on the way through the
> > pipeline, e.g., due to non-linear gamma functions.
> >
> > Scientific apps rely on this for > 10 bpc display precision. Truncating
> > to 10 bpc, instead of dithering the pipeline internal 12 bpc precision
> > down to 10 bpc, causes a serious loss of precision. This also creates the
> > undesirable and slightly absurd situation that using a cheap monitor
> > with only 8 bpc input and display panel will yield roughly 12 bpc
> > precision via dithering from 12 -> 8 bpc, whereas investment into a
> > more expensive monitor with 10 bpc input and native 10 bpc display will
> > only yield 10 bpc, even if a fp16 or rgb16 framebuffer and/or a properly
> > set up color pipeline (gamma tables, CTM's etc. with more than 10 bpc out
> > precision) would allow effective 12 bpc precision output.
> >
> > Therefore this patch proposes reverting that commit and going back to
> > dithering down to 10 bpc, consistent with the behaviour for 6 bpc or 8
> bpc
> > output.
> >
> > Successfully tested on AMD Polaris DCE 11.2 and Raven Ridge DCN 1.0 with
> > a native 10 bpc capable monitor, outputting a RGBA16 unorm framebuffer
> and
> > measuring resulting color precision with a photometer. No apparent visual
> > artifacts or problems were observed, and effective precision was measured
> > to be 12 bpc again, as expected.
> >
> > Fixes: d5df648ec830 ("drm/amd/display: Change dither policy for 10bpc to
> round")
> > Signed-off-by: Mario Kleiner <[email protected]>
> > Tested-by: Mario Kleiner <[email protected]>
> > Cc: [email protected]
> > Cc: Aric Cyr <[email protected]>
> > Cc: Anthony Koo <[email protected]>
> > Cc: Rodrigo Siqueira <[email protected]>
> > Cc: Krunoslav Kovac <[email protected]>
> > Cc: Alex Deucher <[email protected]>
>
> Kruno and I chatted a bit more about this and the best way forward
> seems to be to re-enable SPATIAL10 dither and then override that
> when needed in our Windows driver.
>
> Patches is
> Reviewed-by: Harry Wentland <[email protected]>
>
> Will pull it in today.
>
> Harry
>
> > ---
> >  drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> > index c9fbb64d706a..29db5404c4a0 100644
> > --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> > @@ -5056,7 +5056,7 @@ void
> resource_build_bit_depth_reduction_params(struct dc_stream_state *stream,
> >                       option = DITHER_OPTION_SPATIAL8;
> >                       break;
> >               case COLOR_DEPTH_101010:
> > -                     option = DITHER_OPTION_TRUN10;
> > +                     option = DITHER_OPTION_SPATIAL10;
> >                       break;
> >               default:
> >                       option = DITHER_OPTION_DISABLE;
>
>

Reply via email to