From 644de99e86856bad3fe24a0324c06f96cee6a401 Mon Sep 17 00:00:00 2001 From: Thog Date: Sun, 19 Apr 2020 03:25:57 +0200 Subject: Implement GPU syncpoints (#980) * Implement GPU syncpoints This adds support for GPU syncpoints on the GPU backend & nvservices. Everything that was implemented here is based on my researches, hardware testing of the GM20B and reversing of nvservices (8.1.0). Thanks to @fincs for the informations about some behaviours of the pusher and for the initial informations about syncpoints. * syncpoint: address gdkchan's comments * Add some missing logic to handle SubmitGpfifo correctly * Handle the NV event API correctly * evnt => hostEvent * Finish addressing gdkchan's comments * nvservices: write the output buffer even when an error is returned * dma pusher: Implemnet prefetch barrier lso fix when the commands should be prefetch. * Partially fix prefetch barrier * Add a missing syncpoint check in QueryEvent of NvHostSyncPt * Address Ac_K's comments and fix GetSyncpoint for ChannelResourcePolicy == Channel * fix SyncptWait & SyncptWaitEx cmds logic * Address ripinperi's comments * Address gdkchan's comments * Move user event management to the control channel * Fix mm implementation, nvdec works again * Address ripinperi's comments * Address gdkchan's comments * Implement nvhost-ctrl close accurately + make nvservices dispose channels when stopping the emulator * Fix typo in MultiMediaOperationType --- Ryujinx.Graphics.Gpu/State/FenceActionOperation.cs | 11 +++++++++++ Ryujinx.Graphics.Gpu/State/MethodOffset.cs | 10 ++++++++++ Ryujinx.Graphics.Gpu/State/ReportMode.cs | 5 +++-- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 Ryujinx.Graphics.Gpu/State/FenceActionOperation.cs (limited to 'Ryujinx.Graphics.Gpu/State') diff --git a/Ryujinx.Graphics.Gpu/State/FenceActionOperation.cs b/Ryujinx.Graphics.Gpu/State/FenceActionOperation.cs new file mode 100644 index 00000000..c03443a8 --- /dev/null +++ b/Ryujinx.Graphics.Gpu/State/FenceActionOperation.cs @@ -0,0 +1,11 @@ +namespace Ryujinx.Graphics.Gpu.State +{ + /// + /// Fence action operations. + /// + enum FenceActionOperation + { + Acquire = 0, + Increment = 1 + } +} diff --git a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs index b8ee7e91..b542d9b8 100644 --- a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs +++ b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs @@ -8,6 +8,15 @@ namespace Ryujinx.Graphics.Gpu.State /// enum MethodOffset { + BindChannel = 0x00, + FenceValue = 0x1c, + FenceAction = 0x1d, + WaitForIdle = 0x44, + MacroUploadAddress = 0x45, + SendMacroCodeData = 0x46, + MacroBindingIndex = 0x47, + BindMacro = 0x48, + SetMmeShadowRamControl = 0x49, I2mParams = 0x60, LaunchDma = 0x6c, LoadInlineData = 0x6d, @@ -15,6 +24,7 @@ namespace Ryujinx.Graphics.Gpu.State CopySrcTexture = 0x8c, DispatchParamsAddress = 0xad, Dispatch = 0xaf, + SyncpointAction = 0xb2, CopyBuffer = 0xc0, RasterizeEnable = 0xdf, CopyBufferParams = 0x100, diff --git a/Ryujinx.Graphics.Gpu/State/ReportMode.cs b/Ryujinx.Graphics.Gpu/State/ReportMode.cs index e557f4ca..0625f3f6 100644 --- a/Ryujinx.Graphics.Gpu/State/ReportMode.cs +++ b/Ryujinx.Graphics.Gpu/State/ReportMode.cs @@ -5,7 +5,8 @@ namespace Ryujinx.Graphics.Gpu.State /// enum ReportMode { - Semaphore = 0, - Counter = 2 + Release = 0, + Acquire = 1, + Counter = 2 } } \ No newline at end of file -- cgit v1.2.3