[Mesa-dev] DRI3/Present fixes for Mesa 10.3+ (v2)
Mario Kleiner
mario.kleiner.de at gmail.com
Fri Dec 5 01:18:01 PST 2014
On 12/05/2014 03:41 AM, Eric Anholt wrote:
> Mario Kleiner <mario.kleiner.de at gmail.com> writes:
>
>> A slightly updated and extended series of the dri3/present fixes for Mesa i
>> sent last week.
>>
>> Patch 1 and 2 are same as before. Patch 3 now has signed off by Frank Binns
>> and reviewed by Chris Wilson. Patch 4 and 5 are additional fixes. The last
>> one makes INTEL_swap_events behave properly again when swap completion events
>> come in out of order due to skipped present requests. Before the first out
>> of sequence sbc event caused the INTEL_swap_events extension to become completely
>> unuseable for the rest of a session.
> Sent out review for 3 of them (time for me to head out instead of
> reviewing more code), and thanks for working on this. 2/5 it's not
> clear to me from my first read of the spec that you shouldn't expect to
> get the most recent values from either cause in your return. 5/5 my
> first thoughts were "I hate wraparound logic, I'll review this later.
> Also, should we even be saving off msc/ust for an out-of-order sbc
> event? Needs more thought."
>
> I'll try to think more about these later, but I wouldn't block on me.
Wrt. 2/5: It's a bit ambiguous how to read that bit of the spec, and i
agree that one could read it in a way that the current mesa dri3
behaviour is not (completely) violating the spec. When we implemented
the DRI2 version, we understood it in the way i want to restore with
2/5. The first reason is because the DRI2 / patch 2/5 interpretation
makes the OML_sync_control extension very useful and robust for swap
timing, whereas the alternative reading makes the extension borderline
useless / its use somewhat fragile due to the race described in the
commit. The second reason is backwards compatibility: It would be
awesome not to break timing sensitive apps written against DRI2,
especially given that users of those apps will certainly not understand
why a simple distribution upgrade or graphics stack update pushed by the
distro can suddenly cause such regressions.
In new app releases one could sort of work around such breakage by use
of the INTEL_swap_events extension assuming everything would be nicely
bug free. Unfortunately there were quite a few bugs and omissions and
limitations in various ddx and kms drivers even until very recently
which require funky workarounds, which require funky use of the
different bits of the OML_sync_control extension, in ways that would be
difficult to do without 2/5 restoring the DRI2 semantic.
As an example see
https://github.com/kleinerm/Psychtoolbox-3/blob/master/PsychSourceGL/Source/Linux/Screen/PsychWindowGlue.c#L1372
for my own toolkits backend implementation. It's a nice horror-show of
all the relevant bugs in DRI2/DRI3 since about 2010 with the collection
of workarounds needed to keep stuff working reasonably well on currently
shipping distros.
Wrt. 5/5: As a little helper, attached a little C test thingy for the
wraparound logic, running through a large range of simulated swap
events, exercising the logic for both overflow and underflow wraparound,
which i used to convince myself that i didn't screw up there with
integer overflows etc., apart from testing on the actual server for
normal use. In practice i don't think the wraparound logic in its
revised form will ever trigger. It takes a lot of time for a running app
to accumulate 2^32 bufferswaps.
As far as saving mst/ust for out-of-order sbc events: Yes, imho! The
Present extension allows to complete swaps in a order different from
their submission, e.g., you could submit a present request for target
msc 10000, then for 9000, then for 8000..., and Present would complete
them in order 8000, 9000, 10000 - this would cause the completion events
to come in in reverse order with decrementing sbc, instead of
incrementing. A valid case for dri3/present, and as INTEL_swap_events is
not restricted to ascending order, it should be able to handle that
case. Another case where one can see smaller inversions of the order is
when switching between vsynced and non-vsynced swaps, possibly when the
Present extension skips presents. I think a client could get mightily
confused if it would try to collect swap events for submitted swaps and
they don't show up.
However, what would be useful would be to extend INTEL_swap_events with
new enums for completion type. Something like GLX_ERROR_INTEL for a
present/swap that failed due to some error, e.g., out of memory, gpu
wedged, whatever, and then GLX_SKIPPED_INTEL for a skipped present.
Currently PresentCompleteModeSkip gets mapped to
GLX_COPY_COMPLETE_INTEL, losing that information, which would be
valuable for client applications like mine, which really need to know
for sure if specific content made it to the actual display unharmed, and
in which order.
Another thought i had: It would be good if we could expose somewhere if
mesa is using DRI2 or DRI3/Present in a given session, e.g., in the
GL_RENDERER string or maybe MESA_query_renderer extension. There are
some workarounds one needs for DRI2 which are not needed for DRI3,
potentially even harmful. There are things i (hope) i can do when i know
i'm running under a well working DRI3/Present backend, which i couldn't
do under DRI2. So i'd ideally need two different code paths and then
some way to decide which one to choose based on the mesa backend in use.
Ok, brain totally crashing, need to sleep.
Thanks,
-mario
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.c
Type: text/x-csrc
Size: 963 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141205/3abea13a/attachment.c>
More information about the mesa-dev
mailing list