diff options
author | Jan Cholasta | 2015-03-22 13:13:10 +0100 |
---|---|---|
committer | Jan Cholasta | 2015-03-22 13:13:10 +0100 |
commit | a8ce2282fb8d7d21136b76da660ba2c8cdc0b791 (patch) | |
tree | 637d3da120048994db9f9bc944edf74c61d78db8 | |
download | aur-a8ce2282fb8d7d21136b76da660ba2c8cdc0b791.tar.gz |
Add gzdoom1-git package
-rw-r--r-- | .SRCINFO | 52 | ||||
-rw-r--r-- | .gitignore | 9 | ||||
-rw-r--r-- | PKGBUILD | 96 | ||||
-rw-r--r-- | config-update-fix.patch | 12 | ||||
-rw-r--r-- | doom-share-dir.patch | 11 | ||||
-rw-r--r-- | git-37321d1.patch | 182 | ||||
-rw-r--r-- | git-c915049.patch | 1119 | ||||
-rw-r--r-- | git-cab509c.patch | 143 | ||||
-rw-r--r-- | git-fb3bf0e.patch | 25 | ||||
-rw-r--r-- | gzdoom.desktop | 10 | ||||
-rw-r--r-- | stack-noexec.patch | 93 |
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 |