On Friday 10 August 2001 19:35, Ryan C. Gordon wrote:
> > What to do? Well, you could use some kind of wrapper API for the
> > rendering functions, designed with asynchronous execution in mind.
> > Then implement that wrapper API on top of some thread safe queue
> > mechanism (one lock-free FIFO per client thread, perhaps), so that
> > the API calls enqueue "commands" instead of calling the "real" API.
> > Finally, implement a "server" that takes commands from the queue
> > (possibly with some priority system, and perhaps even
> > splitting/interleaving of large operations) and performs them using
> > the underlying "real" API.
>> ...or don't use OpenGL in immediate mode. To a degree, you're
> describing what happens under the hood between your first OpenGL call
> and glFlush().
Not really, unless I'm missing something... The very point of my proposed
solution is to be able to interleave the actual rendering operations with
whatever timing granularity you may need.
For example, I've developed a method of doing buffered, flicker and
tearing free animation on targets without hardware pageflipping. The
"trick" is based on two fundamental principles:
1) Refresh only part of the screen at a time, to reduce
the timing accuracy requirements for the raster sync.
This could be seen as a "pageflipping emulator".
2) Provide as much buffering as possible (keeping the
latency at an acceptable level) between the rendering
engine and the "pageflipping emulator".
That is, the "pageflipping emulator" has to blit from off-screen buffers
generated by the actual actual rendering code. The refreshing has to be
done either by polling a timer inside every rendering API call - or by a
higher priority thread. In the latter case, you can't use a rendering API
that isn't thread safe, so you have to resort to something like the queue
hack described above.
Both methods would require an API wrapper and some timer thread or
polling stuff for the "flipping". The only difference is whether the
latter is done in another thread in the other end of a FIFO, or directly
inside every rendering API call. (Note that the latter relies on the
application using those calls rather frequently, without stalling. If it
doesn't, the "pageflipping emulator" won't work!)
//David Olofson --- Programmer, Reologica Instruments AB
.- M A I A -------------------------------------------------.
| Multimedia Application Integration Architecture |
| A Free/Open Source Plugin API for Professional Multimedia |
`----------------------------> http://www.linuxdj.com/maia -'
.- David Olofson -------------------------------------------.
| Audio Hacker - Open Source Advocate - Singer - Songwriter |
`--------------------------------------> david at linuxdj.com -'