/ src / Ryujinx.Graphics.Vulkan / BufferState.cs
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  }