[SDL] can't do OpenGL inside of timer function
Brennan
ga972 at yahoo.com
Fri Oct 5 18:47:00 PDT 2001
Ok, it seems like the best way for me to code what I'm
trying to do is to just put a delay inside of the
infinite while loop and call my update_universe (I
eventually want to add some physics in there) after
the delay statement. I guess I'll have to avoid using
the timer function all together.
--- David Olofson <david.olofson at reologica.se> wrote:
> On Friday 05 October 2001 06:38, Brennan wrote:
> > I am learning both SDL and OpenGL and am having
> some
> > difficulty. Can someone please help me out?
> >
> > I copied the example from
> > http://sdldoc.csn.ul.ie/guidevideoopengl.php and
> > modified it so that I had a timer function and so
> it
> > was running in a window. (see attached)
> >
> > Why is it that I can not make any OpenGL calls or
> > SDL_PollEvent from inside the timer callback?
>
> Because neither SDL nor OpenGL are thread safe by
> design - and if you
> have an OpenGL implementation that is thread safe
> (ie is aware of
> preemptive context switches), SDL doesn't support
> it. You'd need to use
> special (wgl, glx or whatever) calls to "bind"
> threads to OpenGL contexts
> for that to work.
>
>
> > Along similar lines I have noticed that the main
> event
> > loop:
> >
> > while(1) { process_events(); draw_screen(); }
> >
> > causes an infinite loop.
>
> Of course it does - SDL_PollEvent() does *exactly*
> what the name implies.
>
> Use SDL_WaitEvent() instead.
>
>
> > Shouldn't an event loop block in some way?
>
> No, at least not on events, in your average single
> threaded game. (In
> fact, you can't use a blocking event API in a single
> threaded game,
> unless it's ok that the game freezes when there's no
> user input.)
>
>
> > Incoming events should not have to
> > be polled. They should be handled through
> callbacks.
> > And the draw_screen should be done in a timer
> > callback.
>
> I don't know about *should* here. It's a matter of
> taste and needs.
>
> Besides, rendering should block only of SDL_Flip(),
> which should perform
> a retrace synchronized hardware flip to the next
> buffer in a chain of
> three. Unfortunately, retrace sync as well as triple
> buffering is only
> possible on a few platforms, and triple buffering is
> not supported at all
> by SDL.
>
>
> > Is there a way to implement what I'm trying to do?
>
> Yes, but you have to shift things around a bit. Do
> the rendering from
> within your main thread, and move the event loop
> into a thread of it's
> own. Make sure that you *never* perform OpenGL
> calls, or SDL calls other
> than the event related ones, from the event thread
> context.
>
>
> > Is there a reason why I can't do OpenGL or SDL
> inside
> > of the timer callback? Is it that SDL can't do
> that
> > or something is wrong on my end?
>
> (See above.)
>
> The specific reason why it doesn't work at all on
> Win2k is probably that
> Win2k has some ideas about threading... You need
> some special wgl calls
> to tell OpenGL that you'll be calling from another
> thread than the main
> application thread.
>
>
> > I'm compiling under Cygwin under Windows 2000.
>
> Compiler shouldn't make a difference, but the code
> would probably work on
> some other platforms...
>
>
> //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 |
> `------------------------------------->
> http://olofson.net -'
>
> _______________________________________________
> SDL mailing list
> SDL at libsdl.org
> http://www.libsdl.org/mailman/listinfo/sdl
__________________________________________________
Do You Yahoo!?
NEW from Yahoo! GeoCities - quick and easy web site hosting, just $8.95/month.
http://geocities.yahoo.com/ps/info1
More information about the SDL
mailing list