consumer_base.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
  2. // SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. // Parts of this implementation were based on:
  5. // https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/include/gui/ConsumerBase.h
  6. #pragma once
  7. #include <array>
  8. #include <chrono>
  9. #include <memory>
  10. #include <mutex>
  11. #include "common/common_types.h"
  12. #include "core/hle/service/nvflinger/buffer_queue_defs.h"
  13. #include "core/hle/service/nvflinger/consumer_listener.h"
  14. #include "core/hle/service/nvflinger/status.h"
  15. namespace Service::android {
  16. class BufferItem;
  17. class BufferQueueConsumer;
  18. class ConsumerBase : public IConsumerListener, public std::enable_shared_from_this<ConsumerBase> {
  19. public:
  20. void Connect(bool controlled_by_app);
  21. protected:
  22. explicit ConsumerBase(std::unique_ptr<BufferQueueConsumer> consumer_);
  23. ~ConsumerBase() override;
  24. void OnFrameAvailable(const BufferItem& item) override;
  25. void OnFrameReplaced(const BufferItem& item) override;
  26. void OnBuffersReleased() override;
  27. void OnSidebandStreamChanged() override;
  28. void FreeBufferLocked(s32 slot_index);
  29. Status AcquireBufferLocked(BufferItem* item, std::chrono::nanoseconds present_when);
  30. Status ReleaseBufferLocked(s32 slot, const std::shared_ptr<GraphicBuffer>& graphic_buffer);
  31. bool StillTracking(s32 slot, const std::shared_ptr<GraphicBuffer>& graphic_buffer) const;
  32. Status AddReleaseFenceLocked(s32 slot, const std::shared_ptr<GraphicBuffer>& graphic_buffer,
  33. const Fence& fence);
  34. struct Slot final {
  35. std::shared_ptr<GraphicBuffer> graphic_buffer;
  36. Fence fence;
  37. u64 frame_number{};
  38. };
  39. protected:
  40. std::array<Slot, BufferQueueDefs::NUM_BUFFER_SLOTS> slots;
  41. bool is_abandoned{};
  42. std::unique_ptr<BufferQueueConsumer> consumer;
  43. mutable std::mutex mutex;
  44. };
  45. } // namespace Service::android