summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar David2018-05-01 13:28:36 -0700
committerGravatar bunnei2018-05-01 16:28:36 -0400
commitff2f0d980ae613e64a9bc46ec4793b1a033426b3 (patch)
tree337e684389231717c18c7bdd6c0bef85c294f24e
parentMerge pull request #425 from lioncash/namespace (diff)
downloadyuzu-ff2f0d980ae613e64a9bc46ec4793b1a033426b3.tar.gz
yuzu-ff2f0d980ae613e64a9bc46ec4793b1a033426b3.tar.xz
yuzu-ff2f0d980ae613e64a9bc46ec4793b1a033426b3.zip
GetSharedFontInOrderOfPriority (#381)
* GetSharedFontInOrderOfPriority * Update pl_u.cpp * Ability to use ReadBuffer and WriteBuffer with different buffer indexes, fixed up GetSharedFontInOrderOfPriority * switched to NGLOG * Update pl_u.cpp * Update pl_u.cpp * language_code is actually language code and not index * u32->u64 * final cleanups
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp40
-rw-r--r--src/core/hle/kernel/hle_ipc.h10
-rw-r--r--src/core/hle/service/ns/pl_u.cpp27
-rw-r--r--src/core/hle/service/ns/pl_u.h1
4 files changed, 54 insertions, 24 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index aa6ca1026..349bc11df 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -251,24 +251,26 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(Thread& thread) {
251 return RESULT_SUCCESS; 251 return RESULT_SUCCESS;
252} 252}
253 253
254std::vector<u8> HLERequestContext::ReadBuffer() const { 254std::vector<u8> HLERequestContext::ReadBuffer(int buffer_index) const {
255 std::vector<u8> buffer; 255 std::vector<u8> buffer;
256 const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; 256 const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()};
257 257
258 if (is_buffer_a) { 258 if (is_buffer_a) {
259 buffer.resize(BufferDescriptorA()[0].Size()); 259 buffer.resize(BufferDescriptorA()[buffer_index].Size());
260 Memory::ReadBlock(BufferDescriptorA()[0].Address(), buffer.data(), buffer.size()); 260 Memory::ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(),
261 buffer.size());
261 } else { 262 } else {
262 buffer.resize(BufferDescriptorX()[0].Size()); 263 buffer.resize(BufferDescriptorX()[buffer_index].Size());
263 Memory::ReadBlock(BufferDescriptorX()[0].Address(), buffer.data(), buffer.size()); 264 Memory::ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(),
265 buffer.size());
264 } 266 }
265 267
266 return buffer; 268 return buffer;
267} 269}
268 270
269size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size) const { 271size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size, int buffer_index) const {
270 const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; 272 const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[buffer_index].Size()};
271 const size_t buffer_size{GetWriteBufferSize()}; 273 const size_t buffer_size{GetWriteBufferSize(buffer_index)};
272 if (size > buffer_size) { 274 if (size > buffer_size) {
273 NGLOG_CRITICAL(Core, "size ({:016X}) is greater than buffer_size ({:016X})", size, 275 NGLOG_CRITICAL(Core, "size ({:016X}) is greater than buffer_size ({:016X})", size,
274 buffer_size); 276 buffer_size);
@@ -276,26 +278,28 @@ size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size) const {
276 } 278 }
277 279
278 if (is_buffer_b) { 280 if (is_buffer_b) {
279 Memory::WriteBlock(BufferDescriptorB()[0].Address(), buffer, size); 281 Memory::WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size);
280 } else { 282 } else {
281 Memory::WriteBlock(BufferDescriptorC()[0].Address(), buffer, size); 283 Memory::WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size);
282 } 284 }
283 285
284 return size; 286 return size;
285} 287}
286 288
287size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer) const { 289size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer, int buffer_index) const {
288 return WriteBuffer(buffer.data(), buffer.size()); 290 return WriteBuffer(buffer.data(), buffer.size());
289} 291}
290 292
291size_t HLERequestContext::GetReadBufferSize() const { 293size_t HLERequestContext::GetReadBufferSize(int buffer_index) const {
292 const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; 294 const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()};
293 return is_buffer_a ? BufferDescriptorA()[0].Size() : BufferDescriptorX()[0].Size(); 295 return is_buffer_a ? BufferDescriptorA()[buffer_index].Size()
296 : BufferDescriptorX()[buffer_index].Size();
294} 297}
295 298
296size_t HLERequestContext::GetWriteBufferSize() const { 299size_t HLERequestContext::GetWriteBufferSize(int buffer_index) const {
297 const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; 300 const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[buffer_index].Size()};
298 return is_buffer_b ? BufferDescriptorB()[0].Size() : BufferDescriptorC()[0].Size(); 301 return is_buffer_b ? BufferDescriptorB()[buffer_index].Size()
302 : BufferDescriptorC()[buffer_index].Size();
299} 303}
300 304
301std::string HLERequestContext::Description() const { 305std::string HLERequestContext::Description() const {
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index 8b35da4c9..6d4ed7648 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -164,19 +164,19 @@ public:
164 } 164 }
165 165
166 /// Helper function to read a buffer using the appropriate buffer descriptor 166 /// Helper function to read a buffer using the appropriate buffer descriptor
167 std::vector<u8> ReadBuffer() const; 167 std::vector<u8> ReadBuffer(int buffer_index = 0) const;
168 168
169 /// Helper function to write a buffer using the appropriate buffer descriptor 169 /// Helper function to write a buffer using the appropriate buffer descriptor
170 size_t WriteBuffer(const void* buffer, size_t size) const; 170 size_t WriteBuffer(const void* buffer, size_t size, int buffer_index = 0) const;
171 171
172 /// Helper function to write a buffer using the appropriate buffer descriptor 172 /// Helper function to write a buffer using the appropriate buffer descriptor
173 size_t WriteBuffer(const std::vector<u8>& buffer) const; 173 size_t WriteBuffer(const std::vector<u8>& buffer, int buffer_index = 0) const;
174 174
175 /// Helper function to get the size of the input buffer 175 /// Helper function to get the size of the input buffer
176 size_t GetReadBufferSize() const; 176 size_t GetReadBufferSize(int buffer_index = 0) const;
177 177
178 /// Helper function to get the size of the output buffer 178 /// Helper function to get the size of the output buffer
179 size_t GetWriteBufferSize() const; 179 size_t GetWriteBufferSize(int buffer_index = 0) const;
180 180
181 template <typename T> 181 template <typename T>
182 SharedPtr<T> GetCopyObject(size_t index) { 182 SharedPtr<T> GetCopyObject(size_t index) {
diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp
index c2a647e89..636af9a1e 100644
--- a/src/core/hle/service/ns/pl_u.cpp
+++ b/src/core/hle/service/ns/pl_u.cpp
@@ -37,7 +37,7 @@ PL_U::PL_U() : ServiceFramework("pl:u") {
37 {2, &PL_U::GetSize, "GetSize"}, 37 {2, &PL_U::GetSize, "GetSize"},
38 {3, &PL_U::GetSharedMemoryAddressOffset, "GetSharedMemoryAddressOffset"}, 38 {3, &PL_U::GetSharedMemoryAddressOffset, "GetSharedMemoryAddressOffset"},
39 {4, &PL_U::GetSharedMemoryNativeHandle, "GetSharedMemoryNativeHandle"}, 39 {4, &PL_U::GetSharedMemoryNativeHandle, "GetSharedMemoryNativeHandle"},
40 {5, nullptr, "GetSharedFontInOrderOfPriority"}, 40 {5, &PL_U::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriority"},
41 }; 41 };
42 RegisterHandlers(functions); 42 RegisterHandlers(functions);
43 43
@@ -116,4 +116,29 @@ void PL_U::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx) {
116 rb.PushCopyObjects(shared_font_mem); 116 rb.PushCopyObjects(shared_font_mem);
117} 117}
118 118
119void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) {
120 IPC::RequestParser rp{ctx};
121 const u64 language_code{rp.Pop<u64>()}; // TODO(ogniK): Find out what this is used for
122 NGLOG_DEBUG(Service_NS, "called, language_code=%lx", language_code);
123 IPC::ResponseBuilder rb{ctx, 4};
124 std::vector<u32> font_codes;
125 std::vector<u32> font_offsets;
126 std::vector<u32> font_sizes;
127
128 // TODO(ogniK): Have actual priority order
129 for (size_t i = 0; i < SHARED_FONT_REGIONS.size(); i++) {
130 font_codes.push_back(static_cast<u32>(i));
131 font_offsets.push_back(SHARED_FONT_REGIONS[i].offset);
132 font_sizes.push_back(SHARED_FONT_REGIONS[i].size);
133 }
134
135 ctx.WriteBuffer(font_codes.data(), font_codes.size(), 0);
136 ctx.WriteBuffer(font_offsets.data(), font_offsets.size(), 1);
137 ctx.WriteBuffer(font_sizes.data(), font_sizes.size(), 2);
138
139 rb.Push(RESULT_SUCCESS);
140 rb.Push<u8>(static_cast<u8>(LoadState::Done)); // Fonts Loaded
141 rb.Push<u32>(static_cast<u32>(font_codes.size()));
142}
143
119} // namespace Service::NS 144} // namespace Service::NS
diff --git a/src/core/hle/service/ns/pl_u.h b/src/core/hle/service/ns/pl_u.h
index b175c9c44..fcc2acab7 100644
--- a/src/core/hle/service/ns/pl_u.h
+++ b/src/core/hle/service/ns/pl_u.h
@@ -21,6 +21,7 @@ private:
21 void GetSize(Kernel::HLERequestContext& ctx); 21 void GetSize(Kernel::HLERequestContext& ctx);
22 void GetSharedMemoryAddressOffset(Kernel::HLERequestContext& ctx); 22 void GetSharedMemoryAddressOffset(Kernel::HLERequestContext& ctx);
23 void GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx); 23 void GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx);
24 void GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx);
24 25
25 /// Handle to shared memory region designated for a shared font 26 /// Handle to shared memory region designated for a shared font
26 Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; 27 Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem;