[RFC 0/1] Color manager calibration protocol v1
Sebastian Wick
sebastian at sebastianwick.net
Mon Apr 15 19:42:47 UTC 2019
On 2019-04-15 21:01, Simon Ser wrote:
> On Monday, April 15, 2019 9:30 PM, Sebastian Wick
> <sebastian at sebastianwick.net> wrote:
>> On 2019-04-14 12:57, Erwin Burema wrote:
>> > Without a way to calibrate/profile screens an color management
>> > protocol looses a lot of its value. So to add this missing feature I
>> > wrote the following protocol.
>> >
>> > The idea is that the calibration/profiling SW only sets the RGB
>> > triplet and then the compositor is responsible to draw a rectanglular
>> > region on the selected output screen, since not all calibration tools
>> > will be at the center of the screen a user should be able to modify
>> > the placement of this rectanglular region. Unless specified the
>> > monitor profile (if any) should not be applied but the GPU curve
>> > should, currently to set a new curve the calibration tool should
>> > generate a new ICC profile with the wanted curve in the VCGT tag (I am
>> > not sure if this is the best option but would make the most universal
>> > one). In the end after profiling the last uploaded ICC could then be
>> > saved (although a compositor is not required to honor the request in
>> > that case it should send the not saved error). If the compositor
>> > doesn't save or the connection with this protocol is broken the
>> > compositor should restore previous settings.
>> >
>> > Currently no support to calibrate HDR screens since this will require
>> > direct access (no tonemapping or color correction should happen in the
>> > screen, with the potential exception if it is possible to upload
>> > custom LUTs to the screen), this will require something like the
>> > FREESYN2_GAMMA22 display mode as described here:
>> > https://gpuopen.com/using-amd-freesync-2-hdr-color-spaces/ if this is
>> > not available a HDR screen should be treated as if it is a rec2020+PQ
>> > or HLG since it will do its own compositing+color managing (which
>> > might or might not be correct)
>> >
>> > Erwin Burema (1):
>> > Add color manager calibration protocol v1
>> >
>> > .../cm_wayland_calibration.xml | 106 ++++++++++++++++++
>> > 1 file changed, 106 insertions(+)
>> > create mode 100644
>> > unstable/color-manager-calibration/cm_wayland_calibration.xml
>>
>> The requirement to let the user position the patch makes me think that
>> using a normal surface in a special mode makes more sense.
>
> This makes sense to me as well. Is there a guarantee that the surface
> is always
> a single solid color?
>
>> Maybe something like this would work:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <protocol name="color_measure_unstable_v1">
>>
>> <description summary="color calibration and profiling">
>> </description>
>>
>> <interface name="zwp_color_measure_v1" version="1">
>> <description summary="">
>> </description>
>>
>> <enum name="measure_mode">
>> <description summary="">
>> </description>
>> <entry name="standard" value="0" summary=""/>
>> <entry name="passthrough" value="1" summary=""/>
>> </enum>
>>
>> <request name="get_color_measurement_surface">
>> <description summary="">
>> </description>
>> <arg name="id" type="new_id"
>> interface="zwp_color_measure_surface_v1"/>
>> <arg name="surface" type="object" interface="wl_surface"/>
>> <arg name="output" type="object" interface="wl_output"/>
>> <arg name="mode" type="uint" enum="measure_mode"
>> interface="wl_output"/>
>
> Typo: not a wl_output.
Yes, thanks.
>
>> </request>
>>
>> <request name="destroy" type="destructor">
>> <description summary="destroy the color measure">
>> </description>
>> </request>
>> </interface>
>>
>> <interface name="zwp_color_measure_surface_v1" version="1">
>> <description summary="">
>> The underlying surface has a state which indicates if it is shown on
>> the
>> output without further manipulation.
>>
>> In particular if the surface is in the state valid with mode standard
>> the
>> compositor guarantees that only the color correction pipeline and no
>> "special" effects are applied to the surface.
>>
>> In the state valid with mode passthrough the color values of the
>> surface are
>> gauranteed to reach the output as is (e.g. no color correction and no
>> vcgt
>> LUT gets applied).
>>
>> If the state is invalid there is no guarantee how the color values
>> are
>> transformed before reaching the output.
>> </description>
>>
>> <enum name="state">
>> <description summary="">
>> </description>
>> <entry name="valid" value="0" summary=""/>
>> <entry name="invalid" value="1" summary=""/>
>> </enum>
>>
>> <request name="sync">
>> </request>
>
> What would this be for?
Apparently I really wasn't paying attention when writing this. This
shouldn't be there. The wl_display.sync mechanism should be used to
ensure that all measurements are done in the valid state.
>
>> <event name="done">
>> </event>
>>
>> <event name="state_changed">
>> <arg name="state" type="uint" enum="state"/>
>> </event>
>>
>> <request name="destroy" type="destructor">
>> <description summary="destroy the color measure surface">
>> </description>
>> </request>
>> </interface>
>>
>> </protocol>
>>
>>
>> I'd imagine the client to do something like this:
>>
>> 1. create a zwp_color_measure_surface_v1 for the surface and the
>> output
>> to measure in the passthrough mode
>> 2. tell the user to position the surface correctly and wait for the
>> state to be valid (for example in gnome shell the state would be
>> invalid when the surface is shown in expose or not shown on the
>> output
>> at all)
>> 3. calibrate by filling the surface and applying the "vcgt" in
>> software
>> 4. profile
>> 5. if the state changes to invalid in between go to 2
>> 6. create the ICC profile and load it to the compositor via colord
>> 7. destroy the interface, create a new one in the standard mode
>> 8. wait for the state to be valid (as before)
>> 9. measure the colors and check if the profile works as intended
>
> How would the client "measure"?
With a colorimeter. Write some values that you expect to have a certain
color, read the actual colors, calculate the error.
I'm not sure if that answers your question.
>
>> 10. if the state changes to invalid in between go to 8
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list