mirror of
https://git.743378673.xyz/MeloNX/MeloNX.git
synced 2025-08-03 00:47:09 +02:00
Implement Shared Fonts (#215)
* Implement Shared Fonts This fully implements shared fonts. This commit is provided without fonts. This commit also add Size to HSharedMem.Positions to be able to add fonts to shared zones when RequestLoad is called. * Require the user to provide fonts in RyuFS/system * Use File.Exits instead of relying ona try/catch and change system resource exception format a bit * Make sure that font sum doesn't exceed 17MB Also rename font data dictionary for coherence.
This commit is contained in:
parent
5f34353dce
commit
eeb626947e
13 changed files with 292 additions and 35 deletions
|
@ -6,37 +6,37 @@ namespace Ryujinx.HLE.OsHle.Handles
|
|||
{
|
||||
class HSharedMem
|
||||
{
|
||||
private List<(AMemory, long)> Positions;
|
||||
private List<(AMemory, long, long)> Positions;
|
||||
|
||||
public EventHandler<EventArgs> MemoryMapped;
|
||||
public EventHandler<EventArgs> MemoryUnmapped;
|
||||
|
||||
public HSharedMem()
|
||||
{
|
||||
Positions = new List<(AMemory, long)>();
|
||||
Positions = new List<(AMemory, long, long)>();
|
||||
}
|
||||
|
||||
public void AddVirtualPosition(AMemory Memory, long Position)
|
||||
public void AddVirtualPosition(AMemory Memory, long Position, long Size)
|
||||
{
|
||||
lock (Positions)
|
||||
{
|
||||
Positions.Add((Memory, Position));
|
||||
Positions.Add((Memory, Position, Size));
|
||||
|
||||
MemoryMapped?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveVirtualPosition(AMemory Memory, long Position)
|
||||
public void RemoveVirtualPosition(AMemory Memory, long Position, long Size)
|
||||
{
|
||||
lock (Positions)
|
||||
{
|
||||
Positions.Remove((Memory, Position));
|
||||
Positions.Remove((Memory, Position, Size));
|
||||
|
||||
MemoryUnmapped?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
public (AMemory, long)[] GetVirtualPositions()
|
||||
public (AMemory, long, long)[] GetVirtualPositions()
|
||||
{
|
||||
return Positions.ToArray();
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
|
|||
|
||||
private ConcurrentDictionary<KThread, AutoResetEvent> SyncWaits;
|
||||
|
||||
private HashSet<(HSharedMem, long)> MappedSharedMems;
|
||||
private HashSet<(HSharedMem, long, long)> MappedSharedMems;
|
||||
|
||||
private ulong CurrentHeapSize;
|
||||
|
||||
|
@ -83,7 +83,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
|
|||
|
||||
SyncWaits = new ConcurrentDictionary<KThread, AutoResetEvent>();
|
||||
|
||||
MappedSharedMems = new HashSet<(HSharedMem, long)>();
|
||||
MappedSharedMems = new HashSet<(HSharedMem, long, long)>();
|
||||
}
|
||||
|
||||
static SvcHandler()
|
||||
|
@ -138,9 +138,9 @@ namespace Ryujinx.HLE.OsHle.Kernel
|
|||
{
|
||||
lock (MappedSharedMems)
|
||||
{
|
||||
foreach ((HSharedMem SharedMem, long Position) in MappedSharedMems)
|
||||
foreach ((HSharedMem SharedMem, long Position, long Size) in MappedSharedMems)
|
||||
{
|
||||
SharedMem.RemoveVirtualPosition(Memory, Position);
|
||||
SharedMem.RemoveVirtualPosition(Memory, Position, Size);
|
||||
}
|
||||
|
||||
MappedSharedMems.Clear();
|
||||
|
|
|
@ -174,15 +174,15 @@ namespace Ryujinx.HLE.OsHle.Kernel
|
|||
|
||||
AMemoryHelper.FillWithZeros(Memory, Src, (int)Size);
|
||||
|
||||
SharedMem.AddVirtualPosition(Memory, Src, Size);
|
||||
|
||||
Memory.Manager.Reprotect(Src, Size, (AMemoryPerm)Perm);
|
||||
|
||||
lock (MappedSharedMems)
|
||||
{
|
||||
MappedSharedMems.Add((SharedMem, Src));
|
||||
MappedSharedMems.Add((SharedMem, Src, Size));
|
||||
}
|
||||
|
||||
SharedMem.AddVirtualPosition(Memory, Src);
|
||||
|
||||
ThreadState.X0 = 0;
|
||||
}
|
||||
|
||||
|
@ -210,11 +210,11 @@ namespace Ryujinx.HLE.OsHle.Kernel
|
|||
{
|
||||
Memory.Manager.Unmap(Src, Size, (int)MemoryType.SharedMemory);
|
||||
|
||||
SharedMem.RemoveVirtualPosition(Memory, Src);
|
||||
SharedMem.RemoveVirtualPosition(Memory, Src, Size);
|
||||
|
||||
lock (MappedSharedMems)
|
||||
{
|
||||
MappedSharedMems.Remove((SharedMem, Src));
|
||||
MappedSharedMems.Remove((SharedMem, Src, Size));
|
||||
}
|
||||
|
||||
ThreadState.X0 = 0;
|
||||
|
|
|
@ -242,7 +242,6 @@ namespace Ryujinx.HLE.OsHle.Kernel
|
|||
Process.Scheduler.Suspend(CurrThread);
|
||||
|
||||
IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr);
|
||||
|
||||
long Result = IpcHandler.IpcCall(Ns, Process, Memory, Session, Cmd, CmdPtr);
|
||||
|
||||
Thread.Yield();
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using Ryujinx.HLE.Font;
|
||||
using Ryujinx.HLE.OsHle.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
|
@ -13,11 +14,12 @@ namespace Ryujinx.HLE.OsHle.Services.Pl
|
|||
{
|
||||
m_Commands = new Dictionary<int, ServiceProcessRequest>()
|
||||
{
|
||||
{ 0, RequestLoad },
|
||||
{ 1, GetLoadState },
|
||||
{ 2, GetFontSize },
|
||||
{ 3, GetSharedMemoryAddressOffset },
|
||||
{ 4, GetSharedMemoryNativeHandle }
|
||||
{ 0, RequestLoad },
|
||||
{ 1, GetLoadState },
|
||||
{ 2, GetFontSize },
|
||||
{ 3, GetSharedMemoryAddressOffset },
|
||||
{ 4, GetSharedMemoryNativeHandle },
|
||||
{ 5, GetSharedFontInOrderOfPriority }
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -25,26 +27,34 @@ namespace Ryujinx.HLE.OsHle.Services.Pl
|
|||
{
|
||||
SharedFontType FontType = (SharedFontType)Context.RequestData.ReadInt32();
|
||||
|
||||
Context.Ns.Font.Load(FontType);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public long GetLoadState(ServiceCtx Context)
|
||||
{
|
||||
Context.ResponseData.Write(1); //Loaded
|
||||
SharedFontType FontType = (SharedFontType)Context.RequestData.ReadInt32();
|
||||
|
||||
Context.ResponseData.Write(Context.Ns.Font.GetLoadState(FontType));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public long GetFontSize(ServiceCtx Context)
|
||||
{
|
||||
Context.ResponseData.Write(Horizon.FontSize);
|
||||
SharedFontType FontType = (SharedFontType)Context.RequestData.ReadInt32();
|
||||
|
||||
Context.ResponseData.Write(Context.Ns.Font.GetFontSize(FontType));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public long GetSharedMemoryAddressOffset(ServiceCtx Context)
|
||||
{
|
||||
Context.ResponseData.Write(0);
|
||||
SharedFontType FontType = (SharedFontType)Context.RequestData.ReadInt32();
|
||||
|
||||
Context.ResponseData.Write(Context.Ns.Font.GetSharedMemoryAddressOffset(FontType));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -57,5 +67,51 @@ namespace Ryujinx.HLE.OsHle.Services.Pl
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private uint AddFontToOrderOfPriorityList(ServiceCtx Context, SharedFontType FontType, uint BufferPos, out uint LoadState)
|
||||
{
|
||||
long TypesPosition = Context.Request.ReceiveBuff[0].Position;
|
||||
long TypesSize = Context.Request.ReceiveBuff[0].Size;
|
||||
|
||||
long OffsetsPosition = Context.Request.ReceiveBuff[1].Position;
|
||||
long OffsetsSize = Context.Request.ReceiveBuff[1].Size;
|
||||
|
||||
long FontSizeBufferPosition = Context.Request.ReceiveBuff[2].Position;
|
||||
long FontSizeBufferSize = Context.Request.ReceiveBuff[2].Size;
|
||||
|
||||
LoadState = Context.Ns.Font.GetLoadState(FontType);
|
||||
|
||||
if (BufferPos >= TypesSize || BufferPos >= OffsetsSize || BufferPos >= FontSizeBufferSize)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Context.Memory.WriteUInt32(TypesPosition + BufferPos, (uint)FontType);
|
||||
Context.Memory.WriteUInt32(OffsetsPosition + BufferPos, Context.Ns.Font.GetSharedMemoryAddressOffset(FontType));
|
||||
Context.Memory.WriteUInt32(FontSizeBufferPosition + BufferPos, Context.Ns.Font.GetFontSize(FontType));
|
||||
|
||||
BufferPos += 4;
|
||||
|
||||
return BufferPos;
|
||||
}
|
||||
|
||||
public long GetSharedFontInOrderOfPriority(ServiceCtx Context)
|
||||
{
|
||||
ulong LanguageCode = Context.RequestData.ReadUInt64();
|
||||
uint LoadedCount = 0;
|
||||
uint BufferPos = 0;
|
||||
uint Loaded = 0;
|
||||
|
||||
for (int Type = 0; Type < Context.Ns.Font.Count; Type++)
|
||||
{
|
||||
BufferPos = AddFontToOrderOfPriorityList(Context, (SharedFontType)Type, BufferPos, out Loaded);
|
||||
LoadedCount += Loaded;
|
||||
}
|
||||
|
||||
Context.ResponseData.Write(LoadedCount);
|
||||
Context.ResponseData.Write(Context.Ns.Font.Count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
namespace Ryujinx.HLE.OsHle.Services.Pl
|
||||
{
|
||||
enum SharedFontType
|
||||
{
|
||||
JapanUsEurope = 0,
|
||||
SimplifiedChinese = 1,
|
||||
SimplifiedChineseEx = 2,
|
||||
TraditionalChinese = 3,
|
||||
Korean = 4,
|
||||
NintendoEx = 5
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue