mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2025-03-03 00:43:19 +01:00
767 lines
26 KiB
C#
767 lines
26 KiB
C#
|
using Ryujinx.Common.Logging;
|
|||
|
using Ryujinx.HLE.HOS.Kernel.Threading;
|
|||
|
using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap;
|
|||
|
using Ryujinx.HLE.HOS.Services.SurfaceFlinger.Types;
|
|||
|
using System;
|
|||
|
using System.Threading;
|
|||
|
|
|||
|
namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
|
|||
|
{
|
|||
|
class BufferQueueProducer : IGraphicBufferProducer
|
|||
|
{
|
|||
|
public BufferQueueCore Core { get; }
|
|||
|
|
|||
|
private uint _stickyTransform;
|
|||
|
|
|||
|
private uint _nextCallbackTicket;
|
|||
|
private uint _currentCallbackTicket;
|
|||
|
private uint _callbackTicket;
|
|||
|
|
|||
|
private readonly object _callbackLock = new object();
|
|||
|
|
|||
|
public BufferQueueProducer(BufferQueueCore core)
|
|||
|
{
|
|||
|
Core = core;
|
|||
|
|
|||
|
_stickyTransform = 0;
|
|||
|
_callbackTicket = 0;
|
|||
|
_nextCallbackTicket = 0;
|
|||
|
_currentCallbackTicket = 0;
|
|||
|
}
|
|||
|
|
|||
|
public override Status RequestBuffer(int slot, out AndroidStrongPointer<GraphicBuffer> graphicBuffer)
|
|||
|
{
|
|||
|
graphicBuffer = new AndroidStrongPointer<GraphicBuffer>();
|
|||
|
|
|||
|
lock (Core.Lock)
|
|||
|
{
|
|||
|
if (Core.IsAbandoned)
|
|||
|
{
|
|||
|
return Status.NoInit;
|
|||
|
}
|
|||
|
|
|||
|
if (slot < 0 || slot >= Core.Slots.Length || !Core.IsOwnedByProducerLocked(slot))
|
|||
|
{
|
|||
|
return Status.BadValue;
|
|||
|
}
|
|||
|
|
|||
|
graphicBuffer.Set(Core.Slots[slot].GraphicBuffer);
|
|||
|
|
|||
|
Core.Slots[slot].RequestBufferCalled = true;
|
|||
|
|
|||
|
return Status.Success;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override Status SetBufferCount(int bufferCount)
|
|||
|