diff --git a/packages/addons/addon-depends/ffmpegx-depends/x264/package.mk b/packages/addons/addon-depends/ffmpegx-depends/x264/package.mk index e45062dbaa6..819023033f1 100644 --- a/packages/addons/addon-depends/ffmpegx-depends/x264/package.mk +++ b/packages/addons/addon-depends/ffmpegx-depends/x264/package.mk @@ -10,6 +10,11 @@ PKG_URL="https://code.videolan.org/videolan/x264/-/archive/${PKG_VERSION}/x264-$ PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="x264 codec" +# gst-plugins-ugly links the static archive without enabling LTO on its +# linker command. Keep both native code and LTO bytecode in the archive so +# it remains linkable by both LTO and non-LTO consumers. +PKG_BUILD_FLAGS="+lto-fat" + if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" nasm:host" fi @@ -33,6 +38,7 @@ configure_target() { --host="${TARGET_NAME}" \ --prefix="/usr" \ --sysroot="${SYSROOT_PREFIX}" \ + --bit-depth=all \ --disable-cli \ --enable-lto \ --enable-pic \ diff --git a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/S922X/ARMSX2/inis/PCSX2.ini b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/S922X/ARMSX2/inis/PCSX2.ini index c66adf14918..412bfcf02d6 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/S922X/ARMSX2/inis/PCSX2.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/S922X/ARMSX2/inis/PCSX2.ini @@ -117,6 +117,12 @@ fpuFullMode = false [EmuCore/GS] VsyncEnable = false +LsfgEnabled = false +LsfgMultiplier = 2 +LsfgDllPath = +LsfgPerformance = true +LsfgFlowScale = 100 +LsfgTargetRate = 0 DisableMailboxPresentation = false ExtendedUpscalingMultipliers = false VsyncQueueSize = 2 @@ -255,7 +261,7 @@ UserHacks_CPUSpriteRenderLevel = 0 UserHacks_CPUCLUTRender = 0 UserHacks_GPUTargetCLUTMode = 0 TriFilter = -1 -OverrideTextureBarriers = 0 +OverrideTextureBarriers = -1 DepthFeedbackMode = 1 ShadeBoost_Brightness = 50 ShadeBoost_Contrast = 50 diff --git a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/inputplumber/ARMSX2/inis/PCSX2.ini b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/inputplumber/ARMSX2/inis/PCSX2.ini index 9a4d77006b9..37ad5d9a7a1 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/inputplumber/ARMSX2/inis/PCSX2.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/config/inputplumber/ARMSX2/inis/PCSX2.ini @@ -117,6 +117,12 @@ fpuFullMode = false [EmuCore/GS] VsyncEnable = false +LsfgEnabled = false +LsfgMultiplier = 2 +LsfgDllPath = +LsfgPerformance = true +LsfgFlowScale = 100 +LsfgTargetRate = 0 DisableMailboxPresentation = false ExtendedUpscalingMultipliers = false VsyncQueueSize = 2 @@ -255,7 +261,7 @@ UserHacks_CPUSpriteRenderLevel = 0 UserHacks_CPUCLUTRender = 0 UserHacks_GPUTargetCLUTMode = 0 TriFilter = -1 -OverrideTextureBarriers = 0 +OverrideTextureBarriers = -1 DepthFeedbackMode = 1 ShadeBoost_Brightness = 50 ShadeBoost_Contrast = 50 diff --git a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/package.mk b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/package.mk index c9d3dd3fd70..2e07f30ea1f 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/package.mk +++ b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/package.mk @@ -2,12 +2,12 @@ # Copyright (C) 2025-present ROCKNIX (https://github.com/ROCKNIX) PKG_NAME="armsx2-sa" -PKG_VERSION="2.6.6.7" +PKG_VERSION="2.6.6.8" PKG_LICENSE="GPLv3" PKG_SITE="https://github.com/ARMSX2/ARMSX2" PKG_URL="${PKG_SITE}/archive/refs/tags/${PKG_VERSION}.tar.gz" PKG_LONGDESC="ARMSX2 is a native ARM64 PlayStation 2 (PS2) emulator, a fork of PCSX2 that ports the EE/IOP/VU JIT recompilers to ARM64." -PKG_DEPENDS_TARGET="toolchain llvm:host SDL3 libpng zlib libjpeg-turbo zstd lz4 libwebp freetype plutosvg curl libpcap ffmpeg libX11 libXext qt6 ecm shaderc lsfg-vk" +PKG_DEPENDS_TARGET="toolchain llvm:host SDL3 libpng zlib libjpeg-turbo zstd lz4 libwebp freetype plutosvg curl libpcap ffmpeg libX11 libXext qt6 ecm shaderc vulkan-loader vulkan-headers wlr-randr" PKG_TOOLCHAIN="manual" PKG_BUILD_FLAGS="speed" @@ -31,6 +31,9 @@ pre_configure_target() { -DLTO_PCSX2_CORE=ON -DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON -DUSE_VULKAN=ON + # ARMSX2 2.6.6.8's Eden-derived frame-generation sources are optional on + # desktop builds. Enable them for the native Linux Vulkan path. + -DARMSX2_ENABLE_LSFG=ON -DUSE_OPENGL=ON -DUSE_BACKTRACE=OFF -DENABLE_QT_UI=ON @@ -43,6 +46,10 @@ pre_configure_target() { for _v in CFLAGS CXXFLAGS LDFLAGS; do export ${_v}="$(echo ${!_v} | sed 's/-mabi=lp64//g; s/-mtune=[^ ]*//g')" done + + # GSLsfg.cpp and the Vulkan present hooks are guarded by this definition. + # Apply it globally so it reaches the core, GS libraries, and LTO target. + export CXXFLAGS="${CXXFLAGS} -DARMSX2_HAS_LSFG=1" } for _f in "${SYSROOT_PREFIX}"/usr/lib/*.o "${SYSROOT_PREFIX}"/usr/lib/*.a; do diff --git a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/scripts/start_armsx2.sh b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/scripts/start_armsx2.sh index 014f8817073..409ca057a2f 100755 --- a/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/scripts/start_armsx2.sh +++ b/projects/ROCKNIX/packages/emulators/standalone/armsx2-sa/scripts/start_armsx2.sh @@ -51,8 +51,31 @@ LSFG_MULTIPLIER=$(get_setting lsfg_multiplier "${PLATFORM}" "${GAME}") LSFG_MULTIPLIER=${LSFG_MULTIPLIER:-2} LSFG_FLOW_SCALE=$(get_setting lsfg_flow_scale "${PLATFORM}" "${GAME}") LSFG_FLOW_SCALE=${LSFG_FLOW_SCALE:-0.30} +# The old external lsfg-vk layer used a 0.00..1.00 fraction. Native ARMSX2 +# 2.6.6.8 stores the same choice as a 25..100 percentage. Accept both forms +# so existing EmulationStation settings continue to work after the migration. +case "${LSFG_FLOW_SCALE}" in + auto) + LSFG_FLOW_SCALE=100 + ;; + *.*) + LSFG_FLOW_SCALE=$(awk -v scale="${LSFG_FLOW_SCALE}" 'BEGIN { printf "%d", (scale * 100) + 0.5 }') + ;; +esac +case "${LSFG_FLOW_SCALE}" in + ''|*[!0-9]*) + LSFG_FLOW_SCALE=100 + ;; +esac +if [ "${LSFG_FLOW_SCALE}" -lt 25 ]; then + LSFG_FLOW_SCALE=25 +elif [ "${LSFG_FLOW_SCALE}" -gt 100 ]; then + LSFG_FLOW_SCALE=100 +fi LSFG_PERFORMANCE_MODE=$(get_setting lsfg_performance_mode "${PLATFORM}" "${GAME}") LSFG_PERFORMANCE_MODE=${LSFG_PERFORMANCE_MODE:-1} +LSFG_TARGET_RATE=$(get_setting lsfg_target_rate "${PLATFORM}" "${GAME}") +LSFG_TARGET_RATE=${LSFG_TARGET_RATE:-auto} #Set the cores to use CORES=$(get_setting "cores" "${PLATFORM}" "${GAME}") @@ -218,32 +241,152 @@ fi #Graphic driver fixes @GRAPHICS@ -#Lossless Scaling frame generation - LSFG_DLL_PATH="/storage/roms/bios/armsx2/Lossless.dll" - if [ ! -f "${LSFG_DLL_PATH}" ] && [ -f "/storage/games-internal/roms/steam/steamapps/common/Lossless Scaling/Lossless.dll" ]; then - LSFG_DLL_PATH="/storage/games-internal/roms/steam/steamapps/common/Lossless Scaling/Lossless.dll" - elif [ ! -f "${LSFG_DLL_PATH}" ] && [ -f "/storage/.local/share/Steam/steamapps/common/Lossless Scaling/Lossless.dll" ]; then - LSFG_DLL_PATH="/storage/.local/share/Steam/steamapps/common/Lossless Scaling/Lossless.dll" - elif [ ! -f "${LSFG_DLL_PATH}" ] && [ -f "/storage/roms/steam/steamapps/common/Lossless Scaling/Lossless.dll" ]; then - LSFG_DLL_PATH="/storage/roms/steam/steamapps/common/Lossless Scaling/Lossless.dll" - fi +#Lossless Scaling frame generation (native ARMSX2 Vulkan path) + ARMSX2_INI="/storage/.config/ARMSX2/inis/PCSX2.ini" + + detect_refresh_rate() { + local wlr_randr="/usr/bin/wlr-randr" + local display_output + local refresh_rate + + [ -x "${wlr_randr}" ] || return 1 + display_output=$( + "${wlr_randr}" 2>/dev/null | + awk ' + /^[^[:space:]]/ { output = $1; next } + /^[[:space:]]+Enabled:[[:space:]]+yes/ && output != "" { + print output + found = 1 + exit + } + END { + if (!found && output != "") + print output + } + ' + ) + [ -n "${display_output}" ] || return 1 + refresh_rate=$( + "${wlr_randr}" --output "${display_output}" 2>/dev/null | + awk '/current/ { + for (i = 1; i <= NF; i++) { + if ($i == "Hz") { + value = $(i - 1) + gsub(/[^0-9.]/, "", value) + if (value != "") { + print value + exit + } + } + } + }' + ) + case "${refresh_rate}" in + ''|*[!0-9.]*) + return 1 + ;; + esac + refresh_rate=$(awk -v rate="${refresh_rate}" 'BEGIN { printf "%d", rate + 0.5 }') + case "${refresh_rate}" in + ''|*[!0-9]*) return 1 ;; + esac + printf '%s\n' "${refresh_rate}" + } + + # Keep settings in the [EmuCore/GS] section. This also upgrades an existing + # user configuration created by 2.6.6.7, which has no native LSFG keys yet. + set_gs_setting() { + local key="${1}" + local value="${2}" + local tmp="${ARMSX2_INI}.tmp.$$" + + awk -v key="${key}" -v value="${value}" ' + function add_missing() { + if (!seen_value) + print key " = " value + } + /^\[/ { + if (in_gs) + add_missing() + in_gs = ($0 == "[EmuCore/GS]") + if (in_gs) { + seen_section = 1 + seen_value = 0 + } + } + in_gs && $0 ~ "^[[:space:]]*" key "[[:space:]]*=" { + print key " = " value + seen_value = 1 + next + } + { print } + END { + if (in_gs) + add_missing() + if (!seen_section) { + print "" + print "[EmuCore/GS]" + print key " = " value + } + } + ' "${ARMSX2_INI}" > "${tmp}" && mv "${tmp}" "${ARMSX2_INI}" + } - if [ "${LSFG_ENABLE}" = "1" ] && [ -f "${LSFG_DLL_PATH}" ]; then - unset DISABLE_LSFGVK - export LSFGVK_ENV=1 - export LSFGVK_DLL_PATH="${LSFG_DLL_PATH}" - export LSFGVK_MULTIPLIER="${LSFG_MULTIPLIER}" - export LSFGVK_FLOW_SCALE="${LSFG_FLOW_SCALE}" - export LSFGVK_PERFORMANCE_MODE="${LSFG_PERFORMANCE_MODE}" - export LSFGVK_PACING=none - sed -i '/^Renderer =/c\Renderer = 14' /storage/.config/ARMSX2/inis/PCSX2.ini - sed -i '/^VsyncEnable =/c\VsyncEnable = true' /storage/.config/ARMSX2/inis/PCSX2.ini + LSFG_DLL_PATH="" + for candidate in \ + "/storage/roms/bios/armsx2/Lossless.dll" \ + "/storage/games-internal/roms/steam/steamapps/common/Lossless Scaling/Lossless.dll" \ + "/storage/.local/share/Steam/steamapps/common/Lossless Scaling/Lossless.dll" \ + "/storage/roms/steam/steamapps/common/Lossless Scaling/Lossless.dll"; do + if [ -f "${candidate}" ]; then + LSFG_DLL_PATH="${candidate}" + break + fi + done + + # ARMSX2's native implementation and lsfg-vk must never run together. + # Keep the external layer disabled even if the system package is installed. + export DISABLE_LSFGVK=1 + unset LSFGVK_ENV LSFGVK_DLL_PATH LSFGVK_MULTIPLIER LSFGVK_FLOW_SCALE LSFGVK_PERFORMANCE_MODE LSFGVK_PACING + + if [ "${LSFG_ENABLE}" = "1" ] && [ -n "${LSFG_DLL_PATH}" ]; then + if [ "${LSFG_TARGET_RATE}" = "auto" ]; then + LSFG_TARGET_RATE="$(detect_refresh_rate || true)" + if [ -z "${LSFG_TARGET_RATE}" ]; then + LSFG_TARGET_RATE=0 + echo "ARMSX2 adaptive LSFG disabled: active display refresh rate could not be detected." + fi + fi + case "${LSFG_TARGET_RATE}" in + ''|*[!0-9]*) LSFG_TARGET_RATE=0 ;; + esac + if [ "${LSFG_PERFORMANCE_MODE}" = "1" ]; then + LSFG_PERFORMANCE=true + else + LSFG_PERFORMANCE=false + fi + set_gs_setting LsfgEnabled true + set_gs_setting LsfgMultiplier "${LSFG_MULTIPLIER}" + set_gs_setting LsfgDllPath "${LSFG_DLL_PATH}" + set_gs_setting LsfgPerformance "${LSFG_PERFORMANCE}" + set_gs_setting LsfgFlowScale "${LSFG_FLOW_SCALE}" + # A non-zero target enables 2.6.6.8's adaptive pacer. The EmulationStation + # "adaptive (screen)" choice resolves to the active Wayland mode above. + set_gs_setting LsfgTargetRate "${LSFG_TARGET_RATE}" + sed -i '/^Renderer =/c\Renderer = 14' "${ARMSX2_INI}" + sed -i '/^VsyncEnable =/c\VsyncEnable = true' "${ARMSX2_INI}" + if [ "${LSFG_TARGET_RATE}" -gt 0 ]; then + echo "ARMSX2 native adaptive LSFG enabled: x${LSFG_MULTIPLIER}, target ${LSFG_TARGET_RATE}Hz, flow ${LSFG_FLOW_SCALE}%" + else + echo "ARMSX2 native LSFG enabled: x${LSFG_MULTIPLIER}, fixed multiplier, flow ${LSFG_FLOW_SCALE}%" + fi else - export DISABLE_LSFGVK=1 - unset LSFGVK_ENV LSFGVK_DLL_PATH LSFGVK_MULTIPLIER LSFGVK_FLOW_SCALE LSFGVK_PERFORMANCE_MODE LSFGVK_PACING - sed -i '/^VsyncEnable =/c\VsyncEnable = false' /storage/.config/ARMSX2/inis/PCSX2.ini + set_gs_setting LsfgEnabled false + set_gs_setting LsfgDllPath "${LSFG_DLL_PATH}" + set_gs_setting LsfgTargetRate 0 + sed -i '/^VsyncEnable =/c\VsyncEnable = false' "${ARMSX2_INI}" if [ "${LSFG_ENABLE}" = "1" ]; then - echo "LSFG disabled: Lossless.dll not found in the ARMSX2 BIOS or Steam directories." + echo "ARMSX2 native LSFG disabled: Lossless.dll not found in the ARMSX2 BIOS or Steam directories." fi fi diff --git a/projects/ROCKNIX/packages/multimedia/gstreamer/gst-plugins-ugly/package.mk b/projects/ROCKNIX/packages/multimedia/gstreamer/gst-plugins-ugly/package.mk index 1a7a2e4d302..a523b237afe 100644 --- a/projects/ROCKNIX/packages/multimedia/gstreamer/gst-plugins-ugly/package.mk +++ b/projects/ROCKNIX/packages/multimedia/gstreamer/gst-plugins-ugly/package.mk @@ -6,7 +6,7 @@ PKG_VERSION="$(get_pkg_version gstreamer)" PKG_LICENSE="LGPL-2.1-or-later" PKG_SITE="https://gstreamer.freedesktop.org/modules/gst-plugins-ugly.html" PKG_URL="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/${PKG_NAME}-${PKG_VERSION}.tar.xz" -PKG_DEPENDS_TARGET="toolchain gstreamer gst-plugins-base" +PKG_DEPENDS_TARGET="toolchain gstreamer gst-plugins-base x264" PKG_LONGDESC="Good GStreamer plugins and helper libraries" PKG_MESON_OPTS_TARGET="-Dtests=disabled \ diff --git a/projects/ROCKNIX/packages/ui/emulationstation/config/common/es_features.cfg b/projects/ROCKNIX/packages/ui/emulationstation/config/common/es_features.cfg index 746906211a4..be66983a3b8 100644 --- a/projects/ROCKNIX/packages/ui/emulationstation/config/common/es_features.cfg +++ b/projects/ROCKNIX/packages/ui/emulationstation/config/common/es_features.cfg @@ -1349,6 +1349,13 @@ + + + + + + +