Skip to content

Commit cb4f9f5

Browse files
author
N3xoX1
committed
Video: implement nvhost_ctrl::IocCtrlClearEventWait
1 parent 7cbbe1b commit cb4f9f5

5 files changed

Lines changed: 28 additions & 2 deletions

File tree

src/nxemu-module-spec/base.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
enum
1818
{
1919
MODULE_LOADER_SPECS_VERSION = 0x0108,
20-
MODULE_VIDEO_SPECS_VERSION = 0x0109,
20+
MODULE_VIDEO_SPECS_VERSION = 0x010A,
2121
MODULE_CPU_SPECS_VERSION = 0x0104,
2222
MODULE_OPERATING_SYSTEM_SPECS_VERSION = 0x0109,
2323
};

src/nxemu-module-spec/video.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ __interface IVideo
6363
void ApplyOpOnDeviceMemoryPointer(const uint8_t * pointer, uint32_t * scratchBuffer, size_t scratchBufferSize, DeviceMemoryOperation operation, void * userData) = 0;
6464
RasterizerDownloadArea OnCPURead(uint64_t addr, uint64_t size) = 0;
6565
bool OnCPUWrite(uint64_t addr, uint64_t size) = 0;
66+
void DeregisterHostAction(uint32_t syncpoint_id, uint32_t handle) = 0;
6667
uint32_t HostSyncpointValue(uint32_t id) = 0;
6768
uint32_t HostSyncpointRegisterAction(uint32_t fence_id, uint32_t target_value, HostActionCallback operation, uint32_t slot, void * userData) = 0;
6869
};

src/nxemu-os/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,26 @@ NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(IocCtrlEventUnregisterBatchPar
260260
}
261261

262262
NvResult nvhost_ctrl::IocCtrlClearEventWait(IocCtrlEventClearParams& params) {
263-
UNIMPLEMENTED();
263+
u32 event_id = params.event_id.slot;
264+
LOG_DEBUG(Service_NVDRV, "called, event_id: {:X}", event_id);
265+
266+
if (event_id >= MaxNvEvents) {
267+
return NvResult::BadParameter;
268+
}
269+
270+
auto lock = NvEventsLock();
271+
272+
auto& event = events[event_id];
273+
if (event.status.exchange(EventState::Cancelling, std::memory_order_acq_rel) ==
274+
EventState::Waiting) {
275+
system.GetVideo().DeregisterHostAction(event.assigned_syncpt, event.wait_handle);
276+
syncpoint_manager.UpdateMin(event.assigned_syncpt);
277+
event.wait_handle = {};
278+
}
279+
event.fails++;
280+
event.status.store(EventState::Cancelled, std::memory_order_release);
281+
event.kevent->Clear();
282+
264283
return NvResult::Success;
265284
}
266285

src/nxemu-video/video_manager.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@ bool VideoManager::OnCPUWrite(uint64_t addr, uint64_t size)
183183
return impl->m_gpuCore->OnCPUWrite(addr, size);
184184
}
185185

186+
void VideoManager::DeregisterHostAction(uint32_t syncpoint_id, uint32_t handle)
187+
{
188+
impl->m_host1x->GetSyncpointManager().DeregisterHostAction(syncpoint_id, handle);
189+
}
190+
186191
uint32_t VideoManager::HostSyncpointValue(uint32_t id)
187192
{
188193
return impl->m_host1x->GetSyncpointManager().GetHostSyncpointValue(id);

src/nxemu-video/video_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class VideoManager :
3333
void ApplyOpOnDeviceMemoryPointer(const uint8_t * pointer, uint32_t* scratchBuffer, size_t scratchBufferSize, DeviceMemoryOperation operation, void* userData) override;
3434
RasterizerDownloadArea OnCPURead(uint64_t addr, uint64_t size) override;
3535
bool OnCPUWrite(uint64_t addr, uint64_t size) override;
36+
void DeregisterHostAction(uint32_t syncpoint_id, uint32_t handle) override;
3637
uint32_t HostSyncpointValue(uint32_t id) override;
3738
uint32_t HostSyncpointRegisterAction(uint32_t fence_id, uint32_t target_value, HostActionCallback operation, uint32_t slot, void * userData) override;
3839

0 commit comments

Comments
 (0)