From: Jesse Barnes <jbarnes@virtuousgeek.org>
To: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>,
chris@chris-wilson.co.uk, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/3] ddx/dri2: Repair broken pageflip swap scheduling.
Date: Mon, 10 Dec 2012 10:48:29 -0800 [thread overview]
Message-ID: <20121210104829.6226b8d7@jbarnes-desktop> (raw)
In-Reply-To: <509365D3.3080203@tuebingen.mpg.de>
> On 15.10.12 16:52, Chris Wilson wrote:
> > On Mon, 15 Oct 2012 16:46:52 +0200, Mario Kleiner
> <mario.kleiner@tuebingen.mpg.de> wrote:
> >> Hi Chris,
> >>
> >> can you please check & merge at least the first two patches of the
> >> series into the intel ddx?
>
> Thanks for the quick reply.
>
> >
> > The first is along the right path, but I think you want to base the
> > split on divisor==0.
>
> I don't think so, unless i misunderstand what you mean? The optimization
> of I830DRI2ScheduleFlip()'ing immediately should only happen in the case
> where current_msc is >= target_msc, ie., if the client really requests
> swap at next possible vblank, regardless what divisor is, once we've
> entered the whole ...
>
> if (divisor == 0 || current_msc < *target_msc) {
>
> ... block. Checking for divisor == 0 would be a nice little cleanup if
> only either (divisor == 0) or (current_msc < *target_msc) could be true.
> But it can happen that both (divisor == 0) and (current_msc <
> *target_msc) and then a check for (divisor == 0) wouldn't tell you if
> target_msc is in the future and the kernel vblank mechanism should
> schedule swap in the future, or if it is time for an immediate flip.
>
> Also i tested with various distances between successive swap and with
> divisor 0 vs. non-zero, so at least it works as advertised with the
> current patch.
>
> So that patch should be ok.
Yeah I don't understand the flip schedule at the top there either; if
target_msc is out in the future, why would we schedule a page flip
immediately just because divisor == 0?
Maybe it should look like this instead?
if (divisor == 0 || current_msc < *target_msc) {
if (divisor == 0 && current_msc >= *target_msc)
if (flip && I830DRI2ScheduleFlip(intel, draw, swap_info))
return TRUE;
(could clean that up a little but it captures the optimization I think
and avoids an extra vblank and potential frame delay.)
> The second is broken in the DRI2 layer, as the
> > SwapLimit mechanism exposes the multi-client race to a single client
> > (i.e. there is no serialisation between the InvalidateEvent and the
> > GetBuffers, and the InvalidateEvent is always broadcast too early.)
>
> Can you explain in more detail? I know there were many problems with the
> invalidate events, but thought that's ok now? Multi-client race case
> happens when a OpenGL app and a compositor is at work? So basically, the
> whole DRI2 setup is fundamentally broken for any swaplimit other than 1
> and we have to wait for a future DRI3 to fix this properly?
>
> I didn't see any weird behaviour during testing under both compiz+unity
> or without compositor with fullscreen OpenGL + pageflipping. Is this
> race common or was i just somehow lucky?
I'm not sure I understand Chris's comment either, however in the
redirected case the compositor is ultimately responsible for when
things show up on the screen, so timestamping is meaningless in that
case. However for fullscreen, unredirected windows (sounds like that's
what you tested), we should be able to properly queue and stamp things
as they complete AIUI.
> The
> > third is just plain wrong, as pageflip may be a blocking ioctl (and will
> > impose client blocking) so anybody who wants to override SwapBuffersWait
> > will also want to prevent the inherent wait due to the flip. In any
> > event that option is to only paper over the loose DRI2 specification and
> > the lack of client control...
>
> I don't think so: If you want to run non-vsynced/tearing with max.
> swaprate for benchmarks etc., then you must set "SwapBuffersWait" "off"
> and set the drawables swapinterval to zero via some .drmrc setting or
> the app calling glXSwapInterval etc. But once you've set the
> swapinterval to zero, the x-server *always* does an immediate copy blit
> and bypasses the whole vblank events / kms-pageflip mechanism. See
I think this comes down to what people expect of the "SwapbuffersWait"
option. Our man page indicates it's simply an anti-tearing feature, so
if you disable it I think users would expect swaps to occur as soon as
possible or when scheduled, regardless of potential tearing.
If we leave flipping enabled, I think we'll often hit cases where a
swap will be delayed until the next vblank (when the flip is latched
into the display engine) rather than occurring immediately or when the
vblank event for it fires, with likely tearing. Or do you think the
current code handles this case well enough that we can guarantee we
won't be delaying things by a frame sometimes?
If so, you can argue that this isn't a performance advantage, but then
it's a rather lame option anyway... So if/until we have async page
flips, I think the current behavior is probably fine.
Mario, do we have some small tests we can add to piglit for the
timestamping cases? Looking at simple client code always helps me
understand the complex DDX and server interaction better...
Also, I'm assuming all this works ok with triple buffering disabled?
What about with SNA?
Thanks,
--
Jesse Barnes, Intel Open Source Technology Center
next prev parent reply other threads:[~2012-12-10 18:48 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-07 6:38 Improvements and fixes for Intel ddx swap scheduling/timestamping Mario Kleiner
2012-10-07 6:38 ` [PATCH 1/3] ddx/dri2: Make triple-buffering compatible with timestamping on Xorg 1.12+ Mario Kleiner
2012-10-07 6:38 ` [PATCH 2/3] ddx/dri2: Repair broken pageflip swap scheduling Mario Kleiner
[not found] ` <509365D3.3080203@tuebingen.mpg.de>
2012-12-10 18:48 ` Jesse Barnes [this message]
2012-12-10 23:00 ` Jesse Barnes
2012-12-12 19:12 ` Mario Kleiner
2012-12-12 20:15 ` Mario Kleiner
2012-10-07 6:38 ` [PATCH 3/3] ddx/dri2: Prevent option 'SwapBuffersWait' from disabling pageflip Mario Kleiner
2012-10-08 8:00 ` Improvements and fixes for Intel ddx swap scheduling/timestamping Daniel Vetter
2012-10-08 16:08 ` Eric Anholt
2012-10-08 22:49 ` Mario Kleiner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121210104829.6226b8d7@jbarnes-desktop \
--to=jbarnes@virtuousgeek.org \
--cc=chris@chris-wilson.co.uk \
--cc=intel-gfx@lists.freedesktop.org \
--cc=mario.kleiner@tuebingen.mpg.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox