From 5ba8c08fc0ebf3afec0b2c094454dd702f1438a5 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 9 Mar 2014 12:54:18 +0100 Subject: [PATCH] Support SDL2. 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 | 10 +++++++--- configure.ac | 17 +++++++++++++---- demo.cpp | 31 ++++++++++++++++++++++++++++++- gtest_sdl_main.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index 4936ccf..7b1698e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 diff --git a/configure.ac b/configure.ac index 7b265b5..79e99ca 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/demo.cpp b/demo.cpp index 96864e9..c9b46ea 100644 --- a/demo.cpp +++ b/demo.cpp @@ -5,6 +5,16 @@ #define HEIGHT 720 #include + +#ifdef HAVE_SDL2 +#include +#include +#include +#include +#include +#include +#include +#else #include #include #include @@ -13,6 +23,8 @@ #include #include #include +#endif + #include #include #include @@ -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); diff --git a/gtest_sdl_main.cpp b/gtest_sdl_main.cpp index 39027e6..cd68777 100644 --- a/gtest_sdl_main.cpp +++ b/gtest_sdl_main.cpp @@ -1,8 +1,14 @@ #define GTEST_HAS_EXCEPTIONS 0 +#ifdef HAVE_SDL2 +#include +#include +#include +#else #include #include #include +#endif #include #include @@ -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(); -- 2.39.2