mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +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