コード例 #1
0
ファイル: BufferQueueConsumer.cs プロジェクト: thubn/Ryujinx
        public Status ReleaseBuffer(int slot, ulong frameNumber, ref AndroidFence fence)
        {
            if (slot < 0 || slot >= Core.Slots.Length)
            {
                return(Status.BadValue);
            }

            IProducerListener listener = null;

            lock (Core.Lock)
            {
                if (Core.Slots[slot].FrameNumber != frameNumber)
                {
                    return(Status.StaleBufferSlot);
                }

                foreach (BufferItem item in Core.Queue)
                {
                    if (item.Slot == slot)
                    {
                        return(Status.BadValue);
                    }
                }

                if (Core.Slots[slot].BufferState == BufferState.Acquired)
                {
                    Core.Slots[slot].BufferState = BufferState.Free;
                    Core.Slots[slot].Fence       = fence;

                    listener = Core.ProducerListener;
                }
                else if (Core.Slots[slot].NeedsCleanupOnRelease)
                {
                    Core.Slots[slot].NeedsCleanupOnRelease = false;
                    return(Status.StaleBufferSlot);
                }
                else
                {
                    return(Status.BadValue);
                }

                Core.Slots[slot].GraphicBuffer.Object.DecrementNvMapHandleRefCount(Core.Owner);

                Core.CheckSystemEventsLocked(Core.GetMaxBufferCountLocked(true));
                Core.SignalDequeueEvent();
            }

            listener?.onBufferReleased();

            return(Status.Success);
        }
コード例 #2
0
ファイル: BufferQueueProducer.cs プロジェクト: thubn/Ryujinx
        public override Status Disconnect(NativeWindowApi api)
        {
            IProducerListener producerListener = null;

            Status status = Status.BadValue;

            lock (Core.Lock)
            {
                if (Core.IsAbandoned)
                {
                    return(Status.Success);
                }

                switch (api)
                {
                case NativeWindowApi.NVN:
                case NativeWindowApi.CPU:
                case NativeWindowApi.Media:
                case NativeWindowApi.Camera:
                    if (Core.ConnectedApi == api)
                    {
                        Core.FreeAllBuffersLocked();

                        producerListener = Core.ProducerListener;

                        Core.ProducerListener = null;
                        Core.ConnectedApi     = NativeWindowApi.NoApi;

                        Core.SignalDequeueEvent();

                        status = Status.Success;
                    }
                    break;
                }
            }

            producerListener?.onBufferReleased();

            return(status);
        }