aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Window.cs
diff options
context:
space:
mode:
authorThog <me@thog.eu>2020-04-19 03:25:57 +0200
committerGitHub <noreply@github.com>2020-04-19 11:25:57 +1000
commit644de99e86856bad3fe24a0324c06f96cee6a401 (patch)
tree1615bc5acb7af4e9de0337bfad6ceac749cec0a0 /Ryujinx.Graphics.Gpu/Window.cs
parent4960ab85f81f48553b7217261f4181e31d812a10 (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.cs62
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);
}
}
}