summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/expected.h987
-rw-r--r--src/common/logging/backend.cpp64
-rw-r--r--src/common/logging/backend.h2
-rw-r--r--src/common/logging/log_entry.h1
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h1
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp1
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_cp15.cpp1
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_cp15.h1
-rw-r--r--src/core/arm/dynarmic/arm_exclusive_monitor.cpp2
-rw-r--r--src/core/arm/dynarmic/arm_exclusive_monitor.h1
-rw-r--r--src/core/core.cpp28
-rw-r--r--src/core/core.h2
-rw-r--r--src/core/core_timing.h1
-rw-r--r--src/core/cpu_manager.cpp1
-rw-r--r--src/core/crypto/ctr_encryption_layer.cpp1
-rw-r--r--src/core/crypto/key_manager.cpp3
-rw-r--r--src/core/crypto/key_manager.h1
-rw-r--r--src/core/crypto/partition_data_manager.cpp1
-rw-r--r--src/core/crypto/xts_encryption_layer.cpp1
-rw-r--r--src/core/file_sys/card_image.cpp1
-rw-r--r--src/core/file_sys/control_metadata.cpp3
-rw-r--r--src/core/file_sys/control_metadata.h4
-rw-r--r--src/core/file_sys/directory.h1
-rw-r--r--src/core/file_sys/nca_metadata.h1
-rw-r--r--src/core/file_sys/program_metadata.cpp5
-rw-r--r--src/core/file_sys/romfs_factory.cpp11
-rw-r--r--src/core/file_sys/romfs_factory.h3
-rw-r--r--src/core/file_sys/savedata_factory.cpp7
-rw-r--r--src/core/file_sys/savedata_factory.h1
-rw-r--r--src/core/file_sys/sdmc_factory.cpp2
-rw-r--r--src/core/file_sys/submission_package.cpp1
-rw-r--r--src/core/file_sys/system_archive/time_zone_binary.h1
-rw-r--r--src/core/file_sys/vfs.h1
-rw-r--r--src/core/file_sys/vfs_concat.h1
-rw-r--r--src/core/file_sys/vfs_offset.h1
-rw-r--r--src/core/frontend/applets/general_frontend.h1
-rw-r--r--src/core/frontend/applets/software_keyboard.cpp5
-rw-r--r--src/core/frontend/applets/software_keyboard.h7
-rw-r--r--src/core/frontend/applets/web_browser.h1
-rw-r--r--src/core/frontend/emu_window.cpp1
-rw-r--r--src/core/frontend/emu_window.h1
-rw-r--r--src/core/hle/kernel/board/nintendo/nx/secure_monitor.h2
-rw-r--r--src/core/hle/kernel/code_set.h1
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp6
-rw-r--r--src/core/hle/kernel/init/init_slab_setup.cpp2
-rw-r--r--src/core/hle/kernel/k_auto_object_container.h5
-rw-r--r--src/core/hle/kernel/k_class_token.h1
-rw-r--r--src/core/hle/kernel/k_client_session.cpp1
-rw-r--r--src/core/hle/kernel/k_client_session.h2
-rw-r--r--src/core/hle/kernel/k_condition_variable.cpp2
-rw-r--r--src/core/hle/kernel/k_handle_table.cpp1
-rw-r--r--src/core/hle/kernel/k_handle_table.h1
-rw-r--r--src/core/hle/kernel/k_light_condition_variable.h1
-rw-r--r--src/core/hle/kernel/k_light_lock.h1
-rw-r--r--src/core/hle/kernel/k_memory_manager.h1
-rw-r--r--src/core/hle/kernel/k_page_heap.cpp1
-rw-r--r--src/core/hle/kernel/k_page_heap.h3
-rw-r--r--src/core/hle/kernel/k_page_table.cpp4
-rw-r--r--src/core/hle/kernel/k_port.h1
-rw-r--r--src/core/hle/kernel/k_process.cpp11
-rw-r--r--src/core/hle/kernel/k_process.h5
-rw-r--r--src/core/hle/kernel/k_scheduler.h5
-rw-r--r--src/core/hle/kernel/k_scheduler_lock.h1
-rw-r--r--src/core/hle/kernel/k_scoped_lock.h3
-rw-r--r--src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h1
-rw-r--r--src/core/hle/kernel/k_server_port.cpp1
-rw-r--r--src/core/hle/kernel/k_server_port.h3
-rw-r--r--src/core/hle/kernel/k_server_session.cpp2
-rw-r--r--src/core/hle/kernel/k_server_session.h3
-rw-r--r--src/core/hle/kernel/k_session.cpp1
-rw-r--r--src/core/hle/kernel/k_shared_memory.h1
-rw-r--r--src/core/hle/kernel/k_shared_memory_info.h4
-rw-r--r--src/core/hle/kernel/k_thread.cpp4
-rw-r--r--src/core/hle/kernel/k_trace.h2
-rw-r--r--src/core/hle/kernel/k_transfer_memory.h2
-rw-r--r--src/core/hle/kernel/kernel.cpp38
-rw-r--r--src/core/hle/kernel/kernel.h8
-rw-r--r--src/core/hle/kernel/physical_core.h1
-rw-r--r--src/core/hle/kernel/service_thread.cpp4
-rw-r--r--src/core/hle/kernel/slab_helpers.h8
-rw-r--r--src/core/hle/kernel/svc.cpp39
-rw-r--r--src/core/hle/kernel/svc_wrap.h4
-rw-r--r--src/core/hle/kernel/time_manager.cpp3
-rw-r--r--src/core/hle/kernel/time_manager.h1
-rw-r--r--src/core/hle/result.h192
-rw-r--r--src/core/hle/service/acc/acc.cpp15
-rw-r--r--src/core/hle/service/acc/acc.h1
-rw-r--r--src/core/hle/service/acc/acc_u0.cpp1
-rw-r--r--src/core/hle/service/am/am.cpp16
-rw-r--r--src/core/hle/service/am/applets/applet_error.cpp3
-rw-r--r--src/core/hle/service/am/applets/applet_general_backend.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_software_keyboard.cpp42
-rw-r--r--src/core/hle/service/am/applets/applet_software_keyboard.h4
-rw-r--r--src/core/hle/service/am/applets/applet_web_browser.cpp3
-rw-r--r--src/core/hle/service/am/applets/applet_web_browser.h1
-rw-r--r--src/core/hle/service/aoc/aoc_u.cpp34
-rw-r--r--src/core/hle/service/aoc/aoc_u.h3
-rw-r--r--src/core/hle/service/apm/apm.cpp1
-rw-r--r--src/core/hle/service/audio/audout_u.cpp1
-rw-r--r--src/core/hle/service/audio/audren_u.cpp3
-rw-r--r--src/core/hle/service/bcat/backend/backend.h1
-rw-r--r--src/core/hle/service/bcat/bcat_module.cpp8
-rw-r--r--src/core/hle/service/btdrv/btdrv.cpp1
-rw-r--r--src/core/hle/service/btm/btm.cpp1
-rw-r--r--src/core/hle/service/fatal/fatal.cpp3
-rw-r--r--src/core/hle/service/filesystem/filesystem.cpp27
-rw-r--r--src/core/hle/service/filesystem/fsp_srv.cpp3
-rw-r--r--src/core/hle/service/glue/arp.cpp3
-rw-r--r--src/core/hle/service/glue/glue_manager.cpp4
-rw-r--r--src/core/hle/service/glue/glue_manager.h1
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp1
-rw-r--r--src/core/hle/service/hid/hid.cpp2
-rw-r--r--src/core/hle/service/hid/irs.cpp1
-rw-r--r--src/core/hle/service/ldr/ldr.cpp7
-rw-r--r--src/core/hle/service/lm/lm.cpp3
-rw-r--r--src/core/hle/service/mii/mii_manager.cpp4
-rw-r--r--src/core/hle/service/mii/raw_data.h1
-rw-r--r--src/core/hle/service/nfp/nfp.cpp2
-rw-r--r--src/core/hle/service/nifm/nifm.cpp1
-rw-r--r--src/core/hle/service/nim/nim.cpp1
-rw-r--r--src/core/hle/service/ns/language.cpp26
-rw-r--r--src/core/hle/service/ns/language.h4
-rw-r--r--src/core/hle/service/ns/ns.cpp4
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdevice.h3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp1
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp2
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp1
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp1
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp1
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h1
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_vic.cpp1
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp1
-rw-r--r--src/core/hle/service/nvdrv/nvdrv_interface.cpp3
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h1
-rw-r--r--src/core/hle/service/pctl/pctl_module.cpp12
-rw-r--r--src/core/hle/service/pm/pm.cpp4
-rw-r--r--src/core/hle/service/prepo/prepo.cpp5
-rw-r--r--src/core/hle/service/ptm/psm.cpp1
-rw-r--r--src/core/hle/service/service.cpp4
-rw-r--r--src/core/hle/service/sm/sm.cpp6
-rw-r--r--src/core/hle/service/sm/sm.h1
-rw-r--r--src/core/hle/service/sm/sm_controller.cpp2
-rw-r--r--src/core/hle/service/sockets/bsd.cpp1
-rw-r--r--src/core/hle/service/spl/spl_module.cpp26
-rw-r--r--src/core/hle/service/time/local_system_clock_context_writer.h1
-rw-r--r--src/core/hle/service/time/standard_steady_clock_core.cpp1
-rw-r--r--src/core/hle/service/time/tick_based_steady_clock_core.cpp1
-rw-r--r--src/core/hle/service/time/time.cpp2
-rw-r--r--src/core/hle/service/time/time_manager.cpp2
-rw-r--r--src/core/hle/service/time/time_manager.h3
-rw-r--r--src/core/hle/service/time/time_sharedmemory.cpp1
-rw-r--r--src/core/hle/service/time/time_sharedmemory.h1
-rw-r--r--src/core/hle/service/time/time_zone_manager.cpp2
-rw-r--r--src/core/hle/service/vi/vi.cpp12
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp3
-rw-r--r--src/core/loader/elf.cpp1
-rw-r--r--src/core/loader/elf.h2
-rw-r--r--src/core/loader/nax.cpp1
-rw-r--r--src/core/loader/nca.cpp1
-rw-r--r--src/core/loader/nca.h1
-rw-r--r--src/core/loader/nsp.cpp1
-rw-r--r--src/core/loader/nsp.h1
-rw-r--r--src/core/loader/xci.cpp1
-rw-r--r--src/core/loader/xci.h1
-rw-r--r--src/core/memory/cheat_engine.cpp4
-rw-r--r--src/core/network/network.h1
-rw-r--r--src/core/perf_stats.cpp1
-rw-r--r--src/core/reporter.cpp8
-rw-r--r--src/core/tools/freezer.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_special.cpp4
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp21
-rw-r--r--src/shader_recompiler/frontend/ir/basic_block.h14
-rw-r--r--src/shader_recompiler/frontend/ir/microinstruction.cpp15
-rw-r--r--src/shader_recompiler/frontend/ir/value.h3
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate_program.cpp2
-rw-r--r--src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp31
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp15
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp6
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp1
-rw-r--r--src/yuzu/CMakeLists.txt5
-rw-r--r--src/yuzu/applets/qt_software_keyboard.cpp9
-rw-r--r--src/yuzu/applets/qt_software_keyboard.h12
-rw-r--r--src/yuzu/bootmanager.cpp3
-rw-r--r--src/yuzu/configuration/configure_dialog.cpp7
-rw-r--r--src/yuzu/configuration/configure_per_game.cpp2
-rw-r--r--src/yuzu/configuration/configure_per_game.ui8
-rw-r--r--src/yuzu/configuration/configure_profile_manager.cpp11
-rw-r--r--src/yuzu/main.cpp30
-rw-r--r--src/yuzu/main.h2
-rw-r--r--src/yuzu_cmd/yuzu.cpp3
193 files changed, 1561 insertions, 570 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6e66dc1df..63dd9febf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -32,6 +32,7 @@ if (MSVC)
# /Zc:externConstexpr - Allow extern constexpr variables to have external linkage, like the standard mandates
# /Zc:inline - Let codegen omit inline functions in object files
# /Zc:throwingNew - Let codegen assume `operator new` (without std::nothrow) will never return null
+ # /GT - Supports fiber safety for data allocated using static thread-local storage
add_compile_options(
/MP
/Zi
@@ -44,6 +45,7 @@ if (MSVC)
/Zc:externConstexpr
/Zc:inline
/Zc:throwingNew
+ /GT
# External headers diagnostics
/experimental:external # Enables the external headers options. This option isn't required in Visual Studio 2019 version 16.10 and later
@@ -69,6 +71,10 @@ if (MSVC)
/we5038 # data member 'member1' will be initialized after data member 'member2'
)
+ if (ARCHITECTURE_x86_64)
+ add_compile_options(/QIntel-jcc-erratum)
+ endif()
+
# /GS- - No stack buffer overflow checks
add_compile_options("$<$<CONFIG:Release>:/GS->")
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index cb5c0f326..23d43a394 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -55,6 +55,7 @@ add_library(common STATIC
dynamic_library.h
error.cpp
error.h
+ expected.h
fiber.cpp
fiber.h
fs/file.cpp
diff --git a/src/common/expected.h b/src/common/expected.h
new file mode 100644
index 000000000..c8d8579c1
--- /dev/null
+++ b/src/common/expected.h
@@ -0,0 +1,987 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+// This is based on the proposed implementation of std::expected (P0323)
+// https://github.com/TartanLlama/expected/blob/master/include/tl/expected.hpp
+
+#pragma once
+
+#include <type_traits>
+#include <utility>
+
+namespace Common {
+
+template <typename T, typename E>
+class Expected;
+
+template <typename E>
+class Unexpected {
+public:
+ Unexpected() = delete;
+
+ constexpr explicit Unexpected(const E& e) : m_val{e} {}
+
+ constexpr explicit Unexpected(E&& e) : m_val{std::move(e)} {}
+
+ constexpr E& value() & {
+ return m_val;
+ }
+
+ constexpr const E& value() const& {
+ return m_val;
+ }
+
+ constexpr E&& value() && {
+ return std::move(m_val);
+ }
+
+ constexpr const E&& value() const&& {
+ return std::move(m_val);
+ }
+
+private:
+ E m_val;
+};
+
+template <typename E>
+constexpr auto operator<=>(const Unexpected<E>& lhs, const Unexpected<E>& rhs) {
+ return lhs.value() <=> rhs.value();
+}
+
+struct unexpect_t {
+ constexpr explicit unexpect_t() = default;
+};
+
+namespace detail {
+
+struct no_init_t {
+ constexpr explicit no_init_t() = default;
+};
+
+/**
+ * This specialization is for when T is not trivially destructible,
+ * so the destructor must be called on destruction of `expected'
+ * Additionally, this requires E to be trivially destructible
+ */
+template <typename T, typename E, bool = std::is_trivially_destructible_v<T>>
+requires std::is_trivially_destructible_v<E>
+struct expected_storage_base {
+ constexpr expected_storage_base() : m_val{T{}}, m_has_val{true} {}
+
+ constexpr expected_storage_base(no_init_t) : m_has_val{false} {}
+
+ template <typename... Args, std::enable_if_t<std::is_constructible_v<T, Args&&...>>* = nullptr>
+ constexpr expected_storage_base(std::in_place_t, Args&&... args)
+ : m_val{std::forward<Args>(args)...}, m_has_val{true} {}
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_constructible_v<T, std::initializer_list<U>&, Args&&...>>* =
+ nullptr>
+ constexpr expected_storage_base(std::in_place_t, std::initializer_list<U> il, Args&&... args)
+ : m_val{il, std::forward<Args>(args)...}, m_has_val{true} {}
+
+ template <typename... Args, std::enable_if_t<std::is_constructible_v<E, Args&&...>>* = nullptr>
+ constexpr explicit expected_storage_base(unexpect_t, Args&&... args)
+ : m_unexpect{std::forward<Args>(args)...}, m_has_val{false} {}
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_constructible_v<E, std::initializer_list<U>&, Args&&...>>* =
+ nullptr>
+ constexpr explicit expected_storage_base(unexpect_t, std::initializer_list<U> il,
+ Args&&... args)
+ : m_unexpect{il, std::forward<Args>(args)...}, m_has_val{false} {}
+
+ ~expected_storage_base() {
+ if (m_has_val) {
+ m_val.~T();
+ }
+ }
+
+ union {
+ T m_val;
+ Unexpected<E> m_unexpect;
+ };
+
+ bool m_has_val;
+};
+
+/**
+ * This specialization is for when T is trivially destructible,
+ * so the destructor of `expected` can be trivial
+ * Additionally, this requires E to be trivially destructible
+ */
+template <typename T, typename E>
+requires std::is_trivially_destructible_v<E>
+struct expected_storage_base<T, E, true> {
+ constexpr expected_storage_base() : m_val{T{}}, m_has_val{true} {}
+
+ constexpr expected_storage_base(no_init_t) : m_has_val{false} {}
+
+ template <typename... Args, std::enable_if_t<std::is_constructible_v<T, Args&&...>>* = nullptr>
+ constexpr expected_storage_base(std::in_place_t, Args&&... args)
+ : m_val{std::forward<Args>(args)...}, m_has_val{true} {}
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_constructible_v<T, std::initializer_list<U>&, Args&&...>>* =
+ nullptr>
+ constexpr expected_storage_base(std::in_place_t, std::initializer_list<U> il, Args&&... args)
+ : m_val{il, std::forward<Args>(args)...}, m_has_val{true} {}
+
+ template <typename... Args, std::enable_if_t<std::is_constructible_v<E, Args&&...>>* = nullptr>
+ constexpr explicit expected_storage_base(unexpect_t, Args&&... args)
+ : m_unexpect{std::forward<Args>(args)...}, m_has_val{false} {}
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_constructible_v<E, std::initializer_list<U>&, Args&&...>>* =
+ nullptr>
+ constexpr explicit expected_storage_base(unexpect_t, std::initializer_list<U> il,
+ Args&&... args)
+ : m_unexpect{il, std::forward<Args>(args)...}, m_has_val{false} {}
+
+ ~expected_storage_base() = default;
+
+ union {
+ T m_val;
+ Unexpected<E> m_unexpect;
+ };
+
+ bool m_has_val;
+};
+
+template <typename T, typename E>
+struct expected_operations_base : expected_storage_base<T, E> {
+ using expected_storage_base<T, E>::expected_storage_base;
+
+ template <typename... Args>
+ void construct(Args&&... args) noexcept {
+ new (std::addressof(this->m_val)) T{std::forward<Args>(args)...};
+ this->m_has_val = true;
+ }
+
+ template <typename Rhs>
+ void construct_with(Rhs&& rhs) noexcept {
+ new (std::addressof(this->m_val)) T{std::forward<Rhs>(rhs).get()};
+ this->m_has_val = true;
+ }
+
+ template <typename... Args>
+ void construct_error(Args&&... args) noexcept {
+ new (std::addressof(this->m_unexpect)) Unexpected<E>{std::forward<Args>(args)...};
+ this->m_has_val = false;
+ }
+
+ void assign(const expected_operations_base& rhs) noexcept {
+ if (!this->m_has_val && rhs.m_has_val) {
+ geterr().~Unexpected<E>();
+ construct(rhs.get());
+ } else {
+ assign_common(rhs);
+ }
+ }
+
+ void assign(expected_operations_base&& rhs) noexcept {
+ if (!this->m_has_val && rhs.m_has_val) {
+ geterr().~Unexpected<E>();
+ construct(std::move(rhs).get());
+ } else {
+ assign_common(rhs);
+ }
+ }
+
+ template <typename Rhs>
+ void assign_common(Rhs&& rhs) {
+ if (this->m_has_val) {
+ if (rhs.m_has_val) {
+ get() = std::forward<Rhs>(rhs).get();
+ } else {
+ destroy_val();
+ construct_error(std::forward<Rhs>(rhs).geterr());
+ }
+ } else {
+ if (!rhs.m_has_val) {
+ geterr() = std::forward<Rhs>(rhs).geterr();
+ }
+ }
+ }
+
+ bool has_value() const {
+ return this->m_has_val;
+ }
+
+ constexpr T& get() & {
+ return this->m_val;
+ }
+
+ constexpr const T& get() const& {
+ return this->m_val;
+ }
+
+ constexpr T&& get() && {
+ return std::move(this->m_val);
+ }
+
+ constexpr const T&& get() const&& {
+ return std::move(this->m_val);
+ }
+
+ constexpr Unexpected<E>& geterr() & {
+ return this->m_unexpect;
+ }
+
+ constexpr const Unexpected<E>& geterr() const& {
+ return this->m_unexpect;
+ }
+
+ constexpr Unexpected<E>&& geterr() && {
+ return std::move(this->m_unexpect);
+ }
+
+ constexpr const Unexpected<E>&& geterr() const&& {
+ return std::move(this->m_unexpect);
+ }
+
+ constexpr void destroy_val() {
+ get().~T();
+ }
+};
+
+/**
+ * This manages conditionally having a trivial copy constructor
+ * This specialization is for when T is trivially copy constructible
+ * Additionally, this requires E to be trivially copy constructible
+ */
+template <typename T, typename E, bool = std::is_trivially_copy_constructible_v<T>>
+requires std::is_trivially_copy_constructible_v<E>
+struct expected_copy_base : expected_operations_base<T, E> {
+ using expected_operations_base<T, E>::expected_operations_base;
+};
+
+/**
+ * This specialization is for when T is not trivially copy constructible
+ * Additionally, this requires E to be trivially copy constructible
+ */
+template <typename T, typename E>
+requires std::is_trivially_copy_constructible_v<E>
+struct expected_copy_base<T, E, false> : expected_operations_base<T, E> {
+ using expected_operations_base<T, E>::expected_operations_base;
+
+ expected_copy_base() = default;
+
+ expected_copy_base(const expected_copy_base& rhs)
+ : expected_operations_base<T, E>{no_init_t{}} {
+ if (rhs.has_value()) {
+ this->construct_with(rhs);
+ } else {
+ this->construct_error(rhs.geterr());
+ }
+ }
+
+ expected_copy_base(expected_copy_base&&) = default;
+
+ expected_copy_base& operator=(const expected_copy_base&) = default;
+
+ expected_copy_base& operator=(expected_copy_base&&) = default;
+};
+
+/**
+ * This manages conditionally having a trivial move constructor
+ * This specialization is for when T is trivially move constructible
+ * Additionally, this requires E to be trivially move constructible
+ */
+template <typename T, typename E, bool = std::is_trivially_move_constructible_v<T>>
+requires std::is_trivially_move_constructible_v<E>
+struct expected_move_base : expected_copy_base<T, E> {
+ using expected_copy_base<T, E>::expected_copy_base;
+};
+
+/**
+ * This specialization is for when T is not trivially move constructible
+ * Additionally, this requires E to be trivially move constructible
+ */
+template <typename T, typename E>
+requires std::is_trivially_move_constructible_v<E>
+struct expected_move_base<T, E, false> : expected_copy_base<T, E> {
+ using expected_copy_base<T, E>::expected_copy_base;
+
+ expected_move_base() = default;
+
+ expected_move_base(const expected_move_base&) = default;
+
+ expected_move_base(expected_move_base&& rhs) noexcept(std::is_nothrow_move_constructible_v<T>)
+ : expected_copy_base<T, E>{no_init_t{}} {
+ if (rhs.has_value()) {
+ this->construct_with(std::move(rhs));
+ } else {
+ this->construct_error(std::move(rhs.geterr()));
+ }
+ }
+
+ expected_move_base& operator=(const expected_move_base&) = default;
+
+ expected_move_base& operator=(expected_move_base&&) = default;
+};
+
+/**
+ * This manages conditionally having a trivial copy assignment operator
+ * This specialization is for when T is trivially copy assignable
+ * Additionally, this requires E to be trivially copy assignable
+ */
+template <typename T, typename E,
+ bool = std::conjunction_v<std::is_trivially_copy_assignable<T>,
+ std::is_trivially_copy_constructible<T>,
+ std::is_trivially_destructible<T>>>
+requires std::conjunction_v<std::is_trivially_copy_assignable<E>,
+ std::is_trivially_copy_constructible<E>,
+ std::is_trivially_destructible<E>>
+struct expected_copy_assign_base : expected_move_base<T, E> {
+ using expected_move_base<T, E>::expected_move_base;
+};
+
+/**
+ * This specialization is for when T is not trivially copy assignable
+ * Additionally, this requires E to be trivially copy assignable
+ */
+template <typename T, typename E>
+requires std::conjunction_v<std::is_trivially_copy_assignable<E>,
+ std::is_trivially_copy_constructible<E>,
+ std::is_trivially_destructible<E>>
+struct expected_copy_assign_base<T, E, false> : expected_move_base<T, E> {
+ using expected_move_base<T, E>::expected_move_base;
+
+ expected_copy_assign_base() = default;
+
+ expected_copy_assign_base(const expected_copy_assign_base&) = default;
+
+ expected_copy_assign_base(expected_copy_assign_base&&) = default;
+
+ expected_copy_assign_base& operator=(const expected_copy_assign_base& rhs) {
+ this->assign(rhs);
+ return *this;
+ }
+
+ expected_copy_assign_base& operator=(expected_copy_assign_base&&) = default;
+};
+
+/**
+ * This manages conditionally having a trivial move assignment operator
+ * This specialization is for when T is trivially move assignable
+ * Additionally, this requires E to be trivially move assignable
+ */
+template <typename T, typename E,
+ bool = std::conjunction_v<std::is_trivially_move_assignable<T>,
+ std::is_trivially_move_constructible<T>,
+ std::is_trivially_destructible<T>>>
+requires std::conjunction_v<std::is_trivially_move_assignable<E>,
+ std::is_trivially_move_constructible<E>,
+ std::is_trivially_destructible<E>>
+struct expected_move_assign_base : expected_copy_assign_base<T, E> {
+ using expected_copy_assign_base<T, E>::expected_copy_assign_base;
+};
+
+/**
+ * This specialization is for when T is not trivially move assignable
+ * Additionally, this requires E to be trivially move assignable
+ */
+template <typename T, typename E>
+requires std::conjunction_v<std::is_trivially_move_assignable<E>,
+ std::is_trivially_move_constructible<E>,
+ std::is_trivially_destructible<E>>
+struct expected_move_assign_base<T, E, false> : expected_copy_assign_base<T, E> {
+ using expected_copy_assign_base<T, E>::expected_copy_assign_base;
+
+ expected_move_assign_base() = default;
+
+ expected_move_assign_base(const expected_move_assign_base&) = default;
+
+ expected_move_assign_base(expected_move_assign_base&&) = default;
+
+ expected_move_assign_base& operator=(const expected_move_assign_base&) = default;
+
+ expected_move_assign_base& operator=(expected_move_assign_base&& rhs) noexcept(
+ std::conjunction_v<std::is_nothrow_move_constructible<T>,
+ std::is_nothrow_move_assignable<T>>) {
+ this->assign(std::move(rhs));
+ return *this;
+ }
+};
+
+/**
+ * expected_delete_ctor_base will conditionally delete copy and move constructors
+ * depending on whether T is copy/move constructible
+ * Additionally, this requires E to be copy/move constructible
+ */
+template <typename T, typename E, bool EnableCopy = std::is_copy_constructible_v<T>,
+ bool EnableMove = std::is_move_constructible_v<T>>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
+struct expected_delete_ctor_base {
+ expected_delete_ctor_base() = default;
+ expected_delete_ctor_base(const expected_delete_ctor_base&) = default;
+ expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = default;
+ expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default;
+ expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default;
+};
+
+template <typename T, typename E>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
+struct expected_delete_ctor_base<T, E, true, false> {
+ expected_delete_ctor_base() = default;
+ expected_delete_ctor_base(const expected_delete_ctor_base&) = default;
+ expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = delete;
+ expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default;
+ expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default;
+};
+
+template <typename T, typename E>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
+struct expected_delete_ctor_base<T, E, false, true> {
+ expected_delete_ctor_base() = default;
+ expected_delete_ctor_base(const expected_delete_ctor_base&) = delete;
+ expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = default;
+ expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default;
+ expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default;
+};
+
+template <typename T, typename E>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>>
+struct expected_delete_ctor_base<T, E, false, false> {
+ expected_delete_ctor_base() = default;
+ expected_delete_ctor_base(const expected_delete_ctor_base&) = delete;
+ expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = delete;
+ expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default;
+ expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default;
+};
+
+/**
+ * expected_delete_assign_base will conditionally delete copy and move assignment operators
+ * depending on whether T is copy/move constructible + assignable
+ * Additionally, this requires E to be copy/move constructible + assignable
+ */
+template <
+ typename T, typename E,
+ bool EnableCopy = std::conjunction_v<std::is_copy_constructible<T>, std::is_copy_assignable<T>>,
+ bool EnableMove = std::conjunction_v<std::is_move_constructible<T>, std::is_move_assignable<T>>>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
+ std::is_copy_assignable<E>, std::is_move_assignable<E>>
+struct expected_delete_assign_base {
+ expected_delete_assign_base() = default;
+ expected_delete_assign_base(const expected_delete_assign_base&) = default;
+ expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default;
+ expected_delete_assign_base& operator=(const expected_delete_assign_base&) = default;
+ expected_delete_assign_base& operator=(expected_delete_assign_base&&) noexcept = default;
+};
+
+template <typename T, typename E>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
+ std::is_copy_assignable<E>, std::is_move_assignable<E>>
+struct expected_delete_assign_base<T, E, true, false> {
+ expected_delete_assign_base() = default;
+ expected_delete_assign_base(const expected_delete_assign_base&) = default;
+ expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default;
+ expected_delete_assign_base& operator=(const expected_delete_assign_base&) = default;
+ expected_delete_assign_base& operator=(expected_delete_assign_base&&) noexcept = delete;
+};
+
+template <typename T, typename E>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
+ std::is_copy_assignable<E>, std::is_move_assignable<E>>
+struct expected_delete_assign_base<T, E, false, true> {
+ expected_delete_assign_base() = default;
+ expected_delete_assign_base(const expected_delete_assign_base&) = default;
+ expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default;
+ expected_delete_assign_base& operator=(const expected_delete_assign_base&) = delete;
+ expected_delete_assign_base& operator=(expected_delete_assign_base&&) noexcept = default;
+};
+
+template <typename T, typename E>
+requires std::conjunction_v<std::is_copy_constructible<E>, std::is_move_constructible<E>,
+ std::is_copy_assignable<E>, std::is_move_assignable<E>>
+struct expected_delete_assign_base<T, E, false, false> {
+ expected_delete_assign_base() = default;
+ expected_delete_assign_base(const expected_delete_assign_base&) = default;
+ expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default;
+ expected_delete_assign_base& operator=(const expected_delete_assign_base&) = delete;
+ expected_delete_assign_base& operator=(expected_delete_assign_base&&) noexcept = delete;
+};
+
+/**
+ * This is needed to be able to construct the expected_default_ctor_base which follows,
+ * while still conditionally deleting the default constructor.
+ */
+struct default_constructor_tag {
+ constexpr explicit default_constructor_tag() = default;
+};
+
+/**
+ * expected_default_ctor_base will ensure that expected
+ * has a deleted default constructor if T is not default constructible
+ * This specialization is for when T is default constructible
+ */
+template <typename T, typename E, bool Enable = std::is_default_constructible_v<T>>
+struct expected_default_ctor_base {
+ constexpr expected_default_ctor_base() noexcept = default;
+ constexpr expected_default_ctor_base(expected_default_ctor_base const&) noexcept = default;
+ constexpr expected_default_ctor_base(expected_default_ctor_base&&) noexcept = default;
+ expected_default_ctor_base& operator=(expected_default_ctor_base const&) noexcept = default;
+ expected_default_ctor_base& operator=(expected_default_ctor_base&&) noexcept = default;
+
+ constexpr explicit expected_default_ctor_base(default_constructor_tag) {}
+};
+
+template <typename T, typename E>
+struct expected_default_ctor_base<T, E, false> {
+ constexpr expected_default_ctor_base() noexcept = delete;
+ constexpr expected_default_ctor_base(expected_default_ctor_base const&) noexcept = default;
+ constexpr expected_default_ctor_base(expected_default_ctor_base&&) noexcept = default;
+ expected_default_ctor_base& operator=(expected_default_ctor_base const&) noexcept = default;
+ expected_default_ctor_base& operator=(expected_default_ctor_base&&) noexcept = default;
+
+ constexpr explicit expected_default_ctor_base(default_constructor_tag) {}
+};
+
+template <typename T, typename E, typename U>
+using expected_enable_forward_value =
+ std::enable_if_t<std::is_constructible_v<T, U&&> &&
+ !std::is_same_v<std::remove_cvref_t<U>, std::in_place_t> &&
+ !std::is_same_v<Expected<T, E>, std::remove_cvref_t<U>> &&
+ !std::is_same_v<Unexpected<E>, std::remove_cvref_t<U>>>;
+
+template <typename T, typename E, typename U, typename G, typename UR, typename GR>
+using expected_enable_from_other = std::enable_if_t<
+ std::is_constructible_v<T, UR> && std::is_constructible_v<E, GR> &&
+ !std::is_constructible_v<T, Expected<U, G>&> && !std::is_constructible_v<T, Expected<U, G>&&> &&
+ !std::is_constructible_v<T, const Expected<U, G>&> &&
+ !std::is_constructible_v<T, const Expected<U, G>&&> &&
+ !std::is_convertible_v<Expected<U, G>&, T> && !std::is_convertible_v<Expected<U, G>&&, T> &&
+ !std::is_convertible_v<const Expected<U, G>&, T> &&
+ !std::is_convertible_v<const Expected<U, G>&&, T>>;
+
+} // namespace detail
+
+template <typename T, typename E>
+class Expected : private detail::expected_move_assign_base<T, E>,
+ private detail::expected_delete_ctor_base<T, E>,
+ private detail::expected_delete_assign_base<T, E>,
+ private detail::expected_default_ctor_base<T, E> {
+public:
+ using value_type = T;
+ using error_type = E;
+ using unexpected_type = Unexpected<E>;
+
+ constexpr Expected() = default;
+ constexpr Expected(const Expected&) = default;
+ constexpr Expected(Expected&&) = default;
+ Expected& operator=(const Expected&) = default;
+ Expected& operator=(Expected&&) = default;
+
+ template <typename... Args, std::enable_if_t<std::is_constructible_v<T, Args&&...>>* = nullptr>
+ constexpr Expected(std::in_place_t, Args&&... args)
+ : impl_base{std::in_place, std::forward<Args>(args)...},
+ ctor_base{detail::default_constructor_tag{}} {}
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_constructible_v<T, std::initializer_list<U>&, Args&&...>>* =
+ nullptr>
+ constexpr Expected(std::in_place_t, std::initializer_list<U> il, Args&&... args)
+ : impl_base{std::in_place, il, std::forward<Args>(args)...},
+ ctor_base{detail::default_constructor_tag{}} {}
+
+ template <typename G = E, std::enable_if_t<std::is_constructible_v<E, const G&>>* = nullptr,
+ std::enable_if_t<!std::is_convertible_v<const G&, E>>* = nullptr>
+ constexpr explicit Expected(const Unexpected<G>& e)
+ : impl_base{unexpect_t{}, e.value()}, ctor_base{detail::default_constructor_tag{}} {}
+
+ template <typename G = E, std::enable_if_t<std::is_constructible_v<E, const G&>>* = nullptr,
+ std::enable_if_t<std::is_convertible_v<const G&, E>>* = nullptr>
+ constexpr Expected(Unexpected<G> const& e)
+ : impl_base{unexpect_t{}, e.value()}, ctor_base{detail::default_constructor_tag{}} {}
+
+ template <typename G = E, std::enable_if_t<std::is_constructible_v<E, G&&>>* = nullptr,
+ std::enable_if_t<!std::is_convertible_v<G&&, E>>* = nullptr>
+ constexpr explicit Expected(Unexpected<G>&& e) noexcept(std::is_nothrow_constructible_v<E, G&&>)
+ : impl_base{unexpect_t{}, std::move(e.value())}, ctor_base{
+ detail::default_constructor_tag{}} {}
+
+ template <typename G = E, std::enable_if_t<std::is_constructible_v<E, G&&>>* = nullptr,
+ std::enable_if_t<std::is_convertible_v<G&&, E>>* = nullptr>
+ constexpr Expected(Unexpected<G>&& e) noexcept(std::is_nothrow_constructible_v<E, G&&>)
+ : impl_base{unexpect_t{}, std::move(e.value())}, ctor_base{
+ detail::default_constructor_tag{}} {}
+
+ template <typename... Args, std::enable_if_t<std::is_constructible_v<E, Args&&...>>* = nullptr>
+ constexpr explicit Expected(unexpect_t, Args&&... args)
+ : impl_base{unexpect_t{}, std::forward<Args>(args)...},
+ ctor_base{detail::default_constructor_tag{}} {}
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_constructible_v<E, std::initializer_list<U>&, Args&&...>>* =
+ nullptr>
+ constexpr explicit Expected(unexpect_t, std::initializer_list<U> il, Args&&... args)
+ : impl_base{unexpect_t{}, il, std::forward<Args>(args)...},
+ ctor_base{detail::default_constructor_tag{}} {}
+
+ template <typename U, typename G,
+ std::enable_if_t<!(std::is_convertible_v<U const&, T> &&
+ std::is_convertible_v<G const&, E>)>* = nullptr,
+ detail::expected_enable_from_other<T, E, U, G, const U&, const G&>* = nullptr>
+ constexpr explicit Expected(const Expected<U, G>& rhs)
+ : ctor_base{detail::default_constructor_tag{}} {
+ if (rhs.has_value()) {
+ this->construct(*rhs);
+ } else {
+ this->construct_error(rhs.error());
+ }
+ }
+
+ template <typename U, typename G,
+ std::enable_if_t<(std::is_convertible_v<U const&, T> &&
+ std::is_convertible_v<G const&, E>)>* = nullptr,
+ detail::expected_enable_from_other<T, E, U, G, const U&, const G&>* = nullptr>
+ constexpr Expected(const Expected<U, G>& rhs) : ctor_base{detail::default_constructor_tag{}} {
+ if (rhs.has_value()) {
+ this->construct(*rhs);
+ } else {
+ this->construct_error(rhs.error());
+ }
+ }
+
+ template <typename U, typename G,
+ std::enable_if_t<!(std::is_convertible_v<U&&, T> && std::is_convertible_v<G&&, E>)>* =
+ nullptr,
+ detail::expected_enable_from_other<T, E, U, G, U&&, G&&>* = nullptr>
+ constexpr explicit Expected(Expected<U, G>&& rhs)
+ : ctor_base{detail::default_constructor_tag{}} {
+ if (rhs.has_value()) {
+ this->construct(std::move(*rhs));
+ } else {
+ this->construct_error(std::move(rhs.error()));
+ }
+ }
+
+ template <typename U, typename G,
+ std::enable_if_t<(std::is_convertible_v<U&&, T> && std::is_convertible_v<G&&, E>)>* =
+ nullptr,
+ detail::expected_enable_from_other<T, E, U, G, U&&, G&&>* = nullptr>
+ constexpr Expected(Expected<U, G>&& rhs) : ctor_base{detail::default_constructor_tag{}} {
+ if (rhs.has_value()) {
+ this->construct(std::move(*rhs));
+ } else {
+ this->construct_error(std::move(rhs.error()));
+ }
+ }
+
+ template <typename U = T, std::enable_if_t<!std::is_convertible_v<U&&, T>>* = nullptr,
+ detail::expected_enable_forward_value<T, E, U>* = nullptr>
+ constexpr explicit Expected(U&& v) : Expected{std::in_place, std::forward<U>(v)} {}
+
+ template <typename U = T, std::enable_if_t<std::is_convertible_v<U&&, T>>* = nullptr,
+ detail::expected_enable_forward_value<T, E, U>* = nullptr>
+ constexpr Expected(U&& v) : Expected{std::in_place, std::forward<U>(v)} {}
+
+ template <typename U = T, typename G = T,
+ std::enable_if_t<std::is_nothrow_constructible_v<T, U&&>>* = nullptr,
+ std::enable_if_t<(
+ !std::is_same_v<Expected<T, E>, std::remove_cvref_t<U>> &&
+ !std::conjunction_v<std::is_scalar<T>, std::is_same<T, std::remove_cvref_t<U>>> &&
+ std::is_constructible_v<T, U> && std::is_assignable_v<G&, U> &&
+ std::is_nothrow_move_constructible_v<E>)>* = nullptr>
+ Expected& operator=(U&& v) {
+ if (has_value()) {
+ val() = std::forward<U>(v);
+ } else {
+ err().~Unexpected<E>();
+ new (valptr()) T{std::forward<U>(v)};
+ this->m_has_val = true;
+ }
+
+ return *this;
+ }
+
+ template <typename U = T, typename G = T,
+ std::enable_if_t<!std::is_nothrow_constructible_v<T, U&&>>* = nullptr,
+ std::enable_if_t<(
+ !std::is_same_v<Expected<T, E>, std::remove_cvref_t<U>> &&
+ !std::conjunction_v<std::is_scalar<T>, std::is_same<T, std::remove_cvref_t<U>>> &&
+ std::is_constructible_v<T, U> && std::is_assignable_v<G&, U> &&
+ std::is_nothrow_move_constructible_v<E>)>* = nullptr>
+ Expected& operator=(U&& v) {
+ if (has_value()) {
+ val() = std::forward<U>(v);
+ } else {
+ auto tmp = std::move(err());
+ err().~Unexpected<E>();
+ new (valptr()) T{std::forward<U>(v)};
+ this->m_has_val = true;
+ }
+
+ return *this;
+ }
+
+ template <typename G = E, std::enable_if_t<std::is_nothrow_copy_constructible_v<G> &&
+ std::is_assignable_v<G&, G>>* = nullptr>
+ Expected& operator=(const Unexpected<G>& rhs) {
+ if (!has_value()) {
+ err() = rhs;
+ } else {
+ this->destroy_val();
+ new (errptr()) Unexpected<E>{rhs};
+ this->m_has_val = false;
+ }
+
+ return *this;
+ }
+
+ template <typename G = E, std::enable_if_t<std::is_nothrow_move_constructible_v<G> &&
+ std::is_move_assignable_v<G>>* = nullptr>
+ Expected& operator=(Unexpected<G>&& rhs) noexcept {
+ if (!has_value()) {
+ err() = std::move(rhs);
+ } else {
+ this->destroy_val();
+ new (errptr()) Unexpected<E>{std::move(rhs)};
+ this->m_has_val = false;
+ }
+
+ return *this;
+ }
+
+ template <typename... Args,
+ std::enable_if_t<std::is_nothrow_constructible_v<T, Args&&...>>* = nullptr>
+ void emplace(Args&&... args) {
+ if (has_value()) {
+ val() = T{std::forward<Args>(args)...};
+ } else {
+ err().~Unexpected<E>();
+ new (valptr()) T{std::forward<Args>(args)...};
+ this->m_has_val = true;
+ }
+ }
+
+ template <typename... Args,
+ std::enable_if_t<!std::is_nothrow_constructible_v<T, Args&&...>>* = nullptr>
+ void emplace(Args&&... args) {
+ if (has_value()) {
+ val() = T{std::forward<Args>(args)...};
+ } else {
+ auto tmp = std::move(err());
+ err().~Unexpected<E>();
+ new (valptr()) T{std::forward<Args>(args)...};
+ this->m_has_val = true;
+ }
+ }
+
+ template <typename U, typename... Args,
+ std::enable_if_t<std::is_nothrow_constructible_v<T, std::initializer_list<U>&,
+ Args&&...>>* = nullptr>
+ void emplace(std::initializer_list<U> il, Args&&... args) {
+ if (has_value()) {
+ T t{il, std::forward<Args>(args)...};
+ val() = std::move(t);
+ } else {
+ err().~Unexpected<E>();
+ new (valptr()) T{il, std::forward<Args>(args)...};
+ this->m_has_val = true;
+ }
+ }
+
+ template <typename U, typename... Args,
+ std::enable_if_t<!std::is_nothrow_constructible_v<T, std::initializer_list<U>&,
+ Args&&...>>* = nullptr>
+ void emplace(std::initializer_list<U> il, Args&&... args) {
+ if (has_value()) {
+ T t{il, std::forward<Args>(args)...};
+ val() = std::move(t);
+ } else {
+ auto tmp = std::move(err());
+ err().~Unexpected<E>();
+ new (valptr()) T{il, std::forward<Args>(args)...};
+ this->m_has_val = true;
+ }
+ }
+
+ constexpr T* operator->() {
+ return valptr();
+ }
+
+ constexpr const T* operator->() const {
+ return valptr();
+ }
+
+ template <typename U = T>
+ constexpr U& operator*() & {
+ return val();
+ }
+
+ template <typename U = T>
+ constexpr const U& operator*() const& {
+ return val();
+ }
+
+ template <typename U = T>
+ constexpr U&& operator*() && {
+ return std::move(val());
+ }
+
+ template <typename U = T>
+ constexpr const U&& operator*() const&& {
+ return std::move(val());
+ }
+
+ constexpr bool has_value() const noexcept {
+ return this->m_has_val;
+ }
+
+ constexpr explicit operator bool() const noexcept {
+ return this->m_has_val;
+ }
+
+ template <typename U = T>
+ constexpr U& value() & {
+ return val();
+ }
+
+ template <typename U = T>
+ constexpr const U& value() const& {
+ return val();
+ }
+
+ template <typename U = T>
+ constexpr U&& value() && {
+ return std::move(val());
+ }
+
+ template <typename U = T>
+ constexpr const U&& value() const&& {
+ return std::move(val());
+ }
+
+ constexpr E& error() & {
+ return err().value();
+ }
+
+ constexpr const E& error() const& {
+ return err().value();
+ }
+
+ constexpr E&& error() && {
+ return std::move(err().value());
+ }
+
+ constexpr const E&& error() const&& {
+ return std::move(err().value());
+ }
+
+ template <typename U>
+ constexpr T value_or(U&& v) const& {
+ static_assert(std::is_copy_constructible_v<T> && std::is_convertible_v<U&&, T>,
+ "T must be copy-constructible and convertible from U&&");
+ return bool(*this) ? **this : static_cast<T>(std::forward<U>(v));
+ }
+
+ template <typename U>
+ constexpr T value_or(U&& v) && {
+ static_assert(std::is_move_constructible_v<T> && std::is_convertible_v<U&&, T>,
+ "T must be move-constructible and convertible from U&&");
+ return bool(*this) ? std::move(**this) : static_cast<T>(std::forward<U>(v));
+ }
+
+private:
+ static_assert(!std::is_reference_v<T>, "T must not be a reference");
+ static_assert(!std::is_same_v<T, std::remove_cv_t<std::in_place_t>>,
+ "T must not be std::in_place_t");
+ static_assert(!std::is_same_v<T, std::remove_cv_t<unexpect_t>>, "T must not be unexpect_t");
+ static_assert(!std::is_same_v<T, std::remove_cv_t<Unexpected<E>>>,
+ "T must not be Unexpected<E>");
+ static_assert(!std::is_reference_v<E>, "E must not be a reference");
+
+ T* valptr() {
+ return std::addressof(this->m_val);
+ }
+
+ const T* valptr() const {
+ return std::addressof(this->m_val);
+ }
+
+ Unexpected<E>* errptr() {
+ return std::addressof(this->m_unexpect);
+ }
+
+ const Unexpected<E>* errptr() const {
+ return std::addressof(this->m_unexpect);
+ }
+
+ template <typename U = T>
+ constexpr U& val() {
+ return this->m_val;
+ }
+
+ template <typename U = T>
+ constexpr const U& val() const {
+ return this->m_val;
+ }
+
+ constexpr Unexpected<E>& err() {
+ return this->m_unexpect;
+ }
+
+ constexpr const Unexpected<E>& err() const {
+ return this->m_unexpect;
+ }
+
+ using impl_base = detail::expected_move_assign_base<T, E>;
+ using ctor_base = detail::expected_default_ctor_base<T, E>;
+};
+
+template <typename T, typename E, typename U, typename F>
+constexpr bool operator==(const Expected<T, E>& lhs, const Expected<U, F>& rhs) {
+ return (lhs.has_value() != rhs.has_value())
+ ? false
+ : (!lhs.has_value() ? lhs.error() == rhs.error() : *lhs == *rhs);
+}
+
+template <typename T, typename E, typename U, typename F>
+constexpr bool operator!=(const Expected<T, E>& lhs, const Expected<U, F>& rhs) {
+ return !operator==(lhs, rhs);
+}
+
+template <typename T, typename E, typename U>
+constexpr bool operator==(const Expected<T, E>& x, const U& v) {
+ return x.has_value() ? *x == v : false;
+}
+
+template <typename T, typename E, typename U>
+constexpr bool operator==(const U& v, const Expected<T, E>& x) {
+ return x.has_value() ? *x == v : false;
+}
+
+template <typename T, typename E, typename U>
+constexpr bool operator!=(const Expected<T, E>& x, const U& v) {
+ return !operator==(x, v);
+}
+
+template <typename T, typename E, typename U>
+constexpr bool operator!=(const U& v, const Expected<T, E>& x) {
+ return !operator==(v, x);
+}
+
+template <typename T, typename E>
+constexpr bool operator==(const Expected<T, E>& x, const Unexpected<E>& e) {
+ return x.has_value() ? false : x.error() == e.value();
+}
+
+template <typename T, typename E>
+constexpr bool operator==(const Unexpected<E>& e, const Expected<T, E>& x) {
+ return x.has_value() ? false : x.error() == e.value();
+}
+
+template <typename T, typename E>
+constexpr bool operator!=(const Expected<T, E>& x, const Unexpected<E>& e) {
+ return !operator==(x, e);
+}
+
+template <typename T, typename E>
+constexpr bool operator!=(const Unexpected<E>& e, const Expected<T, E>& x) {
+ return !operator==(e, x);
+}
+
+} // namespace Common
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 0e85a9c1d..c51c05b28 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -6,6 +6,7 @@
#include <chrono>
#include <climits>
#include <exception>
+#include <stop_token>
#include <thread>
#include <vector>
@@ -186,6 +187,10 @@ public:
initialization_in_progress_suppress_logging = false;
}
+ static void Start() {
+ instance->StartBackendThread();
+ }
+
Impl(const Impl&) = delete;
Impl& operator=(const Impl&) = delete;
@@ -201,7 +206,7 @@ public:
}
void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num,
- const char* function, std::string message) {
+ const char* function, std::string&& message) {
if (!filter.CheckMessage(log_class, log_level))
return;
const Entry& entry =
@@ -211,40 +216,41 @@ public:
private:
Impl(const std::filesystem::path& file_backend_filename, const Filter& filter_)
- : filter{filter_}, file_backend{file_backend_filename}, backend_thread{std::thread([this] {
- Common::SetCurrentThreadName("yuzu:Log");
- Entry entry;
- const auto write_logs = [this, &entry]() {
- ForEachBackend([&entry](Backend& backend) { backend.Write(entry); });
- };
- while (true) {
- entry = message_queue.PopWait();
- if (entry.final_entry) {
- break;
- }
- write_logs();
- }
- // Drain the logging queue. Only writes out up to MAX_LOGS_TO_WRITE to prevent a
- // case where a system is repeatedly spamming logs even on close.
- int max_logs_to_write = filter.IsDebug() ? INT_MAX : 100;
- while (max_logs_to_write-- && message_queue.Pop(entry)) {
- write_logs();
- }
- })} {}
+ : filter{filter_}, file_backend{file_backend_filename} {}
~Impl() {
StopBackendThread();
}
+ void StartBackendThread() {
+ backend_thread = std::thread([this] {
+ Common::SetCurrentThreadName("yuzu:Log");
+ Entry entry;
+ const auto write_logs = [this, &entry]() {
+ ForEachBackend([&entry](Backend& backend) { backend.Write(entry); });
+ };
+ while (!stop.stop_requested()) {
+ entry = message_queue.PopWait(stop.get_token());
+ if (entry.filename != nullptr) {
+ write_logs();
+ }
+ }
+ // Drain the logging queue. Only writes out up to MAX_LOGS_TO_WRITE to prevent a
+ // case where a system is repeatedly spamming logs even on close.
+ int max_logs_to_write = filter.IsDebug() ? INT_MAX : 100;
+ while (max_logs_to_write-- && message_queue.Pop(entry)) {
+ write_logs();
+ }
+ });
+ }
+
void StopBackendThread() {
- Entry stop_entry{};
- stop_entry.final_entry = true;
- message_queue.Push(stop_entry);
+ stop.request_stop();
backend_thread.join();
}
Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
- const char* function, std::string message) const {
+ const char* function, std::string&& message) const {
using std::chrono::duration_cast;
using std::chrono::microseconds;
using std::chrono::steady_clock;
@@ -257,7 +263,6 @@ private:
.line_num = line_nr,
.function = function,
.message = std::move(message),
- .final_entry = false,
};
}
@@ -278,8 +283,9 @@ private:
ColorConsoleBackend color_console_backend{};
FileBackend file_backend;
+ std::stop_source stop;
std::thread backend_thread;
- MPSCQueue<Entry> message_queue{};
+ MPSCQueue<Entry, true> message_queue{};
std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()};
};
} // namespace
@@ -288,6 +294,10 @@ void Initialize() {
Impl::Initialize();
}
+void Start() {
+ Impl::Start();
+}
+
void DisableLoggingInTests() {
initialization_in_progress_suppress_logging = true;
}
diff --git a/src/common/logging/backend.h b/src/common/logging/backend.h
index cb7839ee9..bf785f402 100644
--- a/src/common/logging/backend.h
+++ b/src/common/logging/backend.h
@@ -14,6 +14,8 @@ class Filter;
/// Initializes the logging system. This should be the first thing called in main.
void Initialize();
+void Start();
+
void DisableLoggingInTests();
/**
diff --git a/src/common/logging/log_entry.h b/src/common/logging/log_entry.h
index dd6f44841..b28570071 100644
--- a/src/common/logging/log_entry.h
+++ b/src/common/logging/log_entry.h
@@ -22,7 +22,6 @@ struct Entry {
unsigned int line_num = 0;
std::string function;
std::string message;
- bool final_entry = false;
};
} // namespace Common::Log
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h
index 063605b46..5d47b600d 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.h
@@ -9,7 +9,6 @@
#include <dynarmic/interface/A32/a32.h>
#include <dynarmic/interface/A64/a64.h>
-#include <dynarmic/interface/exclusive_monitor.h>
#include "common/common_types.h"
#include "common/hash.h"
#include "core/arm/arm_interface.h"
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 4fd15f111..4e73cc03a 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -18,7 +18,6 @@
#include "core/core_timing.h"
#include "core/hardware_properties.h"
#include "core/hle/kernel/k_process.h"
-#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/svc.h"
#include "core/memory.h"
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp
index ebd506121..a043e6735 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp
@@ -8,7 +8,6 @@
#include "core/arm/dynarmic/arm_dynarmic_cp15.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
using Callback = Dynarmic::A32::Coprocessor::Callback;
using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.h b/src/core/arm/dynarmic/arm_dynarmic_cp15.h
index 7c7ede79e..f271b2070 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_cp15.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.h
@@ -4,7 +4,6 @@
#pragma once
-#include <memory>
#include <optional>
#include <dynarmic/interface/A32/coprocessor.h>
diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp b/src/core/arm/dynarmic/arm_exclusive_monitor.cpp
index 9426a3edf..397d054a8 100644
--- a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp
+++ b/src/core/arm/dynarmic/arm_exclusive_monitor.cpp
@@ -2,8 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <cinttypes>
-#include <memory>
#include "core/arm/dynarmic/arm_exclusive_monitor.h"
#include "core/memory.h"
diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.h b/src/core/arm/dynarmic/arm_exclusive_monitor.h
index 73d41f223..265c4ecef 100644
--- a/src/core/arm/dynarmic/arm_exclusive_monitor.h
+++ b/src/core/arm/dynarmic/arm_exclusive_monitor.h
@@ -4,7 +4,6 @@
#pragma once
-#include <memory>
#include <unordered_map>
#include <dynarmic/interface/exclusive_monitor.h>
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 3c75f42ae..07448fd29 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -19,20 +19,16 @@
#include "core/cpu_manager.h"
#include "core/device_memory.h"
#include "core/file_sys/bis_factory.h"
-#include "core/file_sys/card_image.h"
#include "core/file_sys/mode.h"
#include "core/file_sys/patch_manager.h"
#include "core/file_sys/registered_cache.h"
#include "core/file_sys/romfs_factory.h"
#include "core/file_sys/savedata_factory.h"
-#include "core/file_sys/sdmc_factory.h"
#include "core/file_sys/vfs_concat.h"
#include "core/file_sys/vfs_real.h"
#include "core/hardware_interrupt_manager.h"
-#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_scheduler.h"
-#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/physical_core.h"
#include "core/hle/service/am/applets/applets.h"
@@ -83,12 +79,6 @@ FileSys::StorageId GetStorageIdForFrontendSlot(
}
}
-void KProcessDeleter(Kernel::KProcess* process) {
- process->Destroy();
-}
-
-using KProcessPtr = std::unique_ptr<Kernel::KProcess, decltype(&KProcessDeleter)>;
-
} // Anonymous namespace
FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
@@ -261,11 +251,10 @@ struct System::Impl {
}
telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider);
- main_process = KProcessPtr{Kernel::KProcess::Create(system.Kernel()), KProcessDeleter};
- ASSERT(Kernel::KProcess::Initialize(main_process.get(), system, "main",
+ auto main_process = Kernel::KProcess::Create(system.Kernel());
+ ASSERT(Kernel::KProcess::Initialize(main_process, system, "main",
Kernel::KProcess::ProcessType::Userland)
.IsSuccess());
- main_process->Open();
const auto [load_result, load_parameters] = app_loader->Load(*main_process, system);
if (load_result != Loader::ResultStatus::Success) {
LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", load_result);
@@ -275,7 +264,7 @@ struct System::Impl {
static_cast<u32>(SystemResultStatus::ErrorLoader) + static_cast<u32>(load_result));
}
AddGlueRegistrationForProcess(*app_loader, *main_process);
- kernel.MakeCurrentProcess(main_process.get());
+ kernel.MakeCurrentProcess(main_process);
kernel.InitializeCores();
// Initialize cheat engine
@@ -335,13 +324,11 @@ struct System::Impl {
time_manager.Shutdown();
core_timing.Shutdown();
app_loader.reset();
- perf_stats.reset();
gpu_core.reset();
+ perf_stats.reset();
kernel.Shutdown();
memory.Reset();
applet_manager.ClearAll();
- // TODO: The main process should be freed based on KAutoObject ref counting.
- main_process.reset();
LOG_DEBUG(Core, "Shutdown OK");
}
@@ -362,7 +349,7 @@ struct System::Impl {
}
Service::Glue::ApplicationLaunchProperty launch{};
- launch.title_id = process.GetTitleID();
+ launch.title_id = process.GetProgramID();
FileSys::PatchManager pm{launch.title_id, fs_controller, *content_provider};
launch.version = pm.GetGameVersion().value_or(0);
@@ -403,7 +390,6 @@ struct System::Impl {
std::unique_ptr<Tegra::GPU> gpu_core;
std::unique_ptr<Hardware::InterruptManager> interrupt_manager;
std::unique_ptr<Core::DeviceMemory> device_memory;
- KProcessPtr main_process{nullptr, KProcessDeleter};
Core::Memory::Memory memory;
CpuManager cpu_manager;
std::atomic_bool is_powered_on{};
@@ -653,6 +639,10 @@ const Core::SpeedLimiter& System::SpeedLimiter() const {
return impl->speed_limiter;
}
+u64 System::GetCurrentProcessProgramID() const {
+ return impl->kernel.CurrentProcess()->GetProgramID();
+}
+
Loader::ResultStatus System::GetGameName(std::string& out) const {
return impl->GetGameName(out);
}
diff --git a/src/core/core.h b/src/core/core.h
index 1cfe1bba6..01bc0a2c7 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -297,6 +297,8 @@ public:
/// Provides a constant reference to the speed limiter
[[nodiscard]] const Core::SpeedLimiter& SpeedLimiter() const;
+ [[nodiscard]] u64 GetCurrentProcessProgramID() const;
+
/// Gets the name of the current game
[[nodiscard]] Loader::ResultStatus GetGameName(std::string& out) const;
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index b64caacda..888828fd0 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -8,7 +8,6 @@
#include <chrono>
#include <functional>
#include <memory>
-#include <mutex>
#include <optional>
#include <string>
#include <thread>
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index 77efcabf0..5d43c6e5d 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -6,7 +6,6 @@
#include "common/microprofile.h"
#include "common/scope_exit.h"
#include "common/thread.h"
-#include "core/arm/exclusive_monitor.h"
#include "core/core.h"
#include "core/core_timing.h"
#include "core/cpu_manager.h"
diff --git a/src/core/crypto/ctr_encryption_layer.cpp b/src/core/crypto/ctr_encryption_layer.cpp
index 1231da8e3..3a2af4f50 100644
--- a/src/core/crypto/ctr_encryption_layer.cpp
+++ b/src/core/crypto/ctr_encryption_layer.cpp
@@ -4,7 +4,6 @@
#include <algorithm>
#include <cstring>
-#include "common/assert.h"
#include "core/crypto/ctr_encryption_layer.h"
namespace Core::Crypto {
diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp
index a98daed89..9244907b5 100644
--- a/src/core/crypto/key_manager.cpp
+++ b/src/core/crypto/key_manager.cpp
@@ -10,14 +10,12 @@
#include <locale>
#include <map>
#include <sstream>
-#include <string_view>
#include <tuple>
#include <vector>
#include <mbedtls/bignum.h>
#include <mbedtls/cipher.h>
#include <mbedtls/cmac.h>
#include <mbedtls/sha256.h>
-#include "common/common_funcs.h"
#include "common/fs/file.h"
#include "common/fs/fs.h"
#include "common/fs/path_util.h"
@@ -30,7 +28,6 @@
#include "core/crypto/partition_data_manager.h"
#include "core/file_sys/content_archive.h"
#include "core/file_sys/nca_metadata.h"
-#include "core/file_sys/partition_filesystem.h"
#include "core/file_sys/registered_cache.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/loader/loader.h"
diff --git a/src/core/crypto/key_manager.h b/src/core/crypto/key_manager.h
index e771625e1..ac1eb8962 100644
--- a/src/core/crypto/key_manager.h
+++ b/src/core/crypto/key_manager.h
@@ -15,7 +15,6 @@
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/crypto/partition_data_manager.h"
-#include "core/file_sys/vfs_types.h"
namespace Common::FS {
class IOFile;
diff --git a/src/core/crypto/partition_data_manager.cpp b/src/core/crypto/partition_data_manager.cpp
index 5f1c86a09..d18252a54 100644
--- a/src/core/crypto/partition_data_manager.cpp
+++ b/src/core/crypto/partition_data_manager.cpp
@@ -12,7 +12,6 @@
#include <cctype>
#include <cstring>
#include <mbedtls/sha256.h>
-#include "common/assert.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "common/hex_util.h"
diff --git a/src/core/crypto/xts_encryption_layer.cpp b/src/core/crypto/xts_encryption_layer.cpp
index 8f0ba4ee7..c2b7ea309 100644
--- a/src/core/crypto/xts_encryption_layer.cpp
+++ b/src/core/crypto/xts_encryption_layer.cpp
@@ -4,7 +4,6 @@
#include <algorithm>
#include <cstring>
-#include "common/assert.h"
#include "core/crypto/xts_encryption_layer.h"
namespace Core::Crypto {
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp
index 755d3303e..c6300be59 100644
--- a/src/core/file_sys/card_image.cpp
+++ b/src/core/file_sys/card_image.cpp
@@ -14,7 +14,6 @@
#include "core/file_sys/nca_metadata.h"
#include "core/file_sys/partition_filesystem.h"
#include "core/file_sys/submission_package.h"
-#include "core/file_sys/vfs_concat.h"
#include "core/file_sys/vfs_offset.h"
#include "core/file_sys/vfs_vector.h"
#include "core/loader/loader.h"
diff --git a/src/core/file_sys/control_metadata.cpp b/src/core/file_sys/control_metadata.cpp
index f66759815..05936f3c3 100644
--- a/src/core/file_sys/control_metadata.cpp
+++ b/src/core/file_sys/control_metadata.cpp
@@ -9,7 +9,7 @@
namespace FileSys {
-const std::array<const char*, 15> LANGUAGE_NAMES{{
+const std::array<const char*, 16> LANGUAGE_NAMES{{
"AmericanEnglish",
"BritishEnglish",
"Japanese",
@@ -25,6 +25,7 @@ const std::array<const char*, 15> LANGUAGE_NAMES{{
"Korean",
"Taiwanese",
"Chinese",
+ "BrazilianPortuguese",
}};
std::string LanguageEntry::GetApplicationName() const {
diff --git a/src/core/file_sys/control_metadata.h b/src/core/file_sys/control_metadata.h
index dd9837cf5..3e0b45630 100644
--- a/src/core/file_sys/control_metadata.h
+++ b/src/core/file_sys/control_metadata.h
@@ -5,7 +5,6 @@
#pragma once
#include <array>
-#include <memory>
#include <string>
#include "common/common_funcs.h"
#include "common/common_types.h"
@@ -88,11 +87,12 @@ enum class Language : u8 {
Korean = 12,
Taiwanese = 13,
Chinese = 14,
+ BrazilianPortuguese = 15,
Default = 255,
};
-extern const std::array<const char*, 15> LANGUAGE_NAMES;
+extern const std::array<const char*, 16> LANGUAGE_NAMES;
// A class representing the format used by NX metadata files, typically named Control.nacp.
// These store application name, dev name, title id, and other miscellaneous data.
diff --git a/src/core/file_sys/directory.h b/src/core/file_sys/directory.h
index 0d73eecc9..21c7aefc8 100644
--- a/src/core/file_sys/directory.h
+++ b/src/core/file_sys/directory.h
@@ -6,7 +6,6 @@
#include <cstddef>
#include <iterator>
-#include <string_view>
#include "common/common_funcs.h"
#include "common/common_types.h"
diff --git a/src/core/file_sys/nca_metadata.h b/src/core/file_sys/nca_metadata.h
index ce1138a17..75c74ae28 100644
--- a/src/core/file_sys/nca_metadata.h
+++ b/src/core/file_sys/nca_metadata.h
@@ -5,7 +5,6 @@
#pragma once
#include <array>
-#include <memory>
#include <vector>
#include "common/common_funcs.h"
#include "common/common_types.h"
diff --git a/src/core/file_sys/program_metadata.cpp b/src/core/file_sys/program_metadata.cpp
index 35a53d36c..4e46c24cf 100644
--- a/src/core/file_sys/program_metadata.cpp
+++ b/src/core/file_sys/program_metadata.cpp
@@ -53,13 +53,16 @@ Loader::ResultStatus ProgramMetadata::Load(VirtualFile file) {
}
/*static*/ ProgramMetadata ProgramMetadata::GetDefault() {
+ // Allow use of cores 0~3 and thread priorities 1~63.
+ constexpr u32 default_thread_info_capability = 0x30007F7;
+
ProgramMetadata result;
result.LoadManual(
true /*is_64_bit*/, FileSys::ProgramAddressSpaceType::Is39Bit /*address_space*/,
0x2c /*main_thread_prio*/, 0 /*main_thread_core*/, 0x00100000 /*main_thread_stack_size*/,
0 /*title_id*/, 0xFFFFFFFFFFFFFFFF /*filesystem_permissions*/,
- 0x1FE00000 /*system_resource_size*/, {} /*capabilities*/);
+ 0x1FE00000 /*system_resource_size*/, {default_thread_info_capability} /*capabilities*/);
return result;
}
diff --git a/src/core/file_sys/romfs_factory.cpp b/src/core/file_sys/romfs_factory.cpp
index 638c6cea8..291b746b6 100644
--- a/src/core/file_sys/romfs_factory.cpp
+++ b/src/core/file_sys/romfs_factory.cpp
@@ -6,7 +6,6 @@
#include "common/assert.h"
#include "common/common_types.h"
#include "common/logging/log.h"
-#include "core/file_sys/card_image.h"
#include "core/file_sys/common_funcs.h"
#include "core/file_sys/content_archive.h"
#include "core/file_sys/nca_metadata.h"
@@ -39,13 +38,12 @@ void RomFSFactory::SetPackedUpdate(VirtualFile update_raw_file) {
ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_title_id) const {
if (!updatable) {
- return MakeResult<VirtualFile>(file);
+ return file;
}
const PatchManager patch_manager{current_process_title_id, filesystem_controller,
content_provider};
- return MakeResult<VirtualFile>(
- patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw));
+ return patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw);
}
ResultVal<VirtualFile> RomFSFactory::OpenPatchedRomFS(u64 title_id, ContentRecordType type) const {
@@ -58,8 +56,7 @@ ResultVal<VirtualFile> RomFSFactory::OpenPatchedRomFS(u64 title_id, ContentRecor
const PatchManager patch_manager{title_id, filesystem_controller, content_provider};
- return MakeResult<VirtualFile>(
- patch_manager.PatchRomFS(nca->GetRomFS(), nca->GetBaseIVFCOffset(), type));
+ return patch_manager.PatchRomFS(nca->GetRomFS(), nca->GetBaseIVFCOffset(), type);
}
ResultVal<VirtualFile> RomFSFactory::OpenPatchedRomFSWithProgramIndex(
@@ -83,7 +80,7 @@ ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage,
return ResultUnknown;
}
- return MakeResult<VirtualFile>(romfs);
+ return romfs;
}
std::shared_ptr<NCA> RomFSFactory::GetEntry(u64 title_id, StorageId storage,
diff --git a/src/core/file_sys/romfs_factory.h b/src/core/file_sys/romfs_factory.h
index 39db09e4e..2c93a49a5 100644
--- a/src/core/file_sys/romfs_factory.h
+++ b/src/core/file_sys/romfs_factory.h
@@ -5,8 +5,9 @@
#pragma once
#include <memory>
+
#include "common/common_types.h"
-#include "core/file_sys/vfs.h"
+#include "core/file_sys/vfs_types.h"
#include "core/hle/result.h"
namespace Loader {
diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp
index b5254dd75..e6f8514c9 100644
--- a/src/core/file_sys/savedata_factory.cpp
+++ b/src/core/file_sys/savedata_factory.cpp
@@ -9,7 +9,6 @@
#include "core/core.h"
#include "core/file_sys/savedata_factory.h"
#include "core/file_sys/vfs.h"
-#include "core/hle/kernel/k_process.h"
namespace FileSys {
@@ -94,7 +93,7 @@ ResultVal<VirtualDir> SaveDataFactory::Create(SaveDataSpaceId space,
return ResultUnknown;
}
- return MakeResult<VirtualDir>(std::move(out));
+ return out;
}
ResultVal<VirtualDir> SaveDataFactory::Open(SaveDataSpaceId space,
@@ -115,7 +114,7 @@ ResultVal<VirtualDir> SaveDataFactory::Open(SaveDataSpaceId space,
return ResultUnknown;
}
- return MakeResult<VirtualDir>(std::move(out));
+ return out;
}
VirtualDir SaveDataFactory::GetSaveDataSpaceDirectory(SaveDataSpaceId space) const {
@@ -143,7 +142,7 @@ std::string SaveDataFactory::GetFullPath(Core::System& system, SaveDataSpaceId s
// be interpreted as the title id of the current process.
if (type == SaveDataType::SaveData || type == SaveDataType::DeviceSaveData) {
if (title_id == 0) {
- title_id = system.CurrentProcess()->GetTitleID();
+ title_id = system.GetCurrentProcessProgramID();
}
}
diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h
index 1d8dc981f..de415b0c4 100644
--- a/src/core/file_sys/savedata_factory.h
+++ b/src/core/file_sys/savedata_factory.h
@@ -8,7 +8,6 @@
#include <string>
#include "common/common_funcs.h"
#include "common/common_types.h"
-#include "common/swap.h"
#include "core/file_sys/vfs.h"
#include "core/hle/result.h"
diff --git a/src/core/file_sys/sdmc_factory.cpp b/src/core/file_sys/sdmc_factory.cpp
index e5c72cd4d..c0e13e56f 100644
--- a/src/core/file_sys/sdmc_factory.cpp
+++ b/src/core/file_sys/sdmc_factory.cpp
@@ -25,7 +25,7 @@ SDMCFactory::SDMCFactory(VirtualDir sd_dir_, VirtualDir sd_mod_dir_)
SDMCFactory::~SDMCFactory() = default;
ResultVal<VirtualDir> SDMCFactory::Open() const {
- return MakeResult<VirtualDir>(sd_dir);
+ return sd_dir;
}
VirtualDir SDMCFactory::GetSDMCModificationLoadRoot(u64 title_id) const {
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp
index f192dffa5..f03124e3d 100644
--- a/src/core/file_sys/submission_package.cpp
+++ b/src/core/file_sys/submission_package.cpp
@@ -4,7 +4,6 @@
#include <algorithm>
#include <cstring>
-#include <string_view>
#include <fmt/ostream.h>
diff --git a/src/core/file_sys/system_archive/time_zone_binary.h b/src/core/file_sys/system_archive/time_zone_binary.h
index ed2b78227..266c23537 100644
--- a/src/core/file_sys/system_archive/time_zone_binary.h
+++ b/src/core/file_sys/system_archive/time_zone_binary.h
@@ -4,7 +4,6 @@
#pragma once
-#include <string>
#include "core/file_sys/vfs_types.h"
namespace FileSys::SystemArchive {
diff --git a/src/core/file_sys/vfs.h b/src/core/file_sys/vfs.h
index ff6935da6..3e625fad6 100644
--- a/src/core/file_sys/vfs.h
+++ b/src/core/file_sys/vfs.h
@@ -9,7 +9,6 @@
#include <memory>
#include <optional>
#include <string>
-#include <string_view>
#include <type_traits>
#include <vector>
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h
index cd32960a5..bd091451e 100644
--- a/src/core/file_sys/vfs_concat.h
+++ b/src/core/file_sys/vfs_concat.h
@@ -6,7 +6,6 @@
#include <map>
#include <memory>
-#include <string_view>
#include "core/file_sys/vfs.h"
namespace FileSys {
diff --git a/src/core/file_sys/vfs_offset.h b/src/core/file_sys/vfs_offset.h
index 42f78b3d9..7ce1eb336 100644
--- a/src/core/file_sys/vfs_offset.h
+++ b/src/core/file_sys/vfs_offset.h
@@ -5,7 +5,6 @@
#pragma once
#include <memory>
-#include <string_view>
#include "core/file_sys/vfs.h"
diff --git a/src/core/frontend/applets/general_frontend.h b/src/core/frontend/applets/general_frontend.h
index b713b14ee..1647aa975 100644
--- a/src/core/frontend/applets/general_frontend.h
+++ b/src/core/frontend/applets/general_frontend.h
@@ -5,7 +5,6 @@
#pragma once
#include <functional>
-#include <optional>
#include "common/common_types.h"
namespace Core::Frontend {
diff --git a/src/core/frontend/applets/software_keyboard.cpp b/src/core/frontend/applets/software_keyboard.cpp
index 12c76c9ee..c4863ee73 100644
--- a/src/core/frontend/applets/software_keyboard.cpp
+++ b/src/core/frontend/applets/software_keyboard.cpp
@@ -16,7 +16,8 @@ DefaultSoftwareKeyboardApplet::~DefaultSoftwareKeyboardApplet() = default;
void DefaultSoftwareKeyboardApplet::InitializeKeyboard(
bool is_inline, KeyboardInitializeParameters initialize_parameters,
- std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)> submit_normal_callback_,
+ std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
+ submit_normal_callback_,
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback_) {
if (is_inline) {
@@ -128,7 +129,7 @@ void DefaultSoftwareKeyboardApplet::ExitKeyboard() const {
}
void DefaultSoftwareKeyboardApplet::SubmitNormalText(std::u16string text) const {
- submit_normal_callback(Service::AM::Applets::SwkbdResult::Ok, text);
+ submit_normal_callback(Service::AM::Applets::SwkbdResult::Ok, text, true);
}
void DefaultSoftwareKeyboardApplet::SubmitInlineText(std::u16string_view text) const {
diff --git a/src/core/frontend/applets/software_keyboard.h b/src/core/frontend/applets/software_keyboard.h
index 228a548d4..490c55cc2 100644
--- a/src/core/frontend/applets/software_keyboard.h
+++ b/src/core/frontend/applets/software_keyboard.h
@@ -5,7 +5,6 @@
#pragma once
#include <functional>
-#include <thread>
#include "common/common_types.h"
@@ -58,7 +57,7 @@ public:
virtual void InitializeKeyboard(
bool is_inline, KeyboardInitializeParameters initialize_parameters,
- std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)>
+ std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
submit_normal_callback_,
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback_) = 0;
@@ -83,7 +82,7 @@ public:
void InitializeKeyboard(
bool is_inline, KeyboardInitializeParameters initialize_parameters,
- std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)>
+ std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
submit_normal_callback_,
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback_) override;
@@ -107,7 +106,7 @@ private:
KeyboardInitializeParameters parameters;
- mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)>
+ mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
submit_normal_callback;
mutable std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback;
diff --git a/src/core/frontend/applets/web_browser.h b/src/core/frontend/applets/web_browser.h
index 915dde677..b6a60c994 100644
--- a/src/core/frontend/applets/web_browser.h
+++ b/src/core/frontend/applets/web_browser.h
@@ -5,7 +5,6 @@
#pragma once
#include <functional>
-#include <string_view>
#include "core/hle/service/am/applets/applet_web_browser_types.h"
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index e11ec0b0b..e1f7e5886 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -2,7 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <cmath>
#include <mutex>
#include "common/settings.h"
#include "core/frontend/emu_window.h"
diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h
index 076148698..8a86a1d27 100644
--- a/src/core/frontend/emu_window.h
+++ b/src/core/frontend/emu_window.h
@@ -5,7 +5,6 @@
#pragma once
#include <memory>
-#include <tuple>
#include <utility>
#include "common/common_types.h"
#include "core/frontend/framebuffer_layout.h"
diff --git a/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h b/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h
index 0c366b252..f77a91dec 100644
--- a/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h
+++ b/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h
@@ -4,8 +4,6 @@
#pragma once
-#include "common/common_types.h"
-
namespace Kernel::Board::Nintendo::Nx::Smc {
enum MemorySize {
diff --git a/src/core/hle/kernel/code_set.h b/src/core/hle/kernel/code_set.h
index d8ad54030..5cc3b9829 100644
--- a/src/core/hle/kernel/code_set.h
+++ b/src/core/hle/kernel/code_set.h
@@ -5,7 +5,6 @@
#pragma once
#include <cstddef>
-#include <vector>
#include "common/common_types.h"
#include "core/hle/kernel/physical_memory.h"
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index cee96dd9b..e19544c54 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -5,7 +5,6 @@
#include <algorithm>
#include <array>
#include <sstream>
-#include <utility>
#include <boost/range/algorithm_ext/erase.hpp>
@@ -19,14 +18,9 @@
#include "core/hle/kernel/k_handle_table.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_readable_event.h"
-#include "core/hle/kernel/k_scheduler.h"
-#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
#include "core/hle/kernel/k_server_session.h"
#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/k_writable_event.h"
#include "core/hle/kernel/kernel.h"
-#include "core/hle/kernel/svc_results.h"
-#include "core/hle/kernel/time_manager.h"
#include "core/memory.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/init/init_slab_setup.cpp b/src/core/hle/kernel/init/init_slab_setup.cpp
index 10edede17..8ff0f695d 100644
--- a/src/core/hle/kernel/init/init_slab_setup.cpp
+++ b/src/core/hle/kernel/init/init_slab_setup.cpp
@@ -20,8 +20,6 @@
#include "core/hle/kernel/k_system_control.h"
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/k_transfer_memory.h"
-#include "core/hle/kernel/memory_types.h"
-#include "core/memory.h"
namespace Kernel::Init {
diff --git a/src/core/hle/kernel/k_auto_object_container.h b/src/core/hle/kernel/k_auto_object_container.h
index 459953450..4eadfe99d 100644
--- a/src/core/hle/kernel/k_auto_object_container.h
+++ b/src/core/hle/kernel/k_auto_object_container.h
@@ -4,14 +4,9 @@
#pragma once
-#include <atomic>
-
#include <boost/intrusive/rbtree.hpp>
-#include "common/assert.h"
#include "common/common_funcs.h"
-#include "common/common_types.h"
-#include "common/intrusive_red_black_tree.h"
#include "core/hle/kernel/k_auto_object.h"
#include "core/hle/kernel/k_light_lock.h"
diff --git a/src/core/hle/kernel/k_class_token.h b/src/core/hle/kernel/k_class_token.h
index c28db49ec..980010150 100644
--- a/src/core/hle/kernel/k_class_token.h
+++ b/src/core/hle/kernel/k_class_token.h
@@ -6,7 +6,6 @@
#include <atomic>
-#include "common/assert.h"
#include "common/bit_util.h"
#include "common/common_types.h"
diff --git a/src/core/hle/kernel/k_client_session.cpp b/src/core/hle/kernel/k_client_session.cpp
index 8ad1be762..242582f8f 100644
--- a/src/core/hle/kernel/k_client_session.cpp
+++ b/src/core/hle/kernel/k_client_session.cpp
@@ -7,7 +7,6 @@
#include "core/hle/kernel/k_server_session.h"
#include "core/hle/kernel/k_session.h"
#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/svc_results.h"
#include "core/hle/result.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_client_session.h b/src/core/hle/kernel/k_client_session.h
index 230e3b6b8..ad6cc4ed1 100644
--- a/src/core/hle/kernel/k_client_session.h
+++ b/src/core/hle/kernel/k_client_session.h
@@ -4,11 +4,9 @@
#pragma once
-#include <memory>
#include <string>
#include "core/hle/kernel/k_auto_object.h"
-#include "core/hle/kernel/k_synchronization_object.h"
#include "core/hle/kernel/slab_helpers.h"
#include "core/hle/result.h"
diff --git a/src/core/hle/kernel/k_condition_variable.cpp b/src/core/hle/kernel/k_condition_variable.cpp
index ef14ad1d2..7fa9b8cc3 100644
--- a/src/core/hle/kernel/k_condition_variable.cpp
+++ b/src/core/hle/kernel/k_condition_variable.cpp
@@ -2,8 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <vector>
-
#include "core/arm/exclusive_monitor.h"
#include "core/core.h"
#include "core/hle/kernel/k_condition_variable.h"
diff --git a/src/core/hle/kernel/k_handle_table.cpp b/src/core/hle/kernel/k_handle_table.cpp
index 44d13169f..e90fc0628 100644
--- a/src/core/hle/kernel/k_handle_table.cpp
+++ b/src/core/hle/kernel/k_handle_table.cpp
@@ -56,6 +56,7 @@ bool KHandleTable::Remove(Handle handle) {
}
// Close the object.
+ kernel.UnregisterInUseObject(obj);
obj->Close();
return true;
}
diff --git a/src/core/hle/kernel/k_handle_table.h b/src/core/hle/kernel/k_handle_table.h
index 2ff6aa160..95ec905ae 100644
--- a/src/core/hle/kernel/k_handle_table.h
+++ b/src/core/hle/kernel/k_handle_table.h
@@ -8,7 +8,6 @@
#include "common/assert.h"
#include "common/bit_field.h"
-#include "common/bit_util.h"
#include "common/common_types.h"
#include "core/hle/kernel/k_auto_object.h"
#include "core/hle/kernel/k_spin_lock.h"
diff --git a/src/core/hle/kernel/k_light_condition_variable.h b/src/core/hle/kernel/k_light_condition_variable.h
index a95fa41f3..fb0ad783a 100644
--- a/src/core/hle/kernel/k_light_condition_variable.h
+++ b/src/core/hle/kernel/k_light_condition_variable.h
@@ -10,7 +10,6 @@
#include "common/common_types.h"
#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
-#include "core/hle/kernel/k_thread_queue.h"
#include "core/hle/kernel/time_manager.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_light_lock.h b/src/core/hle/kernel/k_light_lock.h
index f4c45f76a..ad853661d 100644
--- a/src/core/hle/kernel/k_light_lock.h
+++ b/src/core/hle/kernel/k_light_lock.h
@@ -6,7 +6,6 @@
#include <atomic>
-#include "common/common_types.h"
#include "core/hle/kernel/k_scoped_lock.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_memory_manager.h b/src/core/hle/kernel/k_memory_manager.h
index ac840b3d0..39badc5f1 100644
--- a/src/core/hle/kernel/k_memory_manager.h
+++ b/src/core/hle/kernel/k_memory_manager.h
@@ -8,7 +8,6 @@
#include <mutex>
#include <tuple>
-#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/hle/kernel/k_page_heap.h"
#include "core/hle/result.h"
diff --git a/src/core/hle/kernel/k_page_heap.cpp b/src/core/hle/kernel/k_page_heap.cpp
index 07e062922..29d996d62 100644
--- a/src/core/hle/kernel/k_page_heap.cpp
+++ b/src/core/hle/kernel/k_page_heap.cpp
@@ -4,7 +4,6 @@
#include "core/core.h"
#include "core/hle/kernel/k_page_heap.h"
-#include "core/memory.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_page_heap.h b/src/core/hle/kernel/k_page_heap.h
index de5d6a189..8d9f30523 100644
--- a/src/core/hle/kernel/k_page_heap.h
+++ b/src/core/hle/kernel/k_page_heap.h
@@ -5,12 +5,9 @@
#pragma once
#include <array>
-#include <bit>
#include <vector>
#include "common/alignment.h"
-#include "common/assert.h"
-#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/hle/kernel/k_page_bitmap.h"
#include "core/hle/kernel/memory_types.h"
diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp
index 5e0b620c2..526b87241 100644
--- a/src/core/hle/kernel/k_page_table.cpp
+++ b/src/core/hle/kernel/k_page_table.cpp
@@ -859,7 +859,7 @@ ResultVal<VAddr> KPageTable::SetHeapSize(std::size_t size) {
current_heap_addr = heap_region_start + size;
}
- return MakeResult<VAddr>(heap_region_start);
+ return heap_region_start;
}
ResultVal<VAddr> KPageTable::AllocateAndMapMemory(std::size_t needed_num_pages, std::size_t align,
@@ -893,7 +893,7 @@ ResultVal<VAddr> KPageTable::AllocateAndMapMemory(std::size_t needed_num_pages,
block_manager->Update(addr, needed_num_pages, state, perm);
- return MakeResult<VAddr>(addr);
+ return addr;
}
ResultCode KPageTable::LockForDeviceAddressSpace(VAddr addr, std::size_t size) {
diff --git a/src/core/hle/kernel/k_port.h b/src/core/hle/kernel/k_port.h
index 4018ea2df..b6e4a1fcd 100644
--- a/src/core/hle/kernel/k_port.h
+++ b/src/core/hle/kernel/k_port.h
@@ -4,7 +4,6 @@
#pragma once
-#include <memory>
#include <string>
#include "common/common_types.h"
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp
index 211157ccc..76fd8c285 100644
--- a/src/core/hle/kernel/k_process.cpp
+++ b/src/core/hle/kernel/k_process.cpp
@@ -434,11 +434,6 @@ void KProcess::PrepareForTermination() {
}
void KProcess::Finalize() {
- // Release memory to the resource limit.
- if (resource_limit != nullptr) {
- resource_limit->Close();
- }
-
// Finalize the handle table and close any open handles.
handle_table.Finalize();
@@ -460,6 +455,12 @@ void KProcess::Finalize() {
}
}
+ // Release memory to the resource limit.
+ if (resource_limit != nullptr) {
+ resource_limit->Close();
+ resource_limit = nullptr;
+ }
+
// Perform inherited finalization.
KAutoObjectWithSlabHeapAndContainer<KProcess, KSynchronizationObject>::Finalize();
}
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h
index 1a53e2be7..8a8c1fcbb 100644
--- a/src/core/hle/kernel/k_process.h
+++ b/src/core/hle/kernel/k_process.h
@@ -8,7 +8,6 @@
#include <cstddef>
#include <list>
#include <string>
-#include <unordered_map>
#include <vector>
#include "common/common_types.h"
#include "core/hle/kernel/k_address_arbiter.h"
@@ -155,8 +154,8 @@ public:
return process_id;
}
- /// Gets the title ID corresponding to this process.
- u64 GetTitleID() const {
+ /// Gets the program ID corresponding to this process.
+ u64 GetProgramID() const {
return program_id;
}
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h
index c8ccc1ae4..7df288438 100644
--- a/src/core/hle/kernel/k_scheduler.h
+++ b/src/core/hle/kernel/k_scheduler.h
@@ -49,6 +49,11 @@ public:
/// Gets the current running thread
[[nodiscard]] KThread* GetCurrentThread() const;
+ /// Gets the idle thread
+ [[nodiscard]] KThread* GetIdleThread() const {
+ return idle_thread;
+ }
+
/// Returns true if the scheduler is idle
[[nodiscard]] bool IsIdle() const {
return GetCurrentThread() == idle_thread;
diff --git a/src/core/hle/kernel/k_scheduler_lock.h b/src/core/hle/kernel/k_scheduler_lock.h
index 47e315555..c571f2992 100644
--- a/src/core/hle/kernel/k_scheduler_lock.h
+++ b/src/core/hle/kernel/k_scheduler_lock.h
@@ -5,7 +5,6 @@
#pragma once
#include "common/assert.h"
-#include "core/hardware_properties.h"
#include "core/hle/kernel/k_spin_lock.h"
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
diff --git a/src/core/hle/kernel/k_scoped_lock.h b/src/core/hle/kernel/k_scoped_lock.h
index 4fb180fc6..89a7ffe49 100644
--- a/src/core/hle/kernel/k_scoped_lock.h
+++ b/src/core/hle/kernel/k_scoped_lock.h
@@ -7,7 +7,8 @@
#pragma once
-#include "common/common_types.h"
+#include <concepts>
+#include <type_traits>
namespace Kernel {
diff --git a/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h b/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
index f6c75f2d9..61dc2858f 100644
--- a/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
+++ b/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
@@ -8,7 +8,6 @@
#pragma once
#include "common/common_types.h"
-#include "core/hle/kernel/k_handle_table.h"
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/time_manager.h"
diff --git a/src/core/hle/kernel/k_server_port.cpp b/src/core/hle/kernel/k_server_port.cpp
index c5dc58387..433fc98e1 100644
--- a/src/core/hle/kernel/k_server_port.cpp
+++ b/src/core/hle/kernel/k_server_port.cpp
@@ -10,7 +10,6 @@
#include "core/hle/kernel/k_server_port.h"
#include "core/hle/kernel/k_server_session.h"
#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/svc_results.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_server_port.h b/src/core/hle/kernel/k_server_port.h
index 67a36da40..6302d5e61 100644
--- a/src/core/hle/kernel/k_server_port.h
+++ b/src/core/hle/kernel/k_server_port.h
@@ -7,14 +7,11 @@
#include <memory>
#include <string>
#include <utility>
-#include <vector>
#include <boost/intrusive/list.hpp>
-#include "common/common_types.h"
#include "core/hle/kernel/k_server_session.h"
#include "core/hle/kernel/k_synchronization_object.h"
-#include "core/hle/result.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp
index b9f24475c..2bd53ccbd 100644
--- a/src/core/hle/kernel/k_server_session.cpp
+++ b/src/core/hle/kernel/k_server_session.cpp
@@ -14,7 +14,6 @@
#include "core/hle/kernel/hle_ipc.h"
#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_handle_table.h"
-#include "core/hle/kernel/k_port.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_server_port.h"
@@ -22,6 +21,7 @@
#include "core/hle/kernel/k_session.h"
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
+#include "core/hle/kernel/service_thread.h"
#include "core/memory.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_server_session.h b/src/core/hle/kernel/k_server_session.h
index d44bc9d4f..5b76bf17c 100644
--- a/src/core/hle/kernel/k_server_session.h
+++ b/src/core/hle/kernel/k_server_session.h
@@ -7,14 +7,11 @@
#include <memory>
#include <string>
#include <utility>
-#include <vector>
#include <boost/intrusive/list.hpp>
-#include "common/threadsafe_queue.h"
#include "core/hle/kernel/hle_ipc.h"
#include "core/hle/kernel/k_synchronization_object.h"
-#include "core/hle/kernel/service_thread.h"
#include "core/hle/result.h"
namespace Core::Memory {
diff --git a/src/core/hle/kernel/k_session.cpp b/src/core/hle/kernel/k_session.cpp
index 940878e03..a64b56b9e 100644
--- a/src/core/hle/kernel/k_session.cpp
+++ b/src/core/hle/kernel/k_session.cpp
@@ -2,7 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "common/assert.h"
#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_client_session.h"
#include "core/hle/kernel/k_scoped_resource_reservation.h"
diff --git a/src/core/hle/kernel/k_shared_memory.h b/src/core/hle/kernel/k_shared_memory.h
index e9815f90b..81de36136 100644
--- a/src/core/hle/kernel/k_shared_memory.h
+++ b/src/core/hle/kernel/k_shared_memory.h
@@ -4,7 +4,6 @@
#pragma once
-#include <memory>
#include <string>
#include "common/common_types.h"
diff --git a/src/core/hle/kernel/k_shared_memory_info.h b/src/core/hle/kernel/k_shared_memory_info.h
index bf97a0184..20bc19f46 100644
--- a/src/core/hle/kernel/k_shared_memory_info.h
+++ b/src/core/hle/kernel/k_shared_memory_info.h
@@ -4,12 +4,8 @@
#pragma once
-#include <memory>
-#include <string>
-
#include <boost/intrusive/list.hpp>
-#include "common/assert.h"
#include "core/hle/kernel/slab_helpers.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp
index 9f1d3156b..db65ce79a 100644
--- a/src/core/hle/kernel/k_thread.cpp
+++ b/src/core/hle/kernel/k_thread.cpp
@@ -13,8 +13,6 @@
#include "common/common_types.h"
#include "common/fiber.h"
#include "common/logging/log.h"
-#include "common/scope_exit.h"
-#include "common/thread_queue_list.h"
#include "core/core.h"
#include "core/cpu_manager.h"
#include "core/hardware_properties.h"
@@ -31,11 +29,9 @@
#include "core/hle/kernel/svc_results.h"
#include "core/hle/kernel/time_manager.h"
#include "core/hle/result.h"
-#include "core/memory.h"
#ifdef ARCHITECTURE_x86_64
#include "core/arm/dynarmic/arm_dynarmic_32.h"
-#include "core/arm/dynarmic/arm_dynarmic_64.h"
#endif
namespace {
diff --git a/src/core/hle/kernel/k_trace.h b/src/core/hle/kernel/k_trace.h
index 79391bccb..d3fed1888 100644
--- a/src/core/hle/kernel/k_trace.h
+++ b/src/core/hle/kernel/k_trace.h
@@ -4,8 +4,6 @@
#pragma once
-#include "common/common_funcs.h"
-
namespace Kernel {
using namespace Common::Literals;
diff --git a/src/core/hle/kernel/k_transfer_memory.h b/src/core/hle/kernel/k_transfer_memory.h
index 31029a5c2..cb7521823 100644
--- a/src/core/hle/kernel/k_transfer_memory.h
+++ b/src/core/hle/kernel/k_transfer_memory.h
@@ -4,8 +4,6 @@
#pragma once
-#include <memory>
-
#include "core/hle/kernel/slab_helpers.h"
#include "core/hle/kernel/svc_types.h"
#include "core/hle/result.h"
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index bea945301..e42a6d36f 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -39,9 +39,7 @@
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/physical_core.h"
#include "core/hle/kernel/service_thread.h"
-#include "core/hle/kernel/svc_results.h"
#include "core/hle/kernel/time_manager.h"
-#include "core/hle/lock.h"
#include "core/hle/result.h"
#include "core/hle/service/sm/sm.h"
#include "core/memory.h"
@@ -91,12 +89,6 @@ struct KernelCore::Impl {
}
void Shutdown() {
- // Shutdown all processes.
- if (current_process) {
- current_process->Finalize();
- current_process->Close();
- current_process = nullptr;
- }
process_list.clear();
// Close all open server ports.
@@ -170,6 +162,24 @@ struct KernelCore::Impl {
// Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
+ // Close kernel objects that were not freed on shutdown
+ {
+ std::lock_guard lk(registered_in_use_objects_lock);
+ if (registered_in_use_objects.size()) {
+ for (auto& object : registered_in_use_objects) {
+ object->Close();
+ }
+ registered_in_use_objects.clear();
+ }
+ }
+
+ // Shutdown all processes.
+ if (current_process) {
+ current_process->Finalize();
+ current_process->Close();
+ current_process = nullptr;
+ }
+
// Track kernel objects that were not freed on shutdown
{
std::lock_guard lk(registered_objects_lock);
@@ -714,9 +724,11 @@ struct KernelCore::Impl {
std::unordered_set<KServerPort*> server_ports;
std::unordered_set<KServerSession*> server_sessions;
std::unordered_set<KAutoObject*> registered_objects;
+ std::unordered_set<KAutoObject*> registered_in_use_objects;
std::mutex server_ports_lock;
std::mutex server_sessions_lock;
std::mutex registered_objects_lock;
+ std::mutex registered_in_use_objects_lock;
std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
std::vector<Kernel::PhysicalCore> cores;
@@ -928,6 +940,16 @@ void KernelCore::UnregisterKernelObject(KAutoObject* object) {
impl->registered_objects.erase(object);
}
+void KernelCore::RegisterInUseObject(KAutoObject* object) {
+ std::lock_guard lk(impl->registered_in_use_objects_lock);
+ impl->registered_in_use_objects.insert(object);
+}
+
+void KernelCore::UnregisterInUseObject(KAutoObject* object) {
+ std::lock_guard lk(impl->registered_in_use_objects_lock);
+ impl->registered_in_use_objects.erase(object);
+}
+
bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
return port != impl->named_ports.cend();
}
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index b6658b437..d2ceae950 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -204,6 +204,14 @@ public:
/// destroyed during the current emulation session.
void UnregisterKernelObject(KAutoObject* object);
+ /// Registers kernel objects with guest in use state, this is purely for close
+ /// after emulation has been shutdown.
+ void RegisterInUseObject(KAutoObject* object);
+
+ /// Unregisters a kernel object previously registered with RegisterInUseObject when it was
+ /// destroyed during the current emulation session.
+ void UnregisterInUseObject(KAutoObject* object);
+
/// Determines whether or not the given port is a valid named port.
bool IsValidNamedPort(NamedPortTable::const_iterator port) const;
diff --git a/src/core/hle/kernel/physical_core.h b/src/core/hle/kernel/physical_core.h
index 901f7e3b0..16a032e89 100644
--- a/src/core/hle/kernel/physical_core.h
+++ b/src/core/hle/kernel/physical_core.h
@@ -4,7 +4,6 @@
#pragma once
-#include <array>
#include <cstddef>
#include <memory>
diff --git a/src/core/hle/kernel/service_thread.cpp b/src/core/hle/kernel/service_thread.cpp
index 2ae80beca..6721b6276 100644
--- a/src/core/hle/kernel/service_thread.cpp
+++ b/src/core/hle/kernel/service_thread.cpp
@@ -9,15 +9,11 @@
#include <vector>
#include <queue>
-#include "common/assert.h"
#include "common/scope_exit.h"
#include "common/thread.h"
-#include "core/core.h"
#include "core/hle/kernel/k_session.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/service_thread.h"
-#include "core/hle/lock.h"
-#include "video_core/renderer_base.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/slab_helpers.h b/src/core/hle/kernel/slab_helpers.h
index 0c5995db0..f1c11256e 100644
--- a/src/core/hle/kernel/slab_helpers.h
+++ b/src/core/hle/kernel/slab_helpers.h
@@ -4,16 +4,8 @@
#pragma once
-#include <atomic>
-
-#include "common/assert.h"
-#include "common/common_funcs.h"
-#include "common/common_types.h"
-#include "common/intrusive_red_black_tree.h"
#include "core/hle/kernel/k_auto_object.h"
#include "core/hle/kernel/k_auto_object_container.h"
-#include "core/hle/kernel/k_light_lock.h"
-#include "core/hle/kernel/k_slab_heap.h"
#include "core/hle/kernel/kernel.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index f98f24a60..f9d99bc51 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -13,18 +13,11 @@
#include "common/common_funcs.h"
#include "common/fiber.h"
#include "common/logging/log.h"
-#include "common/microprofile.h"
#include "common/scope_exit.h"
-#include "common/string_util.h"
-#include "core/arm/exclusive_monitor.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
-#include "core/cpu_manager.h"
-#include "core/hle/kernel/k_address_arbiter.h"
#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_client_session.h"
-#include "core/hle/kernel/k_condition_variable.h"
#include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_handle_table.h"
#include "core/hle/kernel/k_memory_block.h"
@@ -35,7 +28,6 @@
#include "core/hle/kernel/k_resource_limit.h"
#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_scoped_resource_reservation.h"
-#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
#include "core/hle/kernel/k_shared_memory.h"
#include "core/hle/kernel/k_synchronization_object.h"
#include "core/hle/kernel/k_thread.h"
@@ -47,10 +39,8 @@
#include "core/hle/kernel/svc_results.h"
#include "core/hle/kernel/svc_types.h"
#include "core/hle/kernel/svc_wrap.h"
-#include "core/hle/kernel/time_manager.h"
#include "core/hle/lock.h"
#include "core/hle/result.h"
-#include "core/hle/service/service.h"
#include "core/memory.h"
#include "core/reporter.h"
@@ -409,7 +399,7 @@ static ResultCode GetProcessId32(Core::System& system, u32* out_process_id_low,
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds
static ResultCode WaitSynchronization(Core::System& system, s32* index, VAddr handles_address,
- u64 num_handles, s64 nano_seconds) {
+ s32 num_handles, s64 nano_seconds) {
LOG_TRACE(Kernel_SVC, "called handles_address=0x{:X}, num_handles={}, nano_seconds={}",
handles_address, num_handles, nano_seconds);
@@ -427,11 +417,15 @@ static ResultCode WaitSynchronization(Core::System& system, s32* index, VAddr ha
R_UNLESS(handle_table.GetMultipleObjects<KSynchronizationObject>(objs.data(), handles,
num_handles),
ResultInvalidHandle);
+ for (const auto& obj : objs) {
+ kernel.RegisterInUseObject(obj);
+ }
}
// Ensure handles are closed when we're done.
SCOPE_EXIT({
- for (u64 i = 0; i < num_handles; ++i) {
+ for (s32 i = 0; i < num_handles; ++i) {
+ kernel.UnregisterInUseObject(objs[i]);
objs[i]->Close();
}
});
@@ -774,7 +768,7 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle
return ResultSuccess;
case GetInfoType::TitleId:
- *result = process->GetTitleID();
+ *result = process->GetProgramID();
return ResultSuccess;
case GetInfoType::UserExceptionContextAddr:
@@ -886,7 +880,24 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle
*result = out_ticks;
return ResultSuccess;
}
+ case GetInfoType::IdleTickCount: {
+ if (handle == 0) {
+ LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}",
+ static_cast<Handle>(handle));
+ return ResultInvalidHandle;
+ }
+
+ if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id != system.CurrentCoreIndex()) {
+ LOG_ERROR(Kernel_SVC, "Core is not the current core, got {}", info_sub_id);
+ return ResultInvalidCombination;
+ }
+
+ const auto& scheduler = *system.Kernel().CurrentScheduler();
+ const auto* const idle_thread = scheduler.GetIdleThread();
+ *result = idle_thread->GetCpuTime();
+ return ResultSuccess;
+ }
default:
LOG_ERROR(Kernel_SVC, "Unimplemented svcGetInfo id=0x{:016X}", info_id);
return ResultInvalidEnumValue;
@@ -1544,6 +1555,7 @@ static ResultCode StartThread(Core::System& system, Handle thread_handle) {
// If we succeeded, persist a reference to the thread.
thread->Open();
+ system.Kernel().RegisterInUseObject(thread.GetPointerUnsafe());
return ResultSuccess;
}
@@ -1559,6 +1571,7 @@ static void ExitThread(Core::System& system) {
auto* const current_thread = system.Kernel().CurrentScheduler()->GetCurrentThread();
system.GlobalSchedulerContext().RemoveThread(current_thread);
current_thread->Exit();
+ system.Kernel().UnregisterInUseObject(current_thread);
}
static void ExitThread32(Core::System& system) {
diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h
index 913b16494..6e62e656f 100644
--- a/src/core/hle/kernel/svc_wrap.h
+++ b/src/core/hle/kernel/svc_wrap.h
@@ -248,10 +248,10 @@ void SvcWrap64(Core::System& system) {
}
// Used by WaitSynchronization
-template <ResultCode func(Core::System&, s32*, u64, u64, s64)>
+template <ResultCode func(Core::System&, s32*, u64, s32, s64)>
void SvcWrap64(Core::System& system) {
s32 param_1 = 0;
- const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
+ const u32 retval = func(system, &param_1, Param(system, 1), static_cast<s32>(Param(system, 2)),
static_cast<s64>(Param(system, 3)))
.raw;
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp
index ae9b4be2f..8cd7279a3 100644
--- a/src/core/hle/kernel/time_manager.cpp
+++ b/src/core/hle/kernel/time_manager.cpp
@@ -5,10 +5,7 @@
#include "common/assert.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
-#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/time_manager.h"
namespace Kernel {
diff --git a/src/core/hle/kernel/time_manager.h b/src/core/hle/kernel/time_manager.h
index 2d175a9c4..b1fa26e8c 100644
--- a/src/core/hle/kernel/time_manager.h
+++ b/src/core/hle/kernel/time_manager.h
@@ -6,7 +6,6 @@
#include <memory>
#include <mutex>
-#include <unordered_map>
namespace Core {
class System;
diff --git a/src/core/hle/result.h b/src/core/hle/result.h
index a755008d5..3807b9aa8 100644
--- a/src/core/hle/result.h
+++ b/src/core/hle/result.h
@@ -4,11 +4,10 @@
#pragma once
-#include <new>
-#include <utility>
#include "common/assert.h"
#include "common/bit_field.h"
#include "common/common_types.h"
+#include "common/expected.h"
// All the constants in this file come from http://switchbrew.org/index.php?title=Error_codes
@@ -155,183 +154,130 @@ constexpr ResultCode ResultSuccess(0);
constexpr ResultCode ResultUnknown(UINT32_MAX);
/**
- * This is an optional value type. It holds a `ResultCode` and, if that code is a success code,
- * also holds a result of type `T`. If the code is an error code then trying to access the inner
- * value fails, thus ensuring that the ResultCode of functions is always checked properly before
- * their return value is used. It is similar in concept to the `std::optional` type
- * (http://en.cppreference.com/w/cpp/experimental/optional) originally proposed for inclusion in
- * C++14, or the `Result` type in Rust (http://doc.rust-lang.org/std/result/index.html).
+ * This is an optional value type. It holds a `ResultCode` and, if that code is ResultSuccess, it
+ * also holds a result of type `T`. If the code is an error code (not ResultSuccess), then trying
+ * to access the inner value with operator* is undefined behavior and will assert with Unwrap().
+ * Users of this class must be cognizant to check the status of the ResultVal with operator bool(),
+ * Code(), Succeeded() or Failed() prior to accessing the inner value.
*
* An example of how it could be used:
* \code
* ResultVal<int> Frobnicate(float strength) {
* if (strength < 0.f || strength > 1.0f) {
* // Can't frobnicate too weakly or too strongly
- * return ResultCode(ErrorDescription::OutOfRange, ErrorModule::Common,
- * ErrorSummary::InvalidArgument, ErrorLevel::Permanent);
+ * return ResultCode{ErrorModule::Common, 1};
* } else {
* // Frobnicated! Give caller a cookie
- * return MakeResult<int>(42);
+ * return 42;
* }
* }
* \endcode
*
* \code
- * ResultVal<int> frob_result = Frobnicate(0.75f);
+ * auto frob_result = Frobnicate(0.75f);
* if (frob_result) {
* // Frobbed ok
* printf("My cookie is %d\n", *frob_result);
* } else {
- * printf("Guess I overdid it. :( Error code: %ux\n", frob_result.code().hex);
+ * printf("Guess I overdid it. :( Error code: %ux\n", frob_result.Code().raw);
* }
* \endcode
*/
template <typename T>
class ResultVal {
public:
- /// Constructs an empty `ResultVal` with the given error code. The code must not be a success
- /// code.
- ResultVal(ResultCode error_code = ResultUnknown) : result_code(error_code) {
- ASSERT(error_code.IsError());
- }
+ constexpr ResultVal() : expected{} {}
+
+ constexpr ResultVal(ResultCode code) : expected{Common::Unexpected(code)} {}
+
+ template <typename U>
+ constexpr ResultVal(U&& val) : expected{std::forward<U>(val)} {}
- /**
- * Similar to the non-member function `MakeResult`, with the exception that you can manually
- * specify the success code. `success_code` must not be an error code.
- */
template <typename... Args>
- [[nodiscard]] static ResultVal WithCode(ResultCode success_code, Args&&... args) {
- ResultVal<T> result;
- result.emplace(success_code, std::forward<Args>(args)...);
- return result;
- }
+ constexpr ResultVal(Args&&... args) : expected{std::in_place, std::forward<Args>(args)...} {}
- ResultVal(const ResultVal& o) : result_code(o.result_code) {
- if (!o.empty()) {
- new (&object) T(o.object);
- }
- }
+ ~ResultVal() = default;
- ResultVal(ResultVal&& o) noexcept : result_code(o.result_code) {
- if (!o.empty()) {
- new (&object) T(std::move(o.object));
- }
- }
+ constexpr ResultVal(const ResultVal&) = default;
+ constexpr ResultVal(ResultVal&&) = default;
+
+ ResultVal& operator=(const ResultVal&) = default;
+ ResultVal& operator=(ResultVal&&) = default;
- ~ResultVal() {
- if (!empty()) {
- object.~T();
- }
+ [[nodiscard]] constexpr explicit operator bool() const noexcept {
+ return expected.has_value();
}
- ResultVal& operator=(const ResultVal& o) {
- if (this == &o) {
- return *this;
- }
- if (!empty()) {
- if (!o.empty()) {
- object = o.object;
- } else {
- object.~T();
- }
- } else {
- if (!o.empty()) {
- new (&object) T(o.object);
- }
- }
- result_code = o.result_code;
-
- return *this;
+ [[nodiscard]] constexpr ResultCode Code() const {
+ return expected.has_value() ? ResultSuccess : expected.error();
}
- /**
- * Replaces the current result with a new constructed result value in-place. The code must not
- * be an error code.
- */
- template <typename... Args>
- void emplace(ResultCode success_code, Args&&... args) {
- ASSERT(success_code.IsSuccess());
- if (!empty()) {
- object.~T();
- }
- new (&object) T(std::forward<Args>(args)...);
- result_code = success_code;
+ [[nodiscard]] constexpr bool Succeeded() const {
+ return expected.has_value();
}
- /// Returns true if the `ResultVal` contains an error code and no value.
- [[nodiscard]] bool empty() const {
- return result_code.IsError();
+ [[nodiscard]] constexpr bool Failed() const {
+ return !expected.has_value();
}
- /// Returns true if the `ResultVal` contains a return value.
- [[nodiscard]] bool Succeeded() const {
- return result_code.IsSuccess();
+ [[nodiscard]] constexpr T* operator->() {
+ return std::addressof(expected.value());
}
- /// Returns true if the `ResultVal` contains an error code and no value.
- [[nodiscard]] bool Failed() const {
- return empty();
+
+ [[nodiscard]] constexpr const T* operator->() const {
+ return std::addressof(expected.value());
}
- [[nodiscard]] ResultCode Code() const {
- return result_code;
+ [[nodiscard]] constexpr T& operator*() & {
+ return *expected;
}
- [[nodiscard]] const T& operator*() const {
- return object;
+ [[nodiscard]] constexpr const T& operator*() const& {
+ return *expected;
}
- [[nodiscard]] T& operator*() {
- return object;
+
+ [[nodiscard]] constexpr T&& operator*() && {
+ return *expected;
}
- [[nodiscard]] const T* operator->() const {
- return &object;
+
+ [[nodiscard]] constexpr const T&& operator*() const&& {
+ return *expected;
}
- [[nodiscard]] T* operator->() {
- return &object;
+
+ [[nodiscard]] constexpr T& Unwrap() & {
+ ASSERT_MSG(Succeeded(), "Tried to Unwrap empty ResultVal");
+ return expected.value();
}
- /// Returns the value contained in this `ResultVal`, or the supplied default if it is missing.
- template <typename U>
- [[nodiscard]] T ValueOr(U&& value) const {
- return !empty() ? object : std::move(value);
+ [[nodiscard]] constexpr const T& Unwrap() const& {
+ ASSERT_MSG(Succeeded(), "Tried to Unwrap empty ResultVal");
+ return expected.value();
}
- /// Asserts that the result succeeded and returns a reference to it.
- [[nodiscard]] T& Unwrap() & {
+ [[nodiscard]] constexpr T&& Unwrap() && {
ASSERT_MSG(Succeeded(), "Tried to Unwrap empty ResultVal");
- return **this;
+ return std::move(expected.value());
}
- [[nodiscard]] T&& Unwrap() && {
+ [[nodiscard]] constexpr const T&& Unwrap() const&& {
ASSERT_MSG(Succeeded(), "Tried to Unwrap empty ResultVal");
- return std::move(**this);
+ return std::move(expected.value());
}
-private:
- // A union is used to allocate the storage for the value, while allowing us to construct and
- // destruct it at will.
- union {
- T object;
- };
- ResultCode result_code;
-};
+ template <typename U>
+ [[nodiscard]] constexpr T ValueOr(U&& v) const& {
+ return expected.value_or(v);
+ }
-/**
- * This function is a helper used to construct `ResultVal`s. It receives the arguments to construct
- * `T` with and creates a success `ResultVal` contained the constructed value.
- */
-template <typename T, typename... Args>
-[[nodiscard]] ResultVal<T> MakeResult(Args&&... args) {
- return ResultVal<T>::WithCode(ResultSuccess, std::forward<Args>(args)...);
-}
+ template <typename U>
+ [[nodiscard]] constexpr T ValueOr(U&& v) && {
+ return expected.value_or(v);
+ }
-/**
- * Deducible overload of MakeResult, allowing the template parameter to be ommited if you're just
- * copy or move constructing.
- */
-template <typename Arg>
-[[nodiscard]] ResultVal<std::remove_reference_t<Arg>> MakeResult(Arg&& arg) {
- return ResultVal<std::remove_reference_t<Arg>>::WithCode(ResultSuccess, std::forward<Arg>(arg));
-}
+private:
+ // TODO: Replace this with std::expected once it is standardized in the STL.
+ Common::Expected<T, ResultCode> expected;
+};
/**
* Check for the success of `source` (which must evaluate to a ResultVal). If it succeeds, unwraps
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index 689b36056..6e63e057e 100644
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -16,7 +16,6 @@
#include "core/file_sys/control_metadata.h"
#include "core/file_sys/patch_manager.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/service/acc/acc.h"
#include "core/hle/service/acc/acc_aa.h"
@@ -26,9 +25,7 @@
#include "core/hle/service/acc/async_context.h"
#include "core/hle/service/acc/errors.h"
#include "core/hle/service/acc/profile_manager.h"
-#include "core/hle/service/glue/arp.h"
#include "core/hle/service/glue/glue_manager.h"
-#include "core/hle/service/sm/sm.h"
#include "core/loader/loader.h"
namespace Service::Account {
@@ -761,9 +758,8 @@ ResultCode Module::Interface::InitializeApplicationInfoBase() {
// TODO(ogniK): This should be changed to reflect the target process for when we have multiple
// processes emulated. As we don't actually have pid support we should assume we're just using
// our own process
- const auto& current_process = system.Kernel().CurrentProcess();
const auto launch_property =
- system.GetARPManager().GetLaunchProperty(current_process->GetTitleID());
+ system.GetARPManager().GetLaunchProperty(system.GetCurrentProcessProgramID());
if (launch_property.Failed()) {
LOG_ERROR(Service_ACC, "Failed to get launch property");
@@ -807,7 +803,7 @@ void Module::Interface::IsUserAccountSwitchLocked(Kernel::HLERequestContext& ctx
bool is_locked = false;
if (res != Loader::ResultStatus::Success) {
- const FileSys::PatchManager pm{system.CurrentProcess()->GetTitleID(),
+ const FileSys::PatchManager pm{system.GetCurrentProcessProgramID(),
system.GetFileSystemController(),
system.GetContentProvider()};
const auto nacp_unique = pm.GetControlMetadata().first;
@@ -826,6 +822,13 @@ void Module::Interface::IsUserAccountSwitchLocked(Kernel::HLERequestContext& ctx
rb.Push(is_locked);
}
+void Module::Interface::InitializeApplicationInfoV2(Kernel::HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
void Module::Interface::GetProfileEditor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
Common::UUID user_id = rp.PopRaw<Common::UUID>();
diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h
index a83a480cd..f7e9bc4f8 100644
--- a/src/core/hle/service/acc/acc.h
+++ b/src/core/hle/service/acc/acc.h
@@ -33,6 +33,7 @@ public:
void IsUserRegistrationRequestPermitted(Kernel::HLERequestContext& ctx);
void TrySelectUserWithoutInteraction(Kernel::HLERequestContext& ctx);
void IsUserAccountSwitchLocked(Kernel::HLERequestContext& ctx);
+ void InitializeApplicationInfoV2(Kernel::HLERequestContext& ctx);
void GetProfileEditor(Kernel::HLERequestContext& ctx);
void ListQualifiedUsers(Kernel::HLERequestContext& ctx);
void LoadOpenContext(Kernel::HLERequestContext& ctx);
diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp
index ed241647c..df77c58f0 100644
--- a/src/core/hle/service/acc/acc_u0.cpp
+++ b/src/core/hle/service/acc/acc_u0.cpp
@@ -34,6 +34,7 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+
{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+
{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+
+ {160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"},
};
// clang-format on
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index eccdcc20d..50c2ace93 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -15,15 +15,12 @@
#include "core/file_sys/savedata_factory.h"
#include "core/hle/ipc_helpers.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/kernel.h"
#include "core/hle/service/acc/profile_manager.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applet_ae.h"
#include "core/hle/service/am/applet_oe.h"
#include "core/hle/service/am/applets/applet_profile_select.h"
-#include "core/hle/service/am/applets/applet_software_keyboard.h"
#include "core/hle/service/am/applets/applet_web_browser.h"
#include "core/hle/service/am/applets/applets.h"
#include "core/hle/service/am/idle.h"
@@ -37,7 +34,6 @@
#include "core/hle/service/ns/ns.h"
#include "core/hle/service/nvflinger/nvflinger.h"
#include "core/hle/service/pm/pm.h"
-#include "core/hle/service/set/set.h"
#include "core/hle/service/sm/sm.h"
#include "core/hle/service/vi/vi.h"
#include "core/memory.h"
@@ -1432,7 +1428,7 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) {
u64 build_id{};
std::memcpy(&build_id, build_id_full.data(), sizeof(u64));
- auto data = backend->GetLaunchParameter({system.CurrentProcess()->GetTitleID(), build_id});
+ auto data = backend->GetLaunchParameter({system.GetCurrentProcessProgramID(), build_id});
if (data.has_value()) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
@@ -1484,7 +1480,7 @@ void IApplicationFunctions::EnsureSaveData(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_AM, "called, uid={:016X}{:016X}", user_id[1], user_id[0]);
FileSys::SaveDataAttribute attribute{};
- attribute.title_id = system.CurrentProcess()->GetTitleID();
+ attribute.title_id = system.GetCurrentProcessProgramID();
attribute.user_id = user_id;
attribute.type = FileSys::SaveDataType::SaveData;
const auto res = system.GetFileSystemController().CreateSaveData(
@@ -1514,7 +1510,7 @@ void IApplicationFunctions::GetDisplayVersion(Kernel::HLERequestContext& ctx) {
std::array<u8, 0x10> version_string{};
const auto res = [this] {
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
system.GetContentProvider()};
@@ -1551,7 +1547,7 @@ void IApplicationFunctions::GetDesiredLanguage(Kernel::HLERequestContext& ctx) {
u32 supported_languages = 0;
const auto res = [this] {
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
system.GetContentProvider()};
@@ -1659,7 +1655,7 @@ void IApplicationFunctions::ExtendSaveData(Kernel::HLERequestContext& ctx) {
static_cast<u8>(type), user_id[1], user_id[0], new_normal_size, new_journal_size);
system.GetFileSystemController().WriteSaveDataSize(
- type, system.CurrentProcess()->GetTitleID(), user_id, {new_normal_size, new_journal_size});
+ type, system.GetCurrentProcessProgramID(), user_id, {new_normal_size, new_journal_size});
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
@@ -1683,7 +1679,7 @@ void IApplicationFunctions::GetSaveDataSize(Kernel::HLERequestContext& ctx) {
user_id[0]);
const auto size = system.GetFileSystemController().ReadSaveDataSize(
- type, system.CurrentProcess()->GetTitleID(), user_id);
+ type, system.GetCurrentProcessProgramID(), user_id);
IPC::ResponseBuilder rb{ctx, 6};
rb.Push(ResultSuccess);
diff --git a/src/core/hle/service/am/applets/applet_error.cpp b/src/core/hle/service/am/applets/applet_error.cpp
index 36a4aa9cd..a06c2b872 100644
--- a/src/core/hle/service/am/applets/applet_error.cpp
+++ b/src/core/hle/service/am/applets/applet_error.cpp
@@ -9,7 +9,6 @@
#include "common/string_util.h"
#include "core/core.h"
#include "core/frontend/applets/error.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applets/applet_error.h"
#include "core/reporter.h"
@@ -167,7 +166,7 @@ void Error::Execute() {
}
const auto callback = [this] { DisplayCompleted(); };
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
const auto& reporter{system.GetReporter()};
switch (mode) {
diff --git a/src/core/hle/service/am/applets/applet_general_backend.cpp b/src/core/hle/service/am/applets/applet_general_backend.cpp
index 0f413f9a0..2c6e9d83c 100644
--- a/src/core/hle/service/am/applets/applet_general_backend.cpp
+++ b/src/core/hle/service/am/applets/applet_general_backend.cpp
@@ -2,14 +2,11 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <string_view>
-
#include "common/assert.h"
#include "common/hex_util.h"
#include "common/logging/log.h"
#include "core/core.h"
#include "core/frontend/applets/general_frontend.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/result.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applets/applet_general_backend.h"
@@ -189,7 +186,7 @@ void PhotoViewer::Execute() {
const auto callback = [this] { ViewFinished(); };
switch (mode) {
case PhotoViewerAppletMode::CurrentApp:
- frontend.ShowPhotosForApplication(system.CurrentProcess()->GetTitleID(), callback);
+ frontend.ShowPhotosForApplication(system.GetCurrentProcessProgramID(), callback);
break;
case PhotoViewerAppletMode::AllApps:
frontend.ShowAllPhotos(callback);
diff --git a/src/core/hle/service/am/applets/applet_software_keyboard.cpp b/src/core/hle/service/am/applets/applet_software_keyboard.cpp
index c89aa1bbf..f38f53f69 100644
--- a/src/core/hle/service/am/applets/applet_software_keyboard.cpp
+++ b/src/core/hle/service/am/applets/applet_software_keyboard.cpp
@@ -109,13 +109,18 @@ void SoftwareKeyboard::Execute() {
ShowNormalKeyboard();
}
-void SoftwareKeyboard::SubmitTextNormal(SwkbdResult result, std::u16string submitted_text) {
+void SoftwareKeyboard::SubmitTextNormal(SwkbdResult result, std::u16string submitted_text,
+ bool confirmed) {
if (complete) {
return;
}
if (swkbd_config_common.use_text_check && result == SwkbdResult::Ok) {
- SubmitForTextCheck(submitted_text);
+ if (confirmed) {
+ SubmitNormalOutputAndExit(result, submitted_text);
+ } else {
+ SubmitForTextCheck(submitted_text);
+ }
} else {
SubmitNormalOutputAndExit(result, submitted_text);
}
@@ -273,13 +278,21 @@ void SoftwareKeyboard::ProcessTextCheck() {
std::memcpy(&swkbd_text_check, text_check_data.data(), sizeof(SwkbdTextCheck));
- std::u16string text_check_message =
- swkbd_text_check.text_check_result == SwkbdTextCheckResult::Failure ||
- swkbd_text_check.text_check_result == SwkbdTextCheckResult::Confirm
- ? Common::UTF16StringFromFixedZeroTerminatedBuffer(
- swkbd_text_check.text_check_message.data(),
- swkbd_text_check.text_check_message.size())
- : u"";
+ std::u16string text_check_message = [this, &swkbd_text_check]() -> std::u16string {
+ if (swkbd_text_check.text_check_result == SwkbdTextCheckResult::Failure ||
+ swkbd_text_check.text_check_result == SwkbdTextCheckResult::Confirm) {
+ return swkbd_config_common.use_utf8
+ ? Common::UTF8ToUTF16(Common::StringFromFixedZeroTerminatedBuffer(
+ reinterpret_cast<const char*>(
+ swkbd_text_check.text_check_message.data()),
+ swkbd_text_check.text_check_message.size() * sizeof(char16_t)))
+ : Common::UTF16StringFromFixedZeroTerminatedBuffer(
+ swkbd_text_check.text_check_message.data(),
+ swkbd_text_check.text_check_message.size());
+ } else {
+ return u"";
+ }
+ }();
LOG_INFO(Service_AM, "\nTextCheckResult: {}\nTextCheckMessage: {}",
GetTextCheckResultName(swkbd_text_check.text_check_result),
@@ -583,11 +596,12 @@ void SoftwareKeyboard::InitializeFrontendKeyboard() {
.disable_cancel_button{disable_cancel_button},
};
- frontend.InitializeKeyboard(false, std::move(initialize_parameters),
- [this](SwkbdResult result, std::u16string submitted_text) {
- SubmitTextNormal(result, submitted_text);
- },
- {});
+ frontend.InitializeKeyboard(
+ false, std::move(initialize_parameters),
+ [this](SwkbdResult result, std::u16string submitted_text, bool confirmed) {
+ SubmitTextNormal(result, submitted_text, confirmed);
+ },
+ {});
}
}
diff --git a/src/core/hle/service/am/applets/applet_software_keyboard.h b/src/core/hle/service/am/applets/applet_software_keyboard.h
index 9aef1bf11..a0fddd965 100644
--- a/src/core/hle/service/am/applets/applet_software_keyboard.h
+++ b/src/core/hle/service/am/applets/applet_software_keyboard.h
@@ -4,7 +4,6 @@
#pragma once
-#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/hle/result.h"
#include "core/hle/service/am/applets/applet_software_keyboard_types.h"
@@ -37,8 +36,9 @@ public:
*
* @param result SwkbdResult enum
* @param submitted_text UTF-16 encoded string
+ * @param confirmed Whether the text has been confirmed after TextCheckResult::Confirm
*/
- void SubmitTextNormal(SwkbdResult result, std::u16string submitted_text);
+ void SubmitTextNormal(SwkbdResult result, std::u16string submitted_text, bool confirmed);
/**
* Submits the input text to the application.
diff --git a/src/core/hle/service/am/applets/applet_web_browser.cpp b/src/core/hle/service/am/applets/applet_web_browser.cpp
index 927eeefff..bb5cb61be 100644
--- a/src/core/hle/service/am/applets/applet_web_browser.cpp
+++ b/src/core/hle/service/am/applets/applet_web_browser.cpp
@@ -18,7 +18,6 @@
#include "core/file_sys/system_archive/system_archive.h"
#include "core/file_sys/vfs_vector.h"
#include "core/frontend/applets/web_browser.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/result.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applets/applet_web_browser.h"
@@ -395,7 +394,7 @@ void WebBrowser::InitializeOffline() {
switch (document_kind) {
case DocumentKind::OfflineHtmlPage:
default:
- title_id = system.CurrentProcess()->GetTitleID();
+ title_id = system.GetCurrentProcessProgramID();
nca_type = FileSys::ContentRecordType::HtmlDocument;
additional_paths = "html-document";
break;
diff --git a/src/core/hle/service/am/applets/applet_web_browser.h b/src/core/hle/service/am/applets/applet_web_browser.h
index 4f9e81b79..b3364ee06 100644
--- a/src/core/hle/service/am/applets/applet_web_browser.h
+++ b/src/core/hle/service/am/applets/applet_web_browser.h
@@ -7,7 +7,6 @@
#include <filesystem>
#include <optional>
-#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/file_sys/vfs_types.h"
#include "core/hle/result.h"
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp
index 4c54066c6..3c83717b5 100644
--- a/src/core/hle/service/aoc/aoc_u.cpp
+++ b/src/core/hle/service/aoc/aoc_u.cpp
@@ -17,8 +17,6 @@
#include "core/file_sys/registered_cache.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/k_process.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/aoc/aoc_u.h"
#include "core/loader/loader.h"
@@ -124,9 +122,14 @@ AOC_U::AOC_U(Core::System& system_)
{8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"},
{9, nullptr, "GetAddOnContentLostErrorCode"},
{10, &AOC_U::GetAddOnContentListChangedEventWithProcessId, "GetAddOnContentListChangedEventWithProcessId"},
+ {11, &AOC_U::NotifyMountAddOnContent, "NotifyMountAddOnContent"},
+ {12, &AOC_U::NotifyUnmountAddOnContent, "NotifyUnmountAddOnContent"},
+ {13, nullptr, "IsAddOnContentMountedForDebug"},
+ {50, &AOC_U::CheckAddOnContentMountStatus, "CheckAddOnContentMountStatus"},
{100, &AOC_U::CreateEcPurchasedEventManager, "CreateEcPurchasedEventManager"},
{101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"},
{110, nullptr, "CreateContentsServiceManager"},
+ {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
};
// clang-format on
@@ -153,7 +156,7 @@ void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
- const auto current = system.CurrentProcess()->GetTitleID();
+ const auto current = system.GetCurrentProcessProgramID();
const auto& disabled = Settings::values.disabled_addons[current];
if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) {
@@ -180,7 +183,7 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_AOC, "called with offset={}, count={}, process_id={}", offset, count,
process_id);
- const auto current = system.CurrentProcess()->GetTitleID();
+ const auto current = system.GetCurrentProcessProgramID();
std::vector<u32> out;
const auto& disabled = Settings::values.disabled_addons[current];
@@ -226,7 +229,7 @@ void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
system.GetContentProvider()};
@@ -272,6 +275,27 @@ void AOC_U::GetAddOnContentListChangedEventWithProcessId(Kernel::HLERequestConte
rb.PushCopyObjects(aoc_change_event->GetReadableEvent());
}
+void AOC_U::NotifyMountAddOnContent(Kernel::HLERequestContext& ctx) {
+ LOG_WARNING(Service_AOC, "(STUBBED) called");
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
+void AOC_U::NotifyUnmountAddOnContent(Kernel::HLERequestContext& ctx) {
+ LOG_WARNING(Service_AOC, "(STUBBED) called");
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
+void AOC_U::CheckAddOnContentMountStatus(Kernel::HLERequestContext& ctx) {
+ LOG_WARNING(Service_AOC, "(STUBBED) called");
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service_AOC, "(STUBBED) called");
diff --git a/src/core/hle/service/aoc/aoc_u.h b/src/core/hle/service/aoc/aoc_u.h
index 31d645be8..4b5f7c5f2 100644
--- a/src/core/hle/service/aoc/aoc_u.h
+++ b/src/core/hle/service/aoc/aoc_u.h
@@ -29,6 +29,9 @@ private:
void PrepareAddOnContent(Kernel::HLERequestContext& ctx);
void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx);
void GetAddOnContentListChangedEventWithProcessId(Kernel::HLERequestContext& ctx);
+ void NotifyMountAddOnContent(Kernel::HLERequestContext& ctx);
+ void NotifyUnmountAddOnContent(Kernel::HLERequestContext& ctx);
+ void CheckAddOnContentMountStatus(Kernel::HLERequestContext& ctx);
void CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx);
void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx);
diff --git a/src/core/hle/service/apm/apm.cpp b/src/core/hle/service/apm/apm.cpp
index f5ebfe8d6..243ea15b8 100644
--- a/src/core/hle/service/apm/apm.cpp
+++ b/src/core/hle/service/apm/apm.cpp
@@ -3,7 +3,6 @@
// Refer to the license.txt file included.
#include "core/core.h"
-#include "core/hle/ipc_helpers.h"
#include "core/hle/service/apm/apm.h"
#include "core/hle/service/apm/apm_interface.h"
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp
index 81adbfe09..affa7971c 100644
--- a/src/core/hle/service/audio/audout_u.cpp
+++ b/src/core/hle/service/audio/audout_u.cpp
@@ -14,7 +14,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/audio/audout_u.h"
#include "core/hle/service/audio/errors.h"
#include "core/hle/service/kernel_helpers.h"
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index cdb2a9521..f45e5cecc 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -2,10 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <algorithm>
#include <array>
#include <memory>
-#include <string_view>
#include "audio_core/audio_renderer.h"
#include "common/alignment.h"
@@ -16,7 +14,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/audio/audren_u.h"
#include "core/hle/service/audio/errors.h"
diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h
index 749e046c7..59c6d4740 100644
--- a/src/core/hle/service/bcat/backend/backend.h
+++ b/src/core/hle/service/bcat/backend/backend.h
@@ -7,7 +7,6 @@
#include <functional>
#include <optional>
#include <string>
-#include <string_view>
#include "common/common_types.h"
#include "core/file_sys/vfs_types.h"
diff --git a/src/core/hle/service/bcat/bcat_module.cpp b/src/core/hle/service/bcat/bcat_module.cpp
index 27e9b8df8..500e7e52d 100644
--- a/src/core/hle/service/bcat/bcat_module.cpp
+++ b/src/core/hle/service/bcat/bcat_module.cpp
@@ -11,9 +11,7 @@
#include "core/core.h"
#include "core/file_sys/vfs.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_readable_event.h"
-#include "core/hle/kernel/k_writable_event.h"
#include "core/hle/service/bcat/backend/backend.h"
#include "core/hle/service/bcat/bcat.h"
#include "core/hle/service/bcat/bcat_module.h"
@@ -179,7 +177,7 @@ private:
void RequestSyncDeliveryCache(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_BCAT, "called");
- backend.Synchronize({system.CurrentProcess()->GetTitleID(),
+ backend.Synchronize({system.GetCurrentProcessProgramID(),
GetCurrentBuildID(system.GetCurrentProcessBuildID())},
GetProgressBackend(SyncType::Normal));
@@ -196,7 +194,7 @@ private:
LOG_DEBUG(Service_BCAT, "called, name={}", name);
- backend.SynchronizeDirectory({system.CurrentProcess()->GetTitleID(),
+ backend.SynchronizeDirectory({system.GetCurrentProcessProgramID(),
GetCurrentBuildID(system.GetCurrentProcessBuildID())},
name, GetProgressBackend(SyncType::Directory));
@@ -557,7 +555,7 @@ private:
void Module::Interface::CreateDeliveryCacheStorageService(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_BCAT, "called");
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
rb.PushIpcInterface<IDeliveryCacheStorageService>(system, fsc.GetBCATDirectory(title_id));
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp
index 088a1a18a..0787f43f4 100644
--- a/src/core/hle/service/btdrv/btdrv.cpp
+++ b/src/core/hle/service/btdrv/btdrv.cpp
@@ -6,7 +6,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/btdrv/btdrv.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/service.h"
diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp
index 7aabacc19..d337fd317 100644
--- a/src/core/hle/service/btm/btm.cpp
+++ b/src/core/hle/service/btm/btm.cpp
@@ -8,7 +8,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/btm/btm.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/service.h"
diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp
index 2c2619a7d..f84506af0 100644
--- a/src/core/hle/service/fatal/fatal.cpp
+++ b/src/core/hle/service/fatal/fatal.cpp
@@ -11,7 +11,6 @@
#include "common/swap.h"
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/fatal/fatal.h"
#include "core/hle/service/fatal/fatal_p.h"
#include "core/hle/service/fatal/fatal_u.h"
@@ -66,7 +65,7 @@ enum class FatalType : u32 {
static void GenerateErrorReport(Core::System& system, ResultCode error_code,
const FatalInfo& info) {
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
std::string crash_report = fmt::format(
"Yuzu {}-{} crash report\n"
"Title ID: {:016x}\n"
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp
index f8f9e32f7..3703ca4c6 100644
--- a/src/core/hle/service/filesystem/filesystem.cpp
+++ b/src/core/hle/service/filesystem/filesystem.cpp
@@ -13,7 +13,6 @@
#include "core/file_sys/control_metadata.h"
#include "core/file_sys/errors.h"
#include "core/file_sys/mode.h"
-#include "core/file_sys/partition_filesystem.h"
#include "core/file_sys/patch_manager.h"
#include "core/file_sys/registered_cache.h"
#include "core/file_sys/romfs_factory.h"
@@ -21,7 +20,6 @@
#include "core/file_sys/sdmc_factory.h"
#include "core/file_sys/vfs.h"
#include "core/file_sys/vfs_offset.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/hle/service/filesystem/fsp_ldr.h"
#include "core/hle/service/filesystem/fsp_pr.h"
@@ -226,11 +224,10 @@ ResultVal<FileSys::VirtualFile> VfsDirectoryServiceWrapper::OpenFile(const std::
}
if (mode == FileSys::Mode::Append) {
- return MakeResult<FileSys::VirtualFile>(
- std::make_shared<FileSys::OffsetVfsFile>(file, 0, file->GetSize()));
+ return std::make_shared<FileSys::OffsetVfsFile>(file, 0, file->GetSize());
}
- return MakeResult<FileSys::VirtualFile>(file);
+ return file;
}
ResultVal<FileSys::VirtualDir> VfsDirectoryServiceWrapper::OpenDirectory(const std::string& path_) {
@@ -240,7 +237,7 @@ ResultVal<FileSys::VirtualDir> VfsDirectoryServiceWrapper::OpenDirectory(const s
// TODO(DarkLordZach): Find a better error code for this
return FileSys::ERROR_PATH_NOT_FOUND;
}
- return MakeResult(dir);
+ return dir;
}
ResultVal<FileSys::EntryType> VfsDirectoryServiceWrapper::GetEntryType(
@@ -252,12 +249,12 @@ ResultVal<FileSys::EntryType> VfsDirectoryServiceWrapper::GetEntryType(
auto filename = Common::FS::GetFilename(path);
// TODO(Subv): Some games use the '/' path, find out what this means.
if (filename.empty())
- return MakeResult(FileSys::EntryType::Directory);
+ return FileSys::EntryType::Directory;
if (dir->GetFile(filename) != nullptr)
- return MakeResult(FileSys::EntryType::File);
+ return FileSys::EntryType::File;
if (dir->GetSubdirectory(filename) != nullptr)
- return MakeResult(FileSys::EntryType::Directory);
+ return FileSys::EntryType::Directory;
return FileSys::ERROR_PATH_NOT_FOUND;
}
@@ -270,7 +267,7 @@ ResultVal<FileSys::FileTimeStampRaw> VfsDirectoryServiceWrapper::GetFileTimeStam
if (GetEntryType(path).Failed()) {
return FileSys::ERROR_PATH_NOT_FOUND;
}
- return MakeResult(dir->GetFileTimeStamp(Common::FS::GetFilename(path)));
+ return dir->GetFileTimeStamp(Common::FS::GetFilename(path));
}
FileSystemController::FileSystemController(Core::System& system_) : system{system_} {}
@@ -322,7 +319,7 @@ ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFSCurrentProcess()
return ResultUnknown;
}
- return romfs_factory->OpenCurrentProcess(system.CurrentProcess()->GetTitleID());
+ return romfs_factory->OpenCurrentProcess(system.GetCurrentProcessProgramID());
}
ResultVal<FileSys::VirtualFile> FileSystemController::OpenPatchedRomFS(
@@ -395,7 +392,7 @@ ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveDataSpace(
return FileSys::ERROR_ENTITY_NOT_FOUND;
}
- return MakeResult(save_data_factory->GetSaveDataSpaceDirectory(space));
+ return save_data_factory->GetSaveDataSpaceDirectory(space);
}
ResultVal<FileSys::VirtualDir> FileSystemController::OpenSDMC() const {
@@ -421,7 +418,7 @@ ResultVal<FileSys::VirtualDir> FileSystemController::OpenBISPartition(
return FileSys::ERROR_INVALID_ARGUMENT;
}
- return MakeResult<FileSys::VirtualDir>(std::move(part));
+ return part;
}
ResultVal<FileSys::VirtualFile> FileSystemController::OpenBISPartitionStorage(
@@ -437,7 +434,7 @@ ResultVal<FileSys::VirtualFile> FileSystemController::OpenBISPartitionStorage(
return FileSys::ERROR_INVALID_ARGUMENT;
}
- return MakeResult<FileSys::VirtualFile>(std::move(part));
+ return part;
}
u64 FileSystemController::GetFreeSpaceSize(FileSys::StorageId id) const {
@@ -507,7 +504,7 @@ FileSys::SaveDataSize FileSystemController::ReadSaveDataSize(FileSys::SaveDataTy
const auto res = system.GetAppLoader().ReadControlData(nacp);
if (res != Loader::ResultStatus::Success) {
- const FileSys::PatchManager pm{system.CurrentProcess()->GetTitleID(),
+ const FileSys::PatchManager pm{system.GetCurrentProcessProgramID(),
system.GetFileSystemController(),
system.GetContentProvider()};
const auto metadata = pm.GetControlMetadata();
diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp
index 50c788dd6..3501bc1a4 100644
--- a/src/core/hle/service/filesystem/fsp_srv.cpp
+++ b/src/core/hle/service/filesystem/fsp_srv.cpp
@@ -26,7 +26,6 @@
#include "core/file_sys/system_archive/system_archive.h"
#include "core/file_sys/vfs.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/hle/service/filesystem/fsp_srv.h"
#include "core/reporter.h"
@@ -1035,7 +1034,7 @@ void FSP_SRV::OpenDataStorageWithProgramIndex(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_FS, "called, program_index={}", program_index);
auto patched_romfs = fsc.OpenPatchedRomFSWithProgramIndex(
- system.CurrentProcess()->GetTitleID(), program_index, FileSys::ContentRecordType::Program);
+ system.GetCurrentProcessProgramID(), program_index, FileSys::ContentRecordType::Program);
if (patched_romfs.Failed()) {
// TODO: Find the right error code to use here
diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp
index 70cd63c6b..2feead2aa 100644
--- a/src/core/hle/service/glue/arp.cpp
+++ b/src/core/hle/service/glue/arp.cpp
@@ -6,7 +6,6 @@
#include "common/logging/log.h"
#include "core/core.h"
-#include "core/file_sys/control_metadata.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/kernel.h"
@@ -27,7 +26,7 @@ std::optional<u64> GetTitleIDForProcessID(const Core::System& system, u64 proces
return std::nullopt;
}
- return (*iter)->GetTitleID();
+ return (*iter)->GetProgramID();
}
} // Anonymous namespace
diff --git a/src/core/hle/service/glue/glue_manager.cpp b/src/core/hle/service/glue/glue_manager.cpp
index aa9d48c0c..48e133b48 100644
--- a/src/core/hle/service/glue/glue_manager.cpp
+++ b/src/core/hle/service/glue/glue_manager.cpp
@@ -26,7 +26,7 @@ ResultVal<ApplicationLaunchProperty> ARPManager::GetLaunchProperty(u64 title_id)
return ERR_NOT_REGISTERED;
}
- return MakeResult<ApplicationLaunchProperty>(iter->second.launch);
+ return iter->second.launch;
}
ResultVal<std::vector<u8>> ARPManager::GetControlProperty(u64 title_id) const {
@@ -39,7 +39,7 @@ ResultVal<std::vector<u8>> ARPManager::GetControlProperty(u64 title_id) const {
return ERR_NOT_REGISTERED;
}
- return MakeResult<std::vector<u8>>(iter->second.control);
+ return iter->second.control;
}
ResultCode ARPManager::Register(u64 title_id, ApplicationLaunchProperty launch,
diff --git a/src/core/hle/service/glue/glue_manager.h b/src/core/hle/service/glue/glue_manager.h
index a7f5ce3ee..4bc5297c6 100644
--- a/src/core/hle/service/glue/glue_manager.h
+++ b/src/core/hle/service/glue/glue_manager.h
@@ -7,7 +7,6 @@
#include <map>
#include <vector>
#include "common/common_types.h"
-#include "core/file_sys/control_metadata.h"
#include "core/file_sys/romfs_factory.h"
#include "core/hle/result.h"
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index b7f551e40..196876810 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -16,7 +16,6 @@
#include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_readable_event.h"
#include "core/hle/kernel/k_writable_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/hid/controllers/npad.h"
#include "core/hle/service/kernel_helpers.h"
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 043320d50..10c64d41a 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -8,13 +8,11 @@
#include "common/settings.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/frontend/emu_window.h"
#include "core/frontend/input.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_readable_event.h"
#include "core/hle/kernel/k_shared_memory.h"
#include "core/hle/kernel/k_transfer_memory.h"
-#include "core/hle/kernel/k_writable_event.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/service/hid/errors.h"
#include "core/hle/service/hid/hid.h"
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index 4a92c6234..8812b8ecb 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -2,7 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "common/swap.h"
#include "core/core.h"
#include "core/core_timing.h"
#include "core/hle/ipc_helpers.h"
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp
index 24b7e4435..32eff3b2a 100644
--- a/src/core/hle/service/ldr/ldr.cpp
+++ b/src/core/hle/service/ldr/ldr.cpp
@@ -12,7 +12,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_page_table.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_system_control.h"
#include "core/hle/kernel/svc_results.h"
#include "core/hle/service/ldr/ldr.h"
@@ -247,7 +246,7 @@ public:
return;
}
- if (system.CurrentProcess()->GetTitleID() != header.application_id) {
+ if (system.GetCurrentProcessProgramID() != header.application_id) {
LOG_ERROR(Service_LDR,
"Attempting to load NRR with title ID other than current process. (actual "
"{:016X})!",
@@ -335,7 +334,7 @@ public:
CASCADE_CODE(result);
if (ValidateRegionForMap(page_table, addr, size)) {
- return MakeResult<VAddr>(addr);
+ return addr;
}
}
@@ -371,7 +370,7 @@ public:
}
if (ValidateRegionForMap(page_table, addr, size)) {
- return MakeResult<VAddr>(addr);
+ return addr;
}
}
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp
index 794504314..e40383134 100644
--- a/src/core/hle/service/lm/lm.cpp
+++ b/src/core/hle/service/lm/lm.cpp
@@ -2,19 +2,16 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <sstream>
#include <string>
#include <optional>
#include <unordered_map>
#include <boost/container_hash/hash.hpp>
#include "common/logging/log.h"
-#include "common/scope_exit.h"
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/service/lm/lm.h"
#include "core/hle/service/service.h"
-#include "core/memory.h"
namespace Service::LM {
enum class LogSeverity : u8 {
diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp
index 4fef2aea4..ca4ed35bb 100644
--- a/src/core/hle/service/mii/mii_manager.cpp
+++ b/src/core/hle/service/mii/mii_manager.cpp
@@ -443,14 +443,14 @@ ResultVal<std::vector<MiiInfoElement>> MiiManager::GetDefault(SourceFlag source_
std::vector<MiiInfoElement> result;
if ((source_flag & SourceFlag::Default) == SourceFlag::None) {
- return MakeResult(std::move(result));
+ return result;
}
for (std::size_t index = BaseMiiCount; index < DefaultMiiCount; index++) {
result.emplace_back(BuildDefault(index), Source::Default);
}
- return MakeResult(std::move(result));
+ return result;
}
ResultCode MiiManager::GetIndex([[maybe_unused]] const MiiInfo& info, u32& index) {
diff --git a/src/core/hle/service/mii/raw_data.h b/src/core/hle/service/mii/raw_data.h
index a0d2b9d3a..bd90c2162 100644
--- a/src/core/hle/service/mii/raw_data.h
+++ b/src/core/hle/service/mii/raw_data.h
@@ -6,7 +6,6 @@
#include <array>
-#include "common/common_types.h"
#include "core/hle/service/mii/mii_manager.h"
namespace Service::Mii::RawData {
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index 6791f20a5..693ffc71a 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -9,8 +9,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/lock.h"
#include "core/hle/service/nfp/nfp.h"
#include "core/hle/service/nfp/nfp_user.h"
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp
index f13dc8b0d..a253dd066 100644
--- a/src/core/hle/service/nifm/nifm.cpp
+++ b/src/core/hle/service/nifm/nifm.cpp
@@ -2,7 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "common/settings.h"
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index 30fb060b8..196f274e1 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -7,7 +7,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/nim/nim.h"
#include "core/hle/service/service.h"
diff --git a/src/core/hle/service/ns/language.cpp b/src/core/hle/service/ns/language.cpp
index 7d9e4a20b..e01c6be47 100644
--- a/src/core/hle/service/ns/language.cpp
+++ b/src/core/hle/service/ns/language.cpp
@@ -277,6 +277,25 @@ constexpr ApplicationLanguagePriorityList priority_list_simplified_chinese = {{
ApplicationLanguage::Korean,
}};
+constexpr ApplicationLanguagePriorityList priority_list_brazilian_portuguese = {{
+ ApplicationLanguage::BrazilianPortuguese,
+ ApplicationLanguage::Portuguese,
+ ApplicationLanguage::LatinAmericanSpanish,
+ ApplicationLanguage::AmericanEnglish,
+ ApplicationLanguage::BritishEnglish,
+ ApplicationLanguage::Japanese,
+ ApplicationLanguage::French,
+ ApplicationLanguage::German,
+ ApplicationLanguage::Spanish,
+ ApplicationLanguage::Italian,
+ ApplicationLanguage::Dutch,
+ ApplicationLanguage::CanadianFrench,
+ ApplicationLanguage::Russian,
+ ApplicationLanguage::Korean,
+ ApplicationLanguage::SimplifiedChinese,
+ ApplicationLanguage::TraditionalChinese,
+}};
+
const ApplicationLanguagePriorityList* GetApplicationLanguagePriorityList(
const ApplicationLanguage lang) {
switch (lang) {
@@ -310,6 +329,8 @@ const ApplicationLanguagePriorityList* GetApplicationLanguagePriorityList(
return &priority_list_traditional_chinese;
case ApplicationLanguage::SimplifiedChinese:
return &priority_list_simplified_chinese;
+ case ApplicationLanguage::BrazilianPortuguese:
+ return &priority_list_brazilian_portuguese;
default:
return nullptr;
}
@@ -339,7 +360,6 @@ std::optional<ApplicationLanguage> ConvertToApplicationLanguage(
case Set::LanguageCode::FR_CA:
return ApplicationLanguage::CanadianFrench;
case Set::LanguageCode::PT:
- case Set::LanguageCode::PT_BR:
return ApplicationLanguage::Portuguese;
case Set::LanguageCode::RU:
return ApplicationLanguage::Russian;
@@ -351,6 +371,8 @@ std::optional<ApplicationLanguage> ConvertToApplicationLanguage(
case Set::LanguageCode::ZH_CN:
case Set::LanguageCode::ZH_HANS:
return ApplicationLanguage::SimplifiedChinese;
+ case Set::LanguageCode::PT_BR:
+ return ApplicationLanguage::BrazilianPortuguese;
default:
return std::nullopt;
}
@@ -388,6 +410,8 @@ std::optional<Set::LanguageCode> ConvertToLanguageCode(const ApplicationLanguage
return Set::LanguageCode::ZH_HANT;
case ApplicationLanguage::SimplifiedChinese:
return Set::LanguageCode::ZH_HANS;
+ case ApplicationLanguage::BrazilianPortuguese:
+ return Set::LanguageCode::PT_BR;
default:
return std::nullopt;
}
diff --git a/src/core/hle/service/ns/language.h b/src/core/hle/service/ns/language.h
index e9829f9d2..2cc8e4806 100644
--- a/src/core/hle/service/ns/language.h
+++ b/src/core/hle/service/ns/language.h
@@ -5,7 +5,6 @@
#pragma once
#include <optional>
-#include <string>
#include "common/common_types.h"
namespace Service::Set {
@@ -30,6 +29,7 @@ enum class ApplicationLanguage : u8 {
Korean,
TraditionalChinese,
SimplifiedChinese,
+ BrazilianPortuguese,
Count
};
using ApplicationLanguagePriorityList =
@@ -42,4 +42,4 @@ constexpr u32 GetSupportedLanguageFlag(const ApplicationLanguage lang) {
const ApplicationLanguagePriorityList* GetApplicationLanguagePriorityList(ApplicationLanguage lang);
std::optional<ApplicationLanguage> ConvertToApplicationLanguage(Set::LanguageCode language_code);
std::optional<Set::LanguageCode> ConvertToLanguageCode(ApplicationLanguage lang);
-} // namespace Service::NS \ No newline at end of file
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index 931b48f72..64ffc8572 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -414,7 +414,7 @@ ResultVal<u8> IApplicationManagerInterface::GetApplicationDesiredLanguage(
for (const auto lang : *priority_list) {
const auto supported_flag = GetSupportedLanguageFlag(lang);
if (supported_languages == 0 || (supported_languages & supported_flag) == supported_flag) {
- return MakeResult(static_cast<u8>(lang));
+ return static_cast<u8>(lang);
}
}
@@ -448,7 +448,7 @@ ResultVal<u64> IApplicationManagerInterface::ConvertApplicationLanguageToLanguag
return ERR_APPLICATION_LANGUAGE_NOT_FOUND;
}
- return MakeResult(static_cast<u64>(*language_code));
+ return static_cast<u64>(*language_code);
}
IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_)
diff --git a/src/core/hle/service/nvdrv/devices/nvdevice.h b/src/core/hle/service/nvdrv/devices/nvdevice.h
index 5b73a5a34..3d874243a 100644
--- a/src/core/hle/service/nvdrv/devices/nvdevice.h
+++ b/src/core/hle/service/nvdrv/devices/nvdevice.h
@@ -5,11 +5,8 @@
#pragma once
#include <vector>
-#include "common/bit_field.h"
#include "common/common_types.h"
-#include "common/swap.h"
#include "core/hle/service/nvdrv/nvdata.h"
-#include "core/hle/service/service.h"
namespace Core {
class System;
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
index 4ee8c5733..68f1e9060 100644
--- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
@@ -10,7 +10,6 @@
#include "core/hle/service/nvdrv/devices/nvmap.h"
#include "core/perf_stats.h"
#include "video_core/gpu.h"
-#include "video_core/renderer_base.h"
namespace Service::Nvidia::Devices {
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
index 7dc41d875..85170cdb3 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
@@ -10,10 +10,8 @@
#include "core/core.h"
#include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h"
#include "core/hle/service/nvdrv/devices/nvmap.h"
-#include "core/memory.h"
#include "video_core/memory_manager.h"
#include "video_core/rasterizer_interface.h"
-#include "video_core/renderer_base.h"
namespace Service::Nvidia::Devices {
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp
index d8b684f4f..05b4e2151 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp
@@ -7,7 +7,6 @@
#include "common/logging/log.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
#include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h"
namespace Service::Nvidia::Devices {
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
index 54ac105d5..0a043e386 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
@@ -10,7 +10,6 @@
#include "core/hle/service/nvdrv/syncpoint_manager.h"
#include "core/memory.h"
#include "video_core/gpu.h"
-#include "video_core/memory_manager.h"
namespace Service::Nvidia::Devices {
namespace {
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
index 6c1edce33..0d7d4ad03 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
@@ -6,7 +6,6 @@
#include "common/logging/log.h"
#include "core/core.h"
#include "core/hle/service/nvdrv/devices/nvhost_nvdec.h"
-#include "video_core/memory_manager.h"
#include "video_core/renderer_base.h"
namespace Service::Nvidia::Devices {
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h
index ae4199b79..351625c17 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h
@@ -4,7 +4,6 @@
#pragma once
-#include <map>
#include <vector>
#include "common/common_types.h"
#include "common/swap.h"
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp
index 21d101e8a..eac4dd530 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp
@@ -6,7 +6,6 @@
#include "common/logging/log.h"
#include "core/core.h"
#include "core/hle/service/nvdrv/devices/nvhost_vic.h"
-#include "video_core/memory_manager.h"
#include "video_core/renderer_base.h"
namespace Service::Nvidia::Devices {
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp
index ff405099a..aa7e47cbf 100644
--- a/src/core/hle/service/nvdrv/nvdrv.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv.cpp
@@ -8,7 +8,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/k_readable_event.h"
#include "core/hle/kernel/k_writable_event.h"
#include "core/hle/service/nvdrv/devices/nvdevice.h"
#include "core/hle/service/nvdrv/devices/nvdisp_disp0.h"
diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp
index d61fb73dc..c16babe14 100644
--- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp
@@ -7,9 +7,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_readable_event.h"
-#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/k_writable_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/nvdrv/nvdata.h"
#include "core/hle/service/nvdrv/nvdrv.h"
#include "core/hle/service/nvdrv/nvdrv_interface.h"
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h
index 78de3f354..7b7baeaea 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.h
+++ b/src/core/hle/service/nvflinger/buffer_queue.h
@@ -8,7 +8,6 @@
#include <list>
#include <mutex>
#include <optional>
-#include <vector>
#include "common/common_funcs.h"
#include "common/math_util.h"
diff --git a/src/core/hle/service/pctl/pctl_module.cpp b/src/core/hle/service/pctl/pctl_module.cpp
index 6949fcf3b..240776101 100644
--- a/src/core/hle/service/pctl/pctl_module.cpp
+++ b/src/core/hle/service/pctl/pctl_module.cpp
@@ -7,7 +7,6 @@
#include "core/file_sys/control_metadata.h"
#include "core/file_sys/patch_manager.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/pctl/pctl.h"
#include "core/hle/service/pctl/pctl_module.h"
@@ -45,7 +44,7 @@ public:
{1014, nullptr, "ConfirmPlayableApplicationVideoOld"},
{1015, nullptr, "ConfirmPlayableApplicationVideo"},
{1016, nullptr, "ConfirmShowNewsPermission"},
- {1017, nullptr, "EndFreeCommunication"},
+ {1017, &IParentalControlService::EndFreeCommunication, "EndFreeCommunication"},
{1018, &IParentalControlService::IsFreeCommunicationAvailable, "IsFreeCommunicationAvailable"},
{1031, &IParentalControlService::IsRestrictionEnabled, "IsRestrictionEnabled"},
{1032, nullptr, "GetSafetyLevel"},
@@ -189,7 +188,7 @@ private:
// TODO(ogniK): Recovery flag initialization for pctl:r
- const auto tid = system.CurrentProcess()->GetTitleID();
+ const auto tid = system.GetCurrentProcessProgramID();
if (tid != 0) {
const FileSys::PatchManager pm{tid, system.GetFileSystemController(),
system.GetContentProvider()};
@@ -237,6 +236,13 @@ private:
rb.Push(ResultSuccess);
}
+ void EndFreeCommunication(Kernel::HLERequestContext& ctx) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
+
void IsFreeCommunicationAvailable(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service_PCTL, "(STUBBED) called");
diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp
index f675740b4..88fc5b5cc 100644
--- a/src/core/hle/service/pm/pm.cpp
+++ b/src/core/hle/service/pm/pm.cpp
@@ -101,7 +101,7 @@ private:
const auto process =
SearchProcessList(kernel.GetProcessList(), [title_id](const auto& proc) {
- return proc->GetTitleID() == title_id;
+ return proc->GetProgramID() == title_id;
});
if (!process.has_value()) {
@@ -152,7 +152,7 @@ private:
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
- rb.Push((*process)->GetTitleID());
+ rb.Push((*process)->GetProgramID());
}
const std::vector<Kernel::KProcess*>& process_list;
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp
index 32db6834c..5c8a44688 100644
--- a/src/core/hle/service/prepo/prepo.cpp
+++ b/src/core/hle/service/prepo/prepo.cpp
@@ -6,7 +6,6 @@
#include "common/logging/log.h"
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/acc/profile_manager.h"
#include "core/hle/service/prepo/prepo.h"
#include "core/hle/service/service.h"
@@ -73,7 +72,7 @@ private:
Type, process_id, data1.size(), data2.size());
const auto& reporter{system.GetReporter()};
- reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2},
+ reporter.SavePlayReport(Type, system.GetCurrentProcessProgramID(), {data1, data2},
process_id);
IPC::ResponseBuilder rb{ctx, 2};
@@ -101,7 +100,7 @@ private:
Type, user_id[1], user_id[0], process_id, data1.size(), data2.size());
const auto& reporter{system.GetReporter()};
- reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2},
+ reporter.SavePlayReport(Type, system.GetCurrentProcessProgramID(), {data1, data2},
process_id, user_id);
IPC::ResponseBuilder rb{ctx, 2};
diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp
index 22ff5269c..5d248f671 100644
--- a/src/core/hle/service/ptm/psm.cpp
+++ b/src/core/hle/service/ptm/psm.cpp
@@ -8,7 +8,6 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_event.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/ptm/psm.h"
#include "core/hle/service/service.h"
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index 065133166..f54e6fe56 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -2,19 +2,15 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <algorithm>
#include <fmt/format.h>
#include "common/assert.h"
#include "common/logging/log.h"
#include "common/settings.h"
-#include "common/string_util.h"
#include "core/core.h"
#include "core/hle/ipc.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_server_port.h"
-#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/service/acc/acc.h"
#include "core/hle/service/am/am.h"
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index ae4dc4a75..eaa172595 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -12,8 +12,6 @@
#include "core/hle/kernel/k_port.h"
#include "core/hle/kernel/k_scoped_resource_reservation.h"
#include "core/hle/kernel/k_server_port.h"
-#include "core/hle/kernel/k_server_session.h"
-#include "core/hle/kernel/k_session.h"
#include "core/hle/result.h"
#include "core/hle/service/sm/sm.h"
#include "core/hle/service/sm/sm_controller.h"
@@ -87,7 +85,7 @@ ResultVal<Kernel::KPort*> ServiceManager::GetServicePort(const std::string& name
auto handler = it->second;
port->GetServerPort().SetSessionHandler(std::move(handler));
- return MakeResult(port);
+ return port;
}
/**
@@ -165,7 +163,7 @@ ResultVal<Kernel::KClientSession*> SM::GetServiceImpl(Kernel::HLERequestContext&
LOG_DEBUG(Service_SM, "called service={} -> session={}", name, session->GetId());
- return MakeResult(session);
+ return session;
}
void SM::RegisterService(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h
index 068c78588..021eb51b4 100644
--- a/src/core/hle/service/sm/sm.h
+++ b/src/core/hle/service/sm/sm.h
@@ -6,7 +6,6 @@
#include <memory>
#include <string>
-#include <type_traits>
#include <unordered_map>
#include "common/concepts.h"
diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp
index b5fbc4569..09f9ecee1 100644
--- a/src/core/hle/service/sm/sm_controller.cpp
+++ b/src/core/hle/service/sm/sm_controller.cpp
@@ -7,10 +7,8 @@
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_client_port.h"
-#include "core/hle/kernel/k_client_session.h"
#include "core/hle/kernel/k_port.h"
#include "core/hle/kernel/k_scoped_resource_reservation.h"
-#include "core/hle/kernel/k_server_port.h"
#include "core/hle/kernel/k_server_session.h"
#include "core/hle/kernel/k_session.h"
#include "core/hle/service/sm/sm_controller.h"
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp
index b9e765f1d..f83272633 100644
--- a/src/core/hle/service/sockets/bsd.cpp
+++ b/src/core/hle/service/sockets/bsd.cpp
@@ -4,7 +4,6 @@
#include <array>
#include <memory>
-#include <string>
#include <utility>
#include <vector>
diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp
index ed4c06260..10f7d1461 100644
--- a/src/core/hle/service/spl/spl_module.cpp
+++ b/src/core/hle/service/spl/spl_module.cpp
@@ -120,40 +120,40 @@ ResultVal<u64> Module::Interface::GetConfigImpl(ConfigItem config_item) const {
return ResultSecureMonitorNotImplemented;
case ConfigItem::ExosphereApiVersion:
// Get information about the current exosphere version.
- return MakeResult((u64{HLE::ApiVersion::ATMOSPHERE_RELEASE_VERSION_MAJOR} << 56) |
- (u64{HLE::ApiVersion::ATMOSPHERE_RELEASE_VERSION_MINOR} << 48) |
- (u64{HLE::ApiVersion::ATMOSPHERE_RELEASE_VERSION_MICRO} << 40) |
- (static_cast<u64>(HLE::ApiVersion::GetTargetFirmware())));
+ return (u64{HLE::ApiVersion::ATMOSPHERE_RELEASE_VERSION_MAJOR} << 56) |
+ (u64{HLE::ApiVersion::ATMOSPHERE_RELEASE_VERSION_MINOR} << 48) |
+ (u64{HLE::ApiVersion::ATMOSPHERE_RELEASE_VERSION_MICRO} << 40) |
+ (static_cast<u64>(HLE::ApiVersion::GetTargetFirmware()));
case ConfigItem::ExosphereNeedsReboot:
// We are executing, so we aren't in the process of rebooting.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereNeedsShutdown:
// We are executing, so we aren't in the process of shutting down.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereGitCommitHash:
// Get information about the current exosphere git commit hash.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereHasRcmBugPatch:
// Get information about whether this unit has the RCM bug patched.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereBlankProdInfo:
// Get whether this unit should simulate a "blanked" PRODINFO.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereAllowCalWrites:
// Get whether this unit should allow writing to the calibration partition.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereEmummcType:
// Get what kind of emummc this unit has active.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExospherePayloadAddress:
// Gets the physical address of the reboot payload buffer, if one exists.
return ResultSecureMonitorNotInitialized;
case ConfigItem::ExosphereLogConfiguration:
// Get the log configuration.
- return MakeResult(u64{0});
+ return u64{0};
case ConfigItem::ExosphereForceEnableUsb30:
// Get whether usb 3.0 should be force-enabled.
- return MakeResult(u64{0});
+ return u64{0};
default:
return ResultSecureMonitorInvalidArgument;
}
diff --git a/src/core/hle/service/time/local_system_clock_context_writer.h b/src/core/hle/service/time/local_system_clock_context_writer.h
index 6be617392..ac6c7b4b1 100644
--- a/src/core/hle/service/time/local_system_clock_context_writer.h
+++ b/src/core/hle/service/time/local_system_clock_context_writer.h
@@ -4,7 +4,6 @@
#pragma once
-#include "core/hle/service/time/errors.h"
#include "core/hle/service/time/system_clock_context_update_callback.h"
#include "core/hle/service/time/time_sharedmemory.h"
diff --git a/src/core/hle/service/time/standard_steady_clock_core.cpp b/src/core/hle/service/time/standard_steady_clock_core.cpp
index 59a272f4a..a1ffdd524 100644
--- a/src/core/hle/service/time/standard_steady_clock_core.cpp
+++ b/src/core/hle/service/time/standard_steady_clock_core.cpp
@@ -4,7 +4,6 @@
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
#include "core/hardware_properties.h"
#include "core/hle/service/time/standard_steady_clock_core.h"
diff --git a/src/core/hle/service/time/tick_based_steady_clock_core.cpp b/src/core/hle/service/time/tick_based_steady_clock_core.cpp
index 8baaa2a6a..47d4ab980 100644
--- a/src/core/hle/service/time/tick_based_steady_clock_core.cpp
+++ b/src/core/hle/service/time/tick_based_steady_clock_core.cpp
@@ -4,7 +4,6 @@
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
#include "core/hardware_properties.h"
#include "core/hle/service/time/tick_based_steady_clock_core.h"
diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp
index d84a111c2..4d8823b5a 100644
--- a/src/core/hle/service/time/time.cpp
+++ b/src/core/hle/service/time/time.cpp
@@ -5,10 +5,8 @@
#include "common/logging/log.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
#include "core/hardware_properties.h"
#include "core/hle/ipc_helpers.h"
-#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/service/time/time.h"
#include "core/hle/service/time/time_interface.h"
diff --git a/src/core/hle/service/time/time_manager.cpp b/src/core/hle/service/time/time_manager.cpp
index 9c4c960ef..c1e4e6cce 100644
--- a/src/core/hle/service/time/time_manager.cpp
+++ b/src/core/hle/service/time/time_manager.cpp
@@ -8,8 +8,10 @@
#include "common/settings.h"
#include "common/time_zone.h"
#include "core/hle/service/time/ephemeral_network_system_clock_context_writer.h"
+#include "core/hle/service/time/ephemeral_network_system_clock_core.h"
#include "core/hle/service/time/local_system_clock_context_writer.h"
#include "core/hle/service/time/network_system_clock_context_writer.h"
+#include "core/hle/service/time/tick_based_steady_clock_core.h"
#include "core/hle/service/time/time_manager.h"
namespace Service::Time {
diff --git a/src/core/hle/service/time/time_manager.h b/src/core/hle/service/time/time_manager.h
index 3af868d87..2404067c0 100644
--- a/src/core/hle/service/time/time_manager.h
+++ b/src/core/hle/service/time/time_manager.h
@@ -5,15 +5,12 @@
#pragma once
#include "common/common_types.h"
-#include "common/time_zone.h"
#include "core/file_sys/vfs_types.h"
#include "core/hle/service/time/clock_types.h"
-#include "core/hle/service/time/ephemeral_network_system_clock_core.h"
#include "core/hle/service/time/standard_local_system_clock_core.h"
#include "core/hle/service/time/standard_network_system_clock_core.h"
#include "core/hle/service/time/standard_steady_clock_core.h"
#include "core/hle/service/time/standard_user_system_clock_core.h"
-#include "core/hle/service/time/tick_based_steady_clock_core.h"
#include "core/hle/service/time/time_sharedmemory.h"
#include "core/hle/service/time/time_zone_content_manager.h"
diff --git a/src/core/hle/service/time/time_sharedmemory.cpp b/src/core/hle/service/time/time_sharedmemory.cpp
index 176ad0eee..ed9f75ed6 100644
--- a/src/core/hle/service/time/time_sharedmemory.cpp
+++ b/src/core/hle/service/time/time_sharedmemory.cpp
@@ -4,7 +4,6 @@
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
#include "core/hardware_properties.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/service/time/clock_types.h"
diff --git a/src/core/hle/service/time/time_sharedmemory.h b/src/core/hle/service/time/time_sharedmemory.h
index d471b5d18..9307ea795 100644
--- a/src/core/hle/service/time/time_sharedmemory.h
+++ b/src/core/hle/service/time/time_sharedmemory.h
@@ -7,7 +7,6 @@
#include "common/common_types.h"
#include "common/uuid.h"
#include "core/hle/kernel/k_shared_memory.h"
-#include "core/hle/kernel/k_thread.h"
#include "core/hle/service/time/clock_types.h"
namespace Service::Time {
diff --git a/src/core/hle/service/time/time_zone_manager.cpp b/src/core/hle/service/time/time_zone_manager.cpp
index 6da893790..2989cee5e 100644
--- a/src/core/hle/service/time/time_zone_manager.cpp
+++ b/src/core/hle/service/time/time_zone_manager.cpp
@@ -9,8 +9,6 @@
#include "core/file_sys/content_archive.h"
#include "core/file_sys/nca_metadata.h"
#include "core/file_sys/registered_cache.h"
-#include "core/file_sys/romfs.h"
-#include "core/file_sys/system_archive/system_archive.h"
#include "core/hle/service/time/time_zone_manager.h"
namespace Service::Time::TimeZone {
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 439e7e472..63d5242c4 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -21,9 +21,7 @@
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_readable_event.h"
#include "core/hle/kernel/k_thread.h"
-#include "core/hle/kernel/k_writable_event.h"
#include "core/hle/service/nvdrv/nvdata.h"
-#include "core/hle/service/nvdrv/nvdrv.h"
#include "core/hle/service/nvflinger/buffer_queue.h"
#include "core/hle/service/nvflinger/nvflinger.h"
#include "core/hle/service/service.h"
@@ -1284,15 +1282,15 @@ private:
static ResultVal<ConvertedScaleMode> ConvertScalingModeImpl(NintendoScaleMode mode) {
switch (mode) {
case NintendoScaleMode::None:
- return MakeResult(ConvertedScaleMode::None);
+ return ConvertedScaleMode::None;
case NintendoScaleMode::Freeze:
- return MakeResult(ConvertedScaleMode::Freeze);
+ return ConvertedScaleMode::Freeze;
case NintendoScaleMode::ScaleToWindow:
- return MakeResult(ConvertedScaleMode::ScaleToWindow);
+ return ConvertedScaleMode::ScaleToWindow;
case NintendoScaleMode::ScaleAndCrop:
- return MakeResult(ConvertedScaleMode::ScaleAndCrop);
+ return ConvertedScaleMode::ScaleAndCrop;
case NintendoScaleMode::PreserveAspectRatio:
- return MakeResult(ConvertedScaleMode::PreserveAspectRatio);
+ return ConvertedScaleMode::PreserveAspectRatio;
default:
LOG_ERROR(Service_VI, "Invalid scaling mode specified, mode={}", mode);
return ERR_OPERATION_FAILED;
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index a19bb220a..1b5aca65d 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -2,9 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <cinttypes>
#include <cstring>
-#include "common/common_funcs.h"
#include "common/logging/log.h"
#include "core/core.h"
#include "core/file_sys/content_archive.h"
@@ -13,7 +11,6 @@
#include "core/file_sys/romfs_factory.h"
#include "core/hle/kernel/k_page_table.h"
#include "core/hle/kernel/k_process.h"
-#include "core/hle/kernel/kernel.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/loader/deconstructed_rom_directory.h"
#include "core/loader/nso.h"
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 3d9276f15..d0250bdb4 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -4,7 +4,6 @@
#include <cstring>
#include <memory>
-#include <string>
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "common/logging/log.h"
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h
index 890299a20..bff51ec17 100644
--- a/src/core/loader/elf.h
+++ b/src/core/loader/elf.h
@@ -4,8 +4,6 @@
#pragma once
-#include <string>
-#include "common/common_types.h"
#include "core/loader/loader.h"
namespace Core {
diff --git a/src/core/loader/nax.cpp b/src/core/loader/nax.cpp
index aceb66414..3375dab7c 100644
--- a/src/core/loader/nax.cpp
+++ b/src/core/loader/nax.cpp
@@ -2,7 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "common/logging/log.h"
#include "core/file_sys/content_archive.h"
#include "core/file_sys/romfs.h"
#include "core/file_sys/xts_archive.h"
diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp
index aa51b0daa..219bbeaf5 100644
--- a/src/core/loader/nca.cpp
+++ b/src/core/loader/nca.cpp
@@ -4,7 +4,6 @@
#include <utility>
-#include "common/logging/log.h"
#include "core/core.h"
#include "core/file_sys/content_archive.h"
#include "core/file_sys/romfs_factory.h"
diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h
index f2ff080bb..c0db8c740 100644
--- a/src/core/loader/nca.h
+++ b/src/core/loader/nca.h
@@ -5,7 +5,6 @@
#pragma once
#include "common/common_types.h"
-#include "core/file_sys/vfs.h"
#include "core/loader/loader.h"
namespace Core {
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index 8b167ad3c..f7ccc678d 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -6,7 +6,6 @@
#include "common/common_types.h"
#include "core/core.h"
-#include "core/file_sys/card_image.h"
#include "core/file_sys/content_archive.h"
#include "core/file_sys/control_metadata.h"
#include "core/file_sys/nca_metadata.h"
diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h
index 50406a92e..378e4077a 100644
--- a/src/core/loader/nsp.h
+++ b/src/core/loader/nsp.h
@@ -6,7 +6,6 @@
#include <memory>
#include "common/common_types.h"
-#include "core/file_sys/vfs.h"
#include "core/loader/loader.h"
namespace FileSys {
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp
index 269603eef..8c6c1a3fd 100644
--- a/src/core/loader/xci.cpp
+++ b/src/core/loader/xci.cpp
@@ -11,7 +11,6 @@
#include "core/file_sys/control_metadata.h"
#include "core/file_sys/patch_manager.h"
#include "core/file_sys/registered_cache.h"
-#include "core/file_sys/romfs.h"
#include "core/file_sys/submission_package.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/service/filesystem/filesystem.h"
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h
index 30caaf90e..6e3810e48 100644
--- a/src/core/loader/xci.h
+++ b/src/core/loader/xci.h
@@ -6,7 +6,6 @@
#include <memory>
#include "common/common_types.h"
-#include "core/file_sys/vfs.h"
#include "core/loader/loader.h"
namespace FileSys {
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp
index 46a7e09b4..20f0e90f5 100644
--- a/src/core/memory/cheat_engine.cpp
+++ b/src/core/memory/cheat_engine.cpp
@@ -8,8 +8,6 @@
#include "common/swap.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
-#include "core/hardware_properties.h"
#include "core/hle/kernel/k_page_table.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/service/hid/controllers/npad.h"
@@ -194,7 +192,7 @@ void CheatEngine::Initialize() {
core_timing.ScheduleEvent(CHEAT_ENGINE_NS, event);
metadata.process_id = system.CurrentProcess()->GetProcessID();
- metadata.title_id = system.CurrentProcess()->GetTitleID();
+ metadata.title_id = system.GetCurrentProcessProgramID();
const auto& page_table = system.CurrentProcess()->PageTable();
metadata.heap_extents = {
diff --git a/src/core/network/network.h b/src/core/network/network.h
index fdd3e4655..e85df3ab7 100644
--- a/src/core/network/network.h
+++ b/src/core/network/network.h
@@ -6,7 +6,6 @@
#include <array>
#include <optional>
-#include <utility>
#include "common/common_funcs.h"
#include "common/common_types.h"
diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp
index c9ded49d0..52c43c857 100644
--- a/src/core/perf_stats.cpp
+++ b/src/core/perf_stats.cpp
@@ -14,7 +14,6 @@
#include "common/fs/file.h"
#include "common/fs/fs.h"
#include "common/fs/path_util.h"
-#include "common/math_util.h"
#include "common/settings.h"
#include "core/perf_stats.h"
diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp
index 365b8f906..d4becdc0a 100644
--- a/src/core/reporter.cpp
+++ b/src/core/reporter.cpp
@@ -236,7 +236,7 @@ void Reporter::SaveSvcBreakReport(u32 type, bool signal_debugger, u64 info1, u64
}
const auto timestamp = GetTimestamp();
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
auto out = GetFullDataAuto(timestamp, title_id, system);
auto break_out = json{
@@ -263,7 +263,7 @@ void Reporter::SaveUnimplementedFunctionReport(Kernel::HLERequestContext& ctx, u
}
const auto timestamp = GetTimestamp();
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
auto out = GetFullDataAuto(timestamp, title_id, system);
auto function_out = GetHLERequestContextData(ctx, system.Memory());
@@ -285,7 +285,7 @@ void Reporter::SaveUnimplementedAppletReport(
}
const auto timestamp = GetTimestamp();
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
auto out = GetFullDataAuto(timestamp, title_id, system);
out["applet_common_args"] = {
@@ -377,7 +377,7 @@ void Reporter::SaveUserReport() const {
}
const auto timestamp = GetTimestamp();
- const auto title_id = system.CurrentProcess()->GetTitleID();
+ const auto title_id = system.GetCurrentProcessProgramID();
SaveToFile(GetFullDataAuto(timestamp, title_id, system),
GetPath("user_report", title_id, timestamp));
diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp
index 2e09faa6d..032c71aff 100644
--- a/src/core/tools/freezer.cpp
+++ b/src/core/tools/freezer.cpp
@@ -6,8 +6,6 @@
#include "common/logging/log.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/core_timing_util.h"
-#include "core/hardware_properties.h"
#include "core/memory.h"
#include "core/tools/freezer.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
index ff64c6924..e537f6073 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
@@ -18,7 +18,7 @@ namespace Shader::Backend::GLASM {
#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__)
static void DefinePhi(EmitContext& ctx, IR::Inst& phi) {
- switch (phi.Arg(0).Type()) {
+ switch (phi.Type()) {
case IR::Type::U1:
case IR::Type::U32:
case IR::Type::F32:
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp
index 9b866f889..67f9dad68 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp
@@ -68,7 +68,7 @@ void EmitPhi(EmitContext& ctx, IR::Inst& phi) {
}
if (!phi.Definition<Id>().is_valid) {
// The phi node wasn't forward defined
- ctx.var_alloc.PhiDefine(phi, phi.Arg(0).Type());
+ ctx.var_alloc.PhiDefine(phi, phi.Type());
}
}
@@ -80,7 +80,7 @@ void EmitReference(EmitContext& ctx, const IR::Value& value) {
void EmitPhiMove(EmitContext& ctx, const IR::Value& phi_value, const IR::Value& value) {
IR::Inst& phi{*phi_value.InstRecursive()};
- const auto phi_type{phi.Arg(0).Type()};
+ const auto phi_type{phi.Type()};
if (!phi.Definition<Id>().is_valid) {
// The phi node wasn't forward defined
ctx.var_alloc.PhiDefine(phi, phi_type);
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 3588f052b..1d5364309 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -355,11 +355,22 @@ Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value&
Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
Id coords, Id dref, Id bias_lc, const IR::Value& offset) {
const auto info{inst->Flags<IR::TextureInstInfo>()};
- const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0, bias_lc,
- offset);
- return Emit(&EmitContext::OpImageSparseSampleDrefImplicitLod,
- &EmitContext::OpImageSampleDrefImplicitLod, ctx, inst, ctx.F32[1],
- Texture(ctx, info, index), coords, dref, operands.MaskOptional(), operands.Span());
+ if (ctx.stage == Stage::Fragment) {
+ const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0,
+ bias_lc, offset);
+ return Emit(&EmitContext::OpImageSparseSampleDrefImplicitLod,
+ &EmitContext::OpImageSampleDrefImplicitLod, ctx, inst, ctx.F32[1],
+ Texture(ctx, info, index), coords, dref, operands.MaskOptional(),
+ operands.Span());
+ } else {
+ // Implicit lods in compute behave on hardware as if sampling from LOD 0.
+ // This check is to ensure all drivers behave this way.
+ const Id lod{ctx.Const(0.0f)};
+ const ImageOperands operands(ctx, false, true, false, lod, offset);
+ return Emit(&EmitContext::OpImageSparseSampleDrefExplicitLod,
+ &EmitContext::OpImageSampleDrefExplicitLod, ctx, inst, ctx.F32[1],
+ Texture(ctx, info, index), coords, dref, operands.Mask(), operands.Span());
+ }
}
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
diff --git a/src/shader_recompiler/frontend/ir/basic_block.h b/src/shader_recompiler/frontend/ir/basic_block.h
index 7e134b4c7..9ce1ed07e 100644
--- a/src/shader_recompiler/frontend/ir/basic_block.h
+++ b/src/shader_recompiler/frontend/ir/basic_block.h
@@ -152,6 +152,17 @@ public:
return instructions.crend();
}
+ // Set the order of the block, it can be set pre order, the user decides
+ void SetOrder(u32 new_order) {
+ order = new_order;
+ }
+
+ // Get the order of the block.
+ // The higher, the closer is the block to the end.
+ [[nodiscard]] u32 GetOrder() const {
+ return order;
+ }
+
private:
/// Memory pool for instruction list
ObjectPool<Inst>* inst_pool;
@@ -171,6 +182,9 @@ private:
/// Intrusively stored host definition of this block.
u32 definition{};
+
+ /// Order of the block.
+ u32 order{};
};
using BlockList = std::vector<Block*>;
diff --git a/src/shader_recompiler/frontend/ir/microinstruction.cpp b/src/shader_recompiler/frontend/ir/microinstruction.cpp
index 3dfa5a880..30b470bdd 100644
--- a/src/shader_recompiler/frontend/ir/microinstruction.cpp
+++ b/src/shader_recompiler/frontend/ir/microinstruction.cpp
@@ -6,6 +6,7 @@
#include <memory>
#include "shader_recompiler/exception.h"
+#include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/ir/type.h"
#include "shader_recompiler/frontend/ir/value.h"
@@ -253,6 +254,10 @@ Inst* Inst::GetAssociatedPseudoOperation(IR::Opcode opcode) {
}
IR::Type Inst::Type() const {
+ if (op == IR::Opcode::Phi) {
+ // The type of a phi node is stored in its flags
+ return Flags<IR::Type>();
+ }
return TypeOf(op);
}
@@ -291,6 +296,16 @@ void Inst::AddPhiOperand(Block* predecessor, const Value& value) {
phi_args.emplace_back(predecessor, value);
}
+void Inst::OrderPhiArgs() {
+ if (op != Opcode::Phi) {
+ throw LogicError("{} is not a Phi instruction", op);
+ }
+ std::sort(phi_args.begin(), phi_args.end(),
+ [](const std::pair<Block*, Value>& a, const std::pair<Block*, Value>& b) {
+ return a.first->GetOrder() < b.first->GetOrder();
+ });
+}
+
void Inst::Invalidate() {
ClearArgs();
ReplaceOpcode(Opcode::Void);
diff --git a/src/shader_recompiler/frontend/ir/value.h b/src/shader_recompiler/frontend/ir/value.h
index 334bb47aa..6c9ef6bdd 100644
--- a/src/shader_recompiler/frontend/ir/value.h
+++ b/src/shader_recompiler/frontend/ir/value.h
@@ -182,6 +182,9 @@ public:
/// Add phi operand to a phi instruction.
void AddPhiOperand(Block* predecessor, const Value& value);
+ /// Orders the Phi arguments from farthest away to nearest.
+ void OrderPhiArgs();
+
void Invalidate();
void ClearArgs();
diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp
index 012d55357..2fc542f0e 100644
--- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp
@@ -27,9 +27,11 @@ IR::BlockList GenerateBlocks(const IR::AbstractSyntaxList& syntax_list) {
}
IR::BlockList blocks;
blocks.reserve(num_syntax_blocks);
+ u32 order_index{};
for (const auto& node : syntax_list) {
if (node.type == IR::AbstractSyntaxNode::Type::Block) {
blocks.push_back(node.data.block);
+ blocks.back()->SetOrder(order_index++);
}
}
return blocks;
diff --git a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
index 53145fb5e..87aa09358 100644
--- a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
+++ b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
@@ -14,6 +14,7 @@
// https://link.springer.com/chapter/10.1007/978-3-642-37051-9_6
//
+#include <deque>
#include <span>
#include <variant>
#include <vector>
@@ -370,6 +371,26 @@ void VisitBlock(Pass& pass, IR::Block* block) {
}
pass.SealBlock(block);
}
+
+IR::Type GetConcreteType(IR::Inst* inst) {
+ std::deque<IR::Inst*> queue;
+ queue.push_back(inst);
+ while (!queue.empty()) {
+ IR::Inst* current = queue.front();
+ queue.pop_front();
+ const size_t num_args{current->NumArgs()};
+ for (size_t i = 0; i < num_args; ++i) {
+ const auto set_type = current->Arg(i).Type();
+ if (set_type != IR::Type::Opaque) {
+ return set_type;
+ }
+ if (!current->Arg(i).IsImmediate()) {
+ queue.push_back(current->Arg(i).Inst());
+ }
+ }
+ }
+ return IR::Type::Opaque;
+}
} // Anonymous namespace
void SsaRewritePass(IR::Program& program) {
@@ -378,6 +399,16 @@ void SsaRewritePass(IR::Program& program) {
for (auto block = program.post_order_blocks.rbegin(); block != end; ++block) {
VisitBlock(pass, *block);
}
+ for (auto block = program.post_order_blocks.rbegin(); block != end; ++block) {
+ for (IR::Inst& inst : (*block)->Instructions()) {
+ if (inst.GetOpcode() == IR::Opcode::Phi) {
+ if (inst.Type() == IR::Type::Opaque) {
+ inst.SetFlags(GetConcreteType(&inst));
+ }
+ inst.OrderPhiArgs();
+ }
+ }
+ }
}
} // namespace Shader::Optimization
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp
index 1e1d1d020..0764ea6e0 100644
--- a/src/video_core/renderer_opengl/gl_device.cpp
+++ b/src/video_core/renderer_opengl/gl_device.cpp
@@ -181,6 +181,21 @@ Device::Device() {
LOG_ERROR(Render_OpenGL, "Assembly shaders enabled but not supported");
shader_backend = Settings::ShaderBackend::GLSL;
}
+
+ if (shader_backend == Settings::ShaderBackend::GLSL && is_nvidia &&
+ !Settings::values.renderer_debug) {
+ const std::string_view driver_version = version.substr(13);
+ const int version_major =
+ std::atoi(driver_version.substr(0, driver_version.find(".")).data());
+
+ if (version_major >= 495) {
+ LOG_WARNING(Render_OpenGL, "NVIDIA drivers 495 and later causes significant problems "
+ "with yuzu. Forcing GLASM as a mitigation.");
+ shader_backend = Settings::ShaderBackend::GLASM;
+ use_assembly_shaders = true;
+ }
+ }
+
// Blocks AMD and Intel OpenGL drivers on Windows from using asynchronous shader compilation.
use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue() &&
!(is_amd || (is_intel && !is_linux));
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index b909c387e..a6d9f7c43 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -10,16 +10,14 @@
#include <string_view>
#include <tuple>
#include <utility>
+
#include <glad/glad.h>
-#include "common/alignment.h"
+
#include "common/assert.h"
#include "common/logging/log.h"
#include "common/math_util.h"
#include "common/microprofile.h"
-#include "common/scope_exit.h"
#include "common/settings.h"
-#include "core/core.h"
-#include "core/hle/kernel/k_process.h"
#include "core/memory.h"
#include "video_core/engines/kepler_compute.h"
#include "video_core/engines/maxwell_3d.h"
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index 0f807990c..95106f88f 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -103,6 +103,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
VK_FORMAT_A8B8G8R8_SNORM_PACK32,
VK_FORMAT_A8B8G8R8_SINT_PACK32,
VK_FORMAT_A8B8G8R8_SRGB_PACK32,
+ VK_FORMAT_R5G6B5_UNORM_PACK16,
VK_FORMAT_B5G6R5_UNORM_PACK16,
VK_FORMAT_A2B10G10R10_UNORM_PACK32,
VK_FORMAT_A2B10G10R10_UINT_PACK32,
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index 402be6a78..d62fd566f 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -299,6 +299,11 @@ if (YUZU_USE_BUNDLED_QT)
copy_yuzu_Qt5_deps(yuzu)
endif()
+if (ENABLE_SDL2)
+ target_link_libraries(yuzu PRIVATE SDL2)
+ target_compile_definitions(yuzu PRIVATE HAVE_SDL2)
+endif()
+
if (MSVC)
include(CopyYuzuSDLDeps)
include(CopyYuzuFFmpegDeps)
diff --git a/src/yuzu/applets/qt_software_keyboard.cpp b/src/yuzu/applets/qt_software_keyboard.cpp
index 8fc0c5a36..a83a11a95 100644
--- a/src/yuzu/applets/qt_software_keyboard.cpp
+++ b/src/yuzu/applets/qt_software_keyboard.cpp
@@ -413,7 +413,7 @@ void QtSoftwareKeyboardDialog::ShowTextCheckDialog(
? ui->text_edit_osk->toPlainText().toStdU16String()
: ui->line_edit_osk->text().toStdU16String();
- emit SubmitNormalText(SwkbdResult::Ok, std::move(text));
+ emit SubmitNormalText(SwkbdResult::Ok, std::move(text), true);
break;
}
}
@@ -1510,7 +1510,8 @@ QtSoftwareKeyboard::~QtSoftwareKeyboard() = default;
void QtSoftwareKeyboard::InitializeKeyboard(
bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters,
- std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)> submit_normal_callback_,
+ std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
+ submit_normal_callback_,
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback_) {
if (is_inline) {
@@ -1609,8 +1610,8 @@ void QtSoftwareKeyboard::ExitKeyboard() const {
}
void QtSoftwareKeyboard::SubmitNormalText(Service::AM::Applets::SwkbdResult result,
- std::u16string submitted_text) const {
- submit_normal_callback(result, submitted_text);
+ std::u16string submitted_text, bool confirmed) const {
+ submit_normal_callback(result, submitted_text, confirmed);
}
void QtSoftwareKeyboard::SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type,
diff --git a/src/yuzu/applets/qt_software_keyboard.h b/src/yuzu/applets/qt_software_keyboard.h
index 1a03c098c..592d9c085 100644
--- a/src/yuzu/applets/qt_software_keyboard.h
+++ b/src/yuzu/applets/qt_software_keyboard.h
@@ -51,8 +51,8 @@ public:
void ExitKeyboard();
signals:
- void SubmitNormalText(Service::AM::Applets::SwkbdResult result,
- std::u16string submitted_text) const;
+ void SubmitNormalText(Service::AM::Applets::SwkbdResult result, std::u16string submitted_text,
+ bool confirmed = false) const;
void SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type,
std::u16string submitted_text, s32 cursor_position) const;
@@ -234,7 +234,7 @@ public:
void InitializeKeyboard(
bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters,
- std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)>
+ std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
submit_normal_callback_,
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback_) override;
@@ -272,13 +272,13 @@ signals:
void MainWindowExitKeyboard() const;
private:
- void SubmitNormalText(Service::AM::Applets::SwkbdResult result,
- std::u16string submitted_text) const;
+ void SubmitNormalText(Service::AM::Applets::SwkbdResult result, std::u16string submitted_text,
+ bool confirmed) const;
void SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type,
std::u16string submitted_text, s32 cursor_position) const;
- mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)>
+ mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>
submit_normal_callback;
mutable std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>
submit_inline_callback;
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 40fd47406..46ab0603d 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -32,7 +32,6 @@
#include "common/settings.h"
#include "core/core.h"
#include "core/frontend/framebuffer_layout.h"
-#include "core/hle/kernel/k_process.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
#include "input_common/mouse/mouse_input.h"
@@ -66,7 +65,7 @@ void EmuThread::run() {
if (Settings::values.use_disk_shader_cache.GetValue()) {
system.Renderer().ReadRasterizer()->LoadDiskResources(
- system.CurrentProcess()->GetTitleID(), stop_token,
+ system.GetCurrentProcessProgramID(), stop_token,
[this](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) {
emit LoadProgress(stage, value, total);
});
diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp
index 4fa0c4a43..642a5f966 100644
--- a/src/yuzu/configuration/configure_dialog.cpp
+++ b/src/yuzu/configuration/configure_dialog.cpp
@@ -81,8 +81,11 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
SetConfiguration();
PopulateSelectionList();
- connect(ui->tabWidget, &QTabWidget::currentChanged, this,
- [this]() { debug_tab_tab->SetCurrentIndex(0); });
+ connect(ui->tabWidget, &QTabWidget::currentChanged, this, [this](int index) {
+ if (index != -1) {
+ debug_tab_tab->SetCurrentIndex(0);
+ }
+ });
connect(ui_tab.get(), &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged);
connect(ui->selectorList, &QListWidget::itemSelectionChanged, this,
&ConfigureDialog::UpdateVisibleTabs);
diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp
index 1031399e1..12699c126 100644
--- a/src/yuzu/configuration/configure_per_game.cpp
+++ b/src/yuzu/configuration/configure_per_game.cpp
@@ -66,7 +66,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, const std::str
ui->tabWidget->addTab(system_tab.get(), tr("System"));
ui->tabWidget->addTab(cpu_tab.get(), tr("CPU"));
ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics"));
- ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("GraphicsAdvanced"));
+ ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("Adv. Graphics"));
ui->tabWidget->addTab(audio_tab.get(), tr("Audio"));
setFocusPolicy(Qt::ClickFocus);
diff --git a/src/yuzu/configuration/configure_per_game.ui b/src/yuzu/configuration/configure_per_game.ui
index 60efdbf21..85c86e107 100644
--- a/src/yuzu/configuration/configure_per_game.ui
+++ b/src/yuzu/configuration/configure_per_game.ui
@@ -2,14 +2,6 @@
<ui version="4.0">
<class>ConfigurePerGame</class>
<widget class="QDialog" name="ConfigurePerGame">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>900</width>
- <height>630</height>
- </rect>
- </property>
<property name="minimumSize">
<size>
<width>900</width>
diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp
index 99d5f4686..78b6374c0 100644
--- a/src/yuzu/configuration/configure_profile_manager.cpp
+++ b/src/yuzu/configuration/configure_profile_manager.cpp
@@ -306,6 +306,17 @@ void ConfigureProfileManager::SetUserImage() {
return;
}
+ // Some games crash when the profile image is too big. Resize any image bigger than 256x256
+ QImage image(image_path);
+ if (image.width() > 256 || image.height() > 256) {
+ image = image.scaled(256, 256, Qt::KeepAspectRatio);
+ if (!image.save(image_path)) {
+ QMessageBox::warning(this, tr("Error resizing user image"),
+ tr("Unable to resize image"));
+ return;
+ }
+ }
+
const auto username = GetAccountUsername(*profile_manager, *uuid);
item_model->setItem(index, 0,
new QStandardItem{GetIcon(*uuid), FormatUserEntryText(username, *uuid)});
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 2af582fe5..4e5552d2a 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -66,6 +66,10 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include <QUrl>
#include <QtConcurrent/QtConcurrent>
+#ifdef HAVE_SDL2
+#include <SDL.h> // For SDL ScreenSaver functions
+#endif
+
#include <fmt/format.h>
#include "common/detached_tasks.h"
#include "common/fs/fs.h"
@@ -287,6 +291,16 @@ GMainWindow::GMainWindow()
ui->action_Fullscreen->setChecked(false);
+#if defined(HAVE_SDL2) && !defined(_WIN32)
+ SDL_InitSubSystem(SDL_INIT_VIDEO);
+ // SDL disables the screen saver by default, and setting the hint
+ // SDL_HINT_VIDEO_ALLOW_SCREENSAVER doesn't seem to work, so we just enable the screen saver
+ // for now.
+ SDL_EnableScreenSaver();
+#endif
+
+ Common::Log::Start();
+
QStringList args = QApplication::arguments();
if (args.size() < 2) {
@@ -357,8 +371,9 @@ GMainWindow::GMainWindow()
GMainWindow::~GMainWindow() {
// will get automatically deleted otherwise
- if (render_window->parent() == nullptr)
+ if (render_window->parent() == nullptr) {
delete render_window;
+ }
}
void GMainWindow::RegisterMetaTypes() {
@@ -470,8 +485,9 @@ void GMainWindow::SoftwareKeyboardInitialize(
} else {
connect(
software_keyboard, &QtSoftwareKeyboardDialog::SubmitNormalText, this,
- [this](Service::AM::Applets::SwkbdResult result, std::u16string submitted_text) {
- emit SoftwareKeyboardSubmitNormalText(result, submitted_text);
+ [this](Service::AM::Applets::SwkbdResult result, std::u16string submitted_text,
+ bool confirmed) {
+ emit SoftwareKeyboardSubmitNormalText(result, submitted_text, confirmed);
},
Qt::QueuedConnection);
}
@@ -1223,12 +1239,16 @@ void GMainWindow::OnDisplayTitleBars(bool show) {
void GMainWindow::PreventOSSleep() {
#ifdef _WIN32
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
+#elif defined(HAVE_SDL2)
+ SDL_DisableScreenSaver();
#endif
}
void GMainWindow::AllowOSSleep() {
#ifdef _WIN32
SetThreadExecutionState(ES_CONTINUOUS);
+#elif defined(HAVE_SDL2)
+ SDL_EnableScreenSaver();
#endif
}
@@ -2745,7 +2765,7 @@ void GMainWindow::OnConfigureTas() {
}
void GMainWindow::OnConfigurePerGame() {
- const u64 title_id = system->CurrentProcess()->GetTitleID();
+ const u64 title_id = system->GetCurrentProcessProgramID();
OpenPerGameConfiguration(title_id, game_path.toStdString());
}
@@ -2844,7 +2864,7 @@ void GMainWindow::OnToggleFilterBar() {
}
void GMainWindow::OnCaptureScreenshot() {
- const u64 title_id = system->CurrentProcess()->GetTitleID();
+ const u64 title_id = system->GetCurrentProcessProgramID();
const auto screenshot_path =
QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ScreenshotsDir));
const auto date =
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index aed15a0a0..981102daa 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -150,7 +150,7 @@ signals:
void ProfileSelectorFinishedSelection(std::optional<Common::UUID> uuid);
void SoftwareKeyboardSubmitNormalText(Service::AM::Applets::SwkbdResult result,
- std::u16string submitted_text);
+ std::u16string submitted_text, bool confirmed);
void SoftwareKeyboardSubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type,
std::u16string submitted_text, s32 cursor_position);
diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp
index 67587cc54..b44ea0cc4 100644
--- a/src/yuzu_cmd/yuzu.cpp
+++ b/src/yuzu_cmd/yuzu.cpp
@@ -28,7 +28,6 @@
#include "core/crypto/key_manager.h"
#include "core/file_sys/registered_cache.h"
#include "core/file_sys/vfs_real.h"
-#include "core/hle/kernel/k_process.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/loader/loader.h"
#include "core/telemetry_session.h"
@@ -203,7 +202,7 @@ int main(int argc, char** argv) {
if (Settings::values.use_disk_shader_cache.GetValue()) {
system.Renderer().ReadRasterizer()->LoadDiskResources(
- system.CurrentProcess()->GetTitleID(), std::stop_token{},
+ system.GetCurrentProcessProgramID(), std::stop_token{},
[](VideoCore::LoadCallbackStage, size_t value, size_t total) {});
}