changeset 655:38006d43f5a3

Avoid calling atexit(SDL_Quit) until after OpenGL initialization to avoid a segfault on exit when using fglrx
author Michael Pavone <pavone@retrodev.com>
date Thu, 01 Jan 2015 17:36:23 -0800
parents 98927f1b005b
children 24ccfd70133a
files render_sdl.c
diffstat 1 files changed, 8 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/render_sdl.c	Thu Jan 01 17:31:59 2015 -0800
+++ b/render_sdl.c	Thu Jan 01 17:36:23 2015 -0800
@@ -220,8 +220,6 @@
 		fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
 		exit(1);
 	}
-	atexit(SDL_Quit);
-	atexit(render_close_audio);
 	printf("width: %d, height: %d\n", width, height);
 	uint32_t flags = SDL_ANYFORMAT;
 
@@ -250,10 +248,12 @@
 	screen = SDL_SetVideoMode(width, height, 32, flags);
 	if (!screen) {
 		fprintf(stderr, "Unable to get SDL surface: %s\n", SDL_GetError());
+		SDL_Quit();
 		exit(1);
 	}
 	if (!use_gl && screen->format->BytesPerPixel != 2 && screen->format->BytesPerPixel != 4) {
 		fprintf(stderr, "BlastEm requires a 16-bit or 32-bit surface, SDL returned a %d-bit surface\n", screen->format->BytesPerPixel * 8);
+		SDL_Quit();
 		exit(1);
 	}
 #ifndef DISABLE_OPENGL
@@ -263,10 +263,12 @@
 		GLenum res = glewInit();
 		if (res != GLEW_OK) {
 			fprintf(stderr, "Initialization of GLEW failed with code %d\n", res);
+			SDL_Quit();
 			exit(1);
 		}
 		if (!GLEW_VERSION_2_0) {
 			fputs("OpenGL 2.0 is unable, falling back to standard SDL rendering\n", stderr);
+			SDL_Quit();
 			exit(1);
 		}
 		float aspect = (float)width / height;
@@ -327,6 +329,7 @@
 
 	if (SDL_OpenAudio(&desired, &actual) < 0) {
 		fprintf(stderr, "Unable to open SDL audio: %s\n", SDL_GetError());
+		SDL_Quit();
 		exit(1);
 	}
 	buffer_samples = actual.samples;
@@ -345,6 +348,9 @@
 		}
 	}
 	SDL_JoystickEventState(SDL_ENABLE);
+	
+	atexit(SDL_Quit);
+	atexit(render_close_audio);
 }
 #ifndef DISABLE_OPENGL
 void render_context_gl(vdp_context * context)