hle: vi: Integrate new NVFlinger and HosBinderDriverServer service.

This commit is contained in:
bunnei
2021-11-11 19:15:51 -08:00
parent a87812c6a1
commit 7f4165fc05
17 changed files with 286 additions and 723 deletions

View File

@ -1,6 +1,5 @@
// Copyright 2018 yuzu emulator team
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2021 yuzu Emulator Project
#pragma once
@ -9,6 +8,7 @@
#include <mutex>
#include <optional>
#include <thread>
#include <unordered_map>
#include <vector>
#include "common/common_types.h"
@ -37,13 +37,16 @@ class Display;
class Layer;
} // namespace Service::VI
namespace Service::NVFlinger {
namespace android {
class BufferQueueCore;
class BufferQueueProducer;
} // namespace android
class BufferQueue;
namespace Service::NVFlinger {
class NVFlinger final {
public:
explicit NVFlinger(Core::System& system_);
explicit NVFlinger(Core::System& system_, HosBinderDriverServer& hos_binder_driver_server_);
~NVFlinger();
/// Sets the NVDrv module instance to use to send buffers to the GPU.
@ -72,15 +75,18 @@ public:
/// If an invalid display ID is provided, then nullptr is returned.
[[nodiscard]] Kernel::KReadableEvent* FindVsyncEvent(u64 display_id);
/// Obtains a buffer queue identified by the ID.
[[nodiscard]] BufferQueue* FindBufferQueue(u32 id);
/// Performs a composition request to the emulated nvidia GPU and triggers the vsync events when
/// finished.
void Compose();
[[nodiscard]] s64 GetNextTicks() const;
private:
struct Layer {
std::unique_ptr<android::BufferQueueCore> core;
std::unique_ptr<android::BufferQueueProducer> producer;
};
private:
[[nodiscard]] std::unique_lock<std::mutex> Lock() const {
return std::unique_lock{*guard};
@ -111,7 +117,6 @@ private:
std::shared_ptr<Nvidia::Module> nvdrv;
std::list<VI::Display> displays;
std::vector<std::unique_ptr<BufferQueue>> buffer_queues;
/// Id to use for the next layer that is created, this counter is shared among all displays.
u64 next_layer_id = 1;
@ -131,6 +136,8 @@ private:
std::jthread vsync_thread;
KernelHelpers::ServiceContext service_context;
HosBinderDriverServer& hos_binder_driver_server;
};
} // namespace Service::NVFlinger