Skip to content

Commit b178e43

Browse files
committed
GPU (Windows): use nvapi to detect GPU type
1 parent d00fca2 commit b178e43

2 files changed

Lines changed: 59 additions & 30 deletions

File tree

src/detection/gpu/gpu_nvidia.c

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

src/detection/gpu/nvapi.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ typedef enum NvApiGPUMemoryType
2323
NVAPI_GPU_MEMORY_TYPE_GDDR7,
2424
} NvApiGPUMemoryType;
2525

26+
typedef enum
27+
{
28+
NV_SYSTEM_TYPE_GPU_UNKNOWN = 0,
29+
NV_SYSTEM_TYPE_IGPU = 1, // Integrated
30+
NV_SYSTEM_TYPE_DGPU = 2, // Discrete
31+
} NvApiGPUType;
32+
2633
typedef int NvAPI_Status; // 0 = success; < 0 = error
2734
typedef struct NvPhysicalGpuHandle* NvPhysicalGpuHandle;
2835

@@ -32,6 +39,7 @@ typedef enum
3239
NVAPI_INTERFACE_OFFSET_UNLOAD = 0xD22BDD7E,
3340
NVAPI_INTERFACE_OFFSET_ENUM_PHYSICAL_GPUS = 0xE5AC921F,
3441
NVAPI_INTERFACE_OFFSET_GPU_GET_RAM_TYPE = 0x57F7CAAC,
42+
NVAPI_INTERFACE_OFFSET_GPU_GET_GPU_TYPE = 0xC33BAEB1,
3543

3644
NVAPI_INTERFACE_OFFSET_FORCE_UINT32 = 0xFFFFFFFF
3745
} NvApiInterfaceOffsets;
@@ -42,3 +50,4 @@ extern NvAPI_Status nvapi_Initialize(void);
4250
extern NvAPI_Status nvapi_Unload(void);
4351
extern NvAPI_Status nvapi_EnumPhysicalGPUs(NvPhysicalGpuHandle* handles, int* count);
4452
extern NvAPI_Status nvapi_GPU_GetRamType(NvPhysicalGpuHandle handle, NvApiGPUMemoryType* memtype);
53+
extern NvAPI_Status nvapi_GPU_GetGPUType(NvPhysicalGpuHandle handle, NvApiGPUType* gpuType);

0 commit comments

Comments
 (0)