summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2021-11-07 14:17:32 +0100
committerFernando Sahmkow <fsahmkow27@gmail.com>2022-10-06 21:00:51 +0200
commit2c62563ab58a70236a39571149f8370f3fdfb2a3 (patch)
tree02cfe114d95ca19d1b35cbdd659d8ca8f27fb501 /src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
parentVideoCore: implement channels on gpu caches. (diff)
downloadyuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.tar
yuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.tar.gz
yuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.tar.bz2
yuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.tar.lz
yuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.tar.xz
yuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.tar.zst
yuzu-2c62563ab58a70236a39571149f8370f3fdfb2a3.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
index abde2a6d3..0e22d9273 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
@@ -52,6 +52,8 @@ NvResult nvhost_ctrl::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>&
return IocCtrlEventRegister(input, output);
case 0x20:
return IocCtrlEventUnregister(input, output);
+ case 0x21:
+ return IocCtrlEventUnregisterBatch(input, output);
}
break;
default:
@@ -249,6 +251,25 @@ NvResult nvhost_ctrl::IocCtrlEventUnregister(const std::vector<u8>& input,
return FreeEvent(event_id);
}
+NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(const std::vector<u8>& input,
+ std::vector<u8>& output) {
+ IocCtrlEventUnregisterBatchParams params{};
+ std::memcpy(&params, input.data(), sizeof(params));
+ u64 event_mask = params.user_events;
+ LOG_DEBUG(Service_NVDRV, " called, event_mask: {:X}", event_mask);
+
+ auto lock = NvEventsLock();
+ while (event_mask != 0) {
+ const u64 event_id = std::countr_zero(event_mask);
+ event_mask &= ~(1ULL << event_id);
+ const auto result = FreeEvent(static_cast<u32>(event_id));
+ if (result != NvResult::Success) {
+ return result;
+ }
+ }
+ return NvResult::Success;
+}
+
NvResult nvhost_ctrl::IocCtrlClearEventWait(const std::vector<u8>& input, std::vector<u8>& output) {
IocCtrlEventClearParams params{};
std::memcpy(&params, input.data(), sizeof(params));
@@ -362,10 +383,11 @@ u32 nvhost_ctrl::FindFreeNvEvent(u32 syncpoint_id) {
}
void nvhost_ctrl::SignalNvEvent(u32 syncpoint_id, u32 value) {
- const u32 max = MaxNvEvents - std::countl_zero(events_mask);
- const u32 min = std::countr_zero(events_mask);
- for (u32 i = min; i < max; i++) {
- auto& event = events[i];
+ u64 signal_mask = events_mask;
+ while (signal_mask != 0) {
+ const u64 event_id = std::countr_zero(signal_mask);
+ signal_mask &= ~(1ULL << event_id);
+ auto& event = events[event_id];
if (event.assigned_syncpt != syncpoint_id || event.assigned_value != value) {
continue;
}