summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/stream.cpp7
-rw-r--r--src/audio_core/stream.h22
-rw-r--r--src/common/threadsafe_queue.h35
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp6
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp4
-rw-r--r--src/core/core.cpp6
-rw-r--r--src/core/core_cpu.cpp6
-rw-r--r--src/core/core_timing.cpp14
-rw-r--r--src/core/core_timing.h4
-rw-r--r--src/core/core_timing_util.cpp4
-rw-r--r--src/core/core_timing_util.h4
-rw-r--r--src/core/hle/kernel/kernel.cpp6
-rw-r--r--src/core/hle/kernel/kernel.h4
-rw-r--r--src/core/hle/kernel/scheduler.cpp2
-rw-r--r--src/core/hle/kernel/svc.cpp8
-rw-r--r--src/core/hle/kernel/thread.cpp13
-rw-r--r--src/core/hle/service/hid/controllers/debug_pad.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/gesture.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/keyboard.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/mouse.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/stubbed.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/touchscreen.cpp4
-rw-r--r--src/core/hle/service/hid/controllers/xpad.cpp2
-rw-r--r--src/core/hle/service/hid/hid.cpp19
-rw-r--r--src/core/hle/service/hid/hid.h4
-rw-r--r--src/core/hle/service/hid/irs.cpp2
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp2
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h4
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp10
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.h6
-rw-r--r--src/core/hle/service/time/time.cpp6
-rw-r--r--src/tests/core/core_timing.cpp169
-rw-r--r--src/video_core/CMakeLists.txt4
-rw-r--r--src/video_core/engines/kepler_compute.cpp34
-rw-r--r--src/video_core/engines/kepler_compute.h (renamed from src/video_core/engines/maxwell_compute.h)31
-rw-r--r--src/video_core/engines/maxwell_3d.cpp2
-rw-r--r--src/video_core/engines/maxwell_compute.cpp28
-rw-r--r--src/video_core/gpu.cpp11
-rw-r--r--src/video_core/gpu.h7
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp6
-rw-r--r--src/video_core/surface.cpp2
42 files changed, 258 insertions, 252 deletions
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp
index 4ce2d374e..8ab5649df 100644
--- a/src/audio_core/stream.cpp
+++ b/src/audio_core/stream.cpp
@@ -37,7 +37,7 @@ Stream::Stream(u32 sample_rate, Format format, ReleaseCallback&& release_callbac
37 : sample_rate{sample_rate}, format{format}, release_callback{std::move(release_callback)}, 37 : sample_rate{sample_rate}, format{format}, release_callback{std::move(release_callback)},
38 sink_stream{sink_stream}, name{std::move(name_)} { 38 sink_stream{sink_stream}, name{std::move(name_)} {
39 39
40 release_event = CoreTiming::RegisterEvent( 40 release_event = Core::Timing::RegisterEvent(
41 name, [this](u64 userdata, int cycles_late) { ReleaseActiveBuffer(); }); 41 name, [this](u64 userdata, int cycles_late) { ReleaseActiveBuffer(); });
42} 42}
43 43
@@ -57,7 +57,7 @@ Stream::State Stream::GetState() const {
57 57
58s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const { 58s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const {
59 const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; 59 const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()};
60 return CoreTiming::usToCycles((static_cast<u64>(num_samples) * 1000000) / sample_rate); 60 return Core::Timing::usToCycles((static_cast<u64>(num_samples) * 1000000) / sample_rate);
61} 61}
62 62
63static void VolumeAdjustSamples(std::vector<s16>& samples) { 63static void VolumeAdjustSamples(std::vector<s16>& samples) {
@@ -99,7 +99,8 @@ void Stream::PlayNextBuffer() {
99 99
100 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); 100 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples());
101 101
102 CoreTiming::ScheduleEventThreadsafe(GetBufferReleaseCycles(*active_buffer), release_event, {}); 102 Core::Timing::ScheduleEventThreadsafe(GetBufferReleaseCycles(*active_buffer), release_event,
103 {});
103} 104}
104 105
105void Stream::ReleaseActiveBuffer() { 106void Stream::ReleaseActiveBuffer() {
diff --git a/src/audio_core/stream.h b/src/audio_core/stream.h
index aebfeb51d..caa775544 100644
--- a/src/audio_core/stream.h
+++ b/src/audio_core/stream.h
@@ -13,7 +13,7 @@
13#include "audio_core/buffer.h" 13#include "audio_core/buffer.h"
14#include "common/common_types.h" 14#include "common/common_types.h"
15 15
16namespace CoreTiming { 16namespace Core::Timing {
17struct EventType; 17struct EventType;
18} 18}
19 19
@@ -91,16 +91,16 @@ private:
91 /// Gets the number of core cycles when the specified buffer will be released 91 /// Gets the number of core cycles when the specified buffer will be released
92 s64 GetBufferReleaseCycles(const Buffer& buffer) const; 92 s64 GetBufferReleaseCycles(const Buffer& buffer) const;
93 93
94 u32 sample_rate; ///< Sample rate of the stream 94 u32 sample_rate; ///< Sample rate of the stream
95 Format format; ///< Format of the stream 95 Format format; ///< Format of the stream
96 ReleaseCallback release_callback; ///< Buffer release callback for the stream 96 ReleaseCallback release_callback; ///< Buffer release callback for the stream
97 State state{State::Stopped}; ///< Playback state of the stream 97 State state{State::Stopped}; ///< Playback state of the stream
98 CoreTiming::EventType* release_event{}; ///< Core timing release event for the stream 98 Core::Timing::EventType* release_event{}; ///< Core timing release event for the stream
99 BufferPtr active_buffer; ///< Actively playing buffer in the stream 99 BufferPtr active_buffer; ///< Actively playing buffer in the stream
100 std::queue<BufferPtr> queued_buffers; ///< Buffers queued to be played in the stream 100 std::queue<BufferPtr> queued_buffers; ///< Buffers queued to be played in the stream
101 std::queue<BufferPtr> released_buffers; ///< Buffers recently released from the stream 101 std::queue<BufferPtr> released_buffers; ///< Buffers recently released from the stream
102 SinkStream& sink_stream; ///< Output sink for the stream 102 SinkStream& sink_stream; ///< Output sink for the stream
103 std::string name; ///< Name of the stream, must be unique 103 std::string name; ///< Name of the stream, must be unique
104}; 104};
105 105
106using StreamPtr = std::shared_ptr<Stream>; 106using StreamPtr = std::shared_ptr<Stream>;
diff --git a/src/common/threadsafe_queue.h b/src/common/threadsafe_queue.h
index edf13bc49..f553efdc9 100644
--- a/src/common/threadsafe_queue.h
+++ b/src/common/threadsafe_queue.h
@@ -7,17 +7,16 @@
7// a simple lockless thread-safe, 7// a simple lockless thread-safe,
8// single reader, single writer queue 8// single reader, single writer queue
9 9
10#include <algorithm>
11#include <atomic> 10#include <atomic>
12#include <cstddef> 11#include <cstddef>
13#include <mutex> 12#include <mutex>
14#include "common/common_types.h" 13#include <utility>
15 14
16namespace Common { 15namespace Common {
17template <typename T, bool NeedSize = true> 16template <typename T>
18class SPSCQueue { 17class SPSCQueue {
19public: 18public:
20 SPSCQueue() : size(0) { 19 SPSCQueue() {
21 write_ptr = read_ptr = new ElementPtr(); 20 write_ptr = read_ptr = new ElementPtr();
22 } 21 }
23 ~SPSCQueue() { 22 ~SPSCQueue() {
@@ -25,13 +24,12 @@ public:
25 delete read_ptr; 24 delete read_ptr;
26 } 25 }
27 26
28 u32 Size() const { 27 std::size_t Size() const {
29 static_assert(NeedSize, "using Size() on FifoQueue without NeedSize");
30 return size.load(); 28 return size.load();
31 } 29 }
32 30
33 bool Empty() const { 31 bool Empty() const {
34 return !read_ptr->next.load(); 32 return Size() == 0;
35 } 33 }
36 34
37 T& Front() const { 35 T& Front() const {
@@ -47,13 +45,13 @@ public:
47 ElementPtr* new_ptr = new ElementPtr(); 45 ElementPtr* new_ptr = new ElementPtr();
48 write_ptr->next.store(new_ptr, std::memory_order_release); 46 write_ptr->next.store(new_ptr, std::memory_order_release);
49 write_ptr = new_ptr; 47 write_ptr = new_ptr;
50 if (NeedSize) 48
51 size++; 49 ++size;
52 } 50 }
53 51
54 void Pop() { 52 void Pop() {
55 if (NeedSize) 53 --size;
56 size--; 54
57 ElementPtr* tmpptr = read_ptr; 55 ElementPtr* tmpptr = read_ptr;
58 // advance the read pointer 56 // advance the read pointer
59 read_ptr = tmpptr->next.load(); 57 read_ptr = tmpptr->next.load();
@@ -66,8 +64,7 @@ public:
66 if (Empty()) 64 if (Empty())
67 return false; 65 return false;
68 66
69 if (NeedSize) 67 --size;
70 size--;
71 68
72 ElementPtr* tmpptr = read_ptr; 69 ElementPtr* tmpptr = read_ptr;
73 read_ptr = tmpptr->next.load(std::memory_order_acquire); 70 read_ptr = tmpptr->next.load(std::memory_order_acquire);
@@ -89,7 +86,7 @@ private:
89 // and a pointer to the next ElementPtr 86 // and a pointer to the next ElementPtr
90 class ElementPtr { 87 class ElementPtr {
91 public: 88 public:
92 ElementPtr() : next(nullptr) {} 89 ElementPtr() {}
93 ~ElementPtr() { 90 ~ElementPtr() {
94 ElementPtr* next_ptr = next.load(); 91 ElementPtr* next_ptr = next.load();
95 92
@@ -98,21 +95,21 @@ private:
98 } 95 }
99 96
100 T current; 97 T current;
101 std::atomic<ElementPtr*> next; 98 std::atomic<ElementPtr*> next{nullptr};
102 }; 99 };
103 100
104 ElementPtr* write_ptr; 101 ElementPtr* write_ptr;
105 ElementPtr* read_ptr; 102 ElementPtr* read_ptr;
106 std::atomic<u32> size; 103 std::atomic_size_t size{0};
107}; 104};
108 105
109// a simple thread-safe, 106// a simple thread-safe,
110// single reader, multiple writer queue 107// single reader, multiple writer queue
111 108
112template <typename T, bool NeedSize = true> 109template <typename T>
113class MPSCQueue { 110class MPSCQueue {
114public: 111public:
115 u32 Size() const { 112 std::size_t Size() const {
116 return spsc_queue.Size(); 113 return spsc_queue.Size();
117 } 114 }
118 115
@@ -144,7 +141,7 @@ public:
144 } 141 }
145 142
146private: 143private:
147 SPSCQueue<T, NeedSize> spsc_queue; 144 SPSCQueue<T> spsc_queue;
148 std::mutex write_lock; 145 std::mutex write_lock;
149}; 146};
150} // namespace Common 147} // namespace Common
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index afbda8d8b..f28951f8a 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -112,14 +112,14 @@ public:
112 // Always execute at least one tick. 112 // Always execute at least one tick.
113 amortized_ticks = std::max<u64>(amortized_ticks, 1); 113 amortized_ticks = std::max<u64>(amortized_ticks, 1);
114 114
115 CoreTiming::AddTicks(amortized_ticks); 115 Timing::AddTicks(amortized_ticks);
116 num_interpreted_instructions = 0; 116 num_interpreted_instructions = 0;
117 } 117 }
118 u64 GetTicksRemaining() override { 118 u64 GetTicksRemaining() override {
119 return std::max(CoreTiming::GetDowncount(), 0); 119 return std::max(Timing::GetDowncount(), 0);
120 } 120 }
121 u64 GetCNTPCT() override { 121 u64 GetCNTPCT() override {
122 return CoreTiming::GetTicks(); 122 return Timing::GetTicks();
123 } 123 }
124 124
125 ARM_Dynarmic& parent; 125 ARM_Dynarmic& parent;
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index c455c81fb..c36c15c02 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -177,7 +177,7 @@ void ARM_Unicorn::Run() {
177 if (GDBStub::IsServerEnabled()) { 177 if (GDBStub::IsServerEnabled()) {
178 ExecuteInstructions(std::max(4000000, 0)); 178 ExecuteInstructions(std::max(4000000, 0));
179 } else { 179 } else {
180 ExecuteInstructions(std::max(CoreTiming::GetDowncount(), 0)); 180 ExecuteInstructions(std::max(Timing::GetDowncount(), 0));
181 } 181 }
182} 182}
183 183
@@ -190,7 +190,7 @@ MICROPROFILE_DEFINE(ARM_Jit_Unicorn, "ARM JIT", "Unicorn", MP_RGB(255, 64, 64));
190void ARM_Unicorn::ExecuteInstructions(int num_instructions) { 190void ARM_Unicorn::ExecuteInstructions(int num_instructions) {
191 MICROPROFILE_SCOPE(ARM_Jit_Unicorn); 191 MICROPROFILE_SCOPE(ARM_Jit_Unicorn);
192 CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions)); 192 CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions));
193 CoreTiming::AddTicks(num_instructions); 193 Timing::AddTicks(num_instructions);
194 if (GDBStub::IsServerEnabled()) { 194 if (GDBStub::IsServerEnabled()) {
195 if (last_bkpt_hit) { 195 if (last_bkpt_hit) {
196 uc_reg_write(uc, UC_ARM64_REG_PC, &last_bkpt.address); 196 uc_reg_write(uc, UC_ARM64_REG_PC, &last_bkpt.address);
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 1dd576c26..4d9d21ee4 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -94,7 +94,7 @@ struct System::Impl {
94 ResultStatus Init(System& system, Frontend::EmuWindow& emu_window) { 94 ResultStatus Init(System& system, Frontend::EmuWindow& emu_window) {
95 LOG_DEBUG(HW_Memory, "initialized OK"); 95 LOG_DEBUG(HW_Memory, "initialized OK");
96 96
97 CoreTiming::Init(); 97 Timing::Init();
98 kernel.Initialize(); 98 kernel.Initialize();
99 99
100 const auto current_time = std::chrono::duration_cast<std::chrono::seconds>( 100 const auto current_time = std::chrono::duration_cast<std::chrono::seconds>(
@@ -205,7 +205,7 @@ struct System::Impl {
205 205
206 // Shutdown kernel and core timing 206 // Shutdown kernel and core timing
207 kernel.Shutdown(); 207 kernel.Shutdown();
208 CoreTiming::Shutdown(); 208 Timing::Shutdown();
209 209
210 // Close app loader 210 // Close app loader
211 app_loader.reset(); 211 app_loader.reset();
@@ -232,7 +232,7 @@ struct System::Impl {
232 } 232 }
233 233
234 PerfStatsResults GetAndResetPerfStats() { 234 PerfStatsResults GetAndResetPerfStats() {
235 return perf_stats.GetAndResetStats(CoreTiming::GetGlobalTimeUs()); 235 return perf_stats.GetAndResetStats(Timing::GetGlobalTimeUs());
236 } 236 }
237 237
238 Kernel::KernelCore kernel; 238 Kernel::KernelCore kernel;
diff --git a/src/core/core_cpu.cpp b/src/core/core_cpu.cpp
index fffda8a99..452366250 100644
--- a/src/core/core_cpu.cpp
+++ b/src/core/core_cpu.cpp
@@ -93,14 +93,14 @@ void Cpu::RunLoop(bool tight_loop) {
93 93
94 if (IsMainCore()) { 94 if (IsMainCore()) {
95 // TODO(Subv): Only let CoreTiming idle if all 4 cores are idling. 95 // TODO(Subv): Only let CoreTiming idle if all 4 cores are idling.
96 CoreTiming::Idle(); 96 Timing::Idle();
97 CoreTiming::Advance(); 97 Timing::Advance();
98 } 98 }
99 99
100 PrepareReschedule(); 100 PrepareReschedule();
101 } else { 101 } else {
102 if (IsMainCore()) { 102 if (IsMainCore()) {
103 CoreTiming::Advance(); 103 Timing::Advance();
104 } 104 }
105 105
106 if (tight_loop) { 106 if (tight_loop) {
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 7953c8720..4ea00c277 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -15,7 +15,7 @@
15#include "common/threadsafe_queue.h" 15#include "common/threadsafe_queue.h"
16#include "core/core_timing_util.h" 16#include "core/core_timing_util.h"
17 17
18namespace CoreTiming { 18namespace Core::Timing {
19 19
20static s64 global_timer; 20static s64 global_timer;
21static int slice_length; 21static int slice_length;
@@ -54,10 +54,10 @@ static std::vector<Event> event_queue;
54static u64 event_fifo_id; 54static u64 event_fifo_id;
55// the queue for storing the events from other threads threadsafe until they will be added 55// the queue for storing the events from other threads threadsafe until they will be added
56// to the event_queue by the emu thread 56// to the event_queue by the emu thread
57static Common::MPSCQueue<Event, false> ts_queue; 57static Common::MPSCQueue<Event> ts_queue;
58 58
59// the queue for unscheduling the events from other threads threadsafe 59// the queue for unscheduling the events from other threads threadsafe
60static Common::MPSCQueue<std::pair<const EventType*, u64>, false> unschedule_queue; 60static Common::MPSCQueue<std::pair<const EventType*, u64>> unschedule_queue;
61 61
62constexpr int MAX_SLICE_LENGTH = 20000; 62constexpr int MAX_SLICE_LENGTH = 20000;
63 63
@@ -70,8 +70,6 @@ static bool is_global_timer_sane;
70 70
71static EventType* ev_lost = nullptr; 71static EventType* ev_lost = nullptr;
72 72
73static void EmptyTimedCallback(u64 userdata, s64 cyclesLate) {}
74
75EventType* RegisterEvent(const std::string& name, TimedCallback callback) { 73EventType* RegisterEvent(const std::string& name, TimedCallback callback) {
76 // check for existing type with same name. 74 // check for existing type with same name.
77 // we want event type names to remain unique so that we can use them for serialization. 75 // we want event type names to remain unique so that we can use them for serialization.
@@ -104,7 +102,9 @@ void Init() {
104 is_global_timer_sane = true; 102 is_global_timer_sane = true;
105 103
106 event_fifo_id = 0; 104 event_fifo_id = 0;
107 ev_lost = RegisterEvent("_lost_event", &EmptyTimedCallback); 105
106 const auto empty_timed_callback = [](u64, s64) {};
107 ev_lost = RegisterEvent("_lost_event", empty_timed_callback);
108} 108}
109 109
110void Shutdown() { 110void Shutdown() {
@@ -242,4 +242,4 @@ int GetDowncount() {
242 return downcount; 242 return downcount;
243} 243}
244 244
245} // namespace CoreTiming 245} // namespace Core::Timing
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index 9ed757bd7..093989d4c 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -22,7 +22,7 @@
22#include <string> 22#include <string>
23#include "common/common_types.h" 23#include "common/common_types.h"
24 24
25namespace CoreTiming { 25namespace Core::Timing {
26 26
27struct EventType; 27struct EventType;
28 28
@@ -92,4 +92,4 @@ std::chrono::microseconds GetGlobalTimeUs();
92 92
93int GetDowncount(); 93int GetDowncount();
94 94
95} // namespace CoreTiming 95} // namespace Core::Timing
diff --git a/src/core/core_timing_util.cpp b/src/core/core_timing_util.cpp
index 73dea4edb..88ff70233 100644
--- a/src/core/core_timing_util.cpp
+++ b/src/core/core_timing_util.cpp
@@ -8,7 +8,7 @@
8#include <limits> 8#include <limits>
9#include "common/logging/log.h" 9#include "common/logging/log.h"
10 10
11namespace CoreTiming { 11namespace Core::Timing {
12 12
13constexpr u64 MAX_VALUE_TO_MULTIPLY = std::numeric_limits<s64>::max() / BASE_CLOCK_RATE; 13constexpr u64 MAX_VALUE_TO_MULTIPLY = std::numeric_limits<s64>::max() / BASE_CLOCK_RATE;
14 14
@@ -60,4 +60,4 @@ s64 nsToCycles(u64 ns) {
60 return (BASE_CLOCK_RATE * static_cast<s64>(ns)) / 1000000000; 60 return (BASE_CLOCK_RATE * static_cast<s64>(ns)) / 1000000000;
61} 61}
62 62
63} // namespace CoreTiming 63} // namespace Core::Timing
diff --git a/src/core/core_timing_util.h b/src/core/core_timing_util.h
index 5c3718782..513cfac1b 100644
--- a/src/core/core_timing_util.h
+++ b/src/core/core_timing_util.h
@@ -6,7 +6,7 @@
6 6
7#include "common/common_types.h" 7#include "common/common_types.h"
8 8
9namespace CoreTiming { 9namespace Core::Timing {
10 10
11// The below clock rate is based on Switch's clockspeed being widely known as 1.020GHz 11// The below clock rate is based on Switch's clockspeed being widely known as 1.020GHz
12// The exact value used is of course unverified. 12// The exact value used is of course unverified.
@@ -61,4 +61,4 @@ inline u64 cyclesToMs(s64 cycles) {
61 return cycles * 1000 / BASE_CLOCK_RATE; 61 return cycles * 1000 / BASE_CLOCK_RATE;
62} 62}
63 63
64} // namespace CoreTiming 64} // namespace Core::Timing
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 7a524ce5a..3721ae8fe 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -124,7 +124,7 @@ struct KernelCore::Impl {
124 124
125 void InitializeThreads() { 125 void InitializeThreads() {
126 thread_wakeup_event_type = 126 thread_wakeup_event_type =
127 CoreTiming::RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback); 127 Core::Timing::RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback);
128 } 128 }
129 129
130 std::atomic<u32> next_object_id{0}; 130 std::atomic<u32> next_object_id{0};
@@ -137,7 +137,7 @@ struct KernelCore::Impl {
137 137
138 SharedPtr<ResourceLimit> system_resource_limit; 138 SharedPtr<ResourceLimit> system_resource_limit;
139 139
140 CoreTiming::EventType* thread_wakeup_event_type = nullptr; 140 Core::Timing::EventType* thread_wakeup_event_type = nullptr;
141 // TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future, 141 // TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future,
142 // allowing us to simply use a pool index or similar. 142 // allowing us to simply use a pool index or similar.
143 Kernel::HandleTable thread_wakeup_callback_handle_table; 143 Kernel::HandleTable thread_wakeup_callback_handle_table;
@@ -213,7 +213,7 @@ u64 KernelCore::CreateNewProcessID() {
213 return impl->next_process_id++; 213 return impl->next_process_id++;
214} 214}
215 215
216CoreTiming::EventType* KernelCore::ThreadWakeupCallbackEventType() const { 216Core::Timing::EventType* KernelCore::ThreadWakeupCallbackEventType() const {
217 return impl->thread_wakeup_event_type; 217 return impl->thread_wakeup_event_type;
218} 218}
219 219
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index c643a6401..7406f107e 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -11,7 +11,7 @@
11template <typename T> 11template <typename T>
12class ResultVal; 12class ResultVal;
13 13
14namespace CoreTiming { 14namespace Core::Timing {
15struct EventType; 15struct EventType;
16} 16}
17 17
@@ -89,7 +89,7 @@ private:
89 u64 CreateNewThreadID(); 89 u64 CreateNewThreadID();
90 90
91 /// Retrieves the event type used for thread wakeup callbacks. 91 /// Retrieves the event type used for thread wakeup callbacks.
92 CoreTiming::EventType* ThreadWakeupCallbackEventType() const; 92 Core::Timing::EventType* ThreadWakeupCallbackEventType() const;
93 93
94 /// Provides a reference to the thread wakeup callback handle table. 94 /// Provides a reference to the thread wakeup callback handle table.
95 Kernel::HandleTable& ThreadWakeupCallbackHandleTable(); 95 Kernel::HandleTable& ThreadWakeupCallbackHandleTable();
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index df4d6cf0a..9e2517e1b 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -111,7 +111,7 @@ void Scheduler::SwitchContext(Thread* new_thread) {
111 111
112void Scheduler::UpdateLastContextSwitchTime(Thread* thread, Process* process) { 112void Scheduler::UpdateLastContextSwitchTime(Thread* thread, Process* process) {
113 const u64 prev_switch_ticks = last_context_switch_time; 113 const u64 prev_switch_ticks = last_context_switch_time;
114 const u64 most_recent_switch_ticks = CoreTiming::GetTicks(); 114 const u64 most_recent_switch_ticks = Core::Timing::GetTicks();
115 const u64 update_ticks = most_recent_switch_ticks - prev_switch_ticks; 115 const u64 update_ticks = most_recent_switch_ticks - prev_switch_ticks;
116 116
117 if (thread != nullptr) { 117 if (thread != nullptr) {
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 7cfecb68c..5f040f79f 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -927,9 +927,9 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
927 if (same_thread && info_sub_id == 0xFFFFFFFFFFFFFFFF) { 927 if (same_thread && info_sub_id == 0xFFFFFFFFFFFFFFFF) {
928 const u64 thread_ticks = current_thread->GetTotalCPUTimeTicks(); 928 const u64 thread_ticks = current_thread->GetTotalCPUTimeTicks();
929 929
930 out_ticks = thread_ticks + (CoreTiming::GetTicks() - prev_ctx_ticks); 930 out_ticks = thread_ticks + (Core::Timing::GetTicks() - prev_ctx_ticks);
931 } else if (same_thread && info_sub_id == system.CurrentCoreIndex()) { 931 } else if (same_thread && info_sub_id == system.CurrentCoreIndex()) {
932 out_ticks = CoreTiming::GetTicks() - prev_ctx_ticks; 932 out_ticks = Core::Timing::GetTicks() - prev_ctx_ticks;
933 } 933 }
934 934
935 *result = out_ticks; 935 *result = out_ticks;
@@ -1546,10 +1546,10 @@ static ResultCode SignalToAddress(VAddr address, u32 type, s32 value, s32 num_to
1546static u64 GetSystemTick() { 1546static u64 GetSystemTick() {
1547 LOG_TRACE(Kernel_SVC, "called"); 1547 LOG_TRACE(Kernel_SVC, "called");
1548 1548
1549 const u64 result{CoreTiming::GetTicks()}; 1549 const u64 result{Core::Timing::GetTicks()};
1550 1550
1551 // Advance time to defeat dumb games that busy-wait for the frame to end. 1551 // Advance time to defeat dumb games that busy-wait for the frame to end.
1552 CoreTiming::AddTicks(400); 1552 Core::Timing::AddTicks(400);
1553 1553
1554 return result; 1554 return result;
1555} 1555}
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index d3984dfc4..7881c2b90 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -43,7 +43,7 @@ Thread::~Thread() = default;
43 43
44void Thread::Stop() { 44void Thread::Stop() {
45 // Cancel any outstanding wakeup events for this thread 45 // Cancel any outstanding wakeup events for this thread
46 CoreTiming::UnscheduleEvent(kernel.ThreadWakeupCallbackEventType(), callback_handle); 46 Core::Timing::UnscheduleEvent(kernel.ThreadWakeupCallbackEventType(), callback_handle);
47 kernel.ThreadWakeupCallbackHandleTable().Close(callback_handle); 47 kernel.ThreadWakeupCallbackHandleTable().Close(callback_handle);
48 callback_handle = 0; 48 callback_handle = 0;
49 49
@@ -85,12 +85,13 @@ void Thread::WakeAfterDelay(s64 nanoseconds) {
85 85
86 // This function might be called from any thread so we have to be cautious and use the 86 // This function might be called from any thread so we have to be cautious and use the
87 // thread-safe version of ScheduleEvent. 87 // thread-safe version of ScheduleEvent.
88 CoreTiming::ScheduleEventThreadsafe(CoreTiming::nsToCycles(nanoseconds), 88 Core::Timing::ScheduleEventThreadsafe(Core::Timing::nsToCycles(nanoseconds),
89 kernel.ThreadWakeupCallbackEventType(), callback_handle); 89 kernel.ThreadWakeupCallbackEventType(), callback_handle);
90} 90}
91 91
92void Thread::CancelWakeupTimer() { 92void Thread::CancelWakeupTimer() {
93 CoreTiming::UnscheduleEventThreadsafe(kernel.ThreadWakeupCallbackEventType(), callback_handle); 93 Core::Timing::UnscheduleEventThreadsafe(kernel.ThreadWakeupCallbackEventType(),
94 callback_handle);
94} 95}
95 96
96static std::optional<s32> GetNextProcessorId(u64 mask) { 97static std::optional<s32> GetNextProcessorId(u64 mask) {
@@ -197,7 +198,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(KernelCore& kernel, std::string name
197 thread->stack_top = stack_top; 198 thread->stack_top = stack_top;
198 thread->tpidr_el0 = 0; 199 thread->tpidr_el0 = 0;
199 thread->nominal_priority = thread->current_priority = priority; 200 thread->nominal_priority = thread->current_priority = priority;
200 thread->last_running_ticks = CoreTiming::GetTicks(); 201 thread->last_running_ticks = Core::Timing::GetTicks();
201 thread->processor_id = processor_id; 202 thread->processor_id = processor_id;
202 thread->ideal_core = processor_id; 203 thread->ideal_core = processor_id;
203 thread->affinity_mask = 1ULL << processor_id; 204 thread->affinity_mask = 1ULL << processor_id;
@@ -257,7 +258,7 @@ void Thread::SetStatus(ThreadStatus new_status) {
257 } 258 }
258 259
259 if (status == ThreadStatus::Running) { 260 if (status == ThreadStatus::Running) {
260 last_running_ticks = CoreTiming::GetTicks(); 261 last_running_ticks = Core::Timing::GetTicks();
261 } 262 }
262 263
263 status = new_status; 264 status = new_status;
diff --git a/src/core/hle/service/hid/controllers/debug_pad.cpp b/src/core/hle/service/hid/controllers/debug_pad.cpp
index c22357d8c..b264c9503 100644
--- a/src/core/hle/service/hid/controllers/debug_pad.cpp
+++ b/src/core/hle/service/hid/controllers/debug_pad.cpp
@@ -22,7 +22,7 @@ void Controller_DebugPad::OnInit() {}
22void Controller_DebugPad::OnRelease() {} 22void Controller_DebugPad::OnRelease() {}
23 23
24void Controller_DebugPad::OnUpdate(u8* data, std::size_t size) { 24void Controller_DebugPad::OnUpdate(u8* data, std::size_t size) {
25 shared_memory.header.timestamp = CoreTiming::GetTicks(); 25 shared_memory.header.timestamp = Core::Timing::GetTicks();
26 shared_memory.header.total_entry_count = 17; 26 shared_memory.header.total_entry_count = 17;
27 27
28 if (!IsControllerActivated()) { 28 if (!IsControllerActivated()) {
diff --git a/src/core/hle/service/hid/controllers/gesture.cpp b/src/core/hle/service/hid/controllers/gesture.cpp
index 898572277..6d21f1a7d 100644
--- a/src/core/hle/service/hid/controllers/gesture.cpp
+++ b/src/core/hle/service/hid/controllers/gesture.cpp
@@ -18,7 +18,7 @@ void Controller_Gesture::OnInit() {}
18void Controller_Gesture::OnRelease() {} 18void Controller_Gesture::OnRelease() {}
19 19
20void Controller_Gesture::OnUpdate(u8* data, std::size_t size) { 20void Controller_Gesture::OnUpdate(u8* data, std::size_t size) {
21 shared_memory.header.timestamp = CoreTiming::GetTicks(); 21 shared_memory.header.timestamp = Core::Timing::GetTicks();
22 shared_memory.header.total_entry_count = 17; 22 shared_memory.header.total_entry_count = 17;
23 23
24 if (!IsControllerActivated()) { 24 if (!IsControllerActivated()) {
diff --git a/src/core/hle/service/hid/controllers/keyboard.cpp b/src/core/hle/service/hid/controllers/keyboard.cpp
index ca75adc2b..798f30436 100644
--- a/src/core/hle/service/hid/controllers/keyboard.cpp
+++ b/src/core/hle/service/hid/controllers/keyboard.cpp
@@ -20,7 +20,7 @@ void Controller_Keyboard::OnInit() {}
20void Controller_Keyboard::OnRelease() {} 20void Controller_Keyboard::OnRelease() {}
21 21
22void Controller_Keyboard::OnUpdate(u8* data, std::size_t size) { 22void Controller_Keyboard::OnUpdate(u8* data, std::size_t size) {
23 shared_memory.header.timestamp = CoreTiming::GetTicks(); 23 shared_memory.header.timestamp = Core::Timing::GetTicks();
24 shared_memory.header.total_entry_count = 17; 24 shared_memory.header.total_entry_count = 17;
25 25
26 if (!IsControllerActivated()) { 26 if (!IsControllerActivated()) {
diff --git a/src/core/hle/service/hid/controllers/mouse.cpp b/src/core/hle/service/hid/controllers/mouse.cpp
index 63391dbe9..4985037be 100644
--- a/src/core/hle/service/hid/controllers/mouse.cpp
+++ b/src/core/hle/service/hid/controllers/mouse.cpp
@@ -18,7 +18,7 @@ void Controller_Mouse::OnInit() {}
18void Controller_Mouse::OnRelease() {} 18void Controller_Mouse::OnRelease() {}
19 19
20void Controller_Mouse::OnUpdate(u8* data, std::size_t size) { 20void Controller_Mouse::OnUpdate(u8* data, std::size_t size) {
21 shared_memory.header.timestamp = CoreTiming::GetTicks(); 21 shared_memory.header.timestamp = Core::Timing::GetTicks();
22 shared_memory.header.total_entry_count = 17; 22 shared_memory.header.total_entry_count = 17;
23 23
24 if (!IsControllerActivated()) { 24 if (!IsControllerActivated()) {
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 04c8c35a8..ffdd1c593 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -308,7 +308,7 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
308 const auto& last_entry = 308 const auto& last_entry =
309 main_controller->npad[main_controller->common.last_entry_index]; 309 main_controller->npad[main_controller->common.last_entry_index];
310 310
311 main_controller->common.timestamp = CoreTiming::GetTicks(); 311 main_controller->common.timestamp = Core::Timing::GetTicks();
312 main_controller->common.last_entry_index = 312 main_controller->common.last_entry_index =
313 (main_controller->common.last_entry_index + 1) % 17; 313 (main_controller->common.last_entry_index + 1) % 17;
314 314
diff --git a/src/core/hle/service/hid/controllers/stubbed.cpp b/src/core/hle/service/hid/controllers/stubbed.cpp
index 02fcfadd9..cca4dca1d 100644
--- a/src/core/hle/service/hid/controllers/stubbed.cpp
+++ b/src/core/hle/service/hid/controllers/stubbed.cpp
@@ -22,7 +22,7 @@ void Controller_Stubbed::OnUpdate(u8* data, std::size_t size) {
22 } 22 }
23 23
24 CommonHeader header{}; 24 CommonHeader header{};
25 header.timestamp = CoreTiming::GetTicks(); 25 header.timestamp = Core::Timing::GetTicks();
26 header.total_entry_count = 17; 26 header.total_entry_count = 17;
27 header.entry_count = 0; 27 header.entry_count = 0;
28 header.last_entry_index = 0; 28 header.last_entry_index = 0;
diff --git a/src/core/hle/service/hid/controllers/touchscreen.cpp b/src/core/hle/service/hid/controllers/touchscreen.cpp
index f666b1bd8..a7c8acc72 100644
--- a/src/core/hle/service/hid/controllers/touchscreen.cpp
+++ b/src/core/hle/service/hid/controllers/touchscreen.cpp
@@ -21,7 +21,7 @@ void Controller_Touchscreen::OnInit() {}
21void Controller_Touchscreen::OnRelease() {} 21void Controller_Touchscreen::OnRelease() {}
22 22
23void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) { 23void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) {
24 shared_memory.header.timestamp = CoreTiming::GetTicks(); 24 shared_memory.header.timestamp = Core::Timing::GetTicks();
25 shared_memory.header.total_entry_count = 17; 25 shared_memory.header.total_entry_count = 17;
26 26
27 if (!IsControllerActivated()) { 27 if (!IsControllerActivated()) {
@@ -48,7 +48,7 @@ void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) {
48 touch_entry.diameter_x = Settings::values.touchscreen.diameter_x; 48 touch_entry.diameter_x = Settings::values.touchscreen.diameter_x;
49 touch_entry.diameter_y = Settings::values.touchscreen.diameter_y; 49 touch_entry.diameter_y = Settings::values.touchscreen.diameter_y;
50 touch_entry.rotation_angle = Settings::values.touchscreen.rotation_angle; 50 touch_entry.rotation_angle = Settings::values.touchscreen.rotation_angle;
51 const u64 tick = CoreTiming::GetTicks(); 51 const u64 tick = Core::Timing::GetTicks();
52 touch_entry.delta_time = tick - last_touch; 52 touch_entry.delta_time = tick - last_touch;
53 last_touch = tick; 53 last_touch = tick;
54 touch_entry.finger = Settings::values.touchscreen.finger; 54 touch_entry.finger = Settings::values.touchscreen.finger;
diff --git a/src/core/hle/service/hid/controllers/xpad.cpp b/src/core/hle/service/hid/controllers/xpad.cpp
index cd397c70b..eff03d14e 100644
--- a/src/core/hle/service/hid/controllers/xpad.cpp
+++ b/src/core/hle/service/hid/controllers/xpad.cpp
@@ -19,7 +19,7 @@ void Controller_XPad::OnRelease() {}
19 19
20void Controller_XPad::OnUpdate(u8* data, std::size_t size) { 20void Controller_XPad::OnUpdate(u8* data, std::size_t size) {
21 for (auto& xpad_entry : shared_memory.shared_memory_entries) { 21 for (auto& xpad_entry : shared_memory.shared_memory_entries) {
22 xpad_entry.header.timestamp = CoreTiming::GetTicks(); 22 xpad_entry.header.timestamp = Core::Timing::GetTicks();
23 xpad_entry.header.total_entry_count = 17; 23 xpad_entry.header.total_entry_count = 17;
24 24
25 if (!IsControllerActivated()) { 25 if (!IsControllerActivated()) {
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 008bf3f02..79c320d04 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -36,9 +36,9 @@ namespace Service::HID {
36 36
37// Updating period for each HID device. 37// Updating period for each HID device.
38// TODO(ogniK): Find actual polling rate of hid 38// TODO(ogniK): Find actual polling rate of hid
39constexpr u64 pad_update_ticks = CoreTiming::BASE_CLOCK_RATE / 66; 39constexpr u64 pad_update_ticks = Core::Timing::BASE_CLOCK_RATE / 66;
40constexpr u64 accelerometer_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100; 40constexpr u64 accelerometer_update_ticks = Core::Timing::BASE_CLOCK_RATE / 100;
41constexpr u64 gyroscope_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100; 41constexpr u64 gyroscope_update_ticks = Core::Timing::BASE_CLOCK_RATE / 100;
42constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; 42constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
43 43
44IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") { 44IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") {
@@ -73,14 +73,13 @@ IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") {
73 GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000); 73 GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000);
74 74
75 // Register update callbacks 75 // Register update callbacks
76 pad_update_event = 76 pad_update_event = Core::Timing::RegisterEvent(
77 CoreTiming::RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, int cycles_late) { 77 "HID::UpdatePadCallback",
78 UpdateControllers(userdata, cycles_late); 78 [this](u64 userdata, int cycles_late) { UpdateControllers(userdata, cycles_late); });
79 });
80 79
81 // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?) 80 // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?)
82 81
83 CoreTiming::ScheduleEvent(pad_update_ticks, pad_update_event); 82 Core::Timing::ScheduleEvent(pad_update_ticks, pad_update_event);
84 83
85 ReloadInputDevices(); 84 ReloadInputDevices();
86} 85}
@@ -94,7 +93,7 @@ void IAppletResource::DeactivateController(HidController controller) {
94} 93}
95 94
96IAppletResource ::~IAppletResource() { 95IAppletResource ::~IAppletResource() {
97 CoreTiming::UnscheduleEvent(pad_update_event, 0); 96 Core::Timing::UnscheduleEvent(pad_update_event, 0);
98} 97}
99 98
100void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { 99void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
@@ -114,7 +113,7 @@ void IAppletResource::UpdateControllers(u64 userdata, int cycles_late) {
114 controller->OnUpdate(shared_mem->GetPointer(), SHARED_MEMORY_SIZE); 113 controller->OnUpdate(shared_mem->GetPointer(), SHARED_MEMORY_SIZE);
115 } 114 }
116 115
117 CoreTiming::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event); 116 Core::Timing::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event);
118} 117}
119 118
120class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> { 119class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> {
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index eca27c056..6d897c842 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -7,7 +7,7 @@
7#include "controllers/controller_base.h" 7#include "controllers/controller_base.h"
8#include "core/hle/service/service.h" 8#include "core/hle/service/service.h"
9 9
10namespace CoreTiming { 10namespace Core::Timing {
11struct EventType; 11struct EventType;
12} 12}
13 13
@@ -66,7 +66,7 @@ private:
66 66
67 Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; 67 Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
68 68
69 CoreTiming::EventType* pad_update_event; 69 Core::Timing::EventType* pad_update_event;
70 70
71 std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)> 71 std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
72 controllers{}; 72 controllers{};
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index 3c7f8b1ee..b427d4068 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -98,7 +98,7 @@ void IRS::GetImageTransferProcessorState(Kernel::HLERequestContext& ctx) {
98 98
99 IPC::ResponseBuilder rb{ctx, 5}; 99 IPC::ResponseBuilder rb{ctx, 5};
100 rb.Push(RESULT_SUCCESS); 100 rb.Push(RESULT_SUCCESS);
101 rb.PushRaw<u64>(CoreTiming::GetTicks()); 101 rb.PushRaw<u64>(Core::Timing::GetTicks());
102 rb.PushRaw<u32>(0); 102 rb.PushRaw<u32>(0);
103} 103}
104 104
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 d57a54ee8..88d80ba06 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp
@@ -184,7 +184,7 @@ u32 nvhost_ctrl_gpu::GetGpuTime(const std::vector<u8>& input, std::vector<u8>& o
184 184
185 IoctlGetGpuTime params{}; 185 IoctlGetGpuTime params{};
186 std::memcpy(&params, input.data(), input.size()); 186 std::memcpy(&params, input.data(), input.size());
187 params.gpu_time = CoreTiming::cyclesToNs(CoreTiming::GetTicks()); 187 params.gpu_time = Core::Timing::cyclesToNs(Core::Timing::GetTicks());
188 std::memcpy(output.data(), &params, output.size()); 188 std::memcpy(output.data(), &params, output.size());
189 return 0; 189 return 0;
190} 190}
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h
index b171f256c..ab90d591e 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.h
+++ b/src/core/hle/service/nvflinger/buffer_queue.h
@@ -13,10 +13,6 @@
13#include "core/hle/kernel/object.h" 13#include "core/hle/kernel/object.h"
14#include "core/hle/kernel/writable_event.h" 14#include "core/hle/kernel/writable_event.h"
15 15
16namespace CoreTiming {
17struct EventType;
18}
19
20namespace Service::NVFlinger { 16namespace Service::NVFlinger {
21 17
22struct IGBPBuffer { 18struct IGBPBuffer {
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp
index cde06916d..ce1b59860 100644
--- a/src/core/hle/service/nvflinger/nvflinger.cpp
+++ b/src/core/hle/service/nvflinger/nvflinger.cpp
@@ -25,21 +25,21 @@
25namespace Service::NVFlinger { 25namespace Service::NVFlinger {
26 26
27constexpr std::size_t SCREEN_REFRESH_RATE = 60; 27constexpr std::size_t SCREEN_REFRESH_RATE = 60;
28constexpr u64 frame_ticks = static_cast<u64>(CoreTiming::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE); 28constexpr u64 frame_ticks = static_cast<u64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE);
29 29
30NVFlinger::NVFlinger() { 30NVFlinger::NVFlinger() {
31 // Schedule the screen composition events 31 // Schedule the screen composition events
32 composition_event = 32 composition_event =
33 CoreTiming::RegisterEvent("ScreenComposition", [this](u64 userdata, int cycles_late) { 33 Core::Timing::RegisterEvent("ScreenComposition", [this](u64 userdata, int cycles_late) {
34 Compose(); 34 Compose();
35 CoreTiming::ScheduleEvent(frame_ticks - cycles_late, composition_event); 35 Core::Timing::ScheduleEvent(frame_ticks - cycles_late, composition_event);
36 }); 36 });
37 37
38 CoreTiming::ScheduleEvent(frame_ticks, composition_event); 38 Core::Timing::ScheduleEvent(frame_ticks, composition_event);
39} 39}
40 40
41NVFlinger::~NVFlinger() { 41NVFlinger::~NVFlinger() {
42 CoreTiming::UnscheduleEvent(composition_event, 0); 42 Core::Timing::UnscheduleEvent(composition_event, 0);
43} 43}
44 44
45void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) { 45void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) {
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h
index 4c55e99f4..6d8bcbd30 100644
--- a/src/core/hle/service/nvflinger/nvflinger.h
+++ b/src/core/hle/service/nvflinger/nvflinger.h
@@ -14,7 +14,7 @@
14#include "common/common_types.h" 14#include "common/common_types.h"
15#include "core/hle/kernel/object.h" 15#include "core/hle/kernel/object.h"
16 16
17namespace CoreTiming { 17namespace Core::Timing {
18struct EventType; 18struct EventType;
19} 19}
20 20
@@ -115,8 +115,8 @@ private:
115 /// layers. 115 /// layers.
116 u32 next_buffer_queue_id = 1; 116 u32 next_buffer_queue_id = 1;
117 117
118 /// CoreTiming event that handles screen composition. 118 /// Event that handles screen composition.
119 CoreTiming::EventType* composition_event; 119 Core::Timing::EventType* composition_event;
120}; 120};
121 121
122} // namespace Service::NVFlinger 122} // namespace Service::NVFlinger
diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp
index c13640ad8..efebd1b24 100644
--- a/src/core/hle/service/time/time.cpp
+++ b/src/core/hle/service/time/time.cpp
@@ -106,8 +106,8 @@ private:
106 void GetCurrentTimePoint(Kernel::HLERequestContext& ctx) { 106 void GetCurrentTimePoint(Kernel::HLERequestContext& ctx) {
107 LOG_DEBUG(Service_Time, "called"); 107 LOG_DEBUG(Service_Time, "called");
108 108
109 SteadyClockTimePoint steady_clock_time_point{ 109 const SteadyClockTimePoint steady_clock_time_point{
110 CoreTiming::cyclesToMs(CoreTiming::GetTicks()) / 1000}; 110 Core::Timing::cyclesToMs(Core::Timing::GetTicks()) / 1000};
111 IPC::ResponseBuilder rb{ctx, (sizeof(SteadyClockTimePoint) / 4) + 2}; 111 IPC::ResponseBuilder rb{ctx, (sizeof(SteadyClockTimePoint) / 4) + 2};
112 rb.Push(RESULT_SUCCESS); 112 rb.Push(RESULT_SUCCESS);
113 rb.PushRaw(steady_clock_time_point); 113 rb.PushRaw(steady_clock_time_point);
@@ -282,7 +282,7 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) {
282 } 282 }
283 283
284 const SteadyClockTimePoint steady_clock_time_point{ 284 const SteadyClockTimePoint steady_clock_time_point{
285 CoreTiming::cyclesToMs(CoreTiming::GetTicks()) / 1000, {}}; 285 Core::Timing::cyclesToMs(Core::Timing::GetTicks()) / 1000, {}};
286 286
287 CalendarTime calendar_time{}; 287 CalendarTime calendar_time{};
288 calendar_time.year = tm->tm_year + 1900; 288 calendar_time.year = tm->tm_year + 1900;
diff --git a/src/tests/core/core_timing.cpp b/src/tests/core/core_timing.cpp
index 2242c14cf..77607a755 100644
--- a/src/tests/core/core_timing.cpp
+++ b/src/tests/core/core_timing.cpp
@@ -31,10 +31,10 @@ void CallbackTemplate(u64 userdata, s64 cycles_late) {
31class ScopeInit final { 31class ScopeInit final {
32public: 32public:
33 ScopeInit() { 33 ScopeInit() {
34 CoreTiming::Init(); 34 Core::Timing::Init();
35 } 35 }
36 ~ScopeInit() { 36 ~ScopeInit() {
37 CoreTiming::Shutdown(); 37 Core::Timing::Shutdown();
38 } 38 }
39}; 39};
40 40
@@ -44,37 +44,37 @@ static void AdvanceAndCheck(u32 idx, int downcount, int expected_lateness = 0,
44 expected_callback = CB_IDS[idx]; 44 expected_callback = CB_IDS[idx];
45 lateness = expected_lateness; 45 lateness = expected_lateness;
46 46
47 CoreTiming::AddTicks(CoreTiming::GetDowncount() - 47 // Pretend we executed X cycles of instructions.
48 cpu_downcount); // Pretend we executed X cycles of instructions. 48 Core::Timing::AddTicks(Core::Timing::GetDowncount() - cpu_downcount);
49 CoreTiming::Advance(); 49 Core::Timing::Advance();
50 50
51 REQUIRE(decltype(callbacks_ran_flags)().set(idx) == callbacks_ran_flags); 51 REQUIRE(decltype(callbacks_ran_flags)().set(idx) == callbacks_ran_flags);
52 REQUIRE(downcount == CoreTiming::GetDowncount()); 52 REQUIRE(downcount == Core::Timing::GetDowncount());
53} 53}
54 54
55TEST_CASE("CoreTiming[BasicOrder]", "[core]") { 55TEST_CASE("CoreTiming[BasicOrder]", "[core]") {
56 ScopeInit guard; 56 ScopeInit guard;
57 57
58 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 58 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
59 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 59 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
60 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", CallbackTemplate<2>); 60 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", CallbackTemplate<2>);
61 CoreTiming::EventType* cb_d = CoreTiming::RegisterEvent("callbackD", CallbackTemplate<3>); 61 Core::Timing::EventType* cb_d = Core::Timing::RegisterEvent("callbackD", CallbackTemplate<3>);
62 CoreTiming::EventType* cb_e = CoreTiming::RegisterEvent("callbackE", CallbackTemplate<4>); 62 Core::Timing::EventType* cb_e = Core::Timing::RegisterEvent("callbackE", CallbackTemplate<4>);
63 63
64 // Enter slice 0 64 // Enter slice 0
65 CoreTiming::Advance(); 65 Core::Timing::Advance();
66 66
67 // D -> B -> C -> A -> E 67 // D -> B -> C -> A -> E
68 CoreTiming::ScheduleEvent(1000, cb_a, CB_IDS[0]); 68 Core::Timing::ScheduleEvent(1000, cb_a, CB_IDS[0]);
69 REQUIRE(1000 == CoreTiming::GetDowncount()); 69 REQUIRE(1000 == Core::Timing::GetDowncount());
70 CoreTiming::ScheduleEvent(500, cb_b, CB_IDS[1]); 70 Core::Timing::ScheduleEvent(500, cb_b, CB_IDS[1]);
71 REQUIRE(500 == CoreTiming::GetDowncount()); 71 REQUIRE(500 == Core::Timing::GetDowncount());
72 CoreTiming::ScheduleEvent(800, cb_c, CB_IDS[2]); 72 Core::Timing::ScheduleEvent(800, cb_c, CB_IDS[2]);
73 REQUIRE(500 == CoreTiming::GetDowncount()); 73 REQUIRE(500 == Core::Timing::GetDowncount());
74 CoreTiming::ScheduleEvent(100, cb_d, CB_IDS[3]); 74 Core::Timing::ScheduleEvent(100, cb_d, CB_IDS[3]);
75 REQUIRE(100 == CoreTiming::GetDowncount()); 75 REQUIRE(100 == Core::Timing::GetDowncount());
76 CoreTiming::ScheduleEvent(1200, cb_e, CB_IDS[4]); 76 Core::Timing::ScheduleEvent(1200, cb_e, CB_IDS[4]);
77 REQUIRE(100 == CoreTiming::GetDowncount()); 77 REQUIRE(100 == Core::Timing::GetDowncount());
78 78
79 AdvanceAndCheck(3, 400); 79 AdvanceAndCheck(3, 400);
80 AdvanceAndCheck(1, 300); 80 AdvanceAndCheck(1, 300);
@@ -86,36 +86,36 @@ TEST_CASE("CoreTiming[BasicOrder]", "[core]") {
86TEST_CASE("CoreTiming[Threadsave]", "[core]") { 86TEST_CASE("CoreTiming[Threadsave]", "[core]") {
87 ScopeInit guard; 87 ScopeInit guard;
88 88
89 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 89 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
90 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 90 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
91 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", CallbackTemplate<2>); 91 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", CallbackTemplate<2>);
92 CoreTiming::EventType* cb_d = CoreTiming::RegisterEvent("callbackD", CallbackTemplate<3>); 92 Core::Timing::EventType* cb_d = Core::Timing::RegisterEvent("callbackD", CallbackTemplate<3>);
93 CoreTiming::EventType* cb_e = CoreTiming::RegisterEvent("callbackE", CallbackTemplate<4>); 93 Core::Timing::EventType* cb_e = Core::Timing::RegisterEvent("callbackE", CallbackTemplate<4>);
94 94
95 // Enter slice 0 95 // Enter slice 0
96 CoreTiming::Advance(); 96 Core::Timing::Advance();
97 97
98 // D -> B -> C -> A -> E 98 // D -> B -> C -> A -> E
99 CoreTiming::ScheduleEventThreadsafe(1000, cb_a, CB_IDS[0]); 99 Core::Timing::ScheduleEventThreadsafe(1000, cb_a, CB_IDS[0]);
100 // Manually force since ScheduleEventThreadsafe doesn't call it 100 // Manually force since ScheduleEventThreadsafe doesn't call it
101 CoreTiming::ForceExceptionCheck(1000); 101 Core::Timing::ForceExceptionCheck(1000);
102 REQUIRE(1000 == CoreTiming::GetDowncount()); 102 REQUIRE(1000 == Core::Timing::GetDowncount());
103 CoreTiming::ScheduleEventThreadsafe(500, cb_b, CB_IDS[1]); 103 Core::Timing::ScheduleEventThreadsafe(500, cb_b, CB_IDS[1]);
104 // Manually force since ScheduleEventThreadsafe doesn't call it 104 // Manually force since ScheduleEventThreadsafe doesn't call it
105 CoreTiming::ForceExceptionCheck(500); 105 Core::Timing::ForceExceptionCheck(500);
106 REQUIRE(500 == CoreTiming::GetDowncount()); 106 REQUIRE(500 == Core::Timing::GetDowncount());
107 CoreTiming::ScheduleEventThreadsafe(800, cb_c, CB_IDS[2]); 107 Core::Timing::ScheduleEventThreadsafe(800, cb_c, CB_IDS[2]);
108 // Manually force since ScheduleEventThreadsafe doesn't call it 108 // Manually force since ScheduleEventThreadsafe doesn't call it
109 CoreTiming::ForceExceptionCheck(800); 109 Core::Timing::ForceExceptionCheck(800);
110 REQUIRE(500 == CoreTiming::GetDowncount()); 110 REQUIRE(500 == Core::Timing::GetDowncount());
111 CoreTiming::ScheduleEventThreadsafe(100, cb_d, CB_IDS[3]); 111 Core::Timing::ScheduleEventThreadsafe(100, cb_d, CB_IDS[3]);
112 // Manually force since ScheduleEventThreadsafe doesn't call it 112 // Manually force since ScheduleEventThreadsafe doesn't call it
113 CoreTiming::ForceExceptionCheck(100); 113 Core::Timing::ForceExceptionCheck(100);
114 REQUIRE(100 == CoreTiming::GetDowncount()); 114 REQUIRE(100 == Core::Timing::GetDowncount());
115 CoreTiming::ScheduleEventThreadsafe(1200, cb_e, CB_IDS[4]); 115 Core::Timing::ScheduleEventThreadsafe(1200, cb_e, CB_IDS[4]);
116 // Manually force since ScheduleEventThreadsafe doesn't call it 116 // Manually force since ScheduleEventThreadsafe doesn't call it
117 CoreTiming::ForceExceptionCheck(1200); 117 Core::Timing::ForceExceptionCheck(1200);
118 REQUIRE(100 == CoreTiming::GetDowncount()); 118 REQUIRE(100 == Core::Timing::GetDowncount());
119 119
120 AdvanceAndCheck(3, 400); 120 AdvanceAndCheck(3, 400);
121 AdvanceAndCheck(1, 300); 121 AdvanceAndCheck(1, 300);
@@ -143,42 +143,42 @@ TEST_CASE("CoreTiming[SharedSlot]", "[core]") {
143 143
144 ScopeInit guard; 144 ScopeInit guard;
145 145
146 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", FifoCallback<0>); 146 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", FifoCallback<0>);
147 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", FifoCallback<1>); 147 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", FifoCallback<1>);
148 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", FifoCallback<2>); 148 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", FifoCallback<2>);
149 CoreTiming::EventType* cb_d = CoreTiming::RegisterEvent("callbackD", FifoCallback<3>); 149 Core::Timing::EventType* cb_d = Core::Timing::RegisterEvent("callbackD", FifoCallback<3>);
150 CoreTiming::EventType* cb_e = CoreTiming::RegisterEvent("callbackE", FifoCallback<4>); 150 Core::Timing::EventType* cb_e = Core::Timing::RegisterEvent("callbackE", FifoCallback<4>);
151 151
152 CoreTiming::ScheduleEvent(1000, cb_a, CB_IDS[0]); 152 Core::Timing::ScheduleEvent(1000, cb_a, CB_IDS[0]);
153 CoreTiming::ScheduleEvent(1000, cb_b, CB_IDS[1]); 153 Core::Timing::ScheduleEvent(1000, cb_b, CB_IDS[1]);
154 CoreTiming::ScheduleEvent(1000, cb_c, CB_IDS[2]); 154 Core::Timing::ScheduleEvent(1000, cb_c, CB_IDS[2]);
155 CoreTiming::ScheduleEvent(1000, cb_d, CB_IDS[3]); 155 Core::Timing::ScheduleEvent(1000, cb_d, CB_IDS[3]);
156 CoreTiming::ScheduleEvent(1000, cb_e, CB_IDS[4]); 156 Core::Timing::ScheduleEvent(1000, cb_e, CB_IDS[4]);
157 157
158 // Enter slice 0 158 // Enter slice 0
159 CoreTiming::Advance(); 159 Core::Timing::Advance();
160 REQUIRE(1000 == CoreTiming::GetDowncount()); 160 REQUIRE(1000 == Core::Timing::GetDowncount());
161 161
162 callbacks_ran_flags = 0; 162 callbacks_ran_flags = 0;
163 counter = 0; 163 counter = 0;
164 lateness = 0; 164 lateness = 0;
165 CoreTiming::AddTicks(CoreTiming::GetDowncount()); 165 Core::Timing::AddTicks(Core::Timing::GetDowncount());
166 CoreTiming::Advance(); 166 Core::Timing::Advance();
167 REQUIRE(MAX_SLICE_LENGTH == CoreTiming::GetDowncount()); 167 REQUIRE(MAX_SLICE_LENGTH == Core::Timing::GetDowncount());
168 REQUIRE(0x1FULL == callbacks_ran_flags.to_ullong()); 168 REQUIRE(0x1FULL == callbacks_ran_flags.to_ullong());
169} 169}
170 170
171TEST_CASE("CoreTiming[PredictableLateness]", "[core]") { 171TEST_CASE("Core::Timing[PredictableLateness]", "[core]") {
172 ScopeInit guard; 172 ScopeInit guard;
173 173
174 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 174 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
175 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 175 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
176 176
177 // Enter slice 0 177 // Enter slice 0
178 CoreTiming::Advance(); 178 Core::Timing::Advance();
179 179
180 CoreTiming::ScheduleEvent(100, cb_a, CB_IDS[0]); 180 Core::Timing::ScheduleEvent(100, cb_a, CB_IDS[0]);
181 CoreTiming::ScheduleEvent(200, cb_b, CB_IDS[1]); 181 Core::Timing::ScheduleEvent(200, cb_b, CB_IDS[1]);
182 182
183 AdvanceAndCheck(0, 90, 10, -10); // (100 - 10) 183 AdvanceAndCheck(0, 90, 10, -10); // (100 - 10)
184 AdvanceAndCheck(1, MAX_SLICE_LENGTH, 50, -50); 184 AdvanceAndCheck(1, MAX_SLICE_LENGTH, 50, -50);
@@ -192,9 +192,10 @@ static void RescheduleCallback(u64 userdata, s64 cycles_late) {
192 REQUIRE(reschedules >= 0); 192 REQUIRE(reschedules >= 0);
193 REQUIRE(lateness == cycles_late); 193 REQUIRE(lateness == cycles_late);
194 194
195 if (reschedules > 0) 195 if (reschedules > 0) {
196 CoreTiming::ScheduleEvent(1000, reinterpret_cast<CoreTiming::EventType*>(userdata), 196 Core::Timing::ScheduleEvent(1000, reinterpret_cast<Core::Timing::EventType*>(userdata),
197 userdata); 197 userdata);
198 }
198} 199}
199} // namespace ChainSchedulingTest 200} // namespace ChainSchedulingTest
200 201
@@ -203,35 +204,35 @@ TEST_CASE("CoreTiming[ChainScheduling]", "[core]") {
203 204
204 ScopeInit guard; 205 ScopeInit guard;
205 206
206 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 207 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
207 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 208 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
208 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", CallbackTemplate<2>); 209 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", CallbackTemplate<2>);
209 CoreTiming::EventType* cb_rs = 210 Core::Timing::EventType* cb_rs =
210 CoreTiming::RegisterEvent("callbackReschedule", RescheduleCallback); 211 Core::Timing::RegisterEvent("callbackReschedule", RescheduleCallback);
211 212
212 // Enter slice 0 213 // Enter slice 0
213 CoreTiming::Advance(); 214 Core::Timing::Advance();
214 215
215 CoreTiming::ScheduleEvent(800, cb_a, CB_IDS[0]); 216 Core::Timing::ScheduleEvent(800, cb_a, CB_IDS[0]);
216 CoreTiming::ScheduleEvent(1000, cb_b, CB_IDS[1]); 217 Core::Timing::ScheduleEvent(1000, cb_b, CB_IDS[1]);
217 CoreTiming::ScheduleEvent(2200, cb_c, CB_IDS[2]); 218 Core::Timing::ScheduleEvent(2200, cb_c, CB_IDS[2]);
218 CoreTiming::ScheduleEvent(1000, cb_rs, reinterpret_cast<u64>(cb_rs)); 219 Core::Timing::ScheduleEvent(1000, cb_rs, reinterpret_cast<u64>(cb_rs));
219 REQUIRE(800 == CoreTiming::GetDowncount()); 220 REQUIRE(800 == Core::Timing::GetDowncount());
220 221
221 reschedules = 3; 222 reschedules = 3;
222 AdvanceAndCheck(0, 200); // cb_a 223 AdvanceAndCheck(0, 200); // cb_a
223 AdvanceAndCheck(1, 1000); // cb_b, cb_rs 224 AdvanceAndCheck(1, 1000); // cb_b, cb_rs
224 REQUIRE(2 == reschedules); 225 REQUIRE(2 == reschedules);
225 226
226 CoreTiming::AddTicks(CoreTiming::GetDowncount()); 227 Core::Timing::AddTicks(Core::Timing::GetDowncount());
227 CoreTiming::Advance(); // cb_rs 228 Core::Timing::Advance(); // cb_rs
228 REQUIRE(1 == reschedules); 229 REQUIRE(1 == reschedules);
229 REQUIRE(200 == CoreTiming::GetDowncount()); 230 REQUIRE(200 == Core::Timing::GetDowncount());
230 231
231 AdvanceAndCheck(2, 800); // cb_c 232 AdvanceAndCheck(2, 800); // cb_c
232 233
233 CoreTiming::AddTicks(CoreTiming::GetDowncount()); 234 Core::Timing::AddTicks(Core::Timing::GetDowncount());
234 CoreTiming::Advance(); // cb_rs 235 Core::Timing::Advance(); // cb_rs
235 REQUIRE(0 == reschedules); 236 REQUIRE(0 == reschedules);
236 REQUIRE(MAX_SLICE_LENGTH == CoreTiming::GetDowncount()); 237 REQUIRE(MAX_SLICE_LENGTH == Core::Timing::GetDowncount());
237} 238}
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index a0cb6ba5f..d35a738d5 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -5,12 +5,12 @@ add_library(video_core STATIC
5 debug_utils/debug_utils.h 5 debug_utils/debug_utils.h
6 engines/fermi_2d.cpp 6 engines/fermi_2d.cpp
7 engines/fermi_2d.h 7 engines/fermi_2d.h
8 engines/kepler_compute.cpp
9 engines/kepler_compute.h
8 engines/kepler_memory.cpp 10 engines/kepler_memory.cpp
9 engines/kepler_memory.h 11 engines/kepler_memory.h
10 engines/maxwell_3d.cpp 12 engines/maxwell_3d.cpp
11 engines/maxwell_3d.h 13 engines/maxwell_3d.h
12 engines/maxwell_compute.cpp
13 engines/maxwell_compute.h
14 engines/maxwell_dma.cpp 14 engines/maxwell_dma.cpp
15 engines/maxwell_dma.h 15 engines/maxwell_dma.h
16 engines/shader_bytecode.h 16 engines/shader_bytecode.h
diff --git a/src/video_core/engines/kepler_compute.cpp b/src/video_core/engines/kepler_compute.cpp
new file mode 100644
index 000000000..4ca856b6b
--- /dev/null
+++ b/src/video_core/engines/kepler_compute.cpp
@@ -0,0 +1,34 @@
1// Copyright 2018 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/logging/log.h"
6#include "core/core.h"
7#include "core/memory.h"
8#include "video_core/engines/kepler_compute.h"
9#include "video_core/memory_manager.h"
10
11namespace Tegra::Engines {
12
13KeplerCompute::KeplerCompute(MemoryManager& memory_manager) : memory_manager{memory_manager} {}
14
15KeplerCompute::~KeplerCompute() = default;
16
17void KeplerCompute::CallMethod(const GPU::MethodCall& method_call) {
18 ASSERT_MSG(method_call.method < Regs::NUM_REGS,
19 "Invalid KeplerCompute register, increase the size of the Regs structure");
20
21 regs.reg_array[method_call.method] = method_call.argument;
22
23 switch (method_call.method) {
24 case KEPLER_COMPUTE_REG_INDEX(launch):
25 // Abort execution since compute shaders can be used to alter game memory (e.g. CUDA
26 // kernels)
27 UNREACHABLE_MSG("Compute shaders are not implemented");
28 break;
29 default:
30 break;
31 }
32}
33
34} // namespace Tegra::Engines
diff --git a/src/video_core/engines/maxwell_compute.h b/src/video_core/engines/kepler_compute.h
index 1d71f11bd..df0a32e0f 100644
--- a/src/video_core/engines/maxwell_compute.h
+++ b/src/video_core/engines/kepler_compute.h
@@ -10,47 +10,48 @@
10#include "common/common_funcs.h" 10#include "common/common_funcs.h"
11#include "common/common_types.h" 11#include "common/common_types.h"
12#include "video_core/gpu.h" 12#include "video_core/gpu.h"
13#include "video_core/memory_manager.h"
13 14
14namespace Tegra::Engines { 15namespace Tegra::Engines {
15 16
16#define MAXWELL_COMPUTE_REG_INDEX(field_name) \ 17#define KEPLER_COMPUTE_REG_INDEX(field_name) \
17 (offsetof(Tegra::Engines::MaxwellCompute::Regs, field_name) / sizeof(u32)) 18 (offsetof(Tegra::Engines::KeplerCompute::Regs, field_name) / sizeof(u32))
18 19
19class MaxwellCompute final { 20class KeplerCompute final {
20public: 21public:
21 MaxwellCompute() = default; 22 explicit KeplerCompute(MemoryManager& memory_manager);
22 ~MaxwellCompute() = default; 23 ~KeplerCompute();
24
25 static constexpr std::size_t NumConstBuffers = 8;
23 26
24 struct Regs { 27 struct Regs {
25 static constexpr std::size_t NUM_REGS = 0xCF8; 28 static constexpr std::size_t NUM_REGS = 0xCF8;
26 29
27 union { 30 union {
28 struct { 31 struct {
29 INSERT_PADDING_WORDS(0x281); 32 INSERT_PADDING_WORDS(0xAF);
30 33
31 union { 34 u32 launch;
32 u32 compute_end;
33 BitField<0, 1, u32> unknown;
34 } compute;
35 35
36 INSERT_PADDING_WORDS(0xA76); 36 INSERT_PADDING_WORDS(0xC48);
37 }; 37 };
38 std::array<u32, NUM_REGS> reg_array; 38 std::array<u32, NUM_REGS> reg_array;
39 }; 39 };
40 } regs{}; 40 } regs{};
41
42 static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), 41 static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32),
43 "MaxwellCompute Regs has wrong size"); 42 "KeplerCompute Regs has wrong size");
43
44 MemoryManager& memory_manager;
44 45
45 /// Write the value to the register identified by method. 46 /// Write the value to the register identified by method.
46 void CallMethod(const GPU::MethodCall& method_call); 47 void CallMethod(const GPU::MethodCall& method_call);
47}; 48};
48 49
49#define ASSERT_REG_POSITION(field_name, position) \ 50#define ASSERT_REG_POSITION(field_name, position) \
50 static_assert(offsetof(MaxwellCompute::Regs, field_name) == position * 4, \ 51 static_assert(offsetof(KeplerCompute::Regs, field_name) == position * 4, \
51 "Field " #field_name " has invalid position") 52 "Field " #field_name " has invalid position")
52 53
53ASSERT_REG_POSITION(compute, 0x281); 54ASSERT_REG_POSITION(launch, 0xAF);
54 55
55#undef ASSERT_REG_POSITION 56#undef ASSERT_REG_POSITION
56 57
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index 10eae6a65..19b6b14b2 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -317,7 +317,7 @@ void Maxwell3D::ProcessQueryGet() {
317 LongQueryResult query_result{}; 317 LongQueryResult query_result{};
318 query_result.value = result; 318 query_result.value = result;
319 // TODO(Subv): Generate a real GPU timestamp and write it here instead of CoreTiming 319 // TODO(Subv): Generate a real GPU timestamp and write it here instead of CoreTiming
320 query_result.timestamp = CoreTiming::GetTicks(); 320 query_result.timestamp = Core::Timing::GetTicks();
321 Memory::WriteBlock(*address, &query_result, sizeof(query_result)); 321 Memory::WriteBlock(*address, &query_result, sizeof(query_result));
322 } 322 }
323 dirty_flags.OnMemoryWrite(); 323 dirty_flags.OnMemoryWrite();
diff --git a/src/video_core/engines/maxwell_compute.cpp b/src/video_core/engines/maxwell_compute.cpp
deleted file mode 100644
index 656db6a61..000000000
--- a/src/video_core/engines/maxwell_compute.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
1// Copyright 2018 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/logging/log.h"
6#include "core/core.h"
7#include "video_core/engines/maxwell_compute.h"
8
9namespace Tegra::Engines {
10
11void MaxwellCompute::CallMethod(const GPU::MethodCall& method_call) {
12 ASSERT_MSG(method_call.method < Regs::NUM_REGS,
13 "Invalid MaxwellCompute register, increase the size of the Regs structure");
14
15 regs.reg_array[method_call.method] = method_call.argument;
16
17 switch (method_call.method) {
18 case MAXWELL_COMPUTE_REG_INDEX(compute): {
19 LOG_CRITICAL(HW_GPU, "Compute shaders are not implemented");
20 UNREACHABLE();
21 break;
22 }
23 default:
24 break;
25 }
26}
27
28} // namespace Tegra::Engines
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index d3d32a359..3d00c308b 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -6,9 +6,9 @@
6#include "core/core_timing.h" 6#include "core/core_timing.h"
7#include "core/memory.h" 7#include "core/memory.h"
8#include "video_core/engines/fermi_2d.h" 8#include "video_core/engines/fermi_2d.h"
9#include "video_core/engines/kepler_compute.h"
9#include "video_core/engines/kepler_memory.h" 10#include "video_core/engines/kepler_memory.h"
10#include "video_core/engines/maxwell_3d.h" 11#include "video_core/engines/maxwell_3d.h"
11#include "video_core/engines/maxwell_compute.h"
12#include "video_core/engines/maxwell_dma.h" 12#include "video_core/engines/maxwell_dma.h"
13#include "video_core/gpu.h" 13#include "video_core/gpu.h"
14#include "video_core/rasterizer_interface.h" 14#include "video_core/rasterizer_interface.h"
@@ -18,6 +18,7 @@ namespace Tegra {
18u32 FramebufferConfig::BytesPerPixel(PixelFormat format) { 18u32 FramebufferConfig::BytesPerPixel(PixelFormat format) {
19 switch (format) { 19 switch (format) {
20 case PixelFormat::ABGR8: 20 case PixelFormat::ABGR8:
21 case PixelFormat::BGRA8:
21 return 4; 22 return 4;
22 default: 23 default:
23 return 4; 24 return 4;
@@ -31,7 +32,7 @@ GPU::GPU(VideoCore::RasterizerInterface& rasterizer) {
31 dma_pusher = std::make_unique<Tegra::DmaPusher>(*this); 32 dma_pusher = std::make_unique<Tegra::DmaPusher>(*this);
32 maxwell_3d = std::make_unique<Engines::Maxwell3D>(rasterizer, *memory_manager); 33 maxwell_3d = std::make_unique<Engines::Maxwell3D>(rasterizer, *memory_manager);
33 fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager); 34 fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager);
34 maxwell_compute = std::make_unique<Engines::MaxwellCompute>(); 35 kepler_compute = std::make_unique<Engines::KeplerCompute>(*memory_manager);
35 maxwell_dma = std::make_unique<Engines::MaxwellDMA>(rasterizer, *memory_manager); 36 maxwell_dma = std::make_unique<Engines::MaxwellDMA>(rasterizer, *memory_manager);
36 kepler_memory = std::make_unique<Engines::KeplerMemory>(rasterizer, *memory_manager); 37 kepler_memory = std::make_unique<Engines::KeplerMemory>(rasterizer, *memory_manager);
37} 38}
@@ -245,8 +246,8 @@ void GPU::CallEngineMethod(const MethodCall& method_call) {
245 case EngineID::MAXWELL_B: 246 case EngineID::MAXWELL_B:
246 maxwell_3d->CallMethod(method_call); 247 maxwell_3d->CallMethod(method_call);
247 break; 248 break;
248 case EngineID::MAXWELL_COMPUTE_B: 249 case EngineID::KEPLER_COMPUTE_B:
249 maxwell_compute->CallMethod(method_call); 250 kepler_compute->CallMethod(method_call);
250 break; 251 break;
251 case EngineID::MAXWELL_DMA_COPY_A: 252 case EngineID::MAXWELL_DMA_COPY_A:
252 maxwell_dma->CallMethod(method_call); 253 maxwell_dma->CallMethod(method_call);
@@ -282,7 +283,7 @@ void GPU::ProcessSemaphoreTriggerMethod() {
282 block.sequence = regs.semaphore_sequence; 283 block.sequence = regs.semaphore_sequence;
283 // TODO(Kmather73): Generate a real GPU timestamp and write it here instead of 284 // TODO(Kmather73): Generate a real GPU timestamp and write it here instead of
284 // CoreTiming 285 // CoreTiming
285 block.timestamp = CoreTiming::GetTicks(); 286 block.timestamp = Core::Timing::GetTicks();
286 Memory::WriteBlock(*address, &block, sizeof(block)); 287 Memory::WriteBlock(*address, &block, sizeof(block));
287 } else { 288 } else {
288 const auto address = 289 const auto address =
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index fb8975811..a482196ea 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -80,6 +80,7 @@ class DebugContext;
80struct FramebufferConfig { 80struct FramebufferConfig {
81 enum class PixelFormat : u32 { 81 enum class PixelFormat : u32 {
82 ABGR8 = 1, 82 ABGR8 = 1,
83 BGRA8 = 5,
83 }; 84 };
84 85
85 /** 86 /**
@@ -102,15 +103,15 @@ struct FramebufferConfig {
102namespace Engines { 103namespace Engines {
103class Fermi2D; 104class Fermi2D;
104class Maxwell3D; 105class Maxwell3D;
105class MaxwellCompute;
106class MaxwellDMA; 106class MaxwellDMA;
107class KeplerCompute;
107class KeplerMemory; 108class KeplerMemory;
108} // namespace Engines 109} // namespace Engines
109 110
110enum class EngineID { 111enum class EngineID {
111 FERMI_TWOD_A = 0x902D, // 2D Engine 112 FERMI_TWOD_A = 0x902D, // 2D Engine
112 MAXWELL_B = 0xB197, // 3D Engine 113 MAXWELL_B = 0xB197, // 3D Engine
113 MAXWELL_COMPUTE_B = 0xB1C0, 114 KEPLER_COMPUTE_B = 0xB1C0,
114 KEPLER_INLINE_TO_MEMORY_B = 0xA140, 115 KEPLER_INLINE_TO_MEMORY_B = 0xA140,
115 MAXWELL_DMA_COPY_A = 0xB0B5, 116 MAXWELL_DMA_COPY_A = 0xB0B5,
116}; 117};
@@ -208,7 +209,7 @@ private:
208 /// 2D engine 209 /// 2D engine
209 std::unique_ptr<Engines::Fermi2D> fermi_2d; 210 std::unique_ptr<Engines::Fermi2D> fermi_2d;
210 /// Compute engine 211 /// Compute engine
211 std::unique_ptr<Engines::MaxwellCompute> maxwell_compute; 212 std::unique_ptr<Engines::KeplerCompute> kepler_compute;
212 /// DMA engine 213 /// DMA engine
213 std::unique_ptr<Engines::MaxwellDMA> maxwell_dma; 214 std::unique_ptr<Engines::MaxwellDMA> maxwell_dma;
214 /// Inline memory engine 215 /// Inline memory engine
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 6476a9e1a..cca2ed708 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -107,7 +107,7 @@ RendererOpenGL::~RendererOpenGL() = default;
107void RendererOpenGL::SwapBuffers( 107void RendererOpenGL::SwapBuffers(
108 std::optional<std::reference_wrapper<const Tegra::FramebufferConfig>> framebuffer) { 108 std::optional<std::reference_wrapper<const Tegra::FramebufferConfig>> framebuffer) {
109 109
110 Core::System::GetInstance().GetPerfStats().EndSystemFrame(); 110 system.GetPerfStats().EndSystemFrame();
111 111
112 // Maintain the rasterizer's state as a priority 112 // Maintain the rasterizer's state as a priority
113 OpenGLState prev_state = OpenGLState::GetCurState(); 113 OpenGLState prev_state = OpenGLState::GetCurState();
@@ -137,8 +137,8 @@ void RendererOpenGL::SwapBuffers(
137 137
138 render_window.PollEvents(); 138 render_window.PollEvents();
139 139
140 Core::System::GetInstance().FrameLimiter().DoFrameLimiting(CoreTiming::GetGlobalTimeUs()); 140 system.FrameLimiter().DoFrameLimiting(Core::Timing::GetGlobalTimeUs());
141 Core::System::GetInstance().GetPerfStats().BeginSystemFrame(); 141 system.GetPerfStats().BeginSystemFrame();
142 142
143 // Restore the rasterizer state 143 // Restore the rasterizer state
144 prev_state.Apply(); 144 prev_state.Apply();
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp
index 2f6612a35..044ba116a 100644
--- a/src/video_core/surface.cpp
+++ b/src/video_core/surface.cpp
@@ -426,6 +426,8 @@ PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat
426 switch (format) { 426 switch (format) {
427 case Tegra::FramebufferConfig::PixelFormat::ABGR8: 427 case Tegra::FramebufferConfig::PixelFormat::ABGR8:
428 return PixelFormat::ABGR8U; 428 return PixelFormat::ABGR8U;
429 case Tegra::FramebufferConfig::PixelFormat::BGRA8:
430 return PixelFormat::BGRA8;
429 default: 431 default:
430 LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); 432 LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
431 UNREACHABLE(); 433 UNREACHABLE();