diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | 18 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/nvdrv.cpp | 2 |
2 files changed, 12 insertions, 8 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index 8e28c2fa4..5b1253f6b 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | |||
| @@ -102,6 +102,7 @@ u32 nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& | |||
| 102 | params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; | 102 | params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; |
| 103 | } | 103 | } |
| 104 | params.value |= event_id; | 104 | params.value |= event_id; |
| 105 | events_interface.events[event_id].writable->Clear(); | ||
| 105 | gpu.RegisterEvent(event_id, params.syncpt_id, params.threshold); | 106 | gpu.RegisterEvent(event_id, params.syncpt_id, params.threshold); |
| 106 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 107 | std::memcpy(output.data(), ¶ms, sizeof(params)); |
| 107 | gpu.Guard(false); | 108 | gpu.Guard(false); |
| @@ -115,26 +116,29 @@ u32 nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& | |||
| 115 | u32 nvhost_ctrl::IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output) { | 116 | u32 nvhost_ctrl::IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output) { |
| 116 | IocCtrlEventRegisterParams params{}; | 117 | IocCtrlEventRegisterParams params{}; |
| 117 | std::memcpy(¶ms, input.data(), sizeof(params)); | 118 | std::memcpy(¶ms, input.data(), sizeof(params)); |
| 118 | if (params.user_event_id >= MaxNvEvents) { | 119 | const u32 event_id = params.user_event_id & 0x00FF; |
| 120 | if (event_id >= MaxNvEvents) { | ||
| 119 | return NvResult::BadParameter; | 121 | return NvResult::BadParameter; |
| 120 | } | 122 | } |
| 121 | if (events_interface.registered[params.user_event_id]) { | 123 | if (events_interface.registered[event_id]) { |
| 122 | return NvResult::BadParameter; | 124 | return NvResult::BadParameter; |
| 123 | } | 125 | } |
| 124 | events_interface.RegisterEvent(params.user_event_id); | 126 | events_interface.RegisterEvent(event_id); |
| 127 | events_interface.events[event_id].writable->Signal(); | ||
| 125 | return NvResult::Success; | 128 | return NvResult::Success; |
| 126 | } | 129 | } |
| 127 | 130 | ||
| 128 | u32 nvhost_ctrl::IocCtrlEventUnregister(const std::vector<u8>& input, std::vector<u8>& output) { | 131 | u32 nvhost_ctrl::IocCtrlEventUnregister(const std::vector<u8>& input, std::vector<u8>& output) { |
| 129 | IocCtrlEventUnregisterParams params{}; | 132 | IocCtrlEventUnregisterParams params{}; |
| 130 | std::memcpy(¶ms, input.data(), sizeof(params)); | 133 | std::memcpy(¶ms, input.data(), sizeof(params)); |
| 131 | if (params.user_event_id >= MaxNvEvents) { | 134 | const u32 event_id = params.user_event_id & 0x00FF; |
| 135 | if (event_id >= MaxNvEvents) { | ||
| 132 | return NvResult::BadParameter; | 136 | return NvResult::BadParameter; |
| 133 | } | 137 | } |
| 134 | if (!events_interface.registered[params.user_event_id]) { | 138 | if (!events_interface.registered[event_id]) { |
| 135 | return NvResult::BadParameter; | 139 | return NvResult::BadParameter; |
| 136 | } | 140 | } |
| 137 | events_interface.UnregisterEvent(params.user_event_id); | 141 | events_interface.UnregisterEvent(event_id); |
| 138 | return NvResult::Success; | 142 | return NvResult::Success; |
| 139 | } | 143 | } |
| 140 | 144 | ||
| @@ -142,7 +146,7 @@ u32 nvhost_ctrl::IocCtrlEventSignal(const std::vector<u8>& input, std::vector<u8 | |||
| 142 | IocCtrlEventSignalParams params{}; | 146 | IocCtrlEventSignalParams params{}; |
| 143 | std::memcpy(¶ms, input.data(), sizeof(params)); | 147 | std::memcpy(¶ms, input.data(), sizeof(params)); |
| 144 | // TODO(Blinkhawk): This is normally called when an NvEvents timeout on WaitSynchronization | 148 | // TODO(Blinkhawk): This is normally called when an NvEvents timeout on WaitSynchronization |
| 145 | // It is believed to cancel the GPU Event. However, better research is required | 149 | // It is believed from RE to cancel the GPU Event. However, better research is required |
| 146 | u32 event_id = params.user_event_id & 0x00FF; | 150 | u32 event_id = params.user_event_id & 0x00FF; |
| 147 | LOG_WARNING(Service_NVDRV, "(STUBBED) called, user_event_id: {:X}", event_id); | 151 | LOG_WARNING(Service_NVDRV, "(STUBBED) called, user_event_id: {:X}", event_id); |
| 148 | if (event_id >= MaxNvEvents) { | 152 | if (event_id >= MaxNvEvents) { |
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 618bcbc7c..3a716e734 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp | |||
| @@ -40,7 +40,7 @@ Module::Module() { | |||
| 40 | for (u32 i = 0; i < MaxNvEvents; i++) { | 40 | for (u32 i = 0; i < MaxNvEvents; i++) { |
| 41 | std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); | 41 | std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); |
| 42 | events_interface.events[i] = Kernel::WritableEvent::CreateEventPair( | 42 | events_interface.events[i] = Kernel::WritableEvent::CreateEventPair( |
| 43 | kernel, Kernel::ResetType::Automatic, event_label); | 43 | kernel, Kernel::ResetType::Manual, event_label); |
| 44 | events_interface.status[i] = EventState::Free; | 44 | events_interface.status[i] = EventState::Free; |
| 45 | events_interface.registered[i] = false; | 45 | events_interface.registered[i] = false; |
| 46 | } | 46 | } |