Mercurial > sdl-ios-xcode
changeset 992:0324ce32b2d9
Keep current OpenGL context when possible
author | Patrice Mandin <patmandin@gmail.com> |
---|---|
date | Fri, 26 Nov 2004 22:11:30 +0000 |
parents | 12b13601a544 |
children | 2662da16d668 |
files | src/video/ataricommon/SDL_atarigl.c src/video/ataricommon/SDL_atarigl_c.h src/video/gem/SDL_gemvideo.c src/video/xbios/SDL_xbios.c |
diffstat | 4 files changed, 90 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- 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); }
--- 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);
--- 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);
--- 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;