vi: Unify resolutions values and accurate implementation of them. (#2640)

* vi: Unify resolutions values and accurate implementation of them.

To continue what was made in #2618, I've REd `vi` service a bit. Now values and checks related to displays are more accurate.

- `am`  GetDefaultDisplayResolution / GetDefaultDisplayResolutionChangeEvent have more informations on what the service does.
- `vi:u/vi:m/vi:s` GetDisplayService are now accurate.
- `IApplicationDisplay` GetRelayService, GetSystemDisplayService, GetManagerDisplayService, GetIndirectDisplayTransactionService, ListDisplays, OpenDisplay, OpenDefaultDisplay, CloseDisplay, GetDisplayResolution are now properly implemented.
- Some other calls are cleaned or have extra checks accordingly to RE.

Additionnaly, `IFriendService` have some wrong aligned things, and `pm:info` service placeholder was missing.

* just use _openedDisplayInfo.Remove()

* use context.Memory.Fill()

* fix some casting

* remove unneeded comment

* cleanup

* uses TryAdd

* displayId > ulong

* GetDisplayResolution > ulong

* UL
This commit is contained in:
Ac_K 2021-09-19 12:57:39 +02:00 committed by GitHub
parent e17eb7bfaf
commit 40d1acd198
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 265 additions and 100 deletions

View file

@ -0,0 +1,19 @@
namespace Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService
{
static class AndroidSurfaceComposerClient
{
// NOTE: This is android::SurfaceComposerClient::getDisplayInfo.
public static (ulong, ulong) GetDisplayInfo(ServiceCtx context, ulong displayId = 0)
{
// TODO: This need to be REd, it should returns the driver resolution and more.
if (context.Device.System.State.DockedMode)
{
return (1920, 1080);
}
else
{
return (1280, 720);
}
}
}
}

View file

@ -1,12 +0,0 @@
namespace Ryujinx.HLE.HOS.Services.Vi
{
class Display
{
public string Name { get; private set; }
public Display(string name)
{
Name = name;
}
}
}

View file

@ -11,6 +11,20 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService
_applicationDisplayService = applicationDisplayService;
}
[CommandHipc(1102)]
// GetDisplayResolution(u64 display_id) -> (u64 width, u64 height)
public ResultCode GetDisplayResolution(ServiceCtx context)
{
ulong displayId = context.RequestData.ReadUInt64();
(ulong width, ulong height) = AndroidSurfaceComposerClient.GetDisplayInfo(context, displayId);
context.ResponseData.Write(width);
context.ResponseData.Write(height);
return ResultCode.Success;
}
[CommandHipc(2010)]
// CreateManagedLayer(u32, u64, nn::applet::AppletResourceUserId) -> u64
public ResultCode CreateManagedLayer(ServiceCtx context)

View file

@ -42,12 +42,17 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService
// GetDisplayMode(u64) -> nn::vi::DisplayModeInfo
public ResultCode GetDisplayMode(ServiceCtx context)
{
// TODO: De-hardcode resolution.
context.ResponseData.Write(1280);
context.ResponseData.Write(720);
ulong displayId = context.RequestData.ReadUInt64();
(ulong width, ulong height) = AndroidSurfaceComposerClient.GetDisplayInfo(context, displayId);
context.ResponseData.Write((uint)width);
context.ResponseData.Write((uint)height);
context.ResponseData.Write(60.0f);
context.ResponseData.Write(0);
Logger.Stub?.PrintStub(LogClass.ServiceVi);
return ResultCode.Success;
}
}

View file

@ -0,0 +1,16 @@
using Ryujinx.Common.Memory;
using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService.Types
{
[StructLayout(LayoutKind.Sequential, Size = 0x60)]
struct DisplayInfo
{
public Array40<byte> Name;
public bool LayerLimitEnabled;
public Array7<byte> Padding;
public ulong LayerLimitMax;
public ulong Width;
public ulong Height;
}
}