From 79e8cdf595e1fe86f985b88c655aea277ba32692 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 11 Nov 2021 18:43:30 -0800 Subject: hle: nvflinger: Add implementation for ConsumerBase class. --- src/core/hle/service/nvflinger/consumer_base.h | 59 ++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/core/hle/service/nvflinger/consumer_base.h (limited to 'src/core/hle/service/nvflinger/consumer_base.h') diff --git a/src/core/hle/service/nvflinger/consumer_base.h b/src/core/hle/service/nvflinger/consumer_base.h new file mode 100644 index 000000000..574ea9781 --- /dev/null +++ b/src/core/hle/service/nvflinger/consumer_base.h @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright 2021 yuzu Emulator Project +// Copyright 2010 The Android Open Source Project +// Parts of this implementation were base on: +// https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/include/gui/ConsumerBase.h + +#pragma once + +#include +#include +#include + +#include "common/common_types.h" +#include "core/hle/service/nvflinger/buffer_queue_defs.h" +#include "core/hle/service/nvflinger/consumer_listener.h" +#include "core/hle/service/nvflinger/status.h" + +namespace android { + +class BufferItem; +class BufferQueueConsumer; + +class ConsumerBase : public IConsumerListener, public std::enable_shared_from_this { +public: + void Connect(bool controlled_by_app); + +protected: + ConsumerBase(std::unique_ptr consumer_); + virtual ~ConsumerBase(); + + virtual void OnFrameAvailable(const BufferItem& item) override; + virtual void OnFrameReplaced(const BufferItem& item) override; + virtual void OnBuffersReleased() override; + virtual void OnSidebandStreamChanged() override; + + void FreeBufferLocked(s32 slot_index); + Status AcquireBufferLocked(BufferItem* item, u64 present_when_ns, u64 max_frame_number = 0); + Status ReleaseBufferLocked(s32 slot, const std::shared_ptr graphic_buffer); + bool StillTracking(s32 slot, const std::shared_ptr graphic_buffer); + Status AddReleaseFenceLocked(s32 slot, const std::shared_ptr graphic_buffer, + const Fence& fence); + + struct Slot final { + std::shared_ptr graphic_buffer; + Fence fence; + u64 frame_number{}; + }; + +protected: + std::array slots; + + bool is_abandoned{}; + + std::unique_ptr consumer; + + mutable std::mutex mutex; +}; + +} // namespace android -- cgit v1.2.3