OGLConstBuffer.cs 1.5 KB

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