From e672e40f8bb8380666255f152bb0ccb8302e1a30 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 26 Dec 2023 10:53:43 +0800 Subject: [PATCH] GPU: detect devices by OpenGL which works for asahi linux --- src/detection/gpu/gpu.c | 60 ++++++++++++++++++++++++++++++++--- src/detection/gpu/gpu_linux.c | 8 +++-- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/detection/gpu/gpu.c b/src/detection/gpu/gpu.c index 70980f5f9..ef423d7be 100644 --- a/src/detection/gpu/gpu.c +++ b/src/detection/gpu/gpu.c @@ -1,6 +1,7 @@ #include "gpu.h" #include "detection/internal.h" #include "detection/vulkan/vulkan.h" +#include "detection/opengl/opengl.h" const char* FF_GPU_VENDOR_NAME_APPLE = "Apple"; const char* FF_GPU_VENDOR_NAME_AMD = "AMD"; @@ -46,17 +47,66 @@ const char* ffGetGPUVendorString(unsigned vendorId) return NULL; } +const char* detectByOpenGL(FFlist* gpus) +{ + FFOpenGLResult result; + ffStrbufInit(&result.version); + ffStrbufInit(&result.renderer); + ffStrbufInit(&result.vendor); + ffStrbufInit(&result.slv); + const char* error = ffDetectOpenGL(&instance.config.modules.openGL, &result); + if (!error) + { + FFGPUResult* gpu = (FFGPUResult*) ffListAdd(gpus); + gpu->type = FF_GPU_TYPE_UNKNOWN; + ffStrbufInitMove(&gpu->vendor, &result.vendor); + ffStrbufInitMove(&gpu->name, &result.renderer); + ffStrbufInit(&gpu->driver); + gpu->temperature = FF_GPU_TEMP_UNSET; + gpu->coreCount = FF_GPU_CORE_COUNT_UNSET; + gpu->frequency = FF_GPU_FREQUENCY_UNSET; + gpu->dedicated = gpu->shared = (FFGPUMemory){0, 0}; + gpu->deviceId = 0; + + if (ffStrbufIgnCaseEqualS(&gpu->vendor, "Mesa")) + ffStrbufClear(&gpu->vendor); + + if (!gpu->vendor.length) + { + if (ffStrbufContainS(&result.renderer, "Apple")) + ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_APPLE); + else if (ffStrbufContainS(&result.renderer, "Intel")) + ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); + else if (ffStrbufContainS(&result.renderer, "AMD") || ffStrbufContainS(&result.renderer, "ATI")) + ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); + else if (ffStrbufContainS(&result.renderer, "NVIDIA")) + ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_NVIDIA); + } + } + + ffStrbufDestroy(&result.version); + ffStrbufDestroy(&result.renderer); + ffStrbufDestroy(&result.vendor); + ffStrbufDestroy(&result.slv); + return error; +} + const char* ffDetectGPU(const FFGPUOptions* options, FFlist* result) { if (!options->forceVulkan) { const char* error = ffDetectGPUImpl(options, result); - if (!error) return NULL; + if (!error && result->length > 0) return NULL; } FFVulkanResult* vulkan = ffDetectVulkan(); - if (vulkan->error) return "GPU detection failed"; - ffListDestroy(result); - ffListInitMove(result, &vulkan->gpus); + if (!vulkan->error && vulkan->gpus.length > 0) + { + ffListDestroy(result); + ffListInitMove(result, &vulkan->gpus); + return NULL; + } + if (detectByOpenGL(result) == NULL) + return NULL; - return NULL; + return "GPU detection failed"; } diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index 4a170ead4..a838269a4 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -46,12 +46,14 @@ static void pciDetectVendorName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* pci->ffpci_lookup_name(pci->access, gpu->vendor.chars, (int) gpu->vendor.allocated, PCI_LOOKUP_VENDOR, device->vendor_id); ffStrbufRecalculateLength(&gpu->vendor); - if(ffStrbufContainS(&gpu->vendor, "AMD") || ffStrbufContainS(&gpu->vendor, "ATI")) + if(ffStrbufContainIgnCaseS(&gpu->vendor, "AMD") || ffStrbufContainS(&gpu->vendor, "ATI")) ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); - else if(ffStrbufContainS(&gpu->vendor, "Intel")) + else if(ffStrbufContainIgnCaseS(&gpu->vendor, "Intel")) ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); - else if(ffStrbufContainS(&gpu->vendor, "NVIDIA")) + else if(ffStrbufContainIgnCaseS(&gpu->vendor, "NVIDIA")) ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_NVIDIA); + else if(ffStrbufContainIgnCaseS(&gpu->vendor, "Apple")) + ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_APPLE); } static void drmDetectDeviceName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* device)