diff options
author | Fernando S <fsahmkow27@gmail.com> | 2021-10-06 20:02:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-06 20:02:31 +0200 |
commit | f84328934f5e09894a69d9fa1d2f6a34c715321b (patch) | |
tree | eafe64da6ca2bb195cf5523d3fa13f89f117f897 /src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | |
parent | Merge pull request #7090 from Moonlacer/tas_spacing_addition (diff) | |
parent | nvflinger: Use jthread and stop_token for VSync thread (diff) | |
download | yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.tar yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.tar.gz yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.tar.bz2 yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.tar.lz yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.tar.xz yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.tar.zst yuzu-f84328934f5e09894a69d9fa1d2f6a34c715321b.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index 775e76330..8b4867ca7 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp @@ -111,7 +111,6 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector event.event->GetWritableEvent().Signal(); return NvResult::Success; } - auto lock = gpu.LockSync(); const u32 current_syncpoint_value = event.fence.value; const s32 diff = current_syncpoint_value - params.threshold; if (diff >= 0) { @@ -132,23 +131,24 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector } EventState status = events_interface.status[event_id]; - if (event_id < MaxNvEvents || status == EventState::Free || status == EventState::Registered) { - events_interface.SetEventStatus(event_id, EventState::Waiting); - events_interface.assigned_syncpt[event_id] = params.syncpt_id; - events_interface.assigned_value[event_id] = target_value; - if (is_async) { - params.value = params.syncpt_id << 4; - } else { - params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; - } - params.value |= event_id; - event.event->GetWritableEvent().Clear(); - gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); + const bool bad_parameter = status != EventState::Free && status != EventState::Registered; + if (bad_parameter) { std::memcpy(output.data(), ¶ms, sizeof(params)); - return NvResult::Timeout; + return NvResult::BadParameter; } + events_interface.SetEventStatus(event_id, EventState::Waiting); + events_interface.assigned_syncpt[event_id] = params.syncpt_id; + events_interface.assigned_value[event_id] = target_value; + if (is_async) { + params.value = params.syncpt_id << 4; + } else { + params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; + } + params.value |= event_id; + event.event->GetWritableEvent().Clear(); + gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); std::memcpy(output.data(), ¶ms, sizeof(params)); - return NvResult::BadParameter; + return NvResult::Timeout; } NvResult nvhost_ctrl::IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output) { |