From 26f624d94005301cc2dcbfcd3a161e7c0151e6fb Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Sun, 8 Oct 2023 15:58:27 -0400 Subject: dxvk: migrate to by-name --- pkgs/misc/dxvk/darwin-dxvk-compat.patch | 48 ----- pkgs/misc/dxvk/darwin-thread-primitives.patch | 186 ------------------ pkgs/misc/dxvk/default.nix | 52 ----- pkgs/misc/dxvk/dxvk.nix | 114 ----------- pkgs/misc/dxvk/setup_dxvk.sh | 266 -------------------------- 5 files changed, 666 deletions(-) delete mode 100644 pkgs/misc/dxvk/darwin-dxvk-compat.patch delete mode 100644 pkgs/misc/dxvk/darwin-thread-primitives.patch delete mode 100644 pkgs/misc/dxvk/default.nix delete mode 100644 pkgs/misc/dxvk/dxvk.nix delete mode 100644 pkgs/misc/dxvk/setup_dxvk.sh (limited to 'pkgs/misc') diff --git a/pkgs/misc/dxvk/darwin-dxvk-compat.patch b/pkgs/misc/dxvk/darwin-dxvk-compat.patch deleted file mode 100644 index 99833a020cda..000000000000 --- a/pkgs/misc/dxvk/darwin-dxvk-compat.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp -index 09f3559a..215787f9 100644 ---- a/src/d3d11/d3d11_device.cpp -+++ b/src/d3d11/d3d11_device.cpp -@@ -801,8 +801,12 @@ namespace dxvk { - InitReturnPtr(ppGeometryShader); - D3D11CommonShader module; - -- if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback) -- return DXGI_ERROR_INVALID_CALL; -+ if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback) { -+ Logger::err( -+ "D3D11: CreateGeometryShaderWithStreamOutput:" -+ "\n Transform feedback not supported by device"); -+ return S_OK; -+ } - - // Zero-init some counterss so that we can increment - // them while walking over the stream output entries -@@ -1920,7 +1924,7 @@ namespace dxvk { - DxvkDeviceFeatures supported = adapter->features(); - DxvkDeviceFeatures enabled = {}; - -- enabled.core.features.geometryShader = VK_TRUE; -+ enabled.core.features.geometryShader = supported.core.features.geometryShader; - enabled.core.features.robustBufferAccess = VK_TRUE; - enabled.core.features.shaderStorageImageWriteWithoutFormat = VK_TRUE; - enabled.core.features.depthBounds = supported.core.features.depthBounds; -@@ -1951,7 +1955,7 @@ namespace dxvk { - enabled.core.features.sampleRateShading = VK_TRUE; - enabled.core.features.samplerAnisotropy = supported.core.features.samplerAnisotropy; - enabled.core.features.shaderClipDistance = VK_TRUE; -- enabled.core.features.shaderCullDistance = VK_TRUE; -+ enabled.core.features.shaderCullDistance = supported.core.features.shaderCullDistance; - enabled.core.features.textureCompressionBC = VK_TRUE; - enabled.extDepthClipEnable.depthClipEnable = supported.extDepthClipEnable.depthClipEnable; - enabled.extHostQueryReset.hostQueryReset = VK_TRUE; -@@ -1971,8 +1975,8 @@ namespace dxvk { - enabled.core.features.logicOp = supported.core.features.logicOp; - enabled.core.features.shaderImageGatherExtended = VK_TRUE; - enabled.core.features.variableMultisampleRate = supported.core.features.variableMultisampleRate; -- enabled.extTransformFeedback.transformFeedback = VK_TRUE; -- enabled.extTransformFeedback.geometryStreams = VK_TRUE; -+ enabled.extTransformFeedback.transformFeedback = supported.extTransformFeedback.transformFeedback; -+ enabled.extTransformFeedback.geometryStreams = supported.extTransformFeedback.geometryStreams; - } - - if (featureLevel >= D3D_FEATURE_LEVEL_10_1) { diff --git a/pkgs/misc/dxvk/darwin-thread-primitives.patch b/pkgs/misc/dxvk/darwin-thread-primitives.patch deleted file mode 100644 index c008099407c5..000000000000 --- a/pkgs/misc/dxvk/darwin-thread-primitives.patch +++ /dev/null @@ -1,186 +0,0 @@ -diff --git a/src/util/thread.h b/src/util/thread.h -index 28aeca8a..db5c9913 100644 ---- a/src/util/thread.h -+++ b/src/util/thread.h -@@ -149,178 +149,8 @@ namespace dxvk { - } - } - -- -- /** -- * \brief SRW-based mutex implementation -- * -- * Drop-in replacement for \c std::mutex that uses Win32 -- * SRW locks, which are implemented with \c futex in wine. -- */ -- class mutex { -- -- public: -- -- using native_handle_type = PSRWLOCK; -- -- mutex() { } -- -- mutex(const mutex&) = delete; -- mutex& operator = (const mutex&) = delete; -- -- void lock() { -- AcquireSRWLockExclusive(&m_lock); -- } -- -- void unlock() { -- ReleaseSRWLockExclusive(&m_lock); -- } -- -- bool try_lock() { -- return TryAcquireSRWLockExclusive(&m_lock); -- } -- -- native_handle_type native_handle() { -- return &m_lock; -- } -- -- private: -- -- SRWLOCK m_lock = SRWLOCK_INIT; -- -- }; -- -- -- /** -- * \brief Recursive mutex implementation -- * -- * Drop-in replacement for \c std::recursive_mutex that -- * uses Win32 critical sections. -- */ -- class recursive_mutex { -- -- public: -- -- using native_handle_type = PCRITICAL_SECTION; -- -- recursive_mutex() { -- InitializeCriticalSection(&m_lock); -- } -- -- ~recursive_mutex() { -- DeleteCriticalSection(&m_lock); -- } -- -- recursive_mutex(const recursive_mutex&) = delete; -- recursive_mutex& operator = (const recursive_mutex&) = delete; -- -- void lock() { -- EnterCriticalSection(&m_lock); -- } -- -- void unlock() { -- LeaveCriticalSection(&m_lock); -- } -- -- bool try_lock() { -- return TryEnterCriticalSection(&m_lock); -- } -- -- native_handle_type native_handle() { -- return &m_lock; -- } -- -- private: -- -- CRITICAL_SECTION m_lock; -- -- }; -- -- -- /** -- * \brief SRW-based condition variable implementation -- * -- * Drop-in replacement for \c std::condition_variable that -- * uses Win32 condition variables on SRW locks. -- */ -- class condition_variable { -- -- public: -- -- using native_handle_type = PCONDITION_VARIABLE; -- -- condition_variable() { -- InitializeConditionVariable(&m_cond); -- } -- -- condition_variable(condition_variable&) = delete; -- -- condition_variable& operator = (condition_variable&) = delete; -- -- void notify_one() { -- WakeConditionVariable(&m_cond); -- } -- -- void notify_all() { -- WakeAllConditionVariable(&m_cond); -- } -- -- void wait(std::unique_lock& lock) { -- auto srw = lock.mutex()->native_handle(); -- SleepConditionVariableSRW(&m_cond, srw, INFINITE, 0); -- } -- -- template -- void wait(std::unique_lock& lock, Predicate pred) { -- while (!pred()) -- wait(lock); -- } -- -- template -- std::cv_status wait_until(std::unique_lock& lock, const std::chrono::time_point& time) { -- auto now = Clock::now(); -- -- return (now < time) -- ? wait_for(lock, now - time) -- : std::cv_status::timeout; -- } -- -- template -- bool wait_until(std::unique_lock& lock, const std::chrono::time_point& time, Predicate pred) { -- if (pred()) -- return true; -- -- auto now = Clock::now(); -- return now < time && wait_for(lock, now - time, pred); -- } -- -- template -- std::cv_status wait_for(std::unique_lock& lock, const std::chrono::duration& timeout) { -- auto ms = std::chrono::duration_cast(timeout); -- auto srw = lock.mutex()->native_handle(); -- -- return SleepConditionVariableSRW(&m_cond, srw, ms.count(), 0) -- ? std::cv_status::no_timeout -- : std::cv_status::timeout; -- } -- -- template -- bool wait_for(std::unique_lock& lock, const std::chrono::duration& timeout, Predicate pred) { -- bool result = pred(); -- -- if (!result && wait_for(lock, timeout) == std::cv_status::no_timeout) -- result = pred(); -- -- return result; -- } -- -- native_handle_type native_handle() { -- return &m_cond; -- } -- -- private: -- -- CONDITION_VARIABLE m_cond; -- -- }; -+ using mutex = std::mutex; -+ using recursive_mutex = std::recursive_mutex; -+ using condition_variable = std::condition_variable; - - } diff --git a/pkgs/misc/dxvk/default.nix b/pkgs/misc/dxvk/default.nix deleted file mode 100644 index 88b7e5b104fb..000000000000 --- a/pkgs/misc/dxvk/default.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ lib -, stdenvNoCC -, fetchFromGitHub -, pkgsCross -, stdenv -, bash -}: - -stdenvNoCC.mkDerivation (finalAttrs: - let - dxvk32 = if stdenv.isDarwin - then pkgsCross.mingw32.dxvk_1.override { enableMoltenVKCompat = true; } - else pkgsCross.mingw32.dxvk_2; - dxvk64 = if stdenv.isDarwin - then pkgsCross.mingwW64.dxvk_1.override { enableMoltenVKCompat = true; } - else pkgsCross.mingwW64.dxvk_2; - in - { - pname = "dxvk"; - inherit (dxvk64) version; - - outputs = [ "out" "bin" "lib" ]; - - dontUnpack = true; - dontConfigure = true; - dontBuild = true; - - installPhase = '' - mkdir -p $out/bin $bin $lib - substitute ${./setup_dxvk.sh} $out/bin/setup_dxvk.sh \ - --subst-var-by bash ${bash} \ - --subst-var-by dxvk32 ${dxvk32} \ - --subst-var-by dxvk64 ${dxvk64} \ - --subst-var-by mcfgthreads32 "${pkgsCross.mingw32.windows.mcfgthreads_pre_gcc_13}" \ - --subst-var-by mcfgthreads64 "${pkgsCross.mingwW64.windows.mcfgthreads_pre_gcc_13}" - chmod a+x $out/bin/setup_dxvk.sh - declare -A dxvks=( [x32]=${dxvk32} [x64]=${dxvk64} ) - for arch in "''${!dxvks[@]}"; do - ln -s "''${dxvks[$arch]}/bin" $bin/$arch - ln -s "''${dxvks[$arch]}/lib" $lib/$arch - done - ''; - - meta = { - description = "Setup script for DXVK"; - homepage = "https://github.com/doitsujin/dxvk"; - changelog = "https://github.com/doitsujin/dxvk/releases"; - maintainers = [ lib.maintainers.reckenrode ]; - license = lib.licenses.zlib; - platforms = [ "x86_64-darwin" "i686-linux" "x86_64-linux" ]; - }; - }) diff --git a/pkgs/misc/dxvk/dxvk.nix b/pkgs/misc/dxvk/dxvk.nix deleted file mode 100644 index 129090faaf47..000000000000 --- a/pkgs/misc/dxvk/dxvk.nix +++ /dev/null @@ -1,114 +0,0 @@ -{ lib -, stdenv -, fetchFromGitHub -, glslang -, meson -, ninja -, windows -, dxvkVersion ? "default" -, spirv-headers -, vulkan-headers -, SDL2 -, glfw -, pkgsBuildHost -, gitUpdater -, sdl2Support ? true -, glfwSupport ? false -, enableMoltenVKCompat ? false -}: - -# SDL2 and GLFW support are mutually exclusive. -assert !sdl2Support || !glfwSupport; - -let - # DXVK 2.0+ no longer vendors certain dependencies. This derivation also needs to build on Darwin, - # which does not currently support DXVK 2.0, so adapt conditionally for this situation. - isDxvk2 = lib.versionAtLeast (srcs.${dxvkVersion}.version) "2.0"; - - # DXVK has effectively the same build script regardless of platform. - srcs = { - "1.10" = rec { - version = "1.10.3"; - src = fetchFromGitHub { - owner = "doitsujin"; - repo = "dxvk"; - rev = "v${version}"; - hash = "sha256-T93ZylxzJGprrP+j6axZwl2d3hJowMCUOKNjIyNzkmE="; - }; - # These patches are required when using DXVK with Wine on Darwin. - patches = lib.optionals enableMoltenVKCompat [ - # Patch DXVK to work with MoltenVK even though it doesn’t support some required features. - # Some games work poorly (particularly Unreal Engine 4 games), but others work pretty well. - ./darwin-dxvk-compat.patch - # Use synchronization primitives from the C++ standard library to avoid deadlocks on Darwin. - # See: https://www.reddit.com/r/macgaming/comments/t8liua/comment/hzsuce9/ - ./darwin-thread-primitives.patch - ]; - }; - "default" = rec { - version = "2.3"; - src = fetchFromGitHub { - owner = "doitsujin"; - repo = "dxvk"; - rev = "v${version}"; - hash = "sha256-RU+B0XfphD5HHW/vSzqHLUaGS3E31d5sOLp3lMmrCB8="; - fetchSubmodules = true; # Needed for the DirectX headers and libdisplay-info - }; - patches = [ ]; - }; - }; - - isWindows = stdenv.targetPlatform.uname.system == "Windows"; - isCross = stdenv.hostPlatform != stdenv.targetPlatform; -in -stdenv.mkDerivation (finalAttrs: { - pname = "dxvk"; - inherit (srcs.${dxvkVersion}) version src patches; - - nativeBuildInputs = [ glslang meson ninja ]; - buildInputs = lib.optionals isWindows [ windows.pthreads ] - ++ lib.optionals isDxvk2 ( - [ spirv-headers vulkan-headers ] - ++ lib.optional (!isWindows && sdl2Support) SDL2 - ++ lib.optional (!isWindows && glfwSupport) glfw - ); - - postPatch = lib.optionalString isDxvk2 '' - substituteInPlace "subprojects/libdisplay-info/tool/gen-search-table.py" \ - --replace "/usr/bin/env python3" "${lib.getBin pkgsBuildHost.python3}/bin/python3" - ''; - - # Build with the Vulkan SDK in nixpkgs. - preConfigure = '' - rm -rf include/spirv/include include/vulkan/include - mkdir -p include/spirv/include include/vulkan/include - ''; - - mesonFlags = - let - arch = if stdenv.is32bit then "32" else "64"; - in - [ - "--buildtype" "release" - "--prefix" "${placeholder "out"}" - ] - ++ lib.optionals isCross [ "--cross-file" "build-win${arch}.txt" ] - ++ lib.optional glfwSupport "-Ddxvk_native_wsi=glfw"; - - doCheck = isDxvk2 && !isCross; - - passthru = lib.optionalAttrs (lib.versionAtLeast finalAttrs.version "2.0") { - updateScript = gitUpdater { - rev-prefix = "v"; - }; - }; - - meta = { - description = "A Vulkan-based translation layer for Direct3D 9/10/11"; - homepage = "https://github.com/doitsujin/dxvk"; - changelog = "https://github.com/doitsujin/dxvk/releases"; - maintainers = [ lib.maintainers.reckenrode ]; - license = lib.licenses.zlib; - platforms = lib.platforms.windows ++ lib.optionals isDxvk2 lib.platforms.linux; - }; -}) diff --git a/pkgs/misc/dxvk/setup_dxvk.sh b/pkgs/misc/dxvk/setup_dxvk.sh deleted file mode 100644 index 4926acd3ba89..000000000000 --- a/pkgs/misc/dxvk/setup_dxvk.sh +++ /dev/null @@ -1,266 +0,0 @@ -#!@bash@/bin/bash -e - -set -eu -o pipefail - -# shellcheck disable=SC2034 -{ - dxvk32_dir=@dxvk32@/bin - dxvk64_dir=@dxvk64@/bin - - mcfgthreads32_dir=@mcfgthreads32@/bin - mcfgthreads64_dir=@mcfgthreads64@/bin -} - -## Defaults - -declare -A dlls=( - [d3d9]="dxvk/d3d9.dll" - [d3d10]="dxvk/d3d10.dll dxvk/d3d10_1.dll dxvk/d3d10core.dll" - [d3d11]="dxvk/d3d11.dll" - [dxgi]="dxvk/dxgi.dll" - [mcfgthreads]="mcfgthreads/mcfgthread-12.dll" -) - -declare -A targets=([d3d9]=1 [d3d11]=1 [dxgi]=1 [mcfgthreads]=1) - -## Command-line Parsing - -usage() { - echo "DXVK @version@" - echo "Set up Wine prefix with DXVK DLLs" - echo - echo "USAGE" - echo " $0 [install|uninstall] [OPTIONS]" - echo - echo "COMMANDS" - echo " install Copy the DXVK DLLs into the prefix" - echo " uninstall Restore the backed up Wine DLLs in the prefix" - echo - echo "OPTIONS" - echo " --with(out)-dxgi Copy DXVK DXGI DLL into prefix (default: with DXGI)" - echo " --with(out)-d3d10 Copy D3D10 DLLs into prefix (default: without D3D10)" - echo " -s, --symlink Symlink instead of copy" - echo " -f, --force Create a Wine prefix even if it does not exist" - echo " -p, --prefix Wine prefix to manage (default: \$WINEPREFIX)" - exit 1 -} - -case "${1:-}" in - uninstall|install) - action=$1 - shift - ;; - -h|--help) - usage - ;; - *) - if [ -n "${1:-}" ]; then - echo "Unrecognized command: $1" - fi - usage - ;; -esac - - -do_symlink=false -do_makeprefix=false - -while [ -n "${1:-}" ]; do - case "$1" in - --with-dxgi) - targets[dxgi]=1 - ;; - --without-dxgi) - unset "targets[dxgi]" - ;; - --with-d3d10) - targets[d3d10]=1 - ;; - --without-d3d10) - unset "targets[d3d10]" - ;; - -s|--symlink) - do_symlink=true - ;; - --no-symlink) - do_symlink=false - ;; - -f|--force) - do_makeprefix=true - ;; - --no-force) - do_makeprefix=false - ;; - -p|--prefix) - shift - if [ -n "${1:-}" ]; then - WINEPREFIX=$1 - else - echo "Required PREFIX missing" - usage - fi - ;; - -h|--help) - usage - ;; - *) - echo "Unrecognized option: $1" - usage - ;; - esac - shift -done - -## Get information on the Wine environment - -export WINEPREFIX=${WINEPREFIX:-"$HOME/.wine"} - -# check wine prefix before invoking wine, so that we -# don't accidentally create one if the user screws up -if ! $do_makeprefix && [ -n "$WINEPREFIX" ] && ! [ -f "$WINEPREFIX/system.reg" ]; then - echo "$WINEPREFIX: Not a valid wine prefix." >&2 - exit 1 -fi - -export WINEDEBUG=-all -# disable mscoree and mshtml to avoid downloading -# wine gecko and mono -export WINEDLLOVERRIDES="mscoree,mshtml=" - -wine="wine" -wine64="wine64" -wineboot="wineboot" - -# $PATH is the way for user to control where wine is located (including custom Wine versions). -# Pure 64-bit Wine (non Wow64) requries skipping 32-bit steps. -# In such case, wine64 and winebooot will be present, but wine binary will be missing, -# however it can be present in other PATHs, so it shouldn't be used, to avoid versions mixing. -wine_path=$(dirname "$(command -v $wineboot)") -wow64=true -if ! [ -f "$wine_path/$wine" ]; then - wine=$wine64 - wow64=false -fi - -# resolve 32-bit and 64-bit system32 path -winever=$($wine --version | grep wine) -if [ -z "$winever" ]; then - echo "$wine: Not a wine executable. Check your $wine." >&2 - exit 1 -fi - -# ensure wine placeholder dlls are recreated -# if they are missing -$wineboot -u - -win64_sys_path=$($wine64 winepath -u 'C:\windows\system32' 2> /dev/null) -win64_sys_path="${win64_sys_path/$'\r'/}" -if $wow64; then - win32_sys_path=$($wine winepath -u 'C:\windows\system32' 2> /dev/null) - win32_sys_path="${win32_sys_path/$'\r'/}" -fi - -if [ -z "${win32_sys_path:-}" ] && [ -z "${win64_sys_path:-}" ]; then - echo 'Failed to resolve C:\windows\system32.' >&2 - exit 1 -fi - -## Utility functions - -install_file() { - $do_symlink && file_cmd="ln -sv" || file_cmd="install -m 755 -v" - - srcfile=$1 - dstfile=$2 - - if [ -f "${srcfile}.so" ]; then - srcfile="${srcfile}.so" - fi - - if ! [ -f "${srcfile}" ]; then - echo "${srcfile}: File not found. Skipping." >&2 - return 1 - fi - - if [ -n "$1" ]; then - if [ -f "${dstfile}" ] || [ -h "${dstfile}" ]; then - if ! [ -f "${dstfile}.old" ]; then - mv -v "${dstfile}" "${dstfile}.old" - else - rm -v "${dstfile}" - fi - fi - $file_cmd "${srcfile}" "${dstfile}" - else - echo "${dstfile}: File not found in wine prefix" >&2 - return 1 - fi -} - -uninstall_file() { - srcfile=$1 - dstfile=$2 - - if [ -f "${srcfile}.so" ]; then - srcfile="${srcfile}.so" - fi - - if ! [ -f "${srcfile}" ]; then - echo "${srcfile}: File not found. Skipping." >&2 - return 1 - fi - - if ! [ -f "${dstfile}" ] && ! [ -h "${dstfile}" ]; then - echo "${dstfile}: File not found. Skipping." >&2 - return 1 - fi - - if [ -f "${dstfile}.old" ]; then - rm -v "${dstfile}" - mv -v "${dstfile}.old" "${dstfile}" - return 0 - else - return 1 - fi -} - -install_override() { - dll=$(basename "$1") - if ! $wine reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v "$dll" /d native /f >/dev/null 2>&1; then - echo -e "Failed to add override for $dll" - exit 1 - fi -} - -uninstall_override() { - dll=$(basename "$1") - if ! $wine reg delete 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v "$dll" /f > /dev/null 2>&1; then - echo "Failed to remove override for $dll" - fi -} - -## Perform the requested command - -declare -A paths - -for target in "${!targets[@]}"; do - [ "${targets[$target]}" -eq 1 ] || continue - for dll in ${dlls[$target]}; do - dllname=$(basename "$dll") - basedir=$(dirname "$dll") - - if [ -n "${win32_sys_path:-}" ]; then - basedir32=${basedir}32_dir - paths["${!basedir32}/$dllname"]="$win32_sys_path/$dllname" - fi - if [ -n "${win64_sys_path:-}" ]; then - basedir64=${basedir}64_dir - paths["${!basedir64}/$dllname"]="$win64_sys_path/$dllname" - fi - done -done - -for srcpath in "${!paths[@]}"; do - "${action}_file" "$srcpath" "${paths["$srcpath"]}" - "${action}_override" "$(basename "$srcpath" .dll)" -done -- cgit 1.4.1