PersistentFlushBuffer.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. namespace Ryujinx.Graphics.Vulkan
  3. {
  4. internal class PersistentFlushBuffer : IDisposable
  5. {
  6. private VulkanRenderer _gd;
  7. private BufferHolder _flushStorage;
  8. public PersistentFlushBuffer(VulkanRenderer gd)
  9. {
  10. _gd = gd;
  11. }
  12. private BufferHolder ResizeIfNeeded(int size)
  13. {
  14. var flushStorage = _flushStorage;
  15. if (flushStorage == null || size > _flushStorage.Size)
  16. {
  17. if (flushStorage != null)
  18. {
  19. flushStorage.Dispose();
  20. }
  21. flushStorage = _gd.BufferManager.Create(_gd, size);
  22. _flushStorage = flushStorage;
  23. }
  24. return flushStorage;
  25. }
  26. public Span<byte> GetBufferData(CommandBufferPool cbp, BufferHolder buffer, int offset, int size)
  27. {
  28. var flushStorage = ResizeIfNeeded(size);
  29. using (var cbs = cbp.Rent())
  30. {
  31. var srcBuffer = buffer.GetBuffer(cbs.CommandBuffer);
  32. var dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer);
  33. BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, 0, size);
  34. }
  35. flushStorage.WaitForFences();
  36. return flushStorage.GetDataStorage(0, size);
  37. }
  38. public Span<byte> GetTextureData(CommandBufferPool cbp, TextureView view, int size)
  39. {
  40. GAL.TextureCreateInfo info = view.Info;
  41. var flushStorage = ResizeIfNeeded(size);
  42. using (var cbs = cbp.Rent())
  43. {
  44. var buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
  45. var image = view.GetImage().Get(cbs).Value;
  46. view.CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, 0, 0, info.GetLayers(), info.Levels, singleSlice: false);
  47. }
  48. flushStorage.WaitForFences();
  49. return flushStorage.GetDataStorage(0, size);
  50. }
  51. public Span<byte> GetTextureData(CommandBufferPool cbp, TextureView view, int size, int layer, int level)
  52. {
  53. var flushStorage = ResizeIfNeeded(size);
  54. using (var cbs = cbp.Rent())
  55. {
  56. var buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
  57. var image = view.GetImage().Get(cbs).Value;
  58. view.CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, layer, level, 1, 1, singleSlice: true);
  59. }
  60. flushStorage.WaitForFences();
  61. return flushStorage.GetDataStorage(0, size);
  62. }
  63. public void Dispose()
  64. {
  65. _flushStorage.Dispose();
  66. }
  67. }
  68. }