diff -Nur a/core/khronos/GL3/gl3w.c b/core/khronos/GL3/gl3w.c --- a/core/khronos/GL3/gl3w.c 2015-10-06 21:43:53.040336386 -0300 +++ b/core/khronos/GL3/gl3w.c 2015-10-06 22:04:39.682388782 -0300 @@ -1,6 +1,25 @@ #include -#ifdef _WIN32 +#if defined(USE_SDL2) + #include + static void open_libgl(void) + { + SDL_GL_LoadLibrary(NULL); + } + + static void close_libgl(void) + { + SDL_GL_UnloadLibrary(); + } + + static void *get_proc(const char *proc) + { + void *res = NULL; + res = (void*)SDL_GL_GetProcAddress(proc); + return res; + } + +#elif defined(_WIN32) #define WIN32_LEAN_AND_MEAN 1 #include diff -Nur a/core/sdl/sdl.cpp b/core/sdl/sdl.cpp --- a/core/sdl/sdl.cpp 2015-10-06 21:43:53.048336444 -0300 +++ b/core/sdl/sdl.cpp 2015-10-06 22:04:39.683388790 -0300 @@ -5,6 +5,18 @@ #include "sdl/sdl.h" #ifdef GLES #include +#else + #ifndef USE_SDL2 + #error "Our SDL1.2 implementation only supports GLES. You need SDL2 for OpenGL 3 support!" + #endif + #include "khronos/GL3/gl3w.h" +#endif + +#ifdef USE_SDL2 + static SDL_Window* window = NULL; + static SDL_GLContext glcontext; +#else + SDL_Surface *screen = NULL; #endif #ifdef TARGET_PANDORA @@ -14,8 +26,6 @@ #endif #define WINDOW_HEIGHT 480 -SDL_Surface *screen = NULL; - static SDL_Joystick *JoySDL = 0; extern bool FrameSkipping; @@ -80,11 +90,15 @@ AxisCount = SDL_JoystickNumAxes(JoySDL); ButtonCount = SDL_JoystickNumButtons(JoySDL); - Name = SDL_JoystickName(0); - + #ifdef USE_SDL2 + Name = SDL_JoystickName(JoySDL); + #else + Name = SDL_JoystickName(0); + #endif + printf("SDK: Found '%s' joystick with %d axes and %d buttons\n", Name, AxisCount, ButtonCount); - if (strcmp(Name,"Microsoft X-Box 360 pad")==0) + if (Name != NULL && strcmp(Name,"Microsoft X-Box 360 pad")==0) { sdl_map_btn = sdl_map_btn_xbox360; sdl_map_axis = sdl_map_axis_xbox360; @@ -113,12 +127,16 @@ } #endif - SDL_ShowCursor(0); + #ifndef USE_SDL2 + SDL_ShowCursor(0); - if (SDL_WM_GrabInput( SDL_GRAB_ON ) != SDL_GRAB_ON) - { - printf("SDK: Error while grabbing mouse\n"); - } + if (SDL_WM_GrabInput( SDL_GRAB_ON ) != SDL_GRAB_ON) + { + printf("SDL: Error while grabbing mouse\n"); + } + #else + SDL_SetRelativeMouseMode(SDL_TRUE); + #endif } void input_sdl_handle(u32 port) @@ -397,7 +415,14 @@ #ifdef TARGET_PANDORA strncpy(OSD_Counters, text, 256); #else - SDL_WM_SetCaption(text, NULL); // *TODO* Set Icon also... + #ifdef USE_SDL2 + if(window) + { + SDL_SetWindowTitle(window, text); // *TODO* Set Icon also... + } + #else + SDL_WM_SetCaption(text, NULL); + #endif #endif } @@ -415,17 +440,79 @@ int window_width = cfgLoadInt("x11","width", WINDOW_WIDTH); int window_height = cfgLoadInt("x11","height", WINDOW_HEIGHT); + #ifdef TARGET_PANDORA int flags = SDL_FULLSCREEN; #else int flags = SDL_SWSURFACE; #endif - screen = SDL_SetVideoMode(window_width, window_height, 0, flags); - if (!screen) - { - die("error creating SDL screen"); - } - x11_disp = EGL_DEFAULT_DISPLAY; - printf("Created SDL Windows (%ix%i) successfully\n", window_width, window_height); + + #if !defined(GLES) && defined(USE_SDL2) + flags |= SDL_WINDOW_OPENGL; + + 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, 1); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + + window = SDL_CreateWindow("Reicast Emulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, window_width, window_height, flags); + if (!window) + { + die("error creating SDL window"); + } + + glcontext = SDL_GL_CreateContext(window); + if (!glcontext) + { + die("Error creating SDL GL context"); + } + SDL_GL_MakeCurrent(window, NULL); + #else + screen = SDL_SetVideoMode(window_width, window_height, 0, flags); + if (!screen) + { + die("error creating SDL screen"); + } + + x11_disp = EGL_DEFAULT_DISPLAY; + #endif + + printf("Created SDL Window (%ix%i) and GL Context successfully\n", window_width, window_height); } #endif + +#if !defined(GLES) && defined(USE_SDL2) + extern int screen_width, screen_height; + + bool gl_init(void* wind, void* disp) + { + SDL_GL_MakeCurrent(window, glcontext); + return gl3wInit() != -1 && gl3wIsSupported(3, 1); + } + + void gl_swap() + { + SDL_GL_SwapWindow(window); + + /* Check if drawable has been resized */ + int new_width, new_height; + SDL_GL_GetDrawableSize(window, &new_width, &new_height); + + if (new_width != screen_width || new_height != screen_height) + { + screen_width = new_width; + screen_height = new_height; + } + } + + void gl_term() + { + SDL_GL_DeleteContext(glcontext); + } +#endif \ No newline at end of file diff -Nur a/core/sdl/sdl.h b/core/sdl/sdl.h --- a/core/sdl/sdl.h 2015-10-06 21:43:53.048336444 -0300 +++ b/core/sdl/sdl.h 2015-10-06 22:04:39.683388790 -0300 @@ -1,5 +1,9 @@ #pragma once -#include +#ifdef USE_SDL2 + #include +#else + #include +#endif extern void* sdl_glc; extern void input_sdl_init(); extern void input_sdl_handle(u32 port); diff -Nur a/shell/linux/Makefile b/shell/linux/Makefile --- a/shell/linux/Makefile 2015-10-06 21:43:53.161337253 -0300 +++ b/shell/linux/Makefile 2015-10-06 22:04:39.683388790 -0300 @@ -175,6 +175,10 @@ $(error Unknown platform) endif +ifdef USE_SDL2 + USE_SDL := 1 +endif + RZDCY_SRC_DIR = ../../core include $(RZDCY_SRC_DIR)/core.mk @@ -202,8 +206,14 @@ endif ifdef USE_SDL - CXXFLAGS += `sdl-config --cflags` -D USE_SDL - LIBS += `sdl-config --libs` + CXXFLAGS += -D USE_SDL + ifdef USE_SDL2 + CXXFLAGS += `sdl2-config --cflags` -D USE_SDL2 + LIBS += `sdl2-config --libs` + else + CXXFLAGS += `sdl-config --cflags` + LIBS += `sdl-config --libs` + endif endif ifdef PGO_MAKE