aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
diff options
context:
space:
mode:
authorTSR Berry <20988865+TSRBerry@users.noreply.github.com>2023-04-08 01:22:00 +0200
committerMary <thog@protonmail.com>2023-04-27 23:51:14 +0200
commitcee712105850ac3385cd0091a923438167433f9f (patch)
tree4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/PersistentBuffers.cs')
-rw-r--r--Ryujinx.Graphics.OpenGL/PersistentBuffers.cs136
1 files changed, 0 insertions, 136 deletions
diff --git a/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs b/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
deleted file mode 100644
index 654e25b9..00000000
--- a/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using OpenTK.Graphics.OpenGL;
-using Ryujinx.Common.Logging;
-using Ryujinx.Graphics.GAL;
-using Ryujinx.Graphics.OpenGL.Image;
-using System;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-namespace Ryujinx.Graphics.OpenGL
-{
- class PersistentBuffers : IDisposable
- {
- private PersistentBuffer _main = new PersistentBuffer();
- private PersistentBuffer _background = new PersistentBuffer();
-
- public PersistentBuffer Default => BackgroundContextWorker.InBackground ? _background : _main;
-
- public void Dispose()
- {
- _main?.Dispose();
- _background?.Dispose();
- }
- }
-
- class PersistentBuffer : IDisposable
- {
- private IntPtr _bufferMap;
- private int _copyBufferHandle;
- private int _copyBufferSize;
-
- private byte[] _data;
- private IntPtr _dataMap;
-
- private void EnsureBuffer(int requiredSize)
- {
- if (_copyBufferSize < requiredSize && _copyBufferHandle != 0)
- {
- GL.DeleteBuffer(_copyBufferHandle);
-
- _copyBufferHandle = 0;
- }
-
- if (_copyBufferHandle == 0)
- {
- _copyBufferHandle = GL.GenBuffer();
- _copyBufferSize = requiredSize;
-
- GL.BindBuffer(BufferTarget.CopyWriteBuffer, _copyBufferHandle);
- GL.BufferStorage(BufferTarget.CopyWriteBuffer, requiredSize, IntPtr.Zero, BufferStorageFlags.MapReadBit | BufferStorageFlags.MapPersistentBit);
-
- _bufferMap = GL.MapBufferRange(BufferTarget.CopyWriteBuffer, IntPtr.Zero, requiredSize, BufferAccessMask.MapReadBit | BufferAccessMask.MapPersistentBit);
- }
- }
-
- public unsafe IntPtr GetHostArray(int requiredSize)
- {
- if (_data == null || _data.Length < requiredSize)
- {
- _data = GC.AllocateUninitializedArray<byte>(requiredSize, true);
-
- _dataMap = (IntPtr)Unsafe.AsPointer(ref MemoryMarshal.GetArrayDataReference(_data));
- }
-
- return _dataMap;
- }
-
- private void Sync()
- {
- GL.MemoryBarrier(MemoryBarrierFlags.ClientMappedBufferBarrierBit);
-
- IntPtr sync = GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None);
- WaitSyncStatus syncResult = GL.ClientWaitSync(sync, ClientWaitSyncFlags.SyncFlushCommandsBit, 1000000000);
-
- if (syncResult == WaitSyncStatus.TimeoutExpired)
- {
- Logger.Error?.PrintMsg(LogClass.Gpu, $"Failed to sync persistent buffer state within 1000ms. Continuing...");
- }
-
- GL.DeleteSync(sync);
- }
-
- public unsafe ReadOnlySpan<byte> GetTextureData(TextureView view, int size)
- {
- EnsureBuffer(size);
-
- GL.BindBuffer(BufferTarget.PixelPackBuffer, _copyBufferHandle);
-
- view.WriteToPbo(0, false);
-
- GL.BindBuffer(BufferTarget.PixelPackBuffer, 0);
-
- Sync();
-
- return new ReadOnlySpan<byte>(_bufferMap.ToPointer(), size);
- }
-
- public unsafe ReadOnlySpan<byte> GetTextureData(TextureView view, int size, int layer, int level)
- {
- EnsureBuffer(size);
-
- GL.BindBuffer(BufferTarget.PixelPackBuffer, _copyBufferHandle);
-
- int offset = view.WriteToPbo2D(0, layer, level);
-
- GL.BindBuffer(BufferTarget.PixelPackBuffer, 0);
-
- Sync();
-
- return new ReadOnlySpan<byte>(_bufferMap.ToPointer(), size).Slice(offset);
- }
-
- public unsafe ReadOnlySpan<byte> GetBufferData(BufferHandle buffer, int offset, int size)
- {
- EnsureBuffer(size);
-
- GL.BindBuffer(BufferTarget.CopyReadBuffer, buffer.ToInt32());
- GL.BindBuffer(BufferTarget.CopyWriteBuffer, _copyBufferHandle);
-
- GL.CopyBufferSubData(BufferTarget.CopyReadBuffer, BufferTarget.CopyWriteBuffer, (IntPtr)offset, IntPtr.Zero, size);
-
- GL.BindBuffer(BufferTarget.CopyWriteBuffer, 0);
-
- Sync();
-
- return new ReadOnlySpan<byte>(_bufferMap.ToPointer(), size);
- }
-
- public void Dispose()
- {
- if (_copyBufferHandle != 0)
- {
- GL.DeleteBuffer(_copyBufferHandle);
- }
- }
- }
-}