GPU: support module options

This commit is contained in:
李通洲
2023-06-12 11:30:18 +08:00
parent 74e61369f2
commit c33eb8c265
9 changed files with 44 additions and 31 deletions
+12 -11
View File
@@ -2,8 +2,6 @@
#include "detection/internal.h"
#include "detection/vulkan/vulkan.h"
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";
@@ -32,14 +30,17 @@ const char* ffGetGPUVendorString(unsigned vendorId)
return NULL;
}
const FFlist* ffDetectGPU(const FFinstance* instance)
const char* ffDetectGPU(const FFinstance* instance, const FFGPUOptions* options, FFlist* result)
{
FF_DETECTION_INTERNAL_GUARD(FFlist,
ffListInit(&result, sizeof(FFGPUResult));
if(instance->config.gpu.forceVulkan || ffDetectGPUImpl(&result, instance) != NULL)
{
const FFVulkanResult* vulkan = ffDetectVulkan(instance);
result = vulkan->gpus;
}
);
if (!options->forceVulkan)
{
const char* error = ffDetectGPUImpl(instance, options, result);
if (!error) return NULL;
}
FFVulkanResult* vulkan = ffDetectVulkan(instance);
if (vulkan->error) return "GPU detection failed";
ffListDestroy(result);
ffListInitMove(result, &vulkan->gpus);
return NULL;
}
+2 -1
View File
@@ -33,7 +33,8 @@ typedef struct FFGPUResult
uint32_t vulkanDeviceId; // Only used for vulkan
} FFGPUResult;
const FFlist* ffDetectGPU(const FFinstance* instance);
const char* ffDetectGPU(const FFinstance* instance, const FFGPUOptions* options, FFlist* result);
const char* ffDetectGPUImpl(const FFinstance* instance, const FFGPUOptions* options, FFlist* gpus);
const char* ffGetGPUVendorString(unsigned vendorId);
+2 -4
View File
@@ -38,10 +38,8 @@ static double detectGpuTemp(const FFstrbuf* gpuName)
return result;
}
const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance)
const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFinstance* instance, const FFGPUOptions* options, FFlist* gpus)
{
FF_UNUSED(instance);
CFMutableDictionaryRef matchDict = IOServiceMatching(kIOAcceleratorClassName);
io_iterator_t iterator;
if(IOServiceGetMatchingServices(MACH_PORT_NULL, matchDict, &iterator) != kIOReturnSuccess)
@@ -98,7 +96,7 @@ const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance)
if(ffCfDictGetInt(properties, CFSTR("gpu-core-count"), &gpu->coreCount))
gpu->coreCount = FF_GPU_CORE_COUNT_UNSET;
if(instance->config.gpu.temp)
if(options->temp)
gpu->temperature = detectGpuTemp(&gpu->name);
else
gpu->temperature = FF_GPU_TEMP_UNSET;
+7 -7
View File
@@ -171,7 +171,7 @@ static void detectType(FFGPUResult* gpu, const PCIData* pci, struct pci_dev* dev
gpu->type = FF_GPU_TYPE_INTEGRATED;
}
static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData* pci, struct pci_dev* device)
static void pciHandleDevice(const FFinstance* instance, const FFGPUOptions* options, FFlist* results, PCIData* pci, struct pci_dev* device)
{
pci->ffpci_fill_info(device, PCI_FILL_CLASS);
@@ -206,7 +206,7 @@ static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData
gpu->coreCount = FF_GPU_CORE_COUNT_UNSET;
gpu->temperature = FF_GPU_TEMP_UNSET;
if(instance->config.gpu.temp)
if(options->temp)
pciDetectTemperatur(gpu, device);
}
@@ -234,7 +234,7 @@ static void handlePciWarning(FF_MAYBE_UNUSED char *msg, ...)
// noop
}
static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus)
static const char* pciDetectGPUs(const FFinstance* instance, const FFGPUOptions* options, FFlist* gpus)
{
PCIData pci;
@@ -267,7 +267,7 @@ static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus)
struct pci_dev* device = pci.access->devices;
while(device != NULL)
{
pciHandleDevice(instance, gpus, &pci, device);
pciHandleDevice(instance, options, gpus, &pci, device);
device = device->next;
}
@@ -277,12 +277,12 @@ static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus)
#endif
const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance)
const char* ffDetectGPUImpl(const FFinstance* instance, const FFGPUOptions* options, FFlist* gpus)
{
#ifdef FF_HAVE_LIBPCI
return pciDetectGPUs(instance, gpus);
return pciDetectGPUs(instance, options, gpus);
#else
FF_UNUSED(gpus, instance);
FF_UNUSED(instance, gpus);
return "fastfetch is built without libpci support";
#endif
}
+2 -2
View File
@@ -1,7 +1,7 @@
#include "gpu.h"
const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance)
const char* ffDetectGPUImpl(const FFinstance* instance, const FFGPUOptions* options, FFlist* gpus)
{
FF_UNUSED(gpus, instance);
FF_UNUSED(instance, options, gpus);
return "Not supported on this platform";
}
+1 -1
View File
@@ -4,7 +4,7 @@
#include <inttypes.h>
const char* ffDetectGPUImpl(FFlist* gpus, FF_MAYBE_UNUSED const FFinstance* instance)
const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFinstance* instance, const FF_MAYBE_UNUSED FFGPUOptions* options, FFlist* gpus)
{
DISPLAY_DEVICEW displayDevice = {.cb = sizeof(displayDevice) };
wchar_t regKey[MAX_PATH] = L"SYSTEM\\CurrentControlSet\\Control\\Video\\{";
+1 -1
View File
@@ -245,7 +245,7 @@ static const char* detectVulkan(const FFinstance* instance, FFVulkanResult* resu
#endif
const FFVulkanResult* ffDetectVulkan(const FFinstance* instance)
FFVulkanResult* ffDetectVulkan(const FFinstance* instance)
{
static FFVulkanResult result;
static FFThreadMutex mutex = FF_THREAD_MUTEX_INITIALIZER;
+1 -1
View File
@@ -14,6 +14,6 @@ typedef struct FFVulkanResult
const char* error;
} FFVulkanResult;
const FFVulkanResult* ffDetectVulkan(const FFinstance* instance);
FFVulkanResult* ffDetectVulkan(const FFinstance* instance);
#endif
+16 -3
View File
@@ -75,12 +75,18 @@ static void printGPUResult(FFinstance* instance, FFGPUOptions* options, uint8_t
void ffPrintGPU(FFinstance* instance, FFGPUOptions* options)
{
const FFlist* gpus = ffDetectGPU(instance);
FF_LIST_AUTO_DESTROY gpus = ffListCreate(sizeof (FFGPUResult));
const char* error = ffDetectGPU(instance, options, &gpus);
if (error)
{
ffPrintError(instance, FF_GPU_MODULE_NAME, 0, &options->moduleArgs, "%s", error);
return;
}
FF_LIST_AUTO_DESTROY selectedGPUs;
ffListInitA(&selectedGPUs, sizeof(const FFGPUResult*), gpus->length);
ffListInitA(&selectedGPUs, sizeof(const FFGPUResult*), gpus.length);
FF_LIST_FOR_EACH(FFGPUResult, gpu, *gpus)
FF_LIST_FOR_EACH(FFGPUResult, gpu, gpus)
{
if(gpu->type == FF_GPU_TYPE_INTEGRATED && options->hideType == FF_GPU_TYPE_INTEGRATED)
continue;
@@ -96,6 +102,13 @@ void ffPrintGPU(FFinstance* instance, FFGPUOptions* options)
if(selectedGPUs.length == 0)
ffPrintError(instance, FF_GPU_MODULE_NAME, 0, &options->moduleArgs, "No GPUs found");
FF_LIST_FOR_EACH(FFGPUResult, gpu, gpus)
{
ffStrbufDestroy(&gpu->vendor);
ffStrbufDestroy(&gpu->name);
ffStrbufDestroy(&gpu->driver);
}
}
void ffInitGPUOptions(FFGPUOptions* options)