mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	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
This commit is contained in:
		
							parent
							
								
									f362cf46ee
								
							
						
					
					
						commit
						ff2f0d980a
					
				| @ -251,24 +251,26 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(Thread& thread) { | |||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::vector<u8> HLERequestContext::ReadBuffer() const { | std::vector<u8> HLERequestContext::ReadBuffer(int buffer_index) const { | ||||||
|     std::vector<u8> buffer; |     std::vector<u8> buffer; | ||||||
|     const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; |     const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()}; | ||||||
| 
 | 
 | ||||||
|     if (is_buffer_a) { |     if (is_buffer_a) { | ||||||
|         buffer.resize(BufferDescriptorA()[0].Size()); |         buffer.resize(BufferDescriptorA()[buffer_index].Size()); | ||||||
|         Memory::ReadBlock(BufferDescriptorA()[0].Address(), buffer.data(), buffer.size()); |         Memory::ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(), | ||||||
|  |                           buffer.size()); | ||||||
|     } else { |     } else { | ||||||
|         buffer.resize(BufferDescriptorX()[0].Size()); |         buffer.resize(BufferDescriptorX()[buffer_index].Size()); | ||||||
|         Memory::ReadBlock(BufferDescriptorX()[0].Address(), buffer.data(), buffer.size()); |         Memory::ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(), | ||||||
|  |                           buffer.size()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return buffer; |     return buffer; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size) const { | size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size, int buffer_index) const { | ||||||
|     const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; |     const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[buffer_index].Size()}; | ||||||
|     const size_t buffer_size{GetWriteBufferSize()}; |     const size_t buffer_size{GetWriteBufferSize(buffer_index)}; | ||||||
|     if (size > buffer_size) { |     if (size > buffer_size) { | ||||||
|         NGLOG_CRITICAL(Core, "size ({:016X}) is greater than buffer_size ({:016X})", size, |         NGLOG_CRITICAL(Core, "size ({:016X}) is greater than buffer_size ({:016X})", size, | ||||||
|                        buffer_size); |                        buffer_size); | ||||||
| @ -276,26 +278,28 @@ size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size) const { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (is_buffer_b) { |     if (is_buffer_b) { | ||||||
|         Memory::WriteBlock(BufferDescriptorB()[0].Address(), buffer, size); |         Memory::WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); | ||||||
|     } else { |     } else { | ||||||
|         Memory::WriteBlock(BufferDescriptorC()[0].Address(), buffer, size); |         Memory::WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return size; |     return size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer) const { | size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer, int buffer_index) const { | ||||||
|     return WriteBuffer(buffer.data(), buffer.size()); |     return WriteBuffer(buffer.data(), buffer.size()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| size_t HLERequestContext::GetReadBufferSize() const { | size_t HLERequestContext::GetReadBufferSize(int buffer_index) const { | ||||||
|     const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[0].Size()}; |     const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()}; | ||||||
|     return is_buffer_a ? BufferDescriptorA()[0].Size() : BufferDescriptorX()[0].Size(); |     return is_buffer_a ? BufferDescriptorA()[buffer_index].Size() | ||||||
|  |                        : BufferDescriptorX()[buffer_index].Size(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| size_t HLERequestContext::GetWriteBufferSize() const { | size_t HLERequestContext::GetWriteBufferSize(int buffer_index) const { | ||||||
|     const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[0].Size()}; |     const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[buffer_index].Size()}; | ||||||
|     return is_buffer_b ? BufferDescriptorB()[0].Size() : BufferDescriptorC()[0].Size(); |     return is_buffer_b ? BufferDescriptorB()[buffer_index].Size() | ||||||
|  |                        : BufferDescriptorC()[buffer_index].Size(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::string HLERequestContext::Description() const { | std::string HLERequestContext::Description() const { | ||||||
|  | |||||||
| @ -164,19 +164,19 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Helper function to read a buffer using the appropriate buffer descriptor
 |     /// Helper function to read a buffer using the appropriate buffer descriptor
 | ||||||
|     std::vector<u8> ReadBuffer() const; |     std::vector<u8> ReadBuffer(int buffer_index = 0) const; | ||||||
| 
 | 
 | ||||||
|     /// Helper function to write a buffer using the appropriate buffer descriptor
 |     /// Helper function to write a buffer using the appropriate buffer descriptor
 | ||||||
|     size_t WriteBuffer(const void* buffer, size_t size) const; |     size_t WriteBuffer(const void* buffer, size_t size, int buffer_index = 0) const; | ||||||
| 
 | 
 | ||||||
|     /// Helper function to write a buffer using the appropriate buffer descriptor
 |     /// Helper function to write a buffer using the appropriate buffer descriptor
 | ||||||
|     size_t WriteBuffer(const std::vector<u8>& buffer) const; |     size_t WriteBuffer(const std::vector<u8>& buffer, int buffer_index = 0) const; | ||||||
| 
 | 
 | ||||||
|     /// Helper function to get the size of the input buffer
 |     /// Helper function to get the size of the input buffer
 | ||||||
|     size_t GetReadBufferSize() const; |     size_t GetReadBufferSize(int buffer_index = 0) const; | ||||||
| 
 | 
 | ||||||
|     /// Helper function to get the size of the output buffer
 |     /// Helper function to get the size of the output buffer
 | ||||||
|     size_t GetWriteBufferSize() const; |     size_t GetWriteBufferSize(int buffer_index = 0) const; | ||||||
| 
 | 
 | ||||||
|     template <typename T> |     template <typename T> | ||||||
|     SharedPtr<T> GetCopyObject(size_t index) { |     SharedPtr<T> GetCopyObject(size_t index) { | ||||||
|  | |||||||
| @ -37,7 +37,7 @@ PL_U::PL_U() : ServiceFramework("pl:u") { | |||||||
|         {2, &PL_U::GetSize, "GetSize"}, |         {2, &PL_U::GetSize, "GetSize"}, | ||||||
|         {3, &PL_U::GetSharedMemoryAddressOffset, "GetSharedMemoryAddressOffset"}, |         {3, &PL_U::GetSharedMemoryAddressOffset, "GetSharedMemoryAddressOffset"}, | ||||||
|         {4, &PL_U::GetSharedMemoryNativeHandle, "GetSharedMemoryNativeHandle"}, |         {4, &PL_U::GetSharedMemoryNativeHandle, "GetSharedMemoryNativeHandle"}, | ||||||
|         {5, nullptr, "GetSharedFontInOrderOfPriority"}, |         {5, &PL_U::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriority"}, | ||||||
|     }; |     }; | ||||||
|     RegisterHandlers(functions); |     RegisterHandlers(functions); | ||||||
| 
 | 
 | ||||||
| @ -116,4 +116,29 @@ void PL_U::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx) { | |||||||
|     rb.PushCopyObjects(shared_font_mem); |     rb.PushCopyObjects(shared_font_mem); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp{ctx}; | ||||||
|  |     const u64 language_code{rp.Pop<u64>()}; // TODO(ogniK): Find out what this is used for
 | ||||||
|  |     NGLOG_DEBUG(Service_NS, "called, language_code=%lx", language_code); | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 4}; | ||||||
|  |     std::vector<u32> font_codes; | ||||||
|  |     std::vector<u32> font_offsets; | ||||||
|  |     std::vector<u32> font_sizes; | ||||||
|  | 
 | ||||||
|  |     // TODO(ogniK): Have actual priority order
 | ||||||
|  |     for (size_t i = 0; i < SHARED_FONT_REGIONS.size(); i++) { | ||||||
|  |         font_codes.push_back(static_cast<u32>(i)); | ||||||
|  |         font_offsets.push_back(SHARED_FONT_REGIONS[i].offset); | ||||||
|  |         font_sizes.push_back(SHARED_FONT_REGIONS[i].size); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ctx.WriteBuffer(font_codes.data(), font_codes.size(), 0); | ||||||
|  |     ctx.WriteBuffer(font_offsets.data(), font_offsets.size(), 1); | ||||||
|  |     ctx.WriteBuffer(font_sizes.data(), font_sizes.size(), 2); | ||||||
|  | 
 | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push<u8>(static_cast<u8>(LoadState::Done)); // Fonts Loaded
 | ||||||
|  |     rb.Push<u32>(static_cast<u32>(font_codes.size())); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace Service::NS
 | } // namespace Service::NS
 | ||||||
|  | |||||||
| @ -21,6 +21,7 @@ private: | |||||||
|     void GetSize(Kernel::HLERequestContext& ctx); |     void GetSize(Kernel::HLERequestContext& ctx); | ||||||
|     void GetSharedMemoryAddressOffset(Kernel::HLERequestContext& ctx); |     void GetSharedMemoryAddressOffset(Kernel::HLERequestContext& ctx); | ||||||
|     void GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx); |     void GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx); | ||||||
|  |     void GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|     /// Handle to shared memory region designated for a shared font
 |     /// Handle to shared memory region designated for a shared font
 | ||||||
|     Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; |     Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 David
						David