]> git.sesse.net Git - movit/commitdiff
Support SDL2.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 9 Mar 2014 11:54:18 +0000 (12:54 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 9 Mar 2014 11:54:18 +0000 (12:54 +0100)
The primary motivation for this is that SDL2 supports core contexts
and GLES (although it doesn't seem to work well with Mesa on my machine
yet). We support SDL1 for the time being too, though, which causes a
small bit of spaghetti.

Makefile.in
configure.ac
demo.cpp
gtest_sdl_main.cpp

index 4936ccfd9e325b7e0801191d2b2b2c650eab9e74..7b1698ed5a83d3ecff172f774476ffce4cfd6799 100644 (file)
@@ -8,12 +8,16 @@ datarootdir = @datarootdir@
 datadir = @datadir@
 top_builddir = @top_builddir@
 with_demo_app = @with_demo_app@
+with_SDL2 = @with_SDL2@
 
 CC=@CC@
 CXX=@CXX@
-CXXFLAGS=-Wall @CXXFLAGS@ -I$(GTEST_DIR)/include @Eigen3_CFLAGS@ @epoxy_CFLAGS@
-LDFLAGS=@epoxy_LIBS@ @SDL_LIBS@ -lpthread
-DEMO_LDLIBS=@SDL_image_LIBS@ -lrt -lpthread @libpng_LIBS@
+CXXFLAGS=-Wall @CXXFLAGS@ -I$(GTEST_DIR)/include @SDL2_CFLAGS@ @SDL_CFLAGS@ @Eigen3_CFLAGS@ @epoxy_CFLAGS@
+ifeq ($(with_SDL2),yes)
+CXXFLAGS += -DHAVE_SDL2
+endif
+LDFLAGS=@epoxy_LIBS@ @SDL2_LIBS@ @SDL_LIBS@ -lpthread
+DEMO_LDLIBS=@SDL2_image_LIBS@ @SDL_image_LIBS@ -lrt -lpthread @libpng_LIBS@
 SHELL=@SHELL@
 LIBTOOL=@LIBTOOL@ --tag=CXX
 RANLIB=ranlib
index 7b265b54b5b1be48edb001c43a35c8711275c692..79e99cadbaf0162dba9c83cf17968339ebed5261 100644 (file)
@@ -9,15 +9,24 @@ AC_PROG_CXX
 PKG_CHECK_MODULES([Eigen3], [eigen3])
 PKG_CHECK_MODULES([epoxy], [epoxy])
 
-# Needed for unit tests and the demo app.
-PKG_CHECK_MODULES([SDL], [sdl])
+# Needed for unit tests and the demo app. We prefer SDL2 if possible,
+# but can also use classic SDL.
+with_SDL2=no
+with_demo_app=yes
+PKG_CHECK_MODULES([SDL2], [sdl2], [with_SDL2=yes], [
+  PKG_CHECK_MODULES([SDL], [sdl])
+])
 
 # These are only needed for the demo app.
-with_demo_app=yes
-PKG_CHECK_MODULES([SDL_image], [SDL_image], [], [with_demo_app=no; AC_MSG_WARN([SDL_image not found, demo program will not be built])])
+if test $with_SDL2 = "yes"; then
+  PKG_CHECK_MODULES([SDL2_image], [SDL2_image], [], [with_demo_app=no; AC_MSG_WARN([SDL2_image not found, demo program will not be built])])
+else
+  PKG_CHECK_MODULES([SDL_image], [SDL_image], [], [with_demo_app=no; AC_MSG_WARN([SDL_image not found, demo program will not be built])])
+fi
 PKG_CHECK_MODULES([libpng], [libpng12], [], [with_demo_app=no; AC_MSG_WARN([libpng12 not found, demo program will not be built])])
 
 AC_SUBST([with_demo_app])
+AC_SUBST([with_SDL2])
 
 AC_CONFIG_FILES([Makefile movit.pc])
 AC_OUTPUT
index 96864e905e39ef016c5e36326b3aec4939d34250..c9b46ea7ed6f78f08be936cb1c5f6199e8d98141 100644 (file)
--- a/demo.cpp
+++ b/demo.cpp
@@ -5,6 +5,16 @@
 #define HEIGHT 720
 
 #include <epoxy/gl.h>
+
+#ifdef HAVE_SDL2
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_error.h>
+#include <SDL2/SDL_events.h>
+#include <SDL2/SDL_image.h>
+#include <SDL2/SDL_keyboard.h>
+#include <SDL2/SDL_mouse.h>
+#include <SDL2/SDL_video.h>
+#else
 #include <SDL/SDL.h>
 #include <SDL/SDL_error.h>
 #include <SDL/SDL_events.h>
@@ -13,6 +23,8 @@
 #include <SDL/SDL_keysym.h>
 #include <SDL/SDL_mouse.h>
 #include <SDL/SDL_video.h>
+#endif
+
 #include <assert.h>
 #include <features.h>
 #include <math.h>
@@ -121,9 +133,11 @@ unsigned char *load_image(const char *filename, unsigned *w, unsigned *h)
        rgba_fmt.Gshift = 8;
        rgba_fmt.Bshift = 0;
        rgba_fmt.Ashift = 24;
-       
+
+#ifndef HAVE_SDL2
        rgba_fmt.colorkey = 0;
        rgba_fmt.alpha = 255;
+#endif
 
        SDL_Surface *converted = SDL_ConvertSurface(img, &rgba_fmt, SDL_SWSURFACE);
 
@@ -175,8 +189,19 @@ int main(int argc, char **argv)
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);
        SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+
+#ifdef HAVE_SDL2
+       SDL_Window *window = SDL_CreateWindow("OpenGL window",
+               SDL_WINDOWPOS_UNDEFINED,
+               SDL_WINDOWPOS_UNDEFINED,
+               WIDTH, HEIGHT,
+               SDL_WINDOW_OPENGL);
+       SDL_GLContext context = SDL_GL_CreateContext(window);
+       assert(context != NULL);
+#else
        SDL_SetVideoMode(WIDTH, HEIGHT, 0, SDL_OPENGL);
        SDL_WM_SetCaption("OpenGL window", NULL);
+#endif
 
        CHECK(init_movit(".", MOVIT_DEBUG_ON));
        printf("GPU texture subpixel precision: about %.1f bits\n",
@@ -288,7 +313,11 @@ int main(int argc, char **argv)
                draw_saturation_bar(0.75f, blur_radius / 100.0f);
                draw_saturation_bar(0.80f, blurred_mix_amount);
 
+#ifdef HAVE_SDL2
+               SDL_GL_SwapWindow(window);
+#else
                SDL_GL_SwapBuffers();
+#endif
                check_error();
 
                glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pbo);
index 39027e6be3246f75fae37a09d333859920ff539b..cd68777721e19cc92b300920fd094473ef5d5a7d 100644 (file)
@@ -1,8 +1,14 @@
 #define GTEST_HAS_EXCEPTIONS 0
 
+#ifdef HAVE_SDL2
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_error.h>
+#include <SDL2/SDL_video.h>
+#else
 #include <SDL/SDL.h>
 #include <SDL/SDL_error.h>
 #include <SDL/SDL_video.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -17,8 +23,28 @@ int main(int argc, char **argv) {
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);
        SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+
+#ifdef HAVE_SDL2
+       // You can uncomment this if you want to try a core context.
+       // For Mesa, you can get the same effect by doing
+       //
+       //   export MESA_GL_VERSION_OVERRIDE=3.1FC
+       //
+       // before running tests.
+//     SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
+//     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+//     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
+       SDL_Window *window = SDL_CreateWindow("OpenGL window for unit test",
+               SDL_WINDOWPOS_UNDEFINED,
+               SDL_WINDOWPOS_UNDEFINED,
+               32, 32,
+               SDL_WINDOW_OPENGL);
+       SDL_GLContext context = SDL_GL_CreateContext(window);
+       assert(context != NULL);
+#else
        SDL_SetVideoMode(32, 32, 0, SDL_OPENGL);
        SDL_WM_SetCaption("OpenGL window for unit test", NULL);
+#endif
 
        testing::InitGoogleTest(&argc, argv);
        int err = RUN_ALL_TESTS();