2022-04-23 10:59:50 +02:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project
|
2021-11-12 03:43:30 +01:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
2022-04-23 10:59:50 +02:00
|
|
|
// Parts of this implementation were based on:
|
2021-11-12 03:43:30 +01:00
|
|
|
// https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/include/gui/ConsumerBase.h
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <array>
|
2022-03-20 05:52:08 +01:00
|
|
|
#include <chrono>
|
2021-11-12 03:43:30 +01:00
|
|
|
#include <memory>
|
|
|
|
#include <mutex>
|
|
|
|
|
|
|
|
#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"
|
|
|
|
|
2022-03-20 05:51:16 +01:00
|
|
|
namespace Service::android {
|
2021-11-12 03:43:30 +01:00
|
|
|
|
|
|
|
class BufferItem;
|
|
|
|
class BufferQueueConsumer;
|
|
|
|
|
|
|
|
class ConsumerBase : public IConsumerListener, public std::enable_shared_from_this<ConsumerBase> {
|
|
|
|
public:
|
|
|
|
void Connect(bool controlled_by_app);
|
|
|
|
|
|
|
|
protected:
|
2022-03-20 08:48:32 +01:00
|
|
|
explicit ConsumerBase(std::unique_ptr<BufferQueueConsumer> consumer_);
|
2022-11-29 01:06:31 +01:00
|
|
|
~ConsumerBase() override;
|
2021-11-12 03:43:30 +01:00
|
|
|
|
2022-11-29 01:06:31 +01:00
|
|
|
void OnFrameAvailable(const BufferItem& item) override;
|
|
|
|
void OnFrameReplaced(const BufferItem& item) override;
|
|
|
|
void OnBuffersReleased() override;
|
|
|
|
void OnSidebandStreamChanged() override;
|
2021-11-12 03:43:30 +01:00
|
|
|
|
|
|
|
void FreeBufferLocked(s32 slot_index);
|
2022-04-02 07:58:40 +02:00
|
|
|
Status AcquireBufferLocked(BufferItem* item, std::chrono::nanoseconds present_when);
|
2021-11-12 03:43:30 +01:00
|
|
|
Status ReleaseBufferLocked(s32 slot, const std::shared_ptr<GraphicBuffer> graphic_buffer);
|
2022-03-20 06:08:50 +01:00
|
|
|
bool StillTracking(s32 slot, const std::shared_ptr<GraphicBuffer> graphic_buffer) const;
|
2021-11-12 03:43:30 +01:00
|
|
|
Status AddReleaseFenceLocked(s32 slot, const std::shared_ptr<GraphicBuffer> graphic_buffer,
|
|
|
|
const Fence& fence);
|
|
|
|
|
|
|
|
struct Slot final {
|
|
|
|
std::shared_ptr<GraphicBuffer> graphic_buffer;
|
|
|
|
Fence fence;
|
|
|
|
u64 frame_number{};
|
|
|
|
};
|
|
|
|
|
|
|
|
protected:
|
|
|
|
std::array<Slot, BufferQueueDefs::NUM_BUFFER_SLOTS> slots;
|
|
|
|
|
|
|
|
bool is_abandoned{};
|
|
|
|
|
|
|
|
std::unique_ptr<BufferQueueConsumer> consumer;
|
|
|
|
|
|
|
|
mutable std::mutex mutex;
|
|
|
|
};
|
|
|
|
|
2022-03-20 05:51:16 +01:00
|
|
|
} // namespace Service::android
|