diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 40 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 10 | ||||
| -rw-r--r-- | src/core/hle/service/ns/pl_u.cpp | 27 | ||||
| -rw-r--r-- | src/core/hle/service/ns/pl_u.h | 1 |
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 | ||
| 254 | std::vector<u8> HLERequestContext::ReadBuffer() const { | 254 | std::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 | ||
| 269 | size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size) const { | 271 | size_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 | ||
| 287 | size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer) const { | 289 | size_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 | ||
| 291 | size_t HLERequestContext::GetReadBufferSize() const { | 293 | size_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 | ||
| 296 | size_t HLERequestContext::GetWriteBufferSize() const { | 299 | size_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 | ||
| 301 | std::string HLERequestContext::Description() const { | 305 | std::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 | ||
| 119 | void 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; |