From 8d10ef8745db3e9f592760961b041ec2e962b76a Mon Sep 17 00:00:00 2001 From: yellows8 Date: Mon, 20 Nov 2023 14:12:52 -0500 Subject: [PATCH] nv: Added __nx_nv_service_type. Closes #633. --- nx/include/switch/services/nv.h | 9 +++++ nx/source/services/nv.c | 58 +++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/nx/include/switch/services/nv.h b/nx/include/switch/services/nv.h index e391a3943..16081d8d9 100644 --- a/nx/include/switch/services/nv.h +++ b/nx/include/switch/services/nv.h @@ -9,6 +9,15 @@ #include "../sf/service.h" #include "../kernel/event.h" +/// NvServiceType, for __nx_nv_service_type. +typedef enum { + NvServiceType_Auto = -1, ///< This is the default. Automatically select the type using \ref appletGetAppletType. + NvServiceType_Application = 0, ///< Initializes nvdrv. + NvServiceType_Applet = 1, ///< Initializes nvdrv:a. + NvServiceType_System = 2, ///< Initializes nvdrv:s. + NvServiceType_Factory = 3, ///< Initializes nvdrv:t. +} NvServiceType; + /// Initialize nvdrv*. Result nvInitialize(void); diff --git a/nx/source/services/nv.c b/nx/source/services/nv.c index cccfd355d..0b092828b 100644 --- a/nx/source/services/nv.c +++ b/nx/source/services/nv.c @@ -7,6 +7,7 @@ #include "services/nv.h" #include "nvidia/ioctl.h" +__attribute__((weak)) NvServiceType __nx_nv_service_type = NvServiceType_Auto; __attribute__((weak)) u32 __nx_nv_transfermem_size = 0x800000; static Service g_nvSrv; @@ -27,23 +28,46 @@ NX_GENERATE_SERVICE_GUARD(nv); Result _nvInitialize(void) { Result rc = MAKERESULT(Module_Libnx, LibnxError_BadInput); - switch (appletGetAppletType()) { - case AppletType_None: - rc = smGetService(&g_nvSrv, "nvdrv:s"); - break; - - case AppletType_Default: - case AppletType_Application: - case AppletType_SystemApplication: - default: - rc = smGetService(&g_nvSrv, "nvdrv"); - break; - - case AppletType_SystemApplet: - case AppletType_LibraryApplet: - case AppletType_OverlayApplet: - rc = smGetService(&g_nvSrv, "nvdrv:a"); - break; + if (__nx_nv_service_type == NvServiceType_Auto) { + switch (appletGetAppletType()) { + case AppletType_None: + __nx_nv_service_type = NvServiceType_System; + break; + + case AppletType_Default: + case AppletType_Application: + case AppletType_SystemApplication: + default: + __nx_nv_service_type = NvServiceType_Application; + break; + + case AppletType_SystemApplet: + case AppletType_LibraryApplet: + case AppletType_OverlayApplet: + __nx_nv_service_type = NvServiceType_Applet; + break; + } + } + + switch (__nx_nv_service_type) { + case NvServiceType_Application: + rc = smGetService(&g_nvSrv, "nvdrv"); + break; + + case NvServiceType_Applet: + rc = smGetService(&g_nvSrv, "nvdrv:a"); + break; + + case NvServiceType_System: + rc = smGetService(&g_nvSrv, "nvdrv:s"); + break; + + case NvServiceType_Factory: + rc = smGetService(&g_nvSrv, "nvdrv:t"); + break; + + default: + break; // Leave rc at the error set above. } if (R_SUCCEEDED(rc)) {