[Mesa-dev] [PATCH 3/3] egl/x11: Handle both depth 30 formats for eglCreateImage().
Mario Kleiner
mario.kleiner.de at gmail.com
Thu Apr 12 17:18:36 UTC 2018
On 04/10/2018 06:49 PM, Ilia Mirkin wrote:
> On Tue, Apr 10, 2018 at 4:42 AM, Michel Dänzer <michel at daenzer.net> wrote:
>> On 2018-04-10 10:22 AM, Mario Kleiner wrote:
>>> On 04/09/2018 12:12 PM, Michel Dänzer wrote:
>>>> On 2018-04-06 08:56 PM, Mario Kleiner wrote:
>>>>
>>>> I'm interested in the full xdpyinfo *at screen depth 30*, in particular
>>>> whether it lists only one variant of depth 30 visuals. If so, one
>>>> possibility for a kludge would be to just look at any depth 30 visual.
>>>
>>> Ok, the fresh v2 patch implements that kludge. This one retested to work
>>> on nouveau, ati, intel.
>>>
>>> On intel and nouveau we only get one channel mask for depth 30 visuals
>>> in xdpyinfo. On amd we get both masks for xrgb2101010 and xbgr2101010,
>>> as the amd gallium drivers expose both formats, but the ordering is
>>> xrgb2101010 first, so that's fine when picking the first depth 30 visual
>>> to get the channel mask for decisions.
>>
>> Hmm, that sounds fragile though when there are both variants; is there
>> any guarantee they can't appear in the opposite order?
Afaics the rough order is determined by how the state tracker builds the
list of __DRIconfig's in
mesa/src/gallium/state_trackers/dri/dri_screen.c:dri_fill_in_modes(),
ie. the ordering in the mesa_formats[] table at the top of that
function. MESA_FORMAT_B10G10R10A2_UNORM and
MESA_FORMAT_B10G10R10X2_UNORM are before MESA_FORMAT_R10G10B10A2_UNORM
and MESA_FORMAT_R10G10B10X2_UNORM, and that is a requirement of the
implementation that BGR[A/X] always comes before RGB[A/X].
The server processes those in the order they were generated when
building visuals: xserver/glx/glxscreens.c:__glXScreenInit() converts
pGlxScreen->fbconfigs retrieved from the Mesa driver into visuals. That
fbconfigs list is always traversed in forward order.
So this should hopefully guarantee that for a given depth we always get
the bgr10 formats we want before the rgb10 formats, and the order stays
the way we want, with the desired bgr10 format as first depth 30 format.
That said, looking at line 388 of xserver/glx/glxscreens.c, i wonder if
that check "if (depth == pScreen->visuals[i].nplanes)" is actually
sufficient? Maybe we should check for compatible channel masks there and
reject fbconfigs which don't find an existing X visual with matching
channel mask? We do check the channel mask in pickFBConfig() when
choosing FBConfigs for existing X Visuals in pass 1, but not when adding
new X Visuals for FBConfigs that don't have existing X Visuals in pass
2. That might get rid of the ambiguity and prevent exposing visuals that
the ddx/kms driver won't be able display properly?
>
> It seems like nouveau is stirring a bit of a hornet's nest here.
> Unfortunately there's not a whole lot I can do about hw scanout format
> support (rgb10x2 only, no bgr10x2 support until Kepler), but is there
> something else that the DDX and/or mesa driver should be doing to
> avoid some of this pain?
>
> Should we get the *other* ddx's to avoid exposing both masks?
I think the ddx's only expose one mask per ddx, and seing both might be
a X-Server problem (see above)? Maybe it could be beneficial if we
stopped the amd gallium drivers from marking the R10G10B10[X/A]2 configs
as PIPE_BIND_DISPLAY_TARGET if there isn't a use case for which they do
that, apart from the hw/driver being capable of supporting it? Intel
only supports bgrx ordering, nouveau only rgbx, amd both.
I have some half-finished wayland egl patches where it might help for
the multi-gpu prime renderoffload case to feed wl_buffers in a format
optimal for display on the server gpu instead of feeding them in a
format that can be displayed by the server gpu but requires an extra
copy. Not sure yet, half finished/half tested stuff, may not work out at
all in the end.
X11 Prime renderoffload is another unsolved problem with nouveau depth
30. Currently we get swapped red-blue with intel + nvidia. We could
extend the buffer creation code to convert nouveau's rgba format into
the bgra format wanted by intel or amd display gpu's during the
blitImage call for converting the tiled renderbuffer to the linear
buffer, like i try for the wayland+egl case. But we'd need to know what
the display gpu wants. Haven't looked into that.
-mario
>
> -ilia
>
More information about the mesa-dev
mailing list