diff --git a/src/detection/gpu/gpu.c b/src/detection/gpu/gpu.c index 420b6a124..89d551e1e 100644 --- a/src/detection/gpu/gpu.c +++ b/src/detection/gpu/gpu.c @@ -2,15 +2,41 @@ #include "detection/internal.h" #include "detection/vulkan.h" -void ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance); +const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance); + +const char* FF_GPU_VENDOR_NAME_APPLE = "Apple"; +const char* FF_GPU_VENDOR_NAME_AMD = "AMD"; +const char* FF_GPU_VENDOR_NAME_INTEL = "Intel"; +const char* FF_GPU_VENDOR_NAME_NVIDIA = "NVIDIA"; + +static inline bool arrayContains(const unsigned arr[], unsigned vendorId, unsigned length) +{ + for (unsigned i = 0; i < length; ++i) + { + if (arr[i] == vendorId) + return true; + } + return false; +} + +const char* ffGetGPUVendorString(unsigned vendorId) +{ + if(vendorId == 0x106b) + return FF_GPU_VENDOR_NAME_APPLE; + if(arrayContains((const unsigned[]) {0x1002, 0x1022}, vendorId, 2)) + return FF_GPU_VENDOR_NAME_AMD; + else if(arrayContains((const unsigned[]) {0x03e7, 0x8086, 0x8087}, vendorId, 3)) + return FF_GPU_VENDOR_NAME_INTEL; + else if(arrayContains((const unsigned[]) {0x0955, 0x10de, 0x12d2}, vendorId, 3)) + return FF_GPU_VENDOR_NAME_NVIDIA; + return NULL; +} const FFlist* ffDetectGPU(const FFinstance* instance) { FF_DETECTION_INTERNAL_GUARD(FFlist, ffListInit(&result, sizeof(FFGPUResult)); - ffDetectGPUImpl(&result, instance); - - if(result.length == 0) + if(ffDetectGPUImpl(&result, instance) != NULL) { const FFVulkanResult* vulkan = ffDetectVulkan(instance); result = vulkan->gpus; diff --git a/src/detection/gpu/gpu.h b/src/detection/gpu/gpu.h index e14feb9d8..177ca2e31 100644 --- a/src/detection/gpu/gpu.h +++ b/src/detection/gpu/gpu.h @@ -8,10 +8,10 @@ #define FF_GPU_TEMP_UNSET (0/0.0) #define FF_GPU_CORE_COUNT_UNSET -1 -#define FF_GPU_VENDOR_NAME_APPLE "Apple" -#define FF_GPU_VENDOR_NAME_AMD "AMD" -#define FF_GPU_VENDOR_NAME_INTEL "Intel" -#define FF_GPU_VENDOR_NAME_NVIDIA "NVIDIA" +extern const char* FF_GPU_VENDOR_NAME_APPLE; +extern const char* FF_GPU_VENDOR_NAME_AMD; +extern const char* FF_GPU_VENDOR_NAME_INTEL; +extern const char* FF_GPU_VENDOR_NAME_NVIDIA; typedef enum FFGpuType { @@ -32,4 +32,6 @@ typedef struct FFGPUResult const FFlist* ffDetectGPU(const FFinstance* instance); +const char* ffGetGPUVendorString(unsigned vendorId); + #endif diff --git a/src/detection/gpu/gpu_apple.c b/src/detection/gpu/gpu_apple.c index 413e65746..2bea79896 100644 --- a/src/detection/gpu/gpu_apple.c +++ b/src/detection/gpu/gpu_apple.c @@ -66,26 +66,12 @@ const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance) int vendorId; if(!ffCfDictGetInt(properties, CFSTR("vendor-id"), &vendorId)) { - if(vendorId == 0x106b) - { - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_APPLE); + const char* vendorStr = ffGetGPUVendorString((unsigned) vendorId); + ffStrbufAppendS(&gpu->vendor, vendorStr); + if (vendorStr == FF_GPU_VENDOR_NAME_APPLE || vendorStr == FF_GPU_VENDOR_NAME_INTEL) gpu->type = FF_GPU_TYPE_INTEGRATED; - } - else if(wmemchr((const wchar_t[]) {0x1002, 0x1022}, (wchar_t)vendorId, 2)) - { - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); - gpu->type = FF_GPU_TYPE_DISCRETE; // Apple never used AMD CPUs - } - else if(wmemchr((const wchar_t[]) {0x03e7, 0x8086, 0x8087}, (wchar_t)vendorId, 3)) - { - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); - gpu->type = FF_GPU_TYPE_INTEGRATED; - } - else if(wmemchr((const wchar_t[]) {0x0955, 0x10de, 0x12d2}, (wchar_t)vendorId, 3)) - { - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_NVIDIA); + else if (vendorStr == FF_GPU_VENDOR_NAME_NVIDIA || vendorStr == FF_GPU_VENDOR_NAME_AMD) gpu->type = FF_GPU_TYPE_DISCRETE; - } } ffStrbufInit(&gpu->driver); diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index 549d8ed40..ae7239d43 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -24,25 +24,9 @@ typedef struct PCIData #endif } PCIData; -static bool pciIDsContains(u16 searched, const u16* ids) -{ - while(*ids != 0) - { - if(*ids == searched) - return true; - ids++; - } - return false; -} - static void pciDetectVendorName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* device) { - if(pciIDsContains(device->vendor_id, (const u16[]) {0x1002, 0x1022, 0})) - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); - else if(pciIDsContains(device->vendor_id, (const u16[]) {0x03e7, 0x8086, 0x8087, 0})) - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); - else if(pciIDsContains(device->vendor_id, (const u16[]) {0x0955, 0x10de, 0x12d2, 0})) - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_NVIDIA); + ffStrbufAppendS(&gpu->vendor, ffGetGPUVendorString(device->vendor_id)); if(gpu->vendor.length > 0) return; @@ -270,11 +254,12 @@ static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus) #endif -void ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance) +const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance) { #ifdef FF_HAVE_LIBPCI - pciDetectGPUs(instance, gpus); + return pciDetectGPUs(instance, gpus); #else FF_UNUSED(gpus, instance); + return "fastfetch is built without libpci support"; #endif } diff --git a/src/detection/gpu/gpu_windows.cpp b/src/detection/gpu/gpu_windows.cpp index ccfd187a7..8788aa1e6 100644 --- a/src/detection/gpu/gpu_windows.cpp +++ b/src/detection/gpu/gpu_windows.cpp @@ -51,14 +51,7 @@ static const char* detectWithRegistry(FFlist* gpus) uint32_t vendorId; if(ffRegReadUint(hSubKey, L"VendorId", &vendorId, nullptr)) - { - if(wmemchr((const wchar_t[]) {0x1002, 0x1022}, (wchar_t)vendorId, 2)) - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); - else if(wmemchr((const wchar_t[]) {0x03e7, 0x8086, 0x8087}, (wchar_t)vendorId, 3)) - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); - else if(wmemchr((const wchar_t[]) {0x0955, 0x10de, 0x12d2}, (wchar_t)vendorId, 3)) - ffStrbufAppendS(&gpu->vendor, FF_GPU_VENDOR_NAME_NVIDIA); - } + ffStrbufAppendS(&gpu->vendor, ffGetGPUVendorString(vendorId)); uint64_t dedicatedVideoMemory; if(ffRegReadUint64(hSubKey, L"DedicatedVideoMemory", &dedicatedVideoMemory, nullptr)) @@ -88,14 +81,8 @@ static const char* detectWithDxgi(FFlist* gpus) FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus); - if(wmemchr((const wchar_t[]) {0x1002, 0x1022}, (wchar_t)desc.VendorId, 2)) - ffStrbufInitS(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); - else if(wmemchr((const wchar_t[]) {0x03e7, 0x8086, 0x8087}, (wchar_t)desc.VendorId, 3)) - ffStrbufInitS(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); - else if(wmemchr((const wchar_t[]) {0x0955, 0x10de, 0x12d2}, (wchar_t)desc.VendorId, 3)) - ffStrbufInitS(&gpu->vendor, FF_GPU_VENDOR_NAME_NVIDIA); - else - ffStrbufInit(&gpu->vendor); + ffStrbufInit(&gpu->vendor); + ffStrbufAppendS(&gpu->vendor, ffGetGPUVendorString(desc.VendorId)); ffStrbufInit(&gpu->name); ffStrbufSetWS(&gpu->name, desc.Description);