From 0df86b88886abbd2f6632966351e5f38293803fe Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 30 Sep 2012 01:08:48 -0700 Subject: [PATCH] The gl_data is optional for the driver, so don't early out of the context delete call if it doesn't exist. --- src/video/SDL_video.c | 2 +- src/video/windows/SDL_windowsopengl.c | 8 +++++ src/video/x11/SDL_x11opengl.c | 8 +++++ src/video/x11/SDL_x11opengles.c | 48 +++++++++++++++------------ 4 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 1fc8db497..24c44bbf6 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2639,7 +2639,7 @@ SDL_GL_SwapWindow(SDL_Window * window) void SDL_GL_DeleteContext(SDL_GLContext context) { - if (!_this || !_this->gl_data || !context) { + if (!_this || !context) { return; } _this->GL_MakeCurrent(_this, NULL, NULL); diff --git a/src/video/windows/SDL_windowsopengl.c b/src/video/windows/SDL_windowsopengl.c index 6088f9c45..f6029f6e5 100644 --- a/src/video/windows/SDL_windowsopengl.c +++ b/src/video/windows/SDL_windowsopengl.c @@ -613,6 +613,11 @@ WIN_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) HDC hdc; int status; + if (!_this->gl_data) { + SDL_SetError("OpenGL not initialized"); + return -1; + } + if (window) { hdc = ((SDL_WindowData *) window->driverdata)->hdc; } else { @@ -666,6 +671,9 @@ WIN_GL_SwapWindow(_THIS, SDL_Window * window) void WIN_GL_DeleteContext(_THIS, SDL_GLContext context) { + if (!_this->gl_data) { + return; + } _this->gl_data->wglDeleteContext((HGLRC) context); } diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index c9f391fc0..c05ccefa2 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -610,6 +610,11 @@ X11_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) GLXContext glx_context = (GLXContext) context; int status; + if (!_this->gl_data) { + SDL_SetError("OpenGL not initialized"); + return -1; + } + status = 0; if (!_this->gl_data->glXMakeCurrent(display, drawable, glx_context)) { SDL_SetError("Unable to make GL context current"); @@ -714,6 +719,9 @@ X11_GL_DeleteContext(_THIS, SDL_GLContext context) Display *display = ((SDL_VideoData *) _this->driverdata)->display; GLXContext glx_context = (GLXContext) context; + if (!_this->gl_data) { + return; + } _this->gl_data->glXDestroyContext(display, glx_context); XSync(display, False); } diff --git a/src/video/x11/SDL_x11opengles.c b/src/video/x11/SDL_x11opengles.c index 03599e89d..6cced5e3f 100644 --- a/src/video/x11/SDL_x11opengles.c +++ b/src/video/x11/SDL_x11opengles.c @@ -358,6 +358,11 @@ X11_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) // SDL_WindowData *data = (SDL_WindowData *) window->driverdata; // Display *display = data->videodata->display; + if (!_this->gles_data) { + SDL_SetError("OpenGL not initialized"); + return -1; + } + retval = 1; if (!_this->gles_data->eglMakeCurrent(_this->gles_data->egl_display, _this->gles_data->egl_surface, @@ -412,32 +417,33 @@ void X11_GLES_DeleteContext(_THIS, SDL_GLContext context) { /* Clean up GLES and EGL */ - if (_this->gles_data) { - if (_this->gles_data->egl_context != EGL_NO_CONTEXT || - _this->gles_data->egl_surface != EGL_NO_SURFACE) { - _this->gles_data->eglMakeCurrent(_this->gles_data->egl_display, - EGL_NO_SURFACE, EGL_NO_SURFACE, - EGL_NO_CONTEXT); - - if (_this->gles_data->egl_context != EGL_NO_CONTEXT) { - _this->gles_data->eglDestroyContext(_this->gles_data->egl_display, - _this->gles_data-> - egl_context); - _this->gles_data->egl_context = EGL_NO_CONTEXT; - } + if (!_this->gles_data) { + return; + } - if (_this->gles_data->egl_surface != EGL_NO_SURFACE) { - _this->gles_data->eglDestroySurface(_this->gles_data->egl_display, - _this->gles_data-> - egl_surface); - _this->gles_data->egl_surface = EGL_NO_SURFACE; - } + if (_this->gles_data->egl_context != EGL_NO_CONTEXT || + _this->gles_data->egl_surface != EGL_NO_SURFACE) { + _this->gles_data->eglMakeCurrent(_this->gles_data->egl_display, + EGL_NO_SURFACE, EGL_NO_SURFACE, + EGL_NO_CONTEXT); + + if (_this->gles_data->egl_context != EGL_NO_CONTEXT) { + _this->gles_data->eglDestroyContext(_this->gles_data->egl_display, + _this->gles_data-> + egl_context); + _this->gles_data->egl_context = EGL_NO_CONTEXT; } - /* crappy fix */ - X11_GLES_UnloadLibrary(_this); + if (_this->gles_data->egl_surface != EGL_NO_SURFACE) { + _this->gles_data->eglDestroySurface(_this->gles_data->egl_display, + _this->gles_data-> + egl_surface); + _this->gles_data->egl_surface = EGL_NO_SURFACE; + } } + /* crappy fix */ + X11_GLES_UnloadLibrary(_this); } #endif /* SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_ES */