[RFC] DeepColor Visual Class Extension
Aaron Plattner
aplattner at nvidia.com
Tue Jul 18 16:55:04 UTC 2017
On 07/18/2017 07:18 AM, Adam Jackson wrote:
> On Mon, 2017-07-17 at 18:04 -0700, Alex Goins wrote:
>> This is our latest iteration on the design of the visual class for use with HDR
>> drawables, handling how colorspace/encoding and pixel format are specified and
>> interpreted. We've been brainstorming this internally for a while, taking into
>> consideration comments that came up in the xorg-devel thread several months
>> back. We've now formalized it as an X extension.
>>
>> This extension is designed to be flexible as to how HDR drawables are actually
>> implemented, leaving it up to the server / DDX drivers to decide. It should be
>> capable of working interchangeably when an external compositor is being used and
>> when one is not, with the server/driver being responsible for internal
>> composition in the latter case.
>>
>> It should be capable of working with GLX, EGL, and Vulkan, keeping track of
>> colorspace/encoding and pixel format in API-agnostic locations so that
>> compositors need not rely on API-specific methods for querying these properties.
>> Supported colorspaces/encodings were chosen as a superset of those supported by
>> the requisite EGL/Vulkan extensions, with GLX relying entirely on the X
>> properties for the purpose of determining colorspace/encoding.
>>
>> Let us know what you think!
>
> Apologies for the brief reply, I'm about to be on PTO for a bit so this
> is a little rushed. In general this looks quite good on a first read-
> through, I'll let it sink in a bit while I'm away.
>
>> 2. DeepColor Visual Class
>>
>> The DeepColor extension defines a new visual class, DeepColor.
>>
>> DeepColor visuals do not make use of the red_mask, green_mask, blue_mask, or
>> colormap_size fields of the XVisualInfo structure. Colormap size is defined to
>> be 0.
>
> This logically makes sense, but I'm slightly nervous about exposing
> clients to an xVisualType they've never seen before. Would it make
> sense to hide this list from the connection setup block and only return
> it in DPCGetVisualInfo?
I don't think we can hide it completely, since XGetWindowAttributes will
return what looks like a bogus visual then. We went through something
similar with XLIB_SKIP_ARGB_VISUALS -- maybe something like that would
work here?
> Alternatively, would it make sense to fill in those masks with dummy
> (non-zero) values that look like xrgb32 so we don't trigger a divide-
> by-zero in a weird place? If we're going to ignore the values anyway...
>
>> 3.1. Root Window Properties
>>
>> The DeepColor extension defines a root window property for determining the set
>> of colorspaces/encodings supported by the X server or external compositor:
>>
>> _DEEPCOLOR_COMPOSITOR_COLORSPACES, ATOM[]
>
> I didn't like this for style reasons when I first read through. The
> problem with root window properties is that every client ends up
> listening for PropertyNotify on the root window, so every change to any
> property wakes up every client. Which...
>
>> 7. Issues
>>
>> This spec does not address how HDR content should be downsampled to SDR content
>> for e.g. automatic redirection, XGetImage(), or core X11 / RENDER rendering.
>> Perhaps the server could handle this transparently without the need for
>> explicit functionality outlined in the spec.
>>
>> This spec does not address what should happen to
>> __DEEPCOLOR_COMPOSITOR_COLORSPACES when an HDR-unaware compositor is started, as
>> it probably should.
>
> ... kind of matters here. I think what should happen is, if the
> compositor thinks it's going to be HDR-aware, it sets that property
> before CompositeRedirectSubwindows for the screen, but the server
> delays sending that property change event until afterwards. That way if
> you (the server) see RedirectSubwindows without a property change
> pending, you know to clear the colorspace list. And clients never see
> an inconsistent state about which colorspaces will work.
Clever.
> To avoid doing too much surgery to how core property changes work we
> could add this as a declaration-of-intent request to DEEP-COLOR:
>
> DPCSendPendingColorspaces
> 1 CARD8 opcode
> 1 X DPC opcode
> 2 unused
> 4 n number of ATOMs in list
> 4n ATOM colorspaces
>
> But: whether that colorspace list is cleared or changed, every client
> wakes up to notice. One way around this is to create a child window of
> the root that lives only to hold the deep color properties, and point
> to it with a root window property (that then never changes).
>
> This isn't exactly the first instance of this problem. I proposed
> adding property notify filters to fixes a while ago, which would
> address this whole category of problem. This might be a nice excuse to
> get that landed so we can stop making the problem worse.
Do you have any measurements of how much real-world pain this causes?
>> VISUALINFO: [ core_visual_id: VISUALID
>> pixel_format: CARD32 ]
>>
>> - pixel_format is an enumeration of pixel formats:
>> FP_R16G16B16A16 = 0,
>> UINT_R16G16B16A16,
>> UINT_A2R10B10G10,
>> UINT_A2B10G10R10,
>
> Is it worth doing the Atom trick for naming these?
Maybe? I think for both this and the colorspaces property, it's
important to allow future revisions of the spec to add new ones without
existing clients breaking. But unlike _DEEPCOLOR_COMPOSITOR_COLORSPACES,
if there are visuals that the compositor can't understand because they
were added in a later spec, I'm not sure how to deal with that.
> - ajax
More information about the xorg-devel
mailing list