diff options
| author | Thog <me@thog.eu> | 2020-04-19 03:25:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-19 11:25:57 +1000 |
| commit | 644de99e86856bad3fe24a0324c06f96cee6a401 (patch) | |
| tree | 1615bc5acb7af4e9de0337bfad6ceac749cec0a0 /Ryujinx.Graphics.Gpu/Window.cs | |
| parent | 4960ab85f81f48553b7217261f4181e31d812a10 (diff) | |
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
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Window.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Window.cs | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/Ryujinx.Graphics.Gpu/Window.cs b/Ryujinx.Graphics.Gpu/Window.cs index 29c36248..e9f10e81 100644 --- a/Ryujinx.Graphics.Gpu/Window.cs +++ b/Ryujinx.Graphics.Gpu/Window.cs @@ -30,12 +30,17 @@ namespace Ryujinx.Graphics.Gpu public ImageCrop Crop { get; } /// <summary> + /// Texture acquire callback. + /// </summary> + public Action<GpuContext, object> AcquireCallback { get; } + + /// <summary> /// Texture release callback. /// </summary> - public Action<object> Callback { get; } + public Action<object> ReleaseCallback { get; } /// <summary> - /// User defined object, passed to the release callback. + /// User defined object, passed to the various callbacks. /// </summary> public object UserObj { get; } @@ -44,18 +49,21 @@ namespace Ryujinx.Graphics.Gpu /// </summary> /// <param name="info">Information of the texture to be presented</param> /// <param name="crop">Texture crop region</param> - /// <param name="callback">Texture release callback</param> + /// <param name="acquireCallback">Texture acquire callback</param> + /// <param name="releaseCallback">Texture release callback</param> /// <param name="userObj">User defined object passed to the release callback, can be used to identify the texture</param> public PresentationTexture( - TextureInfo info, - ImageCrop crop, - Action<object> callback, - object userObj) + TextureInfo info, + ImageCrop crop, + Action<GpuContext, object> acquireCallback, + Action<object> releaseCallback, + object userObj) { - Info = info; - Crop = crop; - Callback = callback; - UserObj = userObj; + Info = info; + Crop = crop; + AcquireCallback = acquireCallback; + ReleaseCallback = releaseCallback; + UserObj = userObj; } } @@ -87,20 +95,22 @@ namespace Ryujinx.Graphics.Gpu /// <param name="format">Texture format</param> /// <param name="bytesPerPixel">Texture format bytes per pixel (must match the format)</param> /// <param name="crop">Texture crop region</param> - /// <param name="callback">Texture release callback</param> + /// <param name="acquireCallback">Texture acquire callback</param> + /// <param name="releaseCallback">Texture release callback</param> /// <param name="userObj">User defined object passed to the release callback</param> public void EnqueueFrameThreadSafe( - ulong address, - int width, - int height, - int stride, - bool isLinear, - int gobBlocksInY, - Format format, - int bytesPerPixel, - ImageCrop crop, - Action<object> callback, - object userObj) + ulong address, + int width, + int height, + int stride, + bool isLinear, + int gobBlocksInY, + Format format, + int bytesPerPixel, + ImageCrop crop, + Action<GpuContext, object> acquireCallback, + Action<object> releaseCallback, + object userObj) { FormatInfo formatInfo = new FormatInfo(format, 1, 1, bytesPerPixel); @@ -120,7 +130,7 @@ namespace Ryujinx.Graphics.Gpu Target.Texture2D, formatInfo); - _frameQueue.Enqueue(new PresentationTexture(info, crop, callback, userObj)); + _frameQueue.Enqueue(new PresentationTexture(info, crop, acquireCallback, releaseCallback, userObj)); } /// <summary> @@ -134,6 +144,8 @@ namespace Ryujinx.Graphics.Gpu if (_frameQueue.TryDequeue(out PresentationTexture pt)) { + pt.AcquireCallback(_context, pt.UserObj); + Texture texture = _context.Methods.TextureManager.FindOrCreateTexture(pt.Info); texture.SynchronizeMemory(); @@ -142,7 +154,7 @@ namespace Ryujinx.Graphics.Gpu swapBuffersCallback(); - pt.Callback(pt.UserObj); + pt.ReleaseCallback(pt.UserObj); } } } |
