From 64c56315793d2b6dbf7a55f99d4bcc51929f03cb Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 4 Jan 2020 00:45:06 -0500 Subject: service: vi: Implement CloseLayer. - Needed for Undertale. --- src/core/hle/service/vi/display/vi_display.cpp | 27 +++++++++++++++++--------- src/core/hle/service/vi/display/vi_display.h | 9 ++++++++- 2 files changed, 26 insertions(+), 10 deletions(-) (limited to 'src/core/hle/service/vi/display') diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp index cd18c1610..5a202ac81 100644 --- a/src/core/hle/service/vi/display/vi_display.cpp +++ b/src/core/hle/service/vi/display/vi_display.cpp @@ -24,11 +24,11 @@ Display::Display(u64 id, std::string name, Core::System& system) : id{id}, name{ Display::~Display() = default; Layer& Display::GetLayer(std::size_t index) { - return layers.at(index); + return *layers.at(index); } const Layer& Display::GetLayer(std::size_t index) const { - return layers.at(index); + return *layers.at(index); } std::shared_ptr Display::GetVSyncEvent() const { @@ -43,29 +43,38 @@ void Display::CreateLayer(u64 id, NVFlinger::BufferQueue& buffer_queue) { // TODO(Subv): Support more than 1 layer. ASSERT_MSG(layers.empty(), "Only one layer is supported per display at the moment"); - layers.emplace_back(id, buffer_queue); + layers.emplace_back(std::make_shared(id, buffer_queue)); +} + +void Display::CloseLayer(u64 id) { + layers.erase( + std::remove_if(layers.begin(), layers.end(), + [id](const std::shared_ptr& layer) { return layer->GetID() == id; }), + layers.end()); } Layer* Display::FindLayer(u64 id) { - const auto itr = std::find_if(layers.begin(), layers.end(), - [id](const VI::Layer& layer) { return layer.GetID() == id; }); + const auto itr = + std::find_if(layers.begin(), layers.end(), + [id](const std::shared_ptr& layer) { return layer->GetID() == id; }); if (itr == layers.end()) { return nullptr; } - return &*itr; + return itr->get(); } const Layer* Display::FindLayer(u64 id) const { - const auto itr = std::find_if(layers.begin(), layers.end(), - [id](const VI::Layer& layer) { return layer.GetID() == id; }); + const auto itr = + std::find_if(layers.begin(), layers.end(), + [id](const std::shared_ptr& layer) { return layer->GetID() == id; }); if (itr == layers.end()) { return nullptr; } - return &*itr; + return itr->get(); } } // namespace Service::VI diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h index 8bb966a85..a3855d8cd 100644 --- a/src/core/hle/service/vi/display/vi_display.h +++ b/src/core/hle/service/vi/display/vi_display.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include @@ -69,6 +70,12 @@ public: /// void CreateLayer(u64 id, NVFlinger::BufferQueue& buffer_queue); + /// Closes and removes a layer from this display with the given ID. + /// + /// @param id The ID assigned to the layer to close. + /// + void CloseLayer(u64 id); + /// Attempts to find a layer with the given ID. /// /// @param id The layer ID. @@ -91,7 +98,7 @@ private: u64 id; std::string name; - std::vector layers; + std::vector> layers; Kernel::EventPair vsync_event; }; -- cgit v1.2.3