@@ -29,11 +29,12 @@ struct FFNvapiData {
2929 FF_LIBRARY_SYMBOL (nvapi_Unload )
3030 FF_LIBRARY_SYMBOL (nvapi_EnumPhysicalGPUs )
3131 FF_LIBRARY_SYMBOL (nvapi_GPU_GetRamType )
32+ FF_LIBRARY_SYMBOL (nvapi_GPU_GetGPUType )
3233
3334 bool inited ;
3435} nvapiData ;
3536
36- static const char * detectMemTypeByNvapi (FFGpuDriverResult * result )
37+ static const char * detectMoreByNvapi (FFGpuDriverResult * result )
3738{
3839 if (!nvapiData .inited )
3940 {
@@ -55,13 +56,15 @@ static const char* detectMemTypeByNvapi(FFGpuDriverResult* result)
5556 FF_NVAPI_INTERFACE (nvapi_Unload , NVAPI_INTERFACE_OFFSET_UNLOAD )
5657 FF_NVAPI_INTERFACE (nvapi_EnumPhysicalGPUs , NVAPI_INTERFACE_OFFSET_ENUM_PHYSICAL_GPUS )
5758 FF_NVAPI_INTERFACE (nvapi_GPU_GetRamType , NVAPI_INTERFACE_OFFSET_GPU_GET_RAM_TYPE )
59+ FF_NVAPI_INTERFACE (nvapi_GPU_GetGPUType , NVAPI_INTERFACE_OFFSET_GPU_GET_GPU_TYPE )
5860 #undef FF_NVAPI_INTERFACE
5961
6062 if (ffnvapi_Initialize () < 0 )
6163 return "NvAPI_Initialize() failed" ;
6264
6365 nvapiData .ffnvapi_EnumPhysicalGPUs = ffnvapi_EnumPhysicalGPUs ;
6466 nvapiData .ffnvapi_GPU_GetRamType = ffnvapi_GPU_GetRamType ;
67+ nvapiData .ffnvapi_GPU_GetGPUType = ffnvapi_GPU_GetGPUType ;
6568 nvapiData .ffnvapi_Unload = ffnvapi_Unload ;
6669
6770 atexit ((void * ) ffnvapi_Unload );
@@ -86,36 +89,53 @@ static const char* detectMemTypeByNvapi(FFGpuDriverResult* result)
8689 NvPhysicalGpuHandle gpuHandle = handles [gpuIndex ];
8790
8891 NvApiGPUMemoryType memType ;
89- if (nvapiData .ffnvapi_GPU_GetRamType (gpuHandle , & memType ) < 0 )
90- return "NvAPI_GPU_GetRamType() failed" ;
92+ if (result -> memoryType && nvapiData .ffnvapi_GPU_GetRamType (gpuHandle , & memType ) == 0 )
93+ {
94+ switch (memType )
95+ {
96+ #define FF_NVAPI_MEMORY_TYPE (type ) \
97+ case NVAPI_GPU_MEMORY_TYPE_##type: \
98+ ffStrbufSetStatic(result->memoryType, #type); \
99+ break;
100+ FF_NVAPI_MEMORY_TYPE (UNKNOWN )
101+ FF_NVAPI_MEMORY_TYPE (SDRAM )
102+ FF_NVAPI_MEMORY_TYPE (DDR1 )
103+ FF_NVAPI_MEMORY_TYPE (DDR2 )
104+ FF_NVAPI_MEMORY_TYPE (GDDR2 )
105+ FF_NVAPI_MEMORY_TYPE (GDDR3 )
106+ FF_NVAPI_MEMORY_TYPE (GDDR4 )
107+ FF_NVAPI_MEMORY_TYPE (DDR3 )
108+ FF_NVAPI_MEMORY_TYPE (GDDR5 )
109+ FF_NVAPI_MEMORY_TYPE (LPDDR2 )
110+ FF_NVAPI_MEMORY_TYPE (GDDR5X )
111+ FF_NVAPI_MEMORY_TYPE (LPDDR3 )
112+ FF_NVAPI_MEMORY_TYPE (LPDDR4 )
113+ FF_NVAPI_MEMORY_TYPE (LPDDR5 )
114+ FF_NVAPI_MEMORY_TYPE (GDDR6 )
115+ FF_NVAPI_MEMORY_TYPE (GDDR6X )
116+ FF_NVAPI_MEMORY_TYPE (GDDR7 )
117+ #undef FF_NVAPI_MEMORY_TYPE
118+ default :
119+ ffStrbufSetF (result - > memoryType , "Unknown (%d)" , memType );
120+ break ;
121+ }
122+ }
91123
92- switch (memType )
124+ NvApiGPUType gpuType ;
125+ if (result -> type && nvapiData .ffnvapi_GPU_GetGPUType (gpuHandle , & gpuType ) == 0 )
93126 {
94- #define FF_NVAPI_MEMORY_TYPE (type ) \
95- case NVAPI_GPU_MEMORY_TYPE_##type: \
96- ffStrbufSetStatic(result->memoryType, #type); \
127+ switch (gpuType )
128+ {
129+ case NV_SYSTEM_TYPE_IGPU :
130+ * result -> type = FF_GPU_TYPE_INTEGRATED ;
97131 break ;
98- FF_NVAPI_MEMORY_TYPE (UNKNOWN )
99- FF_NVAPI_MEMORY_TYPE (SDRAM )
100- FF_NVAPI_MEMORY_TYPE (DDR1 )
101- FF_NVAPI_MEMORY_TYPE (DDR2 )
102- FF_NVAPI_MEMORY_TYPE (GDDR2 )
103- FF_NVAPI_MEMORY_TYPE (GDDR3 )
104- FF_NVAPI_MEMORY_TYPE (GDDR4 )
105- FF_NVAPI_MEMORY_TYPE (DDR3 )
106- FF_NVAPI_MEMORY_TYPE (GDDR5 )
107- FF_NVAPI_MEMORY_TYPE (LPDDR2 )
108- FF_NVAPI_MEMORY_TYPE (GDDR5X )
109- FF_NVAPI_MEMORY_TYPE (LPDDR3 )
110- FF_NVAPI_MEMORY_TYPE (LPDDR4 )
111- FF_NVAPI_MEMORY_TYPE (LPDDR5 )
112- FF_NVAPI_MEMORY_TYPE (GDDR6 )
113- FF_NVAPI_MEMORY_TYPE (GDDR6X )
114- FF_NVAPI_MEMORY_TYPE (GDDR7 )
115- #undef FF_NVAPI_MEMORY_TYPE
116- default :
117- ffStrbufSetF (result - > memoryType , "Unknown (%d)" , memType );
118- break ;
132+ case NV_SYSTEM_TYPE_DGPU :
133+ * result -> type = FF_GPU_TYPE_DISCRETE ;
134+ break ;
135+ default :
136+ * result -> type = FF_GPU_TYPE_UNKNOWN ;
137+ break ;
138+ }
119139 }
120140
121141 return NULL ;
@@ -222,13 +242,13 @@ const char* ffDetectNvidiaGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverR
222242 {
223243 * result .index = value ;
224244 #ifdef _WIN32
245+ // Don't bother loading nvapi for GPU type detection only
225246 if (result .memoryType )
226- detectMemTypeByNvapi (& result );
247+ detectMoreByNvapi (& result );
227248 #endif
228249 }
229250 }
230251
231-
232252 if (result .temp )
233253 {
234254 uint32_t value ;
0 commit comments