From ab3d5adb3d753dd6de09b4a37f5592d0cd277f42 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Tue, 9 Jan 2018 03:46:49 -0700 Subject: [PATCH 1/3] Add viCreateManagedLayer, attempt to use vi:m before using applet --- nx/source/services/vi.c | 47 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/nx/source/services/vi.c b/nx/source/services/vi.c index 0ea20dff..4dd23439 100644 --- a/nx/source/services/vi.c +++ b/nx/source/services/vi.c @@ -249,6 +249,49 @@ Result viCloseDisplay(ViDisplay *display) { return rc; } +static Result _viCreateManagedLayer(const ViDisplay *display, u32 LayerFlags, u64 AppletResourceUserId, u64 *layer_id) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u32 LayerFlags; + u32 pad; + u64 display_id; + u64 AppletResourceUserId; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 2010; + raw->LayerFlags = LayerFlags; + raw->pad = 0; + raw->display_id = display->display_id; + raw->AppletResourceUserId = AppletResourceUserId; + + Result rc = ipcDispatch(g_viIManagerDisplayService); + + if (R_SUCCEEDED(rc)) { + IpcCommandResponse r; + ipcParseResponse(&r); + + struct { + u64 magic; + u64 result; + u64 layer_id; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *layer_id = resp->layer_id; + } + } + + return rc; +} + static Result _viOpenLayer(u8 NativeWindow[0x100], u64 *NativeWindow_Size, const ViDisplay *display, u64 layer_id, u64 AppletResourceUserId) { IpcCommand c; ipcInitialize(&c); @@ -353,7 +396,9 @@ Result viOpenLayer(u8 NativeWindow[0x100], u64 *NativeWindow_Size, const ViDispl } else { if (layer_id==0) { - rc = appletCreateManagedDisplayLayer(&layer_id); + rc = _viCreateManagedLayer(display, LayerFlags, AppletResourceUserId, &layer_id); + if (R_FAILED(rc)) rc = appletCreateManagedDisplayLayer(&layer_id); + if (R_FAILED(rc)) return rc; } From 3fcd8a15965a8ce830740a7f9d4b7099c1b0202a Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Tue, 9 Jan 2018 03:47:13 -0700 Subject: [PATCH 2/3] This should be the ViServiceType --- nx/source/gfx/gfx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nx/source/gfx/gfx.c b/nx/source/gfx/gfx.c index 97263324..cc7cbd0f 100644 --- a/nx/source/gfx/gfx.c +++ b/nx/source/gfx/gfx.c @@ -313,7 +313,7 @@ void gfxInitDefault(void) break; } - Result rc = _gfxInit(ViLayerFlags_Default, "Default", ViLayerFlags_Default, 0, nv_servicetype, 0x300000); + Result rc = _gfxInit(ViServiceType_Default, "Default", ViLayerFlags_Default, 0, nv_servicetype, 0x300000); if (R_FAILED(rc)) fatalSimple(rc); } From e5726cbc834a30b190421beabd3dd08d45801519 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Thu, 11 Jan 2018 19:11:39 -0700 Subject: [PATCH 3/3] Move viCreateManagedLayer logic out of viOpenLayer --- nx/include/switch/services/vi.h | 1 + nx/source/services/vi.c | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nx/include/switch/services/vi.h b/nx/include/switch/services/vi.h index 59c1ce8d..1ebb688d 100644 --- a/nx/include/switch/services/vi.h +++ b/nx/include/switch/services/vi.h @@ -38,6 +38,7 @@ Handle viGetSession_IHOSBinderDriverIndirect(void); Result viOpenDisplay(const char *DisplayName, ViDisplay *display); Result viCloseDisplay(ViDisplay *display); +Result viCreateManagedLayer(const ViDisplay *display, u32 LayerFlags, u64 AppletResourceUserId, u64 *layer_id); Result viOpenLayer(u8 NativeWindow[0x100], u64 *NativeWindow_Size, const ViDisplay *display, ViLayer *layer, u32 LayerFlags, u64 LayerId); Result viCloseLayer(ViLayer *layer); diff --git a/nx/source/services/vi.c b/nx/source/services/vi.c index 4dd23439..17b00827 100644 --- a/nx/source/services/vi.c +++ b/nx/source/services/vi.c @@ -249,7 +249,7 @@ Result viCloseDisplay(ViDisplay *display) { return rc; } -static Result _viCreateManagedLayer(const ViDisplay *display, u32 LayerFlags, u64 AppletResourceUserId, u64 *layer_id) { +Result viCreateManagedLayer(const ViDisplay *display, u32 LayerFlags, u64 AppletResourceUserId, u64 *layer_id) { IpcCommand c; ipcInitialize(&c); @@ -396,8 +396,7 @@ Result viOpenLayer(u8 NativeWindow[0x100], u64 *NativeWindow_Size, const ViDispl } else { if (layer_id==0) { - rc = _viCreateManagedLayer(display, LayerFlags, AppletResourceUserId, &layer_id); - if (R_FAILED(rc)) rc = appletCreateManagedDisplayLayer(&layer_id); + rc = appletCreateManagedDisplayLayer(&layer_id); if (R_FAILED(rc)) return rc; }