From a3cdf49dbf5483656a22e5f7481892022b59e577 Mon Sep 17 00:00:00 2001 From: SamLukeYes Date: Sun, 14 Aug 2022 15:42:27 +0800 Subject: [PATCH] ppsspp: add SDL and headless Change the default ppsspp package to SDL frontend, as it supports vulkan, and is allowed to build the headless binary together. --- .../applications/emulators/ppsspp/default.nix | 157 +++++++++++------- pkgs/top-level/all-packages.nix | 12 +- 2 files changed, 111 insertions(+), 58 deletions(-) diff --git a/pkgs/applications/emulators/ppsspp/default.nix b/pkgs/applications/emulators/ppsspp/default.nix index 1264768f387d..6281cbd2c088 100644 --- a/pkgs/applications/emulators/ppsspp/default.nix +++ b/pkgs/applications/emulators/ppsspp/default.nix @@ -3,76 +3,119 @@ , fetchFromGitHub , SDL2 , cmake +, copyDesktopItems , ffmpeg , glew +, libffi , libzip +, makeDesktopItem +, makeWrapper , pkg-config , python3 -, qtbase -, qtmultimedia +, qtbase ? null +, qtmultimedia ? null , snappy -, wrapQtAppsHook +, vulkan-loader +, wayland +, wrapQtAppsHook ? null , zlib +, enableVulkan ? true +, forceWayland ? false }: -stdenv.mkDerivation (finalAttrs: { - pname = "ppsspp"; - version = "1.13.1"; +let + enableQt = (qtbase != null); + frontend = if enableQt then "Qt" else "SDL and headless"; + vulkanPath = lib.makeLibraryPath [ vulkan-loader ]; - src = fetchFromGitHub { - owner = "hrydgard"; - repo = "ppsspp"; - rev = "v${finalAttrs.version}"; - fetchSubmodules = true; - sha256 = "sha256-WsFy2aSOmkII2Lte5et4W6qj0AXUKWWkYe88T0OQP08="; - }; + # experimental, see https://github.com/hrydgard/ppsspp/issues/13845 + vulkanWayland = enableVulkan && forceWayland; +in + # Only SDL front end needs to specify whether to use Wayland + assert forceWayland -> !enableQt; + stdenv.mkDerivation (finalAttrs: { + pname = "ppsspp" + + lib.optionalString enableQt "-qt" + + lib.optionalString (!enableQt) "-sdl" + + lib.optionalString forceWayland "-wayland"; + version = "1.13.1"; - postPatch = '' - substituteInPlace git-version.cmake --replace unknown ${finalAttrs.src.rev} - substituteInPlace UI/NativeApp.cpp --replace /usr/share $out/share - ''; + src = fetchFromGitHub { + owner = "hrydgard"; + repo = "ppsspp"; + rev = "v${finalAttrs.version}"; + fetchSubmodules = true; + sha256 = "sha256-WsFy2aSOmkII2Lte5et4W6qj0AXUKWWkYe88T0OQP08="; + }; - nativeBuildInputs = [ - cmake - pkg-config - python3 - wrapQtAppsHook - ]; + postPatch = '' + substituteInPlace git-version.cmake --replace unknown ${finalAttrs.src.rev} + substituteInPlace UI/NativeApp.cpp --replace /usr/share $out/share + ''; - buildInputs = [ - SDL2 - ffmpeg - glew - libzip - qtbase - qtmultimedia - snappy - zlib - ]; + nativeBuildInputs = [ + cmake + copyDesktopItems + makeWrapper + pkg-config + python3 + wrapQtAppsHook + ]; - cmakeFlags = [ - "-DHEADLESS=OFF" - "-DOpenGL_GL_PREFERENCE=GLVND" - "-DUSE_SYSTEM_FFMPEG=ON" - "-DUSE_SYSTEM_LIBZIP=ON" - "-DUSE_SYSTEM_SNAPPY=ON" - "-DUSING_QT_UI=ON" - ]; + buildInputs = [ + SDL2 + ffmpeg + (glew.override { enableEGL = forceWayland; }) + libzip + qtbase + qtmultimedia + snappy + zlib + ] ++ lib.optional enableVulkan vulkan-loader + ++ lib.optionals vulkanWayland [ wayland libffi ]; - installPhase = '' - runHook preInstall - mkdir -p $out/share/ppsspp - install -Dm555 PPSSPPQt $out/bin/ppsspp - mv assets $out/share/ppsspp - runHook postInstall - ''; + cmakeFlags = [ + "-DHEADLESS=${if enableQt then "OFF" else "ON"}" + "-DOpenGL_GL_PREFERENCE=GLVND" + "-DUSE_SYSTEM_FFMPEG=ON" + "-DUSE_SYSTEM_LIBZIP=ON" + "-DUSE_SYSTEM_SNAPPY=ON" + "-DUSE_WAYLAND_WSI=${if vulkanWayland then "ON" else "OFF"}" + "-DUSING_QT_UI=${if enableQt then "ON" else "OFF"}" + ]; - meta = with lib; { - homepage = "https://www.ppsspp.org/"; - description = "A HLE Playstation Portable emulator, written in C++"; - license = licenses.gpl2Plus; - maintainers = with maintainers; [ AndersonTorres ]; - platforms = platforms.linux; - }; -}) -# TODO: add SDL headless port + desktopItems = [(makeDesktopItem { + desktopName = "PPSSPP"; + name = "ppsspp"; + exec = "ppsspp"; + icon = "ppsspp"; + comment = "Play PSP games on your computer"; + categories = [ "Game" "Emulator" ]; + })]; + + installPhase = '' + runHook preInstall + mkdir -p $out/share/{applications,ppsspp} + '' + (if enableQt then '' + install -Dm555 PPSSPPQt $out/bin/ppsspp + wrapProgram $out/bin/ppsspp \ + '' else '' + install -Dm555 PPSSPPHeadless $out/bin/ppsspp-headless + install -Dm555 PPSSPPSDL $out/share/ppsspp/ + makeWrapper $out/share/ppsspp/PPSSPPSDL $out/bin/ppsspp \ + --set SDL_VIDEODRIVER ${if forceWayland then "wayland" else "x11"} \ + '') + lib.optionalString enableVulkan '' + --prefix LD_LIBRARY_PATH : ${vulkanPath} \ + '' + "\n" + '' + mv assets $out/share/ppsspp + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://www.ppsspp.org/"; + description = "A HLE Playstation Portable emulator, written in C++ (${frontend})"; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.linux; + }; + }) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 9ff8d0d543c9..0b93518f6c89 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1493,8 +1493,18 @@ with pkgs; pcsxr = callPackage ../applications/emulators/pcsxr { }; - ppsspp = callPackage ../applications/emulators/ppsspp { + ppsspp = callPackage ../applications/emulators/ppsspp { }; + + ppsspp-sdl = ppsspp; + + ppsspp-sdl-wayland = ppsspp.override { + forceWayland = true; + enableVulkan = false; # https://github.com/hrydgard/ppsspp/issues/13845 + }; + + ppsspp-qt = ppsspp.override { inherit (libsForQt5) qtbase qtmultimedia wrapQtAppsHook; + enableVulkan = false; # https://github.com/hrydgard/ppsspp/issues/11628 }; proton-caller = callPackage ../applications/emulators/proton-caller { };