summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Liam2024-02-14 00:40:06 -0500
committerGravatar Liam2024-02-14 12:03:32 -0500
commit8863940bf5c57bf0a286c1eea4798d8160f9cee2 (patch)
tree8bcae257a3cd70e4e4abc4e12d164027c6d0d722 /src
parentvi: rewrite IManagerDisplayService (diff)
downloadyuzu-8863940bf5c57bf0a286c1eea4798d8160f9cee2.tar.gz
yuzu-8863940bf5c57bf0a286c1eea4798d8160f9cee2.tar.xz
yuzu-8863940bf5c57bf0a286c1eea4798d8160f9cee2.zip
vi: rewrite ISystemDisplayService
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/vi/system_display_service.cpp201
-rw-r--r--src/core/hle/service/vi/system_display_service.h39
2 files changed, 92 insertions, 148 deletions
diff --git a/src/core/hle/service/vi/system_display_service.cpp b/src/core/hle/service/vi/system_display_service.cpp
index b40321d45..1e1cfc817 100644
--- a/src/core/hle/service/vi/system_display_service.cpp
+++ b/src/core/hle/service/vi/system_display_service.cpp
@@ -2,7 +2,7 @@
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "common/settings.h" 4#include "common/settings.h"
5#include "core/hle/service/ipc_helpers.h" 5#include "core/hle/service/cmif_serialization.h"
6#include "core/hle/service/nvnflinger/fb_share_buffer_manager.h" 6#include "core/hle/service/nvnflinger/fb_share_buffer_manager.h"
7#include "core/hle/service/vi/system_display_service.h" 7#include "core/hle/service/vi/system_display_service.h"
8#include "core/hle/service/vi/vi_types.h" 8#include "core/hle/service/vi/vi_types.h"
@@ -10,8 +10,8 @@
10namespace Service::VI { 10namespace Service::VI {
11 11
12ISystemDisplayService::ISystemDisplayService(Core::System& system_, 12ISystemDisplayService::ISystemDisplayService(Core::System& system_,
13 Nvnflinger::Nvnflinger& nvnflinger_) 13 Nvnflinger::Nvnflinger& nvnflinger)
14 : ServiceFramework{system_, "ISystemDisplayService"}, nvnflinger{nvnflinger_} { 14 : ServiceFramework{system_, "ISystemDisplayService"}, m_nvnflinger{nvnflinger} {
15 // clang-format off 15 // clang-format off
16 static const FunctionInfo functions[] = { 16 static const FunctionInfo functions[] = {
17 {1200, nullptr, "GetZOrderCountMin"}, 17 {1200, nullptr, "GetZOrderCountMin"},
@@ -21,8 +21,8 @@ ISystemDisplayService::ISystemDisplayService(Core::System& system_,
21 {2201, nullptr, "SetLayerPosition"}, 21 {2201, nullptr, "SetLayerPosition"},
22 {2203, nullptr, "SetLayerSize"}, 22 {2203, nullptr, "SetLayerSize"},
23 {2204, nullptr, "GetLayerZ"}, 23 {2204, nullptr, "GetLayerZ"},
24 {2205, &ISystemDisplayService::SetLayerZ, "SetLayerZ"}, 24 {2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"},
25 {2207, &ISystemDisplayService::SetLayerVisibility, "SetLayerVisibility"}, 25 {2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
26 {2209, nullptr, "SetLayerAlpha"}, 26 {2209, nullptr, "SetLayerAlpha"},
27 {2210, nullptr, "SetLayerPositionAndSize"}, 27 {2210, nullptr, "SetLayerPositionAndSize"},
28 {2312, nullptr, "CreateStrayLayer"}, 28 {2312, nullptr, "CreateStrayLayer"},
@@ -32,7 +32,7 @@ ISystemDisplayService::ISystemDisplayService(Core::System& system_,
32 {3000, nullptr, "ListDisplayModes"}, 32 {3000, nullptr, "ListDisplayModes"},
33 {3001, nullptr, "ListDisplayRgbRanges"}, 33 {3001, nullptr, "ListDisplayRgbRanges"},
34 {3002, nullptr, "ListDisplayContentTypes"}, 34 {3002, nullptr, "ListDisplayContentTypes"},
35 {3200, &ISystemDisplayService::GetDisplayMode, "GetDisplayMode"}, 35 {3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"},
36 {3201, nullptr, "SetDisplayMode"}, 36 {3201, nullptr, "SetDisplayMode"},
37 {3202, nullptr, "GetDisplayUnderscan"}, 37 {3202, nullptr, "GetDisplayUnderscan"},
38 {3203, nullptr, "SetDisplayUnderscan"}, 38 {3203, nullptr, "SetDisplayUnderscan"},
@@ -50,14 +50,14 @@ ISystemDisplayService::ISystemDisplayService(Core::System& system_,
50 {3217, nullptr, "SetDisplayCmuLuma"}, 50 {3217, nullptr, "SetDisplayCmuLuma"},
51 {3218, nullptr, "SetDisplayCrcMode"}, 51 {3218, nullptr, "SetDisplayCrcMode"},
52 {6013, nullptr, "GetLayerPresentationSubmissionTimestamps"}, 52 {6013, nullptr, "GetLayerPresentationSubmissionTimestamps"},
53 {8225, &ISystemDisplayService::GetSharedBufferMemoryHandleId, "GetSharedBufferMemoryHandleId"}, 53 {8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"},
54 {8250, &ISystemDisplayService::OpenSharedLayer, "OpenSharedLayer"}, 54 {8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"},
55 {8251, nullptr, "CloseSharedLayer"}, 55 {8251, nullptr, "CloseSharedLayer"},
56 {8252, &ISystemDisplayService::ConnectSharedLayer, "ConnectSharedLayer"}, 56 {8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"},
57 {8253, nullptr, "DisconnectSharedLayer"}, 57 {8253, nullptr, "DisconnectSharedLayer"},
58 {8254, &ISystemDisplayService::AcquireSharedFrameBuffer, "AcquireSharedFrameBuffer"}, 58 {8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"},
59 {8255, &ISystemDisplayService::PresentSharedFrameBuffer, "PresentSharedFrameBuffer"}, 59 {8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"},
60 {8256, &ISystemDisplayService::GetSharedFrameBufferAcquirableEvent, "GetSharedFrameBufferAcquirableEvent"}, 60 {8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"},
61 {8257, nullptr, "FillSharedFrameBufferColor"}, 61 {8257, nullptr, "FillSharedFrameBufferColor"},
62 {8258, nullptr, "CancelSharedFrameBuffer"}, 62 {8258, nullptr, "CancelSharedFrameBuffer"},
63 {9000, nullptr, "GetDp2hdmiController"}, 63 {9000, nullptr, "GetDp2hdmiController"},
@@ -68,151 +68,78 @@ ISystemDisplayService::ISystemDisplayService(Core::System& system_,
68 68
69ISystemDisplayService::~ISystemDisplayService() = default; 69ISystemDisplayService::~ISystemDisplayService() = default;
70 70
71void ISystemDisplayService::GetSharedBufferMemoryHandleId(HLERequestContext& ctx) { 71Result ISystemDisplayService::SetLayerZ(u32 z_value, u64 layer_id) {
72 IPC::RequestParser rp{ctx}; 72 LOG_WARNING(Service_VI, "(STUBBED) called. layer_id={}, z_value={}", layer_id, z_value);
73 const u64 buffer_id = rp.PopRaw<u64>(); 73 R_SUCCEED();
74 const u64 aruid = ctx.GetPID(); 74}
75 75
76 LOG_INFO(Service_VI, "called. buffer_id={:#x}, aruid={:#x}", buffer_id, aruid); 76// This function currently does nothing but return a success error code in
77// the vi library itself, so do the same thing, but log out the passed in values.
78Result ISystemDisplayService::SetLayerVisibility(bool visible, u64 layer_id) {
79 LOG_DEBUG(Service_VI, "called, layer_id={}, visible={}", layer_id, visible);
80 R_SUCCEED();
81}
77 82
78 struct OutputParameters { 83Result ISystemDisplayService::GetDisplayMode(Out<u32> out_width, Out<u32> out_height,
79 s32 nvmap_handle; 84 Out<f32> out_refresh_rate, Out<u32> out_unknown) {
80 u64 size; 85 LOG_WARNING(Service_VI, "(STUBBED) called");
81 };
82 86
83 OutputParameters out{}; 87 if (Settings::IsDockedMode()) {
84 Nvnflinger::SharedMemoryPoolLayout layout{}; 88 *out_width = static_cast<u32>(DisplayResolution::DockedWidth);
85 const auto result = nvnflinger.GetSystemBufferManager().GetSharedBufferMemoryHandleId( 89 *out_height = static_cast<u32>(DisplayResolution::DockedHeight);
86 &out.size, &out.nvmap_handle, &layout, buffer_id, aruid); 90 } else {
91 *out_width = static_cast<u32>(DisplayResolution::UndockedWidth);
92 *out_height = static_cast<u32>(DisplayResolution::UndockedHeight);
93 }
87 94
88 ctx.WriteBuffer(&layout, sizeof(layout)); 95 *out_refresh_rate = 60.f; // This wouldn't seem to be correct for 30 fps games.
96 *out_unknown = 0;
89 97
90 IPC::ResponseBuilder rb{ctx, 6}; 98 R_SUCCEED();
91 rb.Push(result);
92 rb.PushRaw(out);
93} 99}
94 100
95void ISystemDisplayService::OpenSharedLayer(HLERequestContext& ctx) { 101Result ISystemDisplayService::GetSharedBufferMemoryHandleId(
96 IPC::RequestParser rp{ctx}; 102 Out<s32> out_nvmap_handle, Out<u64> out_size,
97 const u64 layer_id = rp.PopRaw<u64>(); 103 OutLargeData<Nvnflinger::SharedMemoryPoolLayout, BufferAttr_HipcMapAlias> out_pool_layout,
104 u64 buffer_id, ClientAppletResourceUserId aruid) {
105 LOG_INFO(Service_VI, "called. buffer_id={}, aruid={:#x}", buffer_id, aruid.pid);
98 106
99 LOG_INFO(Service_VI, "(STUBBED) called. layer_id={:#x}", layer_id); 107 R_RETURN(m_nvnflinger.GetSystemBufferManager().GetSharedBufferMemoryHandleId(
100 108 out_size, out_nvmap_handle, out_pool_layout, buffer_id, aruid.pid));
101 IPC::ResponseBuilder rb{ctx, 2};
102 rb.Push(ResultSuccess);
103} 109}
104 110
105void ISystemDisplayService::ConnectSharedLayer(HLERequestContext& ctx) { 111Result ISystemDisplayService::OpenSharedLayer(u64 layer_id) {
106 IPC::RequestParser rp{ctx}; 112 LOG_INFO(Service_VI, "(STUBBED) called. layer_id={}", layer_id);
107 const u64 layer_id = rp.PopRaw<u64>(); 113 R_SUCCEED();
108
109 LOG_INFO(Service_VI, "(STUBBED) called. layer_id={:#x}", layer_id);
110
111 IPC::ResponseBuilder rb{ctx, 2};
112 rb.Push(ResultSuccess);
113} 114}
114 115
115void ISystemDisplayService::GetSharedFrameBufferAcquirableEvent(HLERequestContext& ctx) { 116Result ISystemDisplayService::ConnectSharedLayer(u64 layer_id) {
116 LOG_DEBUG(Service_VI, "called"); 117 LOG_INFO(Service_VI, "(STUBBED) called. layer_id={}", layer_id);
117 118 R_SUCCEED();
118 IPC::RequestParser rp{ctx};
119 const u64 layer_id = rp.PopRaw<u64>();
120
121 Kernel::KReadableEvent* event{};
122 const auto result =
123 nvnflinger.GetSystemBufferManager().GetSharedFrameBufferAcquirableEvent(&event, layer_id);
124
125 IPC::ResponseBuilder rb{ctx, 2, 1};
126 rb.Push(result);
127 rb.PushCopyObjects(event);
128} 119}
129 120
130void ISystemDisplayService::AcquireSharedFrameBuffer(HLERequestContext& ctx) { 121Result ISystemDisplayService::AcquireSharedFrameBuffer(Out<android::Fence> out_fence,
122 Out<std::array<s32, 4>> out_slots,
123 Out<s64> out_target_slot, u64 layer_id) {
131 LOG_DEBUG(Service_VI, "called"); 124 LOG_DEBUG(Service_VI, "called");
132 125 R_RETURN(m_nvnflinger.GetSystemBufferManager().AcquireSharedFrameBuffer(
133 IPC::RequestParser rp{ctx}; 126 out_fence, *out_slots, out_target_slot, layer_id));
134 const u64 layer_id = rp.PopRaw<u64>();
135
136 struct OutputParameters {
137 android::Fence fence;
138 std::array<s32, 4> slots;
139 s64 target_slot;
140 };
141 static_assert(sizeof(OutputParameters) == 0x40, "OutputParameters has wrong size");
142
143 OutputParameters out{};
144 const auto result = nvnflinger.GetSystemBufferManager().AcquireSharedFrameBuffer(
145 &out.fence, out.slots, &out.target_slot, layer_id);
146
147 IPC::ResponseBuilder rb{ctx, 18};
148 rb.Push(result);
149 rb.PushRaw(out);
150} 127}
151 128
152void ISystemDisplayService::PresentSharedFrameBuffer(HLERequestContext& ctx) { 129Result ISystemDisplayService::PresentSharedFrameBuffer(android::Fence fence,
130 Common::Rectangle<s32> crop_region,
131 u32 window_transform, s32 swap_interval,
132 u64 layer_id, s64 surface_id) {
153 LOG_DEBUG(Service_VI, "called"); 133 LOG_DEBUG(Service_VI, "called");
154 134 R_RETURN(m_nvnflinger.GetSystemBufferManager().PresentSharedFrameBuffer(
155 struct InputParameters { 135 fence, crop_region, window_transform, swap_interval, layer_id, surface_id));
156 android::Fence fence;
157 Common::Rectangle<s32> crop_region;
158 u32 window_transform;
159 s32 swap_interval;
160 u64 layer_id;
161 s64 surface_id;
162 };
163 static_assert(sizeof(InputParameters) == 0x50, "InputParameters has wrong size");
164
165 IPC::RequestParser rp{ctx};
166 auto input = rp.PopRaw<InputParameters>();
167
168 const auto result = nvnflinger.GetSystemBufferManager().PresentSharedFrameBuffer(
169 input.fence, input.crop_region, input.window_transform, input.swap_interval, input.layer_id,
170 input.surface_id);
171 IPC::ResponseBuilder rb{ctx, 2};
172 rb.Push(result);
173} 136}
174 137
175void ISystemDisplayService::SetLayerZ(HLERequestContext& ctx) { 138Result ISystemDisplayService::GetSharedFrameBufferAcquirableEvent(
176 IPC::RequestParser rp{ctx}; 139 OutCopyHandle<Kernel::KReadableEvent> out_event, u64 layer_id) {
177 const u64 layer_id = rp.Pop<u64>(); 140 LOG_DEBUG(Service_VI, "called");
178 const u64 z_value = rp.Pop<u64>(); 141 R_RETURN(m_nvnflinger.GetSystemBufferManager().GetSharedFrameBufferAcquirableEvent(out_event,
179 142 layer_id));
180 LOG_WARNING(Service_VI, "(STUBBED) called. layer_id=0x{:016X}, z_value=0x{:016X}", layer_id,
181 z_value);
182
183 IPC::ResponseBuilder rb{ctx, 2};
184 rb.Push(ResultSuccess);
185}
186
187// This function currently does nothing but return a success error code in
188// the vi library itself, so do the same thing, but log out the passed in values.
189void ISystemDisplayService::SetLayerVisibility(HLERequestContext& ctx) {
190 IPC::RequestParser rp{ctx};
191 const u64 layer_id = rp.Pop<u64>();
192 const bool visibility = rp.Pop<bool>();
193
194 LOG_DEBUG(Service_VI, "called, layer_id=0x{:08X}, visibility={}", layer_id, visibility);
195
196 IPC::ResponseBuilder rb{ctx, 2};
197 rb.Push(ResultSuccess);
198}
199
200void ISystemDisplayService::GetDisplayMode(HLERequestContext& ctx) {
201 LOG_WARNING(Service_VI, "(STUBBED) called");
202
203 IPC::ResponseBuilder rb{ctx, 6};
204 rb.Push(ResultSuccess);
205
206 if (Settings::IsDockedMode()) {
207 rb.Push(static_cast<u32>(DisplayResolution::DockedWidth));
208 rb.Push(static_cast<u32>(DisplayResolution::DockedHeight));
209 } else {
210 rb.Push(static_cast<u32>(DisplayResolution::UndockedWidth));
211 rb.Push(static_cast<u32>(DisplayResolution::UndockedHeight));
212 }
213
214 rb.PushRaw<float>(60.0f); // This wouldn't seem to be correct for 30 fps games.
215 rb.Push<u32>(0);
216} 143}
217 144
218} // namespace Service::VI 145} // namespace Service::VI
diff --git a/src/core/hle/service/vi/system_display_service.h b/src/core/hle/service/vi/system_display_service.h
index 57ffbbf76..cfcb196fd 100644
--- a/src/core/hle/service/vi/system_display_service.h
+++ b/src/core/hle/service/vi/system_display_service.h
@@ -1,28 +1,45 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "common/math_util.h"
5#include "core/hle/service/cmif_types.h"
6#include "core/hle/service/nvnflinger/ui/fence.h"
4#include "core/hle/service/service.h" 7#include "core/hle/service/service.h"
5 8
9namespace Service::Nvnflinger {
10struct SharedMemoryPoolLayout;
11}
12
6namespace Service::VI { 13namespace Service::VI {
7 14
8class ISystemDisplayService final : public ServiceFramework<ISystemDisplayService> { 15class ISystemDisplayService final : public ServiceFramework<ISystemDisplayService> {
9public: 16public:
10 explicit ISystemDisplayService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger_); 17 explicit ISystemDisplayService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger);
11 ~ISystemDisplayService() override; 18 ~ISystemDisplayService() override;
12 19
13private: 20private:
14 void GetSharedBufferMemoryHandleId(HLERequestContext& ctx); 21 Result SetLayerZ(u32 z_value, u64 layer_id);
15 void OpenSharedLayer(HLERequestContext& ctx); 22 Result SetLayerVisibility(bool visible, u64 layer_id);
16 void ConnectSharedLayer(HLERequestContext& ctx); 23 Result GetDisplayMode(Out<u32> out_width, Out<u32> out_height, Out<f32> out_refresh_rate,
17 void GetSharedFrameBufferAcquirableEvent(HLERequestContext& ctx); 24 Out<u32> out_unknown);
18 void AcquireSharedFrameBuffer(HLERequestContext& ctx); 25
19 void PresentSharedFrameBuffer(HLERequestContext& ctx); 26 Result GetSharedBufferMemoryHandleId(
20 void SetLayerZ(HLERequestContext& ctx); 27 Out<s32> out_nvmap_handle, Out<u64> out_size,
21 void SetLayerVisibility(HLERequestContext& ctx); 28 OutLargeData<Nvnflinger::SharedMemoryPoolLayout, BufferAttr_HipcMapAlias> out_pool_layout,
22 void GetDisplayMode(HLERequestContext& ctx); 29 u64 buffer_id, ClientAppletResourceUserId aruid);
30 Result OpenSharedLayer(u64 layer_id);
31 Result ConnectSharedLayer(u64 layer_id);
32 Result GetSharedFrameBufferAcquirableEvent(OutCopyHandle<Kernel::KReadableEvent> out_event,
33 u64 layer_id);
34 Result AcquireSharedFrameBuffer(Out<android::Fence> out_fence,
35 Out<std::array<s32, 4>> out_slots, Out<s64> out_target_slot,
36 u64 layer_id);
37 Result PresentSharedFrameBuffer(android::Fence fence, Common::Rectangle<s32> crop_region,
38 u32 window_transform, s32 swap_interval, u64 layer_id,
39 s64 surface_id);
23 40
24private: 41private:
25 Nvnflinger::Nvnflinger& nvnflinger; 42 Nvnflinger::Nvnflinger& m_nvnflinger;
26}; 43};
27 44
28} // namespace Service::VI 45} // namespace Service::VI