The gl_data is optional for the driver, so don't early out of the context delete call if it doesn't exist.

This commit is contained in:
Sam Lantinga 2012-09-30 01:08:48 -07:00
parent af57171b72
commit 8c71219642
4 changed files with 47 additions and 25 deletions

View file

@ -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);

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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->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);
if (!_this->gles_data) {
return;
}
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->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 */