SDL_GL_MakeCurrent: Only no-op redundant calls on *same* thread.

This ensures that we only no-op redundant calls if they're made on the
same thread as the last MakeCurrent with those arguments. This should
maek SDL behave better with multithreaded environments.
This commit is contained in:
Jørgen P. Tjernø 2013-07-09 12:58:54 -07:00
parent ea36ba4f4e
commit ab91b4ce14
2 changed files with 6 additions and 1 deletions

View file

@ -25,6 +25,7 @@
#include "SDL_messagebox.h"
#include "SDL_shape.h"
#include "SDL_thread.h"
/* The SDL video driver */
@ -301,6 +302,7 @@ struct SDL_VideoDevice
/* Cache current GL context; don't call the OS when it hasn't changed. */
SDL_Window *current_glwin;
SDL_GLContext current_glctx;
SDL_threadID current_glthread;
/* * * */
/* Data private to this driver */

View file

@ -2730,6 +2730,7 @@ SDL_GL_CreateContext(SDL_Window * window)
/* Creating a context is assumed to make it current in the SDL driver. */
_this->current_glwin = window;
_this->current_glctx = ctx;
_this->current_glthread = SDL_ThreadID();
return ctx;
}
@ -2738,6 +2739,7 @@ int
SDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext ctx)
{
int retval;
SDL_threadID thread = SDL_ThreadID();
if (!ctx) {
window = NULL;
@ -2749,13 +2751,14 @@ SDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext ctx)
}
}
if ((window == _this->current_glwin) && (ctx == _this->current_glctx)) {
if ((window == _this->current_glwin) && (ctx == _this->current_glctx) && (thread == _this->current_glthread)) {
retval = 0; /* we're already current. */
} else {
retval = _this->GL_MakeCurrent(_this, window, ctx);
if (retval == 0) {
_this->current_glwin = window;
_this->current_glctx = ctx;
_this->current_glthread = thread;
}
}