mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-11-03 11:44:18 +01:00
GPU (Windows): support memory type detection for Intel dGPUs
This commit is contained in:
@@ -41,6 +41,8 @@ typedef struct FFGpuDriverResult
|
||||
uint32_t* index;
|
||||
double* temp;
|
||||
FFGPUMemory* memory;
|
||||
FFstrbuf* memoryType;
|
||||
FFGPUMemory* sharedMemory;
|
||||
uint32_t* coreCount;
|
||||
double* coreUsage;
|
||||
FFGPUType* type;
|
||||
|
||||
@@ -12,6 +12,7 @@ struct FFIgclData {
|
||||
FF_LIBRARY_SYMBOL(ctlEnumTemperatureSensors)
|
||||
FF_LIBRARY_SYMBOL(ctlTemperatureGetState)
|
||||
FF_LIBRARY_SYMBOL(ctlEnumMemoryModules)
|
||||
FF_LIBRARY_SYMBOL(ctlMemoryGetProperties)
|
||||
FF_LIBRARY_SYMBOL(ctlMemoryGetState)
|
||||
FF_LIBRARY_SYMBOL(ctlEnumFrequencyDomains)
|
||||
FF_LIBRARY_SYMBOL(ctlFrequencyGetProperties)
|
||||
@@ -42,6 +43,7 @@ const char* ffDetectIntelGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverRe
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumTemperatureSensors)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlTemperatureGetState)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumMemoryModules)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlMemoryGetProperties)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlMemoryGetState)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlEnumFrequencyDomains)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libigcl, igclData, ctlFrequencyGetProperties)
|
||||
@@ -135,14 +137,56 @@ const char* ffDetectIntelGpuInfo(const FFGpuDriverCondition* cond, FFGpuDriverRe
|
||||
result.memory->total = 0;
|
||||
for (uint32_t iMem = 0; iMem < memoryCount; iMem++)
|
||||
{
|
||||
ctl_mem_state_t memoryState = {
|
||||
.Size = sizeof(ctl_mem_state_t),
|
||||
ctl_mem_properties_t memoryProperties = {
|
||||
.Size = sizeof(memoryProperties),
|
||||
.Version = 0,
|
||||
};
|
||||
if (igclData.ffctlMemoryGetState(memoryModules[iMem], &memoryState) == CTL_RESULT_SUCCESS)
|
||||
if (igclData.ffctlMemoryGetProperties(memoryModules[iMem], &memoryProperties) == CTL_RESULT_SUCCESS)
|
||||
{
|
||||
result.memory->total += memoryState.size;
|
||||
result.memory->used += memoryState.size - memoryState.free;
|
||||
if (memoryProperties.location == CTL_MEM_LOC_DEVICE && result.memoryType)
|
||||
{
|
||||
switch (memoryProperties.type)
|
||||
{
|
||||
#define FF_ICTL_MEM_TYPE_CASE(type) case CTL_MEM_TYPE_##type: ffStrbufSetStatic(result.memoryType, #type); break
|
||||
FF_ICTL_MEM_TYPE_CASE(HBM);
|
||||
FF_ICTL_MEM_TYPE_CASE(DDR);
|
||||
FF_ICTL_MEM_TYPE_CASE(DDR3);
|
||||
FF_ICTL_MEM_TYPE_CASE(DDR4);
|
||||
FF_ICTL_MEM_TYPE_CASE(DDR5);
|
||||
FF_ICTL_MEM_TYPE_CASE(LPDDR);
|
||||
FF_ICTL_MEM_TYPE_CASE(LPDDR3);
|
||||
FF_ICTL_MEM_TYPE_CASE(LPDDR4);
|
||||
FF_ICTL_MEM_TYPE_CASE(LPDDR5);
|
||||
FF_ICTL_MEM_TYPE_CASE(GDDR4);
|
||||
FF_ICTL_MEM_TYPE_CASE(GDDR5);
|
||||
FF_ICTL_MEM_TYPE_CASE(GDDR5X);
|
||||
FF_ICTL_MEM_TYPE_CASE(GDDR6);
|
||||
FF_ICTL_MEM_TYPE_CASE(GDDR6X);
|
||||
FF_ICTL_MEM_TYPE_CASE(GDDR7);
|
||||
#undef FF_ICTL_MEM_TYPE_CASE
|
||||
default:
|
||||
ffStrbufSetF(result.memoryType, "Unknown (%u)", memoryProperties.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ctl_mem_state_t memoryState = {
|
||||
.Size = sizeof(ctl_mem_state_t),
|
||||
.Version = 0,
|
||||
};
|
||||
if (igclData.ffctlMemoryGetState(memoryModules[iMem], &memoryState) == CTL_RESULT_SUCCESS)
|
||||
{
|
||||
if (memoryProperties.location == CTL_MEM_LOC_DEVICE)
|
||||
{
|
||||
result.memory->total += memoryState.size;
|
||||
result.memory->used += memoryState.size - memoryState.free;
|
||||
}
|
||||
else if (result.sharedMemory && memoryProperties.location == CTL_MEM_LOC_SYSTEM)
|
||||
{
|
||||
result.sharedMemory->total += memoryState.size;
|
||||
result.sharedMemory->used += memoryState.size - memoryState.free;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,6 +174,8 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist*
|
||||
.index = &gpu->index,
|
||||
.temp = options->temp ? &gpu->temperature : NULL,
|
||||
.memory = options->driverSpecific ? &gpu->dedicated : NULL,
|
||||
.sharedMemory = options->driverSpecific ? &gpu->shared : NULL,
|
||||
.memoryType = options->driverSpecific ? &gpu->memoryType : NULL,
|
||||
.coreCount = options->driverSpecific ? (uint32_t*) &gpu->coreCount : NULL,
|
||||
.coreUsage = options->driverSpecific ? &gpu->coreUsage : NULL,
|
||||
.type = &gpu->type,
|
||||
|
||||
@@ -141,6 +141,50 @@ typedef struct ctl_mem_state_t
|
||||
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv417ctlMemoryGetState16ctl_mem_handle_tP15ctl_mem_state_t
|
||||
extern ctl_result_t ctlMemoryGetState(ctl_mem_handle_t hMemory, ctl_mem_state_t *pState);
|
||||
|
||||
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv414ctl_mem_type_t
|
||||
typedef enum ctl_mem_type_t
|
||||
{
|
||||
CTL_MEM_TYPE_HBM = 0,
|
||||
CTL_MEM_TYPE_DDR = 1,
|
||||
CTL_MEM_TYPE_DDR3 = 2,
|
||||
CTL_MEM_TYPE_DDR4 = 3,
|
||||
CTL_MEM_TYPE_DDR5 = 4,
|
||||
CTL_MEM_TYPE_LPDDR = 5,
|
||||
CTL_MEM_TYPE_LPDDR3 = 6,
|
||||
CTL_MEM_TYPE_LPDDR4 = 7,
|
||||
CTL_MEM_TYPE_LPDDR5 = 8,
|
||||
CTL_MEM_TYPE_GDDR4 = 9,
|
||||
CTL_MEM_TYPE_GDDR5 = 10,
|
||||
CTL_MEM_TYPE_GDDR5X = 11,
|
||||
CTL_MEM_TYPE_GDDR6 = 12,
|
||||
CTL_MEM_TYPE_GDDR6X = 13,
|
||||
CTL_MEM_TYPE_GDDR7 = 14,
|
||||
CTL_MEM_TYPE_MAX
|
||||
} ctl_mem_type_t;
|
||||
|
||||
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv413ctl_mem_loc_t
|
||||
typedef enum ctl_mem_loc_t
|
||||
{
|
||||
CTL_MEM_LOC_SYSTEM = 0,
|
||||
CTL_MEM_LOC_DEVICE = 1,
|
||||
CTL_MEM_LOC_MAX
|
||||
} ctl_mem_loc_t;
|
||||
|
||||
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv420ctl_mem_properties_t
|
||||
typedef struct ctl_mem_properties_t
|
||||
{
|
||||
uint32_t Size;
|
||||
uint8_t Version;
|
||||
ctl_mem_type_t type;
|
||||
ctl_mem_loc_t location;
|
||||
uint64_t physicalSize;
|
||||
int32_t busWidth;
|
||||
int32_t numChannels;
|
||||
} ctl_mem_properties_t;
|
||||
|
||||
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#_CPPv422ctlMemoryGetProperties16ctl_mem_handle_tP20ctl_mem_properties_t
|
||||
extern ctl_result_t ctlMemoryGetProperties(ctl_mem_handle_t hMemory, ctl_mem_properties_t *pProperties);
|
||||
|
||||
typedef struct ctl_freq_handle_t* ctl_freq_handle_t;
|
||||
|
||||
// https://intel.github.io/drivers.gpu.control-library/Control/api.html#ctlenumfrequencydomains
|
||||
|
||||
Reference in New Issue
Block a user