From 7d6f4ba69aab447b58af7fdc343d414b57b9c80d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 30 Jul 2009 14:53:57 +0000 Subject: [PATCH] Patch from David Carre: I fixed a bug in the "SDL_DestroyRenderer()" function in the pandora x11 renderer (in fact the bug was in the "X11_GLES_MakeCurrent()" function) that was causing a crash when exiting SDL. There was a problem while terminating the x11 egl window, that was preventing to quit/close SDL/SDL-window then reload SDL/SDL-window inside the same application. --- Makefile.pandora | 7 +++---- src/haptic/linux/SDL_syshaptic.c | 1 + src/video/x11/SDL_x11opengles.c | 10 +++++++--- src/video/x11/SDL_x11video.c | 25 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Makefile.pandora b/Makefile.pandora index bd7dca182..24e4e0bab 100644 --- a/Makefile.pandora +++ b/Makefile.pandora @@ -8,7 +8,7 @@ STRIP = arm-none-linux-gnueabi-strip CFLAGS = -O3 -march=armv7-a -mcpu=cortex-a8 -mtune=cortex-a8 -mfloat-abi=softfp \ -mfpu=neon -ftree-vectorize -ffast-math -fomit-frame-pointer -fno-strict-aliasing -fsingle-precision-constant \ - -I./include -I$(PNDSDK)/usr/include + -I./include -I$(PNDSDK)/usr/include -DSDL_REVISION=0 TARGET = libSDL.a @@ -24,14 +24,13 @@ SOURCES = ./src/*.c ./src/audio/*.c ./src/cdrom/*.c ./src/cpuinfo/*.c ./src/even OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') +CONFIG_H = $(shell cp include/SDL_config_pandora.h include/SDL_config.h && touch include/SDL_revision.h) + all: $(TARGET) $(TARGET): $(CONFIG_H) $(OBJECTS) $(AR) crv $@ $^ $(RANLIB) $@ -$(CONFIG_H): - cp include/SDL_config_pandora.h include/SDL_config.h - clean: rm -f $(TARGET) $(OBJECTS) diff --git a/src/haptic/linux/SDL_syshaptic.c b/src/haptic/linux/SDL_syshaptic.c index 91e986631..303a3f851 100644 --- a/src/haptic/linux/SDL_syshaptic.c +++ b/src/haptic/linux/SDL_syshaptic.c @@ -35,6 +35,7 @@ #include /* INT_MAX */ #include /* errno, strerror */ #include /* atan2 */ +#include /* stat */ /* Just in case. */ #ifndef M_PI diff --git a/src/video/x11/SDL_x11opengles.c b/src/video/x11/SDL_x11opengles.c index 6d4a8ba8c..8f40f16ae 100644 --- a/src/video/x11/SDL_x11opengles.c +++ b/src/video/x11/SDL_x11opengles.c @@ -298,8 +298,8 @@ X11_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) { int retval; - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - Display *display = data->videodata->display; +// SDL_WindowData *data = (SDL_WindowData *) window->driverdata; +// Display *display = data->videodata->display; retval = 1; if (!_this->gles_data->eglMakeCurrent(_this->gles_data->egl_display, @@ -309,7 +309,7 @@ X11_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) SDL_SetError("Unable to make EGL context current"); retval = -1; } - XSync(display, False); +// XSync(display, False); return (retval); } @@ -359,6 +359,10 @@ X11_GLES_DeleteContext(_THIS, SDL_GLContext context) } } _this->gles_data->egl_active = 0; + +/* crappy fix */ + X11_GLES_UnloadLibrary(_this); + } #endif /* SDL_VIDEO_OPENGL_ES */ diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index d26c5bc09..ab70c3448 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -28,6 +28,9 @@ #include "SDL_x11video.h" +#if SDL_VIDEO_DRIVER_PANDORA +#include "SDL_x11opengles.h" +#endif /* Initialization/Query functions */ static int X11_VideoInit(_THIS); @@ -101,6 +104,9 @@ X11_DeleteDevice(SDL_VideoDevice * device) } SDL_free(data->windowlist); SDL_free(device->driverdata); +#if SDL_VIDEO_DRIVER_PANDORA + SDL_free(device->gles_data); +#endif SDL_free(device); SDL_X11_UnloadSymbols(); @@ -131,6 +137,14 @@ X11_CreateDevice(int devindex) } device->driverdata = data; +#if SDL_VIDEO_DRIVER_PANDORA + device->gles_data = (struct SDL_PrivateGLESData *) SDL_calloc(1, sizeof(SDL_PrivateGLESData)); + if (!device->gles_data) { + SDL_OutOfMemory(); + return NULL; + } +#endif + /* FIXME: Do we need this? if ( (SDL_strncmp(XDisplayName(display), ":", 1) == 0) || (SDL_strncmp(XDisplayName(display), "unix:", 5) == 0) ) { @@ -198,6 +212,17 @@ X11_CreateDevice(int devindex) device->GL_SwapWindow = X11_GL_SwapWindow; device->GL_DeleteContext = X11_GL_DeleteContext; #endif +#if SDL_VIDEO_DRIVER_PANDORA + device->GL_LoadLibrary = X11_GLES_LoadLibrary; + device->GL_GetProcAddress = X11_GLES_GetProcAddress; + device->GL_UnloadLibrary = X11_GLES_UnloadLibrary; + device->GL_CreateContext = X11_GLES_CreateContext; + device->GL_MakeCurrent = X11_GLES_MakeCurrent; + device->GL_SetSwapInterval = X11_GLES_SetSwapInterval; + device->GL_GetSwapInterval = X11_GLES_GetSwapInterval; + device->GL_SwapWindow = X11_GLES_SwapWindow; + device->GL_DeleteContext = X11_GLES_DeleteContext; +#endif device->free = X11_DeleteDevice;