From 0c68fac0601886d038ee33eafbbcb9f07229fc2a Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 15 Jul 2011 17:05:32 -0700 Subject: [PATCH] Turn SDL_GL_MakeCurrent() into a no-op if setting the same context twice. --- src/video/SDL_sysvideo.h | 5 +++++ src/video/SDL_video.c | 26 +++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 77aee20c7..416bfb6d2 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -276,6 +276,11 @@ struct SDL_VideoDevice void *dll_handle; } gl_config; + /* * * */ + /* Cache current GL context; don't call the OS when it hasn't changed. */ + SDL_Window *current_glwin; + SDL_GLContext current_glctx; + /* * * */ /* Data private to this driver */ void *driverdata; diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 414f1f5e5..ab178b924 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1931,6 +1931,13 @@ SDL_DestroyWindow(SDL_Window * window) CHECK_WINDOW_MAGIC(window, ); + /* make no context current if this is the current context window. */ + if (window->flags & SDL_WINDOW_OPENGL) { + if (_this->current_glwin == window) { + SDL_GL_MakeCurrent(NULL, NULL); + } + } + /* Restore video mode, etc. */ SDL_HideWindow(window); @@ -2462,18 +2469,31 @@ SDL_GL_CreateContext(SDL_Window * window) } int -SDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext context) +SDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext ctx) { + int retval; + CHECK_WINDOW_MAGIC(window, -1); if (!(window->flags & SDL_WINDOW_OPENGL)) { SDL_SetError("The specified window isn't an OpenGL window"); return -1; } - if (!context) { + if (!ctx) { window = NULL; } - return _this->GL_MakeCurrent(_this, window, context); + + if ((window == _this->current_glwin) && (ctx == _this->current_glctx)) { + 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; + } + } + + return retval; } int