New package: dsda-doom-0.24.3
This commit is contained in:
parent
dbb688fca0
commit
57ddc05e99
165
srcpkgs/dsda-doom/patches/affinity-hack.patch
Normal file
165
srcpkgs/dsda-doom/patches/affinity-hack.patch
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
diff --git a/prboom2/CMakeLists.txt b/prboom2/CMakeLists.txt
|
||||||
|
index d317ddec..c86f76b0 100644
|
||||||
|
--- a/prboom2/CMakeLists.txt
|
||||||
|
+++ b/prboom2/CMakeLists.txt
|
||||||
|
@@ -53,6 +53,15 @@ endif()
|
||||||
|
check_symbol_exists(getopt "unistd.h" HAVE_GETOPT)
|
||||||
|
check_symbol_exists(mmap "sys/mman.h" HAVE_MMAP)
|
||||||
|
check_symbol_exists(CreateFileMapping "windows.h" HAVE_CREATE_FILE_MAPPING)
|
||||||
|
+if(NOT WIN32)
|
||||||
|
+ set(CMAKE_REQUIRED_DEFINITIONS_PREV ${CMAKE_REQUIRED_DEFINITIONS})
|
||||||
|
+ set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE)
|
||||||
|
+ check_symbol_exists(sched_setaffinity "sched.h" HAVE_SCHED_SETAFFINITY)
|
||||||
|
+ set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_PREV})
|
||||||
|
+ if(HAVE_SCHED_SETAFFINITY)
|
||||||
|
+ add_definitions(-D_GNU_SOURCE)
|
||||||
|
+ endif()
|
||||||
|
+endif()
|
||||||
|
check_symbol_exists(strsignal "string.h" HAVE_STRSIGNAL)
|
||||||
|
check_symbol_exists(mkstemp "stdlib.h" HAVE_MKSTEMP)
|
||||||
|
|
||||||
|
diff --git a/prboom2/cmake/config.h.cin b/prboom2/cmake/config.h.cin
|
||||||
|
index f92f3d88..2ad70033 100644
|
||||||
|
--- a/prboom2/cmake/config.h.cin
|
||||||
|
+++ b/prboom2/cmake/config.h.cin
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
#cmakedefine HAVE_GETOPT
|
||||||
|
#cmakedefine HAVE_MMAP
|
||||||
|
#cmakedefine HAVE_CREATE_FILE_MAPPING
|
||||||
|
+#cmakedefine HAVE_SCHED_SETAFFINITY
|
||||||
|
#cmakedefine HAVE_STRSIGNAL
|
||||||
|
#cmakedefine HAVE_MKSTEMP
|
||||||
|
|
||||||
|
diff --git a/prboom2/src/SDL/i_main.c b/prboom2/src/SDL/i_main.c
|
||||||
|
index 7537c53f..670f3dbd 100644
|
||||||
|
--- a/prboom2/src/SDL/i_main.c
|
||||||
|
+++ b/prboom2/src/SDL/i_main.c
|
||||||
|
@@ -45,6 +45,9 @@
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
+typedef BOOL (WINAPI *SetAffinityFunc)(HANDLE hProcess, DWORD mask);
|
||||||
|
+#else
|
||||||
|
+#include <sched.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
@@ -373,6 +376,83 @@ static void I_Quit (void)
|
||||||
|
uid_t stored_euid = -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+//
|
||||||
|
+// Ability to use only the allowed CPUs
|
||||||
|
+//
|
||||||
|
+
|
||||||
|
+static void I_SetAffinityMask(void)
|
||||||
|
+{
|
||||||
|
+ // This was only set for the sdl music backend,
|
||||||
|
+ // but now the backend changes based on the music type.
|
||||||
|
+ // Not sure what the consequences are for this...
|
||||||
|
+ process_affinity_mask = 1;
|
||||||
|
+
|
||||||
|
+ // Set the process affinity mask so that all threads
|
||||||
|
+ // run on the same processor. This is a workaround for a bug in
|
||||||
|
+ // SDL_mixer that causes occasional crashes.
|
||||||
|
+ if (process_affinity_mask)
|
||||||
|
+ {
|
||||||
|
+ const char *errbuf = NULL;
|
||||||
|
+#ifdef _WIN32
|
||||||
|
+ HMODULE kernel32_dll;
|
||||||
|
+ SetAffinityFunc SetAffinity = NULL;
|
||||||
|
+ int ok = false;
|
||||||
|
+
|
||||||
|
+ // Find the kernel interface DLL.
|
||||||
|
+ kernel32_dll = LoadLibrary("kernel32.dll");
|
||||||
|
+
|
||||||
|
+ if (kernel32_dll)
|
||||||
|
+ {
|
||||||
|
+ // Find the SetProcessAffinityMask function.
|
||||||
|
+ SetAffinity = (SetAffinityFunc)GetProcAddress(kernel32_dll, "SetProcessAffinityMask");
|
||||||
|
+
|
||||||
|
+ // If the function was not found, we are on an old (Win9x) system
|
||||||
|
+ // that doesn't have this function. That's no problem, because
|
||||||
|
+ // those systems don't support SMP anyway.
|
||||||
|
+
|
||||||
|
+ if (SetAffinity)
|
||||||
|
+ {
|
||||||
|
+ ok = SetAffinity(GetCurrentProcess(), process_affinity_mask);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!ok)
|
||||||
|
+ {
|
||||||
|
+ errbuf = WINError();
|
||||||
|
+ }
|
||||||
|
+#elif defined(HAVE_SCHED_SETAFFINITY)
|
||||||
|
+ // POSIX version:
|
||||||
|
+ int i;
|
||||||
|
+ {
|
||||||
|
+ cpu_set_t set;
|
||||||
|
+
|
||||||
|
+ CPU_ZERO(&set);
|
||||||
|
+
|
||||||
|
+ for(i = 0; i < 16; i++)
|
||||||
|
+ {
|
||||||
|
+ CPU_SET((process_affinity_mask>>i)&1, &set);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (sched_setaffinity(getpid(), sizeof(set), &set) == -1)
|
||||||
|
+ {
|
||||||
|
+ errbuf = strerror(errno);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#else
|
||||||
|
+ return;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ if (errbuf == NULL)
|
||||||
|
+ {
|
||||||
|
+ lprintf(LO_INFO, "I_SetAffinityMask: manual affinity mask is %d\n", process_affinity_mask);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ lprintf(LO_ERROR, "I_SetAffinityMask: failed to set process affinity mask (%s)\n", errbuf);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
//
|
||||||
|
// Sets the priority class for the prboom-plus process
|
||||||
|
//
|
||||||
|
@@ -482,6 +562,9 @@ int main(int argc, char **argv)
|
||||||
|
signal(SIGABRT, I_SignalHandler);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ // Ability to use only the allowed CPUs
|
||||||
|
+ I_SetAffinityMask();
|
||||||
|
+
|
||||||
|
// Priority class for the prboom-plus process
|
||||||
|
I_SetProcessPriority();
|
||||||
|
|
||||||
|
diff --git a/prboom2/src/SDL/i_video.c b/prboom2/src/SDL/i_video.c
|
||||||
|
index 5a564a5a..9b68aee7 100644
|
||||||
|
--- a/prboom2/src/SDL/i_video.c
|
||||||
|
+++ b/prboom2/src/SDL/i_video.c
|
||||||
|
@@ -895,6 +895,7 @@ static void I_ClosestResolution (int *width, int *height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+int process_affinity_mask;
|
||||||
|
int process_priority;
|
||||||
|
|
||||||
|
// e6y
|
||||||
|
diff --git a/prboom2/src/i_video.h b/prboom2/src/i_video.h
|
||||||
|
index 46f0fb71..c39a197e 100644
|
||||||
|
--- a/prboom2/src/i_video.h
|
||||||
|
+++ b/prboom2/src/i_video.h
|
||||||
|
@@ -109,6 +109,8 @@ void I_UpdateRenderSize(void); // Handle potential
|
||||||
|
extern int renderW; // resolution scaling
|
||||||
|
extern int renderH; // - DTIED
|
||||||
|
|
||||||
|
+// Set the process affinity mask so that all threads
|
||||||
|
+extern int process_affinity_mask;
|
||||||
|
// Priority class for the prboom-plus process
|
||||||
|
extern int process_priority;
|
||||||
|
// Use vanilla keybaord mapping
|
20
srcpkgs/dsda-doom/template
Normal file
20
srcpkgs/dsda-doom/template
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# Template file for 'dsda-doom'
|
||||||
|
pkgname=dsda-doom
|
||||||
|
version=0.24.3
|
||||||
|
revision=1
|
||||||
|
build_wrksrc=prboom2
|
||||||
|
build_style=cmake
|
||||||
|
makedepends="pcre-devel fluidsynth-devel libmad-devel SDL2_mixer-devel
|
||||||
|
SDL2_image-devel portmidi-devel dumb-devel libvorbis-devel"
|
||||||
|
short_desc="Fork of prboom+ with extra tooling for demo recording and playback"
|
||||||
|
maintainer="Gene <elkaufman5@gmail.com>"
|
||||||
|
license="GPL-2.0-or-later"
|
||||||
|
homepage="https://github.com/kraflab/dsda-doom"
|
||||||
|
distfiles="${homepage}/archive/refs/tags/v${version}.tar.gz"
|
||||||
|
checksum=d4cfc82eea029068329d6b6a2dcbe0b316b31a60af12e6dc5ad3e1d2c359d913
|
||||||
|
nocross=yes
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
vinstall ICONS/dsda-doom.desktop 644 usr/share/applications
|
||||||
|
vinstall ICONS/dsda-doom.png 644 usr/share/pixmaps
|
||||||
|
}
|
Loading…
Reference in a new issue