Keep current OpenGL context when possible
authorPatrice Mandin <patmandin@gmail.com>
Fri, 26 Nov 2004 22:11:30 +0000
changeset 992 0324ce32b2d9
parent 991 12b13601a544
child 993 2662da16d668
Keep current OpenGL context when possible
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
--- 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;