SDL_GL_MakeCurrent: Only no-op redundant calls on *same* thread.
authorJørgen P. Tjernø <jorgen@valvesoftware.com>
Tue, 09 Jul 2013 12:58:54 -0700
changeset 7390 e4b98404baa4
parent 7389 361d1a0c90f6
child 7391 a29895dc5e9a
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.
src/video/SDL_sysvideo.h
src/video/SDL_video.c
--- a/src/video/SDL_sysvideo.h	Tue Jul 09 12:57:12 2013 -0700
+++ b/src/video/SDL_sysvideo.h	Tue Jul 09 12:58:54 2013 -0700
@@ -25,6 +25,7 @@
 
 #include "SDL_messagebox.h"
 #include "SDL_shape.h"
+#include "SDL_thread.h"
 
 /* The SDL video driver */
 
@@ -301,6 +302,7 @@
     /* 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 */
--- a/src/video/SDL_video.c	Tue Jul 09 12:57:12 2013 -0700
+++ b/src/video/SDL_video.c	Tue Jul 09 12:58:54 2013 -0700
@@ -2730,6 +2730,7 @@
     /* 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 @@
 SDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext ctx)
 {
     int retval;
+    SDL_threadID thread = SDL_ThreadID();
 
     if (!ctx) {
         window = NULL;
@@ -2749,13 +2751,14 @@
         }
     }
 
-    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;
         }
     }