mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-22 04:52:39 +02:00
NWindow: add nwindowReleaseBuffers, which is also done automatically on Close
This commit is contained in:
parent
412c84d5f9
commit
62aa8e8b23
@ -11,6 +11,7 @@ typedef struct NWindow {
|
|||||||
Binder bq;
|
Binder bq;
|
||||||
Event event;
|
Event event;
|
||||||
Mutex mutex;
|
Mutex mutex;
|
||||||
|
u64 slots_configured;
|
||||||
u64 slots_requested;
|
u64 slots_requested;
|
||||||
s32 cur_slot;
|
s32 cur_slot;
|
||||||
u32 width;
|
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 nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence);
|
||||||
Result nwindowCancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence);
|
Result nwindowCancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence);
|
||||||
Result nwindowQueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence);
|
Result nwindowQueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence);
|
||||||
|
void nwindowReleaseBuffers(NWindow* nw);
|
||||||
|
@ -55,8 +55,10 @@ void nwindowClose(NWindow* nw)
|
|||||||
if (!nw || !nw->has_init)
|
if (!nw || !nw->has_init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (nw->is_connected)
|
if (nw->is_connected) {
|
||||||
|
nwindowReleaseBuffers(nw);
|
||||||
bqDisconnect(&nw->bq, NATIVE_WINDOW_API_CPU);
|
bqDisconnect(&nw->bq, NATIVE_WINDOW_API_CPU);
|
||||||
|
}
|
||||||
|
|
||||||
eventClose(&nw->event);
|
eventClose(&nw->event);
|
||||||
binderClose(&nw->bq);
|
binderClose(&nw->bq);
|
||||||
@ -73,6 +75,11 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf)
|
|||||||
|
|
||||||
mutexLock(&nw->mutex);
|
mutexLock(&nw->mutex);
|
||||||
|
|
||||||
|
if (nw->slots_configured & (1UL << slot)) {
|
||||||
|
mutexUnlock(&nw->mutex);
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_AlreadyInitialized);
|
||||||
|
}
|
||||||
|
|
||||||
if (!nw->width)
|
if (!nw->width)
|
||||||
nw->width = buf->layers[0].width;
|
nw->width = buf->layers[0].width;
|
||||||
if (!nw->height)
|
if (!nw->height)
|
||||||
@ -92,6 +99,8 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf)
|
|||||||
bqbuf.native_handle = &buf->header;
|
bqbuf.native_handle = &buf->header;
|
||||||
|
|
||||||
Result rc = bqSetPreallocatedBuffer(&nw->bq, slot, &bqbuf);
|
Result rc = bqSetPreallocatedBuffer(&nw->bq, slot, &bqbuf);
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
nw->slots_configured |= 1UL << slot;
|
||||||
|
|
||||||
mutexUnlock(&nw->mutex);
|
mutexUnlock(&nw->mutex);
|
||||||
return rc;
|
return rc;
|
||||||
@ -99,7 +108,7 @@ Result nwindowConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf)
|
|||||||
|
|
||||||
Result nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence)
|
Result nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence)
|
||||||
{
|
{
|
||||||
if (!nw || !out_slot)
|
if (!nw)
|
||||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||||
if (!nw->has_init)
|
if (!nw->has_init)
|
||||||
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
@ -135,8 +144,9 @@ Result nwindowDequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
*out_slot = slot;
|
|
||||||
nw->cur_slot = slot;
|
nw->cur_slot = slot;
|
||||||
|
if (out_slot)
|
||||||
|
*out_slot = slot;
|
||||||
if (out_fence)
|
if (out_fence)
|
||||||
*out_fence = fence;
|
*out_fence = fence;
|
||||||
else
|
else
|
||||||
@ -207,3 +217,16 @@ Result nwindowQueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence)
|
|||||||
mutexUnlock(&nw->mutex);
|
mutexUnlock(&nw->mutex);
|
||||||
return rc;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user