Compare commits
184 Commits
android-20
...
android-22
Author | SHA1 | Date | |
---|---|---|---|
fbf15f5058 | |||
f10157485d | |||
89f733a518 | |||
95802bc5b5 | |||
680fcdac60 | |||
386325553b | |||
c98d0e185f | |||
7cc7d027f7 | |||
12e5293c73 | |||
22492b68b7 | |||
a12a26e19b | |||
2a2a1d98b3 | |||
6e92a7a149 | |||
4dfe9dd038 | |||
d57165df45 | |||
738e9a79a0 | |||
aaab11e36f | |||
8f848f43e9 | |||
a7c1306e2d | |||
e8be665f11 | |||
9ed82a280e | |||
817d916233 | |||
ffe3984353 | |||
ec734cb06c | |||
8292ba7ad6 | |||
2e65616761 | |||
07aa1a99fa | |||
6524f20de4 | |||
a0f7f2b309 | |||
5510b31972 | |||
ecea5ef757 | |||
a1ce45b0b1 | |||
9ba9780a96 | |||
73e7a259fd | |||
8e0a40434c | |||
68303ed601 | |||
8a146469c0 | |||
b1c2f791af | |||
182137a9a4 | |||
3155f4e96d | |||
dfb9fa0144 | |||
a7e9d7842d | |||
7de6b41030 | |||
2cc5c517cf | |||
c0775e74ec | |||
3acf35bb98 | |||
8ddfecfbae | |||
51f5a6f1f8 | |||
64fca24b32 | |||
ba4cee1812 | |||
06abf3205a | |||
adfdc9520a | |||
90cb852908 | |||
278dd589ec | |||
15e8791f9d | |||
498c9bd96a | |||
6c8df6af44 | |||
8e93537266 | |||
b8f16f3538 | |||
6a2532fe17 | |||
3655115105 | |||
5561a08d59 | |||
e687ca8735 | |||
0bf46cb1ee | |||
19a2f12692 | |||
6cc82fd430 | |||
72c897c49d | |||
077a50a547 | |||
820f1c8a16 | |||
b163757e1f | |||
2bc0132d0c | |||
b75401a2cb | |||
12e7ee2357 | |||
3ec41503e3 | |||
c770af9b12 | |||
2d8f80b65e | |||
6c4eb2733d | |||
d5e8c9d04f | |||
3f1290cee3 | |||
5a20d07c21 | |||
9f91d310c6 | |||
6527c0d2fc | |||
ce2eb6e8ee | |||
8b47465586 | |||
3065ab0fd8 | |||
a2407a2964 | |||
16b79df836 | |||
6a4b25699d | |||
da410506a4 | |||
c5e88c654e | |||
bd8635e26a | |||
4349cdba07 | |||
f2fb761bac | |||
59aee2b461 | |||
4d206d849e | |||
744c0173d1 | |||
55482ab5dc | |||
e56b44dee6 | |||
f2012e5aff | |||
4526fdaf64 | |||
bc22b4e782 | |||
f70821ce0d | |||
a774ff935c | |||
431df5ae93 | |||
677c2c2cd2 | |||
ee540c712c | |||
d23c4393fd | |||
b24a111136 | |||
91636deaaf | |||
68cbf67f4c | |||
645961613f | |||
53b321c945 | |||
975deb7528 | |||
2c049ae06d | |||
54372fdff5 | |||
c60ab6bbf6 | |||
cc09c265e1 | |||
0f9288e38d | |||
06fb7f90da | |||
e04368ad7c | |||
3e2d3548f2 | |||
eb9036d75b | |||
01a2d978eb | |||
6e67b25af9 | |||
e91667ba75 | |||
d45561ace0 | |||
0fdd6e8934 | |||
35794f4f18 | |||
b8be8dff69 | |||
bc317a9807 | |||
97ca160b08 | |||
1a3fc3724a | |||
7b01454d5f | |||
f3749394ac | |||
807f421752 | |||
e4915fb7d2 | |||
a76f6a2775 | |||
ba518f6899 | |||
ad4622da2c | |||
3b1c2896d9 | |||
fc5d76e6e2 | |||
5f9a45ada9 | |||
a120f8ff4d | |||
96833cd809 | |||
8649a80071 | |||
550cadbee4 | |||
8bd10473d6 | |||
8d708b0c79 | |||
beaab10c8f | |||
889c5d2705 | |||
17b0aac809 | |||
399220ddbc | |||
23e074ff14 | |||
59080a3d1d | |||
3a25a217e6 | |||
f854ffd015 | |||
961b5586a5 | |||
dd36d43ea1 | |||
c725f3c86c | |||
748465f5a5 | |||
04867e2456 | |||
32f623e029 | |||
b6c6534c30 | |||
beb438bb0b | |||
4b963ca8a5 | |||
648ed55fe6 | |||
23430e6772 | |||
0672847330 | |||
a874ab0133 | |||
590d9b7e1d | |||
b0bca0f8b0 | |||
d8f1ce2f76 | |||
9b11b9dce5 | |||
303cd31162 | |||
0adc09e0af | |||
96fd1348ae | |||
bad705f245 | |||
34a8d0cc8e | |||
0a2536a0df | |||
c85d7ccd79 | |||
7a9d1ad2f8 | |||
2f0418c101 | |||
e231b8b6f5 | |||
68fe1e3476 |
4
.github/workflows/verify.yml
vendored
4
.github/workflows/verify.yml
vendored
@ -73,7 +73,7 @@ jobs:
|
|||||||
build-mac:
|
build-mac:
|
||||||
name: 'test build (macos)'
|
name: 'test build (macos)'
|
||||||
needs: format
|
needs: format
|
||||||
runs-on: macos-13
|
runs-on: macos-14
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@ -87,7 +87,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
export Qt5_DIR="/usr/local/opt/qt@5/lib/cmake"
|
export Qt5_DIR="$(brew --prefix qt@5)/lib/cmake"
|
||||||
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
||||||
ninja
|
ninja
|
||||||
build-msvc:
|
build-msvc:
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -64,3 +64,6 @@
|
|||||||
[submodule "oaknut"]
|
[submodule "oaknut"]
|
||||||
path = externals/oaknut
|
path = externals/oaknut
|
||||||
url = https://github.com/merryhime/oaknut
|
url = https://github.com/merryhime/oaknut
|
||||||
|
[submodule "Vulkan-Utility-Libraries"]
|
||||||
|
path = externals/Vulkan-Utility-Libraries
|
||||||
|
url = https://github.com/KhronosGroup/Vulkan-Utility-Libraries.git
|
||||||
|
@ -155,3 +155,7 @@ License: MIT
|
|||||||
Files: externals/gamemode/*
|
Files: externals/gamemode/*
|
||||||
Copyright: Copyright 2017-2019 Feral Interactive
|
Copyright: Copyright 2017-2019 Feral Interactive
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
|
|
||||||
|
Files: src/android/app/debug.keystore
|
||||||
|
Copyright: 2023 yuzu Emulator Project
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
@ -36,6 +36,8 @@ option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" "${WIN32}")
|
|||||||
|
|
||||||
option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON)
|
option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON)
|
||||||
|
|
||||||
|
option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ON)
|
||||||
|
|
||||||
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
||||||
|
|
||||||
option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
|
option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
|
||||||
@ -308,6 +310,10 @@ if (NOT YUZU_USE_EXTERNAL_VULKAN_HEADERS)
|
|||||||
find_package(Vulkan 1.3.274 REQUIRED)
|
find_package(Vulkan 1.3.274 REQUIRED)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (NOT YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES)
|
||||||
|
find_package(VulkanUtilityLibraries REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_LIBUSB)
|
if (ENABLE_LIBUSB)
|
||||||
find_package(libusb 1.0.24 MODULE)
|
find_package(libusb 1.0.24 MODULE)
|
||||||
endif()
|
endif()
|
||||||
@ -316,6 +322,10 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
|||||||
find_package(xbyak 6 CONFIG)
|
find_package(xbyak 6 CONFIG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (ARCHITECTURE_arm64)
|
||||||
|
find_package(oaknut 2.0.1 CONFIG)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
|
if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
|
||||||
find_package(dynarmic 6.4.0 CONFIG)
|
find_package(dynarmic 6.4.0 CONFIG)
|
||||||
endif()
|
endif()
|
||||||
|
@ -2,18 +2,20 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
find_path(SimpleIni_INCLUDE_DIR SimpleIni.h)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package_handle_standard_args(SimpleIni
|
|
||||||
REQUIRED_VARS SimpleIni_INCLUDE_DIR
|
|
||||||
)
|
|
||||||
|
|
||||||
if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni)
|
find_package(SimpleIni QUIET CONFIG)
|
||||||
add_library(SimpleIni::SimpleIni INTERFACE IMPORTED)
|
if (SimpleIni_CONSIDERED_CONFIGS)
|
||||||
set_target_properties(SimpleIni::SimpleIni PROPERTIES
|
find_package_handle_standard_args(SimpleIni CONFIG_MODE)
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${SimpleIni_INCLUDE_DIR}"
|
else()
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
pkg_search_module(SIMPLEINI QUIET IMPORTED_TARGET simpleini)
|
||||||
|
find_package_handle_standard_args(SimpleIni
|
||||||
|
REQUIRED_VARS SIMPLEINI_INCLUDEDIR
|
||||||
|
VERSION_VAR SIMPLEINI_VERSION
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
mark_as_advanced(SimpleIni_INCLUDE_DIR)
|
if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni)
|
||||||
|
add_library(SimpleIni::SimpleIni ALIAS PkgConfig::SIMPLEINI)
|
||||||
|
endif()
|
||||||
|
13
README.md
13
README.md
@ -1,3 +1,16 @@
|
|||||||
|
| Pull Request | Commit | Title | Author | Merged? |
|
||||||
|
|----|----|----|----|----|
|
||||||
|
| [12461](https://github.com/yuzu-emu/yuzu-android//pull/12461) | [`e1f31cfe5`](https://github.com/yuzu-emu/yuzu-android//pull/12461/files) | Rework Nvdec and VIC to fix out-of-order videos, and speed up decoding. | [Kelebek1](https://github.com/Kelebek1/) | Yes |
|
||||||
|
| [12749](https://github.com/yuzu-emu/yuzu-android//pull/12749) | [`aad4b0d6f`](https://github.com/yuzu-emu/yuzu-android//pull/12749/files) | general: workarounds for SMMU syncing issues | [liamwhite](https://github.com/liamwhite/) | Yes |
|
||||||
|
| [12848](https://github.com/yuzu-emu/yuzu-android//pull/12848) | [`4afca6bf5`](https://github.com/yuzu-emu/yuzu-android//pull/12848/files) | service: capsrv: Migrate to new IPC | [german77](https://github.com/german77/) | Yes |
|
||||||
|
| [12874](https://github.com/yuzu-emu/yuzu-android//pull/12874) | [`f410cf681`](https://github.com/yuzu-emu/yuzu-android//pull/12874/files) | Revert "shader_recompiler: fix Offset operand usage for non-OpImage*Gather" | [liamwhite](https://github.com/liamwhite/) | Yes |
|
||||||
|
| [12875](https://github.com/yuzu-emu/yuzu-android//pull/12875) | [`5cb9fe781`](https://github.com/yuzu-emu/yuzu-android//pull/12875/files) | SwBlitter: Fix Pitch linear reading/writting | [FernandoS27](https://github.com/FernandoS27/) | Yes |
|
||||||
|
|
||||||
|
|
||||||
|
End of merge log. You can find the original README.md below the break.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||||
SPDX-License-Identifier: GPL-2.0-or-later
|
SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
13
externals/CMakeLists.txt
vendored
13
externals/CMakeLists.txt
vendored
@ -14,16 +14,17 @@ set(BUILD_SHARED_LIBS OFF)
|
|||||||
# Skip install rules for all externals
|
# Skip install rules for all externals
|
||||||
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
|
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
|
||||||
|
|
||||||
# xbyak
|
# Xbyak (also used by Dynarmic, so needs to be added first)
|
||||||
if ((ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) AND NOT TARGET xbyak::xbyak)
|
if ((ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) AND NOT TARGET xbyak::xbyak)
|
||||||
add_subdirectory(xbyak)
|
add_subdirectory(xbyak)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Dynarmic
|
# Oaknut (also used by Dynarmic, so needs to be added first)
|
||||||
if (ARCHITECTURE_arm64 AND NOT TARGET merry::oaknut)
|
if (ARCHITECTURE_arm64 AND NOT TARGET merry::oaknut)
|
||||||
add_subdirectory(oaknut)
|
add_subdirectory(oaknut)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Dynarmic
|
||||||
if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) AND NOT TARGET dynarmic::dynarmic)
|
if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) AND NOT TARGET dynarmic::dynarmic)
|
||||||
set(DYNARMIC_IGNORE_ASSERTS ON)
|
set(DYNARMIC_IGNORE_ASSERTS ON)
|
||||||
add_subdirectory(dynarmic)
|
add_subdirectory(dynarmic)
|
||||||
@ -154,6 +155,11 @@ if (YUZU_USE_EXTERNAL_VULKAN_HEADERS)
|
|||||||
add_subdirectory(Vulkan-Headers)
|
add_subdirectory(Vulkan-Headers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Vulkan-Utility-Libraries
|
||||||
|
if (YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES)
|
||||||
|
add_subdirectory(Vulkan-Utility-Libraries)
|
||||||
|
endif()
|
||||||
|
|
||||||
# TZDB (Time Zone Database)
|
# TZDB (Time Zone Database)
|
||||||
add_subdirectory(nx_tzdb)
|
add_subdirectory(nx_tzdb)
|
||||||
|
|
||||||
@ -178,6 +184,9 @@ if (NOT TARGET stb::headers)
|
|||||||
add_library(stb::headers ALIAS stb)
|
add_library(stb::headers ALIAS stb)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_library(tz tz/tz/tz.cpp)
|
||||||
|
target_include_directories(tz PUBLIC ./tz)
|
||||||
|
|
||||||
add_library(bc_decoder bc_decoder/bc_decoder.cpp)
|
add_library(bc_decoder bc_decoder/bc_decoder.cpp)
|
||||||
target_include_directories(bc_decoder PUBLIC ./bc_decoder)
|
target_include_directories(bc_decoder PUBLIC ./bc_decoder)
|
||||||
|
|
||||||
|
1
externals/Vulkan-Utility-Libraries
vendored
Submodule
1
externals/Vulkan-Utility-Libraries
vendored
Submodule
Submodule externals/Vulkan-Utility-Libraries added at 524f8910d0
2
externals/dynarmic
vendored
2
externals/dynarmic
vendored
Submodule externals/dynarmic updated: 0df09e2f6b...ca0e264f4f
2
externals/nx_tzdb/CMakeLists.txt
vendored
2
externals/nx_tzdb/CMakeLists.txt
vendored
@ -32,7 +32,7 @@ set(NX_TZDB_ARCHIVE "${CMAKE_CURRENT_BINARY_DIR}/${NX_TZDB_VERSION}.zip")
|
|||||||
|
|
||||||
set(NX_TZDB_ROMFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb")
|
set(NX_TZDB_ROMFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb")
|
||||||
|
|
||||||
if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ARCHIVE})
|
if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ROMFS_DIR})
|
||||||
set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip")
|
set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip")
|
||||||
|
|
||||||
message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...")
|
message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...")
|
||||||
|
4
externals/nx_tzdb/NxTzdbCreateHeader.cmake
vendored
4
externals/nx_tzdb/NxTzdbCreateHeader.cmake
vendored
@ -11,6 +11,10 @@ execute_process(
|
|||||||
WORKING_DIRECTORY ${ZONE_PATH}
|
WORKING_DIRECTORY ${ZONE_PATH}
|
||||||
OUTPUT_VARIABLE FILE_LIST)
|
OUTPUT_VARIABLE FILE_LIST)
|
||||||
|
|
||||||
|
if (NOT FILE_LIST)
|
||||||
|
message(FATAL_ERROR "No timezone files found in directory ${ZONE_PATH}, did the download fail?")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(DIRECTORY_NAME ${HEADER_NAME})
|
set(DIRECTORY_NAME ${HEADER_NAME})
|
||||||
|
|
||||||
set(FILE_DATA "")
|
set(FILE_DATA "")
|
||||||
|
2
externals/oaknut
vendored
2
externals/oaknut
vendored
Submodule externals/oaknut updated: 918bd94f02...9d091109de
1636
externals/tz/tz/tz.cpp
vendored
Normal file
1636
externals/tz/tz/tz.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
81
externals/tz/tz/tz.h
vendored
Normal file
81
externals/tz/tz/tz.h
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-FileCopyrightText: 1996 Arthur David Olson
|
||||||
|
// SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <limits>
|
||||||
|
#include <span>
|
||||||
|
#include <array>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
namespace Tz {
|
||||||
|
using u8 = uint8_t;
|
||||||
|
using s8 = int8_t;
|
||||||
|
using u16 = uint16_t;
|
||||||
|
using s16 = int16_t;
|
||||||
|
using u32 = uint32_t;
|
||||||
|
using s32 = int32_t;
|
||||||
|
using u64 = uint64_t;
|
||||||
|
using s64 = int64_t;
|
||||||
|
|
||||||
|
constexpr size_t TZ_MAX_TIMES = 1000;
|
||||||
|
constexpr size_t TZ_MAX_TYPES = 128;
|
||||||
|
constexpr size_t TZ_MAX_CHARS = 50;
|
||||||
|
constexpr size_t MY_TZNAME_MAX = 255;
|
||||||
|
constexpr size_t TZNAME_MAXIMUM = 255;
|
||||||
|
constexpr size_t TZ_MAX_LEAPS = 50;
|
||||||
|
constexpr s64 TIME_T_MAX = std::numeric_limits<s64>::max();
|
||||||
|
constexpr s64 TIME_T_MIN = std::numeric_limits<s64>::min();
|
||||||
|
constexpr size_t CHARS_EXTRA = 3;
|
||||||
|
constexpr size_t MAX_ZONE_CHARS = std::max(TZ_MAX_CHARS + CHARS_EXTRA, sizeof("UTC"));
|
||||||
|
constexpr size_t MAX_TZNAME_CHARS = 2 * (MY_TZNAME_MAX + 1);
|
||||||
|
|
||||||
|
struct ttinfo {
|
||||||
|
s32 tt_utoff;
|
||||||
|
bool tt_isdst;
|
||||||
|
s32 tt_desigidx;
|
||||||
|
bool tt_ttisstd;
|
||||||
|
bool tt_ttisut;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(ttinfo) == 0x10, "ttinfo has the wrong size!");
|
||||||
|
|
||||||
|
struct Rule {
|
||||||
|
s32 timecnt;
|
||||||
|
s32 typecnt;
|
||||||
|
s32 charcnt;
|
||||||
|
bool goback;
|
||||||
|
bool goahead;
|
||||||
|
std::array <u8, 0x2> padding0;
|
||||||
|
std::array<s64, TZ_MAX_TIMES> ats;
|
||||||
|
std::array<u8, TZ_MAX_TIMES> types;
|
||||||
|
std::array<ttinfo, TZ_MAX_TYPES> ttis;
|
||||||
|
std::array<char, std::max(MAX_ZONE_CHARS, MAX_TZNAME_CHARS)> chars;
|
||||||
|
s32 defaulttype;
|
||||||
|
std::array <u8, 0x12C4> padding1;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Rule) == 0x4000, "Rule has the wrong size!");
|
||||||
|
|
||||||
|
struct CalendarTimeInternal {
|
||||||
|
s32 tm_sec;
|
||||||
|
s32 tm_min;
|
||||||
|
s32 tm_hour;
|
||||||
|
s32 tm_mday;
|
||||||
|
s32 tm_mon;
|
||||||
|
s32 tm_year;
|
||||||
|
s32 tm_wday;
|
||||||
|
s32 tm_yday;
|
||||||
|
s32 tm_isdst;
|
||||||
|
std::array<char, 16> tm_zone;
|
||||||
|
s32 tm_utoff;
|
||||||
|
s32 time_index;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(CalendarTimeInternal) == 0x3C, "CalendarTimeInternal has the wrong size!");
|
||||||
|
|
||||||
|
s32 ParseTimeZoneBinary(Rule& out_rule, std::span<const u8> binary);
|
||||||
|
|
||||||
|
bool localtime_rz(CalendarTimeInternal* tmp, Rule const* sp, time_t* timep);
|
||||||
|
u32 mktime_tzname(time_t* out_time, Rule const* sp, CalendarTimeInternal* tmp);
|
||||||
|
|
||||||
|
} // namespace Tz
|
@ -82,8 +82,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
|
val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
|
||||||
if (keystoreFile != null) {
|
signingConfigs {
|
||||||
signingConfigs {
|
if (keystoreFile != null) {
|
||||||
create("release") {
|
create("release") {
|
||||||
storeFile = file(keystoreFile)
|
storeFile = file(keystoreFile)
|
||||||
storePassword = System.getenv("ANDROID_KEYSTORE_PASS")
|
storePassword = System.getenv("ANDROID_KEYSTORE_PASS")
|
||||||
@ -91,6 +91,12 @@ android {
|
|||||||
keyPassword = System.getenv("ANDROID_KEYSTORE_PASS")
|
keyPassword = System.getenv("ANDROID_KEYSTORE_PASS")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
create("default") {
|
||||||
|
storeFile = file("$projectDir/debug.keystore")
|
||||||
|
storePassword = "android"
|
||||||
|
keyAlias = "androiddebugkey"
|
||||||
|
keyPassword = "android"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define build types, which are orthogonal to product flavors.
|
// Define build types, which are orthogonal to product flavors.
|
||||||
@ -101,7 +107,7 @@ android {
|
|||||||
signingConfig = if (keystoreFile != null) {
|
signingConfig = if (keystoreFile != null) {
|
||||||
signingConfigs.getByName("release")
|
signingConfigs.getByName("release")
|
||||||
} else {
|
} else {
|
||||||
signingConfigs.getByName("debug")
|
signingConfigs.getByName("default")
|
||||||
}
|
}
|
||||||
|
|
||||||
resValue("string", "app_name_suffixed", "yuzu")
|
resValue("string", "app_name_suffixed", "yuzu")
|
||||||
@ -118,7 +124,7 @@ android {
|
|||||||
register("relWithDebInfo") {
|
register("relWithDebInfo") {
|
||||||
isDefault = true
|
isDefault = true
|
||||||
resValue("string", "app_name_suffixed", "yuzu Debug Release")
|
resValue("string", "app_name_suffixed", "yuzu Debug Release")
|
||||||
signingConfig = signingConfigs.getByName("debug")
|
signingConfig = signingConfigs.getByName("default")
|
||||||
isMinifyEnabled = true
|
isMinifyEnabled = true
|
||||||
isDebuggable = true
|
isDebuggable = true
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
@ -133,6 +139,7 @@ android {
|
|||||||
// Signed by debug key disallowing distribution on Play Store.
|
// Signed by debug key disallowing distribution on Play Store.
|
||||||
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
|
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
|
||||||
debug {
|
debug {
|
||||||
|
signingConfig = signingConfigs.getByName("default")
|
||||||
resValue("string", "app_name_suffixed", "yuzu Debug")
|
resValue("string", "app_name_suffixed", "yuzu Debug")
|
||||||
isDebuggable = true
|
isDebuggable = true
|
||||||
isJniDebuggable = true
|
isJniDebuggable = true
|
||||||
|
BIN
src/android/app/debug.keystore
Normal file
BIN
src/android/app/debug.keystore
Normal file
Binary file not shown.
@ -23,6 +23,7 @@ import org.yuzu.yuzu_emu.utils.Log
|
|||||||
import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable
|
import org.yuzu.yuzu_emu.utils.SerializableHelper.serializable
|
||||||
import org.yuzu.yuzu_emu.model.InstallResult
|
import org.yuzu.yuzu_emu.model.InstallResult
|
||||||
import org.yuzu.yuzu_emu.model.Patch
|
import org.yuzu.yuzu_emu.model.Patch
|
||||||
|
import org.yuzu.yuzu_emu.model.GameVerificationResult
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class which contains methods that interact
|
* Class which contains methods that interact
|
||||||
@ -260,7 +261,7 @@ object NativeLibrary {
|
|||||||
/**
|
/**
|
||||||
* Begins emulation.
|
* Begins emulation.
|
||||||
*/
|
*/
|
||||||
external fun run(path: String?)
|
external fun run(path: String?, programIndex: Int, frontendInitiated: Boolean)
|
||||||
|
|
||||||
// Surface Handling
|
// Surface Handling
|
||||||
external fun surfaceChanged(surf: Surface?)
|
external fun surfaceChanged(surf: Surface?)
|
||||||
@ -302,6 +303,11 @@ object NativeLibrary {
|
|||||||
*/
|
*/
|
||||||
external fun getCpuBackend(): String
|
external fun getCpuBackend(): String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current GPU Driver.
|
||||||
|
*/
|
||||||
|
external fun getGpuDriver(): String
|
||||||
|
|
||||||
external fun applySettings()
|
external fun applySettings()
|
||||||
|
|
||||||
external fun logSettings()
|
external fun logSettings()
|
||||||
@ -483,6 +489,12 @@ object NativeLibrary {
|
|||||||
sEmulationActivity.get()!!.onEmulationStopped(status)
|
sEmulationActivity.get()!!.onEmulationStopped(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
@JvmStatic
|
||||||
|
fun onProgramChanged(programIndex: Int) {
|
||||||
|
sEmulationActivity.get()!!.onProgramChanged(programIndex)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the Yuzu version, Android version and, CPU.
|
* Logs the Yuzu version, Android version and, CPU.
|
||||||
*/
|
*/
|
||||||
@ -564,6 +576,26 @@ object NativeLibrary {
|
|||||||
*/
|
*/
|
||||||
external fun removeMod(programId: String, name: String)
|
external fun removeMod(programId: String, name: String)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies all installed content
|
||||||
|
* @param callback UI callback for verification progress. Return true in the callback to cancel.
|
||||||
|
* @return Array of content that failed verification. Successful if empty.
|
||||||
|
*/
|
||||||
|
external fun verifyInstalledContents(
|
||||||
|
callback: (max: Long, progress: Long) -> Boolean
|
||||||
|
): Array<String>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies the contents of a game
|
||||||
|
* @param path String path to a game
|
||||||
|
* @param callback UI callback for verification progress. Return true in the callback to cancel.
|
||||||
|
* @return Int that is meant to be converted to a [GameVerificationResult]
|
||||||
|
*/
|
||||||
|
external fun verifyGameContents(
|
||||||
|
path: String,
|
||||||
|
callback: (max: Long, progress: Long) -> Boolean
|
||||||
|
): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the save location for a specific game
|
* Gets the save location for a specific game
|
||||||
*
|
*
|
||||||
@ -593,6 +625,11 @@ object NativeLibrary {
|
|||||||
*/
|
*/
|
||||||
external fun clearFilesystemProvider()
|
external fun clearFilesystemProvider()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if all necessary keys are present for decryption
|
||||||
|
*/
|
||||||
|
external fun areKeysPresent(): Boolean
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Button type for use in onTouchEvent
|
* Button type for use in onTouchEvent
|
||||||
*/
|
*/
|
||||||
|
@ -76,7 +76,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
stopForegroundService(this)
|
stopForegroundService(this)
|
||||||
emulationViewModel.clear()
|
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +192,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
return super.dispatchKeyEvent(event)
|
return super.dispatchKeyEvent(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (emulationViewModel.drawerOpen.value) {
|
||||||
|
return super.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
return InputHandler.dispatchKeyEvent(event)
|
return InputHandler.dispatchKeyEvent(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,6 +206,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
return super.dispatchGenericMotionEvent(event)
|
return super.dispatchGenericMotionEvent(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (emulationViewModel.drawerOpen.value) {
|
||||||
|
return super.dispatchGenericMotionEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
// Don't attempt to do anything if we are disconnecting a device.
|
// Don't attempt to do anything if we are disconnecting a device.
|
||||||
if (event.actionMasked == MotionEvent.ACTION_CANCEL) {
|
if (event.actionMasked == MotionEvent.ACTION_CANCEL) {
|
||||||
return true
|
return true
|
||||||
@ -438,9 +445,14 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onEmulationStopped(status: Int) {
|
fun onEmulationStopped(status: Int) {
|
||||||
if (status == 0) {
|
if (status == 0 && emulationViewModel.programChanged.value == -1) {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
emulationViewModel.setEmulationStopped(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onProgramChanged(programIndex: Int) {
|
||||||
|
emulationViewModel.setProgramChanged(programIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startMotionSensorListener() {
|
private fun startMotionSensorListener() {
|
||||||
|
@ -14,15 +14,20 @@ import androidx.recyclerview.widget.RecyclerView
|
|||||||
* Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate
|
* Generic adapter that implements an [AsyncDifferConfig] and covers some of the basic boilerplate
|
||||||
* code used in every [RecyclerView].
|
* code used in every [RecyclerView].
|
||||||
* Type assigned to [Model] must inherit from [Object] in order to be compared properly.
|
* Type assigned to [Model] must inherit from [Object] in order to be compared properly.
|
||||||
|
* @param exact Decides whether each item will be compared by reference or by their contents
|
||||||
*/
|
*/
|
||||||
abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>> :
|
abstract class AbstractDiffAdapter<Model : Any, Holder : AbstractViewHolder<Model>>(
|
||||||
ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>()).build()) {
|
exact: Boolean = true
|
||||||
|
) : ListAdapter<Model, Holder>(AsyncDifferConfig.Builder(DiffCallback<Model>(exact)).build()) {
|
||||||
override fun onBindViewHolder(holder: Holder, position: Int) =
|
override fun onBindViewHolder(holder: Holder, position: Int) =
|
||||||
holder.bind(currentList[position])
|
holder.bind(currentList[position])
|
||||||
|
|
||||||
private class DiffCallback<Model> : DiffUtil.ItemCallback<Model>() {
|
private class DiffCallback<Model>(val exact: Boolean) : DiffUtil.ItemCallback<Model>() {
|
||||||
override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {
|
override fun areItemsTheSame(oldItem: Model & Any, newItem: Model & Any): Boolean {
|
||||||
return oldItem === newItem
|
if (exact) {
|
||||||
|
return oldItem === newItem
|
||||||
|
}
|
||||||
|
return oldItem == newItem
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("DiffUtilEquals")
|
@SuppressLint("DiffUtilEquals")
|
||||||
|
@ -7,6 +7,7 @@ import android.text.TextUtils
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding
|
import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
|
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
|
||||||
import org.yuzu.yuzu_emu.model.Driver
|
import org.yuzu.yuzu_emu.model.Driver
|
||||||
@ -57,13 +58,9 @@ class DriverAdapter(private val driverViewModel: DriverViewModel) :
|
|||||||
title.text = model.title
|
title.text = model.title
|
||||||
version.text = model.version
|
version.text = model.version
|
||||||
description.text = model.description
|
description.text = model.description
|
||||||
if (model.description.isNotEmpty()) {
|
if (model.title != binding.root.context.getString(R.string.system_gpu_driver)) {
|
||||||
version.visibility = View.VISIBLE
|
|
||||||
description.visibility = View.VISIBLE
|
|
||||||
buttonDelete.visibility = View.VISIBLE
|
buttonDelete.visibility = View.VISIBLE
|
||||||
} else {
|
} else {
|
||||||
version.visibility = View.GONE
|
|
||||||
description.visibility = View.GONE
|
|
||||||
buttonDelete.visibility = View.GONE
|
buttonDelete.visibility = View.GONE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,6 @@
|
|||||||
|
|
||||||
package org.yuzu.yuzu_emu.adapters
|
package org.yuzu.yuzu_emu.adapters
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.drawable.LayerDrawable
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
@ -15,10 +12,6 @@ import android.widget.Toast
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.content.pm.ShortcutInfoCompat
|
import androidx.core.content.pm.ShortcutInfoCompat
|
||||||
import androidx.core.content.pm.ShortcutManagerCompat
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
import androidx.core.content.res.ResourcesCompat
|
|
||||||
import androidx.core.graphics.drawable.IconCompat
|
|
||||||
import androidx.core.graphics.drawable.toBitmap
|
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
@ -30,7 +23,6 @@ import kotlinx.coroutines.withContext
|
|||||||
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
import org.yuzu.yuzu_emu.activities.EmulationActivity
|
|
||||||
import org.yuzu.yuzu_emu.databinding.CardGameBinding
|
import org.yuzu.yuzu_emu.databinding.CardGameBinding
|
||||||
import org.yuzu.yuzu_emu.model.Game
|
import org.yuzu.yuzu_emu.model.Game
|
||||||
import org.yuzu.yuzu_emu.model.GamesViewModel
|
import org.yuzu.yuzu_emu.model.GamesViewModel
|
||||||
@ -38,7 +30,7 @@ import org.yuzu.yuzu_emu.utils.GameIconUtils
|
|||||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
|
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
|
||||||
|
|
||||||
class GameAdapter(private val activity: AppCompatActivity) :
|
class GameAdapter(private val activity: AppCompatActivity) :
|
||||||
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>() {
|
AbstractDiffAdapter<Game, GameAdapter.GameViewHolder>(exact = false) {
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder {
|
||||||
CardGameBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
CardGameBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
.also { return GameViewHolder(it) }
|
.also { return GameViewHolder(it) }
|
||||||
@ -89,36 +81,13 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||||||
)
|
)
|
||||||
.apply()
|
.apply()
|
||||||
|
|
||||||
val openIntent =
|
|
||||||
Intent(YuzuApplication.appContext, EmulationActivity::class.java).apply {
|
|
||||||
action = Intent.ACTION_VIEW
|
|
||||||
data = Uri.parse(game.path)
|
|
||||||
}
|
|
||||||
|
|
||||||
activity.lifecycleScope.launch {
|
activity.lifecycleScope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val layerDrawable = ResourcesCompat.getDrawable(
|
|
||||||
YuzuApplication.appContext.resources,
|
|
||||||
R.drawable.shortcut,
|
|
||||||
null
|
|
||||||
) as LayerDrawable
|
|
||||||
layerDrawable.setDrawableByLayerId(
|
|
||||||
R.id.shortcut_foreground,
|
|
||||||
GameIconUtils.getGameIcon(activity, game)
|
|
||||||
.toDrawable(YuzuApplication.appContext.resources)
|
|
||||||
)
|
|
||||||
val inset = YuzuApplication.appContext.resources
|
|
||||||
.getDimensionPixelSize(R.dimen.icon_inset)
|
|
||||||
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
|
|
||||||
val shortcut =
|
val shortcut =
|
||||||
ShortcutInfoCompat.Builder(YuzuApplication.appContext, game.path)
|
ShortcutInfoCompat.Builder(YuzuApplication.appContext, game.path)
|
||||||
.setShortLabel(game.title)
|
.setShortLabel(game.title)
|
||||||
.setIcon(
|
.setIcon(GameIconUtils.getShortcutIcon(activity, game))
|
||||||
IconCompat.createWithAdaptiveBitmap(
|
.setIntent(game.launchIntent)
|
||||||
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.setIntent(openIntent)
|
|
||||||
.build()
|
.build()
|
||||||
ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut)
|
ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,8 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
|||||||
THEME("theme"),
|
THEME("theme"),
|
||||||
THEME_MODE("theme_mode"),
|
THEME_MODE("theme_mode"),
|
||||||
OVERLAY_SCALE("control_scale"),
|
OVERLAY_SCALE("control_scale"),
|
||||||
OVERLAY_OPACITY("control_opacity");
|
OVERLAY_OPACITY("control_opacity"),
|
||||||
|
LOCK_DRAWER("lock_drawer");
|
||||||
|
|
||||||
override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
|
override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ class AboutFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
binding.textVersionName.text = BuildConfig.VERSION_NAME
|
binding.textVersionName.text = BuildConfig.VERSION_NAME
|
||||||
binding.textVersionName.setOnClickListener {
|
binding.buttonVersionName.setOnClickListener {
|
||||||
val clipBoard =
|
val clipBoard =
|
||||||
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
val clip = ClipData.newPlainText(getString(R.string.build), BuildConfig.GIT_HASH)
|
val clip = ClipData.newPlainText(getString(R.string.build), BuildConfig.GIT_HASH)
|
||||||
|
@ -141,7 +141,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
// So this fragment doesn't restart on configuration changes; i.e. rotation.
|
// So this fragment doesn't restart on configuration changes; i.e. rotation.
|
||||||
retainInstance = true
|
retainInstance = true
|
||||||
emulationState = EmulationState(game.path)
|
emulationState = EmulationState(game.path) {
|
||||||
|
return@EmulationState driverViewModel.isInteractionAllowed.value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -182,11 +184,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDrawerOpened(drawerView: View) {
|
override fun onDrawerOpened(drawerView: View) {
|
||||||
// No op
|
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
|
||||||
|
binding.inGameMenu.requestFocus()
|
||||||
|
emulationViewModel.setDrawerOpen(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDrawerClosed(drawerView: View) {
|
override fun onDrawerClosed(drawerView: View) {
|
||||||
// No op
|
binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt())
|
||||||
|
emulationViewModel.setDrawerOpen(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDrawerStateChanged(newState: Int) {
|
override fun onDrawerStateChanged(newState: Int) {
|
||||||
@ -196,6 +201,28 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
|
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
|
||||||
binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text =
|
binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text =
|
||||||
game.title
|
game.title
|
||||||
|
|
||||||
|
binding.inGameMenu.menu.findItem(R.id.menu_lock_drawer).apply {
|
||||||
|
val lockMode = IntSetting.LOCK_DRAWER.getInt()
|
||||||
|
val titleId = if (lockMode == DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
|
||||||
|
R.string.unlock_drawer
|
||||||
|
} else {
|
||||||
|
R.string.lock_drawer
|
||||||
|
}
|
||||||
|
val iconId = if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED) {
|
||||||
|
R.drawable.ic_unlock
|
||||||
|
} else {
|
||||||
|
R.drawable.ic_lock
|
||||||
|
}
|
||||||
|
|
||||||
|
title = getString(titleId)
|
||||||
|
icon = ResourcesCompat.getDrawable(
|
||||||
|
resources,
|
||||||
|
iconId,
|
||||||
|
requireContext().theme
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
binding.inGameMenu.setNavigationItemSelectedListener {
|
binding.inGameMenu.setNavigationItemSelectedListener {
|
||||||
when (it.itemId) {
|
when (it.itemId) {
|
||||||
R.id.menu_pause_emulation -> {
|
R.id.menu_pause_emulation -> {
|
||||||
@ -216,6 +243,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
requireContext().theme
|
requireContext().theme
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
binding.inGameMenu.requestFocus()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,6 +252,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
null,
|
null,
|
||||||
Settings.MenuTag.SECTION_ROOT
|
Settings.MenuTag.SECTION_ROOT
|
||||||
)
|
)
|
||||||
|
binding.inGameMenu.requestFocus()
|
||||||
binding.root.findNavController().navigate(action)
|
binding.root.findNavController().navigate(action)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@ -233,6 +262,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
args.game,
|
args.game,
|
||||||
Settings.MenuTag.SECTION_ROOT
|
Settings.MenuTag.SECTION_ROOT
|
||||||
)
|
)
|
||||||
|
binding.inGameMenu.requestFocus()
|
||||||
binding.root.findNavController().navigate(action)
|
binding.root.findNavController().navigate(action)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@ -242,11 +272,39 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
R.id.menu_lock_drawer -> {
|
||||||
|
when (IntSetting.LOCK_DRAWER.getInt()) {
|
||||||
|
DrawerLayout.LOCK_MODE_UNLOCKED -> {
|
||||||
|
IntSetting.LOCK_DRAWER.setInt(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
|
||||||
|
it.title = resources.getString(R.string.unlock_drawer)
|
||||||
|
it.icon = ResourcesCompat.getDrawable(
|
||||||
|
resources,
|
||||||
|
R.drawable.ic_lock,
|
||||||
|
requireContext().theme
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawerLayout.LOCK_MODE_LOCKED_CLOSED -> {
|
||||||
|
IntSetting.LOCK_DRAWER.setInt(DrawerLayout.LOCK_MODE_UNLOCKED)
|
||||||
|
it.title = resources.getString(R.string.lock_drawer)
|
||||||
|
it.icon = ResourcesCompat.getDrawable(
|
||||||
|
resources,
|
||||||
|
R.drawable.ic_unlock,
|
||||||
|
requireContext().theme
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
binding.inGameMenu.requestFocus()
|
||||||
|
NativeConfig.saveGlobalConfig()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
R.id.menu_exit -> {
|
R.id.menu_exit -> {
|
||||||
emulationState.stop()
|
emulationState.stop()
|
||||||
|
NativeConfig.reloadGlobalConfig()
|
||||||
emulationViewModel.setIsEmulationStopping(true)
|
emulationViewModel.setIsEmulationStopping(true)
|
||||||
binding.drawerLayout.close()
|
binding.drawerLayout.close()
|
||||||
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
|
binding.inGameMenu.requestFocus()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,12 +321,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
if (!NativeLibrary.isRunning()) {
|
if (!NativeLibrary.isRunning()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
emulationViewModel.setDrawerOpen(!binding.drawerLayout.isOpen)
|
||||||
if (binding.drawerLayout.isOpen) {
|
|
||||||
binding.drawerLayout.close()
|
|
||||||
} else {
|
|
||||||
binding.drawerLayout.open()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@ -322,11 +375,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||||
|
driverViewModel.isInteractionAllowed.collect {
|
||||||
|
if (it) {
|
||||||
|
startEmulation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
launch {
|
launch {
|
||||||
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||||
emulationViewModel.emulationStarted.collectLatest {
|
emulationViewModel.emulationStarted.collectLatest {
|
||||||
if (it) {
|
if (it) {
|
||||||
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
|
binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt())
|
||||||
ViewUtils.showView(binding.surfaceInputOverlay)
|
ViewUtils.showView(binding.surfaceInputOverlay)
|
||||||
ViewUtils.hideView(binding.loadingIndicator)
|
ViewUtils.hideView(binding.loadingIndicator)
|
||||||
|
|
||||||
@ -351,10 +413,41 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
launch {
|
launch {
|
||||||
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||||
driverViewModel.isInteractionAllowed.collect {
|
emulationViewModel.drawerOpen.collect {
|
||||||
if (it) {
|
if (it) {
|
||||||
onEmulationStart()
|
binding.drawerLayout.open()
|
||||||
|
binding.inGameMenu.requestFocus()
|
||||||
|
} else {
|
||||||
|
binding.drawerLayout.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||||
|
emulationViewModel.programChanged.collect {
|
||||||
|
if (it != 0) {
|
||||||
|
emulationViewModel.setEmulationStarted(false)
|
||||||
|
binding.drawerLayout.close()
|
||||||
|
binding.drawerLayout
|
||||||
|
.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
|
||||||
|
ViewUtils.hideView(binding.surfaceInputOverlay)
|
||||||
|
ViewUtils.showView(binding.loadingIndicator)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||||
|
emulationViewModel.emulationStopped.collect {
|
||||||
|
if (it && emulationViewModel.programChanged.value != -1) {
|
||||||
|
if (perfStatsUpdater != null) {
|
||||||
|
perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!)
|
||||||
|
}
|
||||||
|
emulationState.changeProgram(emulationViewModel.programChanged.value)
|
||||||
|
emulationViewModel.setProgramChanged(-1)
|
||||||
|
emulationViewModel.setEmulationStopped(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -362,7 +455,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onEmulationStart() {
|
private fun startEmulation(programIndex: Int = 0) {
|
||||||
if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) {
|
if (!NativeLibrary.isRunning() && !NativeLibrary.isPaused()) {
|
||||||
if (!DirectoryInitialization.areDirectoriesReady) {
|
if (!DirectoryInitialization.areDirectoriesReady) {
|
||||||
DirectoryInitialization.start()
|
DirectoryInitialization.start()
|
||||||
@ -370,7 +463,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
updateScreenLayout()
|
updateScreenLayout()
|
||||||
|
|
||||||
emulationState.run(emulationActivity!!.isActivityRecreated)
|
emulationState.run(emulationActivity!!.isActivityRecreated, programIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,12 +530,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
val FRAMETIME = 2
|
val FRAMETIME = 2
|
||||||
val SPEED = 3
|
val SPEED = 3
|
||||||
perfStatsUpdater = {
|
perfStatsUpdater = {
|
||||||
if (emulationViewModel.emulationStarted.value) {
|
if (emulationViewModel.emulationStarted.value &&
|
||||||
|
!emulationViewModel.isEmulationStopping.value
|
||||||
|
) {
|
||||||
val perfStats = NativeLibrary.getPerfStats()
|
val perfStats = NativeLibrary.getPerfStats()
|
||||||
val cpuBackend = NativeLibrary.getCpuBackend()
|
val cpuBackend = NativeLibrary.getCpuBackend()
|
||||||
|
val gpuDriver = NativeLibrary.getGpuDriver()
|
||||||
if (_binding != null) {
|
if (_binding != null) {
|
||||||
binding.showFpsText.text =
|
binding.showFpsText.text =
|
||||||
String.format("FPS: %.1f\n%s", perfStats[FPS], cpuBackend)
|
String.format("FPS: %.1f\n%s/%s", perfStats[FPS], cpuBackend, gpuDriver)
|
||||||
}
|
}
|
||||||
perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
|
perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
|
||||||
}
|
}
|
||||||
@ -759,9 +855,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class EmulationState(private val gamePath: String) {
|
private class EmulationState(
|
||||||
|
private val gamePath: String,
|
||||||
|
private val emulationCanStart: () -> Boolean
|
||||||
|
) {
|
||||||
private var state: State
|
private var state: State
|
||||||
private var surface: Surface? = null
|
private var surface: Surface? = null
|
||||||
|
lateinit var emulationThread: Thread
|
||||||
|
|
||||||
init {
|
init {
|
||||||
// Starting state is stopped.
|
// Starting state is stopped.
|
||||||
@ -807,7 +907,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun run(isActivityRecreated: Boolean) {
|
fun run(isActivityRecreated: Boolean, programIndex: Int = 0) {
|
||||||
if (isActivityRecreated) {
|
if (isActivityRecreated) {
|
||||||
if (NativeLibrary.isRunning()) {
|
if (NativeLibrary.isRunning()) {
|
||||||
state = State.PAUSED
|
state = State.PAUSED
|
||||||
@ -818,10 +918,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
// If the surface is set, run now. Otherwise, wait for it to get set.
|
// If the surface is set, run now. Otherwise, wait for it to get set.
|
||||||
if (surface != null) {
|
if (surface != null) {
|
||||||
runWithValidSurface()
|
runWithValidSurface(programIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun changeProgram(programIndex: Int) {
|
||||||
|
emulationThread.join()
|
||||||
|
emulationThread = Thread({
|
||||||
|
Log.debug("[EmulationFragment] Starting emulation thread.")
|
||||||
|
NativeLibrary.run(gamePath, programIndex, false)
|
||||||
|
}, "NativeEmulation")
|
||||||
|
emulationThread.start()
|
||||||
|
}
|
||||||
|
|
||||||
// Surface callbacks
|
// Surface callbacks
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun newSurface(surface: Surface?) {
|
fun newSurface(surface: Surface?) {
|
||||||
@ -853,6 +963,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
State.PAUSED -> Log.warning(
|
State.PAUSED -> Log.warning(
|
||||||
"[EmulationFragment] Surface cleared while emulation paused."
|
"[EmulationFragment] Surface cleared while emulation paused."
|
||||||
)
|
)
|
||||||
|
|
||||||
else -> Log.warning(
|
else -> Log.warning(
|
||||||
"[EmulationFragment] Surface cleared while emulation stopped."
|
"[EmulationFragment] Surface cleared while emulation stopped."
|
||||||
)
|
)
|
||||||
@ -860,13 +971,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun runWithValidSurface() {
|
private fun runWithValidSurface(programIndex: Int = 0) {
|
||||||
NativeLibrary.surfaceChanged(surface)
|
NativeLibrary.surfaceChanged(surface)
|
||||||
|
if (!emulationCanStart.invoke()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
State.STOPPED -> {
|
State.STOPPED -> {
|
||||||
val emulationThread = Thread({
|
emulationThread = Thread({
|
||||||
Log.debug("[EmulationFragment] Starting emulation thread.")
|
Log.debug("[EmulationFragment] Starting emulation thread.")
|
||||||
NativeLibrary.run(gamePath)
|
NativeLibrary.run(gamePath, programIndex, true)
|
||||||
}, "NativeEmulation")
|
}, "NativeEmulation")
|
||||||
emulationThread.start()
|
emulationThread.start()
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,10 @@ import androidx.fragment.app.activityViewModels
|
|||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
|
import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
|
||||||
|
import org.yuzu.yuzu_emu.model.GameVerificationResult
|
||||||
import org.yuzu.yuzu_emu.model.HomeViewModel
|
import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
import org.yuzu.yuzu_emu.utils.GameMetadata
|
import org.yuzu.yuzu_emu.utils.GameMetadata
|
||||||
|
|
||||||
@ -101,6 +103,38 @@ class GameInfoFragment : Fragment() {
|
|||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
copyToClipboard(args.game.title, details)
|
copyToClipboard(args.game.title, details)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buttonVerifyIntegrity.setOnClickListener {
|
||||||
|
ProgressDialogFragment.newInstance(
|
||||||
|
requireActivity(),
|
||||||
|
R.string.verifying,
|
||||||
|
true
|
||||||
|
) { progressCallback, _ ->
|
||||||
|
val result = GameVerificationResult.from(
|
||||||
|
NativeLibrary.verifyGameContents(
|
||||||
|
args.game.path,
|
||||||
|
progressCallback
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return@newInstance when (result) {
|
||||||
|
GameVerificationResult.Success ->
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.verify_success,
|
||||||
|
descriptionId = R.string.operation_completed_successfully
|
||||||
|
)
|
||||||
|
GameVerificationResult.Failed ->
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.verify_failure,
|
||||||
|
descriptionId = R.string.verify_failure_description
|
||||||
|
)
|
||||||
|
GameVerificationResult.NotImplemented ->
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.verify_no_result,
|
||||||
|
descriptionId = R.string.verify_no_result_description
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.show(parentFragmentManager, ProgressDialogFragment.TAG)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setInsets()
|
setInsets()
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
package org.yuzu.yuzu_emu.fragments
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.pm.ShortcutInfo
|
||||||
|
import android.content.pm.ShortcutManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
@ -84,6 +86,24 @@ class GamePropertiesFragment : Fragment() {
|
|||||||
view.findNavController().popBackStack()
|
view.findNavController().popBackStack()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val shortcutManager = requireActivity().getSystemService(ShortcutManager::class.java)
|
||||||
|
binding.buttonShortcut.isEnabled = shortcutManager.isRequestPinShortcutSupported
|
||||||
|
binding.buttonShortcut.setOnClickListener {
|
||||||
|
viewLifecycleOwner.lifecycleScope.launch {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
val shortcut = ShortcutInfo.Builder(requireContext(), args.game.title)
|
||||||
|
.setShortLabel(args.game.title)
|
||||||
|
.setIcon(
|
||||||
|
GameIconUtils.getShortcutIcon(requireActivity(), args.game)
|
||||||
|
.toIcon(requireContext())
|
||||||
|
)
|
||||||
|
.setIntent(args.game.launchIntent)
|
||||||
|
.build()
|
||||||
|
shortcutManager.requestPinShortcut(shortcut, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen)
|
GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen)
|
||||||
binding.title.text = args.game.title
|
binding.title.text = args.game.title
|
||||||
binding.title.postDelayed(
|
binding.title.postDelayed(
|
||||||
|
@ -32,6 +32,7 @@ import org.yuzu.yuzu_emu.BuildConfig
|
|||||||
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter
|
import org.yuzu.yuzu_emu.adapters.HomeSettingAdapter
|
||||||
import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding
|
import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding
|
||||||
import org.yuzu.yuzu_emu.features.DocumentProvider
|
import org.yuzu.yuzu_emu.features.DocumentProvider
|
||||||
@ -140,6 +141,44 @@ class HomeSettingsFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
add(
|
||||||
|
HomeSetting(
|
||||||
|
R.string.verify_installed_content,
|
||||||
|
R.string.verify_installed_content_description,
|
||||||
|
R.drawable.ic_check_circle,
|
||||||
|
{
|
||||||
|
ProgressDialogFragment.newInstance(
|
||||||
|
requireActivity(),
|
||||||
|
titleId = R.string.verifying,
|
||||||
|
cancellable = true
|
||||||
|
) { progressCallback, _ ->
|
||||||
|
val result = NativeLibrary.verifyInstalledContents(progressCallback)
|
||||||
|
return@newInstance if (progressCallback.invoke(100, 100)) {
|
||||||
|
// Invoke the progress callback to check if the process was cancelled
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.verify_no_result,
|
||||||
|
descriptionId = R.string.verify_no_result_description
|
||||||
|
)
|
||||||
|
} else if (result.isEmpty()) {
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.verify_success,
|
||||||
|
descriptionId = R.string.operation_completed_successfully
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
val failedNames = result.joinToString("\n")
|
||||||
|
val errorMessage = YuzuApplication.appContext.getString(
|
||||||
|
R.string.verification_failed_for,
|
||||||
|
failedNames
|
||||||
|
)
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.verify_failure,
|
||||||
|
descriptionString = errorMessage
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.show(parentFragmentManager, ProgressDialogFragment.TAG)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
add(
|
add(
|
||||||
HomeSetting(
|
HomeSetting(
|
||||||
R.string.share_log,
|
R.string.share_log,
|
||||||
|
@ -26,9 +26,15 @@ class MessageDialogFragment : DialogFragment() {
|
|||||||
val descriptionId = requireArguments().getInt(DESCRIPTION_ID)
|
val descriptionId = requireArguments().getInt(DESCRIPTION_ID)
|
||||||
val descriptionString = requireArguments().getString(DESCRIPTION_STRING)!!
|
val descriptionString = requireArguments().getString(DESCRIPTION_STRING)!!
|
||||||
val helpLinkId = requireArguments().getInt(HELP_LINK)
|
val helpLinkId = requireArguments().getInt(HELP_LINK)
|
||||||
|
val dismissible = requireArguments().getBoolean(DISMISSIBLE)
|
||||||
|
val clearPositiveAction = requireArguments().getBoolean(CLEAR_POSITIVE_ACTION)
|
||||||
|
|
||||||
val builder = MaterialAlertDialogBuilder(requireContext())
|
val builder = MaterialAlertDialogBuilder(requireContext())
|
||||||
|
|
||||||
|
if (clearPositiveAction) {
|
||||||
|
messageDialogViewModel.positiveAction = null
|
||||||
|
}
|
||||||
|
|
||||||
if (messageDialogViewModel.positiveAction == null) {
|
if (messageDialogViewModel.positiveAction == null) {
|
||||||
builder.setPositiveButton(R.string.close, null)
|
builder.setPositiveButton(R.string.close, null)
|
||||||
} else {
|
} else {
|
||||||
@ -51,6 +57,8 @@ class MessageDialogFragment : DialogFragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCancelable = dismissible
|
||||||
|
|
||||||
return builder.show()
|
return builder.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,28 +75,38 @@ class MessageDialogFragment : DialogFragment() {
|
|||||||
private const val DESCRIPTION_ID = "DescriptionId"
|
private const val DESCRIPTION_ID = "DescriptionId"
|
||||||
private const val DESCRIPTION_STRING = "DescriptionString"
|
private const val DESCRIPTION_STRING = "DescriptionString"
|
||||||
private const val HELP_LINK = "Link"
|
private const val HELP_LINK = "Link"
|
||||||
|
private const val DISMISSIBLE = "Dismissible"
|
||||||
|
private const val CLEAR_POSITIVE_ACTION = "ClearPositiveAction"
|
||||||
|
|
||||||
fun newInstance(
|
fun newInstance(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity? = null,
|
||||||
titleId: Int = 0,
|
titleId: Int = 0,
|
||||||
titleString: String = "",
|
titleString: String = "",
|
||||||
descriptionId: Int = 0,
|
descriptionId: Int = 0,
|
||||||
descriptionString: String = "",
|
descriptionString: String = "",
|
||||||
helpLinkId: Int = 0,
|
helpLinkId: Int = 0,
|
||||||
|
dismissible: Boolean = true,
|
||||||
positiveAction: (() -> Unit)? = null
|
positiveAction: (() -> Unit)? = null
|
||||||
): MessageDialogFragment {
|
): MessageDialogFragment {
|
||||||
|
var clearPositiveAction = false
|
||||||
|
if (activity != null) {
|
||||||
|
ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply {
|
||||||
|
clear()
|
||||||
|
this.positiveAction = positiveAction
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
clearPositiveAction = true
|
||||||
|
}
|
||||||
|
|
||||||
val dialog = MessageDialogFragment()
|
val dialog = MessageDialogFragment()
|
||||||
val bundle = Bundle()
|
val bundle = Bundle().apply {
|
||||||
bundle.apply {
|
|
||||||
putInt(TITLE_ID, titleId)
|
putInt(TITLE_ID, titleId)
|
||||||
putString(TITLE_STRING, titleString)
|
putString(TITLE_STRING, titleString)
|
||||||
putInt(DESCRIPTION_ID, descriptionId)
|
putInt(DESCRIPTION_ID, descriptionId)
|
||||||
putString(DESCRIPTION_STRING, descriptionString)
|
putString(DESCRIPTION_STRING, descriptionString)
|
||||||
putInt(HELP_LINK, helpLinkId)
|
putInt(HELP_LINK, helpLinkId)
|
||||||
}
|
putBoolean(DISMISSIBLE, dismissible)
|
||||||
ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply {
|
putBoolean(CLEAR_POSITIVE_ACTION, clearPositiveAction)
|
||||||
clear()
|
|
||||||
this.positiveAction = positiveAction
|
|
||||||
}
|
}
|
||||||
dialog.arguments = bundle
|
dialog.arguments = bundle
|
||||||
return dialog
|
return dialog
|
||||||
|
@ -31,6 +31,7 @@ import androidx.preference.PreferenceManager
|
|||||||
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
|
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
|
||||||
import com.google.android.material.transition.MaterialFadeThrough
|
import com.google.android.material.transition.MaterialFadeThrough
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
@ -162,7 +163,7 @@ class SetupFragment : Fragment() {
|
|||||||
R.string.install_prod_keys_warning_help,
|
R.string.install_prod_keys_warning_help,
|
||||||
{
|
{
|
||||||
val file = File(DirectoryInitialization.userDirectory + "/keys/prod.keys")
|
val file = File(DirectoryInitialization.userDirectory + "/keys/prod.keys")
|
||||||
if (file.exists()) {
|
if (file.exists() && NativeLibrary.areKeysPresent()) {
|
||||||
StepState.COMPLETE
|
StepState.COMPLETE
|
||||||
} else {
|
} else {
|
||||||
StepState.INCOMPLETE
|
StepState.INCOMPLETE
|
||||||
@ -347,7 +348,8 @@ class SetupFragment : Fragment() {
|
|||||||
val getProdKey =
|
val getProdKey =
|
||||||
registerForActivityResult(ActivityResultContracts.OpenDocument()) { result ->
|
registerForActivityResult(ActivityResultContracts.OpenDocument()) { result ->
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
if (mainActivity.processKey(result)) {
|
mainActivity.processKey(result)
|
||||||
|
if (NativeLibrary.areKeysPresent()) {
|
||||||
keyCallback.onStepCompleted()
|
keyCallback.onStepCompleted()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,10 +66,13 @@ class DriverViewModel : ViewModel() {
|
|||||||
|
|
||||||
fun updateDriverList() {
|
fun updateDriverList() {
|
||||||
val selectedDriver = GpuDriverHelper.customDriverSettingData
|
val selectedDriver = GpuDriverHelper.customDriverSettingData
|
||||||
|
val systemDriverData = GpuDriverHelper.getSystemDriverInfo()
|
||||||
val newDriverList = mutableListOf(
|
val newDriverList = mutableListOf(
|
||||||
Driver(
|
Driver(
|
||||||
selectedDriver == GpuDriverMetadata(),
|
selectedDriver == GpuDriverMetadata(),
|
||||||
YuzuApplication.appContext.getString(R.string.system_gpu_driver)
|
YuzuApplication.appContext.getString(R.string.system_gpu_driver),
|
||||||
|
systemDriverData?.get(0) ?: "",
|
||||||
|
systemDriverData?.get(1) ?: ""
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
driverData.forEach {
|
driverData.forEach {
|
||||||
@ -144,6 +147,7 @@ class DriverViewModel : ViewModel() {
|
|||||||
val selectedDriverFile = File(StringSetting.DRIVER_PATH.getString())
|
val selectedDriverFile = File(StringSetting.DRIVER_PATH.getString())
|
||||||
val selectedDriverMetadata = GpuDriverHelper.customDriverSettingData
|
val selectedDriverMetadata = GpuDriverHelper.customDriverSettingData
|
||||||
if (GpuDriverHelper.installedCustomDriverData == selectedDriverMetadata) {
|
if (GpuDriverHelper.installedCustomDriverData == selectedDriverMetadata) {
|
||||||
|
setDriverReady()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ package org.yuzu.yuzu_emu.model
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
|
||||||
class EmulationViewModel : ViewModel() {
|
class EmulationViewModel : ViewModel() {
|
||||||
val emulationStarted: StateFlow<Boolean> get() = _emulationStarted
|
val emulationStarted: StateFlow<Boolean> get() = _emulationStarted
|
||||||
@ -14,6 +15,12 @@ class EmulationViewModel : ViewModel() {
|
|||||||
val isEmulationStopping: StateFlow<Boolean> get() = _isEmulationStopping
|
val isEmulationStopping: StateFlow<Boolean> get() = _isEmulationStopping
|
||||||
private val _isEmulationStopping = MutableStateFlow(false)
|
private val _isEmulationStopping = MutableStateFlow(false)
|
||||||
|
|
||||||
|
private val _emulationStopped = MutableStateFlow(false)
|
||||||
|
val emulationStopped = _emulationStopped.asStateFlow()
|
||||||
|
|
||||||
|
private val _programChanged = MutableStateFlow(-1)
|
||||||
|
val programChanged = _programChanged.asStateFlow()
|
||||||
|
|
||||||
val shaderProgress: StateFlow<Int> get() = _shaderProgress
|
val shaderProgress: StateFlow<Int> get() = _shaderProgress
|
||||||
private val _shaderProgress = MutableStateFlow(0)
|
private val _shaderProgress = MutableStateFlow(0)
|
||||||
|
|
||||||
@ -23,6 +30,9 @@ class EmulationViewModel : ViewModel() {
|
|||||||
val shaderMessage: StateFlow<String> get() = _shaderMessage
|
val shaderMessage: StateFlow<String> get() = _shaderMessage
|
||||||
private val _shaderMessage = MutableStateFlow("")
|
private val _shaderMessage = MutableStateFlow("")
|
||||||
|
|
||||||
|
private val _drawerOpen = MutableStateFlow(false)
|
||||||
|
val drawerOpen = _drawerOpen.asStateFlow()
|
||||||
|
|
||||||
fun setEmulationStarted(started: Boolean) {
|
fun setEmulationStarted(started: Boolean) {
|
||||||
_emulationStarted.value = started
|
_emulationStarted.value = started
|
||||||
}
|
}
|
||||||
@ -31,6 +41,17 @@ class EmulationViewModel : ViewModel() {
|
|||||||
_isEmulationStopping.value = value
|
_isEmulationStopping.value = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setEmulationStopped(value: Boolean) {
|
||||||
|
if (value) {
|
||||||
|
_emulationStarted.value = false
|
||||||
|
}
|
||||||
|
_emulationStopped.value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setProgramChanged(programIndex: Int) {
|
||||||
|
_programChanged.value = programIndex
|
||||||
|
}
|
||||||
|
|
||||||
fun setShaderProgress(progress: Int) {
|
fun setShaderProgress(progress: Int) {
|
||||||
_shaderProgress.value = progress
|
_shaderProgress.value = progress
|
||||||
}
|
}
|
||||||
@ -49,19 +70,7 @@ class EmulationViewModel : ViewModel() {
|
|||||||
setTotalShaders(max)
|
setTotalShaders(max)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clear() {
|
fun setDrawerOpen(value: Boolean) {
|
||||||
setEmulationStarted(false)
|
_drawerOpen.value = value
|
||||||
setIsEmulationStopping(false)
|
|
||||||
setShaderProgress(0)
|
|
||||||
setTotalShaders(0)
|
|
||||||
setShaderMessage("")
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val KEY_EMULATION_STARTED = "EmulationStarted"
|
|
||||||
const val KEY_IS_EMULATION_STOPPING = "IsEmulationStarting"
|
|
||||||
const val KEY_SHADER_PROGRESS = "ShaderProgress"
|
|
||||||
const val KEY_TOTAL_SHADERS = "TotalShaders"
|
|
||||||
const val KEY_SHADER_MESSAGE = "ShaderMessage"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
package org.yuzu.yuzu_emu.model
|
package org.yuzu.yuzu_emu.model
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import java.util.HashSet
|
import java.util.HashSet
|
||||||
@ -11,6 +12,7 @@ import kotlinx.serialization.Serializable
|
|||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
|
import org.yuzu.yuzu_emu.activities.EmulationActivity
|
||||||
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
||||||
import org.yuzu.yuzu_emu.utils.FileUtil
|
import org.yuzu.yuzu_emu.utils.FileUtil
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
@ -61,12 +63,26 @@ class Game(
|
|||||||
val addonDir: String
|
val addonDir: String
|
||||||
get() = DirectoryInitialization.userDirectory + "/load/" + programIdHex + "/"
|
get() = DirectoryInitialization.userDirectory + "/load/" + programIdHex + "/"
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
val launchIntent: Intent
|
||||||
if (other !is Game) {
|
get() = Intent(YuzuApplication.appContext, EmulationActivity::class.java).apply {
|
||||||
return false
|
action = Intent.ACTION_VIEW
|
||||||
|
data = Uri.parse(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
return hashCode() == other.hashCode()
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as Game
|
||||||
|
|
||||||
|
if (title != other.title) return false
|
||||||
|
if (path != other.path) return false
|
||||||
|
if (programId != other.programId) return false
|
||||||
|
if (developer != other.developer) return false
|
||||||
|
if (version != other.version) return false
|
||||||
|
if (isHomebrew != other.isHomebrew) return false
|
||||||
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.model
|
||||||
|
|
||||||
|
enum class GameVerificationResult(val int: Int) {
|
||||||
|
Success(0),
|
||||||
|
Failed(1),
|
||||||
|
NotImplemented(2);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun from(int: Int): GameVerificationResult =
|
||||||
|
entries.firstOrNull { it.int == int } ?: Success
|
||||||
|
}
|
||||||
|
}
|
@ -31,6 +31,9 @@ class HomeViewModel : ViewModel() {
|
|||||||
private val _reloadPropertiesList = MutableStateFlow(false)
|
private val _reloadPropertiesList = MutableStateFlow(false)
|
||||||
val reloadPropertiesList get() = _reloadPropertiesList.asStateFlow()
|
val reloadPropertiesList get() = _reloadPropertiesList.asStateFlow()
|
||||||
|
|
||||||
|
private val _checkKeys = MutableStateFlow(false)
|
||||||
|
val checkKeys = _checkKeys.asStateFlow()
|
||||||
|
|
||||||
var navigatedToSetup = false
|
var navigatedToSetup = false
|
||||||
|
|
||||||
fun setNavigationVisibility(visible: Boolean, animated: Boolean) {
|
fun setNavigationVisibility(visible: Boolean, animated: Boolean) {
|
||||||
@ -66,4 +69,8 @@ class HomeViewModel : ViewModel() {
|
|||||||
fun reloadPropertiesList(reload: Boolean) {
|
fun reloadPropertiesList(reload: Boolean) {
|
||||||
_reloadPropertiesList.value = reload
|
_reloadPropertiesList.value = reload
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setCheckKeys(value: Boolean) {
|
||||||
|
_checkKeys.value = value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
|||||||
|
|
||||||
override var themeId: Int = 0
|
override var themeId: Int = 0
|
||||||
|
|
||||||
|
private val CHECKED_DECRYPTION = "CheckedDecryption"
|
||||||
|
private var checkedDecryption = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
val splashScreen = installSplashScreen()
|
val splashScreen = installSplashScreen()
|
||||||
splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady }
|
splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady }
|
||||||
@ -75,6 +78,18 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
|||||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
checkedDecryption = savedInstanceState.getBoolean(CHECKED_DECRYPTION)
|
||||||
|
}
|
||||||
|
if (!checkedDecryption) {
|
||||||
|
val firstTimeSetup = PreferenceManager.getDefaultSharedPreferences(applicationContext)
|
||||||
|
.getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true)
|
||||||
|
if (!firstTimeSetup) {
|
||||||
|
checkKeys()
|
||||||
|
}
|
||||||
|
checkedDecryption = true
|
||||||
|
}
|
||||||
|
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
|
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
|
||||||
|
|
||||||
@ -150,6 +165,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||||
|
homeViewModel.checkKeys.collect {
|
||||||
|
if (it) {
|
||||||
|
checkKeys()
|
||||||
|
homeViewModel.setCheckKeys(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dismiss previous notifications (should not happen unless a crash occurred)
|
// Dismiss previous notifications (should not happen unless a crash occurred)
|
||||||
@ -158,6 +183,21 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
|||||||
setInsets()
|
setInsets()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkKeys() {
|
||||||
|
if (!NativeLibrary.areKeysPresent()) {
|
||||||
|
MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.keys_missing,
|
||||||
|
descriptionId = R.string.keys_missing_description,
|
||||||
|
helpLinkId = R.string.keys_missing_help
|
||||||
|
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
|
super.onSaveInstanceState(outState)
|
||||||
|
outState.putBoolean(CHECKED_DECRYPTION, checkedDecryption)
|
||||||
|
}
|
||||||
|
|
||||||
fun finishSetup(navController: NavController) {
|
fun finishSetup(navController: NavController) {
|
||||||
navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment)
|
navController.navigate(R.id.action_firstTimeSetupFragment_to_gamesFragment)
|
||||||
(binding.navigationView as NavigationBarView).setupWithNavController(navController)
|
(binding.navigationView as NavigationBarView).setupWithNavController(navController)
|
||||||
@ -349,6 +389,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
|||||||
R.string.install_keys_success,
|
R.string.install_keys_success,
|
||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
|
homeViewModel.setCheckKeys(true)
|
||||||
gamesViewModel.reloadGames(true)
|
gamesViewModel.reloadGames(true)
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
@ -399,6 +440,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
|||||||
firmwarePath.deleteRecursively()
|
firmwarePath.deleteRecursively()
|
||||||
cacheFirmwareDir.copyRecursively(firmwarePath, true)
|
cacheFirmwareDir.copyRecursively(firmwarePath, true)
|
||||||
NativeLibrary.initializeSystem(true)
|
NativeLibrary.initializeSystem(true)
|
||||||
|
homeViewModel.setCheckKeys(true)
|
||||||
getString(R.string.save_file_imported_success)
|
getString(R.string.save_file_imported_success)
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
@ -5,7 +5,10 @@ package org.yuzu.yuzu_emu.utils
|
|||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
|
import android.graphics.drawable.LayerDrawable
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
|
import androidx.core.graphics.drawable.IconCompat
|
||||||
import androidx.core.graphics.drawable.toBitmap
|
import androidx.core.graphics.drawable.toBitmap
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
@ -85,4 +88,22 @@ object GameIconUtils {
|
|||||||
return imageLoader.execute(request)
|
return imageLoader.execute(request)
|
||||||
.drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
|
.drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getShortcutIcon(lifecycleOwner: LifecycleOwner, game: Game): IconCompat {
|
||||||
|
val layerDrawable = ResourcesCompat.getDrawable(
|
||||||
|
YuzuApplication.appContext.resources,
|
||||||
|
R.drawable.shortcut,
|
||||||
|
null
|
||||||
|
) as LayerDrawable
|
||||||
|
layerDrawable.setDrawableByLayerId(
|
||||||
|
R.id.shortcut_foreground,
|
||||||
|
getGameIcon(lifecycleOwner, game).toDrawable(YuzuApplication.appContext.resources)
|
||||||
|
)
|
||||||
|
val inset = YuzuApplication.appContext.resources
|
||||||
|
.getDimensionPixelSize(R.dimen.icon_inset)
|
||||||
|
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
|
||||||
|
return IconCompat.createWithAdaptiveBitmap(
|
||||||
|
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
|
|
||||||
package org.yuzu.yuzu_emu.utils
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
||||||
|
import android.graphics.SurfaceTexture
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.view.Surface
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
@ -195,6 +197,11 @@ object GpuDriverHelper {
|
|||||||
|
|
||||||
external fun supportsCustomDriverLoading(): Boolean
|
external fun supportsCustomDriverLoading(): Boolean
|
||||||
|
|
||||||
|
external fun getSystemDriverInfo(
|
||||||
|
surface: Surface = Surface(SurfaceTexture(true)),
|
||||||
|
hookLibPath: String = GpuDriverHelper.hookLibPath!!
|
||||||
|
): Array<String>?
|
||||||
|
|
||||||
// Parse the custom driver metadata to retrieve the name.
|
// Parse the custom driver metadata to retrieve the name.
|
||||||
val installedCustomDriverData: GpuDriverMetadata
|
val installedCustomDriverData: GpuDriverMetadata
|
||||||
get() = GpuDriverMetadata(File(driverInstallationPath + META_JSON_FILENAME))
|
get() = GpuDriverMetadata(File(driverInstallationPath + META_JSON_FILENAME))
|
||||||
|
@ -22,7 +22,7 @@ add_library(yuzu-android SHARED
|
|||||||
|
|
||||||
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
|
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
|
||||||
|
|
||||||
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common)
|
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common Vulkan::Headers)
|
||||||
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
|
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
|
||||||
if (ARCHITECTURE_arm64)
|
if (ARCHITECTURE_arm64)
|
||||||
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
||||||
|
@ -63,6 +63,7 @@ struct Values {
|
|||||||
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
|
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
|
||||||
Settings::Category::Overlay};
|
Settings::Category::Overlay};
|
||||||
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
|
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
|
||||||
|
Settings::Setting<s32> lock_drawer{linkage, false, "lock_drawer", Settings::Category::Overlay};
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Values values;
|
extern Values values;
|
||||||
|
@ -82,7 +82,7 @@ AndroidKeyboard::ResultData AndroidKeyboard::ResultData::CreateFromFrontend(jobj
|
|||||||
const jstring string = reinterpret_cast<jstring>(env->GetObjectField(
|
const jstring string = reinterpret_cast<jstring>(env->GetObjectField(
|
||||||
object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;")));
|
object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;")));
|
||||||
return ResultData{GetJString(env, string),
|
return ResultData{GetJString(env, string),
|
||||||
static_cast<Service::AM::Applets::SwkbdResult>(env->GetIntField(
|
static_cast<Service::AM::Frontend::SwkbdResult>(env->GetIntField(
|
||||||
object, env->GetFieldID(s_keyboard_data_class, "result", "I")))};
|
object, env->GetFieldID(s_keyboard_data_class, "result", "I")))};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ void AndroidKeyboard::ShowNormalKeyboard() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AndroidKeyboard::ShowTextCheckDialog(
|
void AndroidKeyboard::ShowTextCheckDialog(
|
||||||
Service::AM::Applets::SwkbdTextCheckResult text_check_result,
|
Service::AM::Frontend::SwkbdTextCheckResult text_check_result,
|
||||||
std::u16string text_check_message) const {
|
std::u16string text_check_message) const {
|
||||||
LOG_WARNING(Frontend, "(STUBBED) called, backend requested to show the text check dialog.");
|
LOG_WARNING(Frontend, "(STUBBED) called, backend requested to show the text check dialog.");
|
||||||
}
|
}
|
||||||
@ -204,7 +204,7 @@ void AndroidKeyboard::InlineTextChanged(
|
|||||||
"\ncursor_position={}",
|
"\ncursor_position={}",
|
||||||
Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position);
|
Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position);
|
||||||
|
|
||||||
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString,
|
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString,
|
||||||
text_parameters.input_text, text_parameters.cursor_position);
|
text_parameters.input_text, text_parameters.cursor_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ void AndroidKeyboard::SubmitInlineKeyboardText(std::u16string submitted_text) {
|
|||||||
|
|
||||||
m_current_text += submitted_text;
|
m_current_text += submitted_text;
|
||||||
|
|
||||||
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString, m_current_text,
|
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text,
|
||||||
m_current_text.size());
|
m_current_text.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,12 +236,12 @@ void AndroidKeyboard::SubmitInlineKeyboardInput(int key_code) {
|
|||||||
case KEYCODE_BACK:
|
case KEYCODE_BACK:
|
||||||
case KEYCODE_ENTER:
|
case KEYCODE_ENTER:
|
||||||
m_is_inline_active = false;
|
m_is_inline_active = false;
|
||||||
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::DecidedEnter, m_current_text,
|
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::DecidedEnter, m_current_text,
|
||||||
static_cast<s32>(m_current_text.size()));
|
static_cast<s32>(m_current_text.size()));
|
||||||
break;
|
break;
|
||||||
case KEYCODE_DEL:
|
case KEYCODE_DEL:
|
||||||
m_current_text.pop_back();
|
m_current_text.pop_back();
|
||||||
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString, m_current_text,
|
submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text,
|
||||||
m_current_text.size());
|
m_current_text.size());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ public:
|
|||||||
|
|
||||||
void ShowNormalKeyboard() const override;
|
void ShowNormalKeyboard() const override;
|
||||||
|
|
||||||
void ShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result,
|
void ShowTextCheckDialog(Service::AM::Frontend::SwkbdTextCheckResult text_check_result,
|
||||||
std::u16string text_check_message) const override;
|
std::u16string text_check_message) const override;
|
||||||
|
|
||||||
void ShowInlineKeyboard(
|
void ShowInlineKeyboard(
|
||||||
@ -45,7 +45,7 @@ private:
|
|||||||
static ResultData CreateFromFrontend(jobject object);
|
static ResultData CreateFromFrontend(jobject object);
|
||||||
|
|
||||||
std::string text;
|
std::string text;
|
||||||
Service::AM::Applets::SwkbdResult result{};
|
Service::AM::Frontend::SwkbdResult result{};
|
||||||
};
|
};
|
||||||
|
|
||||||
void SubmitNormalText(const ResultData& result) const;
|
void SubmitNormalText(const ResultData& result) const;
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <core/core.h>
|
#include "core/core.h"
|
||||||
#include <core/file_sys/mode.h>
|
#include "core/file_sys/fs_filesystem.h"
|
||||||
#include <core/file_sys/patch_manager.h>
|
#include "core/file_sys/patch_manager.h"
|
||||||
#include <core/loader/nro.h>
|
|
||||||
#include <jni.h>
|
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
|
#include "core/loader/nro.h"
|
||||||
|
#include "jni.h"
|
||||||
#include "jni/android_common/android_common.h"
|
#include "jni/android_common/android_common.h"
|
||||||
#include "native.h"
|
#include "native.h"
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ extern "C" {
|
|||||||
jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj,
|
jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj,
|
||||||
jstring jpath) {
|
jstring jpath) {
|
||||||
const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
|
const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
|
||||||
GetJString(env, jpath), FileSys::Mode::Read);
|
GetJString(env, jpath), FileSys::OpenMode::Read);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ static jmethodID s_exit_emulation_activity;
|
|||||||
static jmethodID s_disk_cache_load_progress;
|
static jmethodID s_disk_cache_load_progress;
|
||||||
static jmethodID s_on_emulation_started;
|
static jmethodID s_on_emulation_started;
|
||||||
static jmethodID s_on_emulation_stopped;
|
static jmethodID s_on_emulation_stopped;
|
||||||
|
static jmethodID s_on_program_changed;
|
||||||
|
|
||||||
static jclass s_game_class;
|
static jclass s_game_class;
|
||||||
static jmethodID s_game_constructor;
|
static jmethodID s_game_constructor;
|
||||||
@ -123,6 +124,10 @@ jmethodID GetOnEmulationStopped() {
|
|||||||
return s_on_emulation_stopped;
|
return s_on_emulation_stopped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jmethodID GetOnProgramChanged() {
|
||||||
|
return s_on_program_changed;
|
||||||
|
}
|
||||||
|
|
||||||
jclass GetGameClass() {
|
jclass GetGameClass() {
|
||||||
return s_game_class;
|
return s_game_class;
|
||||||
}
|
}
|
||||||
@ -306,6 +311,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
|
|||||||
env->GetStaticMethodID(s_native_library_class, "onEmulationStarted", "()V");
|
env->GetStaticMethodID(s_native_library_class, "onEmulationStarted", "()V");
|
||||||
s_on_emulation_stopped =
|
s_on_emulation_stopped =
|
||||||
env->GetStaticMethodID(s_native_library_class, "onEmulationStopped", "(I)V");
|
env->GetStaticMethodID(s_native_library_class, "onEmulationStopped", "(I)V");
|
||||||
|
s_on_program_changed =
|
||||||
|
env->GetStaticMethodID(s_native_library_class, "onProgramChanged", "(I)V");
|
||||||
|
|
||||||
const jclass game_class = env->FindClass("org/yuzu/yuzu_emu/model/Game");
|
const jclass game_class = env->FindClass("org/yuzu/yuzu_emu/model/Game");
|
||||||
s_game_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_class));
|
s_game_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_class));
|
||||||
|
@ -19,6 +19,7 @@ jmethodID GetExitEmulationActivity();
|
|||||||
jmethodID GetDiskCacheLoadProgress();
|
jmethodID GetDiskCacheLoadProgress();
|
||||||
jmethodID GetOnEmulationStarted();
|
jmethodID GetOnEmulationStarted();
|
||||||
jmethodID GetOnEmulationStopped();
|
jmethodID GetOnEmulationStopped();
|
||||||
|
jmethodID GetOnProgramChanged();
|
||||||
|
|
||||||
jclass GetGameClass();
|
jclass GetGameClass();
|
||||||
jmethodID GetGameConstructor();
|
jmethodID GetGameConstructor();
|
||||||
|
@ -35,20 +35,22 @@
|
|||||||
#include "core/crypto/key_manager.h"
|
#include "core/crypto/key_manager.h"
|
||||||
#include "core/file_sys/card_image.h"
|
#include "core/file_sys/card_image.h"
|
||||||
#include "core/file_sys/content_archive.h"
|
#include "core/file_sys/content_archive.h"
|
||||||
|
#include "core/file_sys/fs_filesystem.h"
|
||||||
#include "core/file_sys/submission_package.h"
|
#include "core/file_sys/submission_package.h"
|
||||||
#include "core/file_sys/vfs.h"
|
#include "core/file_sys/vfs/vfs.h"
|
||||||
#include "core/file_sys/vfs_real.h"
|
#include "core/file_sys/vfs/vfs_real.h"
|
||||||
#include "core/frontend/applets/cabinet.h"
|
#include "core/frontend/applets/cabinet.h"
|
||||||
#include "core/frontend/applets/controller.h"
|
#include "core/frontend/applets/controller.h"
|
||||||
#include "core/frontend/applets/error.h"
|
#include "core/frontend/applets/error.h"
|
||||||
#include "core/frontend/applets/general_frontend.h"
|
#include "core/frontend/applets/general.h"
|
||||||
#include "core/frontend/applets/mii_edit.h"
|
#include "core/frontend/applets/mii_edit.h"
|
||||||
#include "core/frontend/applets/profile_select.h"
|
#include "core/frontend/applets/profile_select.h"
|
||||||
#include "core/frontend/applets/software_keyboard.h"
|
#include "core/frontend/applets/software_keyboard.h"
|
||||||
#include "core/frontend/applets/web_browser.h"
|
#include "core/frontend/applets/web_browser.h"
|
||||||
#include "core/hle/service/am/applet_ae.h"
|
#include "core/hle/service/am/applet_ae.h"
|
||||||
|
#include "core/hle/service/am/applet_manager.h"
|
||||||
#include "core/hle/service/am/applet_oe.h"
|
#include "core/hle/service/am/applet_oe.h"
|
||||||
#include "core/hle/service/am/applets/applets.h"
|
#include "core/hle/service/am/frontend/applets.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
#include "frontend_common/config.h"
|
#include "frontend_common/config.h"
|
||||||
@ -59,6 +61,9 @@
|
|||||||
#include "jni/id_cache.h"
|
#include "jni/id_cache.h"
|
||||||
#include "jni/native.h"
|
#include "jni/native.h"
|
||||||
#include "video_core/renderer_base.h"
|
#include "video_core/renderer_base.h"
|
||||||
|
#include "video_core/renderer_vulkan/renderer_vulkan.h"
|
||||||
|
#include "video_core/vulkan_common/vulkan_instance.h"
|
||||||
|
#include "video_core/vulkan_common/vulkan_surface.h"
|
||||||
|
|
||||||
#define jconst [[maybe_unused]] const auto
|
#define jconst [[maybe_unused]] const auto
|
||||||
#define jauto [[maybe_unused]] auto
|
#define jauto [[maybe_unused]] auto
|
||||||
@ -154,7 +159,7 @@ void EmulationSession::SurfaceChanged() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath) {
|
void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath) {
|
||||||
const auto file = m_system.GetFilesystem()->OpenFile(filepath, FileSys::Mode::Read);
|
const auto file = m_system.GetFilesystem()->OpenFile(filepath, FileSys::OpenMode::Read);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -207,7 +212,15 @@ void EmulationSession::InitializeSystem(bool reload) {
|
|||||||
m_system.GetFileSystemController().CreateFactories(*m_vfs);
|
m_system.GetFileSystemController().CreateFactories(*m_vfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string& filepath) {
|
void EmulationSession::SetAppletId(int applet_id) {
|
||||||
|
m_applet_id = applet_id;
|
||||||
|
m_system.GetFrontendAppletHolder().SetCurrentAppletId(
|
||||||
|
static_cast<Service::AM::AppletId>(m_applet_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string& filepath,
|
||||||
|
const std::size_t program_index,
|
||||||
|
const bool frontend_initiated) {
|
||||||
std::scoped_lock lock(m_mutex);
|
std::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
// Create the render window.
|
// Create the render window.
|
||||||
@ -221,7 +234,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
|
|||||||
m_system.ApplySettings();
|
m_system.ApplySettings();
|
||||||
Settings::LogSettings();
|
Settings::LogSettings();
|
||||||
m_system.HIDCore().ReloadInputDevices();
|
m_system.HIDCore().ReloadInputDevices();
|
||||||
m_system.SetAppletFrontendSet({
|
m_system.SetFrontendAppletSet({
|
||||||
nullptr, // Amiibo Settings
|
nullptr, // Amiibo Settings
|
||||||
nullptr, // Controller Selector
|
nullptr, // Controller Selector
|
||||||
nullptr, // Error Display
|
nullptr, // Error Display
|
||||||
@ -237,7 +250,13 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
|
|||||||
ConfigureFilesystemProvider(filepath);
|
ConfigureFilesystemProvider(filepath);
|
||||||
|
|
||||||
// Load the ROM.
|
// Load the ROM.
|
||||||
m_load_result = m_system.Load(EmulationSession::GetInstance().Window(), filepath);
|
Service::AM::FrontendAppletParameters params{
|
||||||
|
.applet_id = static_cast<Service::AM::AppletId>(m_applet_id),
|
||||||
|
.launch_type = frontend_initiated ? Service::AM::LaunchType::FrontendInitiated
|
||||||
|
: Service::AM::LaunchType::ApplicationInitiated,
|
||||||
|
.program_index = static_cast<s32>(program_index),
|
||||||
|
};
|
||||||
|
m_load_result = m_system.Load(EmulationSession::GetInstance().Window(), filepath, params);
|
||||||
if (m_load_result != Core::SystemResultStatus::Success) {
|
if (m_load_result != Core::SystemResultStatus::Success) {
|
||||||
return m_load_result;
|
return m_load_result;
|
||||||
}
|
}
|
||||||
@ -247,12 +266,24 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
|
|||||||
m_system.GetCpuManager().OnGpuReady();
|
m_system.GetCpuManager().OnGpuReady();
|
||||||
m_system.RegisterExitCallback([&] { HaltEmulation(); });
|
m_system.RegisterExitCallback([&] { HaltEmulation(); });
|
||||||
|
|
||||||
|
// Register an ExecuteProgram callback such that Core can execute a sub-program
|
||||||
|
m_system.RegisterExecuteProgramCallback([&](std::size_t program_index_) {
|
||||||
|
m_next_program_index = program_index_;
|
||||||
|
EmulationSession::GetInstance().HaltEmulation();
|
||||||
|
});
|
||||||
|
|
||||||
|
OnEmulationStarted();
|
||||||
return Core::SystemResultStatus::Success;
|
return Core::SystemResultStatus::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmulationSession::ShutdownEmulation() {
|
void EmulationSession::ShutdownEmulation() {
|
||||||
std::scoped_lock lock(m_mutex);
|
std::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
|
if (m_next_program_index != -1) {
|
||||||
|
ChangeProgram(m_next_program_index);
|
||||||
|
m_next_program_index = -1;
|
||||||
|
}
|
||||||
|
|
||||||
m_is_running = false;
|
m_is_running = false;
|
||||||
|
|
||||||
// Unload user input.
|
// Unload user input.
|
||||||
@ -321,6 +352,9 @@ void EmulationSession::RunEmulation() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset current applet ID.
|
||||||
|
m_applet_id = static_cast<int>(Service::AM::AppletId::Application);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EmulationSession::IsHandheldOnly() {
|
bool EmulationSession::IsHandheldOnly() {
|
||||||
@ -400,6 +434,12 @@ void EmulationSession::OnEmulationStopped(Core::SystemResultStatus result) {
|
|||||||
static_cast<jint>(result));
|
static_cast<jint>(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmulationSession::ChangeProgram(std::size_t program_index) {
|
||||||
|
JNIEnv* env = IDCache::GetEnvForThread();
|
||||||
|
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnProgramChanged(),
|
||||||
|
static_cast<jint>(program_index));
|
||||||
|
}
|
||||||
|
|
||||||
u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
|
u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
|
||||||
auto program_id_string = GetJString(env, jprogramId);
|
auto program_id_string = GetJString(env, jprogramId);
|
||||||
try {
|
try {
|
||||||
@ -409,7 +449,9 @@ u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
|
static Core::SystemResultStatus RunEmulation(const std::string& filepath,
|
||||||
|
const size_t program_index,
|
||||||
|
const bool frontend_initiated) {
|
||||||
MicroProfileOnThreadCreate("EmuThread");
|
MicroProfileOnThreadCreate("EmuThread");
|
||||||
SCOPE_EXIT({ MicroProfileShutdown(); });
|
SCOPE_EXIT({ MicroProfileShutdown(); });
|
||||||
|
|
||||||
@ -422,7 +464,8 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
|
|||||||
|
|
||||||
SCOPE_EXIT({ EmulationSession::GetInstance().ShutdownEmulation(); });
|
SCOPE_EXIT({ EmulationSession::GetInstance().ShutdownEmulation(); });
|
||||||
|
|
||||||
jconst result = EmulationSession::GetInstance().InitializeEmulation(filepath);
|
jconst result = EmulationSession::GetInstance().InitializeEmulation(filepath, program_index,
|
||||||
|
frontend_initiated);
|
||||||
if (result != Core::SystemResultStatus::Success) {
|
if (result != Core::SystemResultStatus::Success) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -463,8 +506,8 @@ int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject
|
|||||||
};
|
};
|
||||||
|
|
||||||
return static_cast<int>(
|
return static_cast<int>(
|
||||||
ContentManager::InstallNSP(&EmulationSession::GetInstance().System(),
|
ContentManager::InstallNSP(EmulationSession::GetInstance().System(),
|
||||||
EmulationSession::GetInstance().System().GetFilesystem().get(),
|
*EmulationSession::GetInstance().System().GetFilesystem(),
|
||||||
GetJString(env, j_file), callback));
|
GetJString(env, j_file), callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,8 +517,8 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* en
|
|||||||
u64 program_id = EmulationSession::GetProgramId(env, jprogramId);
|
u64 program_id = EmulationSession::GetProgramId(env, jprogramId);
|
||||||
std::string updatePath = GetJString(env, jupdatePath);
|
std::string updatePath = GetJString(env, jupdatePath);
|
||||||
std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
|
std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
|
||||||
EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(updatePath,
|
EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
|
||||||
FileSys::Mode::Read));
|
updatePath, FileSys::OpenMode::Read));
|
||||||
for (const auto& item : nsp->GetNCAs()) {
|
for (const auto& item : nsp->GetNCAs()) {
|
||||||
for (const auto& nca_details : item.second) {
|
for (const auto& nca_details : item.second) {
|
||||||
if (nca_details.second->GetName().ends_with(".cnmt.nca")) {
|
if (nca_details.second->GetName().ends_with(".cnmt.nca")) {
|
||||||
@ -519,6 +562,37 @@ jboolean JNICALL Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_supportsCustomDri
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
|
||||||
|
JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
|
||||||
|
const char* file_redirect_dir_{};
|
||||||
|
int featureFlags{};
|
||||||
|
std::string hook_lib_dir = GetJString(env, j_hook_lib_dir);
|
||||||
|
auto handle = adrenotools_open_libvulkan(RTLD_NOW, featureFlags, nullptr, hook_lib_dir.c_str(),
|
||||||
|
nullptr, nullptr, file_redirect_dir_, nullptr);
|
||||||
|
auto driver_library = std::make_shared<Common::DynamicLibrary>(handle);
|
||||||
|
InputCommon::InputSubsystem input_subsystem;
|
||||||
|
auto m_window = std::make_unique<EmuWindow_Android>(
|
||||||
|
&input_subsystem, ANativeWindow_fromSurface(env, j_surf), driver_library);
|
||||||
|
|
||||||
|
Vulkan::vk::InstanceDispatch dld;
|
||||||
|
Vulkan::vk::Instance vk_instance = Vulkan::CreateInstance(
|
||||||
|
*driver_library, dld, VK_API_VERSION_1_1, Core::Frontend::WindowSystemType::Android);
|
||||||
|
|
||||||
|
auto surface = Vulkan::CreateSurface(vk_instance, m_window->GetWindowInfo());
|
||||||
|
|
||||||
|
auto device = Vulkan::CreateDevice(vk_instance, dld, *surface);
|
||||||
|
|
||||||
|
auto driver_version = device.GetDriverVersion();
|
||||||
|
auto version_string =
|
||||||
|
fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(driver_version),
|
||||||
|
VK_API_VERSION_MINOR(driver_version), VK_API_VERSION_PATCH(driver_version));
|
||||||
|
|
||||||
|
jobjectArray j_driver_info =
|
||||||
|
env->NewObjectArray(2, IDCache::GetStringClass(), ToJString(env, version_string));
|
||||||
|
env->SetObjectArrayElement(j_driver_info, 1, ToJString(env, device.GetDriverName()));
|
||||||
|
return j_driver_info;
|
||||||
|
}
|
||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) {
|
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) {
|
||||||
Core::Crypto::KeyManager::Instance().ReloadKeys();
|
Core::Crypto::KeyManager::Instance().ReloadKeys();
|
||||||
return static_cast<jboolean>(Core::Crypto::KeyManager::Instance().AreKeysLoaded());
|
return static_cast<jboolean>(Core::Crypto::KeyManager::Instance().AreKeysLoaded());
|
||||||
@ -674,6 +748,11 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass
|
|||||||
return ToJString(env, "JIT");
|
return ToJString(env, "JIT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) {
|
||||||
|
return ToJString(env,
|
||||||
|
EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor());
|
||||||
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
|
||||||
EmulationSession::GetInstance().System().ApplySettings();
|
EmulationSession::GetInstance().System().ApplySettings();
|
||||||
}
|
}
|
||||||
@ -682,11 +761,13 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj
|
|||||||
Settings::LogSettings();
|
Settings::LogSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2(JNIEnv* env, jclass clazz,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path,
|
||||||
jstring j_path) {
|
jint j_program_index,
|
||||||
|
jboolean j_frontend_initiated) {
|
||||||
const std::string path = GetJString(env, j_path);
|
const std::string path = GetJString(env, j_path);
|
||||||
|
|
||||||
const Core::SystemResultStatus result{RunEmulation(path)};
|
const Core::SystemResultStatus result{
|
||||||
|
RunEmulation(path, j_program_index, j_frontend_initiated)};
|
||||||
if (result != Core::SystemResultStatus::Success) {
|
if (result != Core::SystemResultStatus::Success) {
|
||||||
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(),
|
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(),
|
||||||
IDCache::GetExitEmulationActivity(), static_cast<int>(result));
|
IDCache::GetExitEmulationActivity(), static_cast<int>(result));
|
||||||
@ -713,7 +794,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv*
|
|||||||
jobject instance) {
|
jobject instance) {
|
||||||
const auto nand_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
|
const auto nand_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
|
||||||
auto vfs_nand_dir = EmulationSession::GetInstance().System().GetFilesystem()->OpenDirectory(
|
auto vfs_nand_dir = EmulationSession::GetInstance().System().GetFilesystem()->OpenDirectory(
|
||||||
Common::FS::PathToUTF8String(nand_dir), FileSys::Mode::Read);
|
Common::FS::PathToUTF8String(nand_dir), FileSys::OpenMode::Read);
|
||||||
|
|
||||||
const auto user_id = EmulationSession::GetInstance().System().GetProfileManager().GetUser(
|
const auto user_id = EmulationSession::GetInstance().System().GetProfileManager().GetUser(
|
||||||
static_cast<std::size_t>(0));
|
static_cast<std::size_t>(0));
|
||||||
@ -748,13 +829,12 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, j
|
|||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz,
|
||||||
jint jappletId) {
|
jint jappletId) {
|
||||||
EmulationSession::GetInstance().System().GetAppletManager().SetCurrentAppletId(
|
EmulationSession::GetInstance().SetAppletId(jappletId);
|
||||||
static_cast<Service::AM::Applets::AppletId>(jappletId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz,
|
||||||
jint jcabinetMode) {
|
jint jcabinetMode) {
|
||||||
EmulationSession::GetInstance().System().GetAppletManager().SetCabinetMode(
|
EmulationSession::GetInstance().System().GetFrontendAppletHolder().SetCabinetMode(
|
||||||
static_cast<Service::NFP::CabinetMode>(jcabinetMode));
|
static_cast<Service::NFP::CabinetMode>(jcabinetMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -819,7 +899,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject job
|
|||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj,
|
||||||
jstring jprogramId) {
|
jstring jprogramId) {
|
||||||
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
|
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
|
||||||
ContentManager::RemoveAllDLC(&EmulationSession::GetInstance().System(), program_id);
|
ContentManager::RemoveAllDLC(EmulationSession::GetInstance().System(), program_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId,
|
||||||
@ -829,6 +909,44 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj,
|
|||||||
program_id, GetJString(env, jname));
|
program_id, GetJString(env, jname));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env,
|
||||||
|
jobject jobj,
|
||||||
|
jobject jcallback) {
|
||||||
|
auto jlambdaClass = env->GetObjectClass(jcallback);
|
||||||
|
auto jlambdaInvokeMethod = env->GetMethodID(
|
||||||
|
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||||
|
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
|
||||||
|
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
|
||||||
|
ToJDouble(env, max), ToJDouble(env, progress));
|
||||||
|
return GetJBoolean(env, jwasCancelled);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto& session = EmulationSession::GetInstance();
|
||||||
|
std::vector<std::string> result = ContentManager::VerifyInstalledContents(
|
||||||
|
session.System(), *session.GetContentProvider(), callback);
|
||||||
|
jobjectArray jresult =
|
||||||
|
env->NewObjectArray(result.size(), IDCache::GetStringClass(), ToJString(env, ""));
|
||||||
|
for (size_t i = 0; i < result.size(); ++i) {
|
||||||
|
env->SetObjectArrayElement(jresult, i, ToJString(env, result[i]));
|
||||||
|
}
|
||||||
|
return jresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj,
|
||||||
|
jstring jpath, jobject jcallback) {
|
||||||
|
auto jlambdaClass = env->GetObjectClass(jcallback);
|
||||||
|
auto jlambdaInvokeMethod = env->GetMethodID(
|
||||||
|
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||||
|
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
|
||||||
|
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
|
||||||
|
ToJDouble(env, max), ToJDouble(env, progress));
|
||||||
|
return GetJBoolean(env, jwasCancelled);
|
||||||
|
};
|
||||||
|
auto& session = EmulationSession::GetInstance();
|
||||||
|
return static_cast<jint>(
|
||||||
|
ContentManager::VerifyGameContents(session.System(), GetJString(env, jpath), callback));
|
||||||
|
}
|
||||||
|
|
||||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj,
|
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj,
|
||||||
jstring jprogramId) {
|
jstring jprogramId) {
|
||||||
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
|
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
|
||||||
@ -845,7 +963,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject j
|
|||||||
|
|
||||||
const auto nandDir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
|
const auto nandDir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir);
|
||||||
auto vfsNandDir = system.GetFilesystem()->OpenDirectory(Common::FS::PathToUTF8String(nandDir),
|
auto vfsNandDir = system.GetFilesystem()->OpenDirectory(Common::FS::PathToUTF8String(nandDir),
|
||||||
FileSys::Mode::Read);
|
FileSys::OpenMode::Read);
|
||||||
|
|
||||||
const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath(
|
const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath(
|
||||||
{}, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData,
|
{}, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData,
|
||||||
@ -875,4 +993,10 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env,
|
|||||||
EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries();
|
EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobject jobj) {
|
||||||
|
auto& system = EmulationSession::GetInstance().System();
|
||||||
|
system.GetFileSystemController().CreateFactories(*system.GetFilesystem());
|
||||||
|
return ContentManager::AreKeysPresent();
|
||||||
|
}
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
@ -45,7 +45,10 @@ public:
|
|||||||
const Core::PerfStatsResults& PerfStats();
|
const Core::PerfStatsResults& PerfStats();
|
||||||
void ConfigureFilesystemProvider(const std::string& filepath);
|
void ConfigureFilesystemProvider(const std::string& filepath);
|
||||||
void InitializeSystem(bool reload);
|
void InitializeSystem(bool reload);
|
||||||
Core::SystemResultStatus InitializeEmulation(const std::string& filepath);
|
void SetAppletId(int applet_id);
|
||||||
|
Core::SystemResultStatus InitializeEmulation(const std::string& filepath,
|
||||||
|
const std::size_t program_index,
|
||||||
|
const bool frontend_initiated);
|
||||||
|
|
||||||
bool IsHandheldOnly();
|
bool IsHandheldOnly();
|
||||||
void SetDeviceType([[maybe_unused]] int index, int type);
|
void SetDeviceType([[maybe_unused]] int index, int type);
|
||||||
@ -60,6 +63,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max);
|
static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max);
|
||||||
static void OnEmulationStopped(Core::SystemResultStatus result);
|
static void OnEmulationStopped(Core::SystemResultStatus result);
|
||||||
|
static void ChangeProgram(std::size_t program_index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Window management
|
// Window management
|
||||||
@ -77,6 +81,7 @@ private:
|
|||||||
std::atomic<bool> m_is_paused = false;
|
std::atomic<bool> m_is_paused = false;
|
||||||
SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
|
SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
|
||||||
std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider;
|
std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider;
|
||||||
|
int m_applet_id{1};
|
||||||
|
|
||||||
// GPU driver parameters
|
// GPU driver parameters
|
||||||
std::shared_ptr<Common::DynamicLibrary> m_vulkan_library;
|
std::shared_ptr<Common::DynamicLibrary> m_vulkan_library;
|
||||||
@ -84,4 +89,7 @@ private:
|
|||||||
// Synchronization
|
// Synchronization
|
||||||
std::condition_variable_any m_cv;
|
std::condition_variable_any m_cv;
|
||||||
mutable std::mutex m_mutex;
|
mutable std::mutex m_mutex;
|
||||||
|
|
||||||
|
// Program index for next boot
|
||||||
|
std::atomic<s32> m_next_program_index = -1;
|
||||||
};
|
};
|
||||||
|
9
src/android/app/src/main/res/drawable/ic_lock.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_lock.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:width="24dp">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" />
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_shortcut.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_shortcut.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M280,920q-33,0 -56.5,-23.5T200,840v-720q0,-33 23.5,-56.5T280,40h400q33,0 56.5,23.5T760,120v160h-80v-40L280,240v480h400v-40h80v160q0,33 -23.5,56.5T680,920L280,920ZM686,520L480,520v120h-80v-120q0,-33 23.5,-56.5T480,440h206l-62,-64 56,-56 160,160 -160,160 -56,-56 62,-64Z" />
|
||||||
|
</vector>
|
@ -11,12 +11,14 @@
|
|||||||
android:id="@+id/appbar_about"
|
android:id="@+id/appbar_about"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_about"
|
android:id="@+id/toolbar_about"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back"
|
app:navigationIcon="@drawable/ic_back"
|
||||||
app:title="@string/about" />
|
app:title="@string/about" />
|
||||||
|
|
||||||
@ -28,6 +30,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fadeScrollbars="false"
|
android:fadeScrollbars="false"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -0,0 +1,155 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/coordinator_about"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar_info"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar_info"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.core.widget.NestedScrollView
|
||||||
|
android:id="@+id/scroll_info"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/content_info"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:baselineAligned="false">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_weight="3"
|
||||||
|
android:gravity="top|center_horizontal"
|
||||||
|
android:paddingHorizontal="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/button_copy"
|
||||||
|
style="@style/Widget.Material3.Button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/copy_details" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/button_verify_integrity"
|
||||||
|
style="@style/Widget.Material3.Button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:text="@string/verify_integrity" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_weight="1">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/path"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/path_field"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:editable="false"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
android:inputType="none"
|
||||||
|
android:minHeight="48dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="1.0.0" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/program_id"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/program_id_field"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:editable="false"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
android:inputType="none"
|
||||||
|
android:minHeight="48dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="1.0.0" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/developer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/developer_field"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:editable="false"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
android:inputType="none"
|
||||||
|
android:minHeight="48dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="1.0.0" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/version"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/version_field"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:editable="false"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
android:inputType="none"
|
||||||
|
android:minHeight="48dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="1.0.0" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
@ -14,6 +14,7 @@
|
|||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:fadeScrollbars="false"
|
android:fadeScrollbars="false"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@+id/icon_layout"
|
app:layout_constraintStart_toEndOf="@+id/icon_layout"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
@ -43,16 +44,35 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
<Button
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/button_back"
|
android:layout_width="match_parent"
|
||||||
style="?attr/materialIconButtonStyle"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="start"
|
|
||||||
android:layout_margin="8dp"
|
android:layout_margin="8dp"
|
||||||
app:icon="@drawable/ic_back"
|
android:orientation="horizontal">
|
||||||
app:iconSize="24dp"
|
|
||||||
app:iconTint="?attr/colorOnSurface" />
|
<Button
|
||||||
|
android:id="@+id/button_back"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:icon="@drawable/ic_back"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_shortcut"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:icon="@drawable/ic_shortcut"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
style="?attr/materialCardViewElevatedStyle"
|
style="?attr/materialCardViewElevatedStyle"
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
android:focusable="false"
|
||||||
android:clickable="false"
|
android:clickable="false"
|
||||||
android:checked="false" />
|
android:checked="false" />
|
||||||
|
|
||||||
|
@ -6,16 +6,14 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginVertical="12dp"
|
android:layout_marginVertical="12dp">
|
||||||
android:focusable="true">
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:padding="16dp"
|
android:padding="16dp"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical">
|
||||||
android:animateLayoutChanges="true">
|
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:id="@+id/path"
|
android:id="@+id/path"
|
||||||
|
@ -11,12 +11,14 @@
|
|||||||
android:id="@+id/appbar_about"
|
android:id="@+id/appbar_about"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_about"
|
android:id="@+id/toolbar_about"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:title="@string/about"
|
app:title="@string/about"
|
||||||
app:navigationIcon="@drawable/ic_back" />
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
@ -28,6 +30,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
android:fadeScrollbars="false"
|
android:fadeScrollbars="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
@ -19,6 +20,7 @@
|
|||||||
android:id="@+id/toolbar_addons"
|
android:id="@+id/toolbar_addons"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back" />
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
@ -28,6 +30,8 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
|
android:nextFocusDown="@id/button_install"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
@ -10,12 +10,14 @@
|
|||||||
android:id="@+id/appbar_applets"
|
android:id="@+id/appbar_applets"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_applets"
|
android:id="@+id/toolbar_applets"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back"
|
app:navigationIcon="@drawable/ic_back"
|
||||||
app:title="@string/applets" />
|
app:title="@string/applets" />
|
||||||
|
|
||||||
|
@ -15,12 +15,14 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:liftOnScrollTargetViewId="@id/list_drivers">
|
app:liftOnScrollTargetViewId="@id/list_drivers">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_drivers"
|
android:id="@+id/toolbar_drivers"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back"
|
app:navigationIcon="@drawable/ic_back"
|
||||||
app:title="@string/gpu_driver_manager" />
|
app:title="@string/gpu_driver_manager" />
|
||||||
|
|
||||||
|
@ -11,12 +11,14 @@
|
|||||||
android:id="@+id/appbar_ea"
|
android:id="@+id/appbar_ea"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_about"
|
android:id="@+id/toolbar_about"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back"
|
app:navigationIcon="@drawable/ic_back"
|
||||||
app:title="@string/early_access" />
|
app:title="@string/early_access" />
|
||||||
|
|
||||||
@ -30,6 +32,7 @@
|
|||||||
android:paddingBottom="20dp"
|
android:paddingBottom="20dp"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
android:fadeScrollbars="false"
|
android:fadeScrollbars="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:keepScreenOn="true"
|
android:keepScreenOn="true"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
tools:context="org.yuzu.yuzu_emu.fragments.EmulationFragment"
|
tools:context="org.yuzu.yuzu_emu.fragments.EmulationFragment"
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
@ -24,7 +25,8 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:focusableInTouchMode="false" />
|
android:focusableInTouchMode="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false" />
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
android:id="@+id/loading_indicator"
|
android:id="@+id/loading_indicator"
|
||||||
@ -33,7 +35,9 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:clickable="false">
|
android:defaultFocusHighlightEnabled="false"
|
||||||
|
android:clickable="false"
|
||||||
|
app:rippleColor="@android:color/transparent">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/loading_layout"
|
android:id="@+id/loading_layout"
|
||||||
@ -118,6 +122,7 @@
|
|||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
android:focusableInTouchMode="true"
|
android:focusableInTouchMode="true"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
android:visibility="invisible" />
|
android:visibility="invisible" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
@ -160,6 +165,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="start"
|
android:layout_gravity="start"
|
||||||
|
android:focusedByDefault="true"
|
||||||
app:headerLayout="@layout/header_in_game"
|
app:headerLayout="@layout/header_in_game"
|
||||||
app:menu="@menu/menu_in_game"
|
app:menu="@menu/menu_in_game"
|
||||||
tools:visibility="gone" />
|
tools:visibility="gone" />
|
||||||
|
@ -15,12 +15,14 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:liftOnScrollTargetViewId="@id/list_folders">
|
app:liftOnScrollTargetViewId="@id/list_folders">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_folders"
|
android:id="@+id/toolbar_folders"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back"
|
app:navigationIcon="@drawable/ic_back"
|
||||||
app:title="@string/game_folders" />
|
app:title="@string/game_folders" />
|
||||||
|
|
||||||
@ -31,6 +33,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
@ -11,12 +11,14 @@
|
|||||||
android:id="@+id/appbar_info"
|
android:id="@+id/appbar_info"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_info"
|
android:id="@+id/toolbar_info"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:navigationIcon="@drawable/ic_back" />
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
@ -25,6 +27,7 @@
|
|||||||
android:id="@+id/scroll_info"
|
android:id="@+id/scroll_info"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@ -118,6 +121,14 @@
|
|||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:text="@string/copy_details" />
|
android:text="@string/copy_details" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/button_verify_integrity"
|
||||||
|
style="@style/Widget.Material3.Button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:text="@string/verify_integrity" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -13,7 +12,8 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
android:fadeScrollbars="false"
|
android:fadeScrollbars="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/layout_all"
|
android:id="@+id/layout_all"
|
||||||
@ -22,16 +22,35 @@
|
|||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:gravity="center_horizontal">
|
android:gravity="center_horizontal">
|
||||||
|
|
||||||
<Button
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/button_back"
|
android:layout_width="match_parent"
|
||||||
style="?attr/materialIconButtonStyle"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="8dp"
|
android:layout_margin="8dp"
|
||||||
android:layout_gravity="start"
|
android:orientation="horizontal">
|
||||||
app:icon="@drawable/ic_back"
|
|
||||||
app:iconSize="24dp"
|
<Button
|
||||||
app:iconTint="?attr/colorOnSurface" />
|
android:id="@+id/button_back"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:icon="@drawable/ic_back"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_shortcut"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:icon="@drawable/ic_shortcut"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
style="?attr/materialCardViewElevatedStyle"
|
style="?attr/materialCardViewElevatedStyle"
|
||||||
@ -45,7 +64,7 @@
|
|||||||
android:id="@+id/image_game_screen"
|
android:id="@+id/image_game_screen"
|
||||||
android:layout_width="175dp"
|
android:layout_width="175dp"
|
||||||
android:layout_height="175dp"
|
android:layout_height="175dp"
|
||||||
tools:src="@drawable/default_icon"/>
|
tools:src="@drawable/default_icon" />
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
@ -68,7 +87,7 @@
|
|||||||
android:id="@+id/list_properties"
|
android:id="@+id/list_properties"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:listitem="@layout/card_simple_outlined" />
|
android:defaultFocusHighlightEnabled="false" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false"
|
||||||
tools:listitem="@layout/card_game" />
|
tools:listitem="@layout/card_game" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
android:background="?attr/colorSurface"
|
android:background="?attr/colorSurface"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
android:fadeScrollbars="false"
|
android:fadeScrollbars="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
android:defaultFocusHighlightEnabled="false">
|
||||||
|
|
||||||
<androidx.appcompat.widget.LinearLayoutCompat
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:id="@+id/linear_layout_settings"
|
android:id="@+id/linear_layout_settings"
|
||||||
|
@ -10,12 +10,14 @@
|
|||||||
android:id="@+id/appbar_installables"
|
android:id="@+id/appbar_installables"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_installables"
|
android:id="@+id/toolbar_installables"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:title="@string/manage_yuzu_data"
|
app:title="@string/manage_yuzu_data"
|
||||||
app:navigationIcon="@drawable/ic_back" />
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
|
@ -10,12 +10,14 @@
|
|||||||
android:id="@+id/appbar_licenses"
|
android:id="@+id/appbar_licenses"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar_licenses"
|
android:id="@+id/toolbar_licenses"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:title="@string/licenses"
|
app:title="@string/licenses"
|
||||||
app:navigationIcon="@drawable/ic_back" />
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:elevation="0dp">
|
app:elevation="0dp">
|
||||||
|
|
||||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||||
@ -24,6 +25,7 @@
|
|||||||
android:id="@+id/toolbar_settings"
|
android:id="@+id/toolbar_settings"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:touchscreenBlocksFocus="false"
|
||||||
app:layout_collapseMode="pin"
|
app:layout_collapseMode="pin"
|
||||||
app:navigationIcon="@drawable/ic_back" />
|
app:navigationIcon="@drawable/ic_back" />
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?attr/selectableItemBackground"
|
android:background="?attr/selectableItemBackground"
|
||||||
android:focusable="true"
|
android:focusable="false"
|
||||||
android:paddingHorizontal="20dp"
|
android:paddingHorizontal="20dp"
|
||||||
android:paddingVertical="16dp">
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
@ -12,4 +12,5 @@
|
|||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textColor="?attr/colorPrimary"
|
android:textColor="?attr/colorPrimary"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
|
android:focusable="false"
|
||||||
tools:text="CPU Settings" />
|
tools:text="CPU Settings" />
|
||||||
|
@ -21,6 +21,11 @@
|
|||||||
android:icon="@drawable/ic_controller"
|
android:icon="@drawable/ic_controller"
|
||||||
android:title="@string/emulation_input_overlay" />
|
android:title="@string/emulation_input_overlay" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_lock_drawer"
|
||||||
|
android:icon="@drawable/ic_unlock"
|
||||||
|
android:title="@string/emulation_input_overlay" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_exit"
|
android:id="@+id/menu_exit"
|
||||||
android:icon="@drawable/ic_exit"
|
android:icon="@drawable/ic_exit"
|
||||||
|
@ -142,6 +142,11 @@
|
|||||||
<item quantity="other">Successfully imported %d saves</item>
|
<item quantity="other">Successfully imported %d saves</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="no_save_data_found">No save data found</string>
|
<string name="no_save_data_found">No save data found</string>
|
||||||
|
<string name="verify_installed_content">Verify installed content</string>
|
||||||
|
<string name="verify_installed_content_description">Checks all installed content for corruption</string>
|
||||||
|
<string name="keys_missing">Encryption keys are missing</string>
|
||||||
|
<string name="keys_missing_description">Firmware and retail games cannot be decrypted</string>
|
||||||
|
<string name="keys_missing_help">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
|
||||||
|
|
||||||
<!-- Applet launcher strings -->
|
<!-- Applet launcher strings -->
|
||||||
<string name="applets">Applet launcher</string>
|
<string name="applets">Applet launcher</string>
|
||||||
@ -288,6 +293,7 @@
|
|||||||
<string name="import_complete">Import complete</string>
|
<string name="import_complete">Import complete</string>
|
||||||
<string name="more_options">More options</string>
|
<string name="more_options">More options</string>
|
||||||
<string name="use_global_setting">Use global setting</string>
|
<string name="use_global_setting">Use global setting</string>
|
||||||
|
<string name="operation_completed_successfully">The operation completed successfully</string>
|
||||||
|
|
||||||
<!-- GPU driver installation -->
|
<!-- GPU driver installation -->
|
||||||
<string name="select_gpu_driver">Select GPU driver</string>
|
<string name="select_gpu_driver">Select GPU driver</string>
|
||||||
@ -352,6 +358,14 @@
|
|||||||
<string name="content_install_notice_description">The content that you selected does not match this game.\nInstall anyway?</string>
|
<string name="content_install_notice_description">The content that you selected does not match this game.\nInstall anyway?</string>
|
||||||
<string name="confirm_uninstall">Confirm uninstall</string>
|
<string name="confirm_uninstall">Confirm uninstall</string>
|
||||||
<string name="confirm_uninstall_description">Are you sure you want to uninstall this addon?</string>
|
<string name="confirm_uninstall_description">Are you sure you want to uninstall this addon?</string>
|
||||||
|
<string name="verify_integrity">Verify integrity</string>
|
||||||
|
<string name="verifying">Verifying…</string>
|
||||||
|
<string name="verify_success">Integrity verification succeeded!</string>
|
||||||
|
<string name="verify_failure">Integrity verification failed!</string>
|
||||||
|
<string name="verify_failure_description">File contents may be corrupt</string>
|
||||||
|
<string name="verify_no_result">Integrity verification couldn\'t be performed</string>
|
||||||
|
<string name="verify_no_result_description">File contents were not checked for validity</string>
|
||||||
|
<string name="verification_failed_for">Verification failed for the following files:\n%1$s</string>
|
||||||
|
|
||||||
<!-- ROM loading errors -->
|
<!-- ROM loading errors -->
|
||||||
<string name="loader_error_encrypted">Your ROM is encrypted</string>
|
<string name="loader_error_encrypted">Your ROM is encrypted</string>
|
||||||
@ -381,6 +395,8 @@
|
|||||||
<string name="emulation_unpause">Unpause emulation</string>
|
<string name="emulation_unpause">Unpause emulation</string>
|
||||||
<string name="emulation_input_overlay">Overlay options</string>
|
<string name="emulation_input_overlay">Overlay options</string>
|
||||||
<string name="touchscreen">Touchscreen</string>
|
<string name="touchscreen">Touchscreen</string>
|
||||||
|
<string name="lock_drawer">Lock drawer</string>
|
||||||
|
<string name="unlock_drawer">Unlock drawer</string>
|
||||||
|
|
||||||
<string name="load_settings">Loading settings…</string>
|
<string name="load_settings">Loading settings…</string>
|
||||||
|
|
||||||
|
@ -210,8 +210,6 @@ add_library(audio_core STATIC
|
|||||||
sink/sink_stream.h
|
sink/sink_stream.h
|
||||||
)
|
)
|
||||||
|
|
||||||
create_target_directory_groups(audio_core)
|
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_compile_options(audio_core PRIVATE
|
target_compile_options(audio_core PRIVATE
|
||||||
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
|
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
|
||||||
@ -267,3 +265,5 @@ endif()
|
|||||||
if (YUZU_USE_PRECOMPILED_HEADERS)
|
if (YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
target_precompile_headers(audio_core PRIVATE precompiled_headers.h)
|
target_precompile_headers(audio_core PRIVATE precompiled_headers.h)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
create_target_directory_groups(audio_core)
|
||||||
|
@ -89,11 +89,13 @@ u32 AudioRenderer::Receive(Direction dir) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AudioRenderer::SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit,
|
void AudioRenderer::SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit,
|
||||||
u64 applet_resource_user_id, bool reset) noexcept {
|
u64 applet_resource_user_id, Kernel::KProcess* process,
|
||||||
|
bool reset) noexcept {
|
||||||
command_buffers[session_id].buffer = buffer;
|
command_buffers[session_id].buffer = buffer;
|
||||||
command_buffers[session_id].size = size;
|
command_buffers[session_id].size = size;
|
||||||
command_buffers[session_id].time_limit = time_limit;
|
command_buffers[session_id].time_limit = time_limit;
|
||||||
command_buffers[session_id].applet_resource_user_id = applet_resource_user_id;
|
command_buffers[session_id].applet_resource_user_id = applet_resource_user_id;
|
||||||
|
command_buffers[session_id].process = process;
|
||||||
command_buffers[session_id].reset_buffer = reset;
|
command_buffers[session_id].reset_buffer = reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,7 +175,8 @@ void AudioRenderer::Main(std::stop_token stop_token) {
|
|||||||
// If there are no remaining commands (from the previous list),
|
// If there are no remaining commands (from the previous list),
|
||||||
// this is a new command list, initialize it.
|
// this is a new command list, initialize it.
|
||||||
if (command_buffer.remaining_command_count == 0) {
|
if (command_buffer.remaining_command_count == 0) {
|
||||||
command_list_processor.Initialize(system, command_buffer.buffer,
|
command_list_processor.Initialize(system, *command_buffer.process,
|
||||||
|
command_buffer.buffer,
|
||||||
command_buffer.size, streams[index]);
|
command_buffer.size, streams[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,10 @@ namespace Core {
|
|||||||
class System;
|
class System;
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class KProcess;
|
||||||
|
}
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
namespace Sink {
|
namespace Sink {
|
||||||
class Sink;
|
class Sink;
|
||||||
@ -69,7 +73,8 @@ public:
|
|||||||
u32 Receive(Direction dir);
|
u32 Receive(Direction dir);
|
||||||
|
|
||||||
void SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit,
|
void SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit,
|
||||||
u64 applet_resource_user_id, bool reset) noexcept;
|
u64 applet_resource_user_id, Kernel::KProcess* process,
|
||||||
|
bool reset) noexcept;
|
||||||
u32 GetRemainCommandCount(s32 session_id) const noexcept;
|
u32 GetRemainCommandCount(s32 session_id) const noexcept;
|
||||||
void ClearRemainCommandCount(s32 session_id) noexcept;
|
void ClearRemainCommandCount(s32 session_id) noexcept;
|
||||||
u64 GetRenderingStartTick(s32 session_id) const noexcept;
|
u64 GetRenderingStartTick(s32 session_id) const noexcept;
|
||||||
|
@ -6,6 +6,10 @@
|
|||||||
#include "audio_core/common/common.h"
|
#include "audio_core/common/common.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class KProcess;
|
||||||
|
}
|
||||||
|
|
||||||
namespace AudioCore::ADSP::AudioRenderer {
|
namespace AudioCore::ADSP::AudioRenderer {
|
||||||
|
|
||||||
struct CommandBuffer {
|
struct CommandBuffer {
|
||||||
@ -14,6 +18,7 @@ struct CommandBuffer {
|
|||||||
u64 size{};
|
u64 size{};
|
||||||
u64 time_limit{};
|
u64 time_limit{};
|
||||||
u64 applet_resource_user_id{};
|
u64 applet_resource_user_id{};
|
||||||
|
Kernel::KProcess* process{};
|
||||||
bool reset_buffer{};
|
bool reset_buffer{};
|
||||||
// Set by the DSP
|
// Set by the DSP
|
||||||
u32 remaining_command_count{};
|
u32 remaining_command_count{};
|
||||||
|
@ -9,14 +9,15 @@
|
|||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
|
#include "core/hle/kernel/k_process.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
namespace AudioCore::ADSP::AudioRenderer {
|
namespace AudioCore::ADSP::AudioRenderer {
|
||||||
|
|
||||||
void CommandListProcessor::Initialize(Core::System& system_, CpuAddr buffer, u64 size,
|
void CommandListProcessor::Initialize(Core::System& system_, Kernel::KProcess& process,
|
||||||
Sink::SinkStream* stream_) {
|
CpuAddr buffer, u64 size, Sink::SinkStream* stream_) {
|
||||||
system = &system_;
|
system = &system_;
|
||||||
memory = &system->ApplicationMemory();
|
memory = &process.GetMemory();
|
||||||
stream = stream_;
|
stream = stream_;
|
||||||
header = reinterpret_cast<Renderer::CommandListHeader*>(buffer);
|
header = reinterpret_cast<Renderer::CommandListHeader*>(buffer);
|
||||||
commands = reinterpret_cast<u8*>(buffer + sizeof(Renderer::CommandListHeader));
|
commands = reinterpret_cast<u8*>(buffer + sizeof(Renderer::CommandListHeader));
|
||||||
|
@ -16,6 +16,10 @@ class Memory;
|
|||||||
class System;
|
class System;
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class KProcess;
|
||||||
|
}
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
namespace Sink {
|
namespace Sink {
|
||||||
class SinkStream;
|
class SinkStream;
|
||||||
@ -40,7 +44,8 @@ public:
|
|||||||
* @param size - The size of the buffer.
|
* @param size - The size of the buffer.
|
||||||
* @param stream - The stream to be used for sending the samples.
|
* @param stream - The stream to be used for sending the samples.
|
||||||
*/
|
*/
|
||||||
void Initialize(Core::System& system, CpuAddr buffer, u64 size, Sink::SinkStream* stream);
|
void Initialize(Core::System& system, Kernel::KProcess& process, CpuAddr buffer, u64 size,
|
||||||
|
Sink::SinkStream* stream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the maximum processing time for this command list.
|
* Set the maximum processing time for this command list.
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "audio_core/sink/sink_stream.h"
|
#include "audio_core/sink/sink_stream.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
|
#include "core/guest_memory.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
#include "core/hle/kernel/k_process.h"
|
#include "core/hle/kernel/k_process.h"
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "audio_core/renderer/audio_renderer.h"
|
#include "audio_core/renderer/audio_renderer.h"
|
||||||
#include "audio_core/renderer/system_manager.h"
|
#include "audio_core/renderer/system_manager.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
#include "core/hle/kernel/k_process.h"
|
||||||
#include "core/hle/kernel/k_transfer_memory.h"
|
#include "core/hle/kernel/k_transfer_memory.h"
|
||||||
#include "core/hle/service/audio/errors.h"
|
#include "core/hle/service/audio/errors.h"
|
||||||
|
|
||||||
@ -17,7 +18,8 @@ Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* ren
|
|||||||
Result Renderer::Initialize(const AudioRendererParameterInternal& params,
|
Result Renderer::Initialize(const AudioRendererParameterInternal& params,
|
||||||
Kernel::KTransferMemory* transfer_memory,
|
Kernel::KTransferMemory* transfer_memory,
|
||||||
const u64 transfer_memory_size, const u32 process_handle,
|
const u64 transfer_memory_size, const u32 process_handle,
|
||||||
const u64 applet_resource_user_id, const s32 session_id) {
|
Kernel::KProcess& process, const u64 applet_resource_user_id,
|
||||||
|
const s32 session_id) {
|
||||||
if (params.execution_mode == ExecutionMode::Auto) {
|
if (params.execution_mode == ExecutionMode::Auto) {
|
||||||
if (!manager.AddSystem(system)) {
|
if (!manager.AddSystem(system)) {
|
||||||
LOG_ERROR(Service_Audio,
|
LOG_ERROR(Service_Audio,
|
||||||
@ -28,7 +30,7 @@ Result Renderer::Initialize(const AudioRendererParameterInternal& params,
|
|||||||
}
|
}
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
system.Initialize(params, transfer_memory, transfer_memory_size, process_handle,
|
system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, process,
|
||||||
applet_resource_user_id, session_id);
|
applet_resource_user_id, session_id);
|
||||||
|
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
|
@ -14,7 +14,8 @@ class System;
|
|||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class KTransferMemory;
|
class KTransferMemory;
|
||||||
}
|
class KProcess;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
struct AudioRendererParameterInternal;
|
struct AudioRendererParameterInternal;
|
||||||
@ -44,7 +45,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
Result Initialize(const AudioRendererParameterInternal& params,
|
Result Initialize(const AudioRendererParameterInternal& params,
|
||||||
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
||||||
u32 process_handle, u64 applet_resource_user_id, s32 session_id);
|
u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id,
|
||||||
|
s32 session_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalize the renderer for shutdown.
|
* Finalize the renderer for shutdown.
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "common/fixed_point.h"
|
#include "common/fixed_point.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/scratch_buffer.h"
|
#include "common/scratch_buffer.h"
|
||||||
|
#include "core/guest_memory.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
namespace AudioCore::Renderer {
|
namespace AudioCore::Renderer {
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/hle/kernel/k_event.h"
|
#include "core/hle/kernel/k_event.h"
|
||||||
|
#include "core/hle/kernel/k_process.h"
|
||||||
#include "core/hle/kernel/k_transfer_memory.h"
|
#include "core/hle/kernel/k_transfer_memory.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
@ -101,7 +102,8 @@ System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_)
|
|||||||
|
|
||||||
Result System::Initialize(const AudioRendererParameterInternal& params,
|
Result System::Initialize(const AudioRendererParameterInternal& params,
|
||||||
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
||||||
u32 process_handle_, u64 applet_resource_user_id_, s32 session_id_) {
|
u32 process_handle_, Kernel::KProcess& process_,
|
||||||
|
u64 applet_resource_user_id_, s32 session_id_) {
|
||||||
if (!CheckValidRevision(params.revision)) {
|
if (!CheckValidRevision(params.revision)) {
|
||||||
return Service::Audio::ResultInvalidRevision;
|
return Service::Audio::ResultInvalidRevision;
|
||||||
}
|
}
|
||||||
@ -117,6 +119,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params,
|
|||||||
behavior.SetUserLibRevision(params.revision);
|
behavior.SetUserLibRevision(params.revision);
|
||||||
|
|
||||||
process_handle = process_handle_;
|
process_handle = process_handle_;
|
||||||
|
process = &process_;
|
||||||
applet_resource_user_id = applet_resource_user_id_;
|
applet_resource_user_id = applet_resource_user_id_;
|
||||||
session_id = session_id_;
|
session_id = session_id_;
|
||||||
|
|
||||||
@ -129,7 +132,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params,
|
|||||||
render_device = params.rendering_device;
|
render_device = params.rendering_device;
|
||||||
execution_mode = params.execution_mode;
|
execution_mode = params.execution_mode;
|
||||||
|
|
||||||
core.ApplicationMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size);
|
process->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size);
|
||||||
|
|
||||||
// Note: We're not actually using the transfer memory because it's a pain to code for.
|
// Note: We're not actually using the transfer memory because it's a pain to code for.
|
||||||
// Allocate the memory normally instead and hope the game doesn't try to read anything back
|
// Allocate the memory normally instead and hope the game doesn't try to read anything back
|
||||||
@ -613,7 +616,8 @@ void System::SendCommandToDsp() {
|
|||||||
static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 *
|
static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 *
|
||||||
(static_cast<f32>(render_time_limit_percent) / 100.0f))};
|
(static_cast<f32>(render_time_limit_percent) / 100.0f))};
|
||||||
audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit,
|
audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit,
|
||||||
applet_resource_user_id, reset_command_buffers);
|
applet_resource_user_id, process,
|
||||||
|
reset_command_buffers);
|
||||||
reset_command_buffers = false;
|
reset_command_buffers = false;
|
||||||
command_buffer_size = command_size;
|
command_buffer_size = command_size;
|
||||||
if (remaining_command_count == 0) {
|
if (remaining_command_count == 0) {
|
||||||
|
@ -29,6 +29,7 @@ class System;
|
|||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class KEvent;
|
class KEvent;
|
||||||
|
class KProcess;
|
||||||
class KTransferMemory;
|
class KTransferMemory;
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
|
||||||
@ -80,7 +81,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
Result Initialize(const AudioRendererParameterInternal& params,
|
Result Initialize(const AudioRendererParameterInternal& params,
|
||||||
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
||||||
u32 process_handle, u64 applet_resource_user_id, s32 session_id);
|
u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id,
|
||||||
|
s32 session_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalize the system.
|
* Finalize the system.
|
||||||
@ -275,6 +277,8 @@ private:
|
|||||||
Common::Event terminate_event{};
|
Common::Event terminate_event{};
|
||||||
/// Does what locks do
|
/// Does what locks do
|
||||||
std::mutex lock{};
|
std::mutex lock{};
|
||||||
|
/// Process this audio render is operating within, used for memory reads/writes.
|
||||||
|
Kernel::KProcess* process{};
|
||||||
/// Handle for the process for this system, unused
|
/// Handle for the process for this system, unused
|
||||||
u32 process_handle{};
|
u32 process_handle{};
|
||||||
/// Applet resource id for this system, unused
|
/// Applet resource id for this system, unused
|
||||||
|
@ -106,6 +106,7 @@ add_library(common STATIC
|
|||||||
precompiled_headers.h
|
precompiled_headers.h
|
||||||
quaternion.h
|
quaternion.h
|
||||||
range_map.h
|
range_map.h
|
||||||
|
range_mutex.h
|
||||||
reader_writer_queue.h
|
reader_writer_queue.h
|
||||||
ring_buffer.h
|
ring_buffer.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/scm_rev.cpp
|
${CMAKE_CURRENT_BINARY_DIR}/scm_rev.cpp
|
||||||
@ -244,8 +245,6 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
create_target_directory_groups(common)
|
|
||||||
|
|
||||||
target_link_libraries(common PUBLIC Boost::context Boost::headers fmt::fmt microprofile stb::headers Threads::Threads)
|
target_link_libraries(common PUBLIC Boost::context Boost::headers fmt::fmt microprofile stb::headers Threads::Threads)
|
||||||
target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd LLVM::Demangle)
|
target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd LLVM::Demangle)
|
||||||
|
|
||||||
@ -257,3 +256,5 @@ endif()
|
|||||||
if (YUZU_USE_PRECOMPILED_HEADERS)
|
if (YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
target_precompile_headers(common PRIVATE precompiled_headers.h)
|
target_precompile_headers(common PRIVATE precompiled_headers.h)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
create_target_directory_groups(common)
|
||||||
|
@ -30,27 +30,27 @@ NativeClock::NativeClock() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::nanoseconds NativeClock::GetTimeNS() const {
|
std::chrono::nanoseconds NativeClock::GetTimeNS() const {
|
||||||
return std::chrono::nanoseconds{MultiplyHigh(GetHostTicksElapsed(), ns_cntfrq_factor)};
|
return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_cntfrq_factor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::microseconds NativeClock::GetTimeUS() const {
|
std::chrono::microseconds NativeClock::GetTimeUS() const {
|
||||||
return std::chrono::microseconds{MultiplyHigh(GetHostTicksElapsed(), us_cntfrq_factor)};
|
return std::chrono::microseconds{MultiplyHigh(GetUptime(), us_cntfrq_factor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::milliseconds NativeClock::GetTimeMS() const {
|
std::chrono::milliseconds NativeClock::GetTimeMS() const {
|
||||||
return std::chrono::milliseconds{MultiplyHigh(GetHostTicksElapsed(), ms_cntfrq_factor)};
|
return std::chrono::milliseconds{MultiplyHigh(GetUptime(), ms_cntfrq_factor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetCNTPCT() const {
|
s64 NativeClock::GetCNTPCT() const {
|
||||||
return MultiplyHigh(GetHostTicksElapsed(), guest_cntfrq_factor);
|
return MultiplyHigh(GetUptime(), guest_cntfrq_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetGPUTick() const {
|
s64 NativeClock::GetGPUTick() const {
|
||||||
return MultiplyHigh(GetHostTicksElapsed(), gputick_cntfrq_factor);
|
return MultiplyHigh(GetUptime(), gputick_cntfrq_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetHostTicksNow() const {
|
s64 NativeClock::GetUptime() const {
|
||||||
u64 cntvct_el0 = 0;
|
s64 cntvct_el0 = 0;
|
||||||
asm volatile("dsb ish\n\t"
|
asm volatile("dsb ish\n\t"
|
||||||
"mrs %[cntvct_el0], cntvct_el0\n\t"
|
"mrs %[cntvct_el0], cntvct_el0\n\t"
|
||||||
"dsb ish\n\t"
|
"dsb ish\n\t"
|
||||||
@ -58,15 +58,11 @@ u64 NativeClock::GetHostTicksNow() const {
|
|||||||
return cntvct_el0;
|
return cntvct_el0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetHostTicksElapsed() const {
|
|
||||||
return GetHostTicksNow();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NativeClock::IsNative() const {
|
bool NativeClock::IsNative() const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetHostCNTFRQ() {
|
s64 NativeClock::GetHostCNTFRQ() {
|
||||||
u64 cntfrq_el0 = 0;
|
u64 cntfrq_el0 = 0;
|
||||||
std::string_view board{""};
|
std::string_view board{""};
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
|
@ -17,17 +17,15 @@ public:
|
|||||||
|
|
||||||
std::chrono::milliseconds GetTimeMS() const override;
|
std::chrono::milliseconds GetTimeMS() const override;
|
||||||
|
|
||||||
u64 GetCNTPCT() const override;
|
s64 GetCNTPCT() const override;
|
||||||
|
|
||||||
u64 GetGPUTick() const override;
|
s64 GetGPUTick() const override;
|
||||||
|
|
||||||
u64 GetHostTicksNow() const override;
|
s64 GetUptime() const override;
|
||||||
|
|
||||||
u64 GetHostTicksElapsed() const override;
|
|
||||||
|
|
||||||
bool IsNative() const override;
|
bool IsNative() const override;
|
||||||
|
|
||||||
static u64 GetHostCNTFRQ();
|
static s64 GetHostCNTFRQ();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using FactorType = unsigned __int128;
|
using FactorType = unsigned __int128;
|
||||||
|
@ -15,25 +15,34 @@ namespace Common {
|
|||||||
|
|
||||||
#if _MSC_VER
|
#if _MSC_VER
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected) {
|
template <typename T>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap(T* pointer, T value, T expected);
|
||||||
|
template <typename T>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap(T* pointer, T value, T expected, T& actual);
|
||||||
|
|
||||||
|
template <>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u8>(u8* pointer, u8 value, u8 expected) {
|
||||||
const u8 result =
|
const u8 result =
|
||||||
_InterlockedCompareExchange8(reinterpret_cast<volatile char*>(pointer), value, expected);
|
_InterlockedCompareExchange8(reinterpret_cast<volatile char*>(pointer), value, expected);
|
||||||
return result == expected;
|
return result == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u16* pointer, u16 value, u16 expected) {
|
template <>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u16>(u16* pointer, u16 value, u16 expected) {
|
||||||
const u16 result =
|
const u16 result =
|
||||||
_InterlockedCompareExchange16(reinterpret_cast<volatile short*>(pointer), value, expected);
|
_InterlockedCompareExchange16(reinterpret_cast<volatile short*>(pointer), value, expected);
|
||||||
return result == expected;
|
return result == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u32* pointer, u32 value, u32 expected) {
|
template <>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u32>(u32* pointer, u32 value, u32 expected) {
|
||||||
const u32 result =
|
const u32 result =
|
||||||
_InterlockedCompareExchange(reinterpret_cast<volatile long*>(pointer), value, expected);
|
_InterlockedCompareExchange(reinterpret_cast<volatile long*>(pointer), value, expected);
|
||||||
return result == expected;
|
return result == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u64 value, u64 expected) {
|
template <>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u64>(u64* pointer, u64 value, u64 expected) {
|
||||||
const u64 result = _InterlockedCompareExchange64(reinterpret_cast<volatile __int64*>(pointer),
|
const u64 result = _InterlockedCompareExchange64(reinterpret_cast<volatile __int64*>(pointer),
|
||||||
value, expected);
|
value, expected);
|
||||||
return result == expected;
|
return result == expected;
|
||||||
@ -45,29 +54,32 @@ namespace Common {
|
|||||||
reinterpret_cast<__int64*>(expected.data())) != 0;
|
reinterpret_cast<__int64*>(expected.data())) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected,
|
template <>
|
||||||
u8& actual) {
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u8>(u8* pointer, u8 value, u8 expected, u8& actual) {
|
||||||
actual =
|
actual =
|
||||||
_InterlockedCompareExchange8(reinterpret_cast<volatile char*>(pointer), value, expected);
|
_InterlockedCompareExchange8(reinterpret_cast<volatile char*>(pointer), value, expected);
|
||||||
return actual == expected;
|
return actual == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u16* pointer, u16 value, u16 expected,
|
template <>
|
||||||
u16& actual) {
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u16>(u16* pointer, u16 value, u16 expected,
|
||||||
|
u16& actual) {
|
||||||
actual =
|
actual =
|
||||||
_InterlockedCompareExchange16(reinterpret_cast<volatile short*>(pointer), value, expected);
|
_InterlockedCompareExchange16(reinterpret_cast<volatile short*>(pointer), value, expected);
|
||||||
return actual == expected;
|
return actual == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u32* pointer, u32 value, u32 expected,
|
template <>
|
||||||
u32& actual) {
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u32>(u32* pointer, u32 value, u32 expected,
|
||||||
|
u32& actual) {
|
||||||
actual =
|
actual =
|
||||||
_InterlockedCompareExchange(reinterpret_cast<volatile long*>(pointer), value, expected);
|
_InterlockedCompareExchange(reinterpret_cast<volatile long*>(pointer), value, expected);
|
||||||
return actual == expected;
|
return actual == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u64 value, u64 expected,
|
template <>
|
||||||
u64& actual) {
|
[[nodiscard]] inline bool AtomicCompareAndSwap<u64>(u64* pointer, u64 value, u64 expected,
|
||||||
|
u64& actual) {
|
||||||
actual = _InterlockedCompareExchange64(reinterpret_cast<volatile __int64*>(pointer), value,
|
actual = _InterlockedCompareExchange64(reinterpret_cast<volatile __int64*>(pointer), value,
|
||||||
expected);
|
expected);
|
||||||
return actual == expected;
|
return actual == expected;
|
||||||
@ -91,23 +103,12 @@ namespace Common {
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected) {
|
template <typename T>
|
||||||
|
[[nodiscard]] inline bool AtomicCompareAndSwap(T* pointer, T value, T expected) {
|
||||||
return __sync_bool_compare_and_swap(pointer, expected, value);
|
return __sync_bool_compare_and_swap(pointer, expected, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u16* pointer, u16 value, u16 expected) {
|
[[nodiscard]] inline bool AtomicCompareAndSwap(u64* pointer, u128 value, u128 expected) {
|
||||||
return __sync_bool_compare_and_swap(pointer, expected, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u32* pointer, u32 value, u32 expected) {
|
|
||||||
return __sync_bool_compare_and_swap(pointer, expected, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u64 value, u64 expected) {
|
|
||||||
return __sync_bool_compare_and_swap(pointer, expected, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u128 value, u128 expected) {
|
|
||||||
unsigned __int128 value_a;
|
unsigned __int128 value_a;
|
||||||
unsigned __int128 expected_a;
|
unsigned __int128 expected_a;
|
||||||
std::memcpy(&value_a, value.data(), sizeof(u128));
|
std::memcpy(&value_a, value.data(), sizeof(u128));
|
||||||
@ -115,31 +116,13 @@ namespace Common {
|
|||||||
return __sync_bool_compare_and_swap((unsigned __int128*)pointer, expected_a, value_a);
|
return __sync_bool_compare_and_swap((unsigned __int128*)pointer, expected_a, value_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected,
|
template <typename T>
|
||||||
u8& actual) {
|
[[nodiscard]] inline bool AtomicCompareAndSwap(T* pointer, T value, T expected, T& actual) {
|
||||||
actual = __sync_val_compare_and_swap(pointer, expected, value);
|
actual = __sync_val_compare_and_swap(pointer, expected, value);
|
||||||
return actual == expected;
|
return actual == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u16* pointer, u16 value, u16 expected,
|
[[nodiscard]] inline bool AtomicCompareAndSwap(u64* pointer, u128 value, u128 expected,
|
||||||
u16& actual) {
|
|
||||||
actual = __sync_val_compare_and_swap(pointer, expected, value);
|
|
||||||
return actual == expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u32* pointer, u32 value, u32 expected,
|
|
||||||
u32& actual) {
|
|
||||||
actual = __sync_val_compare_and_swap(pointer, expected, value);
|
|
||||||
return actual == expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u64 value, u64 expected,
|
|
||||||
u64& actual) {
|
|
||||||
actual = __sync_val_compare_and_swap(pointer, expected, value);
|
|
||||||
return actual == expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u128 value, u128 expected,
|
|
||||||
u128& actual) {
|
u128& actual) {
|
||||||
unsigned __int128 value_a;
|
unsigned __int128 value_a;
|
||||||
unsigned __int128 expected_a;
|
unsigned __int128 expected_a;
|
||||||
@ -151,7 +134,7 @@ namespace Common {
|
|||||||
return actual_a == expected_a;
|
return actual_a == expected_a;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline u128 AtomicLoad128(volatile u64* pointer) {
|
[[nodiscard]] inline u128 AtomicLoad128(u64* pointer) {
|
||||||
unsigned __int128 zeros_a = 0;
|
unsigned __int128 zeros_a = 0;
|
||||||
unsigned __int128 result_a =
|
unsigned __int128 result_a =
|
||||||
__sync_val_compare_and_swap((unsigned __int128*)pointer, zeros_a, zeros_a);
|
__sync_val_compare_and_swap((unsigned __int128*)pointer, zeros_a, zeros_a);
|
||||||
|
@ -45,6 +45,7 @@ using f32 = float; ///< 32-bit floating point
|
|||||||
using f64 = double; ///< 64-bit floating point
|
using f64 = double; ///< 64-bit floating point
|
||||||
|
|
||||||
using VAddr = u64; ///< Represents a pointer in the userspace virtual address space.
|
using VAddr = u64; ///< Represents a pointer in the userspace virtual address space.
|
||||||
|
using DAddr = u64; ///< Represents a pointer in the device specific virtual address space.
|
||||||
using PAddr = u64; ///< Represents a pointer in the ARM11 physical address space.
|
using PAddr = u64; ///< Represents a pointer in the ARM11 physical address space.
|
||||||
using GPUVAddr = u64; ///< Represents a pointer in the GPU virtual address space.
|
using GPUVAddr = u64; ///< Represents a pointer in the GPU virtual address space.
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include "bit_cast.h"
|
#include "bit_cast.h"
|
||||||
|
|
||||||
@ -19,4 +20,21 @@ inline T WrappingAdd(T lhs, T rhs) {
|
|||||||
return BitCast<T>(lhs_u + rhs_u);
|
return BitCast<T>(lhs_u + rhs_u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
requires(std::is_integral_v<T> && std::is_signed_v<T>)
|
||||||
|
inline bool CanAddWithoutOverflow(T lhs, T rhs) {
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
if (lhs >= 0 && rhs >= 0) {
|
||||||
|
return WrappingAdd(lhs, rhs) >= std::max(lhs, rhs);
|
||||||
|
} else if (lhs < 0 && rhs < 0) {
|
||||||
|
return WrappingAdd(lhs, rhs) <= std::min(lhs, rhs);
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
T res;
|
||||||
|
return !__builtin_add_overflow(lhs, rhs, &res);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
93
src/common/range_mutex.h
Normal file
93
src/common/range_mutex.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include "common/intrusive_list.h"
|
||||||
|
|
||||||
|
namespace Common {
|
||||||
|
|
||||||
|
class ScopedRangeLock;
|
||||||
|
|
||||||
|
class RangeMutex {
|
||||||
|
public:
|
||||||
|
explicit RangeMutex() = default;
|
||||||
|
~RangeMutex() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class ScopedRangeLock;
|
||||||
|
|
||||||
|
void Lock(ScopedRangeLock& l);
|
||||||
|
void Unlock(ScopedRangeLock& l);
|
||||||
|
bool HasIntersectionLocked(ScopedRangeLock& l);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::mutex m_mutex;
|
||||||
|
std::condition_variable m_cv;
|
||||||
|
|
||||||
|
using LockList = Common::IntrusiveListBaseTraits<ScopedRangeLock>::ListType;
|
||||||
|
LockList m_list;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScopedRangeLock : public Common::IntrusiveListBaseNode<ScopedRangeLock> {
|
||||||
|
public:
|
||||||
|
explicit ScopedRangeLock(RangeMutex& mutex, u64 address, u64 size)
|
||||||
|
: m_mutex(mutex), m_address(address), m_size(size) {
|
||||||
|
if (m_size > 0) {
|
||||||
|
m_mutex.Lock(*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~ScopedRangeLock() {
|
||||||
|
if (m_size > 0) {
|
||||||
|
m_mutex.Unlock(*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 GetAddress() const {
|
||||||
|
return m_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 GetSize() const {
|
||||||
|
return m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
RangeMutex& m_mutex;
|
||||||
|
const u64 m_address{};
|
||||||
|
const u64 m_size{};
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void RangeMutex::Lock(ScopedRangeLock& l) {
|
||||||
|
std::unique_lock lk{m_mutex};
|
||||||
|
m_cv.wait(lk, [&] { return !HasIntersectionLocked(l); });
|
||||||
|
m_list.push_back(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void RangeMutex::Unlock(ScopedRangeLock& l) {
|
||||||
|
{
|
||||||
|
std::scoped_lock lk{m_mutex};
|
||||||
|
m_list.erase(m_list.iterator_to(l));
|
||||||
|
}
|
||||||
|
m_cv.notify_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool RangeMutex::HasIntersectionLocked(ScopedRangeLock& l) {
|
||||||
|
const auto cur_begin = l.GetAddress();
|
||||||
|
const auto cur_last = l.GetAddress() + l.GetSize() - 1;
|
||||||
|
|
||||||
|
for (const auto& other : m_list) {
|
||||||
|
const auto other_begin = other.GetAddress();
|
||||||
|
const auto other_last = other.GetAddress() + other.GetSize() - 1;
|
||||||
|
|
||||||
|
if (cur_begin <= other_last && other_begin <= cur_last) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Common
|
@ -134,12 +134,12 @@ struct Values {
|
|||||||
Linkage linkage{};
|
Linkage linkage{};
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
Setting<AudioEngine> sink_id{linkage, AudioEngine::Auto, "output_engine", Category::Audio,
|
SwitchableSetting<AudioEngine> sink_id{linkage, AudioEngine::Auto, "output_engine",
|
||||||
Specialization::RuntimeList};
|
Category::Audio, Specialization::RuntimeList};
|
||||||
Setting<std::string> audio_output_device_id{linkage, "auto", "output_device", Category::Audio,
|
SwitchableSetting<std::string> audio_output_device_id{
|
||||||
Specialization::RuntimeList};
|
linkage, "auto", "output_device", Category::Audio, Specialization::RuntimeList};
|
||||||
Setting<std::string> audio_input_device_id{linkage, "auto", "input_device", Category::Audio,
|
SwitchableSetting<std::string> audio_input_device_id{
|
||||||
Specialization::RuntimeList};
|
linkage, "auto", "input_device", Category::Audio, Specialization::RuntimeList};
|
||||||
SwitchableSetting<AudioMode, true> sound_index{
|
SwitchableSetting<AudioMode, true> sound_index{
|
||||||
linkage, AudioMode::Stereo, AudioMode::Mono, AudioMode::Surround,
|
linkage, AudioMode::Stereo, AudioMode::Mono, AudioMode::Surround,
|
||||||
"sound_index", Category::SystemAudio, Specialization::Default, true,
|
"sound_index", Category::SystemAudio, Specialization::Default, true,
|
||||||
@ -419,9 +419,16 @@ struct Values {
|
|||||||
linkage, false, "custom_rtc_enabled", Category::System, Specialization::Paired, true, true};
|
linkage, false, "custom_rtc_enabled", Category::System, Specialization::Paired, true, true};
|
||||||
SwitchableSetting<s64> custom_rtc{
|
SwitchableSetting<s64> custom_rtc{
|
||||||
linkage, 0, "custom_rtc", Category::System, Specialization::Time,
|
linkage, 0, "custom_rtc", Category::System, Specialization::Time,
|
||||||
true, true, &custom_rtc_enabled};
|
false, true, &custom_rtc_enabled};
|
||||||
// Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc`
|
SwitchableSetting<s64, true> custom_rtc_offset{linkage,
|
||||||
s64 custom_rtc_differential;
|
0,
|
||||||
|
std::numeric_limits<int>::min(),
|
||||||
|
std::numeric_limits<int>::max(),
|
||||||
|
"custom_rtc_offset",
|
||||||
|
Category::System,
|
||||||
|
Specialization::Countable,
|
||||||
|
true,
|
||||||
|
true};
|
||||||
SwitchableSetting<bool> rng_seed_enabled{
|
SwitchableSetting<bool> rng_seed_enabled{
|
||||||
linkage, false, "rng_seed_enabled", Category::System, Specialization::Paired, true, true};
|
linkage, false, "rng_seed_enabled", Category::System, Specialization::Paired, true, true};
|
||||||
SwitchableSetting<u32> rng_seed{
|
SwitchableSetting<u32> rng_seed{
|
||||||
|
@ -88,7 +88,17 @@ std::string FindSystemTimeZone() {
|
|||||||
LOG_ERROR(Common, "Time zone {} not handled, defaulting to hour offset.", tz_index);
|
LOG_ERROR(Common, "Time zone {} not handled, defaulting to hour offset.", tz_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fmt::format("Etc/GMT{:s}{:d}", hours > 0 ? "-" : "+", std::abs(hours));
|
|
||||||
|
// For some reason the Etc/GMT times are reversed. GMT+6 contains -21600 as its offset,
|
||||||
|
// -6 hours instead of +6 hours, so these signs are purposefully reversed to fix it.
|
||||||
|
std::string postfix{""};
|
||||||
|
if (hours > 0) {
|
||||||
|
postfix = fmt::format("-{:d}", std::abs(hours));
|
||||||
|
} else if (hours < 0) {
|
||||||
|
postfix = fmt::format("+{:d}", std::abs(hours));
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt::format("Etc/GMT{:s}", postfix);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Common::TimeZone
|
} // namespace Common::TimeZone
|
||||||
|
@ -12,9 +12,8 @@
|
|||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
struct UUID {
|
struct UUID {
|
||||||
std::array<u8, 0x10> uuid{};
|
std::array<u8, 0x10> uuid;
|
||||||
|
|
||||||
/// Constructs an invalid UUID.
|
|
||||||
constexpr UUID() = default;
|
constexpr UUID() = default;
|
||||||
|
|
||||||
/// Constructs a UUID from a reference to a 128 bit array.
|
/// Constructs a UUID from a reference to a 128 bit array.
|
||||||
@ -34,14 +33,6 @@ struct UUID {
|
|||||||
*/
|
*/
|
||||||
explicit UUID(std::string_view uuid_string);
|
explicit UUID(std::string_view uuid_string);
|
||||||
|
|
||||||
~UUID() = default;
|
|
||||||
|
|
||||||
constexpr UUID(const UUID&) noexcept = default;
|
|
||||||
constexpr UUID(UUID&&) noexcept = default;
|
|
||||||
|
|
||||||
constexpr UUID& operator=(const UUID&) noexcept = default;
|
|
||||||
constexpr UUID& operator=(UUID&&) noexcept = default;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the stored UUID is valid or not.
|
* Returns whether the stored UUID is valid or not.
|
||||||
*
|
*
|
||||||
@ -121,6 +112,7 @@ struct UUID {
|
|||||||
friend constexpr bool operator==(const UUID& lhs, const UUID& rhs) = default;
|
friend constexpr bool operator==(const UUID& lhs, const UUID& rhs) = default;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(UUID) == 0x10, "UUID has incorrect size.");
|
static_assert(sizeof(UUID) == 0x10, "UUID has incorrect size.");
|
||||||
|
static_assert(std::is_trivial_v<UUID>);
|
||||||
|
|
||||||
/// An invalid UUID. This UUID has all its bytes set to 0.
|
/// An invalid UUID. This UUID has all its bytes set to 0.
|
||||||
constexpr UUID InvalidUUID = {};
|
constexpr UUID InvalidUUID = {};
|
||||||
|
@ -18,42 +18,40 @@ namespace Common {
|
|||||||
|
|
||||||
class StandardWallClock final : public WallClock {
|
class StandardWallClock final : public WallClock {
|
||||||
public:
|
public:
|
||||||
explicit StandardWallClock() : start_time{SteadyClock::Now()} {}
|
explicit StandardWallClock() {}
|
||||||
|
|
||||||
std::chrono::nanoseconds GetTimeNS() const override {
|
std::chrono::nanoseconds GetTimeNS() const override {
|
||||||
return SteadyClock::Now() - start_time;
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::microseconds GetTimeUS() const override {
|
std::chrono::microseconds GetTimeUS() const override {
|
||||||
return static_cast<std::chrono::microseconds>(GetHostTicksElapsed() / NsToUsRatio::den);
|
return std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::milliseconds GetTimeMS() const override {
|
std::chrono::milliseconds GetTimeMS() const override {
|
||||||
return static_cast<std::chrono::milliseconds>(GetHostTicksElapsed() / NsToMsRatio::den);
|
return std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch());
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 GetCNTPCT() const override {
|
s64 GetCNTPCT() const override {
|
||||||
return GetHostTicksElapsed() * NsToCNTPCTRatio::num / NsToCNTPCTRatio::den;
|
return GetUptime() * NsToCNTPCTRatio::num / NsToCNTPCTRatio::den;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 GetGPUTick() const override {
|
s64 GetGPUTick() const override {
|
||||||
return GetHostTicksElapsed() * NsToGPUTickRatio::num / NsToGPUTickRatio::den;
|
return GetUptime() * NsToGPUTickRatio::num / NsToGPUTickRatio::den;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 GetHostTicksNow() const override {
|
s64 GetUptime() const override {
|
||||||
return static_cast<u64>(SteadyClock::Now().time_since_epoch().count());
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||||
}
|
std::chrono::steady_clock::now().time_since_epoch())
|
||||||
|
.count();
|
||||||
u64 GetHostTicksElapsed() const override {
|
|
||||||
return static_cast<u64>(GetTimeNS().count());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsNative() const override {
|
bool IsNative() const override {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
SteadyClock::time_point start_time;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<WallClock> CreateOptimalClock() {
|
std::unique_ptr<WallClock> CreateOptimalClock() {
|
||||||
|
@ -29,16 +29,13 @@ public:
|
|||||||
virtual std::chrono::milliseconds GetTimeMS() const = 0;
|
virtual std::chrono::milliseconds GetTimeMS() const = 0;
|
||||||
|
|
||||||
/// @returns The guest CNTPCT ticks since the construction of this clock.
|
/// @returns The guest CNTPCT ticks since the construction of this clock.
|
||||||
virtual u64 GetCNTPCT() const = 0;
|
virtual s64 GetCNTPCT() const = 0;
|
||||||
|
|
||||||
/// @returns The guest GPU ticks since the construction of this clock.
|
/// @returns The guest GPU ticks since the construction of this clock.
|
||||||
virtual u64 GetGPUTick() const = 0;
|
virtual s64 GetGPUTick() const = 0;
|
||||||
|
|
||||||
/// @returns The raw host timer ticks since an indeterminate epoch.
|
/// @returns The raw host timer ticks since an indeterminate epoch.
|
||||||
virtual u64 GetHostTicksNow() const = 0;
|
virtual s64 GetUptime() const = 0;
|
||||||
|
|
||||||
/// @returns The raw host timer ticks since the construction of this clock.
|
|
||||||
virtual u64 GetHostTicksElapsed() const = 0;
|
|
||||||
|
|
||||||
/// @returns Whether the clock directly uses the host's hardware clock.
|
/// @returns Whether the clock directly uses the host's hardware clock.
|
||||||
virtual bool IsNative() const = 0;
|
virtual bool IsNative() const = 0;
|
||||||
|
@ -8,39 +8,35 @@
|
|||||||
namespace Common::X64 {
|
namespace Common::X64 {
|
||||||
|
|
||||||
NativeClock::NativeClock(u64 rdtsc_frequency_)
|
NativeClock::NativeClock(u64 rdtsc_frequency_)
|
||||||
: start_ticks{FencedRDTSC()}, rdtsc_frequency{rdtsc_frequency_},
|
: rdtsc_frequency{rdtsc_frequency_}, ns_rdtsc_factor{GetFixedPoint64Factor(NsRatio::den,
|
||||||
ns_rdtsc_factor{GetFixedPoint64Factor(NsRatio::den, rdtsc_frequency)},
|
rdtsc_frequency)},
|
||||||
us_rdtsc_factor{GetFixedPoint64Factor(UsRatio::den, rdtsc_frequency)},
|
us_rdtsc_factor{GetFixedPoint64Factor(UsRatio::den, rdtsc_frequency)},
|
||||||
ms_rdtsc_factor{GetFixedPoint64Factor(MsRatio::den, rdtsc_frequency)},
|
ms_rdtsc_factor{GetFixedPoint64Factor(MsRatio::den, rdtsc_frequency)},
|
||||||
cntpct_rdtsc_factor{GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency)},
|
cntpct_rdtsc_factor{GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency)},
|
||||||
gputick_rdtsc_factor{GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency)} {}
|
gputick_rdtsc_factor{GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency)} {}
|
||||||
|
|
||||||
std::chrono::nanoseconds NativeClock::GetTimeNS() const {
|
std::chrono::nanoseconds NativeClock::GetTimeNS() const {
|
||||||
return std::chrono::nanoseconds{MultiplyHigh(GetHostTicksElapsed(), ns_rdtsc_factor)};
|
return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_rdtsc_factor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::microseconds NativeClock::GetTimeUS() const {
|
std::chrono::microseconds NativeClock::GetTimeUS() const {
|
||||||
return std::chrono::microseconds{MultiplyHigh(GetHostTicksElapsed(), us_rdtsc_factor)};
|
return std::chrono::microseconds{MultiplyHigh(GetUptime(), us_rdtsc_factor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::milliseconds NativeClock::GetTimeMS() const {
|
std::chrono::milliseconds NativeClock::GetTimeMS() const {
|
||||||
return std::chrono::milliseconds{MultiplyHigh(GetHostTicksElapsed(), ms_rdtsc_factor)};
|
return std::chrono::milliseconds{MultiplyHigh(GetUptime(), ms_rdtsc_factor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetCNTPCT() const {
|
s64 NativeClock::GetCNTPCT() const {
|
||||||
return MultiplyHigh(GetHostTicksElapsed(), cntpct_rdtsc_factor);
|
return MultiplyHigh(GetUptime(), cntpct_rdtsc_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetGPUTick() const {
|
s64 NativeClock::GetGPUTick() const {
|
||||||
return MultiplyHigh(GetHostTicksElapsed(), gputick_rdtsc_factor);
|
return MultiplyHigh(GetUptime(), gputick_rdtsc_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 NativeClock::GetHostTicksNow() const {
|
s64 NativeClock::GetUptime() const {
|
||||||
return FencedRDTSC();
|
return static_cast<s64>(FencedRDTSC());
|
||||||
}
|
|
||||||
|
|
||||||
u64 NativeClock::GetHostTicksElapsed() const {
|
|
||||||
return FencedRDTSC() - start_ticks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NativeClock::IsNative() const {
|
bool NativeClock::IsNative() const {
|
||||||
|
@ -17,18 +17,15 @@ public:
|
|||||||
|
|
||||||
std::chrono::milliseconds GetTimeMS() const override;
|
std::chrono::milliseconds GetTimeMS() const override;
|
||||||
|
|
||||||
u64 GetCNTPCT() const override;
|
s64 GetCNTPCT() const override;
|
||||||
|
|
||||||
u64 GetGPUTick() const override;
|
s64 GetGPUTick() const override;
|
||||||
|
|
||||||
u64 GetHostTicksNow() const override;
|
s64 GetUptime() const override;
|
||||||
|
|
||||||
u64 GetHostTicksElapsed() const override;
|
|
||||||
|
|
||||||
bool IsNative() const override;
|
bool IsNative() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
u64 start_ticks;
|
|
||||||
u64 rdtsc_frequency;
|
u64 rdtsc_frequency;
|
||||||
|
|
||||||
u64 ns_rdtsc_factor;
|
u64 ns_rdtsc_factor;
|
||||||
|
@ -20,26 +20,49 @@ add_library(core STATIC
|
|||||||
cpu_manager.h
|
cpu_manager.h
|
||||||
crypto/aes_util.cpp
|
crypto/aes_util.cpp
|
||||||
crypto/aes_util.h
|
crypto/aes_util.h
|
||||||
|
crypto/ctr_encryption_layer.cpp
|
||||||
|
crypto/ctr_encryption_layer.h
|
||||||
crypto/encryption_layer.cpp
|
crypto/encryption_layer.cpp
|
||||||
crypto/encryption_layer.h
|
crypto/encryption_layer.h
|
||||||
crypto/key_manager.cpp
|
crypto/key_manager.cpp
|
||||||
crypto/key_manager.h
|
crypto/key_manager.h
|
||||||
crypto/partition_data_manager.cpp
|
crypto/partition_data_manager.cpp
|
||||||
crypto/partition_data_manager.h
|
crypto/partition_data_manager.h
|
||||||
crypto/ctr_encryption_layer.cpp
|
|
||||||
crypto/ctr_encryption_layer.h
|
|
||||||
crypto/xts_encryption_layer.cpp
|
crypto/xts_encryption_layer.cpp
|
||||||
crypto/xts_encryption_layer.h
|
crypto/xts_encryption_layer.h
|
||||||
debugger/debugger_interface.h
|
|
||||||
debugger/debugger.cpp
|
debugger/debugger.cpp
|
||||||
debugger/debugger.h
|
debugger/debugger.h
|
||||||
debugger/gdbstub_arch.cpp
|
debugger/debugger_interface.h
|
||||||
debugger/gdbstub_arch.h
|
|
||||||
debugger/gdbstub.cpp
|
debugger/gdbstub.cpp
|
||||||
debugger/gdbstub.h
|
debugger/gdbstub.h
|
||||||
|
debugger/gdbstub_arch.cpp
|
||||||
|
debugger/gdbstub_arch.h
|
||||||
|
device_memory_manager.h
|
||||||
|
device_memory_manager.inc
|
||||||
device_memory.cpp
|
device_memory.cpp
|
||||||
device_memory.h
|
device_memory.h
|
||||||
|
file_sys/bis_factory.cpp
|
||||||
|
file_sys/bis_factory.h
|
||||||
|
file_sys/card_image.cpp
|
||||||
|
file_sys/card_image.h
|
||||||
|
file_sys/common_funcs.h
|
||||||
|
file_sys/content_archive.cpp
|
||||||
|
file_sys/content_archive.h
|
||||||
|
file_sys/control_metadata.cpp
|
||||||
|
file_sys/control_metadata.h
|
||||||
|
file_sys/errors.h
|
||||||
|
file_sys/fs_directory.h
|
||||||
|
file_sys/fs_file.h
|
||||||
|
file_sys/fs_filesystem.h
|
||||||
|
file_sys/fs_memory_management.h
|
||||||
|
file_sys/fs_operate_range.h
|
||||||
|
file_sys/fs_path.h
|
||||||
|
file_sys/fs_path_utility.h
|
||||||
|
file_sys/fs_string_util.h
|
||||||
|
file_sys/fsmitm_romfsbuild.cpp
|
||||||
|
file_sys/fsmitm_romfsbuild.h
|
||||||
file_sys/fssystem/fs_i_storage.h
|
file_sys/fssystem/fs_i_storage.h
|
||||||
|
file_sys/fssystem/fs_types.h
|
||||||
file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp
|
file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp
|
||||||
file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h
|
file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h
|
||||||
file_sys/fssystem/fssystem_aes_ctr_storage.cpp
|
file_sys/fssystem/fssystem_aes_ctr_storage.cpp
|
||||||
@ -81,25 +104,10 @@ add_library(core STATIC
|
|||||||
file_sys/fssystem/fssystem_switch_storage.h
|
file_sys/fssystem/fssystem_switch_storage.h
|
||||||
file_sys/fssystem/fssystem_utility.cpp
|
file_sys/fssystem/fssystem_utility.cpp
|
||||||
file_sys/fssystem/fssystem_utility.h
|
file_sys/fssystem/fssystem_utility.h
|
||||||
file_sys/fssystem/fs_types.h
|
|
||||||
file_sys/bis_factory.cpp
|
|
||||||
file_sys/bis_factory.h
|
|
||||||
file_sys/card_image.cpp
|
|
||||||
file_sys/card_image.h
|
|
||||||
file_sys/common_funcs.h
|
|
||||||
file_sys/content_archive.cpp
|
|
||||||
file_sys/content_archive.h
|
|
||||||
file_sys/control_metadata.cpp
|
|
||||||
file_sys/control_metadata.h
|
|
||||||
file_sys/directory.h
|
|
||||||
file_sys/errors.h
|
|
||||||
file_sys/fsmitm_romfsbuild.cpp
|
|
||||||
file_sys/fsmitm_romfsbuild.h
|
|
||||||
file_sys/ips_layer.cpp
|
file_sys/ips_layer.cpp
|
||||||
file_sys/ips_layer.h
|
file_sys/ips_layer.h
|
||||||
file_sys/kernel_executable.cpp
|
file_sys/kernel_executable.cpp
|
||||||
file_sys/kernel_executable.h
|
file_sys/kernel_executable.h
|
||||||
file_sys/mode.h
|
|
||||||
file_sys/nca_metadata.cpp
|
file_sys/nca_metadata.cpp
|
||||||
file_sys/nca_metadata.h
|
file_sys/nca_metadata.h
|
||||||
file_sys/partition_filesystem.cpp
|
file_sys/partition_filesystem.cpp
|
||||||
@ -144,22 +152,22 @@ add_library(core STATIC
|
|||||||
file_sys/system_archive/system_version.h
|
file_sys/system_archive/system_version.h
|
||||||
file_sys/system_archive/time_zone_binary.cpp
|
file_sys/system_archive/time_zone_binary.cpp
|
||||||
file_sys/system_archive/time_zone_binary.h
|
file_sys/system_archive/time_zone_binary.h
|
||||||
file_sys/vfs.cpp
|
file_sys/vfs/vfs.cpp
|
||||||
file_sys/vfs.h
|
file_sys/vfs/vfs.h
|
||||||
file_sys/vfs_cached.cpp
|
file_sys/vfs/vfs_cached.cpp
|
||||||
file_sys/vfs_cached.h
|
file_sys/vfs/vfs_cached.h
|
||||||
file_sys/vfs_concat.cpp
|
file_sys/vfs/vfs_concat.cpp
|
||||||
file_sys/vfs_concat.h
|
file_sys/vfs/vfs_concat.h
|
||||||
file_sys/vfs_layered.cpp
|
file_sys/vfs/vfs_layered.cpp
|
||||||
file_sys/vfs_layered.h
|
file_sys/vfs/vfs_layered.h
|
||||||
file_sys/vfs_offset.cpp
|
file_sys/vfs/vfs_offset.cpp
|
||||||
file_sys/vfs_offset.h
|
file_sys/vfs/vfs_offset.h
|
||||||
file_sys/vfs_real.cpp
|
file_sys/vfs/vfs_real.cpp
|
||||||
file_sys/vfs_real.h
|
file_sys/vfs/vfs_real.h
|
||||||
file_sys/vfs_static.h
|
file_sys/vfs/vfs_static.h
|
||||||
file_sys/vfs_types.h
|
file_sys/vfs/vfs_types.h
|
||||||
file_sys/vfs_vector.cpp
|
file_sys/vfs/vfs_vector.cpp
|
||||||
file_sys/vfs_vector.h
|
file_sys/vfs/vfs_vector.h
|
||||||
file_sys/xts_archive.cpp
|
file_sys/xts_archive.cpp
|
||||||
file_sys/xts_archive.h
|
file_sys/xts_archive.h
|
||||||
frontend/applets/cabinet.cpp
|
frontend/applets/cabinet.cpp
|
||||||
@ -168,8 +176,8 @@ add_library(core STATIC
|
|||||||
frontend/applets/controller.h
|
frontend/applets/controller.h
|
||||||
frontend/applets/error.cpp
|
frontend/applets/error.cpp
|
||||||
frontend/applets/error.h
|
frontend/applets/error.h
|
||||||
frontend/applets/general_frontend.cpp
|
frontend/applets/general.cpp
|
||||||
frontend/applets/general_frontend.h
|
frontend/applets/general.h
|
||||||
frontend/applets/mii_edit.cpp
|
frontend/applets/mii_edit.cpp
|
||||||
frontend/applets/mii_edit.h
|
frontend/applets/mii_edit.h
|
||||||
frontend/applets/profile_select.cpp
|
frontend/applets/profile_select.cpp
|
||||||
@ -192,7 +200,6 @@ add_library(core STATIC
|
|||||||
hle/kernel/board/nintendo/nx/secure_monitor.h
|
hle/kernel/board/nintendo/nx/secure_monitor.h
|
||||||
hle/kernel/code_set.cpp
|
hle/kernel/code_set.cpp
|
||||||
hle/kernel/code_set.h
|
hle/kernel/code_set.h
|
||||||
hle/kernel/svc_results.h
|
|
||||||
hle/kernel/global_scheduler_context.cpp
|
hle/kernel/global_scheduler_context.cpp
|
||||||
hle/kernel/global_scheduler_context.h
|
hle/kernel/global_scheduler_context.h
|
||||||
hle/kernel/init/init_slab_setup.cpp
|
hle/kernel/init/init_slab_setup.cpp
|
||||||
@ -202,11 +209,11 @@ add_library(core STATIC
|
|||||||
hle/kernel/k_address_arbiter.h
|
hle/kernel/k_address_arbiter.h
|
||||||
hle/kernel/k_address_space_info.cpp
|
hle/kernel/k_address_space_info.cpp
|
||||||
hle/kernel/k_address_space_info.h
|
hle/kernel/k_address_space_info.h
|
||||||
|
hle/kernel/k_affinity_mask.h
|
||||||
hle/kernel/k_auto_object.cpp
|
hle/kernel/k_auto_object.cpp
|
||||||
hle/kernel/k_auto_object.h
|
hle/kernel/k_auto_object.h
|
||||||
hle/kernel/k_auto_object_container.cpp
|
hle/kernel/k_auto_object_container.cpp
|
||||||
hle/kernel/k_auto_object_container.h
|
hle/kernel/k_auto_object_container.h
|
||||||
hle/kernel/k_affinity_mask.h
|
|
||||||
hle/kernel/k_capabilities.cpp
|
hle/kernel/k_capabilities.cpp
|
||||||
hle/kernel/k_capabilities.h
|
hle/kernel/k_capabilities.h
|
||||||
hle/kernel/k_class_token.cpp
|
hle/kernel/k_class_token.cpp
|
||||||
@ -230,9 +237,9 @@ add_library(core STATIC
|
|||||||
hle/kernel/k_event_info.h
|
hle/kernel/k_event_info.h
|
||||||
hle/kernel/k_handle_table.cpp
|
hle/kernel/k_handle_table.cpp
|
||||||
hle/kernel/k_handle_table.h
|
hle/kernel/k_handle_table.h
|
||||||
hle/kernel/k_hardware_timer_base.h
|
|
||||||
hle/kernel/k_hardware_timer.cpp
|
hle/kernel/k_hardware_timer.cpp
|
||||||
hle/kernel/k_hardware_timer.h
|
hle/kernel/k_hardware_timer.h
|
||||||
|
hle/kernel/k_hardware_timer_base.h
|
||||||
hle/kernel/k_interrupt_manager.cpp
|
hle/kernel/k_interrupt_manager.cpp
|
||||||
hle/kernel/k_interrupt_manager.h
|
hle/kernel/k_interrupt_manager.h
|
||||||
hle/kernel/k_light_client_session.cpp
|
hle/kernel/k_light_client_session.cpp
|
||||||
@ -259,10 +266,10 @@ add_library(core STATIC
|
|||||||
hle/kernel/k_page_bitmap.h
|
hle/kernel/k_page_bitmap.h
|
||||||
hle/kernel/k_page_buffer.cpp
|
hle/kernel/k_page_buffer.cpp
|
||||||
hle/kernel/k_page_buffer.h
|
hle/kernel/k_page_buffer.h
|
||||||
hle/kernel/k_page_heap.cpp
|
|
||||||
hle/kernel/k_page_heap.h
|
|
||||||
hle/kernel/k_page_group.cpp
|
hle/kernel/k_page_group.cpp
|
||||||
hle/kernel/k_page_group.h
|
hle/kernel/k_page_group.h
|
||||||
|
hle/kernel/k_page_heap.cpp
|
||||||
|
hle/kernel/k_page_heap.h
|
||||||
hle/kernel/k_page_table.h
|
hle/kernel/k_page_table.h
|
||||||
hle/kernel/k_page_table_base.cpp
|
hle/kernel/k_page_table_base.cpp
|
||||||
hle/kernel/k_page_table_base.h
|
hle/kernel/k_page_table_base.h
|
||||||
@ -327,8 +334,6 @@ add_library(core STATIC
|
|||||||
hle/kernel/slab_helpers.h
|
hle/kernel/slab_helpers.h
|
||||||
hle/kernel/svc.cpp
|
hle/kernel/svc.cpp
|
||||||
hle/kernel/svc.h
|
hle/kernel/svc.h
|
||||||
hle/kernel/svc_common.h
|
|
||||||
hle/kernel/svc_types.h
|
|
||||||
hle/kernel/svc/svc_activity.cpp
|
hle/kernel/svc/svc_activity.cpp
|
||||||
hle/kernel/svc/svc_address_arbiter.cpp
|
hle/kernel/svc/svc_address_arbiter.cpp
|
||||||
hle/kernel/svc/svc_address_translation.cpp
|
hle/kernel/svc/svc_address_translation.cpp
|
||||||
@ -366,6 +371,9 @@ add_library(core STATIC
|
|||||||
hle/kernel/svc/svc_thread_profiler.cpp
|
hle/kernel/svc/svc_thread_profiler.cpp
|
||||||
hle/kernel/svc/svc_tick.cpp
|
hle/kernel/svc/svc_tick.cpp
|
||||||
hle/kernel/svc/svc_transfer_memory.cpp
|
hle/kernel/svc/svc_transfer_memory.cpp
|
||||||
|
hle/kernel/svc_common.h
|
||||||
|
hle/kernel/svc_results.h
|
||||||
|
hle/kernel/svc_types.h
|
||||||
hle/result.h
|
hle/result.h
|
||||||
hle/service/acc/acc.cpp
|
hle/service/acc/acc.cpp
|
||||||
hle/service/acc/acc.h
|
hle/service/acc/acc.h
|
||||||
@ -382,39 +390,101 @@ add_library(core STATIC
|
|||||||
hle/service/acc/errors.h
|
hle/service/acc/errors.h
|
||||||
hle/service/acc/profile_manager.cpp
|
hle/service/acc/profile_manager.cpp
|
||||||
hle/service/acc/profile_manager.h
|
hle/service/acc/profile_manager.h
|
||||||
|
hle/service/am/frontend/applet_cabinet.cpp
|
||||||
|
hle/service/am/frontend/applet_cabinet.h
|
||||||
|
hle/service/am/frontend/applet_controller.cpp
|
||||||
|
hle/service/am/frontend/applet_controller.h
|
||||||
|
hle/service/am/frontend/applet_error.cpp
|
||||||
|
hle/service/am/frontend/applet_error.h
|
||||||
|
hle/service/am/frontend/applet_general.cpp
|
||||||
|
hle/service/am/frontend/applet_general.h
|
||||||
|
hle/service/am/frontend/applet_mii_edit.cpp
|
||||||
|
hle/service/am/frontend/applet_mii_edit.h
|
||||||
|
hle/service/am/frontend/applet_mii_edit_types.h
|
||||||
|
hle/service/am/frontend/applet_profile_select.cpp
|
||||||
|
hle/service/am/frontend/applet_profile_select.h
|
||||||
|
hle/service/am/frontend/applet_software_keyboard.cpp
|
||||||
|
hle/service/am/frontend/applet_software_keyboard.h
|
||||||
|
hle/service/am/frontend/applet_software_keyboard_types.h
|
||||||
|
hle/service/am/frontend/applet_web_browser.cpp
|
||||||
|
hle/service/am/frontend/applet_web_browser.h
|
||||||
|
hle/service/am/frontend/applet_web_browser_types.h
|
||||||
|
hle/service/am/frontend/applets.cpp
|
||||||
|
hle/service/am/frontend/applets.h
|
||||||
hle/service/am/am.cpp
|
hle/service/am/am.cpp
|
||||||
hle/service/am/am.h
|
hle/service/am/am.h
|
||||||
|
hle/service/am/am_results.h
|
||||||
|
hle/service/am/am_types.h
|
||||||
|
hle/service/am/applet.cpp
|
||||||
|
hle/service/am/applet.h
|
||||||
hle/service/am/applet_ae.cpp
|
hle/service/am/applet_ae.cpp
|
||||||
hle/service/am/applet_ae.h
|
hle/service/am/applet_ae.h
|
||||||
|
hle/service/am/applet_manager.cpp
|
||||||
|
hle/service/am/applet_data_broker.cpp
|
||||||
|
hle/service/am/applet_data_broker.h
|
||||||
|
hle/service/am/applet_manager.h
|
||||||
hle/service/am/applet_oe.cpp
|
hle/service/am/applet_oe.cpp
|
||||||
hle/service/am/applet_oe.h
|
hle/service/am/applet_oe.h
|
||||||
hle/service/am/applets/applet_cabinet.cpp
|
hle/service/am/applet_common_functions.cpp
|
||||||
hle/service/am/applets/applet_cabinet.h
|
hle/service/am/applet_common_functions.h
|
||||||
hle/service/am/applets/applet_controller.cpp
|
hle/service/am/applet_message_queue.cpp
|
||||||
hle/service/am/applets/applet_controller.h
|
hle/service/am/applet_message_queue.h
|
||||||
hle/service/am/applets/applet_error.cpp
|
hle/service/am/application_creator.cpp
|
||||||
hle/service/am/applets/applet_error.h
|
hle/service/am/application_creator.h
|
||||||
hle/service/am/applets/applet_general_backend.cpp
|
hle/service/am/application_functions.cpp
|
||||||
hle/service/am/applets/applet_general_backend.h
|
hle/service/am/application_functions.h
|
||||||
hle/service/am/applets/applet_mii_edit.cpp
|
hle/service/am/application_proxy.cpp
|
||||||
hle/service/am/applets/applet_mii_edit.h
|
hle/service/am/application_proxy.h
|
||||||
hle/service/am/applets/applet_mii_edit_types.h
|
hle/service/am/audio_controller.cpp
|
||||||
hle/service/am/applets/applet_profile_select.cpp
|
hle/service/am/audio_controller.h
|
||||||
hle/service/am/applets/applet_profile_select.h
|
hle/service/am/common_state_getter.cpp
|
||||||
hle/service/am/applets/applet_software_keyboard.cpp
|
hle/service/am/common_state_getter.h
|
||||||
hle/service/am/applets/applet_software_keyboard.h
|
hle/service/am/debug_functions.cpp
|
||||||
hle/service/am/applets/applet_software_keyboard_types.h
|
hle/service/am/debug_functions.h
|
||||||
hle/service/am/applets/applet_web_browser.cpp
|
hle/service/am/display_controller.cpp
|
||||||
hle/service/am/applets/applet_web_browser.h
|
hle/service/am/display_controller.h
|
||||||
hle/service/am/applets/applet_web_browser_types.h
|
hle/service/am/global_state_controller.cpp
|
||||||
hle/service/am/applets/applets.cpp
|
hle/service/am/global_state_controller.h
|
||||||
hle/service/am/applets/applets.h
|
hle/service/am/hid_registration.cpp
|
||||||
|
hle/service/am/hid_registration.h
|
||||||
|
hle/service/am/home_menu_functions.cpp
|
||||||
|
hle/service/am/home_menu_functions.h
|
||||||
hle/service/am/idle.cpp
|
hle/service/am/idle.cpp
|
||||||
hle/service/am/idle.h
|
hle/service/am/idle.h
|
||||||
|
hle/service/am/library_applet_accessor.cpp
|
||||||
|
hle/service/am/library_applet_accessor.h
|
||||||
|
hle/service/am/library_applet_creator.cpp
|
||||||
|
hle/service/am/library_applet_creator.h
|
||||||
|
hle/service/am/library_applet_proxy.cpp
|
||||||
|
hle/service/am/library_applet_proxy.h
|
||||||
|
hle/service/am/library_applet_self_accessor.cpp
|
||||||
|
hle/service/am/library_applet_self_accessor.h
|
||||||
|
hle/service/am/library_applet_storage.cpp
|
||||||
|
hle/service/am/library_applet_storage.h
|
||||||
|
hle/service/am/lock_accessor.cpp
|
||||||
|
hle/service/am/lock_accessor.h
|
||||||
|
hle/service/am/managed_layer_holder.cpp
|
||||||
|
hle/service/am/managed_layer_holder.h
|
||||||
hle/service/am/omm.cpp
|
hle/service/am/omm.cpp
|
||||||
hle/service/am/omm.h
|
hle/service/am/omm.h
|
||||||
|
hle/service/am/process_winding_controller.cpp
|
||||||
|
hle/service/am/process_winding_controller.h
|
||||||
|
hle/service/am/process.cpp
|
||||||
|
hle/service/am/process.h
|
||||||
|
hle/service/am/self_controller.cpp
|
||||||
|
hle/service/am/self_controller.h
|
||||||
|
hle/service/am/system_applet_proxy.cpp
|
||||||
|
hle/service/am/system_applet_proxy.h
|
||||||
|
hle/service/am/system_buffer_manager.cpp
|
||||||
|
hle/service/am/system_buffer_manager.h
|
||||||
hle/service/am/spsm.cpp
|
hle/service/am/spsm.cpp
|
||||||
hle/service/am/spsm.h
|
hle/service/am/spsm.h
|
||||||
|
hle/service/am/storage_accessor.cpp
|
||||||
|
hle/service/am/storage_accessor.h
|
||||||
|
hle/service/am/storage.cpp
|
||||||
|
hle/service/am/storage.h
|
||||||
|
hle/service/am/window_controller.cpp
|
||||||
|
hle/service/am/window_controller.h
|
||||||
hle/service/aoc/aoc_u.cpp
|
hle/service/aoc/aoc_u.cpp
|
||||||
hle/service/aoc/aoc_u.h
|
hle/service/aoc/aoc_u.h
|
||||||
hle/service/apm/apm.cpp
|
hle/service/apm/apm.cpp
|
||||||
@ -470,26 +540,41 @@ add_library(core STATIC
|
|||||||
hle/service/caps/caps_types.h
|
hle/service/caps/caps_types.h
|
||||||
hle/service/caps/caps_u.cpp
|
hle/service/caps/caps_u.cpp
|
||||||
hle/service/caps/caps_u.h
|
hle/service/caps/caps_u.h
|
||||||
|
hle/service/cmif_serialization.h
|
||||||
|
hle/service/cmif_types.h
|
||||||
hle/service/erpt/erpt.cpp
|
hle/service/erpt/erpt.cpp
|
||||||
hle/service/erpt/erpt.h
|
hle/service/erpt/erpt.h
|
||||||
hle/service/es/es.cpp
|
hle/service/es/es.cpp
|
||||||
hle/service/es/es.h
|
hle/service/es/es.h
|
||||||
hle/service/eupld/eupld.cpp
|
hle/service/eupld/eupld.cpp
|
||||||
hle/service/eupld/eupld.h
|
hle/service/eupld/eupld.h
|
||||||
|
hle/service/event.cpp
|
||||||
|
hle/service/event.h
|
||||||
hle/service/fatal/fatal.cpp
|
hle/service/fatal/fatal.cpp
|
||||||
hle/service/fatal/fatal.h
|
hle/service/fatal/fatal.h
|
||||||
hle/service/fatal/fatal_p.cpp
|
hle/service/fatal/fatal_p.cpp
|
||||||
hle/service/fatal/fatal_p.h
|
hle/service/fatal/fatal_p.h
|
||||||
hle/service/fatal/fatal_u.cpp
|
hle/service/fatal/fatal_u.cpp
|
||||||
hle/service/fatal/fatal_u.h
|
hle/service/fatal/fatal_u.h
|
||||||
|
hle/service/fgm/fgm.cpp
|
||||||
|
hle/service/fgm/fgm.h
|
||||||
hle/service/filesystem/filesystem.cpp
|
hle/service/filesystem/filesystem.cpp
|
||||||
hle/service/filesystem/filesystem.h
|
hle/service/filesystem/filesystem.h
|
||||||
hle/service/filesystem/fsp_ldr.cpp
|
hle/service/filesystem/fsp/fs_i_directory.cpp
|
||||||
hle/service/filesystem/fsp_ldr.h
|
hle/service/filesystem/fsp/fs_i_directory.h
|
||||||
hle/service/filesystem/fsp_pr.cpp
|
hle/service/filesystem/fsp/fs_i_file.cpp
|
||||||
hle/service/filesystem/fsp_pr.h
|
hle/service/filesystem/fsp/fs_i_file.h
|
||||||
hle/service/filesystem/fsp_srv.cpp
|
hle/service/filesystem/fsp/fs_i_filesystem.cpp
|
||||||
hle/service/filesystem/fsp_srv.h
|
hle/service/filesystem/fsp/fs_i_filesystem.h
|
||||||
|
hle/service/filesystem/fsp/fs_i_storage.cpp
|
||||||
|
hle/service/filesystem/fsp/fs_i_storage.h
|
||||||
|
hle/service/filesystem/fsp/fsp_ldr.cpp
|
||||||
|
hle/service/filesystem/fsp/fsp_ldr.h
|
||||||
|
hle/service/filesystem/fsp/fsp_pr.cpp
|
||||||
|
hle/service/filesystem/fsp/fsp_pr.h
|
||||||
|
hle/service/filesystem/fsp/fsp_srv.cpp
|
||||||
|
hle/service/filesystem/fsp/fsp_srv.h
|
||||||
|
hle/service/filesystem/fsp/fsp_util.h
|
||||||
hle/service/filesystem/romfs_controller.cpp
|
hle/service/filesystem/romfs_controller.cpp
|
||||||
hle/service/filesystem/romfs_controller.h
|
hle/service/filesystem/romfs_controller.h
|
||||||
hle/service/filesystem/save_data_controller.cpp
|
hle/service/filesystem/save_data_controller.cpp
|
||||||
@ -513,6 +598,24 @@ add_library(core STATIC
|
|||||||
hle/service/glue/glue_manager.h
|
hle/service/glue/glue_manager.h
|
||||||
hle/service/glue/notif.cpp
|
hle/service/glue/notif.cpp
|
||||||
hle/service/glue/notif.h
|
hle/service/glue/notif.h
|
||||||
|
hle/service/glue/time/alarm_worker.cpp
|
||||||
|
hle/service/glue/time/alarm_worker.h
|
||||||
|
hle/service/glue/time/file_timestamp_worker.cpp
|
||||||
|
hle/service/glue/time/file_timestamp_worker.h
|
||||||
|
hle/service/glue/time/manager.cpp
|
||||||
|
hle/service/glue/time/manager.h
|
||||||
|
hle/service/glue/time/pm_state_change_handler.cpp
|
||||||
|
hle/service/glue/time/pm_state_change_handler.h
|
||||||
|
hle/service/glue/time/standard_steady_clock_resource.cpp
|
||||||
|
hle/service/glue/time/standard_steady_clock_resource.h
|
||||||
|
hle/service/glue/time/static.cpp
|
||||||
|
hle/service/glue/time/static.h
|
||||||
|
hle/service/glue/time/time_zone.cpp
|
||||||
|
hle/service/glue/time/time_zone.h
|
||||||
|
hle/service/glue/time/time_zone_binary.cpp
|
||||||
|
hle/service/glue/time/time_zone_binary.h
|
||||||
|
hle/service/glue/time/worker.cpp
|
||||||
|
hle/service/glue/time/worker.h
|
||||||
hle/service/grc/grc.cpp
|
hle/service/grc/grc.cpp
|
||||||
hle/service/grc/grc.h
|
hle/service/grc/grc.h
|
||||||
hle/service/hid/hid.cpp
|
hle/service/hid/hid.cpp
|
||||||
@ -529,13 +632,18 @@ add_library(core STATIC
|
|||||||
hle/service/hid/irs.h
|
hle/service/hid/irs.h
|
||||||
hle/service/hid/xcd.cpp
|
hle/service/hid/xcd.cpp
|
||||||
hle/service/hid/xcd.h
|
hle/service/hid/xcd.h
|
||||||
|
hle/service/hle_ipc.cpp
|
||||||
|
hle/service/hle_ipc.h
|
||||||
|
hle/service/ipc_helpers.h
|
||||||
|
hle/service/kernel_helpers.cpp
|
||||||
|
hle/service/kernel_helpers.h
|
||||||
hle/service/lbl/lbl.cpp
|
hle/service/lbl/lbl.cpp
|
||||||
hle/service/lbl/lbl.h
|
hle/service/lbl/lbl.h
|
||||||
hle/service/ldn/lan_discovery.cpp
|
hle/service/ldn/lan_discovery.cpp
|
||||||
hle/service/ldn/lan_discovery.h
|
hle/service/ldn/lan_discovery.h
|
||||||
hle/service/ldn/ldn_results.h
|
|
||||||
hle/service/ldn/ldn.cpp
|
hle/service/ldn/ldn.cpp
|
||||||
hle/service/ldn/ldn.h
|
hle/service/ldn/ldn.h
|
||||||
|
hle/service/ldn/ldn_results.h
|
||||||
hle/service/ldn/ldn_types.h
|
hle/service/ldn/ldn_types.h
|
||||||
hle/service/ldr/ldr.cpp
|
hle/service/ldr/ldr.cpp
|
||||||
hle/service/ldr/ldr.h
|
hle/service/ldr/ldr.h
|
||||||
@ -543,16 +651,6 @@ add_library(core STATIC
|
|||||||
hle/service/lm/lm.h
|
hle/service/lm/lm.h
|
||||||
hle/service/mig/mig.cpp
|
hle/service/mig/mig.cpp
|
||||||
hle/service/mig/mig.h
|
hle/service/mig/mig.h
|
||||||
hle/service/mii/types/char_info.cpp
|
|
||||||
hle/service/mii/types/char_info.h
|
|
||||||
hle/service/mii/types/core_data.cpp
|
|
||||||
hle/service/mii/types/core_data.h
|
|
||||||
hle/service/mii/types/raw_data.cpp
|
|
||||||
hle/service/mii/types/raw_data.h
|
|
||||||
hle/service/mii/types/store_data.cpp
|
|
||||||
hle/service/mii/types/store_data.h
|
|
||||||
hle/service/mii/types/ver3_store_data.cpp
|
|
||||||
hle/service/mii/types/ver3_store_data.h
|
|
||||||
hle/service/mii/mii.cpp
|
hle/service/mii/mii.cpp
|
||||||
hle/service/mii/mii.h
|
hle/service/mii/mii.h
|
||||||
hle/service/mii/mii_database.cpp
|
hle/service/mii/mii_database.cpp
|
||||||
@ -564,10 +662,22 @@ add_library(core STATIC
|
|||||||
hle/service/mii/mii_result.h
|
hle/service/mii/mii_result.h
|
||||||
hle/service/mii/mii_types.h
|
hle/service/mii/mii_types.h
|
||||||
hle/service/mii/mii_util.h
|
hle/service/mii/mii_util.h
|
||||||
|
hle/service/mii/types/char_info.cpp
|
||||||
|
hle/service/mii/types/char_info.h
|
||||||
|
hle/service/mii/types/core_data.cpp
|
||||||
|
hle/service/mii/types/core_data.h
|
||||||
|
hle/service/mii/types/raw_data.cpp
|
||||||
|
hle/service/mii/types/raw_data.h
|
||||||
|
hle/service/mii/types/store_data.cpp
|
||||||
|
hle/service/mii/types/store_data.h
|
||||||
|
hle/service/mii/types/ver3_store_data.cpp
|
||||||
|
hle/service/mii/types/ver3_store_data.h
|
||||||
hle/service/mm/mm_u.cpp
|
hle/service/mm/mm_u.cpp
|
||||||
hle/service/mm/mm_u.h
|
hle/service/mm/mm_u.h
|
||||||
hle/service/mnpp/mnpp_app.cpp
|
hle/service/mnpp/mnpp_app.cpp
|
||||||
hle/service/mnpp/mnpp_app.h
|
hle/service/mnpp/mnpp_app.h
|
||||||
|
hle/service/mutex.cpp
|
||||||
|
hle/service/mutex.h
|
||||||
hle/service/ncm/ncm.cpp
|
hle/service/ncm/ncm.cpp
|
||||||
hle/service/ncm/ncm.h
|
hle/service/ncm/ncm.h
|
||||||
hle/service/nfc/common/amiibo_crypto.cpp
|
hle/service/nfc/common/amiibo_crypto.cpp
|
||||||
@ -609,6 +719,8 @@ add_library(core STATIC
|
|||||||
hle/service/ns/pdm_qry.h
|
hle/service/ns/pdm_qry.h
|
||||||
hle/service/nvdrv/core/container.cpp
|
hle/service/nvdrv/core/container.cpp
|
||||||
hle/service/nvdrv/core/container.h
|
hle/service/nvdrv/core/container.h
|
||||||
|
hle/service/nvdrv/core/heap_mapper.cpp
|
||||||
|
hle/service/nvdrv/core/heap_mapper.h
|
||||||
hle/service/nvdrv/core/nvmap.cpp
|
hle/service/nvdrv/core/nvmap.cpp
|
||||||
hle/service/nvdrv/core/nvmap.h
|
hle/service/nvdrv/core/nvmap.h
|
||||||
hle/service/nvdrv/core/syncpoint_manager.cpp
|
hle/service/nvdrv/core/syncpoint_manager.cpp
|
||||||
@ -689,25 +801,58 @@ add_library(core STATIC
|
|||||||
hle/service/prepo/prepo.h
|
hle/service/prepo/prepo.h
|
||||||
hle/service/psc/psc.cpp
|
hle/service/psc/psc.cpp
|
||||||
hle/service/psc/psc.h
|
hle/service/psc/psc.h
|
||||||
|
hle/service/psc/time/alarms.cpp
|
||||||
|
hle/service/psc/time/alarms.h
|
||||||
|
hle/service/psc/time/clocks/context_writers.cpp
|
||||||
|
hle/service/psc/time/clocks/context_writers.h
|
||||||
|
hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/standard_local_system_clock_core.cpp
|
||||||
|
hle/service/psc/time/clocks/standard_local_system_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/standard_network_system_clock_core.cpp
|
||||||
|
hle/service/psc/time/clocks/standard_network_system_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/standard_steady_clock_core.cpp
|
||||||
|
hle/service/psc/time/clocks/standard_steady_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/standard_user_system_clock_core.cpp
|
||||||
|
hle/service/psc/time/clocks/standard_user_system_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/steady_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/system_clock_core.cpp
|
||||||
|
hle/service/psc/time/clocks/system_clock_core.h
|
||||||
|
hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp
|
||||||
|
hle/service/psc/time/clocks/tick_based_steady_clock_core.h
|
||||||
|
hle/service/psc/time/common.cpp
|
||||||
|
hle/service/psc/time/common.h
|
||||||
|
hle/service/psc/time/errors.h
|
||||||
|
hle/service/psc/time/shared_memory.cpp
|
||||||
|
hle/service/psc/time/shared_memory.h
|
||||||
|
hle/service/psc/time/static.cpp
|
||||||
|
hle/service/psc/time/static.h
|
||||||
|
hle/service/psc/time/manager.h
|
||||||
|
hle/service/psc/time/power_state_service.cpp
|
||||||
|
hle/service/psc/time/power_state_service.h
|
||||||
|
hle/service/psc/time/service_manager.cpp
|
||||||
|
hle/service/psc/time/service_manager.h
|
||||||
|
hle/service/psc/time/steady_clock.cpp
|
||||||
|
hle/service/psc/time/steady_clock.h
|
||||||
|
hle/service/psc/time/system_clock.cpp
|
||||||
|
hle/service/psc/time/system_clock.h
|
||||||
|
hle/service/psc/time/time_zone.cpp
|
||||||
|
hle/service/psc/time/time_zone.h
|
||||||
|
hle/service/psc/time/time_zone_service.cpp
|
||||||
|
hle/service/psc/time/time_zone_service.h
|
||||||
|
hle/service/psc/time/power_state_request_manager.cpp
|
||||||
|
hle/service/psc/time/power_state_request_manager.h
|
||||||
hle/service/ptm/psm.cpp
|
hle/service/ptm/psm.cpp
|
||||||
hle/service/ptm/psm.h
|
hle/service/ptm/psm.h
|
||||||
hle/service/ptm/ptm.cpp
|
hle/service/ptm/ptm.cpp
|
||||||
hle/service/ptm/ptm.h
|
hle/service/ptm/ptm.h
|
||||||
hle/service/ptm/ts.cpp
|
hle/service/ptm/ts.cpp
|
||||||
hle/service/ptm/ts.h
|
hle/service/ptm/ts.h
|
||||||
hle/service/hle_ipc.cpp
|
hle/service/ro/ro.cpp
|
||||||
hle/service/hle_ipc.h
|
hle/service/ro/ro.h
|
||||||
hle/service/ipc_helpers.h
|
|
||||||
hle/service/kernel_helpers.cpp
|
|
||||||
hle/service/kernel_helpers.h
|
|
||||||
hle/service/mutex.cpp
|
|
||||||
hle/service/mutex.h
|
|
||||||
hle/service/ro/ro_nro_utils.cpp
|
hle/service/ro/ro_nro_utils.cpp
|
||||||
hle/service/ro/ro_nro_utils.h
|
hle/service/ro/ro_nro_utils.h
|
||||||
hle/service/ro/ro_results.h
|
hle/service/ro/ro_results.h
|
||||||
hle/service/ro/ro_types.h
|
hle/service/ro/ro_types.h
|
||||||
hle/service/ro/ro.cpp
|
|
||||||
hle/service/ro/ro.h
|
|
||||||
hle/service/server_manager.cpp
|
hle/service/server_manager.cpp
|
||||||
hle/service/server_manager.h
|
hle/service/server_manager.h
|
||||||
hle/service/service.cpp
|
hle/service/service.cpp
|
||||||
@ -756,40 +901,6 @@ add_library(core STATIC
|
|||||||
hle/service/ssl/ssl.cpp
|
hle/service/ssl/ssl.cpp
|
||||||
hle/service/ssl/ssl.h
|
hle/service/ssl/ssl.h
|
||||||
hle/service/ssl/ssl_backend.h
|
hle/service/ssl/ssl_backend.h
|
||||||
hle/service/time/clock_types.h
|
|
||||||
hle/service/time/ephemeral_network_system_clock_context_writer.h
|
|
||||||
hle/service/time/ephemeral_network_system_clock_core.h
|
|
||||||
hle/service/time/errors.h
|
|
||||||
hle/service/time/local_system_clock_context_writer.h
|
|
||||||
hle/service/time/network_system_clock_context_writer.h
|
|
||||||
hle/service/time/standard_local_system_clock_core.h
|
|
||||||
hle/service/time/standard_network_system_clock_core.h
|
|
||||||
hle/service/time/standard_steady_clock_core.cpp
|
|
||||||
hle/service/time/standard_steady_clock_core.h
|
|
||||||
hle/service/time/standard_user_system_clock_core.cpp
|
|
||||||
hle/service/time/standard_user_system_clock_core.h
|
|
||||||
hle/service/time/steady_clock_core.h
|
|
||||||
hle/service/time/system_clock_context_update_callback.cpp
|
|
||||||
hle/service/time/system_clock_context_update_callback.h
|
|
||||||
hle/service/time/system_clock_core.cpp
|
|
||||||
hle/service/time/system_clock_core.h
|
|
||||||
hle/service/time/tick_based_steady_clock_core.cpp
|
|
||||||
hle/service/time/tick_based_steady_clock_core.h
|
|
||||||
hle/service/time/time.cpp
|
|
||||||
hle/service/time/time.h
|
|
||||||
hle/service/time/time_interface.cpp
|
|
||||||
hle/service/time/time_interface.h
|
|
||||||
hle/service/time/time_manager.cpp
|
|
||||||
hle/service/time/time_manager.h
|
|
||||||
hle/service/time/time_sharedmemory.cpp
|
|
||||||
hle/service/time/time_sharedmemory.h
|
|
||||||
hle/service/time/time_zone_content_manager.cpp
|
|
||||||
hle/service/time/time_zone_content_manager.h
|
|
||||||
hle/service/time/time_zone_manager.cpp
|
|
||||||
hle/service/time/time_zone_manager.h
|
|
||||||
hle/service/time/time_zone_service.cpp
|
|
||||||
hle/service/time/time_zone_service.h
|
|
||||||
hle/service/time/time_zone_types.h
|
|
||||||
hle/service/usb/usb.cpp
|
hle/service/usb/usb.cpp
|
||||||
hle/service/usb/usb.h
|
hle/service/usb/usb.h
|
||||||
hle/service/vi/display/vi_display.cpp
|
hle/service/vi/display/vi_display.cpp
|
||||||
@ -808,9 +919,9 @@ add_library(core STATIC
|
|||||||
internal_network/network.h
|
internal_network/network.h
|
||||||
internal_network/network_interface.cpp
|
internal_network/network_interface.cpp
|
||||||
internal_network/network_interface.h
|
internal_network/network_interface.h
|
||||||
internal_network/sockets.h
|
|
||||||
internal_network/socket_proxy.cpp
|
internal_network/socket_proxy.cpp
|
||||||
internal_network/socket_proxy.h
|
internal_network/socket_proxy.h
|
||||||
|
internal_network/sockets.h
|
||||||
loader/deconstructed_rom_directory.cpp
|
loader/deconstructed_rom_directory.cpp
|
||||||
loader/deconstructed_rom_directory.h
|
loader/deconstructed_rom_directory.h
|
||||||
loader/kip.cpp
|
loader/kip.cpp
|
||||||
@ -829,13 +940,13 @@ add_library(core STATIC
|
|||||||
loader/nsp.h
|
loader/nsp.h
|
||||||
loader/xci.cpp
|
loader/xci.cpp
|
||||||
loader/xci.h
|
loader/xci.h
|
||||||
|
memory.cpp
|
||||||
|
memory.h
|
||||||
memory/cheat_engine.cpp
|
memory/cheat_engine.cpp
|
||||||
memory/cheat_engine.h
|
memory/cheat_engine.h
|
||||||
memory/dmnt_cheat_types.h
|
memory/dmnt_cheat_types.h
|
||||||
memory/dmnt_cheat_vm.cpp
|
memory/dmnt_cheat_vm.cpp
|
||||||
memory/dmnt_cheat_vm.h
|
memory/dmnt_cheat_vm.h
|
||||||
memory.cpp
|
|
||||||
memory.h
|
|
||||||
perf_stats.cpp
|
perf_stats.cpp
|
||||||
perf_stats.h
|
perf_stats.h
|
||||||
precompiled_headers.h
|
precompiled_headers.h
|
||||||
@ -868,9 +979,7 @@ else()
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
create_target_directory_groups(core)
|
target_link_libraries(core PUBLIC common PRIVATE audio_core hid_core network video_core nx_tzdb tz)
|
||||||
|
|
||||||
target_link_libraries(core PUBLIC common PRIVATE audio_core hid_core network video_core nx_tzdb)
|
|
||||||
target_link_libraries(core PUBLIC Boost::headers PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls RenderDoc::API)
|
target_link_libraries(core PUBLIC Boost::headers PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls RenderDoc::API)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
||||||
@ -947,3 +1056,5 @@ endif()
|
|||||||
if (YUZU_ENABLE_LTO)
|
if (YUZU_ENABLE_LTO)
|
||||||
set_property(TARGET core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
set_property(TARGET core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
create_target_directory_groups(core)
|
||||||
|
@ -21,13 +21,14 @@
|
|||||||
#include "core/debugger/debugger.h"
|
#include "core/debugger/debugger.h"
|
||||||
#include "core/device_memory.h"
|
#include "core/device_memory.h"
|
||||||
#include "core/file_sys/bis_factory.h"
|
#include "core/file_sys/bis_factory.h"
|
||||||
#include "core/file_sys/mode.h"
|
#include "core/file_sys/fs_filesystem.h"
|
||||||
#include "core/file_sys/patch_manager.h"
|
#include "core/file_sys/patch_manager.h"
|
||||||
#include "core/file_sys/registered_cache.h"
|
#include "core/file_sys/registered_cache.h"
|
||||||
#include "core/file_sys/romfs_factory.h"
|
#include "core/file_sys/romfs_factory.h"
|
||||||
#include "core/file_sys/savedata_factory.h"
|
#include "core/file_sys/savedata_factory.h"
|
||||||
#include "core/file_sys/vfs_concat.h"
|
#include "core/file_sys/vfs/vfs_concat.h"
|
||||||
#include "core/file_sys/vfs_real.h"
|
#include "core/file_sys/vfs/vfs_real.h"
|
||||||
|
#include "core/gpu_dirty_memory_manager.h"
|
||||||
#include "core/hle/kernel/k_memory_manager.h"
|
#include "core/hle/kernel/k_memory_manager.h"
|
||||||
#include "core/hle/kernel/k_process.h"
|
#include "core/hle/kernel/k_process.h"
|
||||||
#include "core/hle/kernel/k_resource_limit.h"
|
#include "core/hle/kernel/k_resource_limit.h"
|
||||||
@ -35,13 +36,19 @@
|
|||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/physical_core.h"
|
#include "core/hle/kernel/physical_core.h"
|
||||||
#include "core/hle/service/acc/profile_manager.h"
|
#include "core/hle/service/acc/profile_manager.h"
|
||||||
#include "core/hle/service/am/applets/applets.h"
|
#include "core/hle/service/am/applet_manager.h"
|
||||||
|
#include "core/hle/service/am/frontend/applets.h"
|
||||||
#include "core/hle/service/apm/apm_controller.h"
|
#include "core/hle/service/apm/apm_controller.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/hle/service/glue/glue_manager.h"
|
#include "core/hle/service/glue/glue_manager.h"
|
||||||
|
#include "core/hle/service/glue/time/static.h"
|
||||||
|
#include "core/hle/service/psc/time/static.h"
|
||||||
|
#include "core/hle/service/psc/time/steady_clock.h"
|
||||||
|
#include "core/hle/service/psc/time/system_clock.h"
|
||||||
|
#include "core/hle/service/psc/time/time_zone_service.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#include "core/hle/service/set/system_settings_server.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
#include "core/hle/service/time/time_manager.h"
|
|
||||||
#include "core/internal_network/network.h"
|
#include "core/internal_network/network.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
@ -96,7 +103,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
|
|||||||
Common::SplitPath(path, &dir_name, &filename, nullptr);
|
Common::SplitPath(path, &dir_name, &filename, nullptr);
|
||||||
|
|
||||||
if (filename == "00") {
|
if (filename == "00") {
|
||||||
const auto dir = vfs->OpenDirectory(dir_name, FileSys::Mode::Read);
|
const auto dir = vfs->OpenDirectory(dir_name, FileSys::OpenMode::Read);
|
||||||
std::vector<FileSys::VirtualFile> concat;
|
std::vector<FileSys::VirtualFile> concat;
|
||||||
|
|
||||||
for (u32 i = 0; i < 0x10; ++i) {
|
for (u32 i = 0; i < 0x10; ++i) {
|
||||||
@ -121,16 +128,16 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Common::FS::IsDir(path)) {
|
if (Common::FS::IsDir(path)) {
|
||||||
return vfs->OpenFile(path + "/main", FileSys::Mode::Read);
|
return vfs->OpenFile(path + "/main", FileSys::OpenMode::Read);
|
||||||
}
|
}
|
||||||
|
|
||||||
return vfs->OpenFile(path, FileSys::Mode::Read);
|
return vfs->OpenFile(path, FileSys::OpenMode::Read);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct System::Impl {
|
struct System::Impl {
|
||||||
explicit Impl(System& system)
|
explicit Impl(System& system)
|
||||||
: kernel{system}, fs_controller{system}, hid_core{}, room_network{}, cpu_manager{system},
|
: kernel{system}, fs_controller{system}, hid_core{}, room_network{}, cpu_manager{system},
|
||||||
reporter{system}, applet_manager{system}, profile_manager{}, time_manager{system} {}
|
reporter{system}, applet_manager{system}, frontend_applets{system}, profile_manager{} {}
|
||||||
|
|
||||||
void Initialize(System& system) {
|
void Initialize(System& system) {
|
||||||
device_memory = std::make_unique<Core::DeviceMemory>();
|
device_memory = std::make_unique<Core::DeviceMemory>();
|
||||||
@ -142,8 +149,6 @@ struct System::Impl {
|
|||||||
core_timing.SetMulticore(is_multicore);
|
core_timing.SetMulticore(is_multicore);
|
||||||
core_timing.Initialize([&system]() { system.RegisterHostThread(); });
|
core_timing.Initialize([&system]() { system.RegisterHostThread(); });
|
||||||
|
|
||||||
RefreshTime();
|
|
||||||
|
|
||||||
// Create a default fs if one doesn't already exist.
|
// Create a default fs if one doesn't already exist.
|
||||||
if (virtual_filesystem == nullptr) {
|
if (virtual_filesystem == nullptr) {
|
||||||
virtual_filesystem = std::make_shared<FileSys::RealVfsFilesystem>();
|
virtual_filesystem = std::make_shared<FileSys::RealVfsFilesystem>();
|
||||||
@ -153,7 +158,7 @@ struct System::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create default implementations of applets if one is not provided.
|
// Create default implementations of applets if one is not provided.
|
||||||
applet_manager.SetDefaultAppletsIfMissing();
|
frontend_applets.SetDefaultAppletsIfMissing();
|
||||||
|
|
||||||
is_async_gpu = Settings::values.use_asynchronous_gpu_emulation.GetValue();
|
is_async_gpu = Settings::values.use_asynchronous_gpu_emulation.GetValue();
|
||||||
|
|
||||||
@ -181,14 +186,57 @@ struct System::Impl {
|
|||||||
Initialize(system);
|
Initialize(system);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefreshTime() {
|
void RefreshTime(System& system) {
|
||||||
|
if (!system.IsPoweredOn()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto settings_service =
|
||||||
|
system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys",
|
||||||
|
true);
|
||||||
|
auto static_service_a =
|
||||||
|
system.ServiceManager().GetService<Service::Glue::Time::StaticService>("time:a", true);
|
||||||
|
|
||||||
|
auto static_service_s =
|
||||||
|
system.ServiceManager().GetService<Service::PSC::Time::StaticService>("time:s", true);
|
||||||
|
|
||||||
|
std::shared_ptr<Service::PSC::Time::SystemClock> user_clock;
|
||||||
|
static_service_a->GetStandardUserSystemClock(&user_clock);
|
||||||
|
|
||||||
|
std::shared_ptr<Service::PSC::Time::SystemClock> local_clock;
|
||||||
|
static_service_a->GetStandardLocalSystemClock(&local_clock);
|
||||||
|
|
||||||
|
std::shared_ptr<Service::PSC::Time::SystemClock> network_clock;
|
||||||
|
static_service_s->GetStandardNetworkSystemClock(&network_clock);
|
||||||
|
|
||||||
|
std::shared_ptr<Service::Glue::Time::TimeZoneService> timezone_service;
|
||||||
|
static_service_a->GetTimeZoneService(&timezone_service);
|
||||||
|
|
||||||
|
Service::PSC::Time::LocationName name{};
|
||||||
|
auto new_name = Settings::GetTimeZoneString(Settings::values.time_zone_index.GetValue());
|
||||||
|
std::memcpy(name.data(), new_name.data(), std::min(name.size(), new_name.size()));
|
||||||
|
|
||||||
|
timezone_service->SetDeviceLocationName(name);
|
||||||
|
|
||||||
|
u64 time_offset = 0;
|
||||||
|
if (Settings::values.custom_rtc_enabled) {
|
||||||
|
time_offset = Settings::values.custom_rtc_offset.GetValue();
|
||||||
|
}
|
||||||
|
|
||||||
const auto posix_time = std::chrono::system_clock::now().time_since_epoch();
|
const auto posix_time = std::chrono::system_clock::now().time_since_epoch();
|
||||||
const auto current_time =
|
const u64 current_time =
|
||||||
std::chrono::duration_cast<std::chrono::seconds>(posix_time).count();
|
+std::chrono::duration_cast<std::chrono::seconds>(posix_time).count();
|
||||||
Settings::values.custom_rtc_differential =
|
const u64 new_time = current_time + time_offset;
|
||||||
(Settings::values.custom_rtc_enabled ? Settings::values.custom_rtc.GetValue()
|
|
||||||
: current_time) -
|
Service::PSC::Time::SystemClockContext context{};
|
||||||
current_time;
|
settings_service->SetUserSystemClockContext(context);
|
||||||
|
user_clock->SetCurrentTime(new_time);
|
||||||
|
|
||||||
|
local_clock->SetCurrentTime(new_time);
|
||||||
|
|
||||||
|
network_clock->GetSystemClockContext(&context);
|
||||||
|
settings_service->SetNetworkSystemClockContext(context);
|
||||||
|
network_clock->SetCurrentTime(new_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Run() {
|
void Run() {
|
||||||
@ -264,9 +312,6 @@ struct System::Impl {
|
|||||||
service_manager = std::make_shared<Service::SM::ServiceManager>(kernel);
|
service_manager = std::make_shared<Service::SM::ServiceManager>(kernel);
|
||||||
services = std::make_unique<Service::Services>(service_manager, system);
|
services = std::make_unique<Service::Services>(service_manager, system);
|
||||||
|
|
||||||
// Initialize time manager, which must happen after kernel is created
|
|
||||||
time_manager.Initialize();
|
|
||||||
|
|
||||||
is_powered_on = true;
|
is_powered_on = true;
|
||||||
exit_locked = false;
|
exit_locked = false;
|
||||||
exit_requested = false;
|
exit_requested = false;
|
||||||
@ -286,16 +331,27 @@ struct System::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SystemResultStatus Load(System& system, Frontend::EmuWindow& emu_window,
|
SystemResultStatus Load(System& system, Frontend::EmuWindow& emu_window,
|
||||||
const std::string& filepath, u64 program_id,
|
const std::string& filepath,
|
||||||
std::size_t program_index) {
|
Service::AM::FrontendAppletParameters& params) {
|
||||||
app_loader = Loader::GetLoader(system, GetGameFileFromPath(virtual_filesystem, filepath),
|
app_loader = Loader::GetLoader(system, GetGameFileFromPath(virtual_filesystem, filepath),
|
||||||
program_id, program_index);
|
params.program_id, params.program_index);
|
||||||
|
|
||||||
if (!app_loader) {
|
if (!app_loader) {
|
||||||
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
||||||
return SystemResultStatus::ErrorGetLoader;
|
return SystemResultStatus::ErrorGetLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (app_loader->ReadProgramId(params.program_id) != Loader::ResultStatus::Success) {
|
||||||
|
LOG_ERROR(Core, "Failed to find title id for ROM!");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string name = "Unknown program";
|
||||||
|
if (app_loader->ReadTitle(name) != Loader::ResultStatus::Success) {
|
||||||
|
LOG_ERROR(Core, "Failed to read title for ROM!");
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INFO(Core, "Loading {} ({})", name, params.program_id);
|
||||||
|
|
||||||
InitializeKernel(system);
|
InitializeKernel(system);
|
||||||
|
|
||||||
// Create the application process.
|
// Create the application process.
|
||||||
@ -329,9 +385,14 @@ struct System::Impl {
|
|||||||
cheat_engine->Initialize();
|
cheat_engine->Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register with applet manager.
|
||||||
|
applet_manager.CreateAndInsertByFrontendAppletParameters(main_process->GetProcessId(),
|
||||||
|
params);
|
||||||
|
|
||||||
// All threads are started, begin main process execution, now that we're in the clear.
|
// All threads are started, begin main process execution, now that we're in the clear.
|
||||||
main_process->Run(load_parameters->main_thread_priority,
|
main_process->Run(load_parameters->main_thread_priority,
|
||||||
load_parameters->main_thread_stack_size);
|
load_parameters->main_thread_stack_size);
|
||||||
|
main_process->Close();
|
||||||
|
|
||||||
if (Settings::values.gamecard_inserted) {
|
if (Settings::values.gamecard_inserted) {
|
||||||
if (Settings::values.gamecard_current_game) {
|
if (Settings::values.gamecard_current_game) {
|
||||||
@ -342,21 +403,13 @@ struct System::Impl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app_loader->ReadProgramId(program_id) != Loader::ResultStatus::Success) {
|
perf_stats = std::make_unique<PerfStats>(params.program_id);
|
||||||
LOG_ERROR(Core, "Failed to find title id for ROM (Error {})", load_result);
|
|
||||||
}
|
|
||||||
perf_stats = std::make_unique<PerfStats>(program_id);
|
|
||||||
// Reset counters and set time origin to current frame
|
// Reset counters and set time origin to current frame
|
||||||
GetAndResetPerfStats();
|
GetAndResetPerfStats();
|
||||||
perf_stats->BeginSystemFrame();
|
perf_stats->BeginSystemFrame();
|
||||||
|
|
||||||
std::string name = "Unknown Game";
|
|
||||||
if (app_loader->ReadTitle(name) != Loader::ResultStatus::Success) {
|
|
||||||
LOG_ERROR(Core, "Failed to read title for ROM (Error {})", load_result);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string title_version;
|
std::string title_version;
|
||||||
const FileSys::PatchManager pm(program_id, system.GetFileSystemController(),
|
const FileSys::PatchManager pm(params.program_id, system.GetFileSystemController(),
|
||||||
system.GetContentProvider());
|
system.GetContentProvider());
|
||||||
const auto metadata = pm.GetControlMetadata();
|
const auto metadata = pm.GetControlMetadata();
|
||||||
if (metadata.first != nullptr) {
|
if (metadata.first != nullptr) {
|
||||||
@ -365,14 +418,15 @@ struct System::Impl {
|
|||||||
if (auto room_member = room_network.GetRoomMember().lock()) {
|
if (auto room_member = room_network.GetRoomMember().lock()) {
|
||||||
Network::GameInfo game_info;
|
Network::GameInfo game_info;
|
||||||
game_info.name = name;
|
game_info.name = name;
|
||||||
game_info.id = program_id;
|
game_info.id = params.program_id;
|
||||||
game_info.version = title_version;
|
game_info.version = title_version;
|
||||||
room_member->SendGameInfo(game_info);
|
room_member->SendGameInfo(game_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Workarounds:
|
// Workarounds:
|
||||||
// Activate this in Super Smash Brothers Ultimate, it only affects AMD cards using AMDVLK
|
// Activate this in Super Smash Brothers Ultimate, it only affects AMD cards using AMDVLK
|
||||||
Settings::values.renderer_amdvlk_depth_bias_workaround = program_id == 0x1006A800016E000ULL;
|
Settings::values.renderer_amdvlk_depth_bias_workaround =
|
||||||
|
params.program_id == 0x1006A800016E000ULL;
|
||||||
|
|
||||||
status = SystemResultStatus::Success;
|
status = SystemResultStatus::Success;
|
||||||
return status;
|
return status;
|
||||||
@ -411,12 +465,12 @@ struct System::Impl {
|
|||||||
}
|
}
|
||||||
kernel.CloseServices();
|
kernel.CloseServices();
|
||||||
kernel.ShutdownCores();
|
kernel.ShutdownCores();
|
||||||
|
applet_manager.Reset();
|
||||||
services.reset();
|
services.reset();
|
||||||
service_manager.reset();
|
service_manager.reset();
|
||||||
fs_controller.Reset();
|
fs_controller.Reset();
|
||||||
cheat_engine.reset();
|
cheat_engine.reset();
|
||||||
telemetry_session.reset();
|
telemetry_session.reset();
|
||||||
time_manager.Shutdown();
|
|
||||||
core_timing.ClearPendingEvents();
|
core_timing.ClearPendingEvents();
|
||||||
app_loader.reset();
|
app_loader.reset();
|
||||||
audio_core.reset();
|
audio_core.reset();
|
||||||
@ -523,8 +577,9 @@ struct System::Impl {
|
|||||||
|
|
||||||
std::unique_ptr<Tools::RenderdocAPI> renderdoc_api;
|
std::unique_ptr<Tools::RenderdocAPI> renderdoc_api;
|
||||||
|
|
||||||
/// Frontend applets
|
/// Applets
|
||||||
Service::AM::Applets::AppletManager applet_manager;
|
Service::AM::AppletManager applet_manager;
|
||||||
|
Service::AM::Frontend::FrontendAppletHolder frontend_applets;
|
||||||
|
|
||||||
/// APM (Performance) services
|
/// APM (Performance) services
|
||||||
Service::APM::Controller apm_controller{core_timing};
|
Service::APM::Controller apm_controller{core_timing};
|
||||||
@ -532,7 +587,6 @@ struct System::Impl {
|
|||||||
/// Service State
|
/// Service State
|
||||||
Service::Glue::ARPManager arp_manager;
|
Service::Glue::ARPManager arp_manager;
|
||||||
Service::Account::ProfileManager profile_manager;
|
Service::Account::ProfileManager profile_manager;
|
||||||
Service::Time::TimeManager time_manager;
|
|
||||||
|
|
||||||
/// Service manager
|
/// Service manager
|
||||||
std::shared_ptr<Service::SM::ServiceManager> service_manager;
|
std::shared_ptr<Service::SM::ServiceManager> service_manager;
|
||||||
@ -565,6 +619,9 @@ struct System::Impl {
|
|||||||
std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{};
|
std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{};
|
||||||
std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{};
|
std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{};
|
||||||
|
|
||||||
|
std::array<Core::GPUDirtyMemoryManager, Core::Hardware::NUM_CPU_CORES>
|
||||||
|
gpu_dirty_memory_managers;
|
||||||
|
|
||||||
std::deque<std::vector<u8>> user_channel;
|
std::deque<std::vector<u8>> user_channel;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -635,8 +692,8 @@ void System::InitializeDebugger() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SystemResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::string& filepath,
|
SystemResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::string& filepath,
|
||||||
u64 program_id, std::size_t program_index) {
|
Service::AM::FrontendAppletParameters& params) {
|
||||||
return impl->Load(*this, emu_window, filepath, program_id, program_index);
|
return impl->Load(*this, emu_window, filepath, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool System::IsPoweredOn() const {
|
bool System::IsPoweredOn() const {
|
||||||
@ -651,8 +708,14 @@ size_t System::GetCurrentHostThreadID() const {
|
|||||||
return impl->kernel.GetCurrentHostThreadID();
|
return impl->kernel.GetCurrentHostThreadID();
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::GatherGPUDirtyMemory(std::function<void(VAddr, size_t)>& callback) {
|
std::span<GPUDirtyMemoryManager> System::GetGPUDirtyMemoryManager() {
|
||||||
return this->ApplicationProcess()->GatherGPUDirtyMemory(callback);
|
return impl->gpu_dirty_memory_managers;
|
||||||
|
}
|
||||||
|
|
||||||
|
void System::GatherGPUDirtyMemory(std::function<void(PAddr, size_t)>& callback) {
|
||||||
|
for (auto& manager : impl->gpu_dirty_memory_managers) {
|
||||||
|
manager.Gather(callback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PerfStatsResults System::GetAndResetPerfStats() {
|
PerfStatsResults System::GetAndResetPerfStats() {
|
||||||
@ -820,19 +883,19 @@ void System::RegisterCheatList(const std::vector<Memory::CheatEntry>& list,
|
|||||||
impl->cheat_engine->SetMainMemoryParameters(main_region_begin, main_region_size);
|
impl->cheat_engine->SetMainMemoryParameters(main_region_begin, main_region_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::SetAppletFrontendSet(Service::AM::Applets::AppletFrontendSet&& set) {
|
void System::SetFrontendAppletSet(Service::AM::Frontend::FrontendAppletSet&& set) {
|
||||||
impl->applet_manager.SetAppletFrontendSet(std::move(set));
|
impl->frontend_applets.SetFrontendAppletSet(std::move(set));
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::SetDefaultAppletFrontendSet() {
|
Service::AM::Frontend::FrontendAppletHolder& System::GetFrontendAppletHolder() {
|
||||||
impl->applet_manager.SetDefaultAppletFrontendSet();
|
return impl->frontend_applets;
|
||||||
}
|
}
|
||||||
|
|
||||||
Service::AM::Applets::AppletManager& System::GetAppletManager() {
|
const Service::AM::Frontend::FrontendAppletHolder& System::GetFrontendAppletHolder() const {
|
||||||
return impl->applet_manager;
|
return impl->frontend_applets;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Service::AM::Applets::AppletManager& System::GetAppletManager() const {
|
Service::AM::AppletManager& System::GetAppletManager() {
|
||||||
return impl->applet_manager;
|
return impl->applet_manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -901,14 +964,6 @@ const Service::Account::ProfileManager& System::GetProfileManager() const {
|
|||||||
return impl->profile_manager;
|
return impl->profile_manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
Service::Time::TimeManager& System::GetTimeManager() {
|
|
||||||
return impl->time_manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Service::Time::TimeManager& System::GetTimeManager() const {
|
|
||||||
return impl->time_manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
void System::SetExitLocked(bool locked) {
|
void System::SetExitLocked(bool locked) {
|
||||||
impl->exit_locked = locked;
|
impl->exit_locked = locked;
|
||||||
}
|
}
|
||||||
@ -1020,13 +1075,9 @@ void System::Exit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void System::ApplySettings() {
|
void System::ApplySettings() {
|
||||||
impl->RefreshTime();
|
impl->RefreshTime(*this);
|
||||||
|
|
||||||
if (IsPoweredOn()) {
|
if (IsPoweredOn()) {
|
||||||
if (Settings::values.custom_rtc_enabled) {
|
|
||||||
const s64 posix_time{Settings::values.custom_rtc.GetValue()};
|
|
||||||
GetTimeManager().UpdateLocalSystemClockTime(posix_time);
|
|
||||||
}
|
|
||||||
Renderer().RefreshBaseSettings();
|
Renderer().RefreshBaseSettings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/file_sys/vfs_types.h"
|
#include "core/file_sys/vfs/vfs_types.h"
|
||||||
|
|
||||||
namespace Core::Frontend {
|
namespace Core::Frontend {
|
||||||
class EmuWindow;
|
class EmuWindow;
|
||||||
@ -49,10 +50,15 @@ namespace Account {
|
|||||||
class ProfileManager;
|
class ProfileManager;
|
||||||
} // namespace Account
|
} // namespace Account
|
||||||
|
|
||||||
namespace AM::Applets {
|
namespace AM {
|
||||||
struct AppletFrontendSet;
|
struct FrontendAppletParameters;
|
||||||
class AppletManager;
|
class AppletManager;
|
||||||
} // namespace AM::Applets
|
} // namespace AM
|
||||||
|
|
||||||
|
namespace AM::Frontend {
|
||||||
|
struct FrontendAppletSet;
|
||||||
|
class FrontendAppletHolder;
|
||||||
|
} // namespace AM::Frontend
|
||||||
|
|
||||||
namespace APM {
|
namespace APM {
|
||||||
class Controller;
|
class Controller;
|
||||||
@ -72,10 +78,6 @@ namespace SM {
|
|||||||
class ServiceManager;
|
class ServiceManager;
|
||||||
} // namespace SM
|
} // namespace SM
|
||||||
|
|
||||||
namespace Time {
|
|
||||||
class TimeManager;
|
|
||||||
} // namespace Time
|
|
||||||
|
|
||||||
} // namespace Service
|
} // namespace Service
|
||||||
|
|
||||||
namespace Tegra {
|
namespace Tegra {
|
||||||
@ -116,6 +118,7 @@ class CpuManager;
|
|||||||
class Debugger;
|
class Debugger;
|
||||||
class DeviceMemory;
|
class DeviceMemory;
|
||||||
class ExclusiveMonitor;
|
class ExclusiveMonitor;
|
||||||
|
class GPUDirtyMemoryManager;
|
||||||
class PerfStats;
|
class PerfStats;
|
||||||
class Reporter;
|
class Reporter;
|
||||||
class SpeedLimiter;
|
class SpeedLimiter;
|
||||||
@ -205,8 +208,8 @@ public:
|
|||||||
* @returns SystemResultStatus code, indicating if the operation succeeded.
|
* @returns SystemResultStatus code, indicating if the operation succeeded.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] SystemResultStatus Load(Frontend::EmuWindow& emu_window,
|
[[nodiscard]] SystemResultStatus Load(Frontend::EmuWindow& emu_window,
|
||||||
const std::string& filepath, u64 program_id = 0,
|
const std::string& filepath,
|
||||||
std::size_t program_index = 0);
|
Service::AM::FrontendAppletParameters& params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates if the emulated system is powered on (all subsystems initialized and able to run an
|
* Indicates if the emulated system is powered on (all subsystems initialized and able to run an
|
||||||
@ -224,7 +227,9 @@ public:
|
|||||||
/// Prepare the core emulation for a reschedule
|
/// Prepare the core emulation for a reschedule
|
||||||
void PrepareReschedule(u32 core_index);
|
void PrepareReschedule(u32 core_index);
|
||||||
|
|
||||||
void GatherGPUDirtyMemory(std::function<void(VAddr, size_t)>& callback);
|
std::span<GPUDirtyMemoryManager> GetGPUDirtyMemoryManager();
|
||||||
|
|
||||||
|
void GatherGPUDirtyMemory(std::function<void(PAddr, size_t)>& callback);
|
||||||
|
|
||||||
[[nodiscard]] size_t GetCurrentHostThreadID() const;
|
[[nodiscard]] size_t GetCurrentHostThreadID() const;
|
||||||
|
|
||||||
@ -344,11 +349,13 @@ public:
|
|||||||
const std::array<u8, 0x20>& build_id, u64 main_region_begin,
|
const std::array<u8, 0x20>& build_id, u64 main_region_begin,
|
||||||
u64 main_region_size);
|
u64 main_region_size);
|
||||||
|
|
||||||
void SetAppletFrontendSet(Service::AM::Applets::AppletFrontendSet&& set);
|
void SetFrontendAppletSet(Service::AM::Frontend::FrontendAppletSet&& set);
|
||||||
void SetDefaultAppletFrontendSet();
|
|
||||||
|
|
||||||
[[nodiscard]] Service::AM::Applets::AppletManager& GetAppletManager();
|
[[nodiscard]] Service::AM::Frontend::FrontendAppletHolder& GetFrontendAppletHolder();
|
||||||
[[nodiscard]] const Service::AM::Applets::AppletManager& GetAppletManager() const;
|
[[nodiscard]] const Service::AM::Frontend::FrontendAppletHolder& GetFrontendAppletHolder()
|
||||||
|
const;
|
||||||
|
|
||||||
|
[[nodiscard]] Service::AM::AppletManager& GetAppletManager();
|
||||||
|
|
||||||
void SetContentProvider(std::unique_ptr<FileSys::ContentProviderUnion> provider);
|
void SetContentProvider(std::unique_ptr<FileSys::ContentProviderUnion> provider);
|
||||||
|
|
||||||
@ -377,9 +384,6 @@ public:
|
|||||||
[[nodiscard]] Service::Account::ProfileManager& GetProfileManager();
|
[[nodiscard]] Service::Account::ProfileManager& GetProfileManager();
|
||||||
[[nodiscard]] const Service::Account::ProfileManager& GetProfileManager() const;
|
[[nodiscard]] const Service::Account::ProfileManager& GetProfileManager() const;
|
||||||
|
|
||||||
[[nodiscard]] Service::Time::TimeManager& GetTimeManager();
|
|
||||||
[[nodiscard]] const Service::Time::TimeManager& GetTimeManager() const;
|
|
||||||
|
|
||||||
[[nodiscard]] Core::Debugger& GetDebugger();
|
[[nodiscard]] Core::Debugger& GetDebugger();
|
||||||
[[nodiscard]] const Core::Debugger& GetDebugger() const;
|
[[nodiscard]] const Core::Debugger& GetDebugger() const;
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user