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/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); } diff --git a/nx/source/services/vi.c b/nx/source/services/vi.c index 64d953cc..4bc4ee08 100644 --- a/nx/source/services/vi.c +++ b/nx/source/services/vi.c @@ -249,6 +249,49 @@ Result viCloseDisplay(ViDisplay *display) { return rc; } +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); @@ -354,6 +397,7 @@ Result viOpenLayer(u8 NativeWindow[0x100], u64 *NativeWindow_Size, const ViDispl else { if (layer_id==0) { rc = appletCreateManagedDisplayLayer(&layer_id); + if (R_FAILED(rc)) return rc; }