diff options
| author | 2019-02-20 21:21:55 -0500 | |
|---|---|---|
| committer | 2019-02-20 21:21:55 -0500 | |
| commit | ef559f5741a447f4387b9dd3664c2cb61f61d9d4 (patch) | |
| tree | e33ff3d783d351e6d737e3554d3478630ce44af8 | |
| parent | Merge pull request #2122 from ReinUsesLisp/vulkan-resource-manager (diff) | |
| parent | service/nvflinger: Relocate definitions of Layer and Display to the vi service (diff) | |
| download | yuzu-ef559f5741a447f4387b9dd3664c2cb61f61d9d4.tar.gz yuzu-ef559f5741a447f4387b9dd3664c2cb61f61d9d4.tar.xz yuzu-ef559f5741a447f4387b9dd3664c2cb61f61d9d4.zip | |
Merge pull request #2142 from lioncash/relocate
service/nvflinger: Relocate definitions of Layer and Display to the vi service
| -rw-r--r-- | src/core/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 44 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.h | 43 | ||||
| -rw-r--r-- | src/core/hle/service/vi/display/vi_display.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/service/vi/display/vi_display.h | 28 | ||||
| -rw-r--r-- | src/core/hle/service/vi/layer/vi_layer.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/service/vi/layer/vi_layer.h | 25 |
7 files changed, 123 insertions, 57 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index f61bcd40d..988356c65 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -400,6 +400,10 @@ add_library(core STATIC | |||
| 400 | hle/service/time/time.h | 400 | hle/service/time/time.h |
| 401 | hle/service/usb/usb.cpp | 401 | hle/service/usb/usb.cpp |
| 402 | hle/service/usb/usb.h | 402 | hle/service/usb/usb.h |
| 403 | hle/service/vi/display/vi_display.cpp | ||
| 404 | hle/service/vi/display/vi_display.h | ||
| 405 | hle/service/vi/layer/vi_layer.cpp | ||
| 406 | hle/service/vi/layer/vi_layer.h | ||
| 403 | hle/service/vi/vi.cpp | 407 | hle/service/vi/vi.cpp |
| 404 | hle/service/vi/vi.h | 408 | hle/service/vi/vi.h |
| 405 | hle/service/vi/vi_m.cpp | 409 | hle/service/vi/vi_m.cpp |
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 3babc3f7c..b5d452db1 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -14,11 +14,12 @@ | |||
| 14 | #include "core/core_timing_util.h" | 14 | #include "core/core_timing_util.h" |
| 15 | #include "core/hle/kernel/kernel.h" | 15 | #include "core/hle/kernel/kernel.h" |
| 16 | #include "core/hle/kernel/readable_event.h" | 16 | #include "core/hle/kernel/readable_event.h" |
| 17 | #include "core/hle/kernel/writable_event.h" | ||
| 18 | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" | 17 | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" |
| 19 | #include "core/hle/service/nvdrv/nvdrv.h" | 18 | #include "core/hle/service/nvdrv/nvdrv.h" |
| 20 | #include "core/hle/service/nvflinger/buffer_queue.h" | 19 | #include "core/hle/service/nvflinger/buffer_queue.h" |
| 21 | #include "core/hle/service/nvflinger/nvflinger.h" | 20 | #include "core/hle/service/nvflinger/nvflinger.h" |
| 21 | #include "core/hle/service/vi/display/vi_display.h" | ||
| 22 | #include "core/hle/service/vi/layer/vi_layer.h" | ||
| 22 | #include "core/perf_stats.h" | 23 | #include "core/perf_stats.h" |
| 23 | #include "video_core/renderer_base.h" | 24 | #include "video_core/renderer_base.h" |
| 24 | 25 | ||
| @@ -27,7 +28,9 @@ namespace Service::NVFlinger { | |||
| 27 | constexpr std::size_t SCREEN_REFRESH_RATE = 60; | 28 | constexpr std::size_t SCREEN_REFRESH_RATE = 60; |
| 28 | constexpr u64 frame_ticks = static_cast<u64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE); | 29 | constexpr u64 frame_ticks = static_cast<u64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE); |
| 29 | 30 | ||
| 30 | NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { | 31 | NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) |
| 32 | : displays{{0, "Default"}, {1, "External"}, {2, "Edid"}, {3, "Internal"}, {4, "Null"}}, | ||
| 33 | core_timing{core_timing} { | ||
| 31 | // Schedule the screen composition events | 34 | // Schedule the screen composition events |
| 32 | composition_event = | 35 | composition_event = |
| 33 | core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, int cycles_late) { | 36 | core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, int cycles_late) { |
| @@ -53,7 +56,7 @@ std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { | |||
| 53 | ASSERT(name == "Default"); | 56 | ASSERT(name == "Default"); |
| 54 | 57 | ||
| 55 | const auto itr = std::find_if(displays.begin(), displays.end(), | 58 | const auto itr = std::find_if(displays.begin(), displays.end(), |
| 56 | [&](const Display& display) { return display.name == name; }); | 59 | [&](const VI::Display& display) { return display.name == name; }); |
| 57 | if (itr == displays.end()) { | 60 | if (itr == displays.end()) { |
| 58 | return {}; | 61 | return {}; |
| 59 | } | 62 | } |
| @@ -106,9 +109,10 @@ std::shared_ptr<BufferQueue> NVFlinger::FindBufferQueue(u32 id) const { | |||
| 106 | return *itr; | 109 | return *itr; |
| 107 | } | 110 | } |
| 108 | 111 | ||
| 109 | Display* NVFlinger::FindDisplay(u64 display_id) { | 112 | VI::Display* NVFlinger::FindDisplay(u64 display_id) { |
| 110 | const auto itr = std::find_if(displays.begin(), displays.end(), | 113 | const auto itr = |
| 111 | [&](const Display& display) { return display.id == display_id; }); | 114 | std::find_if(displays.begin(), displays.end(), |
| 115 | [&](const VI::Display& display) { return display.id == display_id; }); | ||
| 112 | 116 | ||
| 113 | if (itr == displays.end()) { | 117 | if (itr == displays.end()) { |
| 114 | return nullptr; | 118 | return nullptr; |
| @@ -117,9 +121,10 @@ Display* NVFlinger::FindDisplay(u64 display_id) { | |||
| 117 | return &*itr; | 121 | return &*itr; |
| 118 | } | 122 | } |
| 119 | 123 | ||
| 120 | const Display* NVFlinger::FindDisplay(u64 display_id) const { | 124 | const VI::Display* NVFlinger::FindDisplay(u64 display_id) const { |
| 121 | const auto itr = std::find_if(displays.begin(), displays.end(), | 125 | const auto itr = |
| 122 | [&](const Display& display) { return display.id == display_id; }); | 126 | std::find_if(displays.begin(), displays.end(), |
| 127 | [&](const VI::Display& display) { return display.id == display_id; }); | ||
| 123 | 128 | ||
| 124 | if (itr == displays.end()) { | 129 | if (itr == displays.end()) { |
| 125 | return nullptr; | 130 | return nullptr; |
| @@ -128,7 +133,7 @@ const Display* NVFlinger::FindDisplay(u64 display_id) const { | |||
| 128 | return &*itr; | 133 | return &*itr; |
| 129 | } | 134 | } |
| 130 | 135 | ||
| 131 | Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) { | 136 | VI::Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) { |
| 132 | auto* const display = FindDisplay(display_id); | 137 | auto* const display = FindDisplay(display_id); |
| 133 | 138 | ||
| 134 | if (display == nullptr) { | 139 | if (display == nullptr) { |
| @@ -136,7 +141,7 @@ Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) { | |||
| 136 | } | 141 | } |
| 137 | 142 | ||
| 138 | const auto itr = std::find_if(display->layers.begin(), display->layers.end(), | 143 | const auto itr = std::find_if(display->layers.begin(), display->layers.end(), |
| 139 | [&](const Layer& layer) { return layer.id == layer_id; }); | 144 | [&](const VI::Layer& layer) { return layer.id == layer_id; }); |
| 140 | 145 | ||
| 141 | if (itr == display->layers.end()) { | 146 | if (itr == display->layers.end()) { |
| 142 | return nullptr; | 147 | return nullptr; |
| @@ -145,7 +150,7 @@ Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) { | |||
| 145 | return &*itr; | 150 | return &*itr; |
| 146 | } | 151 | } |
| 147 | 152 | ||
| 148 | const Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) const { | 153 | const VI::Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) const { |
| 149 | const auto* const display = FindDisplay(display_id); | 154 | const auto* const display = FindDisplay(display_id); |
| 150 | 155 | ||
| 151 | if (display == nullptr) { | 156 | if (display == nullptr) { |
| @@ -153,7 +158,7 @@ const Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) const { | |||
| 153 | } | 158 | } |
| 154 | 159 | ||
| 155 | const auto itr = std::find_if(display->layers.begin(), display->layers.end(), | 160 | const auto itr = std::find_if(display->layers.begin(), display->layers.end(), |
| 156 | [&](const Layer& layer) { return layer.id == layer_id; }); | 161 | [&](const VI::Layer& layer) { return layer.id == layer_id; }); |
| 157 | 162 | ||
| 158 | if (itr == display->layers.end()) { | 163 | if (itr == display->layers.end()) { |
| 159 | return nullptr; | 164 | return nullptr; |
| @@ -174,7 +179,7 @@ void NVFlinger::Compose() { | |||
| 174 | // TODO(Subv): Support more than 1 layer. | 179 | // TODO(Subv): Support more than 1 layer. |
| 175 | ASSERT_MSG(display.layers.size() == 1, "Max 1 layer per display is supported"); | 180 | ASSERT_MSG(display.layers.size() == 1, "Max 1 layer per display is supported"); |
| 176 | 181 | ||
| 177 | Layer& layer = display.layers[0]; | 182 | VI::Layer& layer = display.layers[0]; |
| 178 | auto& buffer_queue = layer.buffer_queue; | 183 | auto& buffer_queue = layer.buffer_queue; |
| 179 | 184 | ||
| 180 | // Search for a queued buffer and acquire it | 185 | // Search for a queued buffer and acquire it |
| @@ -207,15 +212,4 @@ void NVFlinger::Compose() { | |||
| 207 | } | 212 | } |
| 208 | } | 213 | } |
| 209 | 214 | ||
| 210 | Layer::Layer(u64 id, std::shared_ptr<BufferQueue> queue) : id(id), buffer_queue(std::move(queue)) {} | ||
| 211 | Layer::~Layer() = default; | ||
| 212 | |||
| 213 | Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { | ||
| 214 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 215 | vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||
| 216 | fmt::format("Display VSync Event {}", id)); | ||
| 217 | } | ||
| 218 | |||
| 219 | Display::~Display() = default; | ||
| 220 | |||
| 221 | } // namespace Service::NVFlinger | 215 | } // namespace Service::NVFlinger |
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index 437aa592d..2e000af91 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <array> | ||
| 8 | #include <memory> | 7 | #include <memory> |
| 9 | #include <optional> | 8 | #include <optional> |
| 10 | #include <string> | 9 | #include <string> |
| @@ -26,31 +25,17 @@ class WritableEvent; | |||
| 26 | 25 | ||
| 27 | namespace Service::Nvidia { | 26 | namespace Service::Nvidia { |
| 28 | class Module; | 27 | class Module; |
| 29 | } | 28 | } // namespace Service::Nvidia |
| 29 | |||
| 30 | namespace Service::VI { | ||
| 31 | struct Display; | ||
| 32 | struct Layer; | ||
| 33 | } // namespace Service::VI | ||
| 30 | 34 | ||
| 31 | namespace Service::NVFlinger { | 35 | namespace Service::NVFlinger { |
| 32 | 36 | ||
| 33 | class BufferQueue; | 37 | class BufferQueue; |
| 34 | 38 | ||
| 35 | struct Layer { | ||
| 36 | Layer(u64 id, std::shared_ptr<BufferQueue> queue); | ||
| 37 | ~Layer(); | ||
| 38 | |||
| 39 | u64 id; | ||
| 40 | std::shared_ptr<BufferQueue> buffer_queue; | ||
| 41 | }; | ||
| 42 | |||
| 43 | struct Display { | ||
| 44 | Display(u64 id, std::string name); | ||
| 45 | ~Display(); | ||
| 46 | |||
| 47 | u64 id; | ||
| 48 | std::string name; | ||
| 49 | |||
| 50 | std::vector<Layer> layers; | ||
| 51 | Kernel::EventPair vsync_event; | ||
| 52 | }; | ||
| 53 | |||
| 54 | class NVFlinger final { | 39 | class NVFlinger final { |
| 55 | public: | 40 | public: |
| 56 | explicit NVFlinger(Core::Timing::CoreTiming& core_timing); | 41 | explicit NVFlinger(Core::Timing::CoreTiming& core_timing); |
| @@ -88,26 +73,20 @@ public: | |||
| 88 | 73 | ||
| 89 | private: | 74 | private: |
| 90 | /// Finds the display identified by the specified ID. | 75 | /// Finds the display identified by the specified ID. |
| 91 | Display* FindDisplay(u64 display_id); | 76 | VI::Display* FindDisplay(u64 display_id); |
| 92 | 77 | ||
| 93 | /// Finds the display identified by the specified ID. | 78 | /// Finds the display identified by the specified ID. |
| 94 | const Display* FindDisplay(u64 display_id) const; | 79 | const VI::Display* FindDisplay(u64 display_id) const; |
| 95 | 80 | ||
| 96 | /// Finds the layer identified by the specified ID in the desired display. | 81 | /// Finds the layer identified by the specified ID in the desired display. |
| 97 | Layer* FindLayer(u64 display_id, u64 layer_id); | 82 | VI::Layer* FindLayer(u64 display_id, u64 layer_id); |
| 98 | 83 | ||
| 99 | /// Finds the layer identified by the specified ID in the desired display. | 84 | /// Finds the layer identified by the specified ID in the desired display. |
| 100 | const Layer* FindLayer(u64 display_id, u64 layer_id) const; | 85 | const VI::Layer* FindLayer(u64 display_id, u64 layer_id) const; |
| 101 | 86 | ||
| 102 | std::shared_ptr<Nvidia::Module> nvdrv; | 87 | std::shared_ptr<Nvidia::Module> nvdrv; |
| 103 | 88 | ||
| 104 | std::array<Display, 5> displays{{ | 89 | std::vector<VI::Display> displays; |
| 105 | {0, "Default"}, | ||
| 106 | {1, "External"}, | ||
| 107 | {2, "Edid"}, | ||
| 108 | {3, "Internal"}, | ||
| 109 | {4, "Null"}, | ||
| 110 | }}; | ||
| 111 | std::vector<std::shared_ptr<BufferQueue>> buffer_queues; | 90 | std::vector<std::shared_ptr<BufferQueue>> buffer_queues; |
| 112 | 91 | ||
| 113 | /// Id to use for the next layer that is created, this counter is shared among all displays. | 92 | /// Id to use for the next layer that is created, this counter is shared among all displays. |
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp new file mode 100644 index 000000000..a108e468f --- /dev/null +++ b/src/core/hle/service/vi/display/vi_display.cpp | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | // Copyright 2019 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <fmt/format.h> | ||
| 6 | |||
| 7 | #include "core/core.h" | ||
| 8 | #include "core/hle/kernel/readable_event.h" | ||
| 9 | #include "core/hle/service/vi/display/vi_display.h" | ||
| 10 | #include "core/hle/service/vi/layer/vi_layer.h" | ||
| 11 | |||
| 12 | namespace Service::VI { | ||
| 13 | |||
| 14 | Display::Display(u64 id, std::string name) : id{id}, name{std::move(name)} { | ||
| 15 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 16 | vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||
| 17 | fmt::format("Display VSync Event {}", id)); | ||
| 18 | } | ||
| 19 | |||
| 20 | Display::~Display() = default; | ||
| 21 | |||
| 22 | } // 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 new file mode 100644 index 000000000..df44db306 --- /dev/null +++ b/src/core/hle/service/vi/display/vi_display.h | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright 2019 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | #include <vector> | ||
| 9 | |||
| 10 | #include "common/common_types.h" | ||
| 11 | #include "core/hle/kernel/writable_event.h" | ||
| 12 | |||
| 13 | namespace Service::VI { | ||
| 14 | |||
| 15 | struct Layer; | ||
| 16 | |||
| 17 | struct Display { | ||
| 18 | Display(u64 id, std::string name); | ||
| 19 | ~Display(); | ||
| 20 | |||
| 21 | u64 id; | ||
| 22 | std::string name; | ||
| 23 | |||
| 24 | std::vector<Layer> layers; | ||
| 25 | Kernel::EventPair vsync_event; | ||
| 26 | }; | ||
| 27 | |||
| 28 | } // namespace Service::VI | ||
diff --git a/src/core/hle/service/vi/layer/vi_layer.cpp b/src/core/hle/service/vi/layer/vi_layer.cpp new file mode 100644 index 000000000..3a83e5b95 --- /dev/null +++ b/src/core/hle/service/vi/layer/vi_layer.cpp | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | // Copyright 2019 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "core/hle/service/vi/layer/vi_layer.h" | ||
| 6 | |||
| 7 | namespace Service::VI { | ||
| 8 | |||
| 9 | Layer::Layer(u64 id, std::shared_ptr<NVFlinger::BufferQueue> queue) | ||
| 10 | : id{id}, buffer_queue{std::move(queue)} {} | ||
| 11 | |||
| 12 | Layer::~Layer() = default; | ||
| 13 | |||
| 14 | } // namespace Service::VI | ||
diff --git a/src/core/hle/service/vi/layer/vi_layer.h b/src/core/hle/service/vi/layer/vi_layer.h new file mode 100644 index 000000000..df328e09f --- /dev/null +++ b/src/core/hle/service/vi/layer/vi_layer.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | // Copyright 2019 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <memory> | ||
| 8 | |||
| 9 | #include "common/common_types.h" | ||
| 10 | |||
| 11 | namespace Service::NVFlinger { | ||
| 12 | class BufferQueue; | ||
| 13 | } | ||
| 14 | |||
| 15 | namespace Service::VI { | ||
| 16 | |||
| 17 | struct Layer { | ||
| 18 | Layer(u64 id, std::shared_ptr<NVFlinger::BufferQueue> queue); | ||
| 19 | ~Layer(); | ||
| 20 | |||
| 21 | u64 id; | ||
| 22 | std::shared_ptr<NVFlinger::BufferQueue> buffer_queue; | ||
| 23 | }; | ||
| 24 | |||
| 25 | } // namespace Service::VI | ||