# HG changeset patch # User Patrice Mandin # Date 1101507090 0 # Node ID 0324ce32b2d9279685c639bcaf755b13a9d42439 # Parent 12b13601a5444d5ce627d158acd98c648cd9ae00 Keep current OpenGL context when possible diff -r 12b13601a544 -r 0324ce32b2d9 src/video/ataricommon/SDL_atarigl.c --- a/src/video/ataricommon/SDL_atarigl.c Fri Nov 26 16:16:50 2004 +0000 +++ b/src/video/ataricommon/SDL_atarigl.c Fri Nov 26 22:11:30 2004 +0000 @@ -80,13 +80,9 @@ return (gl_active); } -void SDL_AtariGL_Quit(_THIS) +void SDL_AtariGL_Quit(_THIS, SDL_bool unload) { #ifdef HAVE_OPENGL - if (!gl_active) { - return; - } - if (gl_oldmesa) { /* Old mesa implementations */ if (this->gl_data->OSMesaDestroyLDG) { @@ -106,7 +102,9 @@ } } - SDL_AtariGL_UnloadLibrary(this); + if (unload) { + SDL_AtariGL_UnloadLibrary(this); + } #endif /* HAVE_OPENGL */ gl_active = 0; @@ -378,6 +376,8 @@ GLenum osmesa_format; SDL_PixelFormat *pixel_format; Uint32 redmask; + int recreatecontext; + GLint newaccumsize; if (this->gl_config.dll_handle) { if (this->gl_data->OSMesaCreateContextExt == NULL) { @@ -440,11 +440,39 @@ break; } - gl_ctx = this->gl_data->OSMesaCreateContextExt( - osmesa_format, this->gl_config.depth_size, - this->gl_config.stencil_size, this->gl_config.accum_red_size + - this->gl_config.accum_green_size + this->gl_config.accum_blue_size + - this->gl_config.accum_alpha_size, NULL ); + /* Try to keep current context if possible */ + newaccumsize = + this->gl_config.accum_red_size + + this->gl_config.accum_green_size + + this->gl_config.accum_blue_size + + this->gl_config.accum_alpha_size; + recreatecontext=1; + if (gl_ctx && + (gl_curformat == osmesa_format) && + (gl_curdepth == this->gl_config.depth_size) && + (gl_curstencil == this->gl_config.stencil_size) && + (gl_curaccum == newaccumsize)) { + recreatecontext = 0; + } + if (recreatecontext) { + SDL_AtariGL_Quit(this, SDL_FALSE); + + gl_ctx = this->gl_data->OSMesaCreateContextExt( + osmesa_format, this->gl_config.depth_size, + this->gl_config.stencil_size, newaccumsize, NULL ); + + if (gl_ctx) { + gl_curformat = osmesa_format; + gl_curdepth = this->gl_config.depth_size; + gl_curstencil = this->gl_config.stencil_size; + gl_curaccum = newaccumsize; + } else { + gl_curformat = 0; + gl_curdepth = 0; + gl_curstencil = 0; + gl_curaccum = 0; + } + } return (gl_ctx != NULL); } @@ -454,6 +482,7 @@ GLenum osmesa_format; SDL_PixelFormat *pixel_format; Uint32 redmask; + int recreatecontext; if (this->gl_config.dll_handle) { if (this->gl_data->OSMesaCreateLDG == NULL) { @@ -520,9 +549,31 @@ break; } - gl_shadow = this->gl_data->OSMesaCreateLDG( - osmesa_format, GL_UNSIGNED_BYTE, current->w, current->h - ); + /* Try to keep current context if possible */ + recreatecontext=1; + if (gl_shadow && + (gl_curformat == osmesa_format) && + (gl_curwidth == current->w) && + (gl_curheight == current->h)) { + recreatecontext = 0; + } + if (recreatecontext) { + SDL_AtariGL_Quit(this, SDL_FALSE); + + gl_shadow = this->gl_data->OSMesaCreateLDG( + osmesa_format, GL_UNSIGNED_BYTE, current->w, current->h + ); + + if (gl_shadow) { + gl_curformat = osmesa_format; + gl_curwidth = current->w; + gl_curheight = current->h; + } else { + gl_curformat = 0; + gl_curwidth = 0; + gl_curheight = 0; + } + } return (gl_shadow != NULL); } diff -r 12b13601a544 -r 0324ce32b2d9 src/video/ataricommon/SDL_atarigl_c.h --- a/src/video/ataricommon/SDL_atarigl_c.h Fri Nov 26 16:16:50 2004 +0000 +++ b/src/video/ataricommon/SDL_atarigl_c.h Fri Nov 26 22:11:30 2004 +0000 @@ -61,6 +61,11 @@ /* mesa_gl.ldg, tiny_gl.ldg */ void *(*OSMesaCreateLDG)( long format, long type, long width, long height ); void (*OSMesaDestroyLDG)(void); + + /* Info needed to compare existing context with new asked one */ + int width, height; + GLenum format; + GLint depth,stencil,accum; }; /* Variable names */ @@ -71,10 +76,16 @@ #define gl_shadow (this->gl_data->gl_shadow) #define gl_convert (this->gl_data->ConvertSurface) #define gl_copyshadow (this->gl_data->CopyShadow) +#define gl_curformat (this->gl_data->format) +#define gl_curdepth (this->gl_data->depth) +#define gl_curstencil (this->gl_data->stencil) +#define gl_curaccum (this->gl_data->accum) +#define gl_curwidth (this->gl_data->width) +#define gl_curheight (this->gl_data->height) /* OpenGL functions */ extern int SDL_AtariGL_Init(_THIS, SDL_Surface *current); -extern void SDL_AtariGL_Quit(_THIS); +extern void SDL_AtariGL_Quit(_THIS, SDL_bool unload); extern void SDL_AtariGL_InitPointers(_THIS); extern int SDL_AtariGL_LoadLibrary(_THIS, const char *path); diff -r 12b13601a544 -r 0324ce32b2d9 src/video/gem/SDL_gemvideo.c --- a/src/video/gem/SDL_gemvideo.c Fri Nov 26 16:16:50 2004 +0000 +++ b/src/video/gem/SDL_gemvideo.c Fri Nov 26 22:11:30 2004 +0000 @@ -475,12 +475,6 @@ static void GEM_FreeBuffers(_THIS) { -#ifdef HAVE_OPENGL - if (gl_active) { - SDL_AtariGL_Quit(this); - } -#endif - /* Release buffer */ if ( GEM_buffer2 ) { free( GEM_buffer2 ); @@ -1047,6 +1041,12 @@ GEM_FreeBuffers(this); +#ifdef HAVE_OPENGL + if (gl_active) { + SDL_AtariGL_Quit(this, SDL_TRUE); + } +#endif + /* Destroy window */ if (GEM_handle>=0) { wind_close(GEM_handle); diff -r 12b13601a544 -r 0324ce32b2d9 src/video/xbios/SDL_xbios.c --- a/src/video/xbios/SDL_xbios.c Fri Nov 26 16:16:50 2004 +0000 +++ b/src/video/xbios/SDL_xbios.c Fri Nov 26 22:11:30 2004 +0000 @@ -434,12 +434,6 @@ { int i; -#ifdef HAVE_OPENGL - if (gl_active) { - SDL_AtariGL_Quit(this); - } -#endif - for (i=0;i<2;i++) { if (XBIOS_screensmem[i]!=NULL) { Mfree(XBIOS_screensmem[i]); @@ -859,6 +853,13 @@ Vsync(); #endif + +#ifdef HAVE_OPENGL + if (gl_active) { + SDL_AtariGL_Quit(this, SDL_TRUE); + } +#endif + if (XBIOS_oldpalette) { free(XBIOS_oldpalette); XBIOS_oldpalette=NULL;