NVServices: Make NVEvents Automatic according to documentation.

This commit is contained in:
Fernando Sahmkow 2019-06-17 15:27:42 -04:00 committed by FernandoS27
parent b6844bec60
commit 0335a25d1f
4 changed files with 13 additions and 7 deletions

View file

@ -142,7 +142,6 @@ u32 nvhost_ctrl::IocCtrlEventRegister(const std::vector<u8>& input, std::vector<
return NvResult::BadParameter; return NvResult::BadParameter;
} }
events_interface.RegisterEvent(event_id); events_interface.RegisterEvent(event_id);
events_interface.events[event_id].writable->Signal();
return NvResult::Success; return NvResult::Success;
} }
@ -171,7 +170,11 @@ u32 nvhost_ctrl::IocCtrlEventSignal(const std::vector<u8>& input, std::vector<u8
return NvResult::BadParameter; return NvResult::BadParameter;
} }
if (events_interface.status[event_id] == EventState::Waiting) { if (events_interface.status[event_id] == EventState::Waiting) {
events_interface.LiberateEvent(event_id); auto& gpu = system.GPU();
if (gpu.CancelSyncptInterrupt(events_interface.assigned_syncpt[event_id],
events_interface.assigned_value[event_id])) {
events_interface.LiberateEvent(event_id);
}
} }
return NvResult::Success; return NvResult::Success;
} }

View file

@ -40,8 +40,8 @@ Module::Module(Core::System& system) {
auto& kernel = system.Kernel(); auto& kernel = system.Kernel();
for (u32 i = 0; i < MaxNvEvents; i++) { for (u32 i = 0; i < MaxNvEvents; i++) {
std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); std::string event_label = fmt::format("NVDRV::NvEvent_{}", i);
events_interface.events[i] = events_interface.events[i] = Kernel::WritableEvent::CreateEventPair(
Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, event_label); kernel, Kernel::ResetType::Automatic, event_label);
events_interface.status[i] = EventState::Free; events_interface.status[i] = EventState::Free;
events_interface.registered[i] = false; events_interface.registered[i] = false;
} }

View file

@ -97,15 +97,18 @@ void GPU::RegisterSyncptInterrupt(const u32 syncpoint_id, const u32 value) {
syncpt_interrupts[syncpoint_id].emplace_back(value); syncpt_interrupts[syncpoint_id].emplace_back(value);
} }
void GPU::CancelSyncptInterrupt(const u32 syncpoint_id, const u32 value) { bool GPU::CancelSyncptInterrupt(const u32 syncpoint_id, const u32 value) {
sync_mutex.lock();
auto it = syncpt_interrupts[syncpoint_id].begin(); auto it = syncpt_interrupts[syncpoint_id].begin();
while (it != syncpt_interrupts[syncpoint_id].end()) { while (it != syncpt_interrupts[syncpoint_id].end()) {
if (value == *it) { if (value == *it) {
it = syncpt_interrupts[syncpoint_id].erase(it); it = syncpt_interrupts[syncpoint_id].erase(it);
return; return true;
} }
it++; it++;
} }
return false;
sync_mutex.unlock();
} }
u32 RenderTargetBytesPerPixel(RenderTargetFormat format) { u32 RenderTargetBytesPerPixel(RenderTargetFormat format) {

View file

@ -174,7 +174,7 @@ public:
void RegisterSyncptInterrupt(const u32 syncpoint_id, const u32 value); void RegisterSyncptInterrupt(const u32 syncpoint_id, const u32 value);
void CancelSyncptInterrupt(const u32 syncpoint_id, const u32 value); bool CancelSyncptInterrupt(const u32 syncpoint_id, const u32 value);
void Guard(bool guard_set) { void Guard(bool guard_set) {
if (guard_set) { if (guard_set) {