summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/stream.cpp2
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/core_timing.cpp2
-rw-r--r--src/core/core_timing.h2
-rw-r--r--src/core/file_sys/cheat_engine.cpp2
-rw-r--r--src/core/hle/kernel/kernel.cpp2
-rw-r--r--src/core/hle/kernel/kernel.h3
-rw-r--r--src/core/hle/kernel/object.cpp1
-rw-r--r--src/core/hle/kernel/object.h1
-rw-r--r--src/core/hle/kernel/process.h8
-rw-r--r--src/core/hle/kernel/svc.cpp120
-rw-r--r--src/core/hle/kernel/transfer_memory.cpp73
-rw-r--r--src/core/hle/kernel/transfer_memory.h91
-rw-r--r--src/core/hle/service/hid/hid.cpp10
-rw-r--r--src/core/hle/service/hid/hid.h2
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp4
-rw-r--r--src/video_core/gpu.cpp9
-rw-r--r--src/video_core/gpu.h6
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_resource_manager.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_resource_manager.h2
21 files changed, 308 insertions, 40 deletions
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp
index 4b66a6786..22a3f8c84 100644
--- a/src/audio_core/stream.cpp
+++ b/src/audio_core/stream.cpp
@@ -38,7 +38,7 @@ Stream::Stream(Core::Timing::CoreTiming& core_timing, u32 sample_rate, Format fo
38 sink_stream{sink_stream}, core_timing{core_timing}, name{std::move(name_)} { 38 sink_stream{sink_stream}, core_timing{core_timing}, name{std::move(name_)} {
39 39
40 release_event = core_timing.RegisterEvent( 40 release_event = core_timing.RegisterEvent(
41 name, [this](u64 userdata, int cycles_late) { ReleaseActiveBuffer(); }); 41 name, [this](u64 userdata, s64 cycles_late) { ReleaseActiveBuffer(); });
42} 42}
43 43
44void Stream::Play() { 44void Stream::Play() {
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index f156bca40..9e23afe85 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -146,6 +146,8 @@ add_library(core STATIC
146 hle/kernel/svc_wrap.h 146 hle/kernel/svc_wrap.h
147 hle/kernel/thread.cpp 147 hle/kernel/thread.cpp
148 hle/kernel/thread.h 148 hle/kernel/thread.h
149 hle/kernel/transfer_memory.cpp
150 hle/kernel/transfer_memory.h
149 hle/kernel/vm_manager.cpp 151 hle/kernel/vm_manager.cpp
150 hle/kernel/vm_manager.h 152 hle/kernel/vm_manager.h
151 hle/kernel/wait_object.cpp 153 hle/kernel/wait_object.cpp
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index a0dd5db24..41adb2302 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -186,7 +186,7 @@ void CoreTiming::Advance() {
186 Event evt = std::move(event_queue.front()); 186 Event evt = std::move(event_queue.front());
187 std::pop_heap(event_queue.begin(), event_queue.end(), std::greater<>()); 187 std::pop_heap(event_queue.begin(), event_queue.end(), std::greater<>());
188 event_queue.pop_back(); 188 event_queue.pop_back();
189 evt.type->callback(evt.userdata, static_cast<int>(global_timer - evt.time)); 189 evt.type->callback(evt.userdata, global_timer - evt.time);
190 } 190 }
191 191
192 is_global_timer_sane = false; 192 is_global_timer_sane = false;
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index 59163bae1..9d2efde37 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -15,7 +15,7 @@
15namespace Core::Timing { 15namespace Core::Timing {
16 16
17/// A callback that may be scheduled for a particular core timing event. 17/// A callback that may be scheduled for a particular core timing event.
18using TimedCallback = std::function<void(u64 userdata, int cycles_late)>; 18using TimedCallback = std::function<void(u64 userdata, s64 cycles_late)>;
19 19
20/// Contains the characteristics of a particular event. 20/// Contains the characteristics of a particular event.
21struct EventType { 21struct EventType {
diff --git a/src/core/file_sys/cheat_engine.cpp b/src/core/file_sys/cheat_engine.cpp
index 247fbc864..b06c2f20a 100644
--- a/src/core/file_sys/cheat_engine.cpp
+++ b/src/core/file_sys/cheat_engine.cpp
@@ -423,6 +423,7 @@ std::array<u8, 16> TextCheatParser::ParseSingleLineCheat(const std::string& line
423 return out; 423 return out;
424} 424}
425 425
426namespace {
426u64 MemoryReadImpl(u32 width, VAddr addr) { 427u64 MemoryReadImpl(u32 width, VAddr addr) {
427 switch (width) { 428 switch (width) {
428 case 1: 429 case 1:
@@ -457,6 +458,7 @@ void MemoryWriteImpl(u32 width, VAddr addr, u64 value) {
457 UNREACHABLE(); 458 UNREACHABLE();
458 } 459 }
459} 460}
461} // Anonymous namespace
460 462
461CheatEngine::CheatEngine(Core::System& system, std::vector<CheatList> cheats_, 463CheatEngine::CheatEngine(Core::System& system, std::vector<CheatList> cheats_,
462 const std::string& build_id, VAddr code_region_start, 464 const std::string& build_id, VAddr code_region_start,
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 4d224d01d..a7e4ddc05 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -29,7 +29,7 @@ namespace Kernel {
29 * @param thread_handle The handle of the thread that's been awoken 29 * @param thread_handle The handle of the thread that's been awoken
30 * @param cycles_late The number of CPU cycles that have passed since the desired wakeup time 30 * @param cycles_late The number of CPU cycles that have passed since the desired wakeup time
31 */ 31 */
32static void ThreadWakeupCallback(u64 thread_handle, [[maybe_unused]] int cycles_late) { 32static void ThreadWakeupCallback(u64 thread_handle, [[maybe_unused]] s64 cycles_late) {
33 const auto proper_handle = static_cast<Handle>(thread_handle); 33 const auto proper_handle = static_cast<Handle>(thread_handle);
34 const auto& system = Core::System::GetInstance(); 34 const auto& system = Core::System::GetInstance();
35 35
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index ff17ff865..03ea5b659 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -8,9 +8,6 @@
8#include <unordered_map> 8#include <unordered_map>
9#include "core/hle/kernel/object.h" 9#include "core/hle/kernel/object.h"
10 10
11template <typename T>
12class ResultVal;
13
14namespace Core { 11namespace Core {
15class System; 12class System;
16} 13}
diff --git a/src/core/hle/kernel/object.cpp b/src/core/hle/kernel/object.cpp
index 8870463d0..217144efc 100644
--- a/src/core/hle/kernel/object.cpp
+++ b/src/core/hle/kernel/object.cpp
@@ -23,6 +23,7 @@ bool Object::IsWaitable() const {
23 case HandleType::Unknown: 23 case HandleType::Unknown:
24 case HandleType::WritableEvent: 24 case HandleType::WritableEvent:
25 case HandleType::SharedMemory: 25 case HandleType::SharedMemory:
26 case HandleType::TransferMemory:
26 case HandleType::AddressArbiter: 27 case HandleType::AddressArbiter:
27 case HandleType::ResourceLimit: 28 case HandleType::ResourceLimit:
28 case HandleType::ClientPort: 29 case HandleType::ClientPort:
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h
index 4c2505908..3f6baa094 100644
--- a/src/core/hle/kernel/object.h
+++ b/src/core/hle/kernel/object.h
@@ -22,6 +22,7 @@ enum class HandleType : u32 {
22 WritableEvent, 22 WritableEvent,
23 ReadableEvent, 23 ReadableEvent,
24 SharedMemory, 24 SharedMemory,
25 TransferMemory,
25 Thread, 26 Thread,
26 Process, 27 Process,
27 AddressArbiter, 28 AddressArbiter,
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index 1bd7bf5c1..a0217d3d8 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -35,14 +35,6 @@ class Thread;
35 35
36struct CodeSet; 36struct CodeSet;
37 37
38struct AddressMapping {
39 // Address and size must be page-aligned
40 VAddr address;
41 u64 size;
42 bool read_only;
43 bool unk_flag;
44};
45
46enum class MemoryRegion : u16 { 38enum class MemoryRegion : u16 {
47 APPLICATION = 1, 39 APPLICATION = 1,
48 SYSTEM = 2, 40 SYSTEM = 2,
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 6a8960c8d..09d1eadb6 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -32,6 +32,7 @@
32#include "core/hle/kernel/svc.h" 32#include "core/hle/kernel/svc.h"
33#include "core/hle/kernel/svc_wrap.h" 33#include "core/hle/kernel/svc_wrap.h"
34#include "core/hle/kernel/thread.h" 34#include "core/hle/kernel/thread.h"
35#include "core/hle/kernel/transfer_memory.h"
35#include "core/hle/kernel/writable_event.h" 36#include "core/hle/kernel/writable_event.h"
36#include "core/hle/lock.h" 37#include "core/hle/lock.h"
37#include "core/hle/result.h" 38#include "core/hle/result.h"
@@ -1583,14 +1584,121 @@ static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32
1583 } 1584 }
1584 1585
1585 auto& kernel = Core::System::GetInstance().Kernel(); 1586 auto& kernel = Core::System::GetInstance().Kernel();
1586 auto process = kernel.CurrentProcess(); 1587 auto transfer_mem_handle = TransferMemory::Create(kernel, addr, size, perms);
1587 auto& handle_table = process->GetHandleTable();
1588 const auto shared_mem_handle = SharedMemory::Create(kernel, process, size, perms, perms, addr);
1589 1588
1590 CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle)); 1589 auto& handle_table = kernel.CurrentProcess()->GetHandleTable();
1590 const auto result = handle_table.Create(std::move(transfer_mem_handle));
1591 if (result.Failed()) {
1592 return result.Code();
1593 }
1594
1595 *handle = *result;
1591 return RESULT_SUCCESS; 1596 return RESULT_SUCCESS;
1592} 1597}
1593 1598
1599static ResultCode MapTransferMemory(Handle handle, VAddr address, u64 size, u32 permission_raw) {
1600 LOG_DEBUG(Kernel_SVC,
1601 "called. handle=0x{:08X}, address=0x{:016X}, size=0x{:016X}, permissions=0x{:08X}",
1602 handle, address, size, permission_raw);
1603
1604 if (!Common::Is4KBAligned(address)) {
1605 LOG_ERROR(Kernel_SVC, "Transfer memory addresses must be 4KB aligned (size=0x{:016X}).",
1606 address);
1607 return ERR_INVALID_ADDRESS;
1608 }
1609
1610 if (size == 0 || !Common::Is4KBAligned(size)) {
1611 LOG_ERROR(Kernel_SVC,
1612 "Transfer memory sizes must be 4KB aligned and not be zero (size=0x{:016X}).",
1613 size);
1614 return ERR_INVALID_SIZE;
1615 }
1616
1617 if (!IsValidAddressRange(address, size)) {
1618 LOG_ERROR(Kernel_SVC,
1619 "Given address and size overflows the 64-bit range (address=0x{:016X}, "
1620 "size=0x{:016X}).",
1621 address, size);
1622 return ERR_INVALID_ADDRESS_STATE;
1623 }
1624
1625 const auto permissions = static_cast<MemoryPermission>(permission_raw);
1626 if (permissions != MemoryPermission::None && permissions != MemoryPermission::Read &&
1627 permissions != MemoryPermission::ReadWrite) {
1628 LOG_ERROR(Kernel_SVC, "Invalid transfer memory permissions given (permissions=0x{:08X}).",
1629 permission_raw);
1630 return ERR_INVALID_STATE;
1631 }
1632
1633 const auto& kernel = Core::System::GetInstance().Kernel();
1634 const auto* const current_process = kernel.CurrentProcess();
1635 const auto& handle_table = current_process->GetHandleTable();
1636
1637 auto transfer_memory = handle_table.Get<TransferMemory>(handle);
1638 if (!transfer_memory) {
1639 LOG_ERROR(Kernel_SVC, "Nonexistent transfer memory handle given (handle=0x{:08X}).",
1640 handle);
1641 return ERR_INVALID_HANDLE;
1642 }
1643
1644 if (!current_process->VMManager().IsWithinASLRRegion(address, size)) {
1645 LOG_ERROR(Kernel_SVC,
1646 "Given address and size don't fully fit within the ASLR region "
1647 "(address=0x{:016X}, size=0x{:016X}).",
1648 address, size);
1649 return ERR_INVALID_MEMORY_RANGE;
1650 }
1651
1652 return transfer_memory->MapMemory(address, size, permissions);
1653}
1654
1655static ResultCode UnmapTransferMemory(Handle handle, VAddr address, u64 size) {
1656 LOG_DEBUG(Kernel_SVC, "called. handle=0x{:08X}, address=0x{:016X}, size=0x{:016X}", handle,
1657 address, size);
1658
1659 if (!Common::Is4KBAligned(address)) {
1660 LOG_ERROR(Kernel_SVC, "Transfer memory addresses must be 4KB aligned (size=0x{:016X}).",
1661 address);
1662 return ERR_INVALID_ADDRESS;
1663 }
1664
1665 if (size == 0 || !Common::Is4KBAligned(size)) {
1666 LOG_ERROR(Kernel_SVC,
1667 "Transfer memory sizes must be 4KB aligned and not be zero (size=0x{:016X}).",
1668 size);
1669 return ERR_INVALID_SIZE;
1670 }
1671
1672 if (!IsValidAddressRange(address, size)) {
1673 LOG_ERROR(Kernel_SVC,
1674 "Given address and size overflows the 64-bit range (address=0x{:016X}, "
1675 "size=0x{:016X}).",
1676 address, size);
1677 return ERR_INVALID_ADDRESS_STATE;
1678 }
1679
1680 const auto& kernel = Core::System::GetInstance().Kernel();
1681 const auto* const current_process = kernel.CurrentProcess();
1682 const auto& handle_table = current_process->GetHandleTable();
1683
1684 auto transfer_memory = handle_table.Get<TransferMemory>(handle);
1685 if (!transfer_memory) {
1686 LOG_ERROR(Kernel_SVC, "Nonexistent transfer memory handle given (handle=0x{:08X}).",
1687 handle);
1688 return ERR_INVALID_HANDLE;
1689 }
1690
1691 if (!current_process->VMManager().IsWithinASLRRegion(address, size)) {
1692 LOG_ERROR(Kernel_SVC,
1693 "Given address and size don't fully fit within the ASLR region "
1694 "(address=0x{:016X}, size=0x{:016X}).",
1695 address, size);
1696 return ERR_INVALID_MEMORY_RANGE;
1697 }
1698
1699 return transfer_memory->UnmapMemory(address, size);
1700}
1701
1594static ResultCode GetThreadCoreMask(Handle thread_handle, u32* core, u64* mask) { 1702static ResultCode GetThreadCoreMask(Handle thread_handle, u32* core, u64* mask) {
1595 LOG_TRACE(Kernel_SVC, "called, handle=0x{:08X}", thread_handle); 1703 LOG_TRACE(Kernel_SVC, "called, handle=0x{:08X}", thread_handle);
1596 1704
@@ -1966,8 +2074,8 @@ static const FunctionDef SVC_Table[] = {
1966 {0x4E, nullptr, "ReadWriteRegister"}, 2074 {0x4E, nullptr, "ReadWriteRegister"},
1967 {0x4F, nullptr, "SetProcessActivity"}, 2075 {0x4F, nullptr, "SetProcessActivity"},
1968 {0x50, SvcWrap<CreateSharedMemory>, "CreateSharedMemory"}, 2076 {0x50, SvcWrap<CreateSharedMemory>, "CreateSharedMemory"},
1969 {0x51, nullptr, "MapTransferMemory"}, 2077 {0x51, SvcWrap<MapTransferMemory>, "MapTransferMemory"},
1970 {0x52, nullptr, "UnmapTransferMemory"}, 2078 {0x52, SvcWrap<UnmapTransferMemory>, "UnmapTransferMemory"},
1971 {0x53, nullptr, "CreateInterruptEvent"}, 2079 {0x53, nullptr, "CreateInterruptEvent"},
1972 {0x54, nullptr, "QueryPhysicalAddress"}, 2080 {0x54, nullptr, "QueryPhysicalAddress"},
1973 {0x55, nullptr, "QueryIoMapping"}, 2081 {0x55, nullptr, "QueryIoMapping"},
diff --git a/src/core/hle/kernel/transfer_memory.cpp b/src/core/hle/kernel/transfer_memory.cpp
new file mode 100644
index 000000000..23228e1b5
--- /dev/null
+++ b/src/core/hle/kernel/transfer_memory.cpp
@@ -0,0 +1,73 @@
1// Copyright 2019 yuzu emulator team
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/hle/kernel/errors.h"
6#include "core/hle/kernel/kernel.h"
7#include "core/hle/kernel/process.h"
8#include "core/hle/kernel/shared_memory.h"
9#include "core/hle/kernel/transfer_memory.h"
10#include "core/hle/result.h"
11
12namespace Kernel {
13
14TransferMemory::TransferMemory(KernelCore& kernel) : Object{kernel} {}
15TransferMemory::~TransferMemory() = default;
16
17SharedPtr<TransferMemory> TransferMemory::Create(KernelCore& kernel, VAddr base_address,
18 size_t size, MemoryPermission permissions) {
19 SharedPtr<TransferMemory> transfer_memory{new TransferMemory(kernel)};
20
21 transfer_memory->base_address = base_address;
22 transfer_memory->memory_size = size;
23 transfer_memory->owner_permissions = permissions;
24 transfer_memory->owner_process = kernel.CurrentProcess();
25
26 return transfer_memory;
27}
28
29ResultCode TransferMemory::MapMemory(VAddr address, size_t size, MemoryPermission permissions) {
30 if (memory_size != size) {
31 return ERR_INVALID_SIZE;
32 }
33
34 if (owner_permissions != permissions) {
35 return ERR_INVALID_STATE;
36 }
37
38 if (is_mapped) {
39 return ERR_INVALID_STATE;
40 }
41
42 const auto map_state = owner_permissions == MemoryPermission::None
43 ? MemoryState::TransferMemoryIsolated
44 : MemoryState::TransferMemory;
45 auto& vm_manager = owner_process->VMManager();
46 const auto map_result = vm_manager.MapMemoryBlock(
47 address, std::make_shared<std::vector<u8>>(size), 0, size, map_state);
48
49 if (map_result.Failed()) {
50 return map_result.Code();
51 }
52
53 is_mapped = true;
54 return RESULT_SUCCESS;
55}
56
57ResultCode TransferMemory::UnmapMemory(VAddr address, size_t size) {
58 if (memory_size != size) {
59 return ERR_INVALID_SIZE;
60 }
61
62 auto& vm_manager = owner_process->VMManager();
63 const auto result = vm_manager.UnmapRange(address, size);
64
65 if (result.IsError()) {
66 return result;
67 }
68
69 is_mapped = false;
70 return RESULT_SUCCESS;
71}
72
73} // namespace Kernel
diff --git a/src/core/hle/kernel/transfer_memory.h b/src/core/hle/kernel/transfer_memory.h
new file mode 100644
index 000000000..ec294951e
--- /dev/null
+++ b/src/core/hle/kernel/transfer_memory.h
@@ -0,0 +1,91 @@
1// Copyright 2019 yuzu emulator team
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "core/hle/kernel/object.h"
8
9union ResultCode;
10
11namespace Kernel {
12
13class KernelCore;
14class Process;
15
16enum class MemoryPermission : u32;
17
18/// Defines the interface for transfer memory objects.
19///
20/// Transfer memory is typically used for the purpose of
21/// transferring memory between separate process instances,
22/// thus the name.
23///
24class TransferMemory final : public Object {
25public:
26 static constexpr HandleType HANDLE_TYPE = HandleType::TransferMemory;
27
28 static SharedPtr<TransferMemory> Create(KernelCore& kernel, VAddr base_address, size_t size,
29 MemoryPermission permissions);
30
31 TransferMemory(const TransferMemory&) = delete;
32 TransferMemory& operator=(const TransferMemory&) = delete;
33
34 TransferMemory(TransferMemory&&) = delete;
35 TransferMemory& operator=(TransferMemory&&) = delete;
36
37 std::string GetTypeName() const override {
38 return "TransferMemory";
39 }
40
41 std::string GetName() const override {
42 return GetTypeName();
43 }
44
45 HandleType GetHandleType() const override {
46 return HANDLE_TYPE;
47 }
48
49 /// Attempts to map transfer memory with the given range and memory permissions.
50 ///
51 /// @param address The base address to being mapping memory at.
52 /// @param size The size of the memory to map, in bytes.
53 /// @param permissions The memory permissions to check against when mapping memory.
54 ///
55 /// @pre The given address, size, and memory permissions must all match
56 /// the same values that were given when creating the transfer memory
57 /// instance.
58 ///
59 ResultCode MapMemory(VAddr address, size_t size, MemoryPermission permissions);
60
61 /// Unmaps the transfer memory with the given range
62 ///
63 /// @param address The base address to begin unmapping memory at.
64 /// @param size The size of the memory to unmap, in bytes.
65 ///
66 /// @pre The given address and size must be the same as the ones used
67 /// to create the transfer memory instance.
68 ///
69 ResultCode UnmapMemory(VAddr address, size_t size);
70
71private:
72 explicit TransferMemory(KernelCore& kernel);
73 ~TransferMemory() override;
74
75 /// The base address for the memory managed by this instance.
76 VAddr base_address = 0;
77
78 /// Size of the memory, in bytes, that this instance manages.
79 size_t memory_size = 0;
80
81 /// The memory permissions that are applied to this instance.
82 MemoryPermission owner_permissions{};
83
84 /// The process that this transfer memory instance was created under.
85 Process* owner_process = nullptr;
86
87 /// Whether or not this transfer memory instance has mapped memory.
88 bool is_mapped = false;
89};
90
91} // namespace Kernel
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 8a6de83a2..63b55758b 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 = Core::Timing::BASE_CLOCK_RATE / 66; 39constexpr s64 pad_update_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 66);
40constexpr u64 accelerometer_update_ticks = Core::Timing::BASE_CLOCK_RATE / 100; 40constexpr s64 accelerometer_update_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 100);
41constexpr u64 gyroscope_update_ticks = Core::Timing::BASE_CLOCK_RATE / 100; 41constexpr s64 gyroscope_update_ticks = static_cast<s64>(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") {
@@ -75,7 +75,7 @@ IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") {
75 // Register update callbacks 75 // Register update callbacks
76 auto& core_timing = Core::System::GetInstance().CoreTiming(); 76 auto& core_timing = Core::System::GetInstance().CoreTiming();
77 pad_update_event = 77 pad_update_event =
78 core_timing.RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, int cycles_late) { 78 core_timing.RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, s64 cycles_late) {
79 UpdateControllers(userdata, cycles_late); 79 UpdateControllers(userdata, cycles_late);
80 }); 80 });
81 81
@@ -106,7 +106,7 @@ void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
106 rb.PushCopyObjects(shared_mem); 106 rb.PushCopyObjects(shared_mem);
107} 107}
108 108
109void IAppletResource::UpdateControllers(u64 userdata, int cycles_late) { 109void IAppletResource::UpdateControllers(u64 userdata, s64 cycles_late) {
110 auto& core_timing = Core::System::GetInstance().CoreTiming(); 110 auto& core_timing = Core::System::GetInstance().CoreTiming();
111 111
112 const bool should_reload = Settings::values.is_device_reload_pending.exchange(false); 112 const bool should_reload = Settings::values.is_device_reload_pending.exchange(false);
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 498602de5..d3660cad2 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -65,7 +65,7 @@ private:
65 } 65 }
66 66
67 void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); 67 void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
68 void UpdateControllers(u64 userdata, int cycles_late); 68 void UpdateControllers(u64 userdata, s64 cycles_late);
69 69
70 Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; 70 Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
71 71
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp
index fc496b654..c7f5bbf28 100644
--- a/src/core/hle/service/nvflinger/nvflinger.cpp
+++ b/src/core/hle/service/nvflinger/nvflinger.cpp
@@ -26,7 +26,7 @@
26namespace Service::NVFlinger { 26namespace Service::NVFlinger {
27 27
28constexpr std::size_t SCREEN_REFRESH_RATE = 60; 28constexpr std::size_t SCREEN_REFRESH_RATE = 60;
29constexpr u64 frame_ticks = static_cast<u64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE); 29constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE);
30 30
31NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { 31NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} {
32 displays.emplace_back(0, "Default"); 32 displays.emplace_back(0, "Default");
@@ -37,7 +37,7 @@ NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_t
37 37
38 // Schedule the screen composition events 38 // Schedule the screen composition events
39 composition_event = 39 composition_event =
40 core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, int cycles_late) { 40 core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, s64 cycles_late) {
41 Compose(); 41 Compose();
42 this->core_timing.ScheduleEvent(frame_ticks - cycles_late, composition_event); 42 this->core_timing.ScheduleEvent(frame_ticks - cycles_late, composition_event);
43 }); 43 });
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index 267a03f2d..30b29e14d 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -286,9 +286,10 @@ void GPU::ProcessSemaphoreTriggerMethod() {
286 // TODO(Kmather73): Generate a real GPU timestamp and write it here instead of 286 // TODO(Kmather73): Generate a real GPU timestamp and write it here instead of
287 // CoreTiming 287 // CoreTiming
288 block.timestamp = Core::System::GetInstance().CoreTiming().GetTicks(); 288 block.timestamp = Core::System::GetInstance().CoreTiming().GetTicks();
289 memory_manager->WriteBlock(regs.smaphore_address.SmaphoreAddress(), &block, sizeof(block)); 289 memory_manager->WriteBlock(regs.semaphore_address.SemaphoreAddress(), &block,
290 sizeof(block));
290 } else { 291 } else {
291 const u32 word{memory_manager->Read<u32>(regs.smaphore_address.SmaphoreAddress())}; 292 const u32 word{memory_manager->Read<u32>(regs.semaphore_address.SemaphoreAddress())};
292 if ((op == GpuSemaphoreOperation::AcquireEqual && word == regs.semaphore_sequence) || 293 if ((op == GpuSemaphoreOperation::AcquireEqual && word == regs.semaphore_sequence) ||
293 (op == GpuSemaphoreOperation::AcquireGequal && 294 (op == GpuSemaphoreOperation::AcquireGequal &&
294 static_cast<s32>(word - regs.semaphore_sequence) > 0) || 295 static_cast<s32>(word - regs.semaphore_sequence) > 0) ||
@@ -315,11 +316,11 @@ void GPU::ProcessSemaphoreTriggerMethod() {
315} 316}
316 317
317void GPU::ProcessSemaphoreRelease() { 318void GPU::ProcessSemaphoreRelease() {
318 memory_manager->Write<u32>(regs.smaphore_address.SmaphoreAddress(), regs.semaphore_release); 319 memory_manager->Write<u32>(regs.semaphore_address.SemaphoreAddress(), regs.semaphore_release);
319} 320}
320 321
321void GPU::ProcessSemaphoreAcquire() { 322void GPU::ProcessSemaphoreAcquire() {
322 const u32 word = memory_manager->Read<u32>(regs.smaphore_address.SmaphoreAddress()); 323 const u32 word = memory_manager->Read<u32>(regs.semaphore_address.SemaphoreAddress());
323 const auto value = regs.semaphore_acquire; 324 const auto value = regs.semaphore_acquire;
324 if (word != value) { 325 if (word != value) {
325 regs.acquire_active = true; 326 regs.acquire_active = true;
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index c1830ac8d..de30ea354 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -177,11 +177,11 @@ public:
177 u32 address_high; 177 u32 address_high;
178 u32 address_low; 178 u32 address_low;
179 179
180 GPUVAddr SmaphoreAddress() const { 180 GPUVAddr SemaphoreAddress() const {
181 return static_cast<GPUVAddr>((static_cast<GPUVAddr>(address_high) << 32) | 181 return static_cast<GPUVAddr>((static_cast<GPUVAddr>(address_high) << 32) |
182 address_low); 182 address_low);
183 } 183 }
184 } smaphore_address; 184 } semaphore_address;
185 185
186 u32 semaphore_sequence; 186 u32 semaphore_sequence;
187 u32 semaphore_trigger; 187 u32 semaphore_trigger;
@@ -263,7 +263,7 @@ private:
263 static_assert(offsetof(GPU::Regs, field_name) == position * 4, \ 263 static_assert(offsetof(GPU::Regs, field_name) == position * 4, \
264 "Field " #field_name " has invalid position") 264 "Field " #field_name " has invalid position")
265 265
266ASSERT_REG_POSITION(smaphore_address, 0x4); 266ASSERT_REG_POSITION(semaphore_address, 0x4);
267ASSERT_REG_POSITION(semaphore_sequence, 0x6); 267ASSERT_REG_POSITION(semaphore_sequence, 0x6);
268ASSERT_REG_POSITION(semaphore_trigger, 0x7); 268ASSERT_REG_POSITION(semaphore_trigger, 0x7);
269ASSERT_REG_POSITION(reference_count, 0x14); 269ASSERT_REG_POSITION(reference_count, 0x14);
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index c644271d0..e8073579f 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -538,12 +538,12 @@ private:
538 return nullptr; 538 return nullptr;
539 } 539 }
540 540
541 void Register(const Surface& object) { 541 void Register(const Surface& object) override {
542 RasterizerCache<Surface>::Register(object); 542 RasterizerCache<Surface>::Register(object);
543 } 543 }
544 544
545 /// Unregisters an object from the cache 545 /// Unregisters an object from the cache
546 void Unregister(const Surface& object) { 546 void Unregister(const Surface& object) override {
547 if (object->IsReinterpreted()) { 547 if (object->IsReinterpreted()) {
548 auto interval = GetReinterpretInterval(object); 548 auto interval = GetReinterpretInterval(object);
549 reinterpreted_surfaces.erase(interval); 549 reinterpreted_surfaces.erase(interval);
diff --git a/src/video_core/renderer_vulkan/vk_resource_manager.cpp b/src/video_core/renderer_vulkan/vk_resource_manager.cpp
index a1e117443..13c46e5b8 100644
--- a/src/video_core/renderer_vulkan/vk_resource_manager.cpp
+++ b/src/video_core/renderer_vulkan/vk_resource_manager.cpp
@@ -21,7 +21,7 @@ public:
21 CommandBufferPool(const VKDevice& device) 21 CommandBufferPool(const VKDevice& device)
22 : VKFencedPool(COMMAND_BUFFER_POOL_SIZE), device{device} {} 22 : VKFencedPool(COMMAND_BUFFER_POOL_SIZE), device{device} {}
23 23
24 void Allocate(std::size_t begin, std::size_t end) { 24 void Allocate(std::size_t begin, std::size_t end) override {
25 const auto dev = device.GetLogical(); 25 const auto dev = device.GetLogical();
26 const auto& dld = device.GetDispatchLoader(); 26 const auto& dld = device.GetDispatchLoader();
27 const u32 graphics_family = device.GetGraphicsFamily(); 27 const u32 graphics_family = device.GetGraphicsFamily();
diff --git a/src/video_core/renderer_vulkan/vk_resource_manager.h b/src/video_core/renderer_vulkan/vk_resource_manager.h
index 5bfe4cead..08ee86fa6 100644
--- a/src/video_core/renderer_vulkan/vk_resource_manager.h
+++ b/src/video_core/renderer_vulkan/vk_resource_manager.h
@@ -97,7 +97,7 @@ private:
97class VKFenceWatch final : public VKResource { 97class VKFenceWatch final : public VKResource {
98public: 98public:
99 explicit VKFenceWatch(); 99 explicit VKFenceWatch();
100 ~VKFenceWatch(); 100 ~VKFenceWatch() override;
101 101
102 /// Waits for the fence to be released. 102 /// Waits for the fence to be released.
103 void Wait(); 103 void Wait();