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;
}
events_interface.RegisterEvent(event_id);
events_interface.events[event_id].writable->Signal();
return NvResult::Success;
}
@ -171,7 +170,11 @@ u32 nvhost_ctrl::IocCtrlEventSignal(const std::vector<u8>& input, std::vector<u8
return NvResult::BadParameter;
}
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;
}

View file

@ -40,8 +40,8 @@ Module::Module(Core::System& system) {
auto& kernel = system.Kernel();
for (u32 i = 0; i < MaxNvEvents; i++) {
std::string event_label = fmt::format("NVDRV::NvEvent_{}", i);
events_interface.events[i] =
Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, event_label);
events_interface.events[i] = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Automatic, event_label);
events_interface.status[i] = EventState::Free;
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);
}
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();
while (it != syncpt_interrupts[syncpoint_id].end()) {
if (value == *it) {
it = syncpt_interrupts[syncpoint_id].erase(it);
return;
return true;
}
it++;
}
return false;
sync_mutex.unlock();
}
u32 RenderTargetBytesPerPixel(RenderTargetFormat format) {

View file

@ -174,7 +174,7 @@ public:
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) {
if (guard_set) {