hle: nvflinger: Add implementation for HosBinderDriverServer service.

merge-requests/60/head
bunnei 2021-11-11 19:13:21 +07:00
parent 56284bff6c
commit a87812c6a1
3 changed files with 75 additions and 0 deletions

@ -553,6 +553,8 @@ add_library(core STATIC
hle/service/nvflinger/consumer_listener.h hle/service/nvflinger/consumer_listener.h
hle/service/nvflinger/graphic_buffer_producer.cpp hle/service/nvflinger/graphic_buffer_producer.cpp
hle/service/nvflinger/graphic_buffer_producer.h hle/service/nvflinger/graphic_buffer_producer.h
hle/service/nvflinger/hos_binder_driver_server.cpp
hle/service/nvflinger/hos_binder_driver_server.h
hle/service/nvflinger/nvflinger.cpp hle/service/nvflinger/nvflinger.cpp
hle/service/nvflinger/nvflinger.h hle/service/nvflinger/nvflinger.h
hle/service/nvflinger/parcel.h hle/service/nvflinger/parcel.h

@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2021 yuzu Emulator Project
#include <mutex>
#include "common/common_types.h"
#include "core/hle/service/nvflinger/hos_binder_driver_server.h"
namespace Service::NVFlinger {
HosBinderDriverServer::HosBinderDriverServer(Core::System& system_)
: service_context(system_, "HosBinderDriverServer") {}
HosBinderDriverServer::~HosBinderDriverServer() {}
u64 HosBinderDriverServer::RegisterProducer(std::unique_ptr<android::IBinder>&& binder) {
std::lock_guard lk{lock};
last_id++;
producers[last_id] = std::move(binder);
return last_id;
}
android::IBinder* HosBinderDriverServer::TryGetProducer(u64 id) {
std::lock_guard lk{lock};
if (auto search = producers.find(id); search != producers.end()) {
return search->second.get();
}
return {};
}
} // namespace Service::NVFlinger

@ -0,0 +1,37 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2021 yuzu Emulator Project
#pragma once
#include <memory>
#include <mutex>
#include <unordered_map>
#include "common/common_types.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/nvflinger/binder.h"
namespace Core {
class System;
}
namespace Service::NVFlinger {
class HosBinderDriverServer final {
public:
explicit HosBinderDriverServer(Core::System& system_);
~HosBinderDriverServer();
u64 RegisterProducer(std::unique_ptr<android::IBinder>&& binder);
android::IBinder* TryGetProducer(u64 id);
private:
KernelHelpers::ServiceContext service_context;
std::unordered_map<u64, std::unique_ptr<android::IBinder>> producers;
std::mutex lock;
u64 last_id{};
};
} // namespace Service::NVFlinger