aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OGLConstBuffer.cs
blob: a12681c7ce269ce8c68d8b5c0a1cd62bbfe4a15f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using OpenTK.Graphics.OpenGL;
using System;

namespace Ryujinx.Graphics.Gal.OpenGL
{
    class OGLConstBuffer : IGalConstBuffer
    {
        private const long MaxConstBufferCacheSize = 64 * 1024 * 1024;

        private OGLCachedResource<OGLStreamBuffer> Cache;

        public OGLConstBuffer()
        {
            Cache = new OGLCachedResource<OGLStreamBuffer>(DeleteBuffer, MaxConstBufferCacheSize);
        }

        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))
            {
                Buffer.SetData(Size, HostAddress);
            }
        }

        public void SetData(long Key, byte[] Data)
        {
            if (Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
            {
                Buffer.SetData(Data);
            }
        }

        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();
        }
    }
}