summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/nvapi.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/nvapi.cpp')
-rw-r--r--3rdparty/bgfx/src/nvapi.cpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/3rdparty/bgfx/src/nvapi.cpp b/3rdparty/bgfx/src/nvapi.cpp
new file mode 100644
index 00000000000..e4205c112df
--- /dev/null
+++ b/3rdparty/bgfx/src/nvapi.cpp
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2011-2017 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "bgfx_p.h"
+#include "nvapi.h"
+
+namespace bgfx
+{
+ /*
+ * NVAPI
+ *
+ * Reference:
+ * http://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/index.html
+ * https://github.com/jNizM/AHK_NVIDIA_NvAPI/blob/master/info/NvAPI_IDs.txt
+ */
+ struct NvPhysicalGpuHandle;
+
+#define NVAPI_MAX_PHYSICAL_GPUS 64
+
+#if BX_PLATFORM_WINDOWS
+# define NVAPICALL __cdecl
+#else
+# define NVAPICALL
+#endif // BX_PLATFORM_WINDOWS
+
+ enum NvApiStatus
+ {
+ NVAPI_OK = 0,
+ NVAPI_ERROR = -1,
+ };
+
+ struct NvMemoryInfoV2
+ {
+ NvMemoryInfoV2()
+ : version(sizeof(NvMemoryInfoV2) | (2 << 16) )
+ {
+ }
+
+ uint32_t version;
+ uint32_t dedicatedVideoMemory;
+ uint32_t availableDedicatedVideoMemory;
+ uint32_t systemVideoMemory;
+ uint32_t sharedSystemMemory;
+ uint32_t curAvailableDedicatedVideoMemory;
+ };
+
+ typedef void* (NVAPICALL* PFN_NVAPI_QUERYINTERFACE)(uint32_t _functionOffset);
+ typedef NvApiStatus (NVAPICALL* PFN_NVAPI_INITIALIZE)();
+ typedef NvApiStatus (NVAPICALL* PFN_NVAPI_UNLOAD)();
+ typedef NvApiStatus (NVAPICALL* PFN_NVAPI_ENUMPHYSICALGPUS)(NvPhysicalGpuHandle* _handle[NVAPI_MAX_PHYSICAL_GPUS], uint32_t* _gpuCount);
+ typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETMEMORYINFO)(NvPhysicalGpuHandle* _handle, NvMemoryInfoV2* _memoryInfo);
+ typedef NvApiStatus (NVAPICALL* PFN_NVAPI_GPUGETFULLNAME)(NvPhysicalGpuHandle* _physicalGpu, char _name[64]);
+
+#define NVAPI_INITIALIZE UINT32_C(0x0150e828)
+#define NVAPI_UNLOAD UINT32_C(0xd22bdd7e)
+#define NVAPI_ENUMPHYSICALGPUS UINT32_C(0xe5ac921f)
+#define NVAPI_GPUGETMEMORYINFO UINT32_C(0x07f9b368)
+#define NVAPI_GPUGETFULLNAME UINT32_C(0xceee8e9f)
+
+ static PFN_NVAPI_QUERYINTERFACE nvApiQueryInterface;
+ static PFN_NVAPI_INITIALIZE nvApiInitialize;
+ static PFN_NVAPI_UNLOAD nvApiUnload;
+ static PFN_NVAPI_ENUMPHYSICALGPUS nvApiEnumPhysicalGPUs;
+ static PFN_NVAPI_GPUGETMEMORYINFO nvApiGpuGetMemoryInfo;
+ static PFN_NVAPI_GPUGETFULLNAME nvApiGpuGetFullName;
+
+ NvApi::NvApi()
+ : m_nvApiDll(NULL)
+ , m_nvGpu(NULL)
+ {
+ }
+
+ void NvApi::init()
+ {
+ m_nvGpu = NULL;
+ m_nvApiDll = bx::dlopen(
+#if BX_ARCH_32BIT
+ "nvapi.dll"
+#else
+ "nvapi64.dll"
+#endif // BX_ARCH_32BIT
+ );
+
+ if (NULL != m_nvApiDll)
+ {
+ nvApiQueryInterface = (PFN_NVAPI_QUERYINTERFACE)bx::dlsym(m_nvApiDll, "nvapi_QueryInterface");
+
+ bool initialized = NULL != nvApiQueryInterface;
+
+ if (initialized)
+ {
+ nvApiInitialize = (PFN_NVAPI_INITIALIZE )nvApiQueryInterface(NVAPI_INITIALIZE);
+ nvApiUnload = (PFN_NVAPI_UNLOAD )nvApiQueryInterface(NVAPI_UNLOAD);
+ nvApiEnumPhysicalGPUs = (PFN_NVAPI_ENUMPHYSICALGPUS )nvApiQueryInterface(NVAPI_ENUMPHYSICALGPUS);
+ nvApiGpuGetMemoryInfo = (PFN_NVAPI_GPUGETMEMORYINFO )nvApiQueryInterface(NVAPI_GPUGETMEMORYINFO);
+ nvApiGpuGetFullName = (PFN_NVAPI_GPUGETFULLNAME )nvApiQueryInterface(NVAPI_GPUGETFULLNAME);
+
+ initialized = true
+ && NULL != nvApiInitialize
+ && NULL != nvApiUnload
+ && NULL != nvApiEnumPhysicalGPUs
+ && NULL != nvApiGpuGetMemoryInfo
+ && NULL != nvApiGpuGetFullName
+ && NVAPI_OK == nvApiInitialize()
+ ;
+
+ if (initialized)
+ {
+ NvPhysicalGpuHandle* physicalGpus[NVAPI_MAX_PHYSICAL_GPUS];
+ uint32_t numGpus = 0;
+ nvApiEnumPhysicalGPUs(physicalGpus, &numGpus);
+
+ initialized = 0 < numGpus;
+ if (initialized)
+ {
+ m_nvGpu = physicalGpus[0];
+ }
+
+ char name[64];
+ nvApiGpuGetFullName(m_nvGpu, name);
+ BX_TRACE("%s", name);
+ }
+
+ initialized = NULL != m_nvGpu;
+
+ if (!initialized)
+ {
+ nvApiUnload();
+ }
+ }
+
+ if (!initialized)
+ {
+ bx::dlclose(m_nvApiDll);
+ m_nvApiDll = NULL;
+ }
+
+ BX_WARN(!initialized, "NVAPI supported.");
+ }
+ }
+
+ void NvApi::shutdown()
+ {
+ if (NULL != m_nvGpu)
+ {
+ nvApiUnload();
+ m_nvGpu = NULL;
+ }
+
+ if (NULL != m_nvApiDll)
+ {
+ bx::dlclose(m_nvApiDll);
+ m_nvApiDll = NULL;
+ }
+ }
+
+ void NvApi::getMemoryInfo(int64_t& _gpuMemoryUsed, int64_t& _gpuMemoryMax)
+ {
+ if (NULL != m_nvGpu)
+ {
+ NvMemoryInfoV2 memInfo;
+ NvApiStatus status = nvApiGpuGetMemoryInfo(m_nvGpu, &memInfo);
+ if (NVAPI_OK == status)
+ {
+ _gpuMemoryMax = 1024 * memInfo.availableDedicatedVideoMemory;
+ _gpuMemoryUsed = 1024 * (memInfo.availableDedicatedVideoMemory - memInfo.curAvailableDedicatedVideoMemory);
+// BX_TRACE(" dedicatedVideoMemory: %d KiB", memInfo.dedicatedVideoMemory);
+// BX_TRACE(" availableDedicatedVideoMemory: %d KiB", memInfo.availableDedicatedVideoMemory);
+// BX_TRACE(" systemVideoMemory: %d KiB", memInfo.systemVideoMemory);
+// BX_TRACE(" sharedSystemMemory: %d KiB", memInfo.sharedSystemMemory);
+// BX_TRACE("curAvailableDedicatedVideoMemory: %d KiB", memInfo.curAvailableDedicatedVideoMemory);
+ }
+ }
+ else
+ {
+ _gpuMemoryMax = -INT64_MAX;
+ _gpuMemoryUsed = -INT64_MAX;
+ }
+ }
+
+} // namespace bgfx