| 105 | } |
| 106 | |
| 107 | void NvApi::init() |
| 108 | { |
| 109 | m_nvGpu = NULL; |
| 110 | m_nvApiDll = bx::dlopen( |
| 111 | "nvapi" |
| 112 | #if BX_ARCH_64BIT |
| 113 | "64" |
| 114 | #endif // BX_ARCH_32BIT |
| 115 | ".dll" |
| 116 | ); |
| 117 | |
| 118 | if (NULL != m_nvApiDll) |
| 119 | { |
| 120 | nvApiQueryInterface = (PFN_NVAPI_QUERYINTERFACE)bx::dlsym(m_nvApiDll, "nvapi_QueryInterface"); |
| 121 | |
| 122 | bool initialized = NULL != nvApiQueryInterface; |
| 123 | |
| 124 | if (initialized) |
| 125 | { |
| 126 | nvApiInitialize = (PFN_NVAPI_INITIALIZE )nvApiQueryInterface(NVAPI_INITIALIZE); |
| 127 | nvApiUnload = (PFN_NVAPI_UNLOAD )nvApiQueryInterface(NVAPI_UNLOAD); |
| 128 | nvApiEnumPhysicalGPUs = (PFN_NVAPI_ENUMPHYSICALGPUS)nvApiQueryInterface(NVAPI_ENUMPHYSICALGPUS); |
| 129 | nvApiGpuGetMemoryInfo = (PFN_NVAPI_GPUGETMEMORYINFO)nvApiQueryInterface(NVAPI_GPUGETMEMORYINFO); |
| 130 | nvApiGpuGetFullName = (PFN_NVAPI_GPUGETFULLNAME )nvApiQueryInterface(NVAPI_GPUGETFULLNAME); |
| 131 | |
| 132 | nvApiD3D11MultiDrawInstancedIndirect = (PFN_NVAPI_MULTIDRAWINDIRECT)nvApiQueryInterface(NVAPI_MULTIDRAWINSTANCEDINDIRECT); |
| 133 | nvApiD3D11MultiDrawIndexedInstancedIndirect = (PFN_NVAPI_MULTIDRAWINDIRECT)nvApiQueryInterface(NVAPI_MULTIDRAWINDEXEDINSTANCEDINDIRECT); |
| 134 | |
| 135 | initialized = true |
| 136 | && NULL != nvApiInitialize |
| 137 | && NULL != nvApiUnload |
| 138 | && NULL != nvApiEnumPhysicalGPUs |
| 139 | && NULL != nvApiGpuGetMemoryInfo |
| 140 | && NULL != nvApiGpuGetFullName |
| 141 | && NVAPI_OK == nvApiInitialize() |
| 142 | ; |
| 143 | |
| 144 | if (initialized) |
| 145 | { |
| 146 | NvPhysicalGpuHandle* physicalGpus[NVAPI_MAX_PHYSICAL_GPUS]; |
| 147 | uint32_t numGpus = 0; |
| 148 | nvApiEnumPhysicalGPUs(physicalGpus, &numGpus); |
| 149 | |
| 150 | initialized = 0 < numGpus; |
| 151 | if (initialized) |
| 152 | { |
| 153 | m_nvGpu = physicalGpus[0]; |
| 154 | |
| 155 | initialized = NULL != m_nvGpu; |
| 156 | if (initialized) |
| 157 | { |
| 158 | char name[64]; |
| 159 | nvApiGpuGetFullName(m_nvGpu, name); |
| 160 | BX_TRACE("%s", name); |
| 161 | } |
| 162 | else |
| 163 | { |
| 164 | nvApiUnload(); |