mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-16 13:22:41 +00:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0cda02e91e | |||
| f8facda35f | |||
| 39be450fa3 | |||
| 68aaea6085 | |||
| ba608d2b57 | |||
| c22f57bc4e | |||
| 7b97ec4594 | |||
| e63b248e54 | |||
| 97a8470b12 | |||
| 102d254530 | |||
| 7c0e993b5b | |||
| ce14fc91fb | |||
| c27266c4cd | |||
| 02eaf3c5a7 | |||
| c8c61a12c3 | |||
| b05463ee19 | |||
| 561adac0af | |||
| 62ef8b15fd | |||
| 8e9513cb5f | |||
| 950e0f82fb | |||
| 74a6607f8e | |||
| 5ebb5b8772 | |||
| 73918d23d5 | |||
| ef4113aeaa | |||
| 78a1cd0533 | |||
| 026974211e | |||
| d698c3b601 | |||
| 60e1032771 | |||
| 1071353291 | |||
| eb8086a011 | |||
| 4edb1ac6c5 | |||
| 3875093c70 | |||
| 86895a5f6a |
@@ -52,7 +52,7 @@ jobs:
|
||||
}
|
||||
EOF
|
||||
|
||||
curl -X 'POST' \
|
||||
curl -XPOST \
|
||||
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
name: update-deps
|
||||
name: Update Dependencies
|
||||
|
||||
on:
|
||||
# saturday at noon
|
||||
@@ -7,7 +7,7 @@ on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
tx-update:
|
||||
update-deps:
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -24,18 +24,21 @@ jobs:
|
||||
git remote set-url origin ci:eden-emu/eden.git
|
||||
|
||||
DATE=$(date +"%b %d")
|
||||
TIMESTAMP=$(date +"%s")
|
||||
echo "DATE=$DATE" >> "$GITHUB_ENV"
|
||||
echo "TIMESTAMP=$TIMESTAMP" >> "$GITHUB_ENV"
|
||||
|
||||
git switch -c update-deps-$DATE
|
||||
git switch -c update-deps-$TIMESTAMP
|
||||
tools/cpmutil.sh package update -ac
|
||||
git push
|
||||
|
||||
- name: Create PR
|
||||
run: |
|
||||
set -x
|
||||
TITLE="[externals] Dependency update for $DATE"
|
||||
BODY="$(git show -s --format='%b')"
|
||||
BASE=master
|
||||
HEAD=update-deps-$DATE
|
||||
HEAD=update-deps-$TIMESTAMP
|
||||
|
||||
cat << EOF > data.json
|
||||
{
|
||||
@@ -46,7 +49,7 @@ jobs:
|
||||
}
|
||||
EOF
|
||||
|
||||
curl -X 'POST' \
|
||||
curl -XPOST \
|
||||
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
||||
|
||||
+2
-6
@@ -6,6 +6,7 @@ cmake_minimum_required(VERSION 3.31)
|
||||
project(yuzu)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/find")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||
|
||||
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
||||
@@ -588,12 +589,7 @@ endif()
|
||||
# Qt stuff
|
||||
if (ENABLE_QT)
|
||||
if (YUZU_USE_BUNDLED_QT)
|
||||
# Qt 6.8+ is broken on macOS (??)
|
||||
if (APPLE)
|
||||
AddQt(Eden-CI/Qt 6.7.3)
|
||||
else()
|
||||
AddQt(Eden-CI/Qt 6.11.1)
|
||||
endif()
|
||||
AddQt(Eden-CI/Qt 6.11.1)
|
||||
else()
|
||||
message(STATUS "Using system Qt")
|
||||
if (NOT Qt6_DIR)
|
||||
|
||||
+68
-56
@@ -128,7 +128,8 @@ function(AddDependentPackages)
|
||||
message(FATAL_ERROR "Partial dependency installation detected "
|
||||
"for the following packages:\n${package_names}\n"
|
||||
"You can solve this in one of two ways:\n"
|
||||
"1. Install the following packages to your system if available:"
|
||||
"1. Install or upgrade the following packages "
|
||||
"to your system if available:"
|
||||
"\n\t${bundled_names}\n"
|
||||
"2. Set the following variables to ON:"
|
||||
"\n\t${system_names}\n"
|
||||
@@ -241,15 +242,14 @@ function(AddJsonPackage)
|
||||
|
||||
# these are overrides that can be generated at runtime,
|
||||
# so can be defined separately from the json
|
||||
DOWNLOAD_ONLY
|
||||
BUNDLED_PACKAGE
|
||||
FORCE_BUNDLED_PACKAGE)
|
||||
|
||||
set(multiValueArgs OPTIONS)
|
||||
|
||||
set(options MODULE)
|
||||
set(optionArgs MODULE_PATH DOWNLOAD_ONLY)
|
||||
|
||||
cmake_parse_arguments(JSON "${options}" "${oneValueArgs}" "${multiValueArgs}"
|
||||
cmake_parse_arguments(JSON "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}"
|
||||
"${ARGN}")
|
||||
|
||||
list(LENGTH ARGN argnLength)
|
||||
@@ -278,11 +278,15 @@ function(AddJsonPackage)
|
||||
|
||||
parse_object(${object})
|
||||
|
||||
if(ci)
|
||||
if (JSON_MODULE)
|
||||
set(EXTRA_ARGS MODULE)
|
||||
endif()
|
||||
if (JSON_MODULE_PATH)
|
||||
list(APPEND EXTRA_ARGS MODULE_PATH)
|
||||
endif()
|
||||
|
||||
if (JSON_DOWNLOAD_ONLY)
|
||||
list(APPEND EXTRA_ARGS DOWNLOAD_ONLY)
|
||||
endif()
|
||||
|
||||
if(ci)
|
||||
AddCIPackage(
|
||||
VERSION ${version}
|
||||
NAME ${name}
|
||||
@@ -313,40 +317,25 @@ function(AddJsonPackage)
|
||||
FORCE_BUNDLED_PACKAGE "${JSON_FORCE_BUNDLED_PACKAGE}"
|
||||
SOURCE_SUBDIR "${source_subdir}"
|
||||
|
||||
GIT_VERSION ${git_version}
|
||||
GIT_HOST ${git_host}
|
||||
GIT_VERSION "${git_version}"
|
||||
GIT_HOST "${git_host}"
|
||||
|
||||
ARTIFACT ${artifact}
|
||||
TAG ${tag})
|
||||
ARTIFACT "${artifact}"
|
||||
TAG "${tag}"
|
||||
${EXTRA_ARGS})
|
||||
endif()
|
||||
|
||||
# pass stuff to parent scope
|
||||
Propagate(${package}_ADDED)
|
||||
Propagate(${package}_SOURCE_DIR)
|
||||
Propagate(${package}_BINARY_DIR)
|
||||
Propagate(CMAKE_PREFIX_PATH)
|
||||
endfunction()
|
||||
|
||||
function(AddPackage)
|
||||
cpm_set_policies()
|
||||
set(EXTRA_ARGS "")
|
||||
|
||||
# TODO(crueter): git clone?
|
||||
|
||||
#[[
|
||||
URL configurations, descending order of precedence:
|
||||
- URL [+ GIT_URL] -> bare URL fetch
|
||||
- REPO + TAG + ARTIFACT -> github release artifact
|
||||
- REPO + TAG -> github release archive
|
||||
- REPO + SHA -> github commit archive
|
||||
- REPO + BRANCH -> github branch
|
||||
|
||||
Hash configurations, descending order of precedence:
|
||||
- HASH -> bare sha512sum
|
||||
- HASH_SUFFIX -> hash grabbed from the URL + this suffix
|
||||
- HASH_URL -> hash grabbed from a URL
|
||||
* technically this is unsafe since a hacker can attack that url
|
||||
|
||||
NOTE: hash algo defaults to sha512
|
||||
#]]
|
||||
set(oneValueArgs
|
||||
NAME
|
||||
VERSION
|
||||
@@ -366,6 +355,7 @@ function(AddPackage)
|
||||
|
||||
URL
|
||||
GIT_URL
|
||||
SOURCE_SUBDIR
|
||||
|
||||
KEY
|
||||
BUNDLED_PACKAGE
|
||||
@@ -374,7 +364,9 @@ function(AddPackage)
|
||||
|
||||
set(multiValueArgs OPTIONS PATCHES)
|
||||
|
||||
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}"
|
||||
set(optionArgs MODULE_PATH DOWNLOAD_ONLY)
|
||||
|
||||
cmake_parse_arguments(PKG_ARGS "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}"
|
||||
"${ARGN}")
|
||||
|
||||
if(NOT DEFINED PKG_ARGS_NAME)
|
||||
@@ -558,16 +550,36 @@ function(AddPackage)
|
||||
VERSION ${PKG_ARGS_VERSION})
|
||||
endif()
|
||||
|
||||
CPMAddPackage(
|
||||
NAME ${PKG_ARGS_NAME}
|
||||
URL ${pkg_url}
|
||||
URL_HASH ${pkg_hash}
|
||||
CUSTOM_CACHE_KEY ${pkg_key}
|
||||
DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY}
|
||||
FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS}
|
||||
if (PKG_ARGS_FIND_PACKAGE_ARGUMENTS)
|
||||
list(APPEND EXTRA_ARGS
|
||||
FIND_PACKAGE_ARGUMENTS "${PKG_ARGS_FIND_PACKAGE_ARGUMENTS}")
|
||||
endif()
|
||||
|
||||
if (PKG_ARGS_PATCHES)
|
||||
list(APPEND EXTRA_ARGS
|
||||
PATCHES "${PKG_ARGS_PATCHES}")
|
||||
endif()
|
||||
|
||||
if (PKG_ARGS_OPTIONS)
|
||||
list(APPEND EXTRA_ARGS
|
||||
OPTIONS "${PKG_ARGS_OPTIONS}")
|
||||
endif()
|
||||
|
||||
if (PKG_ARGS_SOURCE_SUBDIR)
|
||||
list(APPEND EXTRA_ARGS
|
||||
SOURCE_SUBDIR "${PKG_ARGS_SOURCE_SUBDIR}")
|
||||
endif()
|
||||
|
||||
if (PKG_ARGS_DOWNLOAD_ONLY OR PKG_ARGS_MODULE_PATH)
|
||||
list(APPEND EXTRA_ARGS DOWNLOAD_ONLY ON)
|
||||
endif()
|
||||
|
||||
CPMAddPackage(
|
||||
NAME "${PKG_ARGS_NAME}"
|
||||
URL "${pkg_url}"
|
||||
URL_HASH "${pkg_hash}"
|
||||
CUSTOM_CACHE_KEY "${pkg_key}"
|
||||
|
||||
OPTIONS ${PKG_ARGS_OPTIONS}
|
||||
PATCHES ${PKG_ARGS_PATCHES}
|
||||
EXCLUDE_FROM_ALL ON
|
||||
|
||||
${EXTRA_ARGS}
|
||||
@@ -607,13 +619,14 @@ function(AddPackage)
|
||||
endif()
|
||||
|
||||
# pass stuff to parent scope
|
||||
set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}"
|
||||
PARENT_SCOPE)
|
||||
set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}"
|
||||
PARENT_SCOPE)
|
||||
set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}"
|
||||
PARENT_SCOPE)
|
||||
Propagate(${PKG_ARGS_NAME}_ADDED)
|
||||
Propagate(${PKG_ARGS_NAME}_SOURCE_DIR)
|
||||
Propagate(${PKG_ARGS_NAME}_BINARY_DIR)
|
||||
|
||||
if (PKG_ARGS_MODULE_PATH)
|
||||
list(PREPEND CMAKE_PREFIX_PATH "${${ARTIFACT_PACKAGE}_SOURCE_DIR}")
|
||||
Propagate(CMAKE_PREFIX_PATH)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# TODO(crueter): we could do an AddMultiArchPackage, multiplatformpackage?
|
||||
@@ -629,7 +642,7 @@ function(AddCIPackage)
|
||||
|
||||
set(multiValueArgs DISABLED_PLATFORMS)
|
||||
|
||||
set(optionArgs MODULE)
|
||||
set(optionArgs MODULE_PATH)
|
||||
|
||||
cmake_parse_arguments(PKG_ARGS
|
||||
"${optionArgs}"
|
||||
@@ -706,6 +719,10 @@ function(AddCIPackage)
|
||||
set(ARTIFACT
|
||||
"${ARTIFACT_NAME}-${pkgname}-${ARTIFACT_VERSION}.${ARTIFACT_EXT}")
|
||||
|
||||
if (PKG_ARGS_MODULE_PATH)
|
||||
list(APPEND EXTRA_ARGS MODULE_PATH)
|
||||
endif()
|
||||
|
||||
AddPackage(
|
||||
NAME ${ARTIFACT_PACKAGE}
|
||||
REPO ${ARTIFACT_REPO}
|
||||
@@ -716,16 +733,11 @@ function(AddCIPackage)
|
||||
KEY "${pkgname}-${ARTIFACT_VERSION}"
|
||||
HASH_SUFFIX sha512sum
|
||||
FORCE_BUNDLED_PACKAGE ON
|
||||
DOWNLOAD_ONLY ${PKG_ARGS_MODULE})
|
||||
${EXTRA_ARGS})
|
||||
|
||||
set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE)
|
||||
set(${ARTIFACT_PACKAGE}_SOURCE_DIR
|
||||
"${${ARTIFACT_PACKAGE}_SOURCE_DIR}" PARENT_SCOPE)
|
||||
|
||||
if (PKG_ARGS_MODULE)
|
||||
list(PREPEND CMAKE_PREFIX_PATH "${${ARTIFACT_PACKAGE}_SOURCE_DIR}")
|
||||
Propagate(CMAKE_PREFIX_PATH)
|
||||
endif()
|
||||
Propagate(${ARTIFACT_PACKAGE}_SOURCE_DIR)
|
||||
Propagate(CMAKE_PREFIX_PATH)
|
||||
else()
|
||||
find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED)
|
||||
endif()
|
||||
@@ -750,7 +762,7 @@ function(AddQt repo version)
|
||||
DISABLED_PLATFORMS
|
||||
android-x86_64 android-aarch64
|
||||
freebsd-amd64 solaris-amd64 openbsd-amd64
|
||||
MODULE)
|
||||
MODULE_PATH)
|
||||
|
||||
find_package(Qt6 REQUIRED PATHS ${Qt6_SOURCE_DIR} NO_DEFAULT_PATH)
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
# This file provides the function windows_copy_files.
|
||||
# This is only valid on Windows.
|
||||
|
||||
# Include guard
|
||||
if(__windows_copy_files)
|
||||
return()
|
||||
endif()
|
||||
set(__windows_copy_files YES)
|
||||
|
||||
# Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR.
|
||||
# This copying happens post-build.
|
||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
||||
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
||||
# windows commandline expects the / to be \ so switch them
|
||||
string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR})
|
||||
string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR})
|
||||
|
||||
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
||||
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
||||
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
||||
COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
||||
)
|
||||
endfunction()
|
||||
else()
|
||||
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
||||
COMMAND cp -ra ${SOURCE_DIR}/. ${DEST_DIR}
|
||||
)
|
||||
endfunction()
|
||||
endif()
|
||||
@@ -1,30 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2024 kleidis
|
||||
|
||||
[aqt]
|
||||
concurrency: 2
|
||||
|
||||
[mirrors]
|
||||
trusted_mirrors:
|
||||
https://download.qt.io
|
||||
blacklist:
|
||||
https://qt.mirror.constant.com
|
||||
https://mirrors.ocf.berkeley.edu
|
||||
https://mirrors.ustc.edu.cn
|
||||
https://mirrors.tuna.tsinghua.edu.cn
|
||||
https://mirrors.geekpie.club
|
||||
https://mirrors-wan.geekpie.club
|
||||
https://mirrors.sjtug.sjtu.edu.cn
|
||||
fallbacks:
|
||||
https://qtproject.mirror.liquidtelecom.com/
|
||||
https://mirrors.aliyun.com/qt/
|
||||
https://ftp.jaist.ac.jp/pub/qtproject/
|
||||
https://ftp.yz.yamagata-u.ac.jp/pub/qtproject/
|
||||
https://qt-mirror.dannhauer.de/
|
||||
https://ftp.fau.de/qtproject/
|
||||
https://mirror.netcologne.de/qtproject/
|
||||
https://mirrors.dotsrc.org/qtproject/
|
||||
https://www.nic.funet.fi/pub/mirrors/download.qt-project.org/
|
||||
https://master.qt.io/
|
||||
https://mirrors.ukfast.co.uk/sites/qt.io/
|
||||
https://ftp2.nluug.nl/languages/qt/
|
||||
https://ftp1.nluug.nl/languages/qt/
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2019 Citra Emulator Project
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Andrea Pappacoda <andrea@pappacoda.it>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
@@ -0,0 +1,39 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
set(CROSS_TARGET "" CACHE STRING "Cross-compilation target (aarch64, etc)")
|
||||
set(CROSS_PLATFORM "unknown-linux-gnu" CACHE STRING "Cross-compilation platform (e.g. unknown-linux-gnu)")
|
||||
set(CROSS_COMPILER "gcc" CACHE STRING "Cross compiler type (gcc or clang)")
|
||||
|
||||
if (NOT CROSS_TARGET)
|
||||
message(FATAL_ERROR "GentooCross used without a valid CROSS_TARGET")
|
||||
endif()
|
||||
|
||||
set(prefix ${CROSS_TARGET}-${CROSS_PLATFORM})
|
||||
|
||||
set(CMAKE_SYSROOT /usr/${prefix})
|
||||
|
||||
if (CROSS_COMPILER STREQUAL "gcc")
|
||||
set(CMAKE_C_COMPILER ${prefix}-gcc)
|
||||
set(CMAKE_CXX_COMPILER ${prefix}-g++)
|
||||
elseif (CROSS_COMPILER STREQUAL "clang")
|
||||
set(CMAKE_C_COMPILER ${prefix}-clang)
|
||||
set(CMAKE_CXX_COMPILER ${prefix}-clang++)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported cross compiler type ${CROSS_COMPILER}")
|
||||
endif()
|
||||
|
||||
# search programs in the host environment
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
|
||||
# search headers and libraries in the target environment
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
|
||||
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
|
||||
|
||||
# sanity checks
|
||||
if (NOT IS_DIRECTORY ${CMAKE_SYSROOT})
|
||||
message(FATAL_ERROR "Invalid sysroot ${CMAKE_SYSROOT}."
|
||||
"Double-check your CROSS_TARGET and CROSS_PLATFORM.")
|
||||
endif()
|
||||
Vendored
+184
@@ -0,0 +1,184 @@
|
||||
; SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
; SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
; Usage:
|
||||
; get the latest nsis: https://nsis.sourceforge.io/Download
|
||||
|
||||
; Require these for makensis.
|
||||
!ifndef PRODUCT_VERSION
|
||||
!error "PRODUCT_VERSION must be defined"
|
||||
!endif
|
||||
|
||||
!ifndef ARCH
|
||||
!error "ARCH must be defined"
|
||||
!endif
|
||||
|
||||
!ifndef VARIANT
|
||||
!error "VARIANT must be defined"
|
||||
!endif
|
||||
|
||||
Unicode true
|
||||
ManifestDPIAware true
|
||||
|
||||
!define PRODUCT_NAME "Eden"
|
||||
!define PRODUCT_PUBLISHER "Utopia LLC"
|
||||
!define PRODUCT_WEB_SITE "https://git.eden-emu.dev"
|
||||
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"
|
||||
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
||||
|
||||
!define BINARY_SOURCE_DIR "..\bin"
|
||||
|
||||
Name "${PRODUCT_NAME}"
|
||||
OutFile "${PRODUCT_NAME}-Windows-${PRODUCT_VERSION}-${ARCH}-${VARIANT}-installer.exe"
|
||||
SetCompressor /SOLID lzma
|
||||
InstallDir "$LOCALAPPDATA\$(^Name)"
|
||||
ShowInstDetails show
|
||||
ShowUnInstDetails show
|
||||
|
||||
!include "MUI2.nsh"
|
||||
; Custom page plugin
|
||||
!include "nsDialogs.nsh"
|
||||
|
||||
; MUI Settings
|
||||
!define MUI_ICON "eden.ico"
|
||||
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
|
||||
|
||||
; License page
|
||||
!insertmacro MUI_PAGE_LICENSE "..\LICENSE.txt"
|
||||
; Desktop Shortcut page
|
||||
Page custom desktopShortcutPageCreate desktopShortcutPageLeave
|
||||
; Directory page
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
; Instfiles page
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
; Finish page
|
||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\eden.exe"
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
; Uninstaller pages
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
; Variables
|
||||
Var DesktopShortcutPageDialog
|
||||
Var DesktopShortcutCheckbox
|
||||
Var DesktopShortcut
|
||||
|
||||
; Language files
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
!insertmacro MUI_LANGUAGE "SimpChinese"
|
||||
!insertmacro MUI_LANGUAGE "TradChinese"
|
||||
!insertmacro MUI_LANGUAGE "Danish"
|
||||
!insertmacro MUI_LANGUAGE "Dutch"
|
||||
!insertmacro MUI_LANGUAGE "French"
|
||||
!insertmacro MUI_LANGUAGE "German"
|
||||
!insertmacro MUI_LANGUAGE "Hungarian"
|
||||
!insertmacro MUI_LANGUAGE "Italian"
|
||||
!insertmacro MUI_LANGUAGE "Japanese"
|
||||
!insertmacro MUI_LANGUAGE "Korean"
|
||||
!insertmacro MUI_LANGUAGE "Lithuanian"
|
||||
!insertmacro MUI_LANGUAGE "Norwegian"
|
||||
!insertmacro MUI_LANGUAGE "Polish"
|
||||
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
||||
!insertmacro MUI_LANGUAGE "Romanian"
|
||||
!insertmacro MUI_LANGUAGE "Russian"
|
||||
!insertmacro MUI_LANGUAGE "Spanish"
|
||||
!insertmacro MUI_LANGUAGE "Swedish"
|
||||
!insertmacro MUI_LANGUAGE "Turkish"
|
||||
!insertmacro MUI_LANGUAGE "Vietnamese"
|
||||
|
||||
; MUI end ------
|
||||
|
||||
Function .onInit
|
||||
StrCpy $DesktopShortcut 1
|
||||
|
||||
!insertmacro MUI_LANGDLL_DISPLAY
|
||||
FunctionEnd
|
||||
|
||||
Function desktopShortcutPageCreate
|
||||
!insertmacro MUI_HEADER_TEXT "Create Desktop Shortcut" "Would you like to create a desktop shortcut?"
|
||||
nsDialogs::Create 1018
|
||||
Pop $DesktopShortcutPageDialog
|
||||
${If} $DesktopShortcutPageDialog == error
|
||||
Abort
|
||||
${EndIf}
|
||||
|
||||
${NSD_CreateCheckbox} 0u 0u 100% 12u "Create a desktop shortcut"
|
||||
Pop $DesktopShortcutCheckbox
|
||||
${NSD_SetState} $DesktopShortcutCheckbox $DesktopShortcut
|
||||
|
||||
nsDialogs::Show
|
||||
FunctionEnd
|
||||
|
||||
Function desktopShortcutPageLeave
|
||||
${NSD_GetState} $DesktopShortcutCheckbox $DesktopShortcut
|
||||
FunctionEnd
|
||||
|
||||
Section "Base"
|
||||
ExecWait '"$INSTDIR\uninst.exe" /S _?=$INSTDIR'
|
||||
|
||||
SectionIn RO
|
||||
|
||||
SetOutPath "$INSTDIR"
|
||||
|
||||
; The binplaced build output will be included verbatim.
|
||||
File /r "${BINARY_SOURCE_DIR}\*"
|
||||
|
||||
; Create start menu and desktop shortcuts
|
||||
CreateShortCut "$SMPROGRAMS\$(^Name).lnk" "$INSTDIR\eden.exe"
|
||||
${If} $DesktopShortcut == 1
|
||||
CreateShortCut "$DESKTOP\$(^Name).lnk" "$INSTDIR\eden.exe"
|
||||
${EndIf}
|
||||
SectionEnd
|
||||
|
||||
!include "FileFunc.nsh"
|
||||
|
||||
Section -Post
|
||||
WriteUninstaller "$INSTDIR\uninst.exe"
|
||||
|
||||
WriteRegStr HKCU "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\eden.exe"
|
||||
|
||||
; Write metadata for add/remove programs applet
|
||||
WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
|
||||
WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
|
||||
WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\eden.exe"
|
||||
WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
|
||||
WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
|
||||
WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR"
|
||||
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
|
||||
IntFmt $0 "0x%08X" $0
|
||||
WriteRegDWORD HKCU "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0"
|
||||
|
||||
WriteRegStr HKCU "Software\Classes\.nsp" "" "$(^Name)"
|
||||
WriteRegStr HKCU "Software\Classes\.xci" "" "$(^Name)"
|
||||
WriteRegStr HKCU "Software\Classes\.nro" "" "$(^Name)"
|
||||
WriteRegStr HKCU "Software\Classes\.kip" "" "$(^Name)"
|
||||
WriteRegStr HKCU "Software\Classes\$(^Name)\DefaultIcon" "" "$INSTDIR\eden.exe,0"
|
||||
WriteRegStr HKCU "Software\Classes\$(^Name)\Shell\open\command" "" '"$INSTDIR\eden.exe" %1'
|
||||
SectionEnd
|
||||
|
||||
Section Uninstall
|
||||
Delete "$DESKTOP\$(^Name).lnk"
|
||||
Delete "$SMPROGRAMS\$(^Name).lnk"
|
||||
|
||||
; Be a bit careful to not delete files a user may have put into the install directory.
|
||||
Delete "$INSTDIR\eden.exe"
|
||||
Delete "$INSTDIR\eden-cli.exe"
|
||||
Delete "$INSTDIR\uninst.exe"
|
||||
Delete "$INSTDIR\LICENSE.txt"
|
||||
Delete "$INSTDIR\README.md"
|
||||
RMDir /r "$INSTDIR\LICENSES"
|
||||
RMDir "$INSTDIR"
|
||||
|
||||
DeleteRegKey HKCU "Software\Classes\.nsp"
|
||||
DeleteRegKey HKCU "Software\Classes\.xci"
|
||||
DeleteRegKey HKCU "Software\Classes\.nro"
|
||||
DeleteRegKey HKCU "Software\Classes\.kip"
|
||||
DeleteRegKey HKCU "Software\Classes\$(^Name)"
|
||||
|
||||
DeleteRegKey HKCU "Software\Classes\discord-1397286652128264252"
|
||||
|
||||
DeleteRegKey HKCU "${PRODUCT_UNINST_KEY}"
|
||||
DeleteRegKey HKCU "${PRODUCT_DIR_REGKEY}"
|
||||
|
||||
SetAutoClose true
|
||||
SectionEnd
|
||||
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+478
-468
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
Vendored
+440
-430
File diff suppressed because it is too large
Load Diff
@@ -10,3 +10,81 @@ A painless guide for cross compilation (or to test NCE) from a x86_64 system wit
|
||||
- Download Debian 13: `wget https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/debian-13.0.0-arm64-netinst.iso`
|
||||
- Create a system disk: `qemu-img create -f qcow2 debian-13-arm64-ci.qcow2 30G`
|
||||
- Run the VM: `qemu-system-aarch64 -M virt -m 2G -cpu max -bios /usr/local/share/qemu/edk2-aarch64-code.fd -drive if=none,file=debian-13.0.0-arm64-netinst.iso,format=raw,id=cdrom -device scsi-cd,drive=cdrom -drive if=none,file=debian-13-arm64-ci.qcow2,id=hd0,format=qcow2 -device virtio-blk-device,drive=hd0 -device virtio-gpu-pci -device usb-ehci -device usb-kbd -device intel-hda -device hda-output -nic user,model=virtio-net-pci`
|
||||
|
||||
## Gentoo
|
||||
|
||||
Gentoo's cross-compilation setup is relatively easy, provided you're already familiar with portage. A [cross toolchain file](../CMakeModules/toolchains/GentooCross.cmake) is provided. Throughout this section, replace `aarch64` with whatever target architecture you desire.
|
||||
|
||||
### Crossdev
|
||||
|
||||
First, emerge crossdev via `sudo emerge -a sys-devel/crossdev`.
|
||||
|
||||
Now, set up the environment depending on the target architecture; e.g.
|
||||
|
||||
```sh
|
||||
sudo crossdev aarch64
|
||||
```
|
||||
|
||||
### QEMU
|
||||
|
||||
If you don't have a host Gentoo system of your target architecture, you should install a QEMU user setup for testing. To do so, enable the relevant USE flags for `app-emulation/qemu`:
|
||||
|
||||
```txt
|
||||
app-emulation/qemu static-user qemu_user_targets_aarch64
|
||||
```
|
||||
|
||||
To use cross-emerged shared libraries, you will also need to tell qemu where the sysroot is. You can do this with an alias:
|
||||
|
||||
```sh
|
||||
alias qemu-aarch64="qemu-aarch64 -L /usr/aarch64-unknown-linux-gnu"
|
||||
```
|
||||
|
||||
### Dependencies
|
||||
|
||||
Dependencies are the same [as normal Gentoo](./Deps.md#Commands); simply replace the `emerge` command with `emerge-<target>-unknown-linux-gnu` (e.g. `emerge-aarch64-unknown-linux-gnu`). However, there are a few caveats:
|
||||
|
||||
#### Enabling GURU
|
||||
|
||||
Since Crossdev sysroots are effectively isolated from the system w.r.t Portage, you must manually enable GURU in your sysroot. Run the following as root:
|
||||
|
||||
```sh
|
||||
mkdir -p /usr/aarch64-unknown-linux-gnu/etc/portage/repos.conf
|
||||
cat << EOF > /usr/aarch64-unknown-linux-gnu/etc/portage/repos.conf/guru.conf
|
||||
[guru]
|
||||
location = /var/db/repos/guru
|
||||
auto-sync = no
|
||||
priority = 1
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Package Errata
|
||||
|
||||
Crossdev is not perfect, and you may face some challenges with package that are not properly keyworded or have issues on specific architectures. These behaviors are, unfortunately, not well documented, and certain build systems such as Meson--and certain troublesome packages like GTK--are generally unfriendly towards cross-compilation.
|
||||
|
||||
Thus, it may be desirable to emerge a minimal set of dependencies and allow Eden's build system to handle the rest for you. At a minimum, you *only* need standard system libraries (Crossdev does this for you) and Qt:
|
||||
|
||||
```sh
|
||||
sudo emerge-aarch64-unknown-linux-gnu dev-qt/qtbase:6 dev-qt/qtcharts:6
|
||||
```
|
||||
|
||||
From here, CPMUtil will take care of everything else. For extra insurance, you may want to set `-DCPMUTIL_FORCE_BUNDLED=ON` in your configure command.
|
||||
|
||||
### Building
|
||||
|
||||
From here, building is relatively standard. The [cross toolchain file](../CMakeModules/toolchains/GentooCross.cmake) contains a few additional configurations, but generally all you need to do is set `CROSS_TARGET` and `CMAKE_TOOLCHAIN_FILE`. Disabling OpenGL is strongly recommended as well.
|
||||
|
||||
```sh
|
||||
cmake -S . -B build/aarch64 -DCMAKE_TOOLCHAIN_FILE=CMakeModules/toolchains/GentooCross.cmake -GNinja -DCROSS_TARGET=aarch64 -DENABLE_OPENGL=OFF
|
||||
```
|
||||
|
||||
With that done, you can build as normal:
|
||||
|
||||
```sh
|
||||
cmake --build build/aarch64
|
||||
```
|
||||
|
||||
And finally, run the compiled executable with QEMU!
|
||||
|
||||
```sh
|
||||
qemu-aarch64 build/aarch64/bin/eden
|
||||
```
|
||||
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
@@ -11,6 +11,7 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||
enum class StringSetting(override val key: String) : AbstractStringSetting {
|
||||
DRIVER_PATH("driver_path"),
|
||||
DEVICE_NAME("device_name"),
|
||||
PROGRAM_ARGS("program_args"),
|
||||
|
||||
WEB_TOKEN("eden_token"),
|
||||
WEB_USERNAME("eden_username")
|
||||
|
||||
+7
@@ -125,6 +125,13 @@ abstract class SettingsItem(
|
||||
// List of all general
|
||||
val settingsItems = HashMap<String, SettingsItem>().apply {
|
||||
put(StringInputSetting(StringSetting.DEVICE_NAME, titleId = R.string.device_name))
|
||||
put(
|
||||
StringInputSetting(
|
||||
StringSetting.PROGRAM_ARGS,
|
||||
titleId = R.string.program_args,
|
||||
descriptionId = R.string.program_args_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.RENDERER_USE_SPEED_LIMIT,
|
||||
|
||||
+1
@@ -1286,6 +1286,7 @@ class SettingsFragmentPresenter(
|
||||
add(HeaderSetting(R.string.general))
|
||||
|
||||
add(ShortSetting.DEBUG_KNOBS.key)
|
||||
add(StringSetting.PROGRAM_ARGS.key)
|
||||
|
||||
add(HeaderSetting(R.string.gpu_logging_header))
|
||||
add(BooleanSetting.GPU_LOGGING_ENABLED.key)
|
||||
|
||||
@@ -440,7 +440,7 @@ class GamePropertiesFragment : Fragment() {
|
||||
|
||||
val shaderCacheDir = File(
|
||||
DirectoryInitialization.userDirectory +
|
||||
"/shader/" + args.game.settingsName.lowercase()
|
||||
"/cache/shader/" + args.game.settingsName.lowercase()
|
||||
)
|
||||
if (shaderCacheDir.exists()) {
|
||||
add(
|
||||
|
||||
@@ -428,6 +428,9 @@
|
||||
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<string name="program_args">وسائط Homebrew</string>
|
||||
<string name="program_args_description">سطر الأوامر الوسائط المُمررة إلى Homebrew عند التشغيل (مثل -noglsl).</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">اسم الجهاز</string>
|
||||
<string name="use_docked_mode">وضع الإرساء</string>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
|
||||
<string name="app_disclaimer">Diese Software führt Spiele für die Nintendo Switch-Konsole aus. Es sind keine Spiele oder Keys enthalten. Suche bevor du beginnst deine <![CDATA[<b> prod.keys </b>]]>-Datei auf deinem Gerät.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Mehr Erfahren</a>]]></string>
|
||||
<string name="app_disclaimer">Diese Software führt Spiele für die Nintendo Switch-Konsole aus. Es sind keine Spiele oder Schlüssel enthalten. Suche, bevor du beginnst, deine <![CDATA[<b> prod.keys </b>]]>-Datei auf deinem Gerät.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Mehr Erfahren</a>]]></string>
|
||||
<string name="notice_notification_channel_name">Hinweise und Fehler</string>
|
||||
<string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
|
||||
<string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht zugelassen!</string>
|
||||
@@ -16,22 +16,27 @@
|
||||
<string name="value_too_high">Wert darf höchstens %1$d betragen</string>
|
||||
<string name="invalid_value">Ungültiger Wert</string>
|
||||
|
||||
<string name="using_per_game_config">Verwendung spielspezifischer Konfigurationen</string>
|
||||
|
||||
<!-- Input Overlay -->
|
||||
<string name="show_input_overlay">Eingabe-Overlay anzeigen</string>
|
||||
<string name="show_input_overlay">Eingabeüberlagerung anzeigen</string>
|
||||
<string name="show_input_overlay_description">Touch-Bedienelemente während der Emulation anzeigen</string>
|
||||
<string name="overlay_snap_to_grid">Am Raster ausrichten</string>
|
||||
<string name="overlay_snap_to_grid_description">Beim Bearbeiten die Overlay-Bedienelemente am Raster ausrichten</string>
|
||||
<string name="overlay_snap_to_grid_description">Überlagerungs-Steuerelemente beim Bearbeiten an einem Raster ausrichten</string>
|
||||
<string name="overlay_grid_size">Rastergröße</string>
|
||||
<string name="overlay_grid_size_description">Rastergröße in Pixeln</string>
|
||||
<string name="overlay_grid_size_description">Größe der Rasterzellen in Pixeln</string>
|
||||
<string name="input_overlay_behavior">Verhalten</string>
|
||||
<string name="overlay_auto_hide">Automatisches Ausblenden des Overlays</string>
|
||||
<string name="overlay_auto_hide_description">Blende die Touch-Bedienelemente nach Ablauf der angegebenen Inaktivitätszeit automatisch aus</string>
|
||||
<string name="enable_input_overlay_auto_hide">Automatisches Ausblenden des Overlays aktivieren</string>
|
||||
<string name="hide_overlay_on_controller_input">Overlay bei Controller-Eingabe ausblenden</string>
|
||||
<string name="hide_overlay_on_controller_input_description">Blende die Touch-Bedienelemente automatisch aus wenn ein physischer Controller benutzt wird. Das Overlay wird wieder eingeblendet, wenn die Verbindung zum Controller getrennt wird.</string>
|
||||
<string name="input_overlay_options">Eingabe-Overlay</string>
|
||||
<string name="overlay_auto_hide">Automatisches Ausblenden der Überlagerung</string>
|
||||
<string name="overlay_auto_hide_description">Überlagerung der Touch-Bedienelementen automatisch nach der festgelegten Zeit der Inaktivität ausblenden.</string>
|
||||
<string name="enable_input_overlay_auto_hide">Automatisches Ausblenden der Überlagerung aktivieren</string>
|
||||
<string name="hide_overlay_on_controller_input">Überlagerung bei Controller-Eingabe ausblenden</string>
|
||||
<string name="hide_overlay_on_controller_input_description">Touch-Bedienelemente automatisch ausblenden, wenn ein physischer Controller benutzt wird. Die Überlagerung wird wieder eingeblendet, wenn die Verbindung zum Controller getrennt wird.</string>
|
||||
<string name="invert_confirm_back_controller_buttons">Controller-Tasten für Bestätigen/Zurück vertauschen</string>
|
||||
<string name="invert_confirm_back_controller_buttons_description">Belegung der Android-Tasten „Bestätigen“ und „Zurück“ so tauschen, dass sie bei der Nutzung der App-Benutzeroberfläche sowohl dem Switch- als auch dem Xbox-Schema entsprechen.</string>
|
||||
|
||||
<string name="input_overlay_options">Eingabeüberlagerung</string>
|
||||
<string name="input_overlay_options_description">Bedienelemente auf dem Bildschirm konfigurieren</string>
|
||||
<string name="edit_overlay_layout">Overlay-Layout bearbeiten</string>
|
||||
<string name="edit_overlay_layout">Überlagerungs-Layout bearbeiten</string>
|
||||
<string name="edit_overlay_layout_description">Position und Skalierung der Bedienelemente auf dem Bildschirm anpassen</string>
|
||||
|
||||
|
||||
@@ -45,12 +50,12 @@
|
||||
<string name="show_stats_overlay">Leistungsstatistik Overlay anzeigen</string>
|
||||
<string name="stats_overlay_customization">Anpassung</string>
|
||||
<string name="stats_overlay_items">Sichtbarkeit</string>
|
||||
<string name="stats_overlay_options">Leistungs Overlay</string>
|
||||
<string name="enable_stats_overlay_">Leistungsstatistik Overlay aktivieren</string>
|
||||
<string name="stats_overlay_options_description">Konfiguriere angezeigte Informationen im Overlay</string>
|
||||
<string name="show_fps">FPS anzeigen</string>
|
||||
<string name="stats_overlay_options">Leistungsüberlagerung</string>
|
||||
<string name="enable_stats_overlay_">Leistungsstatistik-Überlagerung aktivieren</string>
|
||||
<string name="stats_overlay_options_description">Angezeigte Informationen in der Überlagerung konfigurieren</string>
|
||||
<string name="show_fps">BpS anzeigen</string>
|
||||
<string name="show_fps_description">Aktuelle Bilder pro Sekunde</string>
|
||||
<string name="show_frametime">Frametime anzeigen</string>
|
||||
<string name="show_frametime">Frame-Zeit anzeigen</string>
|
||||
<string name="show_app_ram_usage">App-RAM-Nutzung anzeigen</string>
|
||||
<string name="show_app_ram_usage_description">Zeigt den RAM-Verbrauch des Emulators an</string>
|
||||
<string name="show_system_ram_usage">System-RAM-Nutzung anzeigen</string>
|
||||
@@ -59,25 +64,28 @@
|
||||
<string name="bat_temperature_unit">Batterietemperatur-Einheiten</string>
|
||||
<string name="show_power_info">Batterieinfo anzeigen</string>
|
||||
<string name="show_power_info_description">Aktuellen Stromverbrauch und verbleibende Kapazität der Batterie anzeigen</string>
|
||||
<string name="show_shaders_building">Shader-Bau anzeigen</string>
|
||||
<string name="show_shaders_building_description">Aktuelle Anzahl der erstellten Shader anzeigen</string>
|
||||
<string name="overlay_position">Overlay-Position</string>
|
||||
<string name="overlay_position_description">Position des Overlays auf dem Bildschirm</string>
|
||||
<string name="show_shaders_building">Schattierer-Erstellung anzeigen</string>
|
||||
<string name="show_shaders_building_description">Aktuelle Anzahl der erstellten Schattierer anzeigen</string>
|
||||
<string name="pipeline_worker_cores_description">Lege die Anzahl der Kerne fest, die für die Erstellung von Vulkan-Rohrleitungen verwendet werden sollen. Ein höherer Wert verbessert die Kompilierungsleistung der Rohrleitung, führt jedoch auch zu einem Anstieg der Temperaturen.</string>
|
||||
<string name="overlay_position">Überlagerungs-Position</string>
|
||||
<string name="overlay_position_description">Wähle aus, wo die Überlagerung auf dem Bildschirm angezeigt wird</string>
|
||||
<string name="overlay_position_top_left">Oben links</string>
|
||||
<string name="overlay_position_top_right">Oben rechts</string>
|
||||
<string name="overlay_position_bottom_left">Unten links</string>
|
||||
<string name="overlay_position_bottom_right">Unten rechts</string>
|
||||
<string name="overlay_position_center_top">Mitte oben</string>
|
||||
<string name="overlay_position_center_bottom">Mitte unten</string>
|
||||
<string name="perf_overlay_background">Overlay-Hintergrund</string>
|
||||
<string name="perf_overlay_background">Überlagerungs-Hintergrund</string>
|
||||
<string name="perf_overlay_background_description">Hintergrund für bessere Lesbarkeit</string>
|
||||
|
||||
<!-- Device Overlay settings -->
|
||||
<string name="show_soc_overlay">Geräteinfo-Overlay anzeigen</string>
|
||||
<string name="enable_soc_overlay">Geräte-Overlay aktivieren</string>
|
||||
<string name="soc_overlay_options">Geräte-Overlay</string>
|
||||
<string name="soc_overlay_options_description">Konfigurieren Sie, welche Informationen im Geräte-Overlay angezeigt werden</string>
|
||||
<string name="show_soc_overlay">Geräteinfo-Überlagerung anzeigen</string>
|
||||
<string name="enable_soc_overlay">Geräteüberlagerung aktivieren</string>
|
||||
<string name="soc_overlay_options">Geräteüberlagerung</string>
|
||||
<string name="soc_overlay_options_description">Konfiguriere, welche Informationen in der Geräteüberlagerung angezeigt werden</string>
|
||||
|
||||
<string name="show_build_id">Build-ID anzeigen</string>
|
||||
<string name="show_driver_version">Treiberversion anzeigen</string>
|
||||
<string name="show_device_model">Gerätemodell anzeigen</string>
|
||||
<string name="show_gpu_model">GPU-Modell anzeigen</string>
|
||||
<string name="show_soc_model">SoC-Modell anzeigen</string>
|
||||
@@ -85,19 +93,19 @@
|
||||
|
||||
<!-- Eden\'s Veil -->
|
||||
<string name="buffer_reorder_disable">Puffer-Neuanordnung deaktivieren</string>
|
||||
<string name="buffer_reorder_disable_description">Wenn aktiviert, wird die Neuanordnung von gemappten Speicher-Uploads deaktiviert, was die Zuordnung von Uploads zu bestimmten Zeichenvorgängen ermöglicht. Kann in einigen Fällen die Leistung verringern.</string>
|
||||
<string name="buffer_reorder_disable_description">Wenn aktiviert, wird die Neuanordnung von zugeordneten Speicher-Uploads deaktiviert, wodurch Uploads bestimmten Abrufen zugeordnet werden können. Dies kann in einigen Fällen zu Leistungseinbußen führen.</string>
|
||||
|
||||
<string name="use_sync_core">Kern-Geschwindigkeit synchronisieren</string>
|
||||
<string name="use_sync_core_description">Synchronisiert die Taktrate des Kerns mit der maximalen Geschwindigkeit, um die Leistung zu verbessern, ohne die tatsächliche Spielgeschwindigkeit zu verändern.</string>
|
||||
<string name="cpuopt_unsafe_host_mmu">Host-MMU-Emulation aktivieren</string>
|
||||
<string name="cpuopt_unsafe_host_mmu_description">Diese Optimierung beschleunigt Speicherzugriffe durch das Gastprogramm. Wenn aktiviert, erfolgen Speicherlese- und -schreibvorgänge des Gastes direkt im Speicher und nutzen die MMU des Hosts. Das Deaktivieren erzwingt die Verwendung der Software-MMU-Emulation für alle Speicherzugriffe.</string>
|
||||
<string name="debug_knobs">Debug-Regler</string>
|
||||
<string name="debug_knobs">Fehlerbehebungs-Regler</string>
|
||||
<string name="debug_knobs_description">Nur für Entwicklungszwecke</string>
|
||||
<string name="debug_knobs_hint">0 bis 65535</string>
|
||||
|
||||
<!-- NVDEC Emulation -->
|
||||
<string name="nvdec_emulation">NVDEC-Emulation</string>
|
||||
<string name="nvdec_emulation_description">Methode zur Videodekodierung</string>
|
||||
<string name="nvdec_emulation_description">Wähle aus, wie die Videodekodierung (NVDEC) während Zwischensequenzen und Intros gehandhabt wird.</string>
|
||||
<string name="nvdec_emulation_none">Keine</string>
|
||||
|
||||
<!-- Optimize SPIRV output -->
|
||||
@@ -126,7 +134,7 @@
|
||||
<string name="multiplayer_wrong_password">Falsches Passwort</string>
|
||||
<string name="multiplayer_could_not_connect">Verbindung fehlgeschlagen</string>
|
||||
<string name="multiplayer_room_is_full">Raum ist voll</string>
|
||||
<string name="multiplayer_host_banned">Sie sind von diesem Raum gebannt</string>
|
||||
<string name="multiplayer_host_banned">Du bist von diesem Raum gebannt</string>
|
||||
<string name="multiplayer_permission_denied">Zugriff verweigert</string>
|
||||
<string name="multiplayer_no_such_user">Benutzer existiert nicht</string>
|
||||
<string name="multiplayer_already_in_room">Bereits im Raum</string>
|
||||
@@ -139,7 +147,7 @@
|
||||
<string name="multiplayer_room_joined">Raum beigetreten</string>
|
||||
<string name="multiplayer_room_moderator">Raum-Moderator</string>
|
||||
<string name="multiplayer_member_join">%1$s ist beigetreten</string>
|
||||
<string name="multiplayer_member_leave">%1$s hat verlassen</string>
|
||||
<string name="multiplayer_member_leave">%1$s ist gegangen</string>
|
||||
<string name="multiplayer_member_kicked">%1$s wurde entfernt</string>
|
||||
<string name="multiplayer_member_banned">%1$s wurde gebannt</string>
|
||||
<string name="multiplayer_address_unbanned">Adresse entbannt</string>
|
||||
@@ -157,11 +165,11 @@
|
||||
<string name="send_message">Nachricht senden</string>
|
||||
<string name="multiplayer_moderation">Moderation</string>
|
||||
<string name="multiplayer_moderation_title">Bannliste</string>
|
||||
<string name="multiplayer_no_bans">Keine gebannten Benutzer</string>
|
||||
<string name="multiplayer_unban_title">Entbannen</string>
|
||||
<string name="multiplayer_no_bans">Keine gebannten Nutzer</string>
|
||||
<string name="multiplayer_unban_title">Nutzer entbannen</string>
|
||||
<string name="multiplayer_unban">Entbannen</string>
|
||||
<string name="multiplayer_unban_message">%1$s wirklich entbannen?</string>
|
||||
<string name="multiplayer_ban">Benutzer bannen</string>
|
||||
<string name="multiplayer_ban">Nutzer bannen</string>
|
||||
<string name="multiplayer_room_browser">Öffentliche Räume</string>
|
||||
<string name="multiplayer_no_rooms_found">Keine öffentlichen Räume gefunden</string>
|
||||
<string name="multiplayer_password_required">Passwort erforderlich</string>
|
||||
@@ -172,15 +180,15 @@
|
||||
<string name="multiplayer_hide_full_rooms">Volle Räume ausblenden</string>
|
||||
<string name="multiplayer_hide_empty_rooms">Leere Räume ausblenden</string>
|
||||
<string name="multiplayer_tap_refresh_to_check_again">Zum Aktualisieren tippen</string>
|
||||
<string name="multiplayer_search_public_lobbies">Räume suchen…</string>
|
||||
<string name="multiplayer_search_public_lobbies">Lobbys suchen…</string>
|
||||
<string name="multiplayer_preferred_game_name">Bevorzugtes Spiel</string>
|
||||
<string name="multiplayer_lobby_type">Lobby-Typ</string>
|
||||
<string name="multiplayer_room_name_error">Muss 3-20 Zeichen lang sein</string>
|
||||
<string name="multiplayer_required">Erforderlich</string>
|
||||
<string name="multiplayer_token_required">Web-Token erforderlich, gehen Sie zu Erweiterte Einstellungen -> System -> Netzwerk</string>
|
||||
<string name="multiplayer_token_required">Web-Token erforderlich, gehe zu Erweiterte Einstellungen -> System -> Netzwerk</string>
|
||||
<string name="multiplayer_ip_error">Ungültiges IP-Format</string>
|
||||
<string name="multiplayer_username_error">Muss zwischen 4–20 Zeichen lang sein und nur alphanumerische Zeichen, Punkte, Bindestriche, Unterstriche und Leerzeichen enthalten</string>
|
||||
<string name="multiplayer_nickname_invalid">Ungültiger Benutzername, stellen Sie sicher, dass er in System → Netzwerk korrekt eingestellt ist</string>
|
||||
<string name="multiplayer_nickname_invalid">Ungültiger Benutzername; stelle sicher, dass er unter System -> Netzwerk korrekt konfiguriert ist.</string>
|
||||
<string name="multiplayer_token_error">Muss 48 Zeichen lang sein und nur Kleinbuchstaben a-z enthalten</string>
|
||||
<string name="multiplayer_port_error">Muss zwischen 1-65535 liegen</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
@@ -188,20 +196,20 @@
|
||||
<string name="refresh">Aktualisieren</string>
|
||||
<string name="room_list">Raumliste</string>
|
||||
<string name="multiplayer_public_visibility">Öffentlich</string>
|
||||
<string name="multiplayer_unlisted_visibility">Unlisted</string>
|
||||
<string name="multiplayer_unlisted_visibility">Nicht gelistet</string>
|
||||
|
||||
<!-- Setup strings -->
|
||||
<string name="welcome">Willkommen!</string>
|
||||
<string name="welcome_description">Erfahre wie man <b>Eden</b> einrichtet und beginne mit der Emulation.</string>
|
||||
<string name="welcome_description">Erfahre, wie du Eden einrichtest, und tauche in die Welt der Emulation ein.</string>
|
||||
<string name="get_started">Erste Schritte</string>
|
||||
<string name="keys">Schlüssel</string>
|
||||
<string name="keys_description">Wähle deine <b>prod.keys</b> Datei mit dem Button unten aus.</string>
|
||||
<string name="keys_description">Wähle deine <b>prod.keys</b> -Datei über die untenstehende Schaltfläche aus.</string>
|
||||
<string name="firmware">Firmware</string>
|
||||
<string name="firmware_description">Wähle deine <b>firmware.zip</b>-Datei mit dem Button unten aus</string>
|
||||
<string name="firmware_description">Wähle deine <b>firmware.zip</b>-Datei über die untenstehende Schaltfläche aus.</string>
|
||||
<string name="games">Spiele</string>
|
||||
<string name="games_description">Wähle mit dem Knopf unten den <b>Spiele</b>-Ordner aus.</string>
|
||||
<string name="games_description">Wähle deinen <b>Spiele</b>-Ordner mit der untenstehenden Schaltfläche aus.</string>
|
||||
<string name="done">Fertig</string>
|
||||
<string name="done_description">Du bist start klar.\nViel Spaß mit deinen Spielen!</string>
|
||||
<string name="done_description">Alles bereit.\nViel Spaß beim Spielen!</string>
|
||||
<string name="next">Weiter</string>
|
||||
<string name="back">Zurück</string>
|
||||
<string name="add_games">Spiele hinzufügen</string>
|
||||
@@ -214,23 +222,23 @@
|
||||
<string name="view_grid">Raster</string>
|
||||
<string name="view_grid_compact">Kompaktes Gitter</string>
|
||||
<string name="view_carousel">Karussell</string>
|
||||
<string name="game_image_desc">Scrennshot für %1$s</string>
|
||||
<string name="game_image_desc">Bildschirmfoto für %1$s</string>
|
||||
<string name="folder">Ordner</string>
|
||||
<string name="dont_show_again">Nicht mehr anzeigen</string>
|
||||
<string name="add_directory_success">Neues Spieleverzeichnis erfolgreich hinzugefügt.</string>
|
||||
<string name="enable_update_checks">Auf Updates überprüfen</string>
|
||||
<string name="enable_update_checks_description">Beim Start auf Updates überprüfen und optional das neue Update herunterladen und installieren</string>
|
||||
<string name="update_available">Update verfügbar</string>
|
||||
<string name="update_available_description">Eine Version ist verfügbar: %1$s\n\nWillst du sie herunterladen\?</string>
|
||||
<string name="downloading_update">Update wird heruntergeladen</string>
|
||||
<string name="update_download_failed">Herunterladen des Updates fehlgeschlagen</string>
|
||||
<string name="update_installed_successfully">Update erfolgreich installiert</string>
|
||||
<string name="update_install_failed">Installieren des Updates fehlgeschlagen: %1$s</string>
|
||||
<string name="enable_update_checks">Auf Aktualisierungen prüfen</string>
|
||||
<string name="enable_update_checks_description">Beim Start auf Aktualisierungen prüfen und optional die neue Aktualisierung herunterladen und installieren</string>
|
||||
<string name="update_available">Aktualisierung verfügbar</string>
|
||||
<string name="update_available_description">Eine neue Version ist verfügbar: %1$s\n\nWillst du sie herunterladen\?</string>
|
||||
<string name="downloading_update">Aktualisierung wird heruntergeladen</string>
|
||||
<string name="update_download_failed">Herunterladen der Aktualisierung fehlgeschlagen</string>
|
||||
<string name="update_installed_successfully">Aktualisierung erfolgreich installiert</string>
|
||||
<string name="update_install_failed">Installieren der Aktualisierung fehlgeschlagen: %1$s</string>
|
||||
<string name="home_search">Suche</string>
|
||||
<string name="home_settings">Einstellungen</string>
|
||||
<string name="empty_gamelist">Es wurden keine Dateien gefunden oder es wurde noch kein Spielverzeichnis ausgewählt.</string>
|
||||
<string name="manage_game_folders">Spiele-Ordner verwalten</string>
|
||||
<string name="select_games_folder_description">Erlaubt Eden die Spieleliste zu füllen</string>
|
||||
<string name="manage_game_folders">Spielordner verwalten</string>
|
||||
<string name="select_games_folder_description">Ermöglicht es Eden, die Spieleliste zu füllen.</string>
|
||||
<string name="add_games_warning">Auswahl des Spieleverzeichnisses überspringen?</string>
|
||||
<string name="add_games_warning_description">Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist.</string>
|
||||
<string name="add_games_warning_help">https://yuzu-mirror.github.io/help/quickstart/#dumping-games</string>
|
||||
@@ -241,33 +249,33 @@
|
||||
<string name="install_prod_keys_warning">Hinzufügen der Schlüssel überspringen?</string>
|
||||
<string name="install_prod_keys_warning_description">Für die Emulation von Spielen sind gültige Schlüssel erforderlich. Wenn du fortfährst, funktionieren nur Homebrew-Anwendungen.</string>
|
||||
<string name="install_prod_keys_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
|
||||
<string name="install_firmware_warning">Firmware nicht hinzufügen?</string>
|
||||
<string name="install_firmware_warning">Das Hinzufügen der Firmware überspringen\?</string>
|
||||
<string name="emulator_data">Emulatordaten einrichten</string>
|
||||
<string name="emulator_data_description">Für die Funktion des Emulators werden Schlüssel benötigt, und Firmware ist empfohlen und für die Verwendung des QLaunch-Applets erforderlich.</string>
|
||||
<string name="permissions">Berechtigung erteilen</string>
|
||||
<string name="permissions_description">Optionale Berechtigungen erteilen um bestimmte Features des Emulators zu nutzen</string>
|
||||
<string name="permissions">Berechtigungen erteilen</string>
|
||||
<string name="permissions_description">Erteile optionale Berechtigungen zur Nutzung bestimmter Funktionen des Emulators.</string>
|
||||
<string name="install_firmware_warning_description">Viele Spiele benötigen Zugriff auf die Firmware, um richtig zu funktionieren.</string>
|
||||
<string name="install_firmware_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
|
||||
<string name="notifications">Benachrichtigungen</string>
|
||||
<string name="notifications_description">Erteile mit dem Knopf unten die Berechtigung, Benachrichtigungen zu senden.</string>
|
||||
<string name="notifications_description">Erteile die Berechtigung für Benachrichtigungen über die untenstehende Schaltfläche.</string>
|
||||
<string name="permission_denied">Zugriff verweigert</string>
|
||||
<string name="permission_denied_description">Du hast diese Berechtigung zu oft verweigert und musst sie nun manuell in den Systemeinstellungen erteilen.</string>
|
||||
<string name="about">Über</string>
|
||||
<string name="about_description">Build-Version, Credits und mehr</string>
|
||||
<string name="about_description">Build-Version, Mitwirkende und mehr</string>
|
||||
<string name="system_information">Systeminformationen</string>
|
||||
<string name="system_information_description">Detaillierte Systeminformationen anzeigen</string>
|
||||
<string name="device_manufacturer">Hersteller</string>
|
||||
<string name="device_model">Modell</string>
|
||||
<string name="product">Produkt</string>
|
||||
<string name="android_version">Android-Version</string>
|
||||
<string name="android_security_patch">Sicherheitspatch</string>
|
||||
<string name="android_security_patch">Sicherheits-Patch</string>
|
||||
<string name="build_id">Build-ID</string>
|
||||
<string name="general_information">Allgemeine Informationen</string>
|
||||
<string name="hardware">Hardware</string>
|
||||
<string name="supported_abis">Unterstützte ABIs</string>
|
||||
<string name="cpu_info">CPU-Informationen</string>
|
||||
<string name="gpu_information">GPU-Informationen</string>
|
||||
<string name="vulkan_driver_version">Vulkan Treiberversion</string>
|
||||
<string name="vulkan_driver_version">Vulkan-Treiberversion</string>
|
||||
<string name="error_getting_emulator_info">Fehler beim Abrufen der Emulatorinformationen</string>
|
||||
<string name="memory_info">Speicherinformation</string>
|
||||
<string name="total_memory">Gesamtspeicher</string>
|
||||
@@ -278,7 +286,7 @@
|
||||
<string name="warning_skip">Überspringen</string>
|
||||
<string name="warning_cancel">Abbrechen</string>
|
||||
<string name="install_amiibo_keys">Amiibo-Schlüssel installieren</string>
|
||||
<string name="install_amiibo_keys_description">Benötigt um Amiibos im Spiel zu verwenden</string>
|
||||
<string name="install_amiibo_keys_description">Benötigt, um Amiibos im Spiel zu verwenden</string>
|
||||
<string name="gpu_driver_fetcher">GPU-Treiber-Hersteller</string>
|
||||
<string name="gpu_driver_manager">GPU-Treiber Verwaltung</string>
|
||||
<string name="install_gpu_driver_description">Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren</string>
|
||||
@@ -289,36 +297,39 @@
|
||||
<string name="open_user_folder">Eden-Ordner öffnen</string>
|
||||
<string name="open_user_folder_description">Eden\'s interne Dateien verwalten</string>
|
||||
<string name="app_settings_description">Verhalten und Aussehen der App verändern</string>
|
||||
<string name="no_file_manager">Kein Dateimanager gefunden</string>
|
||||
<string name="no_file_manager">Kein Datei-Manager gefunden</string>
|
||||
<string name="notification_no_directory_link">Eden-Verzeichnis konnte nicht geöffnet werden</string>
|
||||
<string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Dateimanagers.</string>
|
||||
<string name="notification_no_directory_link_description">Bitte suche den Benutzerordner manuell über die Seitenleiste des Datei-Managers.</string>
|
||||
<string name="manage_save_data">Speicherdaten verwalten</string>
|
||||
<string name="manage_save_data_description">Speicherdaten gefunden. Bitte wähle unten eine Option aus.</string>
|
||||
<string name="import_save_warning">Speicherdaten importieren</string>
|
||||
<string name="import_save_warning_description">Das überschreibt alle existierenden Speicherdaten für dieses Spiel mit der ausgewählten Datei.
|
||||
Wirklich fortfahren?</string>
|
||||
<string name="save_files_importing">Importiere Speicherdaten...</string>
|
||||
<string name="save_files_exporting">Exportiere Speicherdaten...</string>
|
||||
<string name="save_files_importing">Speicherstände werden importiert...</string>
|
||||
<string name="save_files_exporting">Speicherstände werden exportiert...</string>
|
||||
<string name="save_file_imported_success">Erfolgreich importiert</string>
|
||||
<string name="save_file_invalid_zip_structure">Ungültige Speicherverzeichnisstruktur</string>
|
||||
<string name="save_file_invalid_zip_structure_description">Der erste Unterordnername muss die Titel-ID des Spiels sein.</string>
|
||||
<string name="install_firmware">Firmware installieren</string>
|
||||
<string name="install_firmware_description">Die Firmware muss in einem ZIP-Archiv vorliegen und wird zum Booten einiger Spiele benötigt</string>
|
||||
<string name="install_firmware_description">Die Firmware muss in einem ZIP-Archiv vorliegen und wird zum Starten einiger Spiele benötigt</string>
|
||||
<string name="firmware_installing">Firmware wird installiert</string>
|
||||
<string name="firmware_installed_failure">Bei der Firmware installation ist etwas fehlgeschlagen.</string>
|
||||
<string name="firmware_installed_failure_description">Stellen Sie sicher, dass sich die Firmware-NCA-Dateien im Stammverzeichnis der ZIP-Datei befinden, und versuchen Sie es erneut.</string>
|
||||
<string name="firmware_uninstalled_failure">Die Deinstallation der Firmware ist fehlgeschlagen</string>
|
||||
<string name="share_log">Debug-Logs teilen</string>
|
||||
<string name="share_log_description">Debug-Logs an Eden zur Untersuchung absenden</string>
|
||||
<string name="share_log_missing">Keine Log-Datei gefunden</string>
|
||||
<string name="firmware_installed_failure">Firmware-Installation fehlgeschlagen</string>
|
||||
<string name="firmware_installed_failure_description">Stelle sicher, dass sich die Firmware-NCA-Dateien im Stammverzeichnis der ZIP-Datei befinden, und versuche es erneut.</string>
|
||||
<string name="firmware_uninstalled_failure">Deinstallation der Firmware fehlgeschlagen</string>
|
||||
<string name="share_log">Fehlerbehebungs-Protokolle teilen</string>
|
||||
<string name="share_log_description">Fehlerbehebungs-Protokolle an Eden zur Fehlerbehebung absenden</string>
|
||||
<string name="share_log_missing">Keine Protokolldatei gefunden</string>
|
||||
<string name="share_gpu_log">GPU-Protokolle teilen</string>
|
||||
<string name="share_gpu_log_description">Teile Edens GPU-Protokolldatei, um Grafikprobleme zu beheben</string>
|
||||
<string name="share_gpu_log_missing">Keine GPU-Protokolldatei gefunden</string>
|
||||
<string name="install_game_content">Spiel installieren</string>
|
||||
<string name="install_game_content_description">Spiel-Updates oder DLCs installieren</string>
|
||||
<string name="installing_game_content">Installiere...</string>
|
||||
<string name="install_game_content_description">Spielaktualisierungen oder DLCs installieren</string>
|
||||
<string name="installing_game_content">Inhalt wird installiert...</string>
|
||||
<string name="install_game_content_failure">Fehler beim Installieren der Datei(en) auf NAND</string>
|
||||
<string name="install_game_content_failure_description">Bitte stellen Sie sicher, dass der/die Inhalt(e) gültig sind und dass die Datei prod.keys installiert ist.</string>
|
||||
<string name="install_game_content_failure_description">Bitte stelle sicher, dass der/die Inhalt(e) gültig sind und dass die Datei prod.keys installiert ist.</string>
|
||||
<string name="install_game_content_failure_base">Um mögliche Konflikte zu vermeiden, ist die Installation von Basisspielen nicht gestattet.</string>
|
||||
<string name="install_game_content_failed_count">%1$d Installationsfehler</string>
|
||||
<string name="install_game_content_success">Game content(s) installed successfully</string>
|
||||
<string name="install_game_content_success">Spielinhalt(e) erfolgreich installiert</string>
|
||||
<string name="install_game_content_success_install">%1$d erfolgreich installiert</string>
|
||||
<string name="install_game_content_success_overwrite">%1$d erfolgreich überschrieben</string>
|
||||
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
|
||||
@@ -326,20 +337,20 @@ Wirklich fortfahren?</string>
|
||||
<string name="custom_driver_not_supported_description">Das Laden von benutzerdefinierten Treibern wird für dieses Gerät momentan nicht unterstützt.\nSchau später einfach nochmal nach, ob die Unterstützung hinzugefügt wurde!</string>
|
||||
<string name="manage_yuzu_data">Eden-Daten verwalten</string>
|
||||
<string name="manage_yuzu_data_description">Importieren/Exportieren Sie Firmware, Schlüssel, Benutzerdaten und mehr!</string>
|
||||
<string name="game_folders">Spiele-Ordner</string>
|
||||
<string name="game_folders">Spielordner</string>
|
||||
<string name="deep_scan">Tiefer Scan</string>
|
||||
<string name="add_game_folder">Spiele-Ordner hinzufügen</string>
|
||||
<string name="add_game_folder">Spielordner hinzufügen</string>
|
||||
<string name="folder_already_added">Ordner bereits vorhanden</string>
|
||||
<string name="game_folder_properties">Ordner-Eigenschaften</string>
|
||||
<plurals name="saves_import_failed">
|
||||
<item quantity="one">%d Spielstand konnte nicht importiert werden</item>
|
||||
<item quantity="other">%d Spielstände konnten nicht importiert werden</item>
|
||||
<item quantity="other">%d-Spielstände konnten nicht importiert werden</item>
|
||||
</plurals>
|
||||
<plurals name="saves_import_success">
|
||||
<item quantity="one">%d Spielstand erfolgreich importiert</item>
|
||||
<item quantity="other">%d Spielstände erfolgreich importiert</item>
|
||||
<item quantity="other">%d -Spielstände erfolgreich importiert</item>
|
||||
</plurals>
|
||||
<string name="no_save_data_found">Keine Spielstände gefunden</string>
|
||||
<string name="no_save_data_found">Keine Speicherdaten gefunden</string>
|
||||
<string name="verify_installed_content">Inhalt überprüfen</string>
|
||||
<string name="verify_installed_content_description">Überprüft installierte Inhalte auf Fehler</string>
|
||||
|
||||
@@ -356,14 +367,15 @@ Wirklich fortfahren?</string>
|
||||
<string name="keys_failed">Schlüsselinstallation fehlgeschlagen</string>
|
||||
<string name="keys_install_success">Schlüssel erfolgreich installiert</string>
|
||||
<string name="error_keys_copy_failed">Ein oder mehrere Schlüssel konnten nicht kopiert werden.</string>
|
||||
<string name="error_keys_invalid_filename">Stellen Sie sicher, dass Ihre Schlüsseldatei die Erweiterung .keys hat, und versuchen Sie es erneut.</string>
|
||||
<string name="error_keys_failed_init">Schlüssel konnten nicht initialisiert werden. Stellen Sie sicher, dass Ihre Dumping-Tools auf dem neuesten Stand sind, und dumpen Sie die Schlüssel erneut.</string>
|
||||
<string name="error_keys_invalid_filename">Stelle sicher, dass deine Schlüsseldatei die Erweiterung .keys hat, und versuche es erneut.</string>
|
||||
<string name="error_keys_failed_init">Schlüssel konnten nicht initialisiert werden. Stelle sicher, dass deine Auslese-Werkzeuge auf dem neuesten Stand sind, und lies dann die Schlüssel erneut aus.</string>
|
||||
|
||||
<!-- Applet launcher strings -->
|
||||
<string name="qlaunch_applet">Qlaunch</string>
|
||||
<string name="qlaunch_description">Anwendungen vom Systemstartbildschirm aus starten</string>
|
||||
<string name="applets">Applet-Launcher</string>
|
||||
<string name="applets_description">System-Applets mit Firmware starten</string>
|
||||
<string name="applets_error_firmware">Firmware nicht installiert</string>
|
||||
<string name="applets_error_applet">Applet nicht verfügbar</string>
|
||||
<string name="album_applet">Album</string>
|
||||
<string name="album_applet_description">Bilder im Screenshot-Ordner anzeigen</string>
|
||||
|
||||
@@ -422,6 +422,9 @@
|
||||
<string name="cpu_accuracy">Precisión de la CPU</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<string name="program_args">Argumentos Homebrew</string>
|
||||
<string name="program_args_description">Argumentos en la línea de comandos pasados al homebrew al ser lanzado (p.e. -noglsl).</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Nombre del dispositivo</string>
|
||||
<string name="use_docked_mode">Modo sobremesa</string>
|
||||
|
||||
@@ -424,6 +424,9 @@
|
||||
<string name="cpu_accuracy">Точність CPU</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<string name="program_args">Параметри запуску Homebrew</string>
|
||||
<string name="program_args_description">Параметри командного рядка, що передаються Homebrew при запуску (як-от noglsl).</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Назва пристрою</string>
|
||||
<string name="use_docked_mode">Режим док-станції</string>
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
<string name="overlay_auto_hide">触控叠加层自动隐藏</string>
|
||||
<string name="overlay_auto_hide_description">在指定时间内未进行任何操作后,自动隐藏触控叠加层。</string>
|
||||
<string name="enable_input_overlay_auto_hide">启用触控叠加层自动隐藏</string>
|
||||
<string name="hide_overlay_on_controller_input">使用控制器时隐藏触控叠加层</string>
|
||||
<string name="hide_overlay_on_controller_input_description">在使用实体控制器时自动隐藏触控叠加层,而当控制器断开时触控叠加层则会重新显现。</string>
|
||||
<string name="hide_overlay_on_controller_input">当使用控制器控制输入时隐藏触控叠加层</string>
|
||||
<string name="hide_overlay_on_controller_input_description">在使用实体控制器时自动隐藏触控叠加层,而当控制器断开连接时,触控叠加层则会重新显现。</string>
|
||||
<string name="invert_confirm_back_controller_buttons">切换“确认/返回”控制器按钮功能</string>
|
||||
<string name="invert_confirm_back_controller_buttons_description">在与本应用的界面交互时,交换 Android 的“确认”与“返回”按钮的处理方式,以匹配 Switch 和 Xbox 的风格。</string>
|
||||
|
||||
@@ -432,7 +432,7 @@
|
||||
|
||||
<!-- CPU -->
|
||||
<string name="fast_cpu_time">CPU 超频</string>
|
||||
<string name="fast_cpu_time_description">强制模拟的 CPU 以更高的时钟频率运行,从而解除某些 FPS 限制器。使用 Boost (1700MHz) 可让游戏以 Switch 的最高原生时钟运行,或使用 Fast (2000MHz) 以 2 倍时钟运行。</string>
|
||||
<string name="fast_cpu_time_description">强制模拟的 CPU 以更高的时钟频率运行,从而消除某些帧率限制。使用“升频”(1700MHz)以在 Switch 的最高原生时钟频率运行,或使用“快速”(2000MHz)以 2 倍时钟频率运行。</string>
|
||||
<string name="custom_cpu_ticks">自定义CPU时钟</string>
|
||||
<string name="custom_cpu_ticks_description">设置自定义的CPU时钟值。更高的值可能提高性能,但也可能导致游戏卡顿。建议范围为77-21000。</string>
|
||||
<string name="cpu_ticks">时钟</string>
|
||||
@@ -460,15 +460,15 @@
|
||||
<string name="advanced">高级</string>
|
||||
|
||||
<string name="renderer_accuracy">GPU 模式</string>
|
||||
<string name="renderer_accuracy_description">控制 GPU 模拟的精确度。大部分游戏在性能或平衡模式下可以正常渲染,但部分游戏需要设置为精确。粒子效果通常只有在精确模式下才能正确显示。</string>
|
||||
<string name="renderer_accuracy_description">控制 GPU 模拟模式。大多数游戏在“快速”或“平衡”模式下都能正常渲染,但有些游戏仍需使用“精确”模式。粒子效果通常只有在“精确”模式下才能正确渲染。</string>
|
||||
<string name="dma_accuracy">DMA 精度</string>
|
||||
<string name="dma_accuracy_description">控制 DMA 精度。安全精度可以修复某些游戏中的问题,但在某些情况下也可能影响性能。如果不确定,请保留为“默认”。</string>
|
||||
<string name="dma_accuracy_description">控制 DMA 的精准度。安全精度可以修复存在于某些游戏中的问题,但在某些情况下也会对性能造成影响。如不确定,请保持“默认”。</string>
|
||||
<string name="anisotropic_filtering">各向异性过滤</string>
|
||||
<string name="anisotropic_filtering_description">提高斜角的纹理质量</string>
|
||||
<string name="vram_usage_mode">显存使用模式</string>
|
||||
<string name="vram_usage_mode_description">控制显存分配策略</string>
|
||||
<string name="accelerate_astc">ASTC解码方式</string>
|
||||
<string name="accelerate_astc_description">选择ASTC压缩纹理的解码方式:CPU(慢速、安全)、GPU(快速、推荐)或CPU异步(无卡顿,可能导致问题)</string>
|
||||
<string name="accelerate_astc_description">选择渲染时使用的 ASTC 压缩纹理解码方式:CPU(缓慢,安全),GPU(快速,推荐),或 CPU 异步(无卡顿,但可能导致问题)</string>
|
||||
|
||||
<string name="sync_memory_operations">同步内存操作</string>
|
||||
<string name="sync_memory_operations_description">确保计算和内存操作之间的数据一致性。 此选项应能修复某些游戏中的问题,但在某些情况下可能会降低性能。 使用Unreal Engine 4的游戏似乎受影响最大。</string>
|
||||
@@ -477,11 +477,11 @@
|
||||
<string name="renderer_force_max_clock">强制最大时钟 (仅限 Adreno)</string>
|
||||
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能引入图形问题和增加崩溃概率。</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
||||
<string name="renderer_async_presentation">异步呈现</string>
|
||||
<string name="renderer_async_presentation_description">此技巧通过将图形呈现移至独立的 CPU 线程来提升性能,但可能会引入图形显示问题。</string>
|
||||
<string name="renderer_async_presentation_description">此技巧通过将图形呈现移至独立的 CPU 线程来提升性能,但可能会带来图形显示问题。</string>
|
||||
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
||||
<string name="renderer_reactive_flushing_description">通过牺牲性能来提高某些游戏的渲染精度。</string>
|
||||
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
||||
<string name="enable_buffer_history">启用缓冲区历史</string>
|
||||
<string name="enable_buffer_history_description">启用对先前缓冲区状态的访问。此选项可在某些游戏中提升渲染质量并保持性能的一致性。</string>
|
||||
<string name="use_optimized_vertex_buffers">优化顶点缓冲区</string>
|
||||
@@ -489,10 +489,10 @@
|
||||
|
||||
<string name="hacks">Hacks</string>
|
||||
|
||||
<string name="fast_gpu_time">GPU 超频频率</string>
|
||||
<string name="fast_gpu_time">快速 GPU 时间</string>
|
||||
<string name="fast_gpu_time_description">强制大多数游戏以其最高原生分辨率运行。设置为 256 可获得最佳性能,设置为 512 可获得最佳画面保真度。</string>
|
||||
<string name="skip_cpu_inner_invalidation">跳过CPU内部无效化</string>
|
||||
<string name="skip_cpu_inner_invalidation_description">在内存更新期间跳过某些CPU端缓存无效化,减少CPU使用率并提高其性能。可能会导致某些游戏出现故障或崩溃。</string>
|
||||
<string name="skip_cpu_inner_invalidation_description">在更新内存时跳过某些 CPU 端的缓存失效操作,从而降低 CPU 占用率并提升性能。可能会在某些游戏中引发故障点或崩溃。</string>
|
||||
<string name="antiflicker">防闪烁</string>
|
||||
<string name="antiflicker_description">强制 GPU 围栏回调等待已提交的 GPU 任务。配合“快速 GPU 模式”一起使用,以避免画面闪烁现象,仅会牺牲少量性能。</string>
|
||||
<string name="fix_bloom_effects">修复 Bloom 效果</string>
|
||||
@@ -502,16 +502,16 @@
|
||||
<string name="rescale_hack">启用旧版缩放处理</string>
|
||||
<string name="rescale_hack_description">启用通过使用快速缩放路径,来为游戏提供缩放配置处理的传统处理方式</string>
|
||||
<string name="renderer_asynchronous_shaders">使用异步着色器</string>
|
||||
<string name="renderer_asynchronous_shaders_description">异步编译着色器。这可能会减少卡顿,但也可能会导致图形错误。</string>
|
||||
<string name="gpu_unswizzle_settings">GPU 还原设置</string>
|
||||
<string name="gpu_unswizzle_settings_description">配置基于 GPU 的纹理还原参数,或将其完全禁用。调整这些设置以平衡性能与纹理加载质量。</string>
|
||||
<string name="gpu_unswizzle_enable">启用 GPU 还原</string>
|
||||
<string name="renderer_asynchronous_shaders_description">以异步方式编译着色器。采用此方式或可减少卡顿,但也可能引入故障点。</string>
|
||||
<string name="gpu_unswizzle_settings">GPU Unswizzle 设置</string>
|
||||
<string name="gpu_unswizzle_settings_description">配置基于 GPU 的纹理 unswizzling 参数,或完全禁用该功能。通过调整这些设置,以尝试在性能与纹理加载质量之间取得平衡。</string>
|
||||
<string name="gpu_unswizzle_enable">启用 GPU Unswizzle</string>
|
||||
<string name="gpu_unswizzle_disabled">禁用</string>
|
||||
<string name="gpu_unswizzle_texture_size">GPU 还原最大纹理尺寸</string>
|
||||
<string name="gpu_unswizzle_texture_size_description">设置基于 GPU 的纹理还原的最大尺寸(单位:MiB)。\n虽然 GPU 在处理中型和大型纹理时速度更快,但对于非常小的纹理,CPU 的效率可能更高。\n调整此设置,以便在 GPU 加速和 CPU 开销之间找到最佳平衡点。</string>
|
||||
<string name="gpu_unswizzle_stream_size">GPU 还原流大小</string>
|
||||
<string name="gpu_unswizzle_stream_size_description">设置用于 unswizzling 大型纹理时的每帧数据限制。较高的数值可以加快纹理的加载速度,但会增加帧延迟。而较低的数值可以降低 GPU 的开销,但可能会导致可见的纹理 闪现。</string>
|
||||
<string name="gpu_unswizzle_chunk_size">GPU 还原块大小</string>
|
||||
<string name="gpu_unswizzle_texture_size">GPU Unswizzle 最大纹理尺寸</string>
|
||||
<string name="gpu_unswizzle_texture_size_description">设置基于 GPU 的纹理 unswizzling 的最大尺寸(MB)。虽然 GPU 处理中等和大型纹理的速度更快,但对于非常小的纹理,CPU 可能更为高效。通过调节此项设置,以尝试在 GPU 加速与 CPU 开销之间找到平衡。</string>
|
||||
<string name="gpu_unswizzle_stream_size">GPU Unswizzle 流大小</string>
|
||||
<string name="gpu_unswizzle_stream_size_description">设置用于 unswizzling 大型纹理时的每帧数据限制。较高的数值可以加速纹理的加载过程,但会带来更高的帧延迟。而较低的数值则可以降低 GPU 的开销,但也可能会导致可见的纹理闪现。</string>
|
||||
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle 块大小</string>
|
||||
<string name="gpu_unswizzle_chunk_size_description">定义了 3D 纹理每批次处理的深度切片数量。增加此数值可在高性能 GPU 上提升吞吐效率,但在性能较弱的硬件上可能会导致卡顿或驱动超时。</string>
|
||||
<string name="gpu_unswizzle_default_button">默认</string>
|
||||
|
||||
@@ -524,7 +524,7 @@
|
||||
<string name="vertex_input_dynamic_state">顶点输入动态状态</string>
|
||||
<string name="vertex_input_dynamic_state_description">启用此功能可实现更灵活的顶点输入处理,可能减少顶点/缓冲区的管线编译时间。</string>
|
||||
<string name="sample_shading_fraction">采样着色</string>
|
||||
<string name="sample_shading_fraction_description">允许片段着色器在多采样片段中每个样本执行一次,而不是每个片段执行一次。以提高性能为代价改善图形质量。</string>
|
||||
<string name="sample_shading_fraction_description">允许片段着色器在多采样片段中对每个采样点执行一次操作,而非对每个片段执行一次。在提升图形显示质量的同时,会牺牲一部分性能。</string>
|
||||
|
||||
|
||||
<string name="display">显示</string>
|
||||
@@ -548,7 +548,7 @@
|
||||
<string name="renderer_debug_description">将图形 API 设置为较慢的调试模式。</string>
|
||||
<string name="patch_old_qcom_drivers">BCn 纹理补丁</string>
|
||||
<string name="patch_old_qcom_drivers_description">在 Adreno GPU 上覆盖自动 BCn 纹理格式检测。通常根据 Android 版本自动检测(在 API 28 及以上启用)。</string>
|
||||
<string name="fastmem">Fastmem 内存访问</string>
|
||||
<string name="fastmem">Fastmem</string>
|
||||
|
||||
<string name="log">日志记录</string>
|
||||
<string name="flush_by_line">按行刷新调试日志</string>
|
||||
@@ -615,7 +615,7 @@
|
||||
<string name="unused">未使用</string>
|
||||
<string name="input_mapping_filter">输入映射过滤器</string>
|
||||
<string name="input_mapping_filter_description">选择一个设备过滤输入映射</string>
|
||||
<string name="auto_map">控制器自动映射</string>
|
||||
<string name="auto_map">自动映射控制器键位</string>
|
||||
<string name="auto_map_description">选择一个设备以尝试自动映射</string>
|
||||
<string name="attempted_auto_map">尝试为 %1$s 自动映射</string>
|
||||
<string name="controller_type">控制器类型</string>
|
||||
@@ -731,10 +731,10 @@
|
||||
<string name="preferences_audio">声音</string>
|
||||
<string name="preferences_audio_description">输出引擎及音量</string>
|
||||
<string name="preferences_controls">控制</string>
|
||||
<string name="preferences_controls_description">使用控制器来映射输入</string>
|
||||
<string name="preferences_controls_description">映射控制器键位输入</string>
|
||||
<string name="preferences_player">玩家 %d</string>
|
||||
<string name="preferences_debug">调试</string>
|
||||
<string name="preferences_debug_description">CPU/GPU 调试、图形 API 及 fastmem 内存访问</string>
|
||||
<string name="preferences_debug_description">CPU/GPU 调试、图形 API 以及 fastmem</string>
|
||||
<string name="preferences_custom_paths">自定义路径</string>
|
||||
<string name="preferences_custom_paths_description">存档目录</string>
|
||||
|
||||
@@ -878,15 +878,15 @@
|
||||
<string name="emulation_rel_stick_center">相对摇杆中心</string>
|
||||
<string name="emulation_dpad_slide">十字方向键滑动</string>
|
||||
<string name="emulation_haptics">触觉反馈</string>
|
||||
<string name="emulation_show_overlay">显示控制器</string>
|
||||
<string name="emulation_hide_overlay">隐藏控制器</string>
|
||||
<string name="emulation_show_overlay">显示触控叠加层</string>
|
||||
<string name="emulation_hide_overlay">隐藏触控叠加层</string>
|
||||
<string name="emulation_toggle_all">全部切换</string>
|
||||
<string name="emulation_control_adjust">调整触控叠加层</string>
|
||||
<string name="emulation_control_scale">缩放</string>
|
||||
<string name="emulation_control_opacity">不透明度</string>
|
||||
<string name="emulation_touch_overlay_reset">重置触控叠加层</string>
|
||||
<string name="emulation_touch_overlay_edit">编辑触控叠加层</string>
|
||||
<string name="emulation_snap_to_grid">截图到网格</string>
|
||||
<string name="emulation_snap_to_grid">对齐到网格</string>
|
||||
<string name="emulation_pause">暂停模拟</string>
|
||||
<string name="emulation_unpause">继续模拟</string>
|
||||
<string name="emulation_input_overlay">触控叠加层选项</string>
|
||||
@@ -982,7 +982,7 @@
|
||||
<string name="renderer_none">无</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_low">性能</string>
|
||||
<string name="renderer_accuracy_low">快速</string>
|
||||
<string name="renderer_accuracy_medium">平衡</string>
|
||||
<string name="renderer_accuracy_high">精确</string>
|
||||
|
||||
|
||||
@@ -434,6 +434,9 @@
|
||||
<string name="cpu_accuracy">CPU accuracy</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<string name="program_args">Homebrew Args</string>
|
||||
<string name="program_args_description">Command-line arguments passed to homebrew at launch (e.g. -noglsl).</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
<string name="device_name">Device name</string>
|
||||
<string name="use_docked_mode">Docked Mode</string>
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: 2019 Dolphin Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <string>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <cstring>
|
||||
#endif
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include <fmt/ranges.h>
|
||||
|
||||
+20
-69
@@ -409,107 +409,62 @@ bool RenameDir(const fs::path& old_path, const fs::path& new_path) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void IterateDirEntries(const std::filesystem::path& path, const DirEntryCallable& callback,
|
||||
DirEntryFilter filter) {
|
||||
void IterateDirEntries(const std::filesystem::path& path, const DirEntryCallable& callback, DirEntryFilter filter) {
|
||||
if (!ValidatePath(path)) {
|
||||
LOG_ERROR(Common_Filesystem, "Input path is not valid, path={}", PathToUTF8String(path));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Exists(path)) {
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} does not exist",
|
||||
PathToUTF8String(path));
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} does not exist", PathToUTF8String(path));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsDir(path)) {
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} is not a directory",
|
||||
PathToUTF8String(path));
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} is not a directory", PathToUTF8String(path));
|
||||
return;
|
||||
}
|
||||
|
||||
bool callback_error = false;
|
||||
|
||||
std::error_code ec;
|
||||
|
||||
for (const auto& entry : fs::directory_iterator(path, ec)) {
|
||||
if (ec) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (True(filter & DirEntryFilter::File) &&
|
||||
entry.status().type() == fs::file_type::regular) {
|
||||
bool callback_error = false;
|
||||
for (auto const& entry : fs::directory_iterator(path, ec)) {
|
||||
if ((True(filter & DirEntryFilter::File) && entry.status().type() == fs::file_type::regular)
|
||||
|| (True(filter & DirEntryFilter::Directory) && entry.status().type() == fs::file_type::directory)) {
|
||||
if (!callback(entry)) {
|
||||
callback_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (True(filter & DirEntryFilter::Directory) &&
|
||||
entry.status().type() == fs::file_type::directory) {
|
||||
if (!callback(entry)) {
|
||||
callback_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (callback_error || ec) {
|
||||
LOG_ERROR(Common_Filesystem,
|
||||
"Failed to visit all the directory entries of path={}, ec_message={}",
|
||||
PathToUTF8String(path), ec.message());
|
||||
return;
|
||||
LOG_ERROR(Common_Filesystem, "Failed to visit all the directory entries of path={}, ec_message={}, callback_error={}", PathToUTF8String(path), ec.message(), callback_error);
|
||||
} else {
|
||||
LOG_DEBUG(Common_Filesystem, "Visited all the directory entries of path={}", PathToUTF8String(path));
|
||||
}
|
||||
|
||||
LOG_DEBUG(Common_Filesystem, "Successfully visited all the directory entries of path={}",
|
||||
PathToUTF8String(path));
|
||||
}
|
||||
|
||||
void IterateDirEntriesRecursively(const std::filesystem::path& path,
|
||||
const DirEntryCallable& callback, DirEntryFilter filter) {
|
||||
void IterateDirEntriesRecursively(const std::filesystem::path& path, const DirEntryCallable& callback, DirEntryFilter filter) {
|
||||
if (!ValidatePath(path)) {
|
||||
LOG_ERROR(Common_Filesystem, "Input path is not valid, path={}", PathToUTF8String(path));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Exists(path)) {
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} does not exist",
|
||||
PathToUTF8String(path));
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} does not exist", PathToUTF8String(path));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsDir(path)) {
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} is not a directory",
|
||||
PathToUTF8String(path));
|
||||
LOG_ERROR(Common_Filesystem, "Filesystem object at path={} is not a directory", PathToUTF8String(path));
|
||||
return;
|
||||
}
|
||||
|
||||
bool callback_error = false;
|
||||
|
||||
std::error_code ec;
|
||||
|
||||
// TODO (Morph): Replace this with recursive_directory_iterator once it's fixed in MSVC.
|
||||
std::error_code ec;
|
||||
bool callback_error = false;
|
||||
for (const auto& entry : fs::directory_iterator(path, ec)) {
|
||||
if (ec) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (True(filter & DirEntryFilter::File) &&
|
||||
entry.status().type() == fs::file_type::regular) {
|
||||
if ((True(filter & DirEntryFilter::File) && entry.status().type() == fs::file_type::regular)
|
||||
|| (True(filter & DirEntryFilter::Directory) && entry.status().type() == fs::file_type::directory)) {
|
||||
if (!callback(entry)) {
|
||||
callback_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (True(filter & DirEntryFilter::Directory) &&
|
||||
entry.status().type() == fs::file_type::directory) {
|
||||
if (!callback(entry)) {
|
||||
callback_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO (Morph): Remove this when MSVC fixes recursive_directory_iterator.
|
||||
// recursive_directory_iterator throws an exception despite passing in a std::error_code.
|
||||
if (entry.status().type() == fs::file_type::directory) {
|
||||
@@ -518,14 +473,10 @@ void IterateDirEntriesRecursively(const std::filesystem::path& path,
|
||||
}
|
||||
|
||||
if (callback_error || ec) {
|
||||
LOG_ERROR(Common_Filesystem,
|
||||
"Failed to visit all the directory entries of path={}, ec_message={}",
|
||||
PathToUTF8String(path), ec.message());
|
||||
return;
|
||||
LOG_ERROR(Common_Filesystem, "Failed to visit all the directory entries of path={}, ec_message={}, callback_error={}", PathToUTF8String(path), ec.message(), callback_error);
|
||||
} else {
|
||||
LOG_DEBUG(Common_Filesystem, "Visited all the directory entries of path={}", PathToUTF8String(path));
|
||||
}
|
||||
|
||||
LOG_DEBUG(Common_Filesystem, "Successfully visited all the directory entries of path={}",
|
||||
PathToUTF8String(path));
|
||||
}
|
||||
|
||||
// Generic Filesystem Operations
|
||||
|
||||
@@ -90,7 +90,7 @@ public:
|
||||
|
||||
void CreateEdenPaths() {
|
||||
std::for_each(eden_paths.begin(), eden_paths.end(), [](auto &path) {
|
||||
void(FS::CreateDir(path.second));
|
||||
void(FS::CreateDirs(path.second));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -149,10 +149,9 @@ public:
|
||||
LEGACY_PATH(Suyu, SUYU)
|
||||
#undef LEGACY_PATH
|
||||
#endif
|
||||
// data
|
||||
GenerateEdenPath(EdenPath::EdenDir, eden_path);
|
||||
GenerateEdenPath(EdenPath::AmiiboDir, eden_path / AMIIBO_DIR);
|
||||
GenerateEdenPath(EdenPath::CacheDir, eden_path_cache);
|
||||
GenerateEdenPath(EdenPath::ConfigDir, eden_path_config);
|
||||
GenerateEdenPath(EdenPath::CrashDumpsDir, eden_path / CRASH_DUMPS_DIR);
|
||||
GenerateEdenPath(EdenPath::DumpDir, eden_path / DUMP_DIR);
|
||||
GenerateEdenPath(EdenPath::KeysDir, eden_path / KEYS_DIR);
|
||||
@@ -163,10 +162,13 @@ public:
|
||||
GenerateEdenPath(EdenPath::SaveDir, eden_path / NAND_DIR);
|
||||
GenerateEdenPath(EdenPath::ScreenshotsDir, eden_path / SCREENSHOTS_DIR);
|
||||
GenerateEdenPath(EdenPath::SDMCDir, eden_path / SDMC_DIR);
|
||||
GenerateEdenPath(EdenPath::ShaderDir, eden_path / SHADER_DIR);
|
||||
GenerateEdenPath(EdenPath::TASDir, eden_path / TAS_DIR);
|
||||
GenerateEdenPath(EdenPath::IconsDir, eden_path / ICONS_DIR);
|
||||
|
||||
// config
|
||||
GenerateEdenPath(EdenPath::ConfigDir, eden_path_config);
|
||||
// cache
|
||||
GenerateEdenPath(EdenPath::CacheDir, eden_path_cache);
|
||||
GenerateEdenPath(EdenPath::ShaderDir, eden_path_cache / SHADER_DIR);
|
||||
#ifdef _WIN32
|
||||
GenerateLegacyPath(EmuPath::RyujinxDir, GetAppDataRoamingDirectory() / RYUJINX_DIR);
|
||||
#else
|
||||
|
||||
+80
-39
@@ -32,6 +32,8 @@
|
||||
#include <mach/mach.h>
|
||||
#elif defined(__FreeBSD__)
|
||||
#include <sys/shm.h>
|
||||
#elif defined(__OPENORBIS__)
|
||||
#include <orbis/libkernel.h>
|
||||
#endif
|
||||
|
||||
// FreeBSD
|
||||
@@ -122,54 +124,55 @@ static void GetFuncAddress(Common::DynamicLibrary& dll, const char* name, T& pfn
|
||||
class HostMemory::Impl {
|
||||
public:
|
||||
explicit Impl(size_t backing_size_, size_t virtual_size_)
|
||||
: backing_size{backing_size_}, virtual_size{virtual_size_}, process{GetCurrentProcess()},
|
||||
kernelbase_dll("Kernelbase") {
|
||||
: backing_size{backing_size_}
|
||||
, virtual_size{virtual_size_}
|
||||
, process{GetCurrentProcess()}
|
||||
, kernelbase_dll("Kernelbase")
|
||||
{}
|
||||
|
||||
bool Init() {
|
||||
if (!kernelbase_dll.IsOpen()) {
|
||||
LOG_CRITICAL(HW_Memory, "Failed to load Kernelbase.dll");
|
||||
throw std::bad_alloc{};
|
||||
return false;
|
||||
}
|
||||
GetFuncAddress(kernelbase_dll, "CreateFileMapping2", pfn_CreateFileMapping2);
|
||||
GetFuncAddress(kernelbase_dll, "VirtualAlloc2", pfn_VirtualAlloc2);
|
||||
GetFuncAddress(kernelbase_dll, "MapViewOfFile3", pfn_MapViewOfFile3);
|
||||
GetFuncAddress(kernelbase_dll, "UnmapViewOfFile2", pfn_UnmapViewOfFile2);
|
||||
|
||||
if (!pfn_CreateFileMapping2 || !pfn_VirtualAlloc2 || !pfn_MapViewOfFile3 || !pfn_UnmapViewOfFile2) {
|
||||
LOG_CRITICAL(HW_Memory, "Failed to find functions for virtual allocs");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Allocate backing file map
|
||||
backing_handle =
|
||||
pfn_CreateFileMapping2(INVALID_HANDLE_VALUE, nullptr, FILE_MAP_WRITE | FILE_MAP_READ,
|
||||
PAGE_READWRITE, SEC_COMMIT, backing_size, nullptr, nullptr, 0);
|
||||
backing_handle = pfn_CreateFileMapping2(INVALID_HANDLE_VALUE, nullptr, FILE_MAP_WRITE | FILE_MAP_READ, PAGE_READWRITE, SEC_COMMIT, backing_size, nullptr, nullptr, 0);
|
||||
if (!backing_handle) {
|
||||
LOG_CRITICAL(HW_Memory, "Failed to allocate {} MiB of backing memory",
|
||||
backing_size >> 20);
|
||||
throw std::bad_alloc{};
|
||||
LOG_CRITICAL(HW_Memory, "Failed to allocate {} MiB of backing memory", backing_size >> 20);
|
||||
return false;
|
||||
}
|
||||
// Allocate a virtual memory for the backing file map as placeholder
|
||||
backing_base = static_cast<u8*>(pfn_VirtualAlloc2(process, nullptr, backing_size,
|
||||
MEM_RESERVE | MEM_RESERVE_PLACEHOLDER,
|
||||
PAGE_NOACCESS, nullptr, 0));
|
||||
backing_base = static_cast<u8*>(pfn_VirtualAlloc2(process, nullptr, backing_size, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, nullptr, 0));
|
||||
if (!backing_base) {
|
||||
Release();
|
||||
LOG_CRITICAL(HW_Memory, "Failed to reserve {} MiB of virtual memory",
|
||||
backing_size >> 20);
|
||||
throw std::bad_alloc{};
|
||||
LOG_CRITICAL(HW_Memory, "Failed to reserve {} MiB of virtual memory", backing_size >> 20);
|
||||
return false;
|
||||
}
|
||||
// Map backing placeholder
|
||||
void* const ret = pfn_MapViewOfFile3(backing_handle, process, backing_base, 0, backing_size,
|
||||
MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, nullptr, 0);
|
||||
void* const ret = pfn_MapViewOfFile3(backing_handle, process, backing_base, 0, backing_size, MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, nullptr, 0);
|
||||
if (ret != backing_base) {
|
||||
Release();
|
||||
LOG_CRITICAL(HW_Memory, "Failed to map {} MiB of virtual memory", backing_size >> 20);
|
||||
throw std::bad_alloc{};
|
||||
return false;
|
||||
}
|
||||
// Allocate virtual address placeholder
|
||||
virtual_base = static_cast<u8*>(pfn_VirtualAlloc2(process, nullptr, virtual_size,
|
||||
MEM_RESERVE | MEM_RESERVE_PLACEHOLDER,
|
||||
PAGE_NOACCESS, nullptr, 0));
|
||||
virtual_base = static_cast<u8*>(pfn_VirtualAlloc2(process, nullptr, virtual_size, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, nullptr, 0));
|
||||
if (!virtual_base) {
|
||||
Release();
|
||||
LOG_CRITICAL(HW_Memory, "Failed to reserve {} GiB of virtual memory",
|
||||
virtual_size >> 30);
|
||||
throw std::bad_alloc{};
|
||||
LOG_CRITICAL(HW_Memory, "Failed to reserve {} GiB of virtual memory", virtual_size >> 30);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
~Impl() {
|
||||
@@ -391,6 +394,9 @@ private:
|
||||
ankerl::unordered_dense::map<size_t, size_t> placeholder_host_pointers; ///< Placeholder backing offset
|
||||
};
|
||||
|
||||
#elif defined(__OPENORBIS__) || defined(__managarm__)
|
||||
// None of the luxuries of POSIX, all of the suffering
|
||||
// For managarm: see https://github.com/managarm/managarm/issues/1370
|
||||
#else // ^^^ Windows ^^^ vvv POSIX vvv
|
||||
|
||||
#ifdef ARCHITECTURE_arm64
|
||||
@@ -496,10 +502,13 @@ static int shm_open_anon(int flags, mode_t mode) {
|
||||
class HostMemory::Impl {
|
||||
public:
|
||||
explicit Impl(size_t backing_size_, size_t virtual_size_)
|
||||
: backing_size{backing_size_}, virtual_size{virtual_size_} {
|
||||
: backing_size{backing_size_}
|
||||
, virtual_size{virtual_size_}
|
||||
{}
|
||||
|
||||
bool Init() {
|
||||
long page_size = sysconf(_SC_PAGESIZE);
|
||||
ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging",
|
||||
page_size);
|
||||
ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", page_size);
|
||||
// Backing memory initialization
|
||||
#if defined(__sun__) || defined(__HAIKU__) || defined(__NetBSD__) || defined(__DragonFly__)
|
||||
fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
|
||||
@@ -507,7 +516,7 @@ public:
|
||||
fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
|
||||
#elif defined(__FreeBSD__)
|
||||
fd = shm_open(SHM_ANON, O_RDWR, 0600);
|
||||
#elif defined(__APPLE__)
|
||||
#elif defined(__APPLE__) || defined(__managarm__)
|
||||
// macOS doesn't have memfd_create, use anonymous temporary file
|
||||
char template_path[] = "/tmp/eden_mem_XXXXXX";
|
||||
fd = mkstemp(template_path);
|
||||
@@ -540,15 +549,22 @@ public:
|
||||
} else {
|
||||
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
|
||||
}
|
||||
ASSERT_MSG(backing_base != MAP_FAILED, "mmap failed: {}", strerror(errno));
|
||||
if (backing_base == MAP_FAILED) {
|
||||
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Virtual memory initialization
|
||||
virtual_base = virtual_map_base = static_cast<u8*>(ChooseVirtualBase(virtual_size));
|
||||
ASSERT_MSG(virtual_base != MAP_FAILED, "mmap failed: {}", strerror(errno));
|
||||
if (virtual_base == MAP_FAILED) {
|
||||
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
||||
return false;
|
||||
}
|
||||
#if defined(__linux__)
|
||||
madvise(virtual_base, virtual_size, MADV_HUGEPAGE);
|
||||
#endif
|
||||
free_manager.SetAddressSpace(virtual_base, virtual_size);
|
||||
return true;
|
||||
}
|
||||
|
||||
~Impl() {
|
||||
@@ -669,17 +685,35 @@ private:
|
||||
|
||||
#endif // ^^^ POSIX ^^^
|
||||
|
||||
HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) : backing_size(backing_size_), virtual_size(virtual_size_) {
|
||||
HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_)
|
||||
: backing_size(backing_size_)
|
||||
, virtual_size(virtual_size_)
|
||||
{
|
||||
#if defined(__OPENORBIS__) || defined(__managarm__)
|
||||
LOG_WARNING(HW_Memory, "Platform doesn't support fastmem");
|
||||
fallback_buffer.emplace(backing_size);
|
||||
backing_base = fallback_buffer->data();
|
||||
virtual_base = nullptr;
|
||||
#else
|
||||
// Try to allocate a fastmem arena.
|
||||
// The implementation will fail with std::bad_alloc on errors.
|
||||
impl = std::make_unique<HostMemory::Impl>(AlignUp(backing_size, PageAlignment), AlignUp(virtual_size, PageAlignment) + HugePageSize);
|
||||
backing_base = impl->backing_base;
|
||||
virtual_base = impl->virtual_base;
|
||||
if (virtual_base) {
|
||||
// Ensure the virtual base is aligned to the L2 block size.
|
||||
virtual_base = reinterpret_cast<u8*>(Common::AlignUp(uintptr_t(virtual_base), HugePageSize));
|
||||
virtual_base_offset = virtual_base - impl->virtual_base;
|
||||
if (impl->Init()) {
|
||||
backing_base = impl->backing_base;
|
||||
virtual_base = impl->virtual_base;
|
||||
if (virtual_base) {
|
||||
// Ensure the virtual base is aligned to the L2 block size.
|
||||
virtual_base = reinterpret_cast<u8*>(Common::AlignUp(uintptr_t(virtual_base), HugePageSize));
|
||||
virtual_base_offset = virtual_base - impl->virtual_base;
|
||||
}
|
||||
} else {
|
||||
impl.reset();
|
||||
LOG_WARNING(HW_Memory, "Platform can support fastmem, but can't create it");
|
||||
fallback_buffer.emplace(backing_size);
|
||||
backing_base = fallback_buffer->data();
|
||||
virtual_base = nullptr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
HostMemory::~HostMemory() = default;
|
||||
@@ -688,8 +722,8 @@ HostMemory::HostMemory(HostMemory&&) noexcept = default;
|
||||
|
||||
HostMemory& HostMemory::operator=(HostMemory&&) noexcept = default;
|
||||
|
||||
void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length,
|
||||
MemoryPermission perms, bool separate_heap) {
|
||||
void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms, bool separate_heap) {
|
||||
#if !(defined(__OPENORBIS__) || defined(__managarm__))
|
||||
ASSERT(virtual_offset % PageAlignment == 0);
|
||||
ASSERT(host_offset % PageAlignment == 0);
|
||||
ASSERT(length % PageAlignment == 0);
|
||||
@@ -699,9 +733,11 @@ void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length,
|
||||
return;
|
||||
}
|
||||
impl->Map(virtual_offset + virtual_base_offset, host_offset, length, perms);
|
||||
#endif
|
||||
}
|
||||
|
||||
void HostMemory::Unmap(size_t virtual_offset, size_t length, bool separate_heap) {
|
||||
#if !(defined(__OPENORBIS__) || defined(__managarm__))
|
||||
ASSERT(virtual_offset % PageAlignment == 0);
|
||||
ASSERT(length % PageAlignment == 0);
|
||||
ASSERT(virtual_offset + length <= virtual_size);
|
||||
@@ -709,9 +745,11 @@ void HostMemory::Unmap(size_t virtual_offset, size_t length, bool separate_heap)
|
||||
return;
|
||||
}
|
||||
impl->Unmap(virtual_offset + virtual_base_offset, length);
|
||||
#endif
|
||||
}
|
||||
|
||||
void HostMemory::Protect(size_t virtual_offset, size_t length, MemoryPermission perm) {
|
||||
#if !(defined(__OPENORBIS__) || defined(__managarm__))
|
||||
ASSERT(virtual_offset % PageAlignment == 0);
|
||||
ASSERT(length % PageAlignment == 0);
|
||||
ASSERT(virtual_offset + length <= virtual_size);
|
||||
@@ -722,6 +760,7 @@ void HostMemory::Protect(size_t virtual_offset, size_t length, MemoryPermission
|
||||
const bool write = True(perm & MemoryPermission::Write);
|
||||
const bool execute = True(perm & MemoryPermission::Execute);
|
||||
impl->Protect(virtual_offset + virtual_base_offset, length, read, write, execute);
|
||||
#endif
|
||||
}
|
||||
|
||||
void HostMemory::ClearBackingRegion(size_t physical_offset, size_t length, u32 fill_value) {
|
||||
@@ -729,10 +768,12 @@ void HostMemory::ClearBackingRegion(size_t physical_offset, size_t length, u32 f
|
||||
}
|
||||
|
||||
void HostMemory::EnableDirectMappedAddress() {
|
||||
#if !(defined(__OPENORBIS__) || defined(__managarm__))
|
||||
if (impl) {
|
||||
impl->EnableDirectMappedAddress();
|
||||
virtual_size += reinterpret_cast<uintptr_t>(virtual_base);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace Common
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
||||
@@ -7,6 +7,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include "common/common_funcs.h"
|
||||
#include "common/common_types.h"
|
||||
#include "common/virtual_buffer.h"
|
||||
@@ -76,12 +77,16 @@ private:
|
||||
size_t backing_size{};
|
||||
size_t virtual_size{};
|
||||
|
||||
#if !(defined(__OPENORBIS__) || defined(__managarm__))
|
||||
// Low level handler for the platform dependent memory routines
|
||||
class Impl;
|
||||
std::unique_ptr<Impl> impl;
|
||||
#endif
|
||||
u8* backing_base{};
|
||||
u8* virtual_base{};
|
||||
size_t virtual_base_offset{};
|
||||
// Windows requires it for kernels whom lack proper support for some functions!
|
||||
std::optional<Common::VirtualBuffer<u8>> fallback_buffer;
|
||||
};
|
||||
|
||||
} // namespace Common
|
||||
|
||||
@@ -89,7 +89,7 @@ void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, u
|
||||
|
||||
template <typename... Args>
|
||||
void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::format_string<Args...> format, const Args&... args) {
|
||||
FmtLogMessageImpl(log_class, log_level, filename, line_num, function, format, fmt::make_format_args(args...));
|
||||
FmtLogMessageImpl(log_class, log_level, filename, line_num, function, format.get(), fmt::make_format_args(args...));
|
||||
}
|
||||
|
||||
/// Implements a log message filter which allows different log classes to have different minimum
|
||||
|
||||
+11
-5
@@ -336,7 +336,7 @@ struct Values {
|
||||
RendererBackend::Vulkan,
|
||||
#endif
|
||||
"backend", Category::Renderer};
|
||||
SwitchableSetting<int> vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList};
|
||||
SwitchableSetting<u32> vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList};
|
||||
|
||||
// Graphics Settings
|
||||
ResolutionScalingInfo resolution_info{};
|
||||
@@ -661,8 +661,8 @@ struct Values {
|
||||
false, true, &custom_rtc_enabled};
|
||||
SwitchableSetting<s64, true> custom_rtc_offset{linkage,
|
||||
0,
|
||||
(std::numeric_limits<int>::min)(),
|
||||
(std::numeric_limits<int>::max)(),
|
||||
(std::numeric_limits<s64>::min)(),
|
||||
(std::numeric_limits<s64>::max)(),
|
||||
"custom_rtc_offset",
|
||||
Category::System,
|
||||
Specialization::Countable,
|
||||
@@ -751,7 +751,7 @@ struct Values {
|
||||
|
||||
Setting<std::string> touch_device{linkage, "min_x:100,min_y:50,max_x:1800,max_y:850",
|
||||
"touch_device", Category::Controls};
|
||||
Setting<int> touch_from_button_map_index{linkage, 0, "touch_from_button_map",
|
||||
Setting<u32> touch_from_button_map_index{linkage, 0, "touch_from_button_map",
|
||||
Category::Controls};
|
||||
std::vector<TouchFromButtonMap> touch_from_button_maps;
|
||||
|
||||
@@ -779,7 +779,13 @@ struct Values {
|
||||
bool record_frame_times;
|
||||
Setting<bool> use_gdbstub{linkage, false, "use_gdbstub", Category::Debugging};
|
||||
Setting<u16> gdbstub_port{linkage, 6543, "gdbstub_port", Category::Debugging};
|
||||
Setting<std::string> program_args{linkage, std::string(), "program_args", Category::Debugging};
|
||||
SwitchableSetting<std::string> program_args{linkage,
|
||||
std::string(),
|
||||
"program_args",
|
||||
Category::System,
|
||||
Specialization::Default,
|
||||
true, // save_ — persist in config file
|
||||
false}; // runtime_modifiable_ — startup-only
|
||||
Setting<bool> dump_exefs{linkage, false, "dump_exefs", Category::Debugging};
|
||||
Setting<bool> dump_nso{linkage, false, "dump_nso", Category::Debugging};
|
||||
Setting<bool> dump_shaders{
|
||||
|
||||
@@ -145,8 +145,8 @@ ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never);
|
||||
ENUM(FullscreenMode, Borderless, Exclusive);
|
||||
ENUM(NvdecEmulation, Off, Cpu, Gpu);
|
||||
ENUM(ResolutionSetup, Res1_4X, Res1_2X, Res3_4X, Res1X, Res5_4X, Res3_2X, Res2X, Res3X, Res4X, Res5X, Res6X, Res7X, Res8X);
|
||||
ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, Sgsr, SgsrEdge, MaxEnum);
|
||||
ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum);
|
||||
ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, Sgsr, SgsrEdge);
|
||||
ENUM(AntiAliasing, None, Fxaa, Smaa);
|
||||
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
|
||||
ENUM(ConsoleMode, Handheld, Docked);
|
||||
ENUM(AppletMode, HLE, LLE);
|
||||
@@ -158,7 +158,7 @@ ENUM(GpuUnswizzleChunk, VeryLow, Low, Normal, Medium, High)
|
||||
ENUM(TemperatureUnits, Celsius, Fahrenheit)
|
||||
ENUM(ExtendedDynamicState, Disabled, EDS1, EDS2, EDS3);
|
||||
ENUM(GpuLogLevel, Off, Errors, Standard, Verbose, All)
|
||||
ENUM(GameListMode, TreeView, GridView);
|
||||
ENUM(GameListMode, TreeView, GridView, CarouselView);
|
||||
ENUM(SpeedMode, Standard, Turbo, Slow);
|
||||
|
||||
template <typename Type>
|
||||
|
||||
@@ -6,14 +6,13 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <optional>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <typeindex>
|
||||
#include <typeinfo>
|
||||
#include <fmt/core.h>
|
||||
#include <type_traits>
|
||||
#include <fmt/ranges.h>
|
||||
#include "common/common_types.h"
|
||||
#include "common/settings_common.h"
|
||||
#include "common/settings_enums.h"
|
||||
@@ -101,7 +100,15 @@ public:
|
||||
* @param val The desired value
|
||||
*/
|
||||
virtual void SetValue(const Type& val) {
|
||||
Type temp{ranged ? std::clamp(val, minimum, maximum) : val};
|
||||
// Enums have a maximal range which they're allowed
|
||||
Type temp{};
|
||||
if constexpr (std::is_enum_v<Type>) {
|
||||
auto const r_min = std::underlying_type_t<Type>(0);
|
||||
auto const r_max = std::underlying_type_t<Type>(EnumMetadata<Type>::GetLast());
|
||||
temp = Type(std::clamp(std::underlying_type_t<Type>(val), r_min, r_max));
|
||||
} else {
|
||||
temp = ranged ? std::clamp(val, this->minimum, this->maximum) : val;
|
||||
}
|
||||
std::swap(value, temp);
|
||||
}
|
||||
|
||||
@@ -129,7 +136,7 @@ protected:
|
||||
} else if constexpr (std::is_floating_point_v<Type>) {
|
||||
return fmt::format("{:f}", value_);
|
||||
} else if constexpr (std::is_enum_v<Type>) {
|
||||
return std::to_string(u32(value_));
|
||||
return std::to_string(std::underlying_type_t<Type>(value_));
|
||||
} else {
|
||||
return std::to_string(value_);
|
||||
}
|
||||
@@ -371,7 +378,15 @@ public:
|
||||
* @param val The new value
|
||||
*/
|
||||
void SetValue(const Type& val) override final {
|
||||
Type temp{ranged ? std::clamp(val, this->minimum, this->maximum) : val};
|
||||
// Enums have a maximal range which they're allowed
|
||||
Type temp{};
|
||||
if constexpr (std::is_enum_v<Type>) {
|
||||
auto const r_min = std::underlying_type_t<Type>(0);
|
||||
auto const r_max = std::underlying_type_t<Type>(EnumMetadata<Type>::GetLast());
|
||||
temp = Type(std::clamp(std::underlying_type_t<Type>(val), r_min, r_max));
|
||||
} else {
|
||||
temp = ranged ? std::clamp(val, this->minimum, this->maximum) : val;
|
||||
}
|
||||
if (use_global) {
|
||||
std::swap(this->value, temp);
|
||||
} else {
|
||||
|
||||
@@ -1121,6 +1121,10 @@ add_library(core STATIC
|
||||
hle/service/vi/vi_types.h
|
||||
hle/service/vi/vsync_manager.cpp
|
||||
hle/service/vi/vsync_manager.h
|
||||
hle/service/gpio/gpio.cpp
|
||||
hle/service/gpio/gpio.h
|
||||
hle/service/i2c/i2c.cpp
|
||||
hle/service/i2c/i2c.h
|
||||
internal_network/emu_net_state.cpp
|
||||
internal_network/emu_net_state.h
|
||||
internal_network/network.cpp
|
||||
|
||||
@@ -503,6 +503,9 @@ NcaID PlaceholderCache::Generate() {
|
||||
|
||||
VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& open_dir,
|
||||
std::string_view path) const {
|
||||
if (open_dir == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
const auto file = open_dir->GetFileRelative(path);
|
||||
if (file != nullptr) {
|
||||
return file;
|
||||
|
||||
@@ -211,6 +211,9 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, KResource
|
||||
m_version = params.version;
|
||||
m_program_id = params.program_id;
|
||||
m_code_address = params.code_address;
|
||||
m_arg_pointer = 0;
|
||||
m_arg_return_address = 0;
|
||||
m_main_thread_handle_addr = 0;
|
||||
m_code_size = params.code_num_pages * PageSize;
|
||||
m_is_application = True(params.flags & Svc::CreateProcessFlag::IsApplication);
|
||||
|
||||
@@ -995,9 +998,27 @@ Result KProcess::Run(s32 priority, size_t stack_size) {
|
||||
Handle thread_handle;
|
||||
R_TRY(m_handle_table.Add(std::addressof(thread_handle), main_thread));
|
||||
|
||||
// Set the thread arguments.
|
||||
main_thread->GetContext().r[0] = 0;
|
||||
main_thread->GetContext().r[1] = thread_handle;
|
||||
// Set the thread arguments. Two distinct entry conventions:
|
||||
// * Kernel/NSO entry (no homebrew ABI): x0 = 0, x1 = thread_handle
|
||||
// * Homebrew/NRO ABI (loader set arg ptr): x0 = ConfigEntry ptr, x1 = -1ULL
|
||||
// libnx's switch_crt0.s tests `x0==0 || x1==0xFFFFFFFFFFFFFFFF` to take
|
||||
// its normal init path; any other combination is interpreted as a user
|
||||
// exception handler entry.
|
||||
if (GetInteger(m_arg_pointer) != 0) {
|
||||
main_thread->GetContext().r[0] = GetInteger(m_arg_pointer);
|
||||
main_thread->GetContext().r[1] = UINT64_MAX;
|
||||
main_thread->GetContext().lr = GetInteger(m_arg_return_address);
|
||||
// Patch the MainThreadHandle entry in the ConfigEntry table now that
|
||||
// the actual handle exists. libnx stores this verbatim and uses it
|
||||
// for thread-control SVCs later; a pseudo-handle wouldn't survive
|
||||
// svcCloseHandle on exit.
|
||||
if (GetInteger(m_main_thread_handle_addr) != 0) {
|
||||
this->GetMemory().Write32(m_main_thread_handle_addr, thread_handle);
|
||||
}
|
||||
} else {
|
||||
main_thread->GetContext().r[0] = 0;
|
||||
main_thread->GetContext().r[1] = thread_handle;
|
||||
}
|
||||
|
||||
// Pass the thread handle to the thread local region.
|
||||
this->GetMemory().Write32(GetInteger(main_thread->GetTlsAddress()) + 0x110, thread_handle);
|
||||
@@ -1174,8 +1195,7 @@ KProcess::KProcess(KernelCore& kernel)
|
||||
|
||||
KProcess::~KProcess() = default;
|
||||
|
||||
Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size,
|
||||
KProcessAddress aslr_space_start, size_t aslr_space_offset, bool is_hbl) {
|
||||
Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, KProcessAddress aslr_space_start, size_t aslr_space_offset) {
|
||||
// Create a resource limit for the process.
|
||||
const auto pool = static_cast<KMemoryManager::Pool>(metadata.GetPoolPartition());
|
||||
const auto physical_memory_size = m_kernel.MemoryManager().GetSize(pool);
|
||||
@@ -1247,7 +1267,6 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
|
||||
aslr_space_start));
|
||||
|
||||
// Assign remaining properties.
|
||||
m_is_hbl = is_hbl;
|
||||
m_ideal_core_id = metadata.GetMainThreadCore();
|
||||
|
||||
// Set up emulation context.
|
||||
|
||||
@@ -84,6 +84,9 @@ private:
|
||||
Core::Memory::Memory m_memory;
|
||||
KCapabilities m_capabilities{};
|
||||
KProcessAddress m_code_address{};
|
||||
KProcessAddress m_arg_pointer{};
|
||||
KProcessAddress m_arg_return_address{};
|
||||
KProcessAddress m_main_thread_handle_addr{};
|
||||
KHandleTable m_handle_table;
|
||||
KProcessAddress m_plr_address{};
|
||||
ThreadList m_thread_list{};
|
||||
@@ -133,7 +136,6 @@ private:
|
||||
bool m_is_initialized : 1 = false;
|
||||
bool m_is_application : 1 = false;
|
||||
bool m_is_default_application_system_resource : 1 = false;
|
||||
bool m_is_hbl : 1 = false;
|
||||
bool m_is_suspended : 1 = false;
|
||||
bool m_is_immortal : 1 = false;
|
||||
bool m_is_handle_table_initialized : 1 = false;
|
||||
@@ -220,6 +222,16 @@ public:
|
||||
return m_code_address;
|
||||
}
|
||||
|
||||
void SetArgPointer(KProcessAddress addr) {
|
||||
m_arg_pointer = addr;
|
||||
}
|
||||
void SetArgReturnAddress(KProcessAddress addr) {
|
||||
m_arg_return_address = addr;
|
||||
}
|
||||
void SetMainThreadHandleAddr(KProcessAddress addr) {
|
||||
m_main_thread_handle_addr = addr;
|
||||
}
|
||||
|
||||
size_t GetMainStackSize() const {
|
||||
return m_main_thread_stack_size;
|
||||
}
|
||||
@@ -277,10 +289,6 @@ public:
|
||||
return m_capabilities.CanForceDebug();
|
||||
}
|
||||
|
||||
bool IsHbl() const {
|
||||
return m_is_hbl;
|
||||
}
|
||||
|
||||
u32 GetAllocateOption() const {
|
||||
return m_page_table.GetAllocateOption();
|
||||
}
|
||||
@@ -514,8 +522,7 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
Result LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size,
|
||||
KProcessAddress aslr_space_start, size_t aslr_space_offset, bool is_hbl);
|
||||
Result LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, KProcessAddress aslr_space_start, size_t aslr_space_offset);
|
||||
|
||||
void LoadModule(CodeSet code_set, KProcessAddress base_addr);
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -106,9 +109,7 @@ void Break(Core::System& system, BreakReason reason, u64 info1, u64 info2) {
|
||||
system.CurrentPhysicalCore().LogBacktrace();
|
||||
}
|
||||
|
||||
const bool is_hbl = GetCurrentProcess(system.Kernel()).IsHbl();
|
||||
const bool should_break = is_hbl || !notification_only;
|
||||
|
||||
const bool should_break = !notification_only;
|
||||
if (system.DebuggerEnabled() && should_break) {
|
||||
auto* thread = system.Kernel().GetCurrentEmuThread();
|
||||
system.GetDebugger().NotifyThreadStopped(thread);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
@@ -83,6 +83,7 @@ struct Applet {
|
||||
|
||||
// Application functions
|
||||
bool game_play_recording_supported{};
|
||||
bool media_playback_state{};
|
||||
GamePlayRecordingState game_play_recording_state{GamePlayRecordingState::Disabled};
|
||||
bool jit_service_launched{};
|
||||
bool application_crash_report_enabled{};
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "core/file_sys/registered_cache.h"
|
||||
#include "core/file_sys/savedata_factory.h"
|
||||
#include "core/hle/kernel/k_transfer_memory.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/am/am_results.h"
|
||||
#include "core/hle/service/am/applet.h"
|
||||
#include "core/hle/service/am/service/application_functions.h"
|
||||
@@ -56,7 +57,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_
|
||||
{37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
|
||||
{40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"},
|
||||
{50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"},
|
||||
{60, nullptr, "SetMediaPlaybackStateForApplication"},
|
||||
{60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"},
|
||||
{65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"},
|
||||
{66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"},
|
||||
{67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"},
|
||||
@@ -364,6 +365,13 @@ Result IApplicationFunctions::InitializeGamePlayRecording(
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IApplicationFunctions::SetMediaPlaybackStateForApplication(bool enabled) {
|
||||
LOG_WARNING(Service_AM, "(stubbed) {}", enabled);
|
||||
std::scoped_lock lk{m_applet->lock};
|
||||
m_applet->media_playback_state = enabled;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IApplicationFunctions::SetGamePlayRecordingState(
|
||||
GamePlayRecordingState game_play_recording_state) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
|
||||
@@ -53,6 +53,7 @@ private:
|
||||
Result IsGamePlayRecordingSupported(Out<bool> out_is_game_play_recording_supported);
|
||||
Result InitializeGamePlayRecording(
|
||||
u64 transfer_memory_size, InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
|
||||
Result SetMediaPlaybackStateForApplication(bool enabled);
|
||||
Result SetGamePlayRecordingState(GamePlayRecordingState game_play_recording_state);
|
||||
Result EnableApplicationCrashReport(bool enabled);
|
||||
Result InitializeApplicationCopyrightFrameBuffer(
|
||||
|
||||
@@ -29,7 +29,7 @@ IBtmSystemCore::IBtmSystemCore(Core::System& system_)
|
||||
{10, nullptr, "StartAudioDeviceDiscovery"},
|
||||
{11, nullptr, "StopAudioDeviceDiscovery"},
|
||||
{12, nullptr, "IsDiscoveryingAudioDevice"},
|
||||
{13, nullptr, "GetDiscoveredAudioDevice"},
|
||||
{13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"},
|
||||
{14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"},
|
||||
{15, nullptr, "ConnectAudioDevice"},
|
||||
{16, nullptr, "IsConnectingAudioDevice"},
|
||||
@@ -93,6 +93,11 @@ Result IBtmSystemCore::AcquireRadioEvent(Out<bool> out_is_valid,
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IBtmSystemCore::GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total) {
|
||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent(
|
||||
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -34,9 +37,8 @@ private:
|
||||
Result DisableRadio();
|
||||
Result IsRadioEnabled(Out<bool> out_is_enabled);
|
||||
|
||||
Result AcquireRadioEvent(Out<bool> out_is_valid,
|
||||
OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||
|
||||
Result AcquireRadioEvent(Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||
Result GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total);
|
||||
Result AcquireAudioDeviceConnectionEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||
|
||||
Result GetConnectedAudioDevices(
|
||||
|
||||
@@ -151,7 +151,7 @@ Result IFileSystem::GetTotalSpaceSize(
|
||||
Result IFileSystem::GetFileTimeStampRaw(
|
||||
Out<FileSys::FileTimeStampRaw> out_timestamp,
|
||||
const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> path) {
|
||||
LOG_WARNING(Service_FS, "(Partial Implementation) called. file={}", path->str);
|
||||
LOG_DEBUG(Service_FS, "(Partial Implementation) called. file={}", path->str);
|
||||
|
||||
FileSys::FileTimeStampRaw vfs_timestamp{};
|
||||
R_TRY(backend->GetFileTimeStampRaw(&vfs_timestamp, FileSys::Path(path->str)));
|
||||
|
||||
@@ -284,9 +284,17 @@ Result FSP_SRV::OpenSaveDataFileSystem(OutInterface<IFileSystem> out_interface,
|
||||
id = FileSys::StorageId::NandSystem;
|
||||
break;
|
||||
case FileSys::SaveDataSpaceId::Temporary:
|
||||
// ok this is definitely wrong. ASSERT(false) here just kills the whole game the first
|
||||
// time it opens cache storage, and plenty of games do that (TOTK for one). there is
|
||||
// user-space scratch storage so it belongs on user nand. map it, do not crash.
|
||||
id = FileSys::StorageId::NandUser;
|
||||
break;
|
||||
case FileSys::SaveDataSpaceId::ProperSystem:
|
||||
case FileSys::SaveDataSpaceId::SafeMode:
|
||||
ASSERT(false);
|
||||
// same deal for these two. they are system-level spaces so they go on system nand.
|
||||
// way better than nuking the title over a save-space id we just did not list out.
|
||||
id = FileSys::StorageId::NandSystem;
|
||||
break;
|
||||
}
|
||||
|
||||
*out_interface =
|
||||
@@ -324,9 +332,15 @@ Result FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId(OutInterface<IFileSyste
|
||||
id = FileSys::StorageId::NandSystem;
|
||||
break;
|
||||
case FileSys::SaveDataSpaceId::Temporary:
|
||||
// same broken switch as OpenSaveDataFileSystem above. do not ASSERT(false) and kill the
|
||||
// game over a save-space id, just map Temporary to user nand like it should be.
|
||||
id = FileSys::StorageId::NandUser;
|
||||
break;
|
||||
case FileSys::SaveDataSpaceId::ProperSystem:
|
||||
case FileSys::SaveDataSpaceId::SafeMode:
|
||||
ASSERT(false);
|
||||
// system spaces -> system nand. handled, not crashed.
|
||||
id = FileSys::StorageId::NandSystem;
|
||||
break;
|
||||
}
|
||||
|
||||
*out_interface =
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/core.h"
|
||||
#include "core/hle/service/gpio/gpio.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::GPIO {
|
||||
|
||||
class GPIO final : public ServiceFramework<GPIO> {
|
||||
public:
|
||||
explicit GPIO(Core::System& system_)
|
||||
: ServiceFramework{system_, "gpio"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Cmd0"},
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
~GPIO() override = default;
|
||||
};
|
||||
|
||||
void LoopProcess(Core::System& system) {
|
||||
auto server_manager = std::make_unique<ServerManager>(system);
|
||||
server_manager->RegisterNamedService("gpio", std::make_shared<GPIO>(system));
|
||||
ServerManager::RunServer(std::move(server_manager));
|
||||
}
|
||||
|
||||
} // namespace Service::GPIO
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::GPIO {
|
||||
void LoopProcess(Core::System& system);
|
||||
} // namespace Service::GPIO
|
||||
@@ -0,0 +1,76 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/core.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/i2c/i2c.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
|
||||
namespace Service::I2C {
|
||||
|
||||
class I2CSession final : public ServiceFramework<I2CSession> {
|
||||
public:
|
||||
explicit I2CSession(Core::System& system_)
|
||||
: ServiceFramework{system_, "I2CSession"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SendOld"},
|
||||
{1, nullptr, "ReceiveOld"},
|
||||
{2, nullptr, "ExecuteCommandListOld"},
|
||||
{10, C<&I2CSession::Send>, "Send"},
|
||||
{11, nullptr, "Receive"},
|
||||
{12, nullptr, "ExecuteCommandList"},
|
||||
{13, nullptr, "SetRetryPolicy"},
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
~I2CSession() override = default;
|
||||
|
||||
Result Send(InBuffer<BufferAttr_HipcMapAlias> in_data, u32 transaction_option) {
|
||||
LOG_WARNING(Service, "(stubbed) topt={}", transaction_option);
|
||||
R_THROW(ResultUnknown);
|
||||
}
|
||||
};
|
||||
|
||||
enum class I2CDevice : u32 {
|
||||
ClassicController,
|
||||
Ftm3bd56,
|
||||
};
|
||||
|
||||
class I2C final : public ServiceFramework<I2C> {
|
||||
public:
|
||||
explicit I2C(Core::System& system_)
|
||||
: ServiceFramework{system_, "i2c"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "OpenSessionForDev"},
|
||||
{1, C<&I2C::OpenSession>, "OpenSession"},
|
||||
{2, nullptr, "HasDevice"},
|
||||
{3, nullptr, "HasDeviceForDev"},
|
||||
{4, nullptr, "OpenSession2"},
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
~I2C() override = default;
|
||||
|
||||
Result OpenSession(I2CDevice device, OutInterface<I2CSession> out_session) {
|
||||
LOG_DEBUG(Service, "(stubbed)");
|
||||
*out_session = std::make_shared<I2CSession>(system);
|
||||
R_SUCCEED();
|
||||
}
|
||||
};
|
||||
|
||||
void LoopProcess(Core::System& system) {
|
||||
auto server_manager = std::make_unique<ServerManager>(system);
|
||||
server_manager->RegisterNamedService("i2c", std::make_shared<I2C>(system));
|
||||
ServerManager::RunServer(std::move(server_manager));
|
||||
}
|
||||
|
||||
} // namespace Service::I2C
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::I2C {
|
||||
void LoopProcess(Core::System& system);
|
||||
} // namespace Service::I2C
|
||||
@@ -47,6 +47,8 @@ NvResult nvhost_ctrl_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8>
|
||||
return WrapFixed(this, &nvhost_ctrl_gpu::FlushL2, input, output);
|
||||
case 0x14:
|
||||
return WrapFixed(this, &nvhost_ctrl_gpu::GetActiveSlotMask, input, output);
|
||||
case 0x15:
|
||||
return WrapFixed(this, &nvhost_ctrl_gpu::PmuGetGpuLoad, input, output);
|
||||
case 0x1c:
|
||||
return WrapFixed(this, &nvhost_ctrl_gpu::GetGpuTime, input, output);
|
||||
default:
|
||||
@@ -234,6 +236,12 @@ NvResult nvhost_ctrl_gpu::GetActiveSlotMask(IoctlActiveSlotMask& params) {
|
||||
return NvResult::Success;
|
||||
}
|
||||
|
||||
NvResult nvhost_ctrl_gpu::PmuGetGpuLoad(IoctlPmuGetLoad& params) {
|
||||
LOG_WARNING(Service_NVDRV, "(stubbed) called");
|
||||
params.pmu_gpu_load = 100;
|
||||
return NvResult::Success;
|
||||
}
|
||||
|
||||
NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(IoctlZcullGetCtxSize& params) {
|
||||
LOG_DEBUG(Service_NVDRV, "called");
|
||||
params.size = 0x1;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
@@ -184,6 +184,11 @@ private:
|
||||
};
|
||||
static_assert(sizeof(IoctlGetCpuTimeCorrelationInfo) == 264);
|
||||
|
||||
struct IoctlPmuGetLoad {
|
||||
u32 pmu_gpu_load;
|
||||
};
|
||||
static_assert(sizeof(IoctlPmuGetLoad) == 4);
|
||||
|
||||
NvResult GetCharacteristics1(IoctlCharacteristics& params);
|
||||
NvResult GetCharacteristics3(IoctlCharacteristics& params,
|
||||
std::span<IoctlGpuCharacteristics> gpu_characteristics);
|
||||
@@ -192,6 +197,7 @@ private:
|
||||
NvResult GetTPCMasks3(IoctlGpuGetTpcMasksArgs& params, std::span<u32> tpc_mask);
|
||||
|
||||
NvResult GetActiveSlotMask(IoctlActiveSlotMask& params);
|
||||
NvResult PmuGetGpuLoad(IoctlPmuGetLoad& params);
|
||||
NvResult ZCullGetCtxSize(IoctlZcullGetCtxSize& params);
|
||||
NvResult ZCullGetInfo(IoctlNvgpuGpuZcullGetInfoArgs& params);
|
||||
NvResult ZBCSetTable(IoctlZbcSetTable& params);
|
||||
|
||||
@@ -25,18 +25,20 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> in
|
||||
switch (command.group) {
|
||||
case 0x0:
|
||||
switch (command.cmd) {
|
||||
case 0x1:
|
||||
case 0x01:
|
||||
return WrapFixedVariable(this, &nvhost_nvdec::Submit, input, output, fd);
|
||||
case 0x2:
|
||||
case 0x02:
|
||||
return WrapFixed(this, &nvhost_nvdec::GetSyncpoint, input, output);
|
||||
case 0x3:
|
||||
case 0x03:
|
||||
return WrapFixed(this, &nvhost_nvdec::GetWaitbase, input, output);
|
||||
case 0x7:
|
||||
case 0x07:
|
||||
return WrapFixed(this, &nvhost_nvdec::SetSubmitTimeout, input, output);
|
||||
case 0x9:
|
||||
case 0x09:
|
||||
return WrapFixedVariable(this, &nvhost_nvdec::MapBuffer, input, output, fd);
|
||||
case 0xa:
|
||||
case 0x0a:
|
||||
return WrapFixedVariable(this, &nvhost_nvdec::UnmapBuffer, input, output);
|
||||
case 0x23:
|
||||
return WrapFixed(this, &nvhost_nvdec::GetClkRate, input, output);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -168,6 +168,13 @@ NvResult nvhost_nvdec_common::SetSubmitTimeout(u32 timeout) {
|
||||
return NvResult::Success;
|
||||
}
|
||||
|
||||
NvResult nvhost_nvdec_common::GetClkRate(IoctlGetClkRate& params) {
|
||||
LOG_WARNING(Service_NVDRV, "(STUBBED) called");
|
||||
params.clk_rate = 614400000;
|
||||
params.module_id = 0;
|
||||
return NvResult::Success;
|
||||
}
|
||||
|
||||
Kernel::KEvent* nvhost_nvdec_common::QueryEvent(u32 event_id) {
|
||||
LOG_CRITICAL(Service_NVDRV, "Unknown HOSTX1 Event {}", event_id);
|
||||
return nullptr;
|
||||
|
||||
@@ -111,6 +111,12 @@ protected:
|
||||
};
|
||||
static_assert(sizeof(IoctlMapBuffer) == 0x0C, "IoctlMapBuffer is incorrect size");
|
||||
|
||||
struct IoctlGetClkRate {
|
||||
u32_le clk_rate{};
|
||||
u32_le module_id{};
|
||||
};
|
||||
static_assert(sizeof(IoctlGetClkRate) == 8);
|
||||
|
||||
/// Ioctl command implementations
|
||||
NvResult SetNVMAPfd(IoctlSetNvmapFD&);
|
||||
NvResult Submit(IoctlSubmit& params, std::span<u8> input, DeviceFD fd);
|
||||
@@ -119,6 +125,7 @@ protected:
|
||||
NvResult MapBuffer(IoctlMapBuffer& params, std::span<MapBufferEntry> entries, DeviceFD fd);
|
||||
NvResult UnmapBuffer(IoctlMapBuffer& params, std::span<MapBufferEntry> entries);
|
||||
NvResult SetSubmitTimeout(u32 timeout);
|
||||
NvResult GetClkRate(IoctlGetClkRate& params);
|
||||
|
||||
Kernel::KEvent* QueryEvent(u32 event_id) override;
|
||||
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "common/common_funcs.h"
|
||||
#include "common/device_power_state.h"
|
||||
#include "common/logging.h"
|
||||
#include "core/core.h"
|
||||
#include "core/hle/kernel/k_event.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/kernel_helpers.h"
|
||||
#include "core/hle/service/ptm/psm.h"
|
||||
@@ -134,12 +136,12 @@ PSM::PSM(Core::System& system_) : ServiceFramework{system_, "psm"} {
|
||||
{9, nullptr, "DisableEnoughPowerChargeEmulation"},
|
||||
{10, nullptr, "EnableFastBatteryCharging"},
|
||||
{11, nullptr, "DisableFastBatteryCharging"},
|
||||
{12, nullptr, "GetBatteryVoltageState"},
|
||||
{12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"},
|
||||
{13, nullptr, "GetRawBatteryChargePercentage"},
|
||||
{14, nullptr, "IsEnoughPowerSupplied"},
|
||||
{15, nullptr, "GetBatteryAgePercentage"},
|
||||
{15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"},
|
||||
{16, nullptr, "GetBatteryChargeInfoEvent"},
|
||||
{17, nullptr, "GetBatteryChargeInfoFields"},
|
||||
{17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"},
|
||||
{18, nullptr, "GetBatteryChargeCalibratedEvent"},
|
||||
};
|
||||
// clang-format on
|
||||
@@ -187,4 +189,64 @@ void PSM::OpenSession(HLERequestContext& ctx) {
|
||||
rb.PushIpcInterface<IPsmSession>(system);
|
||||
}
|
||||
|
||||
void PSM::GetBatteryVoltageState(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service_PTM, "(stubbed)");
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushRaw<u32>(0); //
|
||||
}
|
||||
|
||||
void PSM::GetBatteryAgePercentage(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service_PTM, "(stubbed)");
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushRaw<f64>(1.f);
|
||||
}
|
||||
|
||||
struct BatteryChargeInfoFields {
|
||||
u32 input_current_limit; //mA
|
||||
u32 boost_mode_current_limit;
|
||||
u32 fast_charge_current_limit;
|
||||
u32 charge_voltage_limit;
|
||||
u32 charger_type;
|
||||
u8 hi2_mode;
|
||||
u8 battery_charging;
|
||||
INSERT_PADDING_BYTES_NOINIT(2);
|
||||
u32 vdd50_state;
|
||||
u32 temperature_celcius;
|
||||
f32 battery_charge_percentage;
|
||||
u32 battery_charge_milli_voltage;
|
||||
f32 battery_age_percentage;
|
||||
u32 usb_power_role;
|
||||
u32 usb_charger_type;
|
||||
u32 charger_input_voltage_limit;
|
||||
u32 charger_input_current_limit;
|
||||
u8 fast_battery_charging;
|
||||
u8 controller_power_supply;
|
||||
u8 otg_request;
|
||||
INSERT_PADDING_BYTES_NOINIT(1);
|
||||
INSERT_PADDING_BYTES_NOINIT(0x14); //[+17.0.0]
|
||||
};
|
||||
static_assert(sizeof(struct BatteryChargeInfoFields) == 0x54);
|
||||
void PSM::GetBatteryChargeInfoFields(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service_PTM, "called");
|
||||
Common::PowerStatus power_status = Common::GetPowerStatus();
|
||||
|
||||
BatteryChargeInfoFields r{};
|
||||
r.battery_charge_percentage = f32(power_status.percentage); //100%
|
||||
r.battery_age_percentage = f32(power_status.percentage); //100%
|
||||
r.battery_charging = power_status.charging ? 1 : 0;
|
||||
r.charger_type = u32(power_status.has_battery && power_status.charging
|
||||
? ChargerType::RegularCharger : ChargerType::Unplugged);
|
||||
r.charger_input_voltage_limit = 100;
|
||||
r.charger_input_voltage_limit = 100;
|
||||
r.input_current_limit = 100;
|
||||
r.boost_mode_current_limit = 100;
|
||||
r.fast_charge_current_limit = 100;
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushRaw<BatteryChargeInfoFields>(r);
|
||||
}
|
||||
|
||||
} // namespace Service::PTM
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
@@ -22,10 +22,12 @@ private:
|
||||
LowPowerCharger = 2,
|
||||
Unknown = 3,
|
||||
};
|
||||
|
||||
void GetBatteryChargePercentage(HLERequestContext& ctx);
|
||||
void GetChargerType(HLERequestContext& ctx);
|
||||
void OpenSession(HLERequestContext& ctx);
|
||||
void GetBatteryVoltageState(HLERequestContext& ctx);
|
||||
void GetBatteryAgePercentage(HLERequestContext& ctx);
|
||||
void GetBatteryChargeInfoFields(HLERequestContext& ctx);
|
||||
};
|
||||
|
||||
} // namespace Service::PTM
|
||||
|
||||
@@ -21,10 +21,13 @@ namespace Service::RO {
|
||||
|
||||
namespace {
|
||||
|
||||
// Convenience definitions.
|
||||
constexpr size_t MaxSessions = 0x3;
|
||||
constexpr size_t MaxNrrInfos = 0x40;
|
||||
constexpr size_t MaxNroInfos = 0x40;
|
||||
// Atmosphere defines as follows:
|
||||
// Sessions = 0x03, NrrInfos = 0x40, NroInfos = 0x40
|
||||
// This may not be enough for some mods (plugin.nro dependant games) like SSBU
|
||||
// Suppose someone loads like 64 plugins of these, now what?
|
||||
constexpr size_t MaxSessions = 0x03; // No change
|
||||
constexpr size_t MaxNrrInfos = 0x100; // Up to 256 NRRs
|
||||
constexpr size_t MaxNroInfos = 0x100; // Up to 256 NROs
|
||||
|
||||
constexpr u64 InvalidProcessId = 0xffffffffffffffffULL;
|
||||
constexpr u64 InvalidContextId = 0xffffffffffffffffULL;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
@@ -25,8 +25,10 @@
|
||||
#include "core/hle/service/friend/friend.h"
|
||||
#include "core/hle/service/glue/glue.h"
|
||||
#include "core/hle/service/grc/grc.h"
|
||||
#include "core/hle/service/gpio/gpio.h"
|
||||
#include "core/hle/service/hid/hid.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/i2c/i2c.h"
|
||||
#include "core/hle/service/jit/jit.h"
|
||||
#include "core/hle/service/lbl/lbl.h"
|
||||
#include "core/hle/service/ldn/ldn.h"
|
||||
@@ -144,7 +146,9 @@ Services::Services(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system
|
||||
{"ro", &RO::LoopProcess},
|
||||
{"spl", &SPL::LoopProcess},
|
||||
{"ssl", &SSL::LoopProcess},
|
||||
{"usb", &USB::LoopProcess}
|
||||
{"usb", &USB::LoopProcess},
|
||||
{"i2c", &I2C::LoopProcess},
|
||||
{"gpio", &GPIO::LoopProcess},
|
||||
})
|
||||
kernel.RunOnGuestCoreProcess(std::string(e.first), [&system, f = e.second] { f(system); });
|
||||
}
|
||||
|
||||
@@ -142,10 +142,10 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
|
||||
{22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"},
|
||||
{23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"},
|
||||
{24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"},
|
||||
{25, nullptr, "GetConsoleInformationUploadFlag"},
|
||||
{26, nullptr, "SetConsoleInformationUploadFlag"},
|
||||
{27, nullptr, "GetAutomaticApplicationDownloadFlag"},
|
||||
{28, nullptr, "SetAutomaticApplicationDownloadFlag"},
|
||||
{25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"},
|
||||
{26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"},
|
||||
{27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"},
|
||||
{28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"},
|
||||
{29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"},
|
||||
{30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"},
|
||||
{31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"},
|
||||
@@ -160,8 +160,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
|
||||
{42, nullptr, "SetEdid"},
|
||||
{43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"},
|
||||
{44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"},
|
||||
{45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag> , "GetSpeakerAutoMuteFlag"},
|
||||
{46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag> , "SetSpeakerAutoMuteFlag"},
|
||||
{45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"},
|
||||
{46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"},
|
||||
{47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"},
|
||||
{48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"},
|
||||
{49, nullptr, "GetDataDeletionSettings"},
|
||||
@@ -180,8 +180,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
|
||||
{62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"},
|
||||
{63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"},
|
||||
{64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"},
|
||||
{65, nullptr, "GetUsb30EnableFlag"},
|
||||
{66, nullptr, "SetUsb30EnableFlag"},
|
||||
{65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"},
|
||||
{66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"},
|
||||
{67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"},
|
||||
{68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"},
|
||||
{69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"},
|
||||
@@ -1074,6 +1074,45 @@ Result ISystemSettingsServer::SetNfcEnableFlag(bool nfc_enable_flag) {
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::GetConsoleInformationUploadFlag(Out<bool> out_flag) {
|
||||
LOG_INFO(Service_SET, "called {}", m_system_settings.console_information_upload_flag);
|
||||
*out_flag = m_system_settings.console_information_upload_flag;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::SetConsoleInformationUploadFlag(bool flag) {
|
||||
LOG_INFO(Service_SET, "called {}", flag);
|
||||
m_system_settings.usb_30_enable_flag = flag;
|
||||
SetSaveNeeded();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::GetAutomaticApplicationDownloadFlag(Out<bool> out_flag) {
|
||||
LOG_INFO(Service_SET, "called {}", m_system_settings.usb_30_enable_flag);
|
||||
*out_flag = m_system_settings.automatic_application_download_flag;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::SetAutomaticApplicationDownloadFlag(bool flag) {
|
||||
LOG_INFO(Service_SET, "called {}", flag);
|
||||
m_system_settings.automatic_application_download_flag = flag;
|
||||
SetSaveNeeded();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::GetUsb30EnableFlag(Out<bool> out_usb30_enable_flag) {
|
||||
LOG_INFO(Service_SET, "called, usb30_enable_flag={}", m_system_settings.usb_30_enable_flag);
|
||||
*out_usb30_enable_flag = m_system_settings.usb_30_enable_flag;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::SetUsb30EnableFlag(bool usb30_enable_flag) {
|
||||
LOG_INFO(Service_SET, "called, usb30_enable_flag={}", usb30_enable_flag);
|
||||
m_system_settings.usb_30_enable_flag = usb30_enable_flag;
|
||||
SetSaveNeeded();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ISystemSettingsServer::GetSleepSettings(Out<SleepSettings> out_sleep_settings) {
|
||||
LOG_INFO(Service_SET, "called, flags={}, handheld_sleep_plan={}, console_sleep_plan={}",
|
||||
m_system_settings.sleep_settings.flags.raw,
|
||||
|
||||
@@ -109,6 +109,12 @@ public:
|
||||
Result SetPrimaryAlbumStorage(PrimaryAlbumStorage primary_album_storage);
|
||||
Result GetBatteryLot(Out<BatteryLot> out_battery_lot);
|
||||
Result GetSerialNumber(Out<SerialNumber> out_console_serial);
|
||||
Result GetConsoleInformationUploadFlag(Out<bool> out_flag);
|
||||
Result SetConsoleInformationUploadFlag(bool flag);
|
||||
Result GetAutomaticApplicationDownloadFlag(Out<bool> out_flag);
|
||||
Result SetAutomaticApplicationDownloadFlag(bool flag);
|
||||
Result GetUsb30EnableFlag(Out<bool> out_usb30_enable_flag);
|
||||
Result SetUsb30EnableFlag(bool usb30_enable_flag);
|
||||
Result GetNfcEnableFlag(Out<bool> out_nfc_enable_flag);
|
||||
Result SetNfcEnableFlag(bool nfc_enable_flag);
|
||||
Result GetSleepSettings(Out<SleepSettings> out_sleep_settings);
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -11,6 +14,7 @@
|
||||
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
||||
#include "core/hle/kernel/k_server_port.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
#include "core/hle/service/sm/sm.h"
|
||||
@@ -250,15 +254,37 @@ void SM::UnregisterService(HLERequestContext& ctx) {
|
||||
rb.Push(service_manager.UnregisterService(name));
|
||||
}
|
||||
|
||||
void SM::AtmosphereHasService(HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp{ctx};
|
||||
std::string name(PopServiceName(rp));
|
||||
LOG_WARNING(Service_SM, "(stubbed) called with name={}", name);
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
Kernel::KClientPort* out_client_port = nullptr;
|
||||
rb.Push(ResultSuccess);
|
||||
rb.Push<bool>(service_manager.GetServicePort(&out_client_port, name) == ResultSuccess);
|
||||
}
|
||||
|
||||
SM::SM(ServiceManager& service_manager_, Core::System& system_)
|
||||
: ServiceFramework{system_, "sm:", 4},
|
||||
service_manager{service_manager_}, kernel{system_.Kernel()} {
|
||||
: ServiceFramework{system_, "sm:", 4}
|
||||
, service_manager{service_manager_}
|
||||
, kernel{system_.Kernel()}
|
||||
{
|
||||
RegisterHandlers({
|
||||
{0, &SM::Initialize, "Initialize"},
|
||||
{1, &SM::GetServiceCmif, "GetService"},
|
||||
{2, &SM::RegisterServiceCmif, "RegisterService"},
|
||||
{3, &SM::UnregisterService, "UnregisterService"},
|
||||
{4, nullptr, "DetachClient"},
|
||||
// TODO: are these non-TIPC as well?
|
||||
{65000, nullptr, "AtmosphereInstallMitm"},
|
||||
{65001, nullptr, "AtmosphereUninstallMitm"},
|
||||
{65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
|
||||
{65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
|
||||
{65004, nullptr, "AtmosphereHasMitm"},
|
||||
{65005, nullptr, "AtmosphereWaitMitm"},
|
||||
{65006, nullptr, "AtmosphereDeclareFutureMitm"},
|
||||
{65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
|
||||
{65101, nullptr, "AtmosphereWaitService"},
|
||||
});
|
||||
RegisterHandlersTipc({
|
||||
{0, &SM::Initialize, "Initialize"},
|
||||
@@ -266,6 +292,15 @@ SM::SM(ServiceManager& service_manager_, Core::System& system_)
|
||||
{2, &SM::RegisterServiceTipc, "RegisterService"},
|
||||
{3, &SM::UnregisterService, "UnregisterService"},
|
||||
{4, nullptr, "DetachClient"},
|
||||
{65000, nullptr, "AtmosphereInstallMitm"},
|
||||
{65001, nullptr, "AtmosphereUninstallMitm"},
|
||||
{65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
|
||||
{65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
|
||||
{65004, nullptr, "AtmosphereHasMitm"},
|
||||
{65005, nullptr, "AtmosphereWaitMitm"},
|
||||
{65006, nullptr, "AtmosphereDeclareFutureMitm"},
|
||||
{65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
|
||||
{65101, nullptr, "AtmosphereWaitService"},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ private:
|
||||
void RegisterServiceCmif(HLERequestContext& ctx);
|
||||
void RegisterServiceTipc(HLERequestContext& ctx);
|
||||
void UnregisterService(HLERequestContext& ctx);
|
||||
void AtmosphereHasService(HLERequestContext& ctx);
|
||||
|
||||
Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx);
|
||||
void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count,
|
||||
|
||||
@@ -71,9 +71,10 @@ struct PatchCollection {
|
||||
std::array<s32, 13> module_patcher_indices{};
|
||||
};
|
||||
|
||||
AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile file_,
|
||||
bool override_update_)
|
||||
: AppLoader(std::move(file_)), override_update(override_update_), is_hbl(false) {
|
||||
AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile file_, bool override_update_)
|
||||
: AppLoader(std::move(file_))
|
||||
, override_update(override_update_)
|
||||
{
|
||||
const auto file_dir = file->GetContainingDirectory();
|
||||
|
||||
// Title ID
|
||||
@@ -124,9 +125,11 @@ AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys
|
||||
}
|
||||
|
||||
AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(
|
||||
FileSys::VirtualDir directory, bool override_update_, bool is_hbl_)
|
||||
: AppLoader(directory->GetFile("main")), dir(std::move(directory)),
|
||||
override_update(override_update_), is_hbl(is_hbl_) {}
|
||||
FileSys::VirtualDir directory, bool override_update_)
|
||||
: AppLoader(directory->GetFile("main"))
|
||||
, dir(std::move(directory))
|
||||
, override_update(override_update_)
|
||||
{}
|
||||
|
||||
FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::VirtualFile& dir_file) {
|
||||
if (FileSys::IsDirectoryExeFS(dir_file->GetContainingDirectory())) {
|
||||
@@ -232,7 +235,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
|
||||
? ::Settings::values.rng_seed.GetValue() : Common::Random::Random64(0)) << 12) & 0xfff000;
|
||||
|
||||
// Setup the process code layout
|
||||
if (process.LoadFromMetadata(metadata, code_size, fastmem_base, aslr_offset, is_hbl).IsError()) {
|
||||
if (process.LoadFromMetadata(metadata, code_size, fastmem_base, aslr_offset).IsError()) {
|
||||
return {ResultStatus::ErrorUnableToParseKernelMetadata, {}};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -22,13 +25,9 @@ namespace Loader {
|
||||
*/
|
||||
class AppLoader_DeconstructedRomDirectory final : public AppLoader {
|
||||
public:
|
||||
explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile main_file,
|
||||
bool override_update_ = false);
|
||||
|
||||
explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile main_file, bool override_update_ = false);
|
||||
// Overload to accept exefs directory. Must contain 'main' and 'main.npdm'
|
||||
explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualDir directory,
|
||||
bool override_update_ = false,
|
||||
bool is_hbl_ = false);
|
||||
explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualDir directory, bool override_update_ = false);
|
||||
|
||||
/**
|
||||
* Identifies whether or not the given file is a deconstructed ROM directory.
|
||||
@@ -63,7 +62,6 @@ private:
|
||||
std::string name;
|
||||
u64 title_id{};
|
||||
bool override_update;
|
||||
bool is_hbl;
|
||||
|
||||
Modules modules;
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user