De : Jesse Barnes <jbarnes <at> virtuousgeek.org>
À : Owen Taylor <otaylor <at> redhat.com>
Cc : Nicolas Cadio <nicolas.cadio <at> ymail.com>;
"mesa3d-dev <at> lists.sourceforge.net" <mesa3d-dev <at> lists.sourceforge.net>
Envoyé le : Mercredi, 1 Juillet 2009, 19h35mn 21s
Objet : Re: [Mesa3d-dev] Re : Re : Problem with the xdemo glsync
On Wed, 01 Jul 2009 11:53:14 -0400
Owen Taylor <
otaylor <at> redhat.com> wrote:
> On Tue, 2009-06-30 at 09:18 -0700, Jesse Barnes wrote:
> > That depends... If you're getting hit by scheduling latency (i.e.
> > your app doesn't actually get scheduled on the CPU until several ms
> > after the vblank interrupt fires), then there's no easy way to fix
> > it. You could try realtime scheduling and configuring things just
> > right so that your waiting apps always get scheduled in time, but
> >
that's going to be difficult in a general purpose environment.
> >
> > If the interrupt is arriving too late, you could try one of the
> > other hardware mechanisms (fire an interrupt at a scanline near the
> > bottom of the screen instead, to give you some extra time or
> > something).
>
> Without looking at the demo source code, I suspect the problem might
> be something else. The implementation of sgi_video_sync in Mesa simply
> waits for the vblank interval and does nothing else.
>
> So, if I:
>
> - Do a bunch of rendering
> - Wait for vblank
> - glXSwapBuffers
>
> Then my command buffers will not be flushed to the video card until
> after vblank. If the command buffers take time to execute, then the
> swap buffers is delayed and you get a tear. So, you need to glFlush()
> before waiting for
vblank.
Yeah, that's a good point. In the case of this demo we're just doing a
clear, so there shouldn't be much latency involved in buffer submission
for the swapbuffers (though there surely is some, sending a request to
the server for the copyregion isn't free).
>
> There's a more subtle reason why you want to actually glFinish()
> rather than glFlush() - if your rendering takes long enough so that
> you can't keep up with the refresh rate:
>
> - Do a bunch of rendering
> - glFlush
> - Wait for vblank
> - glXSwapBuffers
>
> Will cause the glXSwapBuffers to happen in the middle of a frame,
> while
>
> - Do a bunch of rendering
> - glFinish
> - Wait for vblank
> - glXSwapBuffers
>
> Will cause it to properly happen at the *second* vblank.
Of course glXSwapBuffers *should* just do the right thing
and not tear
by default (this happens with current radeon & intel drivers afaik).
So I'd discourage people from using SGI_video_sync for tear-avoidance
in general. If you get tearing with glXSwapBuffers, file a bug.
--
Jesse Barnes, Intel Open Source Technology Center