From ef3eec43b42f62dd2526f1689493509e4a9cb202 Mon Sep 17 00:00:00 2001 From: averne Date: Wed, 24 Jul 2019 20:13:38 +0200 Subject: [PATCH] Added viDestroyManagedLayer, only zero initialized field of ViLayer when closing --- nx/include/switch/services/vi.h | 1 + nx/source/services/vi.c | 34 ++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/nx/include/switch/services/vi.h b/nx/include/switch/services/vi.h index 38c7415d..ac849680 100644 --- a/nx/include/switch/services/vi.h +++ b/nx/include/switch/services/vi.h @@ -90,6 +90,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..dc824f9b 100644 --- a/nx/source/services/vi.c +++ b/nx/source/services/vi.c @@ -615,6 +615,38 @@ 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; + } + + return rc; +} + Result viSetContentVisibility(bool v) { IpcCommand c; ipcInitialize(&c); @@ -960,7 +992,7 @@ Result viCloseLayer(ViLayer *layer) } *resp = r.Raw; rc = resp->result; - memset(layer, 0, sizeof(ViLayer)); + layer->initialized = false; } return rc;