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