diff --git a/provision/modules/gaming/steam.nix b/provision/modules/gaming/steam.nix index 278790f5..f356a77a 100644 --- a/provision/modules/gaming/steam.nix +++ b/provision/modules/gaming/steam.nix @@ -18,7 +18,7 @@ in { steam steamtinkerlaunch gamescope - yuzu-early-access + yuzu-archive dolphin-emu ppsspp mgba diff --git a/provision/overlays/default.nix b/provision/overlays/default.nix index e4fa48ee..cfb582ab 100644 --- a/provision/overlays/default.nix +++ b/provision/overlays/default.nix @@ -6,4 +6,6 @@ final: prev: { advcpmv = final.callPackage ../pkgs/advcpmv.nix {}; taskopen = final.callPackage ../pkgs/taskopen.nix {}; cookcli = final.callPackage ../pkgs/cookcli.nix {}; + nx_tzdb = final.callPackage ../pkgs/nx_tzdb.nix {}; + yuzu-archive = final.libsForQt5.callPackage ../pkgs/yuzu-archive.nix {}; } diff --git a/provision/pkgs/nx_tzdb.nix b/provision/pkgs/nx_tzdb.nix new file mode 100644 index 00000000..fbe15cff --- /dev/null +++ b/provision/pkgs/nx_tzdb.nix @@ -0,0 +1,20 @@ +{ stdenv, fetchurl, unzip, gitUpdater }: +stdenv.mkDerivation rec { + pname = "nx_tzdb"; + version = "221202"; + + src = fetchurl { + url = "https://git.tstarr.us/tstarr/tzdb_to_nx/releases/download/221202/221202.zip"; + hash = "sha256-mRzW+iIwrU1zsxHmf+0RArU8BShAoEMvCz+McXFFK3c="; + }; + + nativeBuildInputs = [ unzip ]; + + buildCommand = '' + unzip $src -d $out + ''; + + passthru.updateScript = gitUpdater { + url = "https://git.tstarr.us/tstarr/tzdb_to_nx"; + }; +} diff --git a/provision/pkgs/yuzu-archive.nix b/provision/pkgs/yuzu-archive.nix new file mode 100644 index 00000000..c3c31b90 --- /dev/null +++ b/provision/pkgs/yuzu-archive.nix @@ -0,0 +1,191 @@ +{ lib +, stdenv +, fetchFromGitea +, nix-update-script +, wrapQtAppsHook +, autoconf +, boost +, catch2_3 +, cmake +, cpp-jwt +, cubeb +, discord-rpc +, enet +, fmt +, glslang +, libopus +, libusb1 +, libva +, lz4 +, nlohmann_json +, nv-codec-headers-12 +, pkg-config +, qtbase +, qtmultimedia +, qttools +, qtwayland +, qtwebengine +, SDL2 +, vulkan-headers +, vulkan-loader +, yasm +, zlib +, zstd +, fetchzip +, fetchgit +, runCommand +, gnutar +, nx_tzdb +}: +stdenv.mkDerivation(finalAttrs: { + + pname = "yuzu-archive"; + version = "4176"; + + src = fetchFromGitea { + domain = "git.tstarr.us"; + owner = "starr-dusT"; + repo = "yuzu-mainline"; + rev = "d3a974b64679229e77a3af921994dab82d092249"; + hash = "sha256-sn/CfaZkS3noDH9lmEtIES6Xc7aoZ5tbHo1AJc5nxac="; + }; + + + nativeBuildInputs = [ + cmake + glslang + pkg-config + qttools + wrapQtAppsHook + ]; + + buildInputs = [ + # vulkan-headers must come first, so the older propagated versions + # don't get picked up by accident + vulkan-headers + + boost + catch2_3 + cpp-jwt + cubeb + discord-rpc + # intentionally omitted: dynarmic - prefer vendored version for compatibility + enet + + # vendored ffmpeg deps + autoconf + yasm + libva # for accelerated video decode on non-nvidia + nv-codec-headers-12 # for accelerated video decode on nvidia + # end vendored ffmpeg deps + + fmt + # intentionally omitted: gamemode - loaded dynamically at runtime + # intentionally omitted: httplib - upstream requires an older version than what we have + libopus + libusb1 + # intentionally omitted: LLVM - heavy, only used for stack traces in the debugger + lz4 + nlohmann_json + qtbase + qtmultimedia + qtwayland + qtwebengine + # intentionally omitted: renderdoc - heavy, developer only + SDL2 + # not packaged in nixpkgs: simpleini + # intentionally omitted: stb - header only libraries, vendor uses git snapshot + # not packaged in nixpkgs: vulkan-memory-allocator + # intentionally omitted: xbyak - prefer vendored version for compatibility + zlib + zstd + ]; + + # This changes `ir/opt` to `ir/var/empty` in `externals/dynarmic/src/dynarmic/CMakeLists.txt` + # making the build fail, as that path does not exist + dontFixCmake = true; + + cmakeFlags = [ + # actually has a noticeable performance impact + "-DYUZU_ENABLE_LTO=ON" + + # build with qt6 + "-DENABLE_QT6=ON" + "-DENABLE_QT_TRANSLATION=ON" + + # use system libraries + # NB: "external" here means "from the externals/ directory in the source", + # so "off" means "use system" + "-DYUZU_USE_EXTERNAL_SDL2=OFF" + "-DYUZU_USE_EXTERNAL_VULKAN_HEADERS=OFF" + + # don't use system ffmpeg, yuzu uses internal APIs + "-DYUZU_USE_BUNDLED_FFMPEG=ON" + + # don't check for missing submodules + "-DYUZU_CHECK_SUBMODULES=OFF" + + # enable some optional features + "-DYUZU_USE_QT_WEB_ENGINE=ON" + "-DYUZU_USE_QT_MULTIMEDIA=ON" + "-DUSE_DISCORD_PRESENCE=ON" + + # We dont want to bother upstream with potentially outdated compat reports + "-DYUZU_ENABLE_COMPATIBILITY_REPORTING=OFF" + "-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF" # We provide this deterministically + ]; + + # Does some handrolled SIMD + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isx86_64 "-msse4.1"; + + # Fixes vulkan detection. + # FIXME: patchelf --add-rpath corrupts the binary for some reason, investigate + qtWrapperArgs = [ + "--prefix LD_LIBRARY_PATH : ${vulkan-loader}/lib" + ]; + + preConfigure = '' + # see https://github.com/NixOS/nixpkgs/issues/114044, setting this through cmakeFlags does not work. + cmakeFlagsArray+=( + "-DTITLE_BAR_FORMAT_IDLE=${finalAttrs.pname} | ${finalAttrs.version} (nixpkgs) {}" + "-DTITLE_BAR_FORMAT_RUNNING=${finalAttrs.pname} | ${finalAttrs.version} (nixpkgs) | {}" + ) + + # provide pre-downloaded tz data + mkdir -p build/externals/nx_tzdb + ln -s ${nx_tzdb} build/externals/nx_tzdb/nx_tzdb + ''; + + postInstall = '' + install -Dm444 $src/dist/72-yuzu-input.rules $out/lib/udev/rules.d/72-yuzu-input.rules + ''; + + passthru.updateScript = nix-update-script { + extraArgs = [ "--version-regex" "mainline-0-(.*)" ]; + }; + + meta = with lib; { + homepage = "https://yuzu-emu.org"; + changelog = "https://yuzu-emu.org/entry"; + description = "An experimental Nintendo Switch emulator written in C++"; + longDescription = '' + An experimental Nintendo Switch emulator written in C++. + Using the mainline branch is recommended for general usage. + Using the early-access branch is recommended if you would like to try out experimental features, with a cost of stability. + ''; + mainProgram = "yuzu"; + platforms = [ "aarch64-linux" "x86_64-linux" ]; + license = with licenses; [ + gpl3Plus + # Icons + asl20 mit cc0 + ]; + maintainers = with maintainers; [ + ashley + ivar + joshuafern + sbruder + k900 + ]; + }; +})