summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp1
-rw-r--r--src/core/core.cpp19
-rw-r--r--src/core/core.h56
-rw-r--r--src/core/file_sys/savedata_factory.cpp1
-rw-r--r--src/core/file_sys/savedata_factory.h1
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp1
-rw-r--r--src/core/hle/kernel/server_session.cpp6
-rw-r--r--src/core/hle/kernel/svc.cpp4
-rw-r--r--src/core/hle/kernel/thread.cpp3
-rw-r--r--src/core/hle/service/filesystem/filesystem.h1
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp1
-rw-r--r--src/core/loader/elf.cpp1
-rw-r--r--src/core/loader/nro.cpp1
-rw-r--r--src/core/loader/nso.cpp1
-rw-r--r--src/core/perf_stats.cpp4
-rw-r--r--src/core/perf_stats.h24
-rw-r--r--src/core/telemetry_session.cpp1
-rw-r--r--src/video_core/engines/maxwell_3d.cpp3
-rw-r--r--src/video_core/rasterizer_cache.h3
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp2
-rw-r--r--src/yuzu/debugger/wait_tree.cpp20
-rw-r--r--src/yuzu/debugger/wait_tree.h30
-rw-r--r--src/yuzu/game_list.cpp16
-rw-r--r--src/yuzu/game_list.h12
-rw-r--r--src/yuzu/game_list_p.h18
-rw-r--r--src/yuzu/main.cpp9
-rw-r--r--src/yuzu/main.h7
-rw-r--r--src/yuzu_cmd/yuzu.cpp3
29 files changed, 185 insertions, 66 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index f96e08212..de44ccebd 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -9,6 +9,7 @@
9#include "common/logging/log.h" 9#include "common/logging/log.h"
10#include "core/arm/dynarmic/arm_dynarmic.h" 10#include "core/arm/dynarmic/arm_dynarmic.h"
11#include "core/core.h" 11#include "core/core.h"
12#include "core/core_cpu.h"
12#include "core/core_timing.h" 13#include "core/core_timing.h"
13#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
14#include "core/hle/kernel/svc.h" 15#include "core/hle/kernel/svc.h"
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 75c259068..2cfae18df 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -2,24 +2,35 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <array>
6#include <map>
5#include <memory> 7#include <memory>
8#include <thread>
6#include <utility> 9#include <utility>
10
7#include "common/logging/log.h" 11#include "common/logging/log.h"
8#include "common/string_util.h" 12#include "common/string_util.h"
13#include "core/arm/exclusive_monitor.h"
9#include "core/core.h" 14#include "core/core.h"
15#include "core/core_cpu.h"
10#include "core/core_timing.h" 16#include "core/core_timing.h"
11#include "core/gdbstub/gdbstub.h" 17#include "core/gdbstub/gdbstub.h"
12#include "core/hle/kernel/client_port.h" 18#include "core/hle/kernel/client_port.h"
13#include "core/hle/kernel/kernel.h" 19#include "core/hle/kernel/kernel.h"
14#include "core/hle/kernel/process.h" 20#include "core/hle/kernel/process.h"
21#include "core/hle/kernel/scheduler.h"
15#include "core/hle/kernel/thread.h" 22#include "core/hle/kernel/thread.h"
16#include "core/hle/service/service.h" 23#include "core/hle/service/service.h"
17#include "core/hle/service/sm/controller.h" 24#include "core/hle/service/sm/controller.h"
18#include "core/hle/service/sm/sm.h" 25#include "core/hle/service/sm/sm.h"
19#include "core/loader/loader.h" 26#include "core/loader/loader.h"
27#include "core/perf_stats.h"
20#include "core/settings.h" 28#include "core/settings.h"
29#include "core/telemetry_session.h"
21#include "file_sys/vfs_concat.h" 30#include "file_sys/vfs_concat.h"
22#include "file_sys/vfs_real.h" 31#include "file_sys/vfs_real.h"
32#include "video_core/debug_utils/debug_utils.h"
33#include "video_core/gpu.h"
23#include "video_core/renderer_base.h" 34#include "video_core/renderer_base.h"
24#include "video_core/video_core.h" 35#include "video_core/video_core.h"
25 36
@@ -258,7 +269,7 @@ struct System::Impl {
258 } 269 }
259 } 270 }
260 271
261 PerfStats::Results GetAndResetPerfStats() { 272 PerfStatsResults GetAndResetPerfStats() {
262 return perf_stats.GetAndResetStats(CoreTiming::GetGlobalTimeUs()); 273 return perf_stats.GetAndResetStats(CoreTiming::GetGlobalTimeUs());
263 } 274 }
264 275
@@ -326,7 +337,7 @@ void System::PrepareReschedule() {
326 CurrentCpuCore().PrepareReschedule(); 337 CurrentCpuCore().PrepareReschedule();
327} 338}
328 339
329PerfStats::Results System::GetAndResetPerfStats() { 340PerfStatsResults System::GetAndResetPerfStats() {
330 return impl->GetAndResetPerfStats(); 341 return impl->GetAndResetPerfStats();
331} 342}
332 343
@@ -433,11 +444,11 @@ std::shared_ptr<Tegra::DebugContext> System::GetGPUDebugContext() const {
433 return impl->debug_context; 444 return impl->debug_context;
434} 445}
435 446
436void System::SetFilesystem(FileSys::VirtualFilesystem vfs) { 447void System::SetFilesystem(std::shared_ptr<FileSys::VfsFilesystem> vfs) {
437 impl->virtual_filesystem = std::move(vfs); 448 impl->virtual_filesystem = std::move(vfs);
438} 449}
439 450
440FileSys::VirtualFilesystem System::GetFilesystem() const { 451std::shared_ptr<FileSys::VfsFilesystem> System::GetFilesystem() const {
441 return impl->virtual_filesystem; 452 return impl->virtual_filesystem;
442} 453}
443 454
diff --git a/src/core/core.h b/src/core/core.h
index 984e8f94c..eee1fecc1 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -4,41 +4,55 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <array> 7#include <cstddef>
8#include <map>
9#include <memory> 8#include <memory>
10#include <string> 9#include <string>
11#include <thread> 10
12#include "common/common_types.h" 11#include "common/common_types.h"
13#include "core/arm/exclusive_monitor.h"
14#include "core/core_cpu.h"
15#include "core/hle/kernel/kernel.h"
16#include "core/hle/kernel/object.h" 12#include "core/hle/kernel/object.h"
17#include "core/hle/kernel/scheduler.h"
18#include "core/loader/loader.h"
19#include "core/memory.h"
20#include "core/perf_stats.h"
21#include "core/telemetry_session.h"
22#include "file_sys/vfs_real.h"
23#include "hle/service/filesystem/filesystem.h"
24#include "video_core/debug_utils/debug_utils.h"
25#include "video_core/gpu.h"
26 13
27namespace Core::Frontend { 14namespace Core::Frontend {
28class EmuWindow; 15class EmuWindow;
29} 16} // namespace Core::Frontend
17
18namespace FileSys {
19class VfsFilesystem;
20} // namespace FileSys
21
22namespace Kernel {
23class KernelCore;
24class Process;
25class Scheduler;
26} // namespace Kernel
27
28namespace Loader {
29class AppLoader;
30enum class ResultStatus : u16;
31} // namespace Loader
30 32
31namespace Service::SM { 33namespace Service::SM {
32class ServiceManager; 34class ServiceManager;
33} 35} // namespace Service::SM
36
37namespace Tegra {
38class DebugContext;
39class GPU;
40} // namespace Tegra
34 41
35namespace VideoCore { 42namespace VideoCore {
36class RendererBase; 43class RendererBase;
37} 44} // namespace VideoCore
38 45
39namespace Core { 46namespace Core {
40 47
41class ARM_Interface; 48class ARM_Interface;
49class Cpu;
50class ExclusiveMonitor;
51class FrameLimiter;
52class PerfStats;
53class TelemetrySession;
54
55struct PerfStatsResults;
42 56
43class System { 57class System {
44public: 58public:
@@ -125,7 +139,7 @@ public:
125 void PrepareReschedule(); 139 void PrepareReschedule();
126 140
127 /// Gets and resets core performance statistics 141 /// Gets and resets core performance statistics
128 PerfStats::Results GetAndResetPerfStats(); 142 PerfStatsResults GetAndResetPerfStats();
129 143
130 /// Gets an ARM interface to the CPU core that is currently running 144 /// Gets an ARM interface to the CPU core that is currently running
131 ARM_Interface& CurrentArmInterface(); 145 ARM_Interface& CurrentArmInterface();
@@ -197,9 +211,9 @@ public:
197 211
198 std::shared_ptr<Tegra::DebugContext> GetGPUDebugContext() const; 212 std::shared_ptr<Tegra::DebugContext> GetGPUDebugContext() const;
199 213
200 void SetFilesystem(FileSys::VirtualFilesystem vfs); 214 void SetFilesystem(std::shared_ptr<FileSys::VfsFilesystem> vfs);
201 215
202 FileSys::VirtualFilesystem GetFilesystem() const; 216 std::shared_ptr<FileSys::VfsFilesystem> GetFilesystem() const;
203 217
204private: 218private:
205 System(); 219 System();
diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp
index 034d3a78f..952bd74b3 100644
--- a/src/core/file_sys/savedata_factory.cpp
+++ b/src/core/file_sys/savedata_factory.cpp
@@ -7,6 +7,7 @@
7#include "common/logging/log.h" 7#include "common/logging/log.h"
8#include "core/core.h" 8#include "core/core.h"
9#include "core/file_sys/savedata_factory.h" 9#include "core/file_sys/savedata_factory.h"
10#include "core/file_sys/vfs.h"
10#include "core/hle/kernel/process.h" 11#include "core/hle/kernel/process.h"
11 12
12namespace FileSys { 13namespace FileSys {
diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h
index 368b36017..c6f9549f0 100644
--- a/src/core/file_sys/savedata_factory.h
+++ b/src/core/file_sys/savedata_factory.h
@@ -8,6 +8,7 @@
8#include <string> 8#include <string>
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "common/swap.h" 10#include "common/swap.h"
11#include "core/file_sys/vfs.h"
11#include "core/hle/result.h" 12#include "core/hle/result.h"
12 13
13namespace FileSys { 14namespace FileSys {
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index 03a954a9f..6657accd5 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -8,9 +8,11 @@
8#include "common/assert.h" 8#include "common/assert.h"
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "core/core.h" 10#include "core/core.h"
11#include "core/core_cpu.h"
11#include "core/hle/kernel/errors.h" 12#include "core/hle/kernel/errors.h"
12#include "core/hle/kernel/object.h" 13#include "core/hle/kernel/object.h"
13#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/scheduler.h"
14#include "core/hle/kernel/thread.h" 16#include "core/hle/kernel/thread.h"
15#include "core/hle/result.h" 17#include "core/hle/result.h"
16#include "core/memory.h" 18#include "core/memory.h"
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index db7aef766..7264be906 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -18,6 +18,7 @@
18#include "core/hle/kernel/event.h" 18#include "core/hle/kernel/event.h"
19#include "core/hle/kernel/handle_table.h" 19#include "core/hle/kernel/handle_table.h"
20#include "core/hle/kernel/hle_ipc.h" 20#include "core/hle/kernel/hle_ipc.h"
21#include "core/hle/kernel/kernel.h"
21#include "core/hle/kernel/object.h" 22#include "core/hle/kernel/object.h"
22#include "core/hle/kernel/process.h" 23#include "core/hle/kernel/process.h"
23#include "core/hle/kernel/server_session.h" 24#include "core/hle/kernel/server_session.h"
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index 90c9a5aff..aba0cab96 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -13,6 +13,7 @@
13#include "core/hle/kernel/client_session.h" 13#include "core/hle/kernel/client_session.h"
14#include "core/hle/kernel/handle_table.h" 14#include "core/hle/kernel/handle_table.h"
15#include "core/hle/kernel/hle_ipc.h" 15#include "core/hle/kernel/hle_ipc.h"
16#include "core/hle/kernel/kernel.h"
16#include "core/hle/kernel/process.h" 17#include "core/hle/kernel/process.h"
17#include "core/hle/kernel/server_session.h" 18#include "core/hle/kernel/server_session.h"
18#include "core/hle/kernel/session.h" 19#include "core/hle/kernel/session.h"
@@ -104,11 +105,10 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr<Thread> thread) {
104 // The ServerSession received a sync request, this means that there's new data available 105 // The ServerSession received a sync request, this means that there's new data available
105 // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or 106 // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or
106 // similar. 107 // similar.
107
108 auto& handle_table = Core::System::GetInstance().Kernel().HandleTable();
109 Kernel::HLERequestContext context(this); 108 Kernel::HLERequestContext context(this);
110 u32* cmd_buf = (u32*)Memory::GetPointer(thread->GetTLSAddress()); 109 u32* cmd_buf = (u32*)Memory::GetPointer(thread->GetTLSAddress());
111 context.PopulateFromIncomingCommandBuffer(cmd_buf, *Core::CurrentProcess(), handle_table); 110 context.PopulateFromIncomingCommandBuffer(cmd_buf, *Core::CurrentProcess(),
111 kernel.HandleTable());
112 112
113 ResultCode result = RESULT_SUCCESS; 113 ResultCode result = RESULT_SUCCESS;
114 // If the session has been converted to a domain, handle the domain request 114 // If the session has been converted to a domain, handle the domain request
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 099d1053f..5da71cff0 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -12,16 +12,20 @@
12#include "common/logging/log.h" 12#include "common/logging/log.h"
13#include "common/microprofile.h" 13#include "common/microprofile.h"
14#include "common/string_util.h" 14#include "common/string_util.h"
15#include "core/arm/exclusive_monitor.h"
15#include "core/core.h" 16#include "core/core.h"
17#include "core/core_cpu.h"
16#include "core/core_timing.h" 18#include "core/core_timing.h"
17#include "core/hle/kernel/address_arbiter.h" 19#include "core/hle/kernel/address_arbiter.h"
18#include "core/hle/kernel/client_port.h" 20#include "core/hle/kernel/client_port.h"
19#include "core/hle/kernel/client_session.h" 21#include "core/hle/kernel/client_session.h"
20#include "core/hle/kernel/event.h" 22#include "core/hle/kernel/event.h"
21#include "core/hle/kernel/handle_table.h" 23#include "core/hle/kernel/handle_table.h"
24#include "core/hle/kernel/kernel.h"
22#include "core/hle/kernel/mutex.h" 25#include "core/hle/kernel/mutex.h"
23#include "core/hle/kernel/process.h" 26#include "core/hle/kernel/process.h"
24#include "core/hle/kernel/resource_limit.h" 27#include "core/hle/kernel/resource_limit.h"
28#include "core/hle/kernel/scheduler.h"
25#include "core/hle/kernel/shared_memory.h" 29#include "core/hle/kernel/shared_memory.h"
26#include "core/hle/kernel/svc.h" 30#include "core/hle/kernel/svc.h"
27#include "core/hle/kernel/svc_wrap.h" 31#include "core/hle/kernel/svc_wrap.h"
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 520ea0853..3d10d9af2 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -16,6 +16,7 @@
16#include "common/thread_queue_list.h" 16#include "common/thread_queue_list.h"
17#include "core/arm/arm_interface.h" 17#include "core/arm/arm_interface.h"
18#include "core/core.h" 18#include "core/core.h"
19#include "core/core_cpu.h"
19#include "core/core_timing.h" 20#include "core/core_timing.h"
20#include "core/core_timing_util.h" 21#include "core/core_timing_util.h"
21#include "core/hle/kernel/errors.h" 22#include "core/hle/kernel/errors.h"
@@ -23,8 +24,8 @@
23#include "core/hle/kernel/kernel.h" 24#include "core/hle/kernel/kernel.h"
24#include "core/hle/kernel/object.h" 25#include "core/hle/kernel/object.h"
25#include "core/hle/kernel/process.h" 26#include "core/hle/kernel/process.h"
27#include "core/hle/kernel/scheduler.h"
26#include "core/hle/kernel/thread.h" 28#include "core/hle/kernel/thread.h"
27#include "core/hle/lock.h"
28#include "core/hle/result.h" 29#include "core/hle/result.h"
29#include "core/memory.h" 30#include "core/memory.h"
30 31
diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h
index d88a66825..9ba0e2eab 100644
--- a/src/core/hle/service/filesystem/filesystem.h
+++ b/src/core/hle/service/filesystem/filesystem.h
@@ -7,6 +7,7 @@
7#include <memory> 7#include <memory>
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "core/file_sys/directory.h" 9#include "core/file_sys/directory.h"
10#include "core/file_sys/vfs.h"
10#include "core/hle/result.h" 11#include "core/hle/result.h"
11 12
12namespace FileSys { 13namespace FileSys {
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index a53fa6e00..921b899e2 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -11,6 +11,7 @@
11#include "core/file_sys/control_metadata.h" 11#include "core/file_sys/control_metadata.h"
12#include "core/file_sys/romfs_factory.h" 12#include "core/file_sys/romfs_factory.h"
13#include "core/gdbstub/gdbstub.h" 13#include "core/gdbstub/gdbstub.h"
14#include "core/hle/kernel/kernel.h"
14#include "core/hle/kernel/process.h" 15#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/resource_limit.h" 16#include "core/hle/kernel/resource_limit.h"
16#include "core/hle/service/filesystem/filesystem.h" 17#include "core/hle/service/filesystem/filesystem.h"
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 3702a8478..120e1e133 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -10,6 +10,7 @@
10#include "common/file_util.h" 10#include "common/file_util.h"
11#include "common/logging/log.h" 11#include "common/logging/log.h"
12#include "core/core.h" 12#include "core/core.h"
13#include "core/hle/kernel/kernel.h"
13#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
14#include "core/hle/kernel/resource_limit.h" 15#include "core/hle/kernel/resource_limit.h"
15#include "core/loader/elf.h" 16#include "core/loader/elf.h"
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 00205d1d2..77026b850 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -14,6 +14,7 @@
14#include "core/file_sys/control_metadata.h" 14#include "core/file_sys/control_metadata.h"
15#include "core/file_sys/vfs_offset.h" 15#include "core/file_sys/vfs_offset.h"
16#include "core/gdbstub/gdbstub.h" 16#include "core/gdbstub/gdbstub.h"
17#include "core/hle/kernel/kernel.h"
17#include "core/hle/kernel/process.h" 18#include "core/hle/kernel/process.h"
18#include "core/hle/kernel/resource_limit.h" 19#include "core/hle/kernel/resource_limit.h"
19#include "core/loader/nro.h" 20#include "core/loader/nro.h"
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 0c992d662..082a95d40 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -11,6 +11,7 @@
11#include "common/swap.h" 11#include "common/swap.h"
12#include "core/core.h" 12#include "core/core.h"
13#include "core/gdbstub/gdbstub.h" 13#include "core/gdbstub/gdbstub.h"
14#include "core/hle/kernel/kernel.h"
14#include "core/hle/kernel/process.h" 15#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/resource_limit.h" 16#include "core/hle/kernel/resource_limit.h"
16#include "core/loader/nso.h" 17#include "core/loader/nso.h"
diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp
index 93d23de21..7d95816fe 100644
--- a/src/core/perf_stats.cpp
+++ b/src/core/perf_stats.cpp
@@ -40,7 +40,7 @@ void PerfStats::EndGameFrame() {
40 game_frames += 1; 40 game_frames += 1;
41} 41}
42 42
43PerfStats::Results PerfStats::GetAndResetStats(microseconds current_system_time_us) { 43PerfStatsResults PerfStats::GetAndResetStats(microseconds current_system_time_us) {
44 std::lock_guard<std::mutex> lock(object_mutex); 44 std::lock_guard<std::mutex> lock(object_mutex);
45 45
46 const auto now = Clock::now(); 46 const auto now = Clock::now();
@@ -49,7 +49,7 @@ PerfStats::Results PerfStats::GetAndResetStats(microseconds current_system_time_
49 49
50 const auto system_us_per_second = (current_system_time_us - reset_point_system_us) / interval; 50 const auto system_us_per_second = (current_system_time_us - reset_point_system_us) / interval;
51 51
52 Results results{}; 52 PerfStatsResults results{};
53 results.system_fps = static_cast<double>(system_frames) / interval; 53 results.system_fps = static_cast<double>(system_frames) / interval;
54 results.game_fps = static_cast<double>(game_frames) / interval; 54 results.game_fps = static_cast<double>(game_frames) / interval;
55 results.frametime = duration_cast<DoubleSecs>(accumulated_frametime).count() / 55 results.frametime = duration_cast<DoubleSecs>(accumulated_frametime).count() /
diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h
index 6e4619701..222ac1a63 100644
--- a/src/core/perf_stats.h
+++ b/src/core/perf_stats.h
@@ -10,6 +10,17 @@
10 10
11namespace Core { 11namespace Core {
12 12
13struct PerfStatsResults {
14 /// System FPS (LCD VBlanks) in Hz
15 double system_fps;
16 /// Game FPS (GSP frame submissions) in Hz
17 double game_fps;
18 /// Walltime per system frame, in seconds, excluding any waits
19 double frametime;
20 /// Ratio of walltime / emulated time elapsed
21 double emulation_speed;
22};
23
13/** 24/**
14 * Class to manage and query performance/timing statistics. All public functions of this class are 25 * Class to manage and query performance/timing statistics. All public functions of this class are
15 * thread-safe unless stated otherwise. 26 * thread-safe unless stated otherwise.
@@ -18,22 +29,11 @@ class PerfStats {
18public: 29public:
19 using Clock = std::chrono::high_resolution_clock; 30 using Clock = std::chrono::high_resolution_clock;
20 31
21 struct Results {
22 /// System FPS (LCD VBlanks) in Hz
23 double system_fps;
24 /// Game FPS (GSP frame submissions) in Hz
25 double game_fps;
26 /// Walltime per system frame, in seconds, excluding any waits
27 double frametime;
28 /// Ratio of walltime / emulated time elapsed
29 double emulation_speed;
30 };
31
32 void BeginSystemFrame(); 32 void BeginSystemFrame();
33 void EndSystemFrame(); 33 void EndSystemFrame();
34 void EndGameFrame(); 34 void EndGameFrame();
35 35
36 Results GetAndResetStats(std::chrono::microseconds current_system_time_us); 36 PerfStatsResults GetAndResetStats(std::chrono::microseconds current_system_time_us);
37 37
38 /** 38 /**
39 * Gets the ratio between walltime and the emulated time of the previous system frame. This is 39 * Gets the ratio between walltime and the emulated time of the previous system frame. This is
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 827a1bbd0..65571b948 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -7,6 +7,7 @@
7#include "common/file_util.h" 7#include "common/file_util.h"
8 8
9#include "core/core.h" 9#include "core/core.h"
10#include "core/loader/loader.h"
10#include "core/settings.h" 11#include "core/settings.h"
11#include "core/telemetry_session.h" 12#include "core/telemetry_session.h"
12 13
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index f32a79d7b..68ff1e86b 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -5,13 +5,12 @@
5#include <cinttypes> 5#include <cinttypes>
6#include "common/assert.h" 6#include "common/assert.h"
7#include "core/core.h" 7#include "core/core.h"
8#include "core/memory.h"
8#include "video_core/debug_utils/debug_utils.h" 9#include "video_core/debug_utils/debug_utils.h"
9#include "video_core/engines/maxwell_3d.h" 10#include "video_core/engines/maxwell_3d.h"
10#include "video_core/rasterizer_interface.h" 11#include "video_core/rasterizer_interface.h"
11#include "video_core/renderer_base.h" 12#include "video_core/renderer_base.h"
12#include "video_core/textures/decoders.h"
13#include "video_core/textures/texture.h" 13#include "video_core/textures/texture.h"
14#include "video_core/video_core.h"
15 14
16namespace Tegra { 15namespace Tegra {
17namespace Engines { 16namespace Engines {
diff --git a/src/video_core/rasterizer_cache.h b/src/video_core/rasterizer_cache.h
index de1eab86b..083b283b0 100644
--- a/src/video_core/rasterizer_cache.h
+++ b/src/video_core/rasterizer_cache.h
@@ -7,11 +7,10 @@
7#include <set> 7#include <set>
8 8
9#include <boost/icl/interval_map.hpp> 9#include <boost/icl/interval_map.hpp>
10#include <boost/range/iterator_range_core.hpp>
10 11
11#include "common/common_types.h" 12#include "common/common_types.h"
12#include "core/core.h" 13#include "core/core.h"
13#include "core/memory.h"
14#include "video_core/memory_manager.h"
15#include "video_core/rasterizer_interface.h" 14#include "video_core/rasterizer_interface.h"
16#include "video_core/renderer_base.h" 15#include "video_core/renderer_base.h"
17 16
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 3c4a9f17c..411a73d50 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -10,12 +10,14 @@
10#include <glad/glad.h> 10#include <glad/glad.h>
11#include "common/assert.h" 11#include "common/assert.h"
12#include "common/logging/log.h" 12#include "common/logging/log.h"
13#include "common/telemetry.h"
13#include "core/core.h" 14#include "core/core.h"
14#include "core/core_timing.h" 15#include "core/core_timing.h"
15#include "core/frontend/emu_window.h" 16#include "core/frontend/emu_window.h"
16#include "core/memory.h" 17#include "core/memory.h"
17#include "core/perf_stats.h" 18#include "core/perf_stats.h"
18#include "core/settings.h" 19#include "core/settings.h"
20#include "core/telemetry_session.h"
19#include "core/tracer/recorder.h" 21#include "core/tracer/recorder.h"
20#include "video_core/renderer_opengl/gl_rasterizer.h" 22#include "video_core/renderer_opengl/gl_rasterizer.h"
21#include "video_core/renderer_opengl/renderer_opengl.h" 23#include "video_core/renderer_opengl/renderer_opengl.h"
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp
index eac0c05f2..6c2cd967e 100644
--- a/src/yuzu/debugger/wait_tree.cpp
+++ b/src/yuzu/debugger/wait_tree.cpp
@@ -9,11 +9,14 @@
9#include "core/core.h" 9#include "core/core.h"
10#include "core/hle/kernel/event.h" 10#include "core/hle/kernel/event.h"
11#include "core/hle/kernel/handle_table.h" 11#include "core/hle/kernel/handle_table.h"
12#include "core/hle/kernel/kernel.h"
12#include "core/hle/kernel/mutex.h" 13#include "core/hle/kernel/mutex.h"
14#include "core/hle/kernel/scheduler.h"
13#include "core/hle/kernel/thread.h" 15#include "core/hle/kernel/thread.h"
14#include "core/hle/kernel/timer.h" 16#include "core/hle/kernel/timer.h"
15#include "core/hle/kernel/wait_object.h" 17#include "core/hle/kernel/wait_object.h"
16 18
19WaitTreeItem::WaitTreeItem() = default;
17WaitTreeItem::~WaitTreeItem() = default; 20WaitTreeItem::~WaitTreeItem() = default;
18 21
19QColor WaitTreeItem::GetColor() const { 22QColor WaitTreeItem::GetColor() const {
@@ -71,6 +74,7 @@ std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList()
71} 74}
72 75
73WaitTreeText::WaitTreeText(const QString& t) : text(t) {} 76WaitTreeText::WaitTreeText(const QString& t) : text(t) {}
77WaitTreeText::~WaitTreeText() = default;
74 78
75QString WaitTreeText::GetText() const { 79QString WaitTreeText::GetText() const {
76 return text; 80 return text;
@@ -84,6 +88,8 @@ WaitTreeMutexInfo::WaitTreeMutexInfo(VAddr mutex_address) : mutex_address(mutex_
84 owner = handle_table.Get<Kernel::Thread>(owner_handle); 88 owner = handle_table.Get<Kernel::Thread>(owner_handle);
85} 89}
86 90
91WaitTreeMutexInfo::~WaitTreeMutexInfo() = default;
92
87QString WaitTreeMutexInfo::GetText() const { 93QString WaitTreeMutexInfo::GetText() const {
88 return tr("waiting for mutex 0x%1").arg(mutex_address, 16, 16, QLatin1Char('0')); 94 return tr("waiting for mutex 0x%1").arg(mutex_address, 16, 16, QLatin1Char('0'));
89} 95}
@@ -102,6 +108,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeMutexInfo::GetChildren() cons
102} 108}
103 109
104WaitTreeCallstack::WaitTreeCallstack(const Kernel::Thread& thread) : thread(thread) {} 110WaitTreeCallstack::WaitTreeCallstack(const Kernel::Thread& thread) : thread(thread) {}
111WaitTreeCallstack::~WaitTreeCallstack() = default;
105 112
106QString WaitTreeCallstack::GetText() const { 113QString WaitTreeCallstack::GetText() const {
107 return tr("Call stack"); 114 return tr("Call stack");
@@ -126,6 +133,10 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeCallstack::GetChildren() cons
126} 133}
127 134
128WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {} 135WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {}
136WaitTreeWaitObject::~WaitTreeWaitObject() = default;
137
138WaitTreeExpandableItem::WaitTreeExpandableItem() = default;
139WaitTreeExpandableItem::~WaitTreeExpandableItem() = default;
129 140
130bool WaitTreeExpandableItem::IsExpandable() const { 141bool WaitTreeExpandableItem::IsExpandable() const {
131 return true; 142 return true;
@@ -180,6 +191,8 @@ WaitTreeObjectList::WaitTreeObjectList(
180 const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list, bool w_all) 191 const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list, bool w_all)
181 : object_list(list), wait_all(w_all) {} 192 : object_list(list), wait_all(w_all) {}
182 193
194WaitTreeObjectList::~WaitTreeObjectList() = default;
195
183QString WaitTreeObjectList::GetText() const { 196QString WaitTreeObjectList::GetText() const {
184 if (wait_all) 197 if (wait_all)
185 return tr("waiting for all objects"); 198 return tr("waiting for all objects");
@@ -194,6 +207,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeObjectList::GetChildren() con
194} 207}
195 208
196WaitTreeThread::WaitTreeThread(const Kernel::Thread& thread) : WaitTreeWaitObject(thread) {} 209WaitTreeThread::WaitTreeThread(const Kernel::Thread& thread) : WaitTreeWaitObject(thread) {}
210WaitTreeThread::~WaitTreeThread() = default;
197 211
198QString WaitTreeThread::GetText() const { 212QString WaitTreeThread::GetText() const {
199 const auto& thread = static_cast<const Kernel::Thread&>(object); 213 const auto& thread = static_cast<const Kernel::Thread&>(object);
@@ -312,6 +326,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {
312} 326}
313 327
314WaitTreeEvent::WaitTreeEvent(const Kernel::Event& object) : WaitTreeWaitObject(object) {} 328WaitTreeEvent::WaitTreeEvent(const Kernel::Event& object) : WaitTreeWaitObject(object) {}
329WaitTreeEvent::~WaitTreeEvent() = default;
315 330
316std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const { 331std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const {
317 std::vector<std::unique_ptr<WaitTreeItem>> list(WaitTreeWaitObject::GetChildren()); 332 std::vector<std::unique_ptr<WaitTreeItem>> list(WaitTreeWaitObject::GetChildren());
@@ -323,6 +338,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const {
323} 338}
324 339
325WaitTreeTimer::WaitTreeTimer(const Kernel::Timer& object) : WaitTreeWaitObject(object) {} 340WaitTreeTimer::WaitTreeTimer(const Kernel::Timer& object) : WaitTreeWaitObject(object) {}
341WaitTreeTimer::~WaitTreeTimer() = default;
326 342
327std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeTimer::GetChildren() const { 343std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeTimer::GetChildren() const {
328 std::vector<std::unique_ptr<WaitTreeItem>> list(WaitTreeWaitObject::GetChildren()); 344 std::vector<std::unique_ptr<WaitTreeItem>> list(WaitTreeWaitObject::GetChildren());
@@ -340,6 +356,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeTimer::GetChildren() const {
340 356
341WaitTreeThreadList::WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list) 357WaitTreeThreadList::WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list)
342 : thread_list(list) {} 358 : thread_list(list) {}
359WaitTreeThreadList::~WaitTreeThreadList() = default;
343 360
344QString WaitTreeThreadList::GetText() const { 361QString WaitTreeThreadList::GetText() const {
345 return tr("waited by thread"); 362 return tr("waited by thread");
@@ -353,6 +370,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThreadList::GetChildren() con
353} 370}
354 371
355WaitTreeModel::WaitTreeModel(QObject* parent) : QAbstractItemModel(parent) {} 372WaitTreeModel::WaitTreeModel(QObject* parent) : QAbstractItemModel(parent) {}
373WaitTreeModel::~WaitTreeModel() = default;
356 374
357QModelIndex WaitTreeModel::index(int row, int column, const QModelIndex& parent) const { 375QModelIndex WaitTreeModel::index(int row, int column, const QModelIndex& parent) const {
358 if (!hasIndex(row, column, parent)) 376 if (!hasIndex(row, column, parent))
@@ -421,6 +439,8 @@ WaitTreeWidget::WaitTreeWidget(QWidget* parent) : QDockWidget(tr("Wait Tree"), p
421 setEnabled(false); 439 setEnabled(false);
422} 440}
423 441
442WaitTreeWidget::~WaitTreeWidget() = default;
443
424void WaitTreeWidget::OnDebugModeEntered() { 444void WaitTreeWidget::OnDebugModeEntered() {
425 if (!Core::System::GetInstance().IsPoweredOn()) 445 if (!Core::System::GetInstance().IsPoweredOn())
426 return; 446 return;
diff --git a/src/yuzu/debugger/wait_tree.h b/src/yuzu/debugger/wait_tree.h
index 513b3c45d..defbf734f 100644
--- a/src/yuzu/debugger/wait_tree.h
+++ b/src/yuzu/debugger/wait_tree.h
@@ -4,11 +4,15 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <cstddef>
8#include <memory>
9#include <vector>
10
7#include <QAbstractItemModel> 11#include <QAbstractItemModel>
8#include <QDockWidget> 12#include <QDockWidget>
9#include <QTreeView> 13#include <QTreeView>
10#include <boost/container/flat_set.hpp> 14#include <boost/container/flat_set.hpp>
11#include "core/core.h" 15#include "common/common_types.h"
12#include "core/hle/kernel/object.h" 16#include "core/hle/kernel/object.h"
13 17
14class EmuThread; 18class EmuThread;
@@ -25,6 +29,7 @@ class WaitTreeThread;
25class WaitTreeItem : public QObject { 29class WaitTreeItem : public QObject {
26 Q_OBJECT 30 Q_OBJECT
27public: 31public:
32 WaitTreeItem();
28 ~WaitTreeItem() override; 33 ~WaitTreeItem() override;
29 34
30 virtual bool IsExpandable() const; 35 virtual bool IsExpandable() const;
@@ -49,6 +54,8 @@ class WaitTreeText : public WaitTreeItem {
49 Q_OBJECT 54 Q_OBJECT
50public: 55public:
51 explicit WaitTreeText(const QString& text); 56 explicit WaitTreeText(const QString& text);
57 ~WaitTreeText() override;
58
52 QString GetText() const override; 59 QString GetText() const override;
53 60
54private: 61private:
@@ -58,6 +65,9 @@ private:
58class WaitTreeExpandableItem : public WaitTreeItem { 65class WaitTreeExpandableItem : public WaitTreeItem {
59 Q_OBJECT 66 Q_OBJECT
60public: 67public:
68 WaitTreeExpandableItem();
69 ~WaitTreeExpandableItem() override;
70
61 bool IsExpandable() const override; 71 bool IsExpandable() const override;
62}; 72};
63 73
@@ -65,6 +75,8 @@ class WaitTreeMutexInfo : public WaitTreeExpandableItem {
65 Q_OBJECT 75 Q_OBJECT
66public: 76public:
67 explicit WaitTreeMutexInfo(VAddr mutex_address); 77 explicit WaitTreeMutexInfo(VAddr mutex_address);
78 ~WaitTreeMutexInfo() override;
79
68 QString GetText() const override; 80 QString GetText() const override;
69 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 81 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
70 82
@@ -79,6 +91,8 @@ class WaitTreeCallstack : public WaitTreeExpandableItem {
79 Q_OBJECT 91 Q_OBJECT
80public: 92public:
81 explicit WaitTreeCallstack(const Kernel::Thread& thread); 93 explicit WaitTreeCallstack(const Kernel::Thread& thread);
94 ~WaitTreeCallstack() override;
95
82 QString GetText() const override; 96 QString GetText() const override;
83 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 97 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
84 98
@@ -90,6 +104,8 @@ class WaitTreeWaitObject : public WaitTreeExpandableItem {
90 Q_OBJECT 104 Q_OBJECT
91public: 105public:
92 explicit WaitTreeWaitObject(const Kernel::WaitObject& object); 106 explicit WaitTreeWaitObject(const Kernel::WaitObject& object);
107 ~WaitTreeWaitObject() override;
108
93 static std::unique_ptr<WaitTreeWaitObject> make(const Kernel::WaitObject& object); 109 static std::unique_ptr<WaitTreeWaitObject> make(const Kernel::WaitObject& object);
94 QString GetText() const override; 110 QString GetText() const override;
95 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 111 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
@@ -105,6 +121,8 @@ class WaitTreeObjectList : public WaitTreeExpandableItem {
105public: 121public:
106 WaitTreeObjectList(const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list, 122 WaitTreeObjectList(const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list,
107 bool wait_all); 123 bool wait_all);
124 ~WaitTreeObjectList() override;
125
108 QString GetText() const override; 126 QString GetText() const override;
109 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 127 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
110 128
@@ -117,6 +135,8 @@ class WaitTreeThread : public WaitTreeWaitObject {
117 Q_OBJECT 135 Q_OBJECT
118public: 136public:
119 explicit WaitTreeThread(const Kernel::Thread& thread); 137 explicit WaitTreeThread(const Kernel::Thread& thread);
138 ~WaitTreeThread() override;
139
120 QString GetText() const override; 140 QString GetText() const override;
121 QColor GetColor() const override; 141 QColor GetColor() const override;
122 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 142 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
@@ -126,6 +146,8 @@ class WaitTreeEvent : public WaitTreeWaitObject {
126 Q_OBJECT 146 Q_OBJECT
127public: 147public:
128 explicit WaitTreeEvent(const Kernel::Event& object); 148 explicit WaitTreeEvent(const Kernel::Event& object);
149 ~WaitTreeEvent() override;
150
129 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 151 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
130}; 152};
131 153
@@ -133,6 +155,8 @@ class WaitTreeTimer : public WaitTreeWaitObject {
133 Q_OBJECT 155 Q_OBJECT
134public: 156public:
135 explicit WaitTreeTimer(const Kernel::Timer& object); 157 explicit WaitTreeTimer(const Kernel::Timer& object);
158 ~WaitTreeTimer() override;
159
136 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 160 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
137}; 161};
138 162
@@ -140,6 +164,8 @@ class WaitTreeThreadList : public WaitTreeExpandableItem {
140 Q_OBJECT 164 Q_OBJECT
141public: 165public:
142 explicit WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list); 166 explicit WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list);
167 ~WaitTreeThreadList() override;
168
143 QString GetText() const override; 169 QString GetText() const override;
144 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 170 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
145 171
@@ -152,6 +178,7 @@ class WaitTreeModel : public QAbstractItemModel {
152 178
153public: 179public:
154 explicit WaitTreeModel(QObject* parent = nullptr); 180 explicit WaitTreeModel(QObject* parent = nullptr);
181 ~WaitTreeModel() override;
155 182
156 QVariant data(const QModelIndex& index, int role) const override; 183 QVariant data(const QModelIndex& index, int role) const override;
157 QModelIndex index(int row, int column, const QModelIndex& parent) const override; 184 QModelIndex index(int row, int column, const QModelIndex& parent) const override;
@@ -171,6 +198,7 @@ class WaitTreeWidget : public QDockWidget {
171 198
172public: 199public:
173 explicit WaitTreeWidget(QWidget* parent = nullptr); 200 explicit WaitTreeWidget(QWidget* parent = nullptr);
201 ~WaitTreeWidget() override;
174 202
175public slots: 203public slots:
176 void OnDebugModeEntered(); 204 void OnDebugModeEntered();
diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp
index 27525938a..d15242d59 100644
--- a/src/yuzu/game_list.cpp
+++ b/src/yuzu/game_list.cpp
@@ -23,10 +23,12 @@
23#include "core/file_sys/registered_cache.h" 23#include "core/file_sys/registered_cache.h"
24#include "core/file_sys/romfs.h" 24#include "core/file_sys/romfs.h"
25#include "core/file_sys/vfs_real.h" 25#include "core/file_sys/vfs_real.h"
26#include "core/hle/service/filesystem/filesystem.h"
26#include "core/loader/loader.h" 27#include "core/loader/loader.h"
27#include "game_list.h" 28#include "yuzu/game_list.h"
28#include "game_list_p.h" 29#include "yuzu/game_list_p.h"
29#include "ui_settings.h" 30#include "yuzu/main.h"
31#include "yuzu/ui_settings.h"
30 32
31GameList::SearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist) : gamelist{gamelist} {} 33GameList::SearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist) : gamelist{gamelist} {}
32 34
@@ -481,6 +483,14 @@ static void GetMetadataFromControlNCA(const std::shared_ptr<FileSys::NCA>& nca,
481 } 483 }
482} 484}
483 485
486GameListWorker::GameListWorker(
487 FileSys::VirtualFilesystem vfs, QString dir_path, bool deep_scan,
488 const std::unordered_map<std::string, std::pair<QString, QString>>& compatibility_list)
489 : vfs(std::move(vfs)), dir_path(std::move(dir_path)), deep_scan(deep_scan),
490 compatibility_list(compatibility_list) {}
491
492GameListWorker::~GameListWorker() = default;
493
484void GameListWorker::AddInstalledTitlesToGameList(std::shared_ptr<FileSys::RegisteredCache> cache) { 494void GameListWorker::AddInstalledTitlesToGameList(std::shared_ptr<FileSys::RegisteredCache> cache) {
485 const auto installed_games = cache->ListEntriesFilter(FileSys::TitleType::Application, 495 const auto installed_games = cache->ListEntriesFilter(FileSys::TitleType::Application,
486 FileSys::ContentRecordType::Program); 496 FileSys::ContentRecordType::Program);
diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h
index c01351dc9..6a5c2f5f8 100644
--- a/src/yuzu/game_list.h
+++ b/src/yuzu/game_list.h
@@ -4,6 +4,8 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <unordered_map>
8
7#include <QFileSystemWatcher> 9#include <QFileSystemWatcher>
8#include <QHBoxLayout> 10#include <QHBoxLayout>
9#include <QLabel> 11#include <QLabel>
@@ -17,9 +19,13 @@
17#include <QTreeView> 19#include <QTreeView>
18#include <QVBoxLayout> 20#include <QVBoxLayout>
19#include <QWidget> 21#include <QWidget>
20#include "main.h"
21 22
22class GameListWorker; 23class GameListWorker;
24class GMainWindow;
25
26namespace FileSys {
27class VfsFilesystem;
28}
23 29
24enum class GameListOpenTarget { SaveData }; 30enum class GameListOpenTarget { SaveData };
25 31
@@ -62,7 +68,7 @@ public:
62 QToolButton* button_filter_close = nullptr; 68 QToolButton* button_filter_close = nullptr;
63 }; 69 };
64 70
65 explicit GameList(FileSys::VirtualFilesystem vfs, GMainWindow* parent = nullptr); 71 explicit GameList(std::shared_ptr<FileSys::VfsFilesystem> vfs, GMainWindow* parent = nullptr);
66 ~GameList() override; 72 ~GameList() override;
67 73
68 void clearFilter(); 74 void clearFilter();
@@ -97,7 +103,7 @@ private:
97 void PopupContextMenu(const QPoint& menu_location); 103 void PopupContextMenu(const QPoint& menu_location);
98 void RefreshGameDirectory(); 104 void RefreshGameDirectory();
99 105
100 FileSys::VirtualFilesystem vfs; 106 std::shared_ptr<FileSys::VfsFilesystem> vfs;
101 SearchField* search_field; 107 SearchField* search_field;
102 GMainWindow* main_window = nullptr; 108 GMainWindow* main_window = nullptr;
103 QVBoxLayout* layout = nullptr; 109 QVBoxLayout* layout = nullptr;
diff --git a/src/yuzu/game_list_p.h b/src/yuzu/game_list_p.h
index b9676d069..3624cb21a 100644
--- a/src/yuzu/game_list_p.h
+++ b/src/yuzu/game_list_p.h
@@ -18,10 +18,15 @@
18#include <QString> 18#include <QString>
19#include "common/logging/log.h" 19#include "common/logging/log.h"
20#include "common/string_util.h" 20#include "common/string_util.h"
21#include "core/file_sys/content_archive.h" 21#include "yuzu/ui_settings.h"
22#include "ui_settings.h"
23#include "yuzu/util/util.h" 22#include "yuzu/util/util.h"
24 23
24namespace FileSys {
25class NCA;
26class RegisteredCache;
27class VfsFilesystem;
28} // namespace FileSys
29
25/** 30/**
26 * Gets the default icon (for games without valid SMDH) 31 * Gets the default icon (for games without valid SMDH)
27 * @param large If true, returns large icon (48x48), otherwise returns small icon (24x24) 32 * @param large If true, returns large icon (48x48), otherwise returns small icon (24x24)
@@ -196,10 +201,9 @@ class GameListWorker : public QObject, public QRunnable {
196 201
197public: 202public:
198 GameListWorker( 203 GameListWorker(
199 FileSys::VirtualFilesystem vfs, QString dir_path, bool deep_scan, 204 std::shared_ptr<FileSys::VfsFilesystem> vfs, QString dir_path, bool deep_scan,
200 const std::unordered_map<std::string, std::pair<QString, QString>>& compatibility_list) 205 const std::unordered_map<std::string, std::pair<QString, QString>>& compatibility_list);
201 : vfs(std::move(vfs)), dir_path(std::move(dir_path)), deep_scan(deep_scan), 206 ~GameListWorker() override;
202 compatibility_list(compatibility_list) {}
203 207
204public slots: 208public slots:
205 /// Starts the processing of directory tree information. 209 /// Starts the processing of directory tree information.
@@ -222,7 +226,7 @@ signals:
222 void Finished(QStringList watch_list); 226 void Finished(QStringList watch_list);
223 227
224private: 228private:
225 FileSys::VirtualFilesystem vfs; 229 std::shared_ptr<FileSys::VfsFilesystem> vfs;
226 std::map<u64, std::shared_ptr<FileSys::NCA>> nca_control_map; 230 std::map<u64, std::shared_ptr<FileSys::NCA>> nca_control_map;
227 QStringList watch_list; 231 QStringList watch_list;
228 QString dir_path; 232 QString dir_path;
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 1501aedc4..e11ba7854 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -21,22 +21,22 @@
21#include "common/logging/backend.h" 21#include "common/logging/backend.h"
22#include "common/logging/filter.h" 22#include "common/logging/filter.h"
23#include "common/logging/log.h" 23#include "common/logging/log.h"
24#include "common/logging/text_formatter.h"
25#include "common/microprofile.h" 24#include "common/microprofile.h"
26#include "common/scm_rev.h" 25#include "common/scm_rev.h"
27#include "common/scope_exit.h" 26#include "common/scope_exit.h"
28#include "common/string_util.h" 27#include "common/string_util.h"
28#include "common/telemetry.h"
29#include "core/core.h" 29#include "core/core.h"
30#include "core/crypto/key_manager.h" 30#include "core/crypto/key_manager.h"
31#include "core/file_sys/bis_factory.h"
32#include "core/file_sys/card_image.h" 31#include "core/file_sys/card_image.h"
33#include "core/file_sys/registered_cache.h" 32#include "core/file_sys/registered_cache.h"
34#include "core/file_sys/savedata_factory.h" 33#include "core/file_sys/savedata_factory.h"
35#include "core/file_sys/vfs_real.h" 34#include "core/file_sys/vfs_real.h"
36#include "core/gdbstub/gdbstub.h" 35#include "core/hle/service/filesystem/filesystem.h"
37#include "core/loader/loader.h" 36#include "core/loader/loader.h"
37#include "core/perf_stats.h"
38#include "core/settings.h" 38#include "core/settings.h"
39#include "game_list_p.h" 39#include "core/telemetry_session.h"
40#include "video_core/debug_utils/debug_utils.h" 40#include "video_core/debug_utils/debug_utils.h"
41#include "yuzu/about_dialog.h" 41#include "yuzu/about_dialog.h"
42#include "yuzu/bootmanager.h" 42#include "yuzu/bootmanager.h"
@@ -48,6 +48,7 @@
48#include "yuzu/debugger/profiler.h" 48#include "yuzu/debugger/profiler.h"
49#include "yuzu/debugger/wait_tree.h" 49#include "yuzu/debugger/wait_tree.h"
50#include "yuzu/game_list.h" 50#include "yuzu/game_list.h"
51#include "yuzu/game_list_p.h"
51#include "yuzu/hotkeys.h" 52#include "yuzu/hotkeys.h"
52#include "yuzu/main.h" 53#include "yuzu/main.h"
53#include "yuzu/ui_settings.h" 54#include "yuzu/ui_settings.h"
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index fd2436f4d..0b97e8220 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -5,6 +5,7 @@
5#pragma once 5#pragma once
6 6
7#include <memory> 7#include <memory>
8#include <unordered_map>
8#include <QMainWindow> 9#include <QMainWindow>
9#include <QTimer> 10#include <QTimer>
10#include "core/core.h" 11#include "core/core.h"
@@ -23,6 +24,10 @@ class ProfilerWidget;
23class WaitTreeWidget; 24class WaitTreeWidget;
24enum class GameListOpenTarget; 25enum class GameListOpenTarget;
25 26
27namespace FileSys {
28class VfsFilesystem;
29}
30
26namespace Tegra { 31namespace Tegra {
27class DebugContext; 32class DebugContext;
28} 33}
@@ -169,7 +174,7 @@ private:
169 QString game_path; 174 QString game_path;
170 175
171 // FS 176 // FS
172 FileSys::VirtualFilesystem vfs; 177 std::shared_ptr<FileSys::VfsFilesystem> vfs;
173 178
174 // Debugger panes 179 // Debugger panes
175 ProfilerWidget* profilerWidget; 180 ProfilerWidget* profilerWidget;
diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp
index 9095cf27d..41e7da897 100644
--- a/src/yuzu_cmd/yuzu.cpp
+++ b/src/yuzu_cmd/yuzu.cpp
@@ -17,10 +17,13 @@
17#include "common/scm_rev.h" 17#include "common/scm_rev.h"
18#include "common/scope_exit.h" 18#include "common/scope_exit.h"
19#include "common/string_util.h" 19#include "common/string_util.h"
20#include "common/telemetry.h"
20#include "core/core.h" 21#include "core/core.h"
22#include "core/file_sys/vfs_real.h"
21#include "core/gdbstub/gdbstub.h" 23#include "core/gdbstub/gdbstub.h"
22#include "core/loader/loader.h" 24#include "core/loader/loader.h"
23#include "core/settings.h" 25#include "core/settings.h"
26#include "core/telemetry_session.h"
24#include "yuzu_cmd/config.h" 27#include "yuzu_cmd/config.h"
25#include "yuzu_cmd/emu_window/emu_window_sdl2.h" 28#include "yuzu_cmd/emu_window/emu_window_sdl2.h"
26 29