Merge pull request #175851 from reckenrode/dxvk-refactor

dxvk: refactor derivation and Darwin support

authored by Sandro and committed by GitHub 1ec895fd 332ff38e

+72 -140
+32 -19
pkgs/misc/dxvk/darwin-dxvk-compat.patch
··· 1 - Source: https://github.com/marzent/dxvk/commit/65247afe2de5dd6b555b8fdd46dddcdc6325e1d6 2 - --- 3 - src/d3d11/d3d11_device.cpp | 12 +- 4 - 1 file changed, 8 insertions(+), 4 deletions(-) 5 - 6 1 diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp 7 - index 21f0d1b4a..5b1d05335 100644 2 + index 09f3559a..215787f9 100644 8 3 --- a/src/d3d11/d3d11_device.cpp 9 4 +++ b/src/d3d11/d3d11_device.cpp 10 - @@ -799,8 +799,12 @@ namespace dxvk { 5 + @@ -801,8 +801,12 @@ namespace dxvk { 11 6 InitReturnPtr(ppGeometryShader); 12 7 D3D11CommonShader module; 13 - 8 + 14 9 - if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback) 15 10 - return DXGI_ERROR_INVALID_CALL; 16 - + if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback) { 17 - + Logger::err( 18 - + "D3D11: CreateGeometryShaderWithStreamOutput:" 19 - + "\n Transform feedback not supported by device"); 20 - + return S_OK; 21 - + } 22 - 11 + + if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback) { 12 + + Logger::err( 13 + + "D3D11: CreateGeometryShaderWithStreamOutput:" 14 + + "\n Transform feedback not supported by device"); 15 + + return S_OK; 16 + + } 17 + 23 18 // Zero-init some counterss so that we can increment 24 19 // them while walking over the stream output entries 25 - @@ -1973,8 +1977,8 @@ namespace dxvk { 20 + @@ -1920,7 +1924,7 @@ namespace dxvk { 21 + DxvkDeviceFeatures supported = adapter->features(); 22 + DxvkDeviceFeatures enabled = {}; 23 + 24 + - enabled.core.features.geometryShader = VK_TRUE; 25 + + enabled.core.features.geometryShader = supported.core.features.geometryShader; 26 + enabled.core.features.robustBufferAccess = VK_TRUE; 27 + enabled.core.features.shaderStorageImageWriteWithoutFormat = VK_TRUE; 28 + enabled.core.features.depthBounds = supported.core.features.depthBounds; 29 + @@ -1951,7 +1955,7 @@ namespace dxvk { 30 + enabled.core.features.sampleRateShading = VK_TRUE; 31 + enabled.core.features.samplerAnisotropy = supported.core.features.samplerAnisotropy; 32 + enabled.core.features.shaderClipDistance = VK_TRUE; 33 + - enabled.core.features.shaderCullDistance = VK_TRUE; 34 + + enabled.core.features.shaderCullDistance = supported.core.features.shaderCullDistance; 35 + enabled.core.features.textureCompressionBC = VK_TRUE; 36 + enabled.extDepthClipEnable.depthClipEnable = supported.extDepthClipEnable.depthClipEnable; 37 + enabled.extHostQueryReset.hostQueryReset = VK_TRUE; 38 + @@ -1971,8 +1975,8 @@ namespace dxvk { 26 39 enabled.core.features.logicOp = supported.core.features.logicOp; 27 40 enabled.core.features.shaderImageGatherExtended = VK_TRUE; 28 41 enabled.core.features.variableMultisampleRate = supported.core.features.variableMultisampleRate; 29 42 - enabled.extTransformFeedback.transformFeedback = VK_TRUE; 30 43 - enabled.extTransformFeedback.geometryStreams = VK_TRUE; 31 - + enabled.extTransformFeedback.transformFeedback = supported.extTransformFeedback.transformFeedback; 32 - + enabled.extTransformFeedback.geometryStreams = supported.extTransformFeedback.geometryStreams; 44 + + enabled.extTransformFeedback.transformFeedback = supported.extTransformFeedback.transformFeedback; 45 + + enabled.extTransformFeedback.geometryStreams = supported.extTransformFeedback.geometryStreams; 33 46 } 34 - 47 + 35 48 if (featureLevel >= D3D_FEATURE_LEVEL_10_1) {
+25 -43
pkgs/misc/dxvk/default.nix
··· 6 6 , pkgsCross 7 7 }: 8 8 9 - let 10 - inherit (hostPlatform.uname) system; 11 - 12 - # DXVK needs to be a separate derivation because it’s actually a set of DLLs for Windows that 13 - # needs to be built with a cross-compiler. 14 - dxvk32 = pkgsCross.mingw32.callPackage ./dxvk.nix { inherit (self) src version dxvkPatches; }; 15 - dxvk64 = pkgsCross.mingwW64.callPackage ./dxvk.nix { inherit (self) src version dxvkPatches; }; 16 - 17 - # Split out by platform to make maintenance easy in case supported versions on Darwin and other 18 - # platforms diverge (due to the need for Darwin-specific patches that would fail to apply). 19 - # Should that happen, set `darwin` to the last working `rev` and `hash`. 20 - srcs = rec { 21 - darwin = { inherit (default) rev hash version; }; 22 - default = { 23 - rev = "v${self.version}"; 24 - hash = "sha256-+6PkrkamSvhCaGj2tq+RXri/yQ7vs0cAqgdRAFtU8UA="; 25 - version = "1.10.1"; 9 + stdenvNoCC.mkDerivation (finalAttrs: 10 + let 11 + inherit (hostPlatform.uname) system; 12 + # DXVK needs to be a separate derivation because it’s actually a set of DLLs for Windows that 13 + # needs to be built with a cross-compiler. 14 + dxvk32 = pkgsCross.mingw32.callPackage ./dxvk.nix { 15 + inherit (finalAttrs) src version dxvkPatches; 26 16 }; 27 - }; 17 + dxvk64 = pkgsCross.mingwW64.callPackage ./dxvk.nix { 18 + inherit (finalAttrs) src version dxvkPatches; 19 + }; 28 20 29 - # Use the self pattern to support overriding `src` and `version` via `overrideAttrs`. A recursive 30 - # attrset wouldn’t work. 31 - self = stdenvNoCC.mkDerivation { 21 + # Split out by platform to make maintenance easy in case supported versions on Darwin and other 22 + # platforms diverge (due to the need for Darwin-specific patches that would fail to apply). 23 + # Should that happen, set `darwin` to the last working `rev` and `hash`. 24 + srcs = rec { 25 + darwin = { inherit (default) rev hash version; }; 26 + default = { 27 + rev = "v${finalAttrs.version}"; 28 + hash = "sha256-+6PkrkamSvhCaGj2tq+RXri/yQ7vs0cAqgdRAFtU8UA="; 29 + version = "1.10.1"; 30 + }; 31 + }; 32 + in 33 + { 32 34 name = "dxvk"; 33 35 inherit (srcs."${system}" or srcs.default) version; 34 36 ··· 70 72 done 71 73 ''; 72 74 73 - # DXVK with MoltenVK requires a patched MoltenVK in addition to its own patches. Provide a 74 - # convenience function to handle the necessary patching. 75 - # 76 - # Usage: 77 - # let 78 - # patchedMoltenVK = dxvk.patchMoltenVK darwin.moltenvk; 79 - # in 80 - # wine64Packages.full.override { moltenvk = patchedMoltenVK; vkd3dSupport = false; } 81 - passthru.patchMoltenVK = moltenvk: 82 - moltenvk.overrideAttrs (old: { 83 - patches = old.patches or [ ] ++ [ 84 - # Apply MoltenVK’s DXVK compatability patch. This is needed to fake support for certain 85 - # extensions. There is no package for a patched MoltenVK to avoid any confusion by users 86 - # whether they should use it. Except with DXVK, the answer is always no. 87 - old.passthru.dxvkPatch 88 - ]; 89 - }); 90 - 91 75 meta = { 92 76 description = "A Vulkan-based translation layer for Direct3D 9/10/11"; 93 77 homepage = "https://github.com/doitsujin/dxvk"; 94 78 changelog = "https://github.com/doitsujin/dxvk/releases"; 95 79 maintainers = [ lib.maintainers.reckenrode ]; 96 80 license = lib.licenses.zlib; 97 - platforms = lib.platforms.unix; 81 + platforms = [ "x86_64-darwin" "i686-linux" "x86_64-linux" ]; 98 82 }; 99 - }; 100 - in 101 - self 83 + })
+15 -19
pkgs/os-specific/darwin/moltenvk/default.nix
··· 27 27 let 28 28 libcxx.dev = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr"; 29 29 in 30 - stdenvNoCC.mkDerivation rec { 30 + stdenvNoCC.mkDerivation (finalAttrs: { 31 31 pname = "MoltenVK"; 32 32 version = "1.1.9"; 33 33 ··· 43 43 # MoltenVK requires specific versions of its dependencies. 44 44 # Pin them here except for cereal, which is four years old and has several CVEs. 45 45 passthru = { 46 - # The patch required to support DXVK may different from version to version. This should never 47 - # be used except with DXVK, so there’s no package for it. To emphasize that this patch should 48 - # never be used except with DXVK, `dxvk` provides a function for applying this patch. 49 - dxvkPatch = ./dxvk-moltenvk-compat.patch; 50 46 glslang = (glslang.overrideAttrs (old: { 51 47 src = fetchFromGitHub { 52 48 owner = "KhronosGroup"; ··· 55 51 hash = "sha256-YLn/Mxuk6mXPGtBBgfwky5Nl1TCAW6i2g+AZLzqVz+A="; 56 52 }; 57 53 })).override { 58 - inherit (passthru) spirv-headers spirv-tools; 54 + inherit (finalAttrs.passthru) spirv-headers spirv-tools; 59 55 }; 60 56 spirv-cross = spirv-cross.overrideAttrs (old: { 61 57 cmakeFlags = (old.cmakeFlags or [ ]) ++ [ ··· 84 80 hash = "sha256-2Mr3HbhRslLpRfwHascl7e/UoPijhrij9Bjg3aCiqBM="; 85 81 }; 86 82 })).override { 87 - inherit (passthru) spirv-headers; 83 + inherit (finalAttrs.passthru) spirv-headers; 88 84 }; 89 85 vulkan-headers = vulkan-headers.overrideAttrs (old: { 90 86 src = fetchFromGitHub { ··· 99 95 src = fetchFromGitHub { 100 96 owner = "KhronosGroup"; 101 97 repo = "MoltenVK"; 102 - rev = "v${version}"; 98 + rev = "v${finalAttrs.version}"; 103 99 hash = "sha256-5ie1IGzZqaYbciFnrBJ1/9V0LEuz7JsEOFXXkG3hJzg="; 104 100 }; 105 101 ··· 117 113 substituteInPlace MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj \ 118 114 --replace @@sourceRoot@@ $(pwd) \ 119 115 --replace @@libcxx@@ "${libcxx.dev}" \ 120 - --replace @@glslang@@ "${passthru.glslang}" \ 121 - --replace @@spirv-cross@@ "${passthru.spirv-cross}" \ 122 - --replace @@spirv-tools@@ "${passthru.glslang.spirv-tools}" \ 123 - --replace @@spirv-headers@@ "${passthru.glslang.spirv-headers}" 116 + --replace @@glslang@@ "${finalAttrs.passthru.glslang}" \ 117 + --replace @@spirv-cross@@ "${finalAttrs.passthru.spirv-cross}" \ 118 + --replace @@spirv-tools@@ "${finalAttrs.passthru.glslang.spirv-tools}" \ 119 + --replace @@spirv-headers@@ "${finalAttrs.passthru.glslang.spirv-headers}" 124 120 substituteInPlace MoltenVK/MoltenVK.xcodeproj/project.pbxproj \ 125 121 --replace @@sourceRoot@@ $(pwd) \ 126 122 --replace @@libcxx@@ "${libcxx.dev}" \ 127 123 --replace @@cereal@@ "${cereal}" \ 128 - --replace @@spirv-cross@@ "${passthru.spirv-cross}" \ 129 - --replace @@vulkan-headers@@ "${passthru.vulkan-headers}" 124 + --replace @@spirv-cross@@ "${finalAttrs.passthru.spirv-cross}" \ 125 + --replace @@vulkan-headers@@ "${finalAttrs.passthru.vulkan-headers}" 130 126 substituteInPlace Scripts/create_dylib.sh \ 131 127 --replace @@sourceRoot@@ $(pwd) \ 132 - --replace @@glslang@@ "${passthru.glslang}" \ 133 - --replace @@spirv-tools@@ "${passthru.glslang.spirv-tools}" \ 134 - --replace @@spirv-cross@@ "${passthru.spirv-cross}" 128 + --replace @@glslang@@ "${finalAttrs.passthru.glslang}" \ 129 + --replace @@spirv-tools@@ "${finalAttrs.passthru.glslang.spirv-tools}" \ 130 + --replace @@spirv-cross@@ "${finalAttrs.passthru.spirv-cross}" 135 131 substituteInPlace Scripts/gen_moltenvk_rev_hdr.sh \ 136 132 --replace @@sourceRoot@@ $(pwd) \ 137 - --replace '$(git rev-parse HEAD)' ${src.rev} 133 + --replace '$(git rev-parse HEAD)' ${finalAttrs.src.rev} 138 134 ''; 139 135 140 136 dontConfigure = true; ··· 197 193 license = lib.licenses.asl20; 198 194 platforms = lib.platforms.darwin; 199 195 }; 200 - } 196 + })
-59
pkgs/os-specific/darwin/moltenvk/dxvk-moltenvk-compat.patch
··· 1 - Source: https://github.com/Gcenx/MoltenVK/commit/1f268bd45f6c928784d7cb90dedce382895f10ae 2 - 3 - Fake extensions for DXVK; 4 - - _features.geometryShader 5 - - _features.tessellationShader 6 - - _features.shaderCullDistance 7 - 8 - Enabled defaults; 9 - - MVK_ALLOW_METAL_FENCES=1 10 - - MVK_CONFIG_RESUME_LOST_DEVICE=1 11 - --- 12 - MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 3 +++ 13 - MoltenVK/MoltenVK/Utility/MVKEnvironment.h | 4 ++-- 14 - 2 files changed, 5 insertions(+), 2 deletions(-) 15 - 16 - diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm 17 - index bc6d19df..e1959c6e 100644 18 - --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm 19 - +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm 20 - @@ -1656,6 +1656,8 @@ 21 - _features.robustBufferAccess = true; // XXX Required by Vulkan spec 22 - _features.fullDrawIndexUint32 = true; 23 - _features.independentBlend = true; 24 - + _features.geometryShader = true; // XXX Required by DXVK for D3D10 25 - + _features.tessellationShader = true; // XXX Required by DXVK for D3D11 26 - _features.sampleRateShading = true; 27 - _features.depthBiasClamp = true; 28 - _features.fillModeNonSolid = true; 29 - @@ -1669,6 +1671,7 @@ 30 - _features.shaderUniformBufferArrayDynamicIndexing = true; 31 - _features.shaderStorageBufferArrayDynamicIndexing = true; 32 - _features.shaderClipDistance = true; 33 - + _features.shaderCullDistance = true; // XXX Required by DXVK for 10level9 34 - _features.shaderInt16 = true; 35 - _features.multiDrawIndirect = true; 36 - _features.inheritedQueries = true; 37 - diff --git a/MoltenVK/MoltenVK/Utility/MVKEnvironment.h b/MoltenVK/MoltenVK/Utility/MVKEnvironment.h 38 - index 81d0defc..80c414d3 100644 39 - --- a/MoltenVK/MoltenVK/Utility/MVKEnvironment.h 40 - +++ b/MoltenVK/MoltenVK/Utility/MVKEnvironment.h 41 - @@ -240,7 +240,7 @@ void mvkSetConfig(const MVKConfiguration& mvkConfig); 42 - # define MVK_ALLOW_METAL_EVENTS 1 43 - #endif 44 - #ifndef MVK_ALLOW_METAL_FENCES 45 - -# define MVK_ALLOW_METAL_FENCES 0 46 - +# define MVK_ALLOW_METAL_FENCES 1 // XXX Required by DXVK for Apple/NVidia GPUs (better FPS than CPU Emulation) 47 - #endif 48 - 49 - /** Substitute Metal 2D textures for Vulkan 1D images. Enabled by default. */ 50 - @@ -275,7 +275,7 @@ void mvkSetConfig(const MVKConfiguration& mvkConfig); 51 - 52 - /** Resume MVKDevice VK_ERROR_DEVICE_LOST errors that do not cause MVKPhysicalDevice errors. Disabled by default. */ 53 - #ifndef MVK_CONFIG_RESUME_LOST_DEVICE 54 - -# define MVK_CONFIG_RESUME_LOST_DEVICE 0 55 - +# define MVK_CONFIG_RESUME_LOST_DEVICE 1 56 - #endif 57 - 58 - /** Support Metal argument buffers. Disabled by default. */ 59 -