OGLConstBuffer.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using OpenTK.Graphics.OpenGL;
  2. using System;
  3. namespace Ryujinx.Graphics.Gal.OpenGL
  4. {
  5. class OGLConstBuffer : IGalConstBuffer
  6. {
  7. private const long MaxConstBufferCacheSize = 64 * 1024 * 1024;
  8. private OGLCachedResource<OGLStreamBuffer> Cache;
  9. public OGLConstBuffer()
  10. {
  11. Cache = new OGLCachedResource<OGLStreamBuffer>(DeleteBuffer, MaxConstBufferCacheSize);
  12. }
  13. public void LockCache()
  14. {
  15. Cache.Lock();
  16. }
  17. public void UnlockCache()
  18. {
  19. Cache.Unlock();
  20. }
  21. public void Create(long Key, long Size)
  22. {
  23. OGLStreamBuffer Buffer = new OGLStreamBuffer(BufferTarget.UniformBuffer, Size);
  24. Cache.AddOrUpdate(Key, Buffer, Size);
  25. }
  26. public bool IsCached(long Key, long Size)
  27. {
  28. return Cache.TryGetSize(Key, out long CachedSize) && CachedSize == Size;
  29. }
  30. public void SetData(long Key, long Size, IntPtr HostAddress)
  31. {
  32. if (Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
  33. {
  34. Buffer.SetData(Size, HostAddress);
  35. }
  36. }
  37. public void SetData(long Key, byte[] Data)
  38. {
  39. if (Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
  40. {
  41. Buffer.SetData(Data);
  42. }
  43. }
  44. public bool TryGetUbo(long Key, out int UboHandle)
  45. {
  46. if (Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
  47. {
  48. UboHandle = Buffer.Handle;
  49. return true;
  50. }
  51. UboHandle = 0;
  52. return false;
  53. }
  54. private static void DeleteBuffer(OGLStreamBuffer Buffer)
  55. {
  56. Buffer.Dispose();
  57. }
  58. }
  59. }