summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h
index 0e8eed113..597acc9c6 100644
--- a/src/core/hle/service/nvdrv/nvdrv.h
+++ b/src/core/hle/service/nvdrv/nvdrv.h
@@ -27,16 +27,17 @@ class nvdevice;
27} 27}
28 28
29struct EventsInterface { 29struct EventsInterface {
30 u64 events_mask; 30 u64 events_mask{};
31 std::array<Kernel::EventPair, MaxNvEvents> events; 31 std::array<Kernel::EventPair, MaxNvEvents> events;
32 std::array<EventState, MaxNvEvents> status; 32 std::array<EventState, MaxNvEvents> status{};
33 std::array<bool, MaxNvEvents> registered; 33 std::array<bool, MaxNvEvents> registered{};
34 std::array<u32, MaxNvEvents> assigned_syncpt; 34 std::array<u32, MaxNvEvents> assigned_syncpt{};
35 std::array<u32, MaxNvEvents> assigned_value; 35 std::array<u32, MaxNvEvents> assigned_value{};
36 u32 GetFreeEvent() { 36 u32 GetFreeEvent() {
37 u64 mask = events_mask; 37 u64 mask = events_mask;
38 for (u32 i = 0; i < MaxNvEvents; i++) { 38 for (u32 i = 0; i < MaxNvEvents; i++) {
39 if (mask & 0x1) { 39 const bool is_free = (mask & 0x1) == 0;
40 if (is_free) {
40 if (status[i] == EventState::Registered || status[i] == EventState::Free) { 41 if (status[i] == EventState::Registered || status[i] == EventState::Free) {
41 return i; 42 return i;
42 } 43 }
@@ -46,10 +47,16 @@ struct EventsInterface {
46 return 0xFFFFFFFF; 47 return 0xFFFFFFFF;
47 } 48 }
48 void SetEventStatus(const u32 event_id, EventState new_status) { 49 void SetEventStatus(const u32 event_id, EventState new_status) {
50 EventState old_status = status[event_id];
51 if (old_status == new_status)
52 return;
49 status[event_id] = new_status; 53 status[event_id] = new_status;
50 if (new_status == EventState::Registered) { 54 if (new_status == EventState::Registered) {
51 registered[event_id] = true; 55 registered[event_id] = true;
52 } 56 }
57 if (new_status == EventState::Waiting || new_status == EventState::Busy) {
58 events_mask |= (1 << event_id);
59 }
53 } 60 }
54 void RegisterEvent(const u32 event_id) { 61 void RegisterEvent(const u32 event_id) {
55 registered[event_id] = true; 62 registered[event_id] = true;
@@ -65,6 +72,7 @@ struct EventsInterface {
65 } 72 }
66 void LiberateEvent(const u32 event_id) { 73 void LiberateEvent(const u32 event_id) {
67 status[event_id] = registered[event_id] ? EventState::Registered : EventState::Free; 74 status[event_id] = registered[event_id] ? EventState::Registered : EventState::Free;
75 events_mask &= ~(1 << event_id);
68 } 76 }
69}; 77};
70 78