From fd15730767860659bdb58e8cd33074530a708295 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 21 Feb 2019 10:56:20 -0500 Subject: [PATCH] service/vi/vi_layer: Convert Layer struct into a class Like the previous changes made to the Display struct, this prepares the Layer struct for changes to its interface. Given Layer will be given more invariants in the future, we convert it into a class to better signify that. --- src/core/hle/service/nvflinger/nvflinger.cpp | 8 ++--- src/core/hle/service/nvflinger/nvflinger.h | 2 +- .../hle/service/vi/display/vi_display.cpp | 4 +-- src/core/hle/service/vi/display/vi_display.h | 2 +- src/core/hle/service/vi/layer/vi_layer.cpp | 6 +++- src/core/hle/service/vi/layer/vi_layer.h | 31 ++++++++++++++++++- 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 6cc31050f6..95bb55bbb6 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp @@ -91,7 +91,7 @@ std::optional NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) co return {}; } - return layer->buffer_queue->GetId(); + return layer->GetBufferQueue().GetId(); } Kernel::SharedPtr NVFlinger::FindVsyncEvent(u64 display_id) const { @@ -167,10 +167,10 @@ void NVFlinger::Compose() { // TODO(Subv): Support more than 1 layer. VI::Layer& layer = display.GetLayer(0); - auto& buffer_queue = layer.buffer_queue; + auto& buffer_queue = layer.GetBufferQueue(); // Search for a queued buffer and acquire it - auto buffer = buffer_queue->AcquireBuffer(); + auto buffer = buffer_queue.AcquireBuffer(); MicroProfileFlip(); @@ -195,7 +195,7 @@ void NVFlinger::Compose() { igbp_buffer.width, igbp_buffer.height, igbp_buffer.stride, buffer->get().transform, buffer->get().crop_rect); - buffer_queue->ReleaseBuffer(buffer->get().slot); + buffer_queue.ReleaseBuffer(buffer->get().slot); } } diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index 4741b13638..f9458745ae 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h @@ -29,7 +29,7 @@ class Module; namespace Service::VI { class Display; -struct Layer; +class Layer; } // namespace Service::VI namespace Service::NVFlinger { diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp index 4d77c3353f..9c0afd152d 100644 --- a/src/core/hle/service/vi/display/vi_display.cpp +++ b/src/core/hle/service/vi/display/vi_display.cpp @@ -48,7 +48,7 @@ void Display::CreateLayer(u64 id, std::shared_ptr buffer Layer* Display::FindLayer(u64 id) { const auto itr = std::find_if(layers.begin(), layers.end(), - [id](const VI::Layer& layer) { return layer.id == id; }); + [id](const VI::Layer& layer) { return layer.GetID() == id; }); if (itr == layers.end()) { return nullptr; @@ -59,7 +59,7 @@ Layer* Display::FindLayer(u64 id) { const Layer* Display::FindLayer(u64 id) const { const auto itr = std::find_if(layers.begin(), layers.end(), - [id](const VI::Layer& layer) { return layer.id == id; }); + [id](const VI::Layer& layer) { return layer.GetID() == id; }); if (itr == layers.end()) { return nullptr; diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h index 22b8315925..8948102bc1 100644 --- a/src/core/hle/service/vi/display/vi_display.h +++ b/src/core/hle/service/vi/display/vi_display.h @@ -16,7 +16,7 @@ class BufferQueue; namespace Service::VI { -struct Layer; +class Layer; /// Represents a single display type class Display { diff --git a/src/core/hle/service/vi/layer/vi_layer.cpp b/src/core/hle/service/vi/layer/vi_layer.cpp index 3a83e5b953..48f4c57cb2 100644 --- a/src/core/hle/service/vi/layer/vi_layer.cpp +++ b/src/core/hle/service/vi/layer/vi_layer.cpp @@ -2,12 +2,16 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/assert.h" #include "core/hle/service/vi/layer/vi_layer.h" namespace Service::VI { Layer::Layer(u64 id, std::shared_ptr queue) - : id{id}, buffer_queue{std::move(queue)} {} + : id{id}, buffer_queue{std::move(queue)} +{ + ASSERT_MSG(buffer_queue != nullptr, "buffer_queue may not be null."); +} Layer::~Layer() = default; diff --git a/src/core/hle/service/vi/layer/vi_layer.h b/src/core/hle/service/vi/layer/vi_layer.h index df328e09fb..dd4f7e5967 100644 --- a/src/core/hle/service/vi/layer/vi_layer.h +++ b/src/core/hle/service/vi/layer/vi_layer.h @@ -14,10 +14,39 @@ class BufferQueue; namespace Service::VI { -struct Layer { +/// Represents a single display layer. +class Layer { +public: + /// Constructs a layer with a given ID and buffer queue. + /// + /// @param id The ID to assign to this layer. + /// @param queue The buffer queue for this layer to use. + /// Layer(u64 id, std::shared_ptr queue); ~Layer(); + Layer(const Layer&) = delete; + Layer& operator=(const Layer&) = delete; + + Layer(Layer&&) = default; + Layer& operator=(Layer&&) = default; + + /// Gets the ID for this layer. + u64 GetID() const { + return id; + } + + /// Gets a reference to the buffer queue this layer is using. + NVFlinger::BufferQueue& GetBufferQueue() { + return *buffer_queue; + } + + /// Gets a const reference to the buffer queue this layer is using. + const NVFlinger::BufferQueue& GetBufferQueue() const { + return *buffer_queue; + } + +private: u64 id; std::shared_ptr buffer_queue; };