BufferState.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. namespace Ryujinx.Graphics.Vulkan
  3. {
  4. struct BufferState : IDisposable
  5. {
  6. public static BufferState Null => new(null, 0, 0);
  7. private readonly int _offset;
  8. private readonly int _size;
  9. private Auto<DisposableBuffer> _buffer;
  10. public BufferState(Auto<DisposableBuffer> buffer, int offset, int size)
  11. {
  12. _buffer = buffer;
  13. _offset = offset;
  14. _size = size;
  15. buffer?.IncrementReferenceCount();
  16. }
  17. public readonly void BindTransformFeedbackBuffer(VulkanRenderer gd, CommandBufferScoped cbs, uint binding)
  18. {
  19. if (_buffer != null)
  20. {
  21. var buffer = _buffer.Get(cbs, _offset, _size, true).Value;
  22. ulong offset = (ulong)_offset;
  23. ulong size = (ulong)_size;
  24. gd.TransformFeedbackApi.CmdBindTransformFeedbackBuffers(cbs.CommandBuffer, binding, 1, in buffer, in offset, in size);
  25. }
  26. }
  27. public void Swap(Auto<DisposableBuffer> from, Auto<DisposableBuffer> to)
  28. {
  29. if (_buffer == from)
  30. {
  31. _buffer.DecrementReferenceCount();
  32. to.IncrementReferenceCount();
  33. _buffer = to;
  34. }
  35. }
  36. public readonly bool Overlaps(Auto<DisposableBuffer> buffer, int offset, int size)
  37. {
  38. return buffer == _buffer && offset < _offset + _size && offset + size > _offset;
  39. }
  40. public readonly void Dispose()
  41. {
  42. _buffer?.DecrementReferenceCount();
  43. }
  44. }
  45. }