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; }