diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/GpuChannel.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/GpuChannel.cs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Gpu/GpuChannel.cs b/Ryujinx.Graphics.Gpu/GpuChannel.cs new file mode 100644 index 00000000..79143449 --- /dev/null +++ b/Ryujinx.Graphics.Gpu/GpuChannel.cs @@ -0,0 +1,78 @@ +using Ryujinx.Graphics.Gpu.Engine.GPFifo; +using Ryujinx.Graphics.Gpu.Image; +using Ryujinx.Graphics.Gpu.Memory; +using System; + +namespace Ryujinx.Graphics.Gpu +{ + /// <summary> + /// Represents a GPU channel. + /// </summary> + public class GpuChannel : IDisposable + { + private readonly GpuContext _context; + private readonly GPFifoDevice _device; + private readonly GPFifoProcessor _processor; + + /// <summary> + /// Channel buffer bindings manager. + /// </summary> + internal BufferManager BufferManager { get; } + + /// <summary> + /// Channel texture bindings manager. + /// </summary> + internal TextureManager TextureManager { get; } + + /// <summary> + /// Creates a new instance of a GPU channel. + /// </summary> + /// <param name="context">GPU context that the channel belongs to</param> + internal GpuChannel(GpuContext context) + { + _context = context; + _device = context.GPFifo; + _processor = new GPFifoProcessor(context, this); + BufferManager = new BufferManager(context); + TextureManager = new TextureManager(context, this); + } + + /// <summary> + /// Push a GPFIFO entry in the form of a prefetched command buffer. + /// It is intended to be used by nvservices to handle special cases. + /// </summary> + /// <param name="commandBuffer">The command buffer containing the prefetched commands</param> + public void PushHostCommandBuffer(int[] commandBuffer) + { + _device.PushHostCommandBuffer(_processor, commandBuffer); + } + + /// <summary> + /// Pushes GPFIFO entries. + /// </summary> + /// <param name="entries">GPFIFO entries</param> + public void PushEntries(ReadOnlySpan<ulong> entries) + { + _device.PushEntries(_processor, entries); + } + + /// <summary> + /// Disposes the GPU channel. + /// It's an error to use the GPU channel after disposal. + /// </summary> + public void Dispose() + { + _context.DisposedChannels.Enqueue(this); + } + + /// <summary> + /// Performs disposal of the host GPU resources used by this channel, that are not shared. + /// This must only be called from the render thread. + /// </summary> + internal void Destroy() + { + BufferManager.Dispose(); + TextureManager.Dispose(); + } + } +} |
