OGLConstBuffer.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. throw new InvalidOperationException();
  34. }
  35. Buffer.SetData(Size, HostAddress);
  36. }
  37. public bool TryGetUbo(long Key, out int UboHandle)
  38. {
  39. if (Cache.TryGetValue(Key, out OGLStreamBuffer Buffer))
  40. {
  41. UboHandle = Buffer.Handle;
  42. return true;
  43. }
  44. UboHandle = 0;
  45. return false;
  46. }
  47. private static void DeleteBuffer(OGLStreamBuffer Buffer)
  48. {
  49. Buffer.Dispose();
  50. }
  51. }
  52. }