summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvnflinger/hardware_composer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/nvnflinger/hardware_composer.h')
-rw-r--r--src/core/hle/service/nvnflinger/hardware_composer.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/core/hle/service/nvnflinger/hardware_composer.h b/src/core/hle/service/nvnflinger/hardware_composer.h
new file mode 100644
index 000000000..611afc169
--- /dev/null
+++ b/src/core/hle/service/nvnflinger/hardware_composer.h
@@ -0,0 +1,59 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <memory>
+#include <boost/container/flat_map.hpp>
+
+#include "core/hle/service/nvnflinger/buffer_item.h"
+
+namespace Service::Nvidia::Devices {
+class nvdisp_disp0;
+}
+
+namespace Service::VI {
+class Display;
+class Layer;
+} // namespace Service::VI
+
+namespace Service::Nvnflinger {
+
+using LayerId = u64;
+
+class HardwareComposer {
+public:
+ explicit HardwareComposer();
+ ~HardwareComposer();
+
+ u32 ComposeLocked(VI::Display& display, Nvidia::Devices::nvdisp_disp0& nvdisp,
+ u32 frame_advance);
+ void RemoveLayerLocked(VI::Display& display, LayerId layer_id);
+
+private:
+ // TODO: do we want to track frame number in vi instead?
+ u64 m_frame_number{0};
+
+private:
+ using ReleaseFrameNumber = u64;
+
+ struct Framebuffer {
+ android::BufferItem item{};
+ ReleaseFrameNumber release_frame_number{};
+ bool is_acquired{false};
+ };
+
+ enum class CacheStatus : u32 {
+ NoBufferAvailable,
+ BufferAcquired,
+ CachedBufferReused,
+ };
+
+ boost::container::flat_map<LayerId, Framebuffer> m_framebuffers{};
+
+private:
+ bool TryAcquireFramebufferLocked(VI::Layer& layer, Framebuffer& framebuffer);
+ CacheStatus CacheFramebufferLocked(VI::Layer& layer, LayerId layer_id);
+};
+
+} // namespace Service::Nvnflinger