BufferItemConsumer.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Ryujinx.Graphics.Gpu;
  2. using System;
  3. namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
  4. {
  5. class BufferItemConsumer : ConsumerBase
  6. {
  7. private GpuContext _gpuContext;
  8. public BufferItemConsumer(Switch device,
  9. BufferQueueConsumer consumer,
  10. uint consumerUsage,
  11. int bufferCount,
  12. bool controlledByApp,
  13. IConsumerListener listener = null) : base(consumer, controlledByApp, listener)
  14. {
  15. _gpuContext = device.Gpu;
  16. Status status = Consumer.SetConsumerUsageBits(consumerUsage);
  17. if (status != Status.Success)
  18. {
  19. throw new InvalidOperationException();
  20. }
  21. if (bufferCount != -1)
  22. {
  23. status = Consumer.SetMaxAcquiredBufferCount(bufferCount);
  24. if (status != Status.Success)
  25. {
  26. throw new InvalidOperationException();
  27. }
  28. }
  29. }
  30. public Status AcquireBuffer(out BufferItem bufferItem, ulong expectedPresent, bool waitForFence = false)
  31. {
  32. lock (Lock)
  33. {
  34. Status status = AcquireBufferLocked(out BufferItem tmp, expectedPresent);
  35. if (status != Status.Success)
  36. {
  37. bufferItem = null;
  38. return status;
  39. }
  40. // Make sure to clone the object to not temper the real instance.
  41. bufferItem = (BufferItem)tmp.Clone();
  42. if (waitForFence)
  43. {
  44. bufferItem.Fence.WaitForever(_gpuContext);
  45. }
  46. bufferItem.GraphicBuffer.Set(Slots[bufferItem.Slot].GraphicBuffer);
  47. return Status.Success;
  48. }
  49. }
  50. public Status ReleaseBuffer(BufferItem bufferItem, ref AndroidFence fence)
  51. {
  52. lock (Lock)
  53. {
  54. Status result = AddReleaseFenceLocked(bufferItem.Slot, ref bufferItem.GraphicBuffer, ref fence);
  55. if (result == Status.Success)
  56. {
  57. result = ReleaseBufferLocked(bufferItem.Slot, ref bufferItem.GraphicBuffer);
  58. }
  59. return result;
  60. }
  61. }
  62. public Status SetDefaultBufferSize(uint width, uint height)
  63. {
  64. lock (Lock)
  65. {
  66. return Consumer.SetDefaultBufferSize(width, height);
  67. }
  68. }
  69. public Status SetDefaultBufferFormat(PixelFormat defaultFormat)
  70. {
  71. lock (Lock)
  72. {
  73. return Consumer.SetDefaultBufferFormat(defaultFormat);
  74. }
  75. }
  76. }
  77. }