diff --git a/nx/include/switch/nvidia/buffer.h b/nx/include/switch/nvidia/buffer.h index e61a5950..cfdf5967 100644 --- a/nx/include/switch/nvidia/buffer.h +++ b/nx/include/switch/nvidia/buffer.h @@ -249,8 +249,8 @@ typedef enum { NvBufferKind_Invalid=0xff, } NvBufferKind; -Result nvbufInit(); -Result nvbufExit(); +Result nvbufInit(void); +void nvbufExit(void); Result nvbufCreate(NvBuffer* m, size_t size, u32 align, NvBufferKind kind); Result nvbufCreateRw(NvBuffer* m, size_t size, u32 align, NvBufferKind kind); diff --git a/nx/source/nvidia/buffer.c b/nx/source/nvidia/buffer.c index 80688d25..ac74d1e2 100644 --- a/nx/source/nvidia/buffer.c +++ b/nx/source/nvidia/buffer.c @@ -1,18 +1,38 @@ #include #include "types.h" #include "result.h" +#include "arm/atomics.h" #include "services/nv.h" #include "nvidia/ioctl.h" #include "nvidia/buffer.h" -static u32 g_nvmap_fd; +static u32 g_nvmap_fd = -1; +static u64 g_refCnt; -Result nvbufInit() { - return nvOpen(&g_nvmap_fd, "/dev/nvmap"); +Result nvbufInit(void) +{ + Result rc; + + if (atomicIncrement64(&g_refCnt) > 0) + return 0; + + rc = nvOpen(&g_nvmap_fd, "/dev/nvmap"); + + if (R_FAILED(rc)) + atomicDecrement64(&g_refCnt); + + return rc; } -Result nvbufExit() { - return nvClose(g_nvmap_fd); +void nvbufExit(void) +{ + if (atomicDecrement64(&g_refCnt) == 0) + { + if (g_nvmap_fd != -1) + nvClose(g_nvmap_fd); + + g_nvmap_fd = -1; + } } static Result _nvbufCreate(NvBuffer* m, size_t size, u32 flags, u32 align, NvBufferKind kind) diff --git a/nx/source/nvidia/info.c b/nx/source/nvidia/info.c index e721a2f0..683770a6 100644 --- a/nx/source/nvidia/info.c +++ b/nx/source/nvidia/info.c @@ -1,6 +1,8 @@ #include static u32 g_ctrlgpu_fd = -1; +static u64 g_refCnt; + static nvioctl_gpu_characteristics g_gpu_characteristics; static u32 g_zcull_ctx_size; @@ -8,6 +10,9 @@ Result nvinfoInit() { Result rc; + if (atomicIncrement64(&g_refCnt) > 0) + return 0; + rc = nvOpen(&g_ctrlgpu_fd, "/dev/nvhost-ctrl-gpu"); if (R_FAILED(rc)) @@ -27,10 +32,13 @@ Result nvinfoInit() void nvinfoExit() { - if (g_ctrlgpu_fd != -1) - nvClose(g_ctrlgpu_fd); + if (atomicDecrement64(&g_refCnt) == 0) + { + if (g_ctrlgpu_fd != -1) + nvClose(g_ctrlgpu_fd); - g_ctrlgpu_fd = -1; + g_ctrlgpu_fd = -1; + } } u32 nvinfoGetZcullCtxSize() {