From 7045f37cc9c24fe67061919f97357bd5c8c75291 Mon Sep 17 00:00:00 2001 From: plutoo Date: Sat, 10 Mar 2018 15:31:08 +0100 Subject: [PATCH] Add refcounting to nvidia stuff --- nx/include/switch.h | 1 + nx/include/switch/nvidia/buffer.h | 4 ++-- nx/source/nvidia/buffer.c | 30 +++++++++++++++++++++++++----- nx/source/nvidia/info.c | 14 +++++++++++--- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/nx/include/switch.h b/nx/include/switch.h index 4de36478..586c9387 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -16,6 +16,7 @@ extern "C" { #include "switch/arm/tls.h" #include "switch/arm/cache.h" +#include "switch/arm/atomics.h" #include "switch/kernel/svc.h" #include "switch/kernel/tmem.h" diff --git a/nx/include/switch/nvidia/buffer.h b/nx/include/switch/nvidia/buffer.h index 15da3f0e..e2dd7a48 100644 --- a/nx/include/switch/nvidia/buffer.h +++ b/nx/include/switch/nvidia/buffer.h @@ -247,8 +247,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() {