aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-08-10 01:09:40 -0300
committergdkchan <gab.dark.100@gmail.com>2018-08-10 01:09:40 -0300
commit25dd5f4238d898120f2f65c4d5d5b9c192ce1e10 (patch)
tree347a58054594d9236fd9c3fa1432e0ee45b99949 /Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs
parent652238f526509ed54e1c0ba2e953097ef7b2501c (diff)
Low level graphics API prerequisites (#319)
* Add GalPipelineState and IGalPipeline * Separate UploadVertex call * Add ConstBuffer cache * Move Vertex Assembly into GalPipelineState * Move Uniform binds to GalPipelineState * Move framebuffer flip into a buffer * Rebase * Fix regression * Move clear values from VertexEndGl to ClearBuffers * Rename obscure names O->Old S->New
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