Patch from David Carre:
authorSam Lantinga <slouken@libsdl.org>
Thu, 30 Jul 2009 14:53:57 +0000
changeset 3218 81773a1eac83
parent 3217 26ce0b98f2fb
child 3219 b91354fa65a2
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
src/haptic/linux/SDL_syshaptic.c
src/video/x11/SDL_x11opengles.c
src/video/x11/SDL_x11video.c
--- a/Makefile.pandora	Sun Jul 19 08:04:59 2009 +0000
+++ b/Makefile.pandora	Thu Jul 30 14:53:57 2009 +0000
@@ -8,7 +8,7 @@
 
 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 @@
 
 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)
--- a/src/haptic/linux/SDL_syshaptic.c	Sun Jul 19 08:04:59 2009 +0000
+++ b/src/haptic/linux/SDL_syshaptic.c	Thu Jul 30 14:53:57 2009 +0000
@@ -35,6 +35,7 @@
 #include <limits.h>             /* INT_MAX */
 #include <errno.h>              /* errno, strerror */
 #include <math.h>               /* atan2 */
+#include <sys/stat.h>           /* stat */
 
 /* Just in case. */
 #ifndef M_PI
--- a/src/video/x11/SDL_x11opengles.c	Sun Jul 19 08:04:59 2009 +0000
+++ b/src/video/x11/SDL_x11opengles.c	Thu Jul 30 14:53:57 2009 +0000
@@ -298,8 +298,8 @@
 {
     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 @@
         SDL_SetError("Unable to make EGL context current");
         retval = -1;
     }
-    XSync(display, False);
+//    XSync(display, False);
 
     return (retval);
 }
@@ -359,6 +359,10 @@
         }
     }
     _this->gles_data->egl_active = 0;
+
+/* crappy fix */
+    X11_GLES_UnloadLibrary(_this);
+
 }
 
 #endif /* SDL_VIDEO_OPENGL_ES */
--- a/src/video/x11/SDL_x11video.c	Sun Jul 19 08:04:59 2009 +0000
+++ b/src/video/x11/SDL_x11video.c	Thu Jul 30 14:53:57 2009 +0000
@@ -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 @@
     }
     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 @@
     }
     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 @@
     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;