2020-04-19 01:25:57 +00:00
|
|
|
using Ryujinx.Graphics.Gpu;
|
|
|
|
using Ryujinx.Graphics.Gpu.Synchronization;
|
|
|
|
using Ryujinx.HLE.HOS.Kernel.Threading;
|
|
|
|
using Ryujinx.HLE.HOS.Services.Nv.Types;
|
|
|
|
using System;
|
|
|
|
|
2019-09-19 00:45:11 +00:00
|
|
|
namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl
|
NvServices refactoring (#120)
* Initial implementation of NvMap/NvHostCtrl
* More work on NvHostCtrl
* Refactoring of nvservices, move GPU Vmm, make Vmm per-process, refactor most gpu devices, move Gpu to Core, fix CbBind
* Implement GetGpuTime, support CancelSynchronization, fix issue on InsertWaitingMutex, proper double buffering support (again, not working properly for commercial games, only hb)
* Try to fix perf regression reading/writing textures, moved syncpts and events to a UserCtx class, delete global state when the process exits, other minor tweaks
* Remove now unused code, add comment about probably wrong result codes
2018-05-07 18:53:23 +00:00
|
|
|
{
|
2020-04-19 01:25:57 +00:00
|
|
|
class NvHostEvent : IDisposable
|
NvServices refactoring (#120)
* Initial implementation of NvMap/NvHostCtrl
* More work on NvHostCtrl
* Refactoring of nvservices, move GPU Vmm, make Vmm per-process, refactor most gpu devices, move Gpu to Core, fix CbBind
* Implement GetGpuTime, support CancelSynchronization, fix issue on InsertWaitingMutex, proper double buffering support (again, not working properly for commercial games, only hb)
* Try to fix perf regression reading/writing textures, moved syncpts and events to a UserCtx class, delete global state when the process exits, other minor tweaks
* Remove now unused code, add comment about probably wrong result codes
2018-05-07 18:53:23 +00:00
|
|
|
{
|
2020-04-19 01:25:57 +00:00
|
|
|
public NvFence Fence;
|
NvServices refactoring (#120)
* Initial implementation of NvMap/NvHostCtrl
* More work on NvHostCtrl
* Refactoring of nvservices, move GPU Vmm, make Vmm per-process, refactor most gpu devices, move Gpu to Core, fix CbBind
* Implement GetGpuTime, support CancelSynchronization, fix issue on InsertWaitingMutex, proper double buffering support (again, not working properly for commercial games, only hb)
* Try to fix perf regression reading/writing textures, moved syncpts and events to a UserCtx class, delete global state when the process exits, other minor tweaks
* Remove now unused code, add comment about probably wrong result codes
2018-05-07 18:53:23 +00:00
|
|
|
public NvHostEventState State;
|
2020-04-19 01:25:57 +00:00
|
|
|
public KEvent Event;
|
|
|
|
|
|
|
|
private uint _eventId;
|
|
|
|
private NvHostSyncpt _syncpointManager;
|
|
|
|
private SyncpointWaiterHandle _waiterInformation;
|
|
|
|
|
|
|
|
public NvHostEvent(NvHostSyncpt syncpointManager, uint eventId, Horizon system)
|
|
|
|
{
|
|
|
|
Fence.Id = 0;
|
|
|
|
|
|
|
|
State = NvHostEventState.Available;
|
|
|
|
|
|
|
|
Event = new KEvent(system);
|
|
|
|
|
|
|
|
_eventId = eventId;
|
|
|
|
|
|
|
|
_syncpointManager = syncpointManager;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Reset()
|
|
|
|
{
|
|
|
|
Fence.Id = NvFence.InvalidSyncPointId;
|
|
|
|
Fence.Value = 0;
|
|
|
|
State = NvHostEventState.Available;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void Signal()
|
|
|
|
{
|
|
|
|
NvHostEventState oldState = State;
|
|
|
|
|
|
|
|
State = NvHostEventState.Signaling;
|
|
|
|
|
|
|
|
if (oldState == NvHostEventState.Waiting)
|
|
|
|
{
|
|
|
|
Event.WritableEvent.Signal();
|
|
|
|
}
|
|
|
|
|
|
|
|
State = NvHostEventState.Signaled;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void GpuSignaled()
|
|
|
|
{
|
|
|
|
Signal();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Cancel(GpuContext gpuContext)
|
|
|
|
{
|
|
|
|
if (_waiterInformation != null)
|
|
|
|
{
|
|
|
|
gpuContext.Synchronization.UnregisterCallback(Fence.Id, _waiterInformation);
|
|
|
|
|
|
|
|
Signal();
|
|
|
|
}
|
|
|
|
|
|
|
|
Event.WritableEvent.Clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Wait(GpuContext gpuContext, NvFence fence)
|
|
|
|
{
|
|
|
|
Fence = fence;
|
|
|
|
State = NvHostEventState.Waiting;
|
|
|
|
|
|
|
|
_waiterInformation = gpuContext.Synchronization.RegisterCallbackOnSyncpoint(Fence.Id, Fence.Value, GpuSignaled);
|
|
|
|
}
|
|
|
|
|
|
|
|
public string DumpState(GpuContext gpuContext)
|
|
|
|
{
|
|
|
|
string res = $"\nNvHostEvent {_eventId}:\n";
|
|
|
|
res += $"\tState: {State}\n";
|
|
|
|
|
|
|
|
if (State == NvHostEventState.Waiting)
|
|
|
|
{
|
|
|
|
res += "\tFence:\n";
|
|
|
|
res += $"\t\tId : {Fence.Id}\n";
|
|
|
|
res += $"\t\tThreshold : {Fence.Value}\n";
|
|
|
|
res += $"\t\tCurrent Value : {gpuContext.Synchronization.GetSyncpointValue(Fence.Id)}\n";
|
|
|
|
res += $"\t\tWaiter Valid : {_waiterInformation != null}\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
Event.ReadableEvent.DecrementReferenceCount();
|
|
|
|
Event.WritableEvent.DecrementReferenceCount();
|
|
|
|
}
|
NvServices refactoring (#120)
* Initial implementation of NvMap/NvHostCtrl
* More work on NvHostCtrl
* Refactoring of nvservices, move GPU Vmm, make Vmm per-process, refactor most gpu devices, move Gpu to Core, fix CbBind
* Implement GetGpuTime, support CancelSynchronization, fix issue on InsertWaitingMutex, proper double buffering support (again, not working properly for commercial games, only hb)
* Try to fix perf regression reading/writing textures, moved syncpts and events to a UserCtx class, delete global state when the process exits, other minor tweaks
* Remove now unused code, add comment about probably wrong result codes
2018-05-07 18:53:23 +00:00
|
|
|
}
|
|
|
|
}
|