summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Cholasta2015-03-22 13:13:10 +0100
committerJan Cholasta2015-03-22 13:13:10 +0100
commita8ce2282fb8d7d21136b76da660ba2c8cdc0b791 (patch)
tree637d3da120048994db9f9bc944edf74c61d78db8
downloadaur-a8ce2282fb8d7d21136b76da660ba2c8cdc0b791.tar.gz
Add gzdoom1-git package
-rw-r--r--.SRCINFO52
-rw-r--r--.gitignore9
-rw-r--r--PKGBUILD96
-rw-r--r--config-update-fix.patch12
-rw-r--r--doom-share-dir.patch11
-rw-r--r--git-37321d1.patch182
-rw-r--r--git-c915049.patch1119
-rw-r--r--git-cab509c.patch143
-rw-r--r--git-fb3bf0e.patch25
-rw-r--r--gzdoom.desktop10
-rw-r--r--stack-noexec.patch93
11 files changed, 1752 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..ff580b070ad5
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,52 @@
+pkgbase = gzdoom1-git
+ pkgdesc = Doom source port based on ZDoom with an OpenGL renderer (git legacy version).
+ pkgver = 1.9pre.r1275.g1db064b
+ pkgrel = 1
+ url = http://www.osnanet.de/c.oelckers/gzdoom/
+ arch = i686
+ arch = x86_64
+ license = custom
+ makedepends = nasm
+ makedepends = cmake
+ makedepends = git
+ makedepends = imagemagick
+ makedepends = mesa
+ depends = fluidsynth
+ depends = fmodex4.26.36
+ depends = glew
+ depends = gtk2
+ depends = gxmessage
+ depends = sdl2
+ optdepends = blasphemer: Blasphemer (free Heretic) game data
+ optdepends = chexquest3-wad: Chex Quest 3 game data
+ optdepends = doom1-wad: Doom shareware game data
+ optdepends = freedoom: FreeDoom game data
+ optdepends = hacx-wad: HacX game data
+ optdepends = harmony-wad: Harmony game data
+ optdepends = heretic1-wad: Heretic shareware game data
+ optdepends = hexen1-wad: Hexen demo game data
+ optdepends = strife0-wad: Strife shareware game data
+ optdepends = urbanbrawl-wad: Urban Brawl: Action Doom 2 game data
+ provides = gzdoom
+ conflicts = gzdoom
+ source = gzdoom::git://github.com/coelckers/gzdoom.git#branch=Branch_g1.8.07
+ source = git-c915049.patch
+ source = git-37321d1.patch
+ source = git-cab509c.patch
+ source = git-fb3bf0e.patch
+ source = config-update-fix.patch
+ source = doom-share-dir.patch
+ source = stack-noexec.patch
+ source = gzdoom.desktop
+ md5sums = SKIP
+ md5sums = bc817312edc685a2823c9579723a43aa
+ md5sums = 25c80530b4540bf805a5b14a22b8ec37
+ md5sums = 5536e58fdeb11a7618f39bc5a325dafe
+ md5sums = 94d5d45d4fab4896c4c20b9daeacdb46
+ md5sums = d1df774110f513225760b83fcb271171
+ md5sums = ed6c7d1175146bedac3f5a59d09d8f4b
+ md5sums = b83081e982b742010df0afe36b4d49b6
+ md5sums = 3f5920d839086c9ad04ed1338c3fb546
+
+pkgname = gzdoom1-git
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000000..7bb10554e78c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+gzdoom
+
+/*.tar.gz
+/*.tar.bz2
+/*.tar.xz
+/*.zip
+/*.7z
+/pkg/
+/src/
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..9a3dcfcc9022
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,96 @@
+# Maintainer: Jan Cholasta <grubber at grubber cz>
+
+pkgname=gzdoom1-git
+pkgver=1.9pre.r1275.g1db064b
+pkgrel=1
+pkgdesc="Doom source port based on ZDoom with an OpenGL renderer (git legacy version)."
+arch=('i686' 'x86_64')
+url="http://www.osnanet.de/c.oelckers/gzdoom/"
+license=('custom')
+depends=('fluidsynth' 'fmodex4.26.36' 'glew' 'gtk2' 'gxmessage' 'sdl2')
+makedepends=('nasm' 'cmake' 'git' 'imagemagick' 'mesa')
+optdepends=('blasphemer: Blasphemer (free Heretic) game data'
+ 'chexquest3-wad: Chex Quest 3 game data'
+ 'doom1-wad: Doom shareware game data'
+ 'freedoom: FreeDoom game data'
+ 'hacx-wad: HacX game data'
+ 'harmony-wad: Harmony game data'
+ 'heretic1-wad: Heretic shareware game data'
+ 'hexen1-wad: Hexen demo game data'
+ 'strife0-wad: Strife shareware game data'
+ 'urbanbrawl-wad: Urban Brawl: Action Doom 2 game data')
+provides=('gzdoom')
+conflicts=('gzdoom')
+source=(gzdoom::git://github.com/coelckers/gzdoom.git#branch=Branch_g1.8.07
+ git-c915049.patch
+ git-37321d1.patch
+ git-cab509c.patch
+ git-fb3bf0e.patch
+ config-update-fix.patch
+ doom-share-dir.patch
+ stack-noexec.patch
+ gzdoom.desktop)
+md5sums=('SKIP'
+ 'bc817312edc685a2823c9579723a43aa'
+ '25c80530b4540bf805a5b14a22b8ec37'
+ '5536e58fdeb11a7618f39bc5a325dafe'
+ '94d5d45d4fab4896c4c20b9daeacdb46'
+ 'd1df774110f513225760b83fcb271171'
+ 'ed6c7d1175146bedac3f5a59d09d8f4b'
+ 'b83081e982b742010df0afe36b4d49b6'
+ '3f5920d839086c9ad04ed1338c3fb546')
+
+_fmodver=4.26.36
+_libdir=/usr/lib/gzdoom
+_sharedir=/usr/share/games/gzdoom
+
+pkgver() {
+ cd gzdoom
+ git describe --long --tags --match 'G*' | sed -r 's/^G//;s/([^-]*-g)/r\1/;s/-/./g'
+}
+
+prepare() {
+ cd gzdoom
+
+ patch -p1 <"$srcdir"/git-c915049.patch
+ patch -p1 <"$srcdir"/git-37321d1.patch
+ patch -p1 <"$srcdir"/git-cab509c.patch
+ patch -p1 <"$srcdir"/git-fb3bf0e.patch
+
+ patch -p1 <"$srcdir/config-update-fix.patch"
+ patch -p1 <"$srcdir/doom-share-dir.patch"
+ patch -p1 <"$srcdir/stack-noexec.patch"
+
+ sed -i "s|setPluginPath(progdir)|setPluginPath(\"$_libdir\")|" src/sound/fmodsound.cpp
+}
+
+build() {
+ cd gzdoom
+
+ cmake -DFMOD_INCLUDE_DIR=/usr/include/fmodex-$_fmodver \
+ -DFMOD_LIBRARY=/usr/lib/libfmodex-$_fmodver.so \
+ -DCMAKE_C_FLAGS="$CFLAGS -DSHARE_DIR=\\\"$_sharedir\\\"" \
+ -DCMAKE_CXX_FLAGS="$CXXFLAGS -DSHARE_DIR=\\\"$_sharedir\\\"" \
+ .
+ make
+
+ convert "src/win32/icon1.ico[2]" gzdoom.png
+}
+
+package() {
+ cd gzdoom
+
+ install -Dm755 gzdoom "$pkgdir/usr/bin/gzdoom"
+ install -Dm755 liboutput_sdl.so "$pkgdir/$_libdir/liboutput_sdl.so"
+ install -Dm644 gzdoom.pk3 "$pkgdir/$_sharedir/gzdoom.pk3"
+ install -Dm644 brightmaps.pk3 "$pkgdir/$_sharedir/brightmaps.pk3"
+ install -Dm644 lights.pk3 "$pkgdir/$_sharedir/lights.pk3"
+ ln -s /usr/share/doom/doom.wad "$pkgdir/$_sharedir/freedoomu.wad"
+ ln -s /usr/share/doom/doom2.wad "$pkgdir/$_sharedir/freedoom.wad"
+ ln -s /usr/share/doom/hexen.wad "$pkgdir/$_sharedir/hexendemo.wad"
+
+ install -Dm644 gzdoom.png "$pkgdir/usr/share/pixmaps/gzdoom.png"
+ install -Dm644 "$srcdir/gzdoom.desktop" "$pkgdir/usr/share/applications/gzdoom.desktop"
+ install -Dm644 docs/BUILDLIC.TXT "$pkgdir/usr/share/licenses/$pkgname/BUILDLIC.TXT"
+ install -Dm644 docs/doomlic.txt "$pkgdir/usr/share/licenses/$pkgname/DOOMLIC.TXT"
+}
diff --git a/config-update-fix.patch b/config-update-fix.patch
new file mode 100644
index 000000000000..b8d95d170b79
--- /dev/null
+++ b/config-update-fix.patch
@@ -0,0 +1,12 @@
+diff -ur gzdoom.orig/src/m_specialpaths.cpp gzdoom/src/m_specialpaths.cpp
+--- gzdoom.orig/src/m_specialpaths.cpp 2014-05-14 11:14:18.348734942 +0200
++++ gzdoom/src/m_specialpaths.cpp 2014-05-14 11:21:04.005405244 +0200
+@@ -497,7 +497,7 @@
+ // This can be removed after a release or two
+ // Transfer the old zdoom directory to the new location
+ bool moved = false;
+- FString oldpath = NicePath("~/.zdoom/");
++ FString oldpath = NicePath("~/.gzdoom/");
+ if (stat (oldpath, &extrainfo) != -1)
+ {
+ if (rename(oldpath, path) == -1)
diff --git a/doom-share-dir.patch b/doom-share-dir.patch
new file mode 100644
index 000000000000..8675694bf81a
--- /dev/null
+++ b/doom-share-dir.patch
@@ -0,0 +1,11 @@
+diff -ur gzdoom-1.6.00.orig/src/gameconfigfile.cpp gzdoom-1.6.00/src/gameconfigfile.cpp
+--- gzdoom-1.6.00.orig/src/gameconfigfile.cpp 2012-11-06 15:17:16.674596717 +0100
++++ gzdoom-1.6.00/src/gameconfigfile.cpp 2012-11-06 15:22:53.667933990 +0100
+@@ -140,6 +140,7 @@
+ #else
+ SetValueForKey ("Path", "~/" GAME_DIR, true);
+ SetValueForKey ("Path", SHARE_DIR, true);
++ SetValueForKey ("Path", "/usr/share/doom", true);
+ #endif
+ }
+
diff --git a/git-37321d1.patch b/git-37321d1.patch
new file mode 100644
index 000000000000..f2f878f770b8
--- /dev/null
+++ b/git-37321d1.patch
@@ -0,0 +1,182 @@
+From 37321d1d483cee0c01285774921fb861bd6f9c1e Mon Sep 17 00:00:00 2001
+From: Edoardo Prezioso <edo88@email.it>
+Date: Thu, 8 Jan 2015 00:23:14 +0100
+Subject: [PATCH] - Implement SDL2 into GZDoom (needs improvements).
+
+Make also minor fixes.
+Now it compiles and runs fine for me, except for the invisible cursor in the menu (no idea why).
+---
+ src/posix/sdl/sdlglvideo.cpp | 67 ++++++++++++++++++++++++++------------------
+ src/posix/sdl/sdlglvideo.h | 9 +++---
+ 2 files changed, 44 insertions(+), 32 deletions(-)
+
+diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp
+index 649989e..9331c0f 100644
+--- a/src/posix/sdl/sdlglvideo.cpp
++++ b/src/posix/sdl/sdlglvideo.cpp
+@@ -1,8 +1,6 @@
+
+ // HEADER FILES ------------------------------------------------------------
+
+-#include <iostream>
+-
+ #include "doomtype.h"
+
+ #include "templates.h"
+@@ -48,6 +46,7 @@ extern IVideo *Video;
+ // extern int vid_renderer;
+
+ EXTERN_CVAR (Float, Gamma)
++EXTERN_CVAR (Int, vid_adapter)
+ EXTERN_CVAR (Int, vid_displaybits)
+ EXTERN_CVAR (Int, vid_renderer)
+
+@@ -156,14 +155,19 @@ bool SDLGLVideo::NextMode (int *width, int *height, bool *letterbox)
+ }
+ else
+ {
+- SDL_Rect **modes = SDL_ListModes (NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
+- if (modes != NULL && modes[IteratorMode] != NULL)
++ SDL_DisplayMode mode = {}, oldmode = {};
++ if(IteratorMode != 0)
++ SDL_GetDisplayMode(vid_adapter, IteratorMode-1, &oldmode);
++ do
+ {
+- *width = modes[IteratorMode]->w;
+- *height = modes[IteratorMode]->h;
++ if (SDL_GetDisplayMode(vid_adapter, IteratorMode, &mode) != 0)
++ return false;
+ ++IteratorMode;
+- return true;
+- }
++ } while(mode.w == oldmode.w && mode.h == oldmode.h);
++
++ *width = mode.w;
++ *height = mode.h;
++ return true;
+ }
+ return false;
+ }
+@@ -182,11 +186,11 @@ DFrameBuffer *SDLGLVideo::CreateFrameBuffer (int width, int height, bool fullscr
+ if (fb->Width == width &&
+ fb->Height == height)
+ {
+- bool fsnow = (fb->Screen->flags & SDL_FULLSCREEN) != 0;
++ bool fsnow = (SDL_GetWindowFlags (fb->Screen) & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0;
+
+ if (fsnow != fullscreen)
+ {
+- SDL_WM_ToggleFullScreen (fb->Screen);
++ SDL_SetWindowFullscreen (fb->Screen, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
+ }
+ return old;
+ }
+@@ -336,30 +340,37 @@ SDLGLFB::SDLGLFB (void *, int width, int height, int, int, bool fullscreen)
+ return;
+ }
+
+-
+- Screen = SDL_SetVideoMode (width, height,
+- 32,
+- SDL_HWSURFACE|SDL_HWPALETTE|SDL_OPENGL | SDL_GL_DOUBLEBUFFER|SDL_ANYFORMAT|
+- (fullscreen ? SDL_FULLSCREEN : 0));
++ FString caption;
++ caption.Format(GAMESIG " %s (%s)", GetVersionString(), GetGitTime());
++ Screen = SDL_CreateWindow (caption,
++ SDL_WINDOWPOS_UNDEFINED_DISPLAY(vid_adapter), SDL_WINDOWPOS_UNDEFINED_DISPLAY(vid_adapter),
++ width, height, (fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0)|SDL_WINDOW_OPENGL);
+
+ if (Screen == NULL)
+ return;
+
+- m_supportsGamma = -1 != SDL_GetGammaRamp(m_origGamma[0], m_origGamma[1], m_origGamma[2]);
+-
+-#if defined(__APPLE__)
+- // Need to set title here because a window is not created yet when calling the same function from main()
+- char caption[100];
+- mysnprintf(caption, countof(caption), GAMESIG " %s (%s)", GetVersionString(), GetGitTime());
+- SDL_WM_SetCaption(caption, NULL);
+-#endif // __APPLE__
++ GLContext = SDL_GL_CreateContext(Screen);
++ if (GLContext == NULL)
++ return;
++
++ m_supportsGamma = -1 != SDL_GetWindowGammaRamp(Screen, m_origGamma[0], m_origGamma[1], m_origGamma[2]);
+ }
+
+ SDLGLFB::~SDLGLFB ()
+ {
+- if (m_supportsGamma)
++ if (Screen)
+ {
+- SDL_SetGammaRamp(m_origGamma[0], m_origGamma[1], m_origGamma[2]);
++ if (m_supportsGamma)
++ {
++ SDL_SetWindowGammaRamp(Screen, m_origGamma[0], m_origGamma[1], m_origGamma[2]);
++ }
++
++ if (GLContext)
++ {
++ SDL_GL_DeleteContext(GLContext);
++ }
++
++ SDL_DestroyWindow(Screen);
+ }
+ }
+
+@@ -386,7 +397,7 @@ bool SDLGLFB::CanUpdate ()
+
+ void SDLGLFB::SetGammaTable(WORD *tbl)
+ {
+- SDL_SetGammaRamp(&tbl[0], &tbl[256], &tbl[512]);
++ SDL_SetWindowGammaRamp(Screen, &tbl[0], &tbl[256], &tbl[512]);
+ }
+
+ bool SDLGLFB::Lock(bool buffered)
+@@ -420,7 +431,7 @@ bool SDLGLFB::IsLocked ()
+
+ bool SDLGLFB::IsFullscreen ()
+ {
+- return (Screen->flags & SDL_FULLSCREEN) != 0;
++ return (SDL_GetWindowFlags (Screen) & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0;
+ }
+
+
+@@ -443,6 +454,6 @@ void SDLGLFB::NewRefreshRate ()
+
+ void SDLGLFB::SwapBuffers()
+ {
+- SDL_GL_SwapBuffers ();
++ SDL_GL_SwapWindow (Screen);
+ }
+
+diff --git a/src/posix/sdl/sdlglvideo.h b/src/posix/sdl/sdlglvideo.h
+index 205e416..3867be6 100644
+--- a/src/posix/sdl/sdlglvideo.h
++++ b/src/posix/sdl/sdlglvideo.h
+@@ -3,7 +3,6 @@
+
+ #include "hardware.h"
+ #include "v_video.h"
+-#include <SDL.h>
+ #include "gl/system/gl_system.h"
+
+ EXTERN_CVAR (Float, dimamount)
+@@ -70,9 +69,11 @@ protected:
+ SDLGLFB () {}
+ BYTE GammaTable[3][256];
+ bool UpdatePending;
+-
+- SDL_Surface *Screen;
+-
++
++ SDL_Window *Screen;
++
++ SDL_GLContext GLContext;
++
+ void UpdateColors ();
+
+ int m_Lock;
+--
+2.3.2
+
diff --git a/git-c915049.patch b/git-c915049.patch
new file mode 100644
index 000000000000..accd958c5ea1
--- /dev/null
+++ b/git-c915049.patch
@@ -0,0 +1,1119 @@
+From c9150497e3472e1057ed8286237fcf07106a075d Mon Sep 17 00:00:00 2001
+From: Edoardo Prezioso <edo88@email.it>
+Date: Wed, 7 Jan 2015 21:07:40 +0100
+Subject: [PATCH] - Move sdlglvideo code from sdl to posix/sdl.
+
+Re-add sdlglvideo.cpp path in CMakeLists.txt . Warning: it won't compile yet.
+---
+ src/CMakeLists.txt | 6 +-
+ src/posix/sdl/sdlglvideo.cpp | 448 +++++++++++++++++++++++++++++++++++++++++++
+ src/posix/sdl/sdlglvideo.h | 82 ++++++++
+ src/sdl/sdlglvideo.cpp | 448 -------------------------------------------
+ src/sdl/sdlglvideo.h | 82 --------
+ 5 files changed, 532 insertions(+), 534 deletions(-)
+ create mode 100644 src/posix/sdl/sdlglvideo.cpp
+ create mode 100644 src/posix/sdl/sdlglvideo.h
+ delete mode 100644 src/sdl/sdlglvideo.cpp
+ delete mode 100644 src/sdl/sdlglvideo.h
+
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 4803006..3edcbaf 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -584,7 +584,8 @@ set( PLAT_SDL_SOURCES
+ posix/sdl/i_joystick.cpp
+ posix/sdl/i_main.cpp
+ posix/sdl/i_timer.cpp
+- posix/sdl/sdlvideo.cpp )
++ posix/sdl/sdlvideo.cpp
++ posix/sdl/sdlglvideo.cpp )
+ set( PLAT_OSX_SOURCES
+ posix/osx/iwadpicker_cocoa.mm
+ posix/osx/zdoom.icns )
+diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp
+new file mode 100644
+index 0000000..649989e
+--- /dev/null
++++ b/src/posix/sdl/sdlglvideo.cpp
+@@ -0,0 +1,448 @@
++
++// HEADER FILES ------------------------------------------------------------
++
++#include <iostream>
++
++#include "doomtype.h"
++
++#include "templates.h"
++#include "i_system.h"
++#include "i_video.h"
++#include "v_video.h"
++#include "v_pfx.h"
++#include "stats.h"
++#include "version.h"
++#include "c_console.h"
++
++#include "sdlglvideo.h"
++#include "gl/system/gl_system.h"
++#include "r_defs.h"
++#include "gl/gl_functions.h"
++//#include "gl/gl_intern.h"
++
++#include "gl/renderer/gl_renderer.h"
++#include "gl/system/gl_framebuffer.h"
++#include "gl/shaders/gl_shader.h"
++#include "gl/utility/gl_templates.h"
++#include "gl/textures/gl_material.h"
++#include "gl/system/gl_cvars.h"
++
++// MACROS ------------------------------------------------------------------
++
++// TYPES -------------------------------------------------------------------
++
++IMPLEMENT_ABSTRACT_CLASS(SDLGLFB)
++
++struct MiniModeInfo
++{
++ WORD Width, Height;
++};
++
++// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
++
++// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
++
++// EXTERNAL DATA DECLARATIONS ----------------------------------------------
++
++extern IVideo *Video;
++// extern int vid_renderer;
++
++EXTERN_CVAR (Float, Gamma)
++EXTERN_CVAR (Int, vid_displaybits)
++EXTERN_CVAR (Int, vid_renderer)
++
++
++// PUBLIC DATA DEFINITIONS -------------------------------------------------
++
++CUSTOM_CVAR(Int, gl_vid_multisample, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL )
++{
++ Printf("This won't take effect until " GAMENAME " is restarted.\n");
++}
++
++// PRIVATE DATA DEFINITIONS ------------------------------------------------
++
++// Dummy screen sizes to pass when windowed
++static MiniModeInfo WinModes[] =
++{
++ { 320, 200 },
++ { 320, 240 },
++ { 400, 225 }, // 16:9
++ { 400, 300 },
++ { 480, 270 }, // 16:9
++ { 480, 360 },
++ { 512, 288 }, // 16:9
++ { 512, 384 },
++ { 640, 360 }, // 16:9
++ { 640, 400 },
++ { 640, 480 },
++ { 720, 480 }, // 16:10
++ { 720, 540 },
++ { 800, 450 }, // 16:9
++ { 800, 500 }, // 16:10
++ { 800, 600 },
++ { 848, 480 }, // 16:9
++ { 960, 600 }, // 16:10
++ { 960, 720 },
++ { 1024, 576 }, // 16:9
++ { 1024, 600 }, // 17:10
++ { 1024, 640 }, // 16:10
++ { 1024, 768 },
++ { 1088, 612 }, // 16:9
++ { 1152, 648 }, // 16:9
++ { 1152, 720 }, // 16:10
++ { 1152, 864 },
++ { 1280, 720 }, // 16:9
++ { 1280, 800 }, // 16:10
++ { 1280, 960 },
++ { 1344, 756 }, // 16:9
++ { 1360, 768 }, // 16:9
++ { 1400, 787 }, // 16:9
++ { 1400, 875 }, // 16:10
++ { 1440, 900 },
++ { 1400, 1050 },
++ { 1600, 900 }, // 16:9
++ { 1600, 1000 }, // 16:10
++ { 1600, 1200 },
++ { 1680, 1050 }, // 16:10
++ { 1920, 1080 }, // 16:9
++ { 1920, 1200 }, // 16:10
++ { 2054, 1536 },
++ { 2560, 1440 }, // 16:9
++ { 2880, 1800 } // 16:10
++};
++
++// CODE --------------------------------------------------------------------
++
++SDLGLVideo::SDLGLVideo (int parm)
++{
++ IteratorBits = 0;
++ IteratorFS = false;
++ if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
++ fprintf( stderr, "Video initialization failed: %s\n",
++ SDL_GetError( ) );
++ }
++#ifndef _WIN32
++ // mouse cursor is visible by default on linux systems, we disable it by default
++ SDL_ShowCursor (0);
++#endif
++}
++
++SDLGLVideo::~SDLGLVideo ()
++{
++ if (GLRenderer != NULL) GLRenderer->FlushTextures();
++}
++
++void SDLGLVideo::StartModeIterator (int bits, bool fs)
++{
++ IteratorMode = 0;
++ IteratorBits = bits;
++ IteratorFS = fs;
++}
++
++bool SDLGLVideo::NextMode (int *width, int *height, bool *letterbox)
++{
++ if (IteratorBits != 8)
++ return false;
++
++ if (!IteratorFS)
++ {
++ if ((unsigned)IteratorMode < sizeof(WinModes)/sizeof(WinModes[0]))
++ {
++ *width = WinModes[IteratorMode].Width;
++ *height = WinModes[IteratorMode].Height;
++ ++IteratorMode;
++ return true;
++ }
++ }
++ else
++ {
++ SDL_Rect **modes = SDL_ListModes (NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
++ if (modes != NULL && modes[IteratorMode] != NULL)
++ {
++ *width = modes[IteratorMode]->w;
++ *height = modes[IteratorMode]->h;
++ ++IteratorMode;
++ return true;
++ }
++ }
++ return false;
++}
++
++DFrameBuffer *SDLGLVideo::CreateFrameBuffer (int width, int height, bool fullscreen, DFrameBuffer *old)
++{
++ static int retry = 0;
++ static int owidth, oheight;
++
++ PalEntry flashColor;
++// int flashAmount;
++
++ if (old != NULL)
++ { // Reuse the old framebuffer if its attributes are the same
++ SDLGLFB *fb = static_cast<SDLGLFB *> (old);
++ if (fb->Width == width &&
++ fb->Height == height)
++ {
++ bool fsnow = (fb->Screen->flags & SDL_FULLSCREEN) != 0;
++
++ if (fsnow != fullscreen)
++ {
++ SDL_WM_ToggleFullScreen (fb->Screen);
++ }
++ return old;
++ }
++// old->GetFlash (flashColor, flashAmount);
++ delete old;
++ }
++ else
++ {
++ flashColor = 0;
++// flashAmount = 0;
++ }
++
++ SDLGLFB *fb = new OpenGLFrameBuffer (0, width, height, 32, 60, fullscreen);
++ retry = 0;
++
++ // If we could not create the framebuffer, try again with slightly
++ // different parameters in this order:
++ // 1. Try with the closest size
++ // 2. Try in the opposite screen mode with the original size
++ // 3. Try in the opposite screen mode with the closest size
++ // This is a somewhat confusing mass of recursion here.
++
++ while (fb == NULL || !fb->IsValid ())
++ {
++ if (fb != NULL)
++ {
++ delete fb;
++ }
++
++ switch (retry)
++ {
++ case 0:
++ owidth = width;
++ oheight = height;
++ case 2:
++ // Try a different resolution. Hopefully that will work.
++ I_ClosestResolution (&width, &height, 8);
++ break;
++
++ case 1:
++ // Try changing fullscreen mode. Maybe that will work.
++ width = owidth;
++ height = oheight;
++ fullscreen = !fullscreen;
++ break;
++
++ default:
++ // I give up!
++ I_FatalError ("Could not create new screen (%d x %d)", owidth, oheight);
++
++ fprintf( stderr, "!!! [SDLGLVideo::CreateFrameBuffer] Got beyond I_FatalError !!!" );
++ return NULL; //[C] actually this shouldn't be reached; probably should be replaced with an ASSERT
++ }
++
++ ++retry;
++ fb = static_cast<SDLGLFB *>(CreateFrameBuffer (width, height, fullscreen, NULL));
++ }
++
++// fb->SetFlash (flashColor, flashAmount);
++ return fb;
++}
++
++void SDLGLVideo::SetWindowedScale (float scale)
++{
++}
++
++bool SDLGLVideo::SetResolution (int width, int height, int bits)
++{
++ // FIXME: Is it possible to do this without completely destroying the old
++ // interface?
++#ifndef NO_GL
++
++ if (GLRenderer != NULL) GLRenderer->FlushTextures();
++ I_ShutdownGraphics();
++
++ Video = new SDLGLVideo(0);
++ if (Video == NULL) I_FatalError ("Failed to initialize display");
++
++#if (defined(WINDOWS)) || defined(WIN32)
++ bits=32;
++#else
++ bits=24;
++#endif
++
++ V_DoModeSetup(width, height, bits);
++#endif
++ return true; // We must return true because the old video context no longer exists.
++}
++
++//==========================================================================
++//
++//
++//
++//==========================================================================
++
++bool SDLGLVideo::SetupPixelFormat(bool allowsoftware, int multisample)
++{
++ 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 );
++ if (multisample > 0) {
++ SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
++ SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, multisample );
++ }
++ return true;
++}
++
++//==========================================================================
++//
++//
++//
++//==========================================================================
++
++bool SDLGLVideo::InitHardware (bool allowsoftware, int multisample)
++{
++ if (!SetupPixelFormat(allowsoftware, multisample))
++ {
++ Printf ("R_OPENGL: Reverting to software mode...\n");
++ return false;
++ }
++ return true;
++}
++
++
++// FrameBuffer implementation -----------------------------------------------
++
++SDLGLFB::SDLGLFB (void *, int width, int height, int, int, bool fullscreen)
++ : DFrameBuffer (width, height)
++{
++ static int localmultisample=-1;
++
++ if (localmultisample<0) localmultisample=gl_vid_multisample;
++
++ int i;
++
++ m_Lock=0;
++
++ UpdatePending = false;
++
++ if (!static_cast<SDLGLVideo*>(Video)->InitHardware(false, localmultisample))
++ {
++ vid_renderer = 0;
++ return;
++ }
++
++
++ Screen = SDL_SetVideoMode (width, height,
++ 32,
++ SDL_HWSURFACE|SDL_HWPALETTE|SDL_OPENGL | SDL_GL_DOUBLEBUFFER|SDL_ANYFORMAT|
++ (fullscreen ? SDL_FULLSCREEN : 0));
++
++ if (Screen == NULL)
++ return;
++
++ m_supportsGamma = -1 != SDL_GetGammaRamp(m_origGamma[0], m_origGamma[1], m_origGamma[2]);
++
++#if defined(__APPLE__)
++ // Need to set title here because a window is not created yet when calling the same function from main()
++ char caption[100];
++ mysnprintf(caption, countof(caption), GAMESIG " %s (%s)", GetVersionString(), GetGitTime());
++ SDL_WM_SetCaption(caption, NULL);
++#endif // __APPLE__
++}
++
++SDLGLFB::~SDLGLFB ()
++{
++ if (m_supportsGamma)
++ {
++ SDL_SetGammaRamp(m_origGamma[0], m_origGamma[1], m_origGamma[2]);
++ }
++}
++
++
++
++
++void SDLGLFB::InitializeState()
++{
++}
++
++bool SDLGLFB::CanUpdate ()
++{
++ if (m_Lock != 1)
++ {
++ if (m_Lock > 0)
++ {
++ UpdatePending = true;
++ --m_Lock;
++ }
++ return false;
++ }
++ return true;
++}
++
++void SDLGLFB::SetGammaTable(WORD *tbl)
++{
++ SDL_SetGammaRamp(&tbl[0], &tbl[256], &tbl[512]);
++}
++
++bool SDLGLFB::Lock(bool buffered)
++{
++ m_Lock++;
++ Buffer = MemBuffer;
++ return true;
++}
++
++bool SDLGLFB::Lock ()
++{
++ return Lock(false);
++}
++
++void SDLGLFB::Unlock ()
++{
++ if (UpdatePending && m_Lock == 1)
++ {
++ Update ();
++ }
++ else if (--m_Lock <= 0)
++ {
++ m_Lock = 0;
++ }
++}
++
++bool SDLGLFB::IsLocked ()
++{
++ return m_Lock>0;// true;
++}
++
++bool SDLGLFB::IsFullscreen ()
++{
++ return (Screen->flags & SDL_FULLSCREEN) != 0;
++}
++
++
++bool SDLGLFB::IsValid ()
++{
++ return DFrameBuffer::IsValid() && Screen != NULL;
++}
++
++void SDLGLFB::SetVSync( bool vsync )
++{
++#if defined (__APPLE__)
++ const GLint value = vsync ? 1 : 0;
++ CGLSetParameter( CGLGetCurrentContext(), kCGLCPSwapInterval, &value );
++#endif
++}
++
++void SDLGLFB::NewRefreshRate ()
++{
++}
++
++void SDLGLFB::SwapBuffers()
++{
++ SDL_GL_SwapBuffers ();
++}
++
+diff --git a/src/posix/sdl/sdlglvideo.h b/src/posix/sdl/sdlglvideo.h
+new file mode 100644
+index 0000000..205e416
+--- /dev/null
++++ b/src/posix/sdl/sdlglvideo.h
+@@ -0,0 +1,82 @@
++#ifndef __SDLGLVIDEO_H__
++#define __SDLGLVIDEO_H__
++
++#include "hardware.h"
++#include "v_video.h"
++#include <SDL.h>
++#include "gl/system/gl_system.h"
++
++EXTERN_CVAR (Float, dimamount)
++EXTERN_CVAR (Color, dimcolor)
++
++struct FRenderer;
++FRenderer *gl_CreateInterface();
++
++class SDLGLVideo : public IVideo
++{
++ public:
++ SDLGLVideo (int parm);
++ ~SDLGLVideo ();
++
++ EDisplayType GetDisplayType () { return DISPLAY_Both; }
++ void SetWindowedScale (float scale);
++
++ DFrameBuffer *CreateFrameBuffer (int width, int height, bool fs, DFrameBuffer *old);
++
++ void StartModeIterator (int bits, bool fs);
++ bool NextMode (int *width, int *height, bool *letterbox);
++ bool SetResolution (int width, int height, int bits);
++
++ bool SetupPixelFormat(bool allowsoftware, int multisample);
++ bool InitHardware (bool allowsoftware, int multisample);
++
++private:
++ int IteratorMode;
++ int IteratorBits;
++ bool IteratorFS;
++};
++class SDLGLFB : public DFrameBuffer
++{
++ DECLARE_CLASS(SDLGLFB, DFrameBuffer)
++public:
++ // this must have the same parameters as the Windows version, even if they are not used!
++ SDLGLFB (void *hMonitor, int width, int height, int, int, bool fullscreen);
++ ~SDLGLFB ();
++
++ void ForceBuffering (bool force);
++ bool Lock(bool buffered);
++ bool Lock ();
++ void Unlock();
++ bool IsLocked ();
++
++ bool IsValid ();
++ bool IsFullscreen ();
++
++ virtual void SetVSync( bool vsync );
++ void SwapBuffers();
++
++ void NewRefreshRate ();
++
++ friend class SDLGLVideo;
++
++//[C]
++ int GetTrueHeight() { return GetHeight();}
++
++protected:
++ bool CanUpdate();
++ void SetGammaTable(WORD *tbl);
++ void InitializeState();
++
++ SDLGLFB () {}
++ BYTE GammaTable[3][256];
++ bool UpdatePending;
++
++ SDL_Surface *Screen;
++
++ void UpdateColors ();
++
++ int m_Lock;
++ Uint16 m_origGamma[3][256];
++ bool m_supportsGamma;
++};
++#endif
+diff --git a/src/sdl/sdlglvideo.cpp b/src/sdl/sdlglvideo.cpp
+deleted file mode 100644
+index 649989e..0000000
+--- a/src/sdl/sdlglvideo.cpp
++++ /dev/null
+@@ -1,448 +0,0 @@
+-
+-// HEADER FILES ------------------------------------------------------------
+-
+-#include <iostream>
+-
+-#include "doomtype.h"
+-
+-#include "templates.h"
+-#include "i_system.h"
+-#include "i_video.h"
+-#include "v_video.h"
+-#include "v_pfx.h"
+-#include "stats.h"
+-#include "version.h"
+-#include "c_console.h"
+-
+-#include "sdlglvideo.h"
+-#include "gl/system/gl_system.h"
+-#include "r_defs.h"
+-#include "gl/gl_functions.h"
+-//#include "gl/gl_intern.h"
+-
+-#include "gl/renderer/gl_renderer.h"
+-#include "gl/system/gl_framebuffer.h"
+-#include "gl/shaders/gl_shader.h"
+-#include "gl/utility/gl_templates.h"
+-#include "gl/textures/gl_material.h"
+-#include "gl/system/gl_cvars.h"
+-
+-// MACROS ------------------------------------------------------------------
+-
+-// TYPES -------------------------------------------------------------------
+-
+-IMPLEMENT_ABSTRACT_CLASS(SDLGLFB)
+-
+-struct MiniModeInfo
+-{
+- WORD Width, Height;
+-};
+-
+-// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
+-
+-// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
+-
+-// EXTERNAL DATA DECLARATIONS ----------------------------------------------
+-
+-extern IVideo *Video;
+-// extern int vid_renderer;
+-
+-EXTERN_CVAR (Float, Gamma)
+-EXTERN_CVAR (Int, vid_displaybits)
+-EXTERN_CVAR (Int, vid_renderer)
+-
+-
+-// PUBLIC DATA DEFINITIONS -------------------------------------------------
+-
+-CUSTOM_CVAR(Int, gl_vid_multisample, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL )
+-{
+- Printf("This won't take effect until " GAMENAME " is restarted.\n");
+-}
+-
+-// PRIVATE DATA DEFINITIONS ------------------------------------------------
+-
+-// Dummy screen sizes to pass when windowed
+-static MiniModeInfo WinModes[] =
+-{
+- { 320, 200 },
+- { 320, 240 },
+- { 400, 225 }, // 16:9
+- { 400, 300 },
+- { 480, 270 }, // 16:9
+- { 480, 360 },
+- { 512, 288 }, // 16:9
+- { 512, 384 },
+- { 640, 360 }, // 16:9
+- { 640, 400 },
+- { 640, 480 },
+- { 720, 480 }, // 16:10
+- { 720, 540 },
+- { 800, 450 }, // 16:9
+- { 800, 500 }, // 16:10
+- { 800, 600 },
+- { 848, 480 }, // 16:9
+- { 960, 600 }, // 16:10
+- { 960, 720 },
+- { 1024, 576 }, // 16:9
+- { 1024, 600 }, // 17:10
+- { 1024, 640 }, // 16:10
+- { 1024, 768 },
+- { 1088, 612 }, // 16:9
+- { 1152, 648 }, // 16:9
+- { 1152, 720 }, // 16:10
+- { 1152, 864 },
+- { 1280, 720 }, // 16:9
+- { 1280, 800 }, // 16:10
+- { 1280, 960 },
+- { 1344, 756 }, // 16:9
+- { 1360, 768 }, // 16:9
+- { 1400, 787 }, // 16:9
+- { 1400, 875 }, // 16:10
+- { 1440, 900 },
+- { 1400, 1050 },
+- { 1600, 900 }, // 16:9
+- { 1600, 1000 }, // 16:10
+- { 1600, 1200 },
+- { 1680, 1050 }, // 16:10
+- { 1920, 1080 }, // 16:9
+- { 1920, 1200 }, // 16:10
+- { 2054, 1536 },
+- { 2560, 1440 }, // 16:9
+- { 2880, 1800 } // 16:10
+-};
+-
+-// CODE --------------------------------------------------------------------
+-
+-SDLGLVideo::SDLGLVideo (int parm)
+-{
+- IteratorBits = 0;
+- IteratorFS = false;
+- if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
+- fprintf( stderr, "Video initialization failed: %s\n",
+- SDL_GetError( ) );
+- }
+-#ifndef _WIN32
+- // mouse cursor is visible by default on linux systems, we disable it by default
+- SDL_ShowCursor (0);
+-#endif
+-}
+-
+-SDLGLVideo::~SDLGLVideo ()
+-{
+- if (GLRenderer != NULL) GLRenderer->FlushTextures();
+-}
+-
+-void SDLGLVideo::StartModeIterator (int bits, bool fs)
+-{
+- IteratorMode = 0;
+- IteratorBits = bits;
+- IteratorFS = fs;
+-}
+-
+-bool SDLGLVideo::NextMode (int *width, int *height, bool *letterbox)
+-{
+- if (IteratorBits != 8)
+- return false;
+-
+- if (!IteratorFS)
+- {
+- if ((unsigned)IteratorMode < sizeof(WinModes)/sizeof(WinModes[0]))
+- {
+- *width = WinModes[IteratorMode].Width;
+- *height = WinModes[IteratorMode].Height;
+- ++IteratorMode;
+- return true;
+- }
+- }
+- else
+- {
+- SDL_Rect **modes = SDL_ListModes (NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
+- if (modes != NULL && modes[IteratorMode] != NULL)
+- {
+- *width = modes[IteratorMode]->w;
+- *height = modes[IteratorMode]->h;
+- ++IteratorMode;
+- return true;
+- }
+- }
+- return false;
+-}
+-
+-DFrameBuffer *SDLGLVideo::CreateFrameBuffer (int width, int height, bool fullscreen, DFrameBuffer *old)
+-{
+- static int retry = 0;
+- static int owidth, oheight;
+-
+- PalEntry flashColor;
+-// int flashAmount;
+-
+- if (old != NULL)
+- { // Reuse the old framebuffer if its attributes are the same
+- SDLGLFB *fb = static_cast<SDLGLFB *> (old);
+- if (fb->Width == width &&
+- fb->Height == height)
+- {
+- bool fsnow = (fb->Screen->flags & SDL_FULLSCREEN) != 0;
+-
+- if (fsnow != fullscreen)
+- {
+- SDL_WM_ToggleFullScreen (fb->Screen);
+- }
+- return old;
+- }
+-// old->GetFlash (flashColor, flashAmount);
+- delete old;
+- }
+- else
+- {
+- flashColor = 0;
+-// flashAmount = 0;
+- }
+-
+- SDLGLFB *fb = new OpenGLFrameBuffer (0, width, height, 32, 60, fullscreen);
+- retry = 0;
+-
+- // If we could not create the framebuffer, try again with slightly
+- // different parameters in this order:
+- // 1. Try with the closest size
+- // 2. Try in the opposite screen mode with the original size
+- // 3. Try in the opposite screen mode with the closest size
+- // This is a somewhat confusing mass of recursion here.
+-
+- while (fb == NULL || !fb->IsValid ())
+- {
+- if (fb != NULL)
+- {
+- delete fb;
+- }
+-
+- switch (retry)
+- {
+- case 0:
+- owidth = width;
+- oheight = height;
+- case 2:
+- // Try a different resolution. Hopefully that will work.
+- I_ClosestResolution (&width, &height, 8);
+- break;
+-
+- case 1:
+- // Try changing fullscreen mode. Maybe that will work.
+- width = owidth;
+- height = oheight;
+- fullscreen = !fullscreen;
+- break;
+-
+- default:
+- // I give up!
+- I_FatalError ("Could not create new screen (%d x %d)", owidth, oheight);
+-
+- fprintf( stderr, "!!! [SDLGLVideo::CreateFrameBuffer] Got beyond I_FatalError !!!" );
+- return NULL; //[C] actually this shouldn't be reached; probably should be replaced with an ASSERT
+- }
+-
+- ++retry;
+- fb = static_cast<SDLGLFB *>(CreateFrameBuffer (width, height, fullscreen, NULL));
+- }
+-
+-// fb->SetFlash (flashColor, flashAmount);
+- return fb;
+-}
+-
+-void SDLGLVideo::SetWindowedScale (float scale)
+-{
+-}
+-
+-bool SDLGLVideo::SetResolution (int width, int height, int bits)
+-{
+- // FIXME: Is it possible to do this without completely destroying the old
+- // interface?
+-#ifndef NO_GL
+-
+- if (GLRenderer != NULL) GLRenderer->FlushTextures();
+- I_ShutdownGraphics();
+-
+- Video = new SDLGLVideo(0);
+- if (Video == NULL) I_FatalError ("Failed to initialize display");
+-
+-#if (defined(WINDOWS)) || defined(WIN32)
+- bits=32;
+-#else
+- bits=24;
+-#endif
+-
+- V_DoModeSetup(width, height, bits);
+-#endif
+- return true; // We must return true because the old video context no longer exists.
+-}
+-
+-//==========================================================================
+-//
+-//
+-//
+-//==========================================================================
+-
+-bool SDLGLVideo::SetupPixelFormat(bool allowsoftware, int multisample)
+-{
+- 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 );
+- if (multisample > 0) {
+- SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
+- SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, multisample );
+- }
+- return true;
+-}
+-
+-//==========================================================================
+-//
+-//
+-//
+-//==========================================================================
+-
+-bool SDLGLVideo::InitHardware (bool allowsoftware, int multisample)
+-{
+- if (!SetupPixelFormat(allowsoftware, multisample))
+- {
+- Printf ("R_OPENGL: Reverting to software mode...\n");
+- return false;
+- }
+- return true;
+-}
+-
+-
+-// FrameBuffer implementation -----------------------------------------------
+-
+-SDLGLFB::SDLGLFB (void *, int width, int height, int, int, bool fullscreen)
+- : DFrameBuffer (width, height)
+-{
+- static int localmultisample=-1;
+-
+- if (localmultisample<0) localmultisample=gl_vid_multisample;
+-
+- int i;
+-
+- m_Lock=0;
+-
+- UpdatePending = false;
+-
+- if (!static_cast<SDLGLVideo*>(Video)->InitHardware(false, localmultisample))
+- {
+- vid_renderer = 0;
+- return;
+- }
+-
+-
+- Screen = SDL_SetVideoMode (width, height,
+- 32,
+- SDL_HWSURFACE|SDL_HWPALETTE|SDL_OPENGL | SDL_GL_DOUBLEBUFFER|SDL_ANYFORMAT|
+- (fullscreen ? SDL_FULLSCREEN : 0));
+-
+- if (Screen == NULL)
+- return;
+-
+- m_supportsGamma = -1 != SDL_GetGammaRamp(m_origGamma[0], m_origGamma[1], m_origGamma[2]);
+-
+-#if defined(__APPLE__)
+- // Need to set title here because a window is not created yet when calling the same function from main()
+- char caption[100];
+- mysnprintf(caption, countof(caption), GAMESIG " %s (%s)", GetVersionString(), GetGitTime());
+- SDL_WM_SetCaption(caption, NULL);
+-#endif // __APPLE__
+-}
+-
+-SDLGLFB::~SDLGLFB ()
+-{
+- if (m_supportsGamma)
+- {
+- SDL_SetGammaRamp(m_origGamma[0], m_origGamma[1], m_origGamma[2]);
+- }
+-}
+-
+-
+-
+-
+-void SDLGLFB::InitializeState()
+-{
+-}
+-
+-bool SDLGLFB::CanUpdate ()
+-{
+- if (m_Lock != 1)
+- {
+- if (m_Lock > 0)
+- {
+- UpdatePending = true;
+- --m_Lock;
+- }
+- return false;
+- }
+- return true;
+-}
+-
+-void SDLGLFB::SetGammaTable(WORD *tbl)
+-{
+- SDL_SetGammaRamp(&tbl[0], &tbl[256], &tbl[512]);
+-}
+-
+-bool SDLGLFB::Lock(bool buffered)
+-{
+- m_Lock++;
+- Buffer = MemBuffer;
+- return true;
+-}
+-
+-bool SDLGLFB::Lock ()
+-{
+- return Lock(false);
+-}
+-
+-void SDLGLFB::Unlock ()
+-{
+- if (UpdatePending && m_Lock == 1)
+- {
+- Update ();
+- }
+- else if (--m_Lock <= 0)
+- {
+- m_Lock = 0;
+- }
+-}
+-
+-bool SDLGLFB::IsLocked ()
+-{
+- return m_Lock>0;// true;
+-}
+-
+-bool SDLGLFB::IsFullscreen ()
+-{
+- return (Screen->flags & SDL_FULLSCREEN) != 0;
+-}
+-
+-
+-bool SDLGLFB::IsValid ()
+-{
+- return DFrameBuffer::IsValid() && Screen != NULL;
+-}
+-
+-void SDLGLFB::SetVSync( bool vsync )
+-{
+-#if defined (__APPLE__)
+- const GLint value = vsync ? 1 : 0;
+- CGLSetParameter( CGLGetCurrentContext(), kCGLCPSwapInterval, &value );
+-#endif
+-}
+-
+-void SDLGLFB::NewRefreshRate ()
+-{
+-}
+-
+-void SDLGLFB::SwapBuffers()
+-{
+- SDL_GL_SwapBuffers ();
+-}
+-
+diff --git a/src/sdl/sdlglvideo.h b/src/sdl/sdlglvideo.h
+deleted file mode 100644
+index 205e416..0000000
+--- a/src/sdl/sdlglvideo.h
++++ /dev/null
+@@ -1,82 +0,0 @@
+-#ifndef __SDLGLVIDEO_H__
+-#define __SDLGLVIDEO_H__
+-
+-#include "hardware.h"
+-#include "v_video.h"
+-#include <SDL.h>
+-#include "gl/system/gl_system.h"
+-
+-EXTERN_CVAR (Float, dimamount)
+-EXTERN_CVAR (Color, dimcolor)
+-
+-struct FRenderer;
+-FRenderer *gl_CreateInterface();
+-
+-class SDLGLVideo : public IVideo
+-{
+- public:
+- SDLGLVideo (int parm);
+- ~SDLGLVideo ();
+-
+- EDisplayType GetDisplayType () { return DISPLAY_Both; }
+- void SetWindowedScale (float scale);
+-
+- DFrameBuffer *CreateFrameBuffer (int width, int height, bool fs, DFrameBuffer *old);
+-
+- void StartModeIterator (int bits, bool fs);
+- bool NextMode (int *width, int *height, bool *letterbox);
+- bool SetResolution (int width, int height, int bits);
+-
+- bool SetupPixelFormat(bool allowsoftware, int multisample);
+- bool InitHardware (bool allowsoftware, int multisample);
+-
+-private:
+- int IteratorMode;
+- int IteratorBits;
+- bool IteratorFS;
+-};
+-class SDLGLFB : public DFrameBuffer
+-{
+- DECLARE_CLASS(SDLGLFB, DFrameBuffer)
+-public:
+- // this must have the same parameters as the Windows version, even if they are not used!
+- SDLGLFB (void *hMonitor, int width, int height, int, int, bool fullscreen);
+- ~SDLGLFB ();
+-
+- void ForceBuffering (bool force);
+- bool Lock(bool buffered);
+- bool Lock ();
+- void Unlock();
+- bool IsLocked ();
+-
+- bool IsValid ();
+- bool IsFullscreen ();
+-
+- virtual void SetVSync( bool vsync );
+- void SwapBuffers();
+-
+- void NewRefreshRate ();
+-
+- friend class SDLGLVideo;
+-
+-//[C]
+- int GetTrueHeight() { return GetHeight();}
+-
+-protected:
+- bool CanUpdate();
+- void SetGammaTable(WORD *tbl);
+- void InitializeState();
+-
+- SDLGLFB () {}
+- BYTE GammaTable[3][256];
+- bool UpdatePending;
+-
+- SDL_Surface *Screen;
+-
+- void UpdateColors ();
+-
+- int m_Lock;
+- Uint16 m_origGamma[3][256];
+- bool m_supportsGamma;
+-};
+-#endif
+--
+2.3.2
+
diff --git a/git-cab509c.patch b/git-cab509c.patch
new file mode 100644
index 000000000000..a48416598850
--- /dev/null
+++ b/git-cab509c.patch
@@ -0,0 +1,143 @@
+From cab509c4d20f0e5e57099d24792a853a7adaa326 Mon Sep 17 00:00:00 2001
+From: Edoardo Prezioso <edo88@email.it>
+Date: Thu, 8 Jan 2015 01:39:29 +0100
+Subject: [PATCH] Various improvements to SDL2 video code.
+
+- Ported the missing resolutions from zdoom.
+- Remove unneeded code which was removed also from zdoom.
+- Uncomment DOUBLEBUFFER GL attribute. It was present in the old SDL_SetVideoMode call code, so why not.
+---
+ src/posix/sdl/sdlglvideo.cpp | 60 ++++++++++++++++++--------------------------
+ src/posix/sdl/sdlglvideo.h | 1 -
+ 2 files changed, 25 insertions(+), 36 deletions(-)
+
+diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp
+index 9331c0f..54506b8 100644
+--- a/src/posix/sdl/sdlglvideo.cpp
++++ b/src/posix/sdl/sdlglvideo.cpp
+@@ -77,6 +77,7 @@ static MiniModeInfo WinModes[] =
+ { 720, 480 }, // 16:10
+ { 720, 540 },
+ { 800, 450 }, // 16:9
++ { 800, 480 },
+ { 800, 500 }, // 16:10
+ { 800, 600 },
+ { 848, 480 }, // 16:9
+@@ -91,23 +92,33 @@ static MiniModeInfo WinModes[] =
+ { 1152, 720 }, // 16:10
+ { 1152, 864 },
+ { 1280, 720 }, // 16:9
++ { 1280, 854 },
+ { 1280, 800 }, // 16:10
+ { 1280, 960 },
+- { 1344, 756 }, // 16:9
++ { 1280, 1024 }, // 5:4
+ { 1360, 768 }, // 16:9
++ { 1366, 768 },
+ { 1400, 787 }, // 16:9
+ { 1400, 875 }, // 16:10
+- { 1440, 900 },
+ { 1400, 1050 },
++ { 1440, 900 },
++ { 1440, 960 },
++ { 1440, 1080 },
+ { 1600, 900 }, // 16:9
+ { 1600, 1000 }, // 16:10
+ { 1600, 1200 },
+- { 1680, 1050 }, // 16:10
+- { 1920, 1080 }, // 16:9
+- { 1920, 1200 }, // 16:10
+- { 2054, 1536 },
+- { 2560, 1440 }, // 16:9
+- { 2880, 1800 } // 16:10
++ { 1920, 1080 },
++ { 1920, 1200 },
++ { 2048, 1536 },
++ { 2560, 1440 },
++ { 2560, 1600 },
++ { 2560, 2048 },
++ { 2880, 1800 },
++ { 3200, 1800 },
++ { 3840, 2160 },
++ { 3840, 2400 },
++ { 4096, 2160 },
++ { 5120, 2880 }
+ };
+
+ // CODE --------------------------------------------------------------------
+@@ -115,7 +126,6 @@ static MiniModeInfo WinModes[] =
+ SDLGLVideo::SDLGLVideo (int parm)
+ {
+ IteratorBits = 0;
+- IteratorFS = false;
+ if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
+ fprintf( stderr, "Video initialization failed: %s\n",
+ SDL_GetError( ) );
+@@ -135,38 +145,18 @@ void SDLGLVideo::StartModeIterator (int bits, bool fs)
+ {
+ IteratorMode = 0;
+ IteratorBits = bits;
+- IteratorFS = fs;
+ }
+
+ bool SDLGLVideo::NextMode (int *width, int *height, bool *letterbox)
+ {
+ if (IteratorBits != 8)
+ return false;
+-
+- if (!IteratorFS)
+- {
+- if ((unsigned)IteratorMode < sizeof(WinModes)/sizeof(WinModes[0]))
+- {
+- *width = WinModes[IteratorMode].Width;
+- *height = WinModes[IteratorMode].Height;
+- ++IteratorMode;
+- return true;
+- }
+- }
+- else
+- {
+- SDL_DisplayMode mode = {}, oldmode = {};
+- if(IteratorMode != 0)
+- SDL_GetDisplayMode(vid_adapter, IteratorMode-1, &oldmode);
+- do
+- {
+- if (SDL_GetDisplayMode(vid_adapter, IteratorMode, &mode) != 0)
+- return false;
+- ++IteratorMode;
+- } while(mode.w == oldmode.w && mode.h == oldmode.h);
+
+- *width = mode.w;
+- *height = mode.h;
++ if ((unsigned)IteratorMode < sizeof(WinModes)/sizeof(WinModes[0]))
++ {
++ *width = WinModes[IteratorMode].Width;
++ *height = WinModes[IteratorMode].Height;
++ ++IteratorMode;
+ return true;
+ }
+ return false;
+@@ -294,7 +284,7 @@ bool SDLGLVideo::SetupPixelFormat(bool allowsoftware, int multisample)
+ 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 );
++ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+ if (multisample > 0) {
+ SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
+ SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, multisample );
+diff --git a/src/posix/sdl/sdlglvideo.h b/src/posix/sdl/sdlglvideo.h
+index 3867be6..c2be3ba 100644
+--- a/src/posix/sdl/sdlglvideo.h
++++ b/src/posix/sdl/sdlglvideo.h
+@@ -32,7 +32,6 @@ class SDLGLVideo : public IVideo
+ private:
+ int IteratorMode;
+ int IteratorBits;
+- bool IteratorFS;
+ };
+ class SDLGLFB : public DFrameBuffer
+ {
+--
+2.3.2
+
diff --git a/git-fb3bf0e.patch b/git-fb3bf0e.patch
new file mode 100644
index 000000000000..327126642bfe
--- /dev/null
+++ b/git-fb3bf0e.patch
@@ -0,0 +1,25 @@
+From fb3bf0eb5868742d1771834588a4bbf3c888ac7d Mon Sep 17 00:00:00 2001
+From: Edoardo Prezioso <edo88@email.it>
+Date: Thu, 8 Jan 2015 13:18:00 +0100
+Subject: [PATCH] - Oops, forgot to reinclude missing SDL header.
+
+Strangely it compiled fine for me, though.
+---
+ src/posix/sdl/sdlglvideo.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/posix/sdl/sdlglvideo.h b/src/posix/sdl/sdlglvideo.h
+index c2be3ba..19e6a5f 100644
+--- a/src/posix/sdl/sdlglvideo.h
++++ b/src/posix/sdl/sdlglvideo.h
+@@ -3,6 +3,7 @@
+
+ #include "hardware.h"
+ #include "v_video.h"
++#include <SDL.h>
+ #include "gl/system/gl_system.h"
+
+ EXTERN_CVAR (Float, dimamount)
+--
+2.3.2
+
diff --git a/gzdoom.desktop b/gzdoom.desktop
new file mode 100644
index 000000000000..41c576528b02
--- /dev/null
+++ b/gzdoom.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Name=GZDoom
+GenericName=Enhanced Doom Engine
+Icon=gzdoom
+Exec=gzdoom %F
+Terminal=false
+Categories=Game;ActionGame;
diff --git a/stack-noexec.patch b/stack-noexec.patch
new file mode 100644
index 000000000000..c903e79dcf5f
--- /dev/null
+++ b/stack-noexec.patch
@@ -0,0 +1,93 @@
+diff -ur gzdoom-1.6.00.orig/src/asm_ia32/a.asm gzdoom-1.6.00/src/asm_ia32/a.asm
+--- gzdoom-1.6.00.orig/src/asm_ia32/a.asm 2012-11-06 15:17:27.061263504 +0100
++++ gzdoom-1.6.00/src/asm_ia32/a.asm 2012-11-06 15:24:25.474601731 +0100
+@@ -810,3 +810,13 @@
+ GLOBAL _rtext_a_end
+ _rtext_a_end:
+ %endif
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf32
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf64
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
+diff -ur gzdoom-1.6.00.orig/src/asm_ia32/misc.asm gzdoom-1.6.00/src/asm_ia32/misc.asm
+--- gzdoom-1.6.00.orig/src/asm_ia32/misc.asm 2012-11-06 15:17:27.064596838 +0100
++++ gzdoom-1.6.00/src/asm_ia32/misc.asm 2012-11-06 15:24:25.474601731 +0100
+@@ -198,3 +198,13 @@
+ pop ebx
+ emms
+ ret
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf32
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf64
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
+diff -ur gzdoom-1.6.00.orig/src/asm_ia32/tmap.asm gzdoom-1.6.00/src/asm_ia32/tmap.asm
+--- gzdoom-1.6.00.orig/src/asm_ia32/tmap.asm 2012-11-06 15:17:27.061263504 +0100
++++ gzdoom-1.6.00/src/asm_ia32/tmap.asm 2012-11-06 15:24:25.474601731 +0100
+@@ -1891,3 +1891,13 @@
+ selfmod rtext_start, rtext_end
+ call setpitch3
+ jmp setvlinebpl_
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf32
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf64
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
+diff -ur gzdoom-1.6.00.orig/src/asm_ia32/tmap2.asm gzdoom-1.6.00/src/asm_ia32/tmap2.asm
+--- gzdoom-1.6.00.orig/src/asm_ia32/tmap2.asm 2012-11-06 15:17:27.061263504 +0100
++++ gzdoom-1.6.00/src/asm_ia32/tmap2.asm 2012-11-06 15:24:25.474601731 +0100
+@@ -638,3 +638,13 @@
+ GLOBAL _rtext_tmap2_end
+ _rtext_tmap2_end:
+ %endif
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf32
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf64
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
+diff -ur gzdoom-1.6.00.orig/src/asm_ia32/tmap3.asm gzdoom-1.6.00/src/asm_ia32/tmap3.asm
+--- gzdoom-1.6.00.orig/src/asm_ia32/tmap3.asm 2012-11-06 15:17:27.061263504 +0100
++++ gzdoom-1.6.00/src/asm_ia32/tmap3.asm 2012-11-06 15:24:25.474601731 +0100
+@@ -342,3 +342,13 @@
+ GLOBAL _rtext_tmap3_end
+ _rtext_tmap3_end:
+ %endif
++
++%ifidn __OUTPUT_FORMAT__,elf
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf32
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
++%ifidn __OUTPUT_FORMAT__,elf64
++section .note.GNU-stack noalloc noexec nowrite progbits
++%endif
+diff -ur gzdoom-1.6.00.orig/src/asm_x86_64/tmap3.s gzdoom-1.6.00/src/asm_x86_64/tmap3.s
+--- gzdoom-1.6.00.orig/src/asm_x86_64/tmap3.s 2012-11-06 15:17:30.497930211 +0100
++++ gzdoom-1.6.00/src/asm_x86_64/tmap3.s 2012-11-06 15:24:25.474601731 +0100
+@@ -139,3 +139,4 @@
+ .align 16
+
+
++ .section .note.GNU-stack,"",@progbits