summaryrefslogtreecommitdiff
path: root/src/core/hle/service/nvnflinger
diff options
context:
space:
mode:
authorGravatar Liam2024-02-14 16:29:24 -0500
committerGravatar Liam2024-02-17 18:01:41 -0500
commitdcce9837d240fa2492f29e5ae2649085ae8f711c (patch)
tree8a93012b952276e29fa63490b4183a57cf346878 /src/core/hle/service/nvnflinger
parentnvnflinger: convert to process (diff)
downloadyuzu-dcce9837d240fa2492f29e5ae2649085ae8f711c.tar.gz
yuzu-dcce9837d240fa2492f29e5ae2649085ae8f711c.tar.xz
yuzu-dcce9837d240fa2492f29e5ae2649085ae8f711c.zip
vi: move shared buffer management from nvnflinger
Diffstat (limited to 'src/core/hle/service/nvnflinger')
-rw-r--r--src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp447
-rw-r--r--src/core/hle/service/nvnflinger/fb_share_buffer_manager.h82
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.cpp11
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.h14
4 files changed, 2 insertions, 552 deletions
diff --git a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp b/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp
deleted file mode 100644
index 90f7248a0..000000000
--- a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp
+++ /dev/null
@@ -1,447 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include <random>
5
6#include "core/core.h"
7#include "core/hle/kernel/k_process.h"
8#include "core/hle/kernel/k_system_resource.h"
9#include "core/hle/service/nvdrv/devices/nvmap.h"
10#include "core/hle/service/nvdrv/nvdrv.h"
11#include "core/hle/service/nvnflinger/buffer_queue_producer.h"
12#include "core/hle/service/nvnflinger/fb_share_buffer_manager.h"
13#include "core/hle/service/nvnflinger/pixel_format.h"
14#include "core/hle/service/nvnflinger/ui/graphic_buffer.h"
15#include "core/hle/service/vi/layer/vi_layer.h"
16#include "core/hle/service/vi/vi_results.h"
17#include "video_core/gpu.h"
18#include "video_core/host1x/host1x.h"
19
20namespace Service::Nvnflinger {
21
22namespace {
23
24Result AllocateSharedBufferMemory(std::unique_ptr<Kernel::KPageGroup>* out_page_group,
25 Core::System& system, u32 size) {
26 using Core::Memory::YUZU_PAGESIZE;
27
28 // Allocate memory for the system shared buffer.
29 // FIXME: This memory belongs to vi's .data section.
30 auto& kernel = system.Kernel();
31
32 // Hold a temporary page group reference while we try to map it.
33 auto pg = std::make_unique<Kernel::KPageGroup>(
34 kernel, std::addressof(kernel.GetSystemSystemResource().GetBlockInfoManager()));
35
36 // Allocate memory from secure pool.
37 R_TRY(kernel.MemoryManager().AllocateAndOpen(
38 pg.get(), size / YUZU_PAGESIZE,
39 Kernel::KMemoryManager::EncodeOption(Kernel::KMemoryManager::Pool::Secure,
40 Kernel::KMemoryManager::Direction::FromBack)));
41
42 // Fill the output data with red.
43 for (auto& block : *pg) {
44 u32* start = system.DeviceMemory().GetPointer<u32>(block.GetAddress());
45 u32* end = system.DeviceMemory().GetPointer<u32>(block.GetAddress() + block.GetSize());
46
47 for (; start < end; start++) {
48 *start = 0xFF0000FF;
49 }
50 }
51
52 // Return the mapped page group.
53 *out_page_group = std::move(pg);
54
55 // We succeeded.
56 R_SUCCEED();
57}
58
59Result MapSharedBufferIntoProcessAddressSpace(Common::ProcessAddress* out_map_address,
60 std::unique_ptr<Kernel::KPageGroup>& pg,
61 Kernel::KProcess* process, Core::System& system) {
62 using Core::Memory::YUZU_PAGESIZE;
63
64 auto& page_table = process->GetPageTable();
65
66 // Get bounds of where mapping is possible.
67 const VAddr alias_code_begin = GetInteger(page_table.GetAliasCodeRegionStart());
68 const VAddr alias_code_size = page_table.GetAliasCodeRegionSize() / YUZU_PAGESIZE;
69 const auto state = Kernel::KMemoryState::IoMemory;
70 const auto perm = Kernel::KMemoryPermission::UserReadWrite;
71 std::mt19937_64 rng{process->GetRandomEntropy(0)};
72
73 // Retry up to 64 times to map into alias code range.
74 Result res = ResultSuccess;
75 int i;
76 for (i = 0; i < 64; i++) {
77 *out_map_address = alias_code_begin + ((rng() % alias_code_size) * YUZU_PAGESIZE);
78 res = page_table.MapPageGroup(*out_map_address, *pg, state, perm);
79 if (R_SUCCEEDED(res)) {
80 break;
81 }
82 }
83
84 // Return failure, if necessary
85 R_UNLESS(i < 64, res);
86
87 // We succeeded.
88 R_SUCCEED();
89}
90
91Result CreateNvMapHandle(u32* out_nv_map_handle, Nvidia::Devices::nvmap& nvmap, u32 size) {
92 // Create a handle.
93 Nvidia::Devices::nvmap::IocCreateParams create_params{
94 .size = size,
95 .handle = 0,
96 };
97 R_UNLESS(nvmap.IocCreate(create_params) == Nvidia::NvResult::Success,
98 VI::ResultOperationFailed);
99
100 // Assign the output handle.
101 *out_nv_map_handle = create_params.handle;
102
103 // We succeeded.
104 R_SUCCEED();
105}
106
107Result FreeNvMapHandle(Nvidia::Devices::nvmap& nvmap, u32 handle, Nvidia::DeviceFD nvmap_fd) {
108 // Free the handle.
109 Nvidia::Devices::nvmap::IocFreeParams free_params{
110 .handle = handle,
111 };
112 R_UNLESS(nvmap.IocFree(free_params, nvmap_fd) == Nvidia::NvResult::Success,
113 VI::ResultOperationFailed);
114
115 // We succeeded.
116 R_SUCCEED();
117}
118
119Result AllocNvMapHandle(Nvidia::Devices::nvmap& nvmap, u32 handle, Common::ProcessAddress buffer,
120 u32 size, Nvidia::DeviceFD nvmap_fd) {
121 // Assign the allocated memory to the handle.
122 Nvidia::Devices::nvmap::IocAllocParams alloc_params{
123 .handle = handle,
124 .heap_mask = 0,
125 .flags = {},
126 .align = 0,
127 .kind = 0,
128 .address = GetInteger(buffer),
129 };
130 R_UNLESS(nvmap.IocAlloc(alloc_params, nvmap_fd) == Nvidia::NvResult::Success,
131 VI::ResultOperationFailed);
132
133 // We succeeded.
134 R_SUCCEED();
135}
136
137Result AllocateHandleForBuffer(u32* out_handle, Nvidia::Module& nvdrv, Nvidia::DeviceFD nvmap_fd,
138 Common::ProcessAddress buffer, u32 size) {
139 // Get the nvmap device.
140 auto nvmap = nvdrv.GetDevice<Nvidia::Devices::nvmap>(nvmap_fd);
141 ASSERT(nvmap != nullptr);
142
143 // Create a handle.
144 R_TRY(CreateNvMapHandle(out_handle, *nvmap, size));
145
146 // Ensure we maintain a clean state on failure.
147 ON_RESULT_FAILURE {
148 R_ASSERT(FreeNvMapHandle(*nvmap, *out_handle, nvmap_fd));
149 };
150
151 // Assign the allocated memory to the handle.
152 R_RETURN(AllocNvMapHandle(*nvmap, *out_handle, buffer, size, nvmap_fd));
153}
154
155void FreeHandle(u32 handle, Nvidia::Module& nvdrv, Nvidia::DeviceFD nvmap_fd) {
156 auto nvmap = nvdrv.GetDevice<Nvidia::Devices::nvmap>(nvmap_fd);
157 ASSERT(nvmap != nullptr);
158
159 R_ASSERT(FreeNvMapHandle(*nvmap, handle, nvmap_fd));
160}
161
162constexpr auto SharedBufferBlockLinearFormat = android::PixelFormat::Rgba8888;
163constexpr u32 SharedBufferBlockLinearBpp = 4;
164
165constexpr u32 SharedBufferBlockLinearWidth = 1280;
166constexpr u32 SharedBufferBlockLinearHeight = 768;
167constexpr u32 SharedBufferBlockLinearStride =
168 SharedBufferBlockLinearWidth * SharedBufferBlockLinearBpp;
169constexpr u32 SharedBufferNumSlots = 7;
170
171constexpr u32 SharedBufferWidth = 1280;
172constexpr u32 SharedBufferHeight = 720;
173constexpr u32 SharedBufferAsync = false;
174
175constexpr u32 SharedBufferSlotSize =
176 SharedBufferBlockLinearWidth * SharedBufferBlockLinearHeight * SharedBufferBlockLinearBpp;
177constexpr u32 SharedBufferSize = SharedBufferSlotSize * SharedBufferNumSlots;
178
179constexpr SharedMemoryPoolLayout SharedBufferPoolLayout = [] {
180 SharedMemoryPoolLayout layout{};
181 layout.num_slots = SharedBufferNumSlots;
182
183 for (u32 i = 0; i < SharedBufferNumSlots; i++) {
184 layout.slots[i].buffer_offset = i * SharedBufferSlotSize;
185 layout.slots[i].size = SharedBufferSlotSize;
186 layout.slots[i].width = SharedBufferWidth;
187 layout.slots[i].height = SharedBufferHeight;
188 }
189
190 return layout;
191}();
192
193void MakeGraphicBuffer(android::BufferQueueProducer& producer, u32 slot, u32 handle) {
194 auto buffer = std::make_shared<android::NvGraphicBuffer>();
195 buffer->width = SharedBufferWidth;
196 buffer->height = SharedBufferHeight;
197 buffer->stride = SharedBufferBlockLinearStride;
198 buffer->format = SharedBufferBlockLinearFormat;
199 buffer->external_format = SharedBufferBlockLinearFormat;
200 buffer->buffer_id = handle;
201 buffer->offset = slot * SharedBufferSlotSize;
202 ASSERT(producer.SetPreallocatedBuffer(slot, buffer) == android::Status::NoError);
203}
204
205} // namespace
206
207FbShareBufferManager::FbShareBufferManager(Core::System& system, Nvnflinger& flinger,
208 std::shared_ptr<Nvidia::Module> nvdrv)
209 : m_system(system), m_flinger(flinger), m_nvdrv(std::move(nvdrv)) {}
210
211FbShareBufferManager::~FbShareBufferManager() = default;
212
213Result FbShareBufferManager::Initialize(Kernel::KProcess* owner_process, u64* out_buffer_id,
214 u64* out_layer_handle, u64 display_id,
215 LayerBlending blending) {
216 std::scoped_lock lk{m_guard};
217
218 // Ensure we haven't already created.
219 const u64 aruid = owner_process->GetProcessId();
220 R_UNLESS(!m_sessions.contains(aruid), VI::ResultPermissionDenied);
221
222 // Allocate memory for the shared buffer if needed.
223 if (!m_buffer_page_group) {
224 R_TRY(AllocateSharedBufferMemory(std::addressof(m_buffer_page_group), m_system,
225 SharedBufferSize));
226
227 // Record buffer id.
228 m_buffer_id = m_next_buffer_id++;
229
230 // Record display id.
231 m_display_id = display_id;
232 }
233
234 // Map into process.
235 Common::ProcessAddress map_address{};
236 R_TRY(MapSharedBufferIntoProcessAddressSpace(std::addressof(map_address), m_buffer_page_group,
237 owner_process, m_system));
238
239 // Create new session.
240 auto [it, was_emplaced] = m_sessions.emplace(aruid, FbShareSession{});
241 auto& session = it->second;
242
243 auto& container = m_nvdrv->GetContainer();
244 session.session_id = container.OpenSession(owner_process);
245 session.nvmap_fd = m_nvdrv->Open("/dev/nvmap", session.session_id);
246
247 // Create an nvmap handle for the buffer and assign the memory to it.
248 R_TRY(AllocateHandleForBuffer(std::addressof(session.buffer_nvmap_handle), *m_nvdrv,
249 session.nvmap_fd, map_address, SharedBufferSize));
250
251 // Create and open a layer for the display.
252 session.layer_id = m_flinger.CreateLayer(m_display_id, blending).value();
253 m_flinger.OpenLayer(session.layer_id);
254
255 // Get the layer.
256 VI::Layer* layer = m_flinger.FindLayer(m_display_id, session.layer_id);
257 ASSERT(layer != nullptr);
258
259 // Get the producer and set preallocated buffers.
260 auto& producer = layer->GetBufferQueue();
261 MakeGraphicBuffer(producer, 0, session.buffer_nvmap_handle);
262 MakeGraphicBuffer(producer, 1, session.buffer_nvmap_handle);
263
264 // Assign outputs.
265 *out_buffer_id = m_buffer_id;
266 *out_layer_handle = session.layer_id;
267
268 // We succeeded.
269 R_SUCCEED();
270}
271
272void FbShareBufferManager::Finalize(Kernel::KProcess* owner_process) {
273 std::scoped_lock lk{m_guard};
274
275 if (m_buffer_id == 0) {
276 return;
277 }
278
279 const u64 aruid = owner_process->GetProcessId();
280 const auto it = m_sessions.find(aruid);
281 if (it == m_sessions.end()) {
282 return;
283 }
284
285 auto& session = it->second;
286
287 // Destroy the layer.
288 m_flinger.DestroyLayer(session.layer_id);
289
290 // Close nvmap handle.
291 FreeHandle(session.buffer_nvmap_handle, *m_nvdrv, session.nvmap_fd);
292
293 // Close nvmap device.
294 m_nvdrv->Close(session.nvmap_fd);
295
296 // Close session.
297 auto& container = m_nvdrv->GetContainer();
298 container.CloseSession(session.session_id);
299
300 // Erase.
301 m_sessions.erase(it);
302}
303
304Result FbShareBufferManager::GetSharedBufferMemoryHandleId(u64* out_buffer_size,
305 s32* out_nvmap_handle,
306 SharedMemoryPoolLayout* out_pool_layout,
307 u64 buffer_id,
308 u64 applet_resource_user_id) {
309 std::scoped_lock lk{m_guard};
310
311 R_UNLESS(m_buffer_id > 0, VI::ResultNotFound);
312 R_UNLESS(buffer_id == m_buffer_id, VI::ResultNotFound);
313 R_UNLESS(m_sessions.contains(applet_resource_user_id), VI::ResultNotFound);
314
315 *out_pool_layout = SharedBufferPoolLayout;
316 *out_buffer_size = SharedBufferSize;
317 *out_nvmap_handle = m_sessions[applet_resource_user_id].buffer_nvmap_handle;
318
319 R_SUCCEED();
320}
321
322Result FbShareBufferManager::GetLayerFromId(VI::Layer** out_layer, u64 layer_id) {
323 // Ensure the layer id is valid.
324 R_UNLESS(layer_id > 0, VI::ResultNotFound);
325
326 // Get the layer.
327 VI::Layer* layer = m_flinger.FindLayer(m_display_id, layer_id);
328 R_UNLESS(layer != nullptr, VI::ResultNotFound);
329
330 // We succeeded.
331 *out_layer = layer;
332 R_SUCCEED();
333}
334
335Result FbShareBufferManager::AcquireSharedFrameBuffer(android::Fence* out_fence,
336 std::array<s32, 4>& out_slot_indexes,
337 s64* out_target_slot, u64 layer_id) {
338 std::scoped_lock lk{m_guard};
339
340 // Get the layer.
341 VI::Layer* layer;
342 R_TRY(this->GetLayerFromId(std::addressof(layer), layer_id));
343
344 // Get the producer.
345 auto& producer = layer->GetBufferQueue();
346
347 // Get the next buffer from the producer.
348 s32 slot;
349 R_UNLESS(producer.DequeueBuffer(std::addressof(slot), out_fence, SharedBufferAsync != 0,
350 SharedBufferWidth, SharedBufferHeight,
351 SharedBufferBlockLinearFormat, 0) == android::Status::NoError,
352 VI::ResultOperationFailed);
353
354 // Assign remaining outputs.
355 *out_target_slot = slot;
356 out_slot_indexes = {0, 1, -1, -1};
357
358 // We succeeded.
359 R_SUCCEED();
360}
361
362Result FbShareBufferManager::PresentSharedFrameBuffer(android::Fence fence,
363 Common::Rectangle<s32> crop_region,
364 u32 transform, s32 swap_interval,
365 u64 layer_id, s64 slot) {
366 std::scoped_lock lk{m_guard};
367
368 // Get the layer.
369 VI::Layer* layer;
370 R_TRY(this->GetLayerFromId(std::addressof(layer), layer_id));
371
372 // Get the producer.
373 auto& producer = layer->GetBufferQueue();
374
375 // Request to queue the buffer.
376 std::shared_ptr<android::GraphicBuffer> buffer;
377 R_UNLESS(producer.RequestBuffer(static_cast<s32>(slot), std::addressof(buffer)) ==
378 android::Status::NoError,
379 VI::ResultOperationFailed);
380
381 ON_RESULT_FAILURE {
382 producer.CancelBuffer(static_cast<s32>(slot), fence);
383 };
384
385 // Queue the buffer to the producer.
386 android::QueueBufferInput input{};
387 android::QueueBufferOutput output{};
388 input.crop = crop_region;
389 input.fence = fence;
390 input.transform = static_cast<android::NativeWindowTransform>(transform);
391 input.swap_interval = swap_interval;
392 R_UNLESS(producer.QueueBuffer(static_cast<s32>(slot), input, std::addressof(output)) ==
393 android::Status::NoError,
394 VI::ResultOperationFailed);
395
396 // We succeeded.
397 R_SUCCEED();
398}
399
400Result FbShareBufferManager::GetSharedFrameBufferAcquirableEvent(Kernel::KReadableEvent** out_event,
401 u64 layer_id) {
402 std::scoped_lock lk{m_guard};
403
404 // Get the layer.
405 VI::Layer* layer;
406 R_TRY(this->GetLayerFromId(std::addressof(layer), layer_id));
407
408 // Get the producer.
409 auto& producer = layer->GetBufferQueue();
410
411 // Set the event.
412 *out_event = std::addressof(producer.GetNativeHandle());
413
414 // We succeeded.
415 R_SUCCEED();
416}
417
418Result FbShareBufferManager::WriteAppletCaptureBuffer(bool* out_was_written, s32* out_layer_index) {
419 std::vector<u8> capture_buffer(m_system.GPU().GetAppletCaptureBuffer());
420 Common::ScratchBuffer<u32> scratch;
421
422 // TODO: this could be optimized
423 s64 e = -1280 * 768 * 4;
424 for (auto& block : *m_buffer_page_group) {
425 u8* start = m_system.DeviceMemory().GetPointer<u8>(block.GetAddress());
426 u8* end = m_system.DeviceMemory().GetPointer<u8>(block.GetAddress() + block.GetSize());
427
428 for (; start < end; start++) {
429 *start = 0;
430
431 if (e >= 0 && e < static_cast<s64>(capture_buffer.size())) {
432 *start = capture_buffer[e];
433 }
434 e++;
435 }
436
437 m_system.GPU().Host1x().MemoryManager().ApplyOpOnPointer(start, scratch, [&](DAddr addr) {
438 m_system.GPU().InvalidateRegion(addr, end - start);
439 });
440 }
441
442 *out_was_written = true;
443 *out_layer_index = 1;
444 R_SUCCEED();
445}
446
447} // namespace Service::Nvnflinger
diff --git a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.h b/src/core/hle/service/nvnflinger/fb_share_buffer_manager.h
deleted file mode 100644
index b79a7d23a..000000000
--- a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.h
+++ /dev/null
@@ -1,82 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <map>
7
8#include "common/math_util.h"
9#include "core/hle/service/nvdrv/core/container.h"
10#include "core/hle/service/nvdrv/nvdata.h"
11#include "core/hle/service/nvnflinger/hwc_layer.h"
12#include "core/hle/service/nvnflinger/nvnflinger.h"
13#include "core/hle/service/nvnflinger/ui/fence.h"
14
15namespace Kernel {
16class KPageGroup;
17}
18
19namespace Service::Nvnflinger {
20
21struct SharedMemorySlot {
22 u64 buffer_offset;
23 u64 size;
24 s32 width;
25 s32 height;
26};
27static_assert(sizeof(SharedMemorySlot) == 0x18, "SharedMemorySlot has wrong size");
28
29struct SharedMemoryPoolLayout {
30 s32 num_slots;
31 std::array<SharedMemorySlot, 0x10> slots;
32};
33static_assert(sizeof(SharedMemoryPoolLayout) == 0x188, "SharedMemoryPoolLayout has wrong size");
34
35struct FbShareSession;
36
37class FbShareBufferManager final {
38public:
39 explicit FbShareBufferManager(Core::System& system, Nvnflinger& flinger,
40 std::shared_ptr<Nvidia::Module> nvdrv);
41 ~FbShareBufferManager();
42
43 Result Initialize(Kernel::KProcess* owner_process, u64* out_buffer_id, u64* out_layer_handle,
44 u64 display_id, LayerBlending blending);
45 void Finalize(Kernel::KProcess* owner_process);
46
47 Result GetSharedBufferMemoryHandleId(u64* out_buffer_size, s32* out_nvmap_handle,
48 SharedMemoryPoolLayout* out_pool_layout, u64 buffer_id,
49 u64 applet_resource_user_id);
50 Result AcquireSharedFrameBuffer(android::Fence* out_fence, std::array<s32, 4>& out_slots,
51 s64* out_target_slot, u64 layer_id);
52 Result PresentSharedFrameBuffer(android::Fence fence, Common::Rectangle<s32> crop_region,
53 u32 transform, s32 swap_interval, u64 layer_id, s64 slot);
54 Result GetSharedFrameBufferAcquirableEvent(Kernel::KReadableEvent** out_event, u64 layer_id);
55
56 Result WriteAppletCaptureBuffer(bool* out_was_written, s32* out_layer_index);
57
58private:
59 Result GetLayerFromId(VI::Layer** out_layer, u64 layer_id);
60
61private:
62 u64 m_next_buffer_id = 1;
63 u64 m_display_id = 0;
64 u64 m_buffer_id = 0;
65 SharedMemoryPoolLayout m_pool_layout = {};
66 std::map<u64, FbShareSession> m_sessions;
67 std::unique_ptr<Kernel::KPageGroup> m_buffer_page_group;
68
69 std::mutex m_guard;
70 Core::System& m_system;
71 Nvnflinger& m_flinger;
72 std::shared_ptr<Nvidia::Module> m_nvdrv;
73};
74
75struct FbShareSession {
76 Nvidia::DeviceFD nvmap_fd = {};
77 Nvidia::NvCore::SessionId session_id = {};
78 u64 layer_id = {};
79 u32 buffer_nvmap_handle = 0;
80};
81
82} // namespace Service::Nvnflinger
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp
index cd8062a2b..a20ef14af 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.cpp
+++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp
@@ -9,7 +9,6 @@
9#include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" 9#include "core/hle/service/nvdrv/devices/nvdisp_disp0.h"
10#include "core/hle/service/nvdrv/nvdrv.h" 10#include "core/hle/service/nvdrv/nvdrv.h"
11#include "core/hle/service/nvdrv/nvdrv_interface.h" 11#include "core/hle/service/nvdrv/nvdrv_interface.h"
12#include "core/hle/service/nvnflinger/fb_share_buffer_manager.h"
13#include "core/hle/service/nvnflinger/hardware_composer.h" 12#include "core/hle/service/nvnflinger/hardware_composer.h"
14#include "core/hle/service/nvnflinger/hos_binder_driver.h" 13#include "core/hle/service/nvnflinger/hos_binder_driver.h"
15#include "core/hle/service/nvnflinger/hos_binder_driver_server.h" 14#include "core/hle/service/nvnflinger/hos_binder_driver_server.h"
@@ -311,16 +310,6 @@ s64 Nvnflinger::GetNextTicks() const {
311 return static_cast<s64>(speed_scale * (1000000000.f / effective_fps)); 310 return static_cast<s64>(speed_scale * (1000000000.f / effective_fps));
312} 311}
313 312
314FbShareBufferManager& Nvnflinger::GetSystemBufferManager() {
315 const auto lock_guard = Lock();
316
317 if (!system_buffer_manager) {
318 system_buffer_manager = std::make_unique<FbShareBufferManager>(system, *this, nvdrv);
319 }
320
321 return *system_buffer_manager;
322}
323
324void LoopProcess(Core::System& system) { 313void LoopProcess(Core::System& system) {
325 const auto binder_server = std::make_shared<HosBinderDriverServer>(system); 314 const auto binder_server = std::make_shared<HosBinderDriverServer>(system);
326 const auto surface_flinger = std::make_shared<Nvnflinger>(system, *binder_server); 315 const auto surface_flinger = std::make_shared<Nvnflinger>(system, *binder_server);
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.h b/src/core/hle/service/nvnflinger/nvnflinger.h
index 5ed7dc317..941a98418 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.h
+++ b/src/core/hle/service/nvnflinger/nvnflinger.h
@@ -35,6 +35,7 @@ class Module;
35 35
36namespace Service::VI { 36namespace Service::VI {
37class Display; 37class Display;
38class FbshareBufferManager;
38class Layer; 39class Layer;
39} // namespace Service::VI 40} // namespace Service::VI
40 41
@@ -45,7 +46,6 @@ class BufferQueueProducer;
45 46
46namespace Service::Nvnflinger { 47namespace Service::Nvnflinger {
47 48
48class FbShareBufferManager;
49class HardwareComposer; 49class HardwareComposer;
50class HosBinderDriverServer; 50class HosBinderDriverServer;
51 51
@@ -101,17 +101,9 @@ public:
101 101
102 [[nodiscard]] s64 GetNextTicks() const; 102 [[nodiscard]] s64 GetNextTicks() const;
103 103
104 FbShareBufferManager& GetSystemBufferManager();
105
106private: 104private:
107 struct Layer { 105 friend class VI::FbshareBufferManager;
108 std::unique_ptr<android::BufferQueueCore> core;
109 std::unique_ptr<android::BufferQueueProducer> producer;
110 };
111
112 friend class FbShareBufferManager;
113 106
114private:
115 [[nodiscard]] std::unique_lock<std::mutex> Lock() const { 107 [[nodiscard]] std::unique_lock<std::mutex> Lock() const {
116 return std::unique_lock{*guard}; 108 return std::unique_lock{*guard};
117 } 109 }
@@ -150,8 +142,6 @@ private:
150 std::shared_ptr<Core::Timing::EventType> multi_composition_event; 142 std::shared_ptr<Core::Timing::EventType> multi_composition_event;
151 std::shared_ptr<Core::Timing::EventType> single_composition_event; 143 std::shared_ptr<Core::Timing::EventType> single_composition_event;
152 144
153 std::unique_ptr<FbShareBufferManager> system_buffer_manager;
154
155 std::shared_ptr<std::mutex> guard; 145 std::shared_ptr<std::mutex> guard;
156 146
157 Core::System& system; 147 Core::System& system;