BufferState.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Silk.NET.Vulkan;
  2. using System;
  3. namespace Ryujinx.Graphics.Vulkan
  4. {
  5. struct BufferState : IDisposable
  6. {
  7. public static BufferState Null => new BufferState(null, 0, 0);
  8. private readonly Auto<DisposableBuffer> _buffer;
  9. private readonly int _offset;
  10. private readonly int _size;
  11. private readonly ulong _stride;
  12. private readonly IndexType _type;
  13. public BufferState(Auto<DisposableBuffer> buffer, int offset, int size, IndexType type)
  14. {
  15. _buffer = buffer;
  16. _offset = offset;
  17. _size = size;
  18. _stride = 0;
  19. _type = type;
  20. buffer?.IncrementReferenceCount();
  21. }
  22. public BufferState(Auto<DisposableBuffer> buffer, int offset, int size, ulong stride = 0UL)
  23. {
  24. _buffer = buffer;
  25. _offset = offset;
  26. _size = size;
  27. _stride = stride;
  28. _type = IndexType.Uint16;
  29. buffer?.IncrementReferenceCount();
  30. }
  31. public void BindIndexBuffer(Vk api, CommandBufferScoped cbs)
  32. {
  33. if (_buffer != null)
  34. {
  35. api.CmdBindIndexBuffer(cbs.CommandBuffer, _buffer.Get(cbs, _offset, _size).Value, (ulong)_offset, _type);
  36. }
  37. }
  38. public void BindTransformFeedbackBuffer(VulkanRenderer gd, CommandBufferScoped cbs, uint binding)
  39. {
  40. if (_buffer != null)
  41. {
  42. var buffer = _buffer.Get(cbs, _offset, _size).Value;
  43. gd.TransformFeedbackApi.CmdBindTransformFeedbackBuffers(cbs.CommandBuffer, binding, 1, buffer, (ulong)_offset, (ulong)_size);
  44. }
  45. }
  46. public void BindVertexBuffer(VulkanRenderer gd, CommandBufferScoped cbs, uint binding)
  47. {
  48. if (_buffer != null)
  49. {
  50. var buffer = _buffer.Get(cbs, _offset, _size).Value;
  51. if (gd.Capabilities.SupportsExtendedDynamicState)
  52. {
  53. gd.ExtendedDynamicStateApi.CmdBindVertexBuffers2(
  54. cbs.CommandBuffer,
  55. binding,
  56. 1,
  57. buffer,
  58. (ulong)_offset,
  59. (ulong)_size,
  60. _stride);
  61. }
  62. else
  63. {
  64. gd.Api.CmdBindVertexBuffers(cbs.CommandBuffer, binding, 1, buffer, (ulong)_offset);
  65. }
  66. }
  67. }
  68. public void Dispose()
  69. {
  70. _buffer?.DecrementReferenceCount();
  71. }
  72. }
  73. }