diff --git a/gzdoom-sdlbug.patch b/gzdoom-sdlbug.patch new file mode 100644 index 0000000..a6ddd73 --- /dev/null +++ b/gzdoom-sdlbug.patch @@ -0,0 +1,35 @@ +From: Jan Engelhardt +Date: 2020-06-12 02:05:34.009865606 +0200 + +When a SDL_PollEvent is sandwiched between SDL_CreateWindow and +SDL_CreateRenderer, SDL crashes during SDL_IME_PumpEvents because dbus message +still references the old window (still exists and pointer is non-NULL) and +tries to access members of window->driverdata (block was freed and pointer is +NULL.) + +Workaround this by recreating the SDL_Window object and immediately afterwards +creating the renderer. + +This crash only happens for gzdoom when running with the SoftPoly rasterizer, +as that is the only place that issues SDL_CreateRenderer after the mainloop has +started. + +Needs a bugreport on libsdl.org. + +--- + src/common/platform/posix/sdl/sdlglvideo.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +Index: gzdoom-g4.4.1/src/common/platform/posix/sdl/sdlglvideo.cpp +=================================================================== +--- gzdoom-g4.4.1.orig/src/common/platform/posix/sdl/sdlglvideo.cpp ++++ gzdoom-g4.4.1/src/common/platform/posix/sdl/sdlglvideo.cpp +@@ -294,6 +294,8 @@ uint8_t *I_PolyPresentLock(int w, int h, + { + polyvsync = vsync; + ++ Priv::DestroyWindow(); ++ Priv::CreateWindow(Priv::VulkanWindowFlag | (Priv::softpolyEnabled ? SDL_WINDOW_HIDDEN : 0)); + polyrendertarget = SDL_CreateRenderer(Priv::window, -1, vsync ? SDL_RENDERER_PRESENTVSYNC : 0); + if (!polyrendertarget) + { diff --git a/gzdoom.changes b/gzdoom.changes index 9550d99..49f6659 100644 --- a/gzdoom.changes +++ b/gzdoom.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Fri Jun 12 00:26:10 UTC 2020 - Jan Engelhardt + +- Add gzdoom-sdlbug.patch. + ------------------------------------------------------------------- Thu Jun 11 15:19:30 UTC 2020 - Jan Engelhardt diff --git a/gzdoom.spec b/gzdoom.spec index 3acffcd..15ceb80 100644 --- a/gzdoom.spec +++ b/gzdoom.spec @@ -30,7 +30,8 @@ Patch1: gzdoom-waddir.patch Patch2: gzdoom-lzma.patch Patch3: gzdoom-asmjit.patch Patch4: gzdoom-spirv.patch -Patch5: gzdoom-vulkan.patch +Patch5: gzdoom-sdlbug.patch +Patch6: gzdoom-vulkan.patch BuildRequires: cmake >= 2.8.7 BuildRequires: gcc-c++ BuildRequires: libjpeg-devel @@ -77,9 +78,9 @@ GZDoom is a port (a modification) of the original Doom source code, featuring: %prep %setup -qn %name-g%version -%patch -P 1 -P 2 -P 3 -P 4 -p1 +%patch -P 1 -P 2 -P 3 -P 4 -P 5 -p1 %if 0%{?sle_version} >= 150200 -%patch -P 5 -p1 +%patch -P 6 -p1 rm -Rf glslang src/common/rendering/vulkan/thirdparty/vulkan %endif perl -i -pe 's{__DATE__}{""}g' src/posix/sdl/i_main.cpp