aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs85
1 files changed, 35 insertions, 50 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs b/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs
index a2b57e74..b7869519 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs
@@ -1,13 +1,11 @@
using ARMeilleure.Memory;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Services.SurfaceFlinger;
using Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService;
using System;
-using System.IO;
using System.Text;
-using static Ryujinx.HLE.HOS.Services.SurfaceFlinger.Parcel;
-
namespace Ryujinx.HLE.HOS.Services.Vi.RootService
{
class IApplicationDisplayService : IpcService
@@ -23,9 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
// GetRelayService() -> object<nns::hosbinder::IHOSBinderDriver>
public ResultCode GetRelayService(ServiceCtx context)
{
- MakeObject(context, new IHOSBinderDriver(
- context.Device.System,
- context.Device.Gpu.Renderer));
+ MakeObject(context, new HOSBinderDriverServer());
return ResultCode.Success;
}
@@ -52,9 +48,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
// GetIndirectDisplayTransactionService() -> object<nns::hosbinder::IHOSBinderDriver>
public ResultCode GetIndirectDisplayTransactionService(ServiceCtx context)
{
- MakeObject(context, new IHOSBinderDriver(
- context.Device.System,
- context.Device.Gpu.Renderer));
+ MakeObject(context, new HOSBinderDriverServer());
return ResultCode.Success;
}
@@ -71,8 +65,8 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
context.Memory.WriteBytes(recBuffPtr, Encoding.ASCII.GetBytes("Default"));
context.Memory.WriteInt64(recBuffPtr + 0x40, 0x1L);
context.Memory.WriteInt64(recBuffPtr + 0x48, 0x1L);
- context.Memory.WriteInt64(recBuffPtr + 0x50, 1920L);
- context.Memory.WriteInt64(recBuffPtr + 0x58, 1080L);
+ context.Memory.WriteInt64(recBuffPtr + 0x50, 1280L);
+ context.Memory.WriteInt64(recBuffPtr + 0x58, 720L);
context.ResponseData.Write(1L);
@@ -119,16 +113,24 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
// OpenLayer(nn::vi::DisplayName, u64, nn::applet::AppletResourceUserId, pid) -> (u64, buffer<bytes, 6>)
public ResultCode OpenLayer(ServiceCtx context)
{
- long layerId = context.RequestData.ReadInt64();
- long userId = context.RequestData.ReadInt64();
+ // TODO: support multi display.
+ byte[] displayName = context.RequestData.ReadBytes(0x40);
+ long layerId = context.RequestData.ReadInt64();
+ long userId = context.RequestData.ReadInt64();
long parcelPtr = context.Request.ReceiveBuff[0].Position;
- byte[] parcel = MakeIGraphicsBufferProducer(parcelPtr);
+ IBinder producer = context.Device.System.SurfaceFlinger.OpenLayer(context.Process, layerId);
+
+ Parcel parcel = new Parcel(0x28, 0x4);
+
+ parcel.WriteObject(producer, "dispdrv\0");
+
+ ReadOnlySpan<byte> parcelData = parcel.Finish();
- context.Memory.WriteBytes(parcelPtr, parcel);
+ context.Memory.WriteBytes(parcelPtr, parcelData.ToArray());
- context.ResponseData.Write((long)parcel.Length);
+ context.ResponseData.Write((long)parcelData.Length);
return ResultCode.Success;
}
@@ -139,6 +141,8 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
{
long layerId = context.RequestData.ReadInt64();
+ context.Device.System.SurfaceFlinger.CloseLayer(layerId);
+
return ResultCode.Success;
}
@@ -151,14 +155,21 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
long parcelPtr = context.Request.ReceiveBuff[0].Position;
+ // TODO: support multi display.
Display disp = _displays.GetData<Display>((int)displayId);
- byte[] parcel = MakeIGraphicsBufferProducer(parcelPtr);
+ IBinder producer = context.Device.System.SurfaceFlinger.CreateLayer(context.Process, out long layerId);
+
+ Parcel parcel = new Parcel(0x28, 0x4);
+
+ parcel.WriteObject(producer, "dispdrv\0");
+
+ ReadOnlySpan<byte> parcelData = parcel.Finish();
- context.Memory.WriteBytes(parcelPtr, parcel);
+ context.Memory.WriteBytes(parcelPtr, parcelData.ToArray());
- context.ResponseData.Write(0L);
- context.ResponseData.Write((long)parcel.Length);
+ context.ResponseData.Write(layerId);
+ context.ResponseData.Write((long)parcelData.Length);
return ResultCode.Success;
}
@@ -167,6 +178,10 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
// DestroyStrayLayer(u64)
public ResultCode DestroyStrayLayer(ServiceCtx context)
{
+ long layerId = context.RequestData.ReadInt64();
+
+ context.Device.System.SurfaceFlinger.CloseLayer(layerId);
+
return ResultCode.Success;
}
@@ -236,36 +251,6 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
return ResultCode.Success;
}
- private byte[] MakeIGraphicsBufferProducer(long basePtr)
- {
- long id = 0x20;
- long cookiePtr = 0L;
-
- using (MemoryStream ms = new MemoryStream())
- {
- BinaryWriter writer = new BinaryWriter(ms);
-
- // flat_binder_object (size is 0x28)
- writer.Write(2); //Type (BINDER_TYPE_WEAK_BINDER)
- writer.Write(0); //Flags
- writer.Write((int)(id >> 0));
- writer.Write((int)(id >> 32));
- writer.Write((int)(cookiePtr >> 0));
- writer.Write((int)(cookiePtr >> 32));
- writer.Write((byte)'d');
- writer.Write((byte)'i');
- writer.Write((byte)'s');
- writer.Write((byte)'p');
- writer.Write((byte)'d');
- writer.Write((byte)'r');
- writer.Write((byte)'v');
- writer.Write((byte)'\0');
- writer.Write(0L); //Pad
-
- return MakeParcel(ms.ToArray(), new byte[] { 0, 0, 0, 0 });
- }
- }
-
private string GetDisplayName(ServiceCtx context)
{
string name = string.Empty;