From b26bb6ce76e0916d80970add7629f646f3487f50 Mon Sep 17 00:00:00 2001 From: fincs Date: Wed, 29 Aug 2018 22:09:06 +0200 Subject: [PATCH] viGetDisplayVsyncEvent: return an Event instead of a raw handle --- nx/include/switch/services/vi.h | 3 ++- nx/source/display/gfx.c | 31 ++++++------------------------- nx/source/services/vi.c | 4 ++-- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/nx/include/switch/services/vi.h b/nx/include/switch/services/vi.h index b9aaf02d..c376dcd6 100644 --- a/nx/include/switch/services/vi.h +++ b/nx/include/switch/services/vi.h @@ -6,6 +6,7 @@ */ #pragma once #include "../types.h" +#include "../kernel/event.h" #include "../services/sm.h" typedef struct { @@ -58,7 +59,7 @@ static inline Result viOpenDefaultDisplay(ViDisplay *display) } Result viGetDisplayResolution(ViDisplay *display, u64 *width, u64 *height); -Result viGetDisplayVsyncEvent(ViDisplay *display, Handle *handle_out); +Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out); // Layer functions diff --git a/nx/source/display/gfx.c b/nx/source/display/gfx.c index 2df537ae..2ee6d47a 100644 --- a/nx/source/display/gfx.c +++ b/nx/source/display/gfx.c @@ -14,7 +14,7 @@ static bool g_gfxInitialized = 0; static ViDisplay g_gfxDisplay; -static Handle g_gfxDisplayVsyncEvent = INVALID_HANDLE; +static Event g_gfxDisplayVsyncEvent; static ViLayer g_gfxLayer; static Binder g_gfxBinderSession; static s32 g_gfxCurrentBuffer = 0; @@ -149,7 +149,6 @@ Result gfxInitDefault(void) { if(g_gfxInitialized)return 0; - g_gfxDisplayVsyncEvent = INVALID_HANDLE; g_gfxCurrentBuffer = -1; g_gfxCurrentProducerBuffer = -1; g_gfx_ProducerConnected = 0; @@ -242,14 +241,10 @@ Result gfxInitDefault(void) { binderClose(&g_gfxBinderSession); viCloseLayer(&g_gfxLayer); + eventClose(&g_gfxDisplayVsyncEvent); viCloseDisplay(&g_gfxDisplay); viExit(); - if(g_gfxDisplayVsyncEvent != INVALID_HANDLE) { - svcCloseHandle(g_gfxDisplayVsyncEvent); - g_gfxDisplayVsyncEvent = INVALID_HANDLE; - } - free(g_gfxFramebufLinear); g_gfxFramebufLinear = NULL; @@ -288,14 +283,10 @@ void gfxExit(void) binderClose(&g_gfxBinderSession); viCloseLayer(&g_gfxLayer); + eventClose(&g_gfxDisplayVsyncEvent); viCloseDisplay(&g_gfxDisplay); viExit(); - if(g_gfxDisplayVsyncEvent != INVALID_HANDLE) { - svcCloseHandle(g_gfxDisplayVsyncEvent); - g_gfxDisplayVsyncEvent = INVALID_HANDLE; - } - free(g_gfxFramebufLinear); g_gfxFramebufLinear = NULL; @@ -399,27 +390,17 @@ Result _gfxGraphicBufferInit(s32 buf, u32 nvmap_id, u32 nvmap_handle) { g_gfx_BufferInitData.data.nvmap_handle0 = nvmap_id; g_gfx_BufferInitData.data.nvmap_handle1 = nvmap_handle; g_gfx_BufferInitData.data.buffer_offset = g_gfx_singleframebuf_size*buf; - g_gfx_BufferInitData.data.timestamp = svcGetSystemTick(); + //g_gfx_BufferInitData.data.timestamp = svcGetSystemTick(); return bqSetPreallocatedBuffer(&g_gfxBinderSession, buf, &g_gfx_BufferInitData); } -static void _waitevent(Handle handle) { - Result rc; - - do { - rc = svcWaitSynchronizationSingle(handle, U64_MAX); - svcResetSignal(handle); - } while ((rc & 0x3FFFFF) == 0xFA01); - +void gfxWaitForVsync(void) { + Result rc = eventWait(&g_gfxDisplayVsyncEvent, U64_MAX); if (R_FAILED(rc)) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_BadGfxEventWait)); } -void gfxWaitForVsync(void) { - _waitevent(g_gfxDisplayVsyncEvent); -} - void gfxSwapBuffers(void) { Result rc=0; diff --git a/nx/source/services/vi.c b/nx/source/services/vi.c index c38cc771..a24bc85d 100644 --- a/nx/source/services/vi.c +++ b/nx/source/services/vi.c @@ -281,7 +281,7 @@ Result viGetDisplayResolution(ViDisplay *display, u64 *width, u64 *height) return rc; } -Result viGetDisplayVsyncEvent(ViDisplay *display, Handle *handle_out) +Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out) { IpcCommand c; ipcInitialize(&c); @@ -315,7 +315,7 @@ Result viGetDisplayVsyncEvent(ViDisplay *display, Handle *handle_out) rc = resp->result; if (R_SUCCEEDED(rc)) { - *handle_out = r.Handles[0]; + eventLoadRemote(event_out, r.Handles[0], true); } }