diff --git a/nx/include/switch/services/vi.h b/nx/include/switch/services/vi.h index 21722346..1414acc4 100644 --- a/nx/include/switch/services/vi.h +++ b/nx/include/switch/services/vi.h @@ -92,6 +92,7 @@ Result viSetLayerSize(ViLayer *layer, u64 width, u64 height); Result viSetLayerZ(ViLayer *layer, u64 z); Result viSetLayerPosition(ViLayer *layer, float x, float y); Result viCloseLayer(ViLayer *layer); +Result viDestroyManagedLayer(ViLayer *layer); Result viSetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode); diff --git a/nx/source/services/vi.c b/nx/source/services/vi.c index 03f5d5a6..924f4f7f 100644 --- a/nx/source/services/vi.c +++ b/nx/source/services/vi.c @@ -615,6 +615,39 @@ Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, return rc; } +Result viDestroyManagedLayer(ViLayer *layer) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 layer_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 2011; + raw->layer_id = layer->layer_id; + + Result rc = serviceIpcDispatch(&g_viIManagerDisplayService); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + memset(layer, 0, sizeof(ViLayer)); + } + + return rc; +} + Result viSetContentVisibility(bool v) { IpcCommand c; ipcInitialize(&c);