diff options
| author | Liam <byteslice@airmail.cc> | 2024-01-22 12:40:50 -0500 |
|---|---|---|
| committer | Liam <byteslice@airmail.cc> | 2024-01-31 11:27:21 -0500 |
| commit | a595e9e8a7a6a742481b1cd05455d3c639095413 (patch) | |
| tree | 03f8dfaec328171c42b090988e93c51e8d726eda /src/core/hle/service/nvnflinger/hardware_composer.h | |
| parent | 10cf0585180bcf2eab38ebf65dc593fecc4ddf92 (diff) | |
nvnflinger/gpu: implement layer stack composition
Diffstat (limited to 'src/core/hle/service/nvnflinger/hardware_composer.h')
| -rw-r--r-- | src/core/hle/service/nvnflinger/hardware_composer.h | 59 |
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 |
