aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs')
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs66
1 files changed, 66 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs
new file mode 100644
index 00000000..50825541
--- /dev/null
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs
@@ -0,0 +1,66 @@
+using OpenTK.Graphics.OpenGL;
+using System;
+
+namespace Ryujinx.Graphics.Gal.OpenGL
+{
+ class OGLConstBuffer : IGalConstBuffer
+ {
+ private OGLCachedResource<OGLStreamBuffer> Cache;
+
+ public OGLConstBuffer()
+ {
+ Cache = new OGLCachedResource<OGLStreamBuffer>(DeleteBuffer);
+ }
+
+ public void LockCache()
+ {
+ Cache.Lock();
+ }
+
+ public void UnlockCache()
+ {
+ Cache.Unlock();
+ }
+
+ public void Create(long Key, long Size)
+ {
+ OGLStreamBuffer Buffer = new OGLStreamBuffer(BufferTarget.UniformBuffer, Size);
+
+ Cache.AddOrUpdate(Key, Buffer, Size);
+ }
+
+ public bool IsCached(long Key, long Size)
+ {
+ return Cache.TryGetSize(Key, out long CachedSize) && CachedSize == Size;
+ }
+
+ public void SetData(long Key, long Size, IntPtr HostAddress)
+ {
+ if (!Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
+ {
+ throw new InvalidOperationException();
+ }
+
+ Buffer.SetData(Size, HostAddress);
+ }
+
+ public bool TryGetUbo(long Key, out int UboHandle)
+ {
+ if (Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
+ {
+ UboHandle = Buffer.Handle;
+
+ return true;
+ }
+
+ UboHandle = 0;
+
+ return false;
+ }
+
+ private static void DeleteBuffer(OGLStreamBuffer Buffer)
+ {
+ Buffer.Dispose();
+ }
+ }
+} \ No newline at end of file