diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/nvdrv/nvdrv.h | 20 |
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 | ||
| 29 | struct EventsInterface { | 29 | struct 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 | ||