From 62aa8e8b23b05d42e9d8ab86d0a45edc4f22b587 Mon Sep 17 00:00:00 2001 From: fincs Date: Mon, 12 Nov 2018 23:19:14 +0100 Subject: [PATCH] NWindow: add nwindowReleaseBuffers, which is also done automatically on Close --- nx/include/switch/display/native_window.h | 2 ++ nx/source/display/native_window.c | 29 ++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/nx/include/switch/display/native_window.h b/nx/include/switch/display/native_window.h index cf5aaad8..b3c8aa38 100644 --- a/nx/include/switch/display/native_window.h +++ b/nx/include/switch/display/native_window.h @@ -11,6 +11,7 @@ typedef struct NWindow { Binder bq; Event event; Mutex mutex; + u64 slots_configured; u64 slots_requested; s32 cur_slot; u32 width; @@ -38,3 +39,4 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf); Result nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence); Result nwindowCancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence); Result nwindowQueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence); +void nwindowReleaseBuffers(NWindow* nw); diff --git a/nx/source/display/native_window.c b/nx/source/display/native_window.c index d5fd961a..458c8286 100644 --- a/nx/source/display/native_window.c +++ b/nx/source/display/native_window.c @@ -55,8 +55,10 @@ void nwindowClose(NWindow* nw) if (!nw || !nw->has_init) return; - if (nw->is_connected) + if (nw->is_connected) { + nwindowReleaseBuffers(nw); bqDisconnect(&nw->bq, NATIVE_WINDOW_API_CPU); + } eventClose(&nw->event); binderClose(&nw->bq); @@ -73,6 +75,11 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf) mutexLock(&nw->mutex); + if (nw->slots_configured & (1UL << slot)) { + mutexUnlock(&nw->mutex); + return MAKERESULT(Module_Libnx, LibnxError_AlreadyInitialized); + } + if (!nw->width) nw->width = buf->layers[0].width; if (!nw->height) @@ -92,6 +99,8 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf) bqbuf.native_handle = &buf->header; Result rc = bqSetPreallocatedBuffer(&nw->bq, slot, &bqbuf); + if (R_SUCCEEDED(rc)) + nw->slots_configured |= 1UL << slot; mutexUnlock(&nw->mutex); return rc; @@ -99,7 +108,7 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf) Result nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence) { - if (!nw || !out_slot) + if (!nw) return MAKERESULT(Module_Libnx, LibnxError_BadInput); if (!nw->has_init) return MAKERESULT(Module_Libnx, LibnxError_NotInitialized); @@ -135,8 +144,9 @@ Result nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence) } if (R_SUCCEEDED(rc)) { - *out_slot = slot; nw->cur_slot = slot; + if (out_slot) + *out_slot = slot; if (out_fence) *out_fence = fence; else @@ -207,3 +217,16 @@ Result nwindowQueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence) mutexUnlock(&nw->mutex); return rc; } + +void nwindowReleaseBuffers(NWindow* nw) +{ + if (!nw->has_init) + return; + + for (u32 i = 0; i < 64; i ++) + if (nw->slots_configured & (1UL << i)) + bqDetachBuffer(&nw->bq, i); + + nw->slots_configured = 0; + nw->slots_requested = 0; +}