nixpkgs/pkgs/misc/dxvk/default.nix
2022-03-07 15:15:19 -05:00

80 lines
2.9 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ lib
, pkgs
, stdenv
, fetchFromGitHub
, pkgsCross
}:
let
# DXVK needs to be a separate derivation because its actually a set of DLLs for Windows that
# needs to be built with a cross-compiler.
dxvk32 = pkgsCross.mingw32.callPackage ./dxvk.nix { inherit (self) src version dxvkPatches; };
dxvk64 = pkgsCross.mingwW64.callPackage ./dxvk.nix { inherit (self) src version dxvkPatches; };
# Use the self pattern to support overriding `src` and `version` via `overrideAttrs`. A recursive
# attrset wouldnt work.
self = stdenv.mkDerivation {
name = "dxvk";
version = "1.10";
src = fetchFromGitHub {
owner = "doitsujin";
repo = "dxvk";
rev = "v${self.version}";
hash = "sha256-/zH6vER/6s/d+Tt181UJOa97sqdkJyKGw6E36+1owzQ=";
};
# Patch DXVK to work with MoltenVK even though it doesnt support some required features.
# Some games will work poorly (particularly Unreal Engine 4 games), but others work pretty well.
# Override this to patch DXVK itself (rather than the setup script).
dxvkPatches = lib.optional stdenv.isDarwin ./darwin-dxvk-compat.patch;
outputs = [ "out" "bin" "lib" ];
# Also copy `mcfgthread-12.dll` due to DXVKs being built in a MinGW cross environment.
patches = [ ./mcfgthread.patch ];
dontConfigure = true;
dontBuild = true;
installPhase = ''
mkdir -p $out/bin $bin $lib
substitute setup_dxvk.sh $out/bin/setup_dxvk.sh \
--subst-var-by mcfgthreads32 "${pkgsCross.mingw32.windows.mcfgthreads}" \
--subst-var-by mcfgthreads64 "${pkgsCross.mingwW64.windows.mcfgthreads}" \
--replace 'basedir=$(dirname "$(readlink -f $0)")' "basedir=$bin"
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
'';
# DXVK with MoltenVK requires a patched MoltenVK in addition to its own patches. Provide a
# convenience function to handle the necessary patching.
# Usage:
# let
# patchedMoltenVK = dxvk.patchMoltenVK darwin.moltenvk;
# in
# wine64Packages.full.override { moltenvk = patchedMoltenVK; vkd3dSupport = false; }
passthru.patchMoltenVK = moltenvk:
moltenvk.overrideAttrs (old: {
patches = old.patches or [ ] ++ [
# Lie to DXVK about certain features that DXVK expects to be available and set defaults
# for better performance/compatability on certain hardware.
./darwin-moltenvk-compat.patch
];
});
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.unix;
};
};
in
self