int hc_ADL_Overdrive_Capabilities_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6Capabilities *caps) { ADL_OVERDRIVE6_CAPABILITIES_GET ADL_Overdrive6_Capabilities_Get = (ADL_OVERDRIVE6_CAPABILITIES_GET) GetProcAddress (hDLL, "ADL_Overdrive6_Capabilities_Get"); if (ADL_Overdrive6_Capabilities_Get == NULL) { log_error ("ERROR: %s\n", "ADL_Overdrive6_Capabilities_Get() is missing"); exit (-1); } int ADL_rc = ADL_Overdrive6_Capabilities_Get (iAdapterIndex, caps); return (ADL_rc); }
HRESULT CGPUUsage::Init(CString DeviceName) { Clean(); { // ATI OverDrive ATIData.hAtiADL = LoadLibrary(L"atiadlxx.dll"); if (ATIData.hAtiADL == NULL) { ATIData.hAtiADL = LoadLibrary(L"atiadlxy.dll"); } if (ATIData.hAtiADL) { ADL_MAIN_CONTROL_CREATE ADL_Main_Control_Create; ADL_ADAPTER_NUMBEROFADAPTERS_GET ADL_Adapter_NumberOfAdapters_Get; ADL_ADAPTER_ADAPTERINFO_GET ADL_Adapter_AdapterInfo_Get; ADL_ADAPTER_ACTIVE_GET ADL_Adapter_Active_Get; ADL_OVERDRIVE_CAPS ADL_Overdrive_Caps; ADL_Main_Control_Create = (ADL_MAIN_CONTROL_CREATE)GetProcAddress(ATIData.hAtiADL,"ADL_Main_Control_Create"); ATIData.ADL_Main_Control_Destroy = (ADL_MAIN_CONTROL_DESTROY)GetProcAddress(ATIData.hAtiADL,"ADL_Main_Control_Destroy"); ADL_Adapter_NumberOfAdapters_Get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET)GetProcAddress(ATIData.hAtiADL,"ADL_Adapter_NumberOfAdapters_Get"); ADL_Adapter_AdapterInfo_Get = (ADL_ADAPTER_ADAPTERINFO_GET)GetProcAddress(ATIData.hAtiADL,"ADL_Adapter_AdapterInfo_Get"); ADL_Adapter_Active_Get = (ADL_ADAPTER_ACTIVE_GET)GetProcAddress(ATIData.hAtiADL, "ADL_Adapter_Active_Get"); ADL_Overdrive_Caps = (ADL_OVERDRIVE_CAPS)GetProcAddress(ATIData.hAtiADL, "ADL_Overdrive_Caps"); if (NULL == ADL_Main_Control_Create || NULL == ATIData.ADL_Main_Control_Destroy || NULL == ADL_Adapter_NumberOfAdapters_Get || NULL == ADL_Adapter_AdapterInfo_Get || NULL == ADL_Adapter_Active_Get || NULL == ADL_Overdrive_Caps) { Clean(); } if (ATIData.hAtiADL) { int iNumberAdapters = 0; if (ADL_OK == ADL_Main_Control_Create(ADL_Main_Memory_Alloc, 1) && ADL_OK == ADL_Adapter_NumberOfAdapters_Get(&iNumberAdapters) && iNumberAdapters) { LPAdapterInfo lpAdapterInfo = DNew AdapterInfo[iNumberAdapters]; if (lpAdapterInfo) { memset(lpAdapterInfo, 0, sizeof(AdapterInfo) * iNumberAdapters); // Get the AdapterInfo structure for all adapters in the system ADL_Adapter_AdapterInfo_Get(lpAdapterInfo, sizeof(AdapterInfo) * iNumberAdapters); for (int i = 0; i < iNumberAdapters; i++ ) { int adapterActive = 0; AdapterInfo adapterInfo = lpAdapterInfo[i]; ADL_Adapter_Active_Get(adapterInfo.iAdapterIndex, &adapterActive); if (adapterActive && adapterInfo.iAdapterIndex >= 0 && adapterInfo.iVendorID == 1002) { if (DeviceName.GetLength() && DeviceName != CString(adapterInfo.strDisplayName)) { continue; } int iOverdriveSupported = 0; int iOverdriveEnabled = 0; if (ADL_OK != ADL_Overdrive_Caps(adapterInfo.iAdapterIndex, &iOverdriveSupported, &iOverdriveEnabled, &ATIData.iOverdriveVersion) || !iOverdriveSupported) { break; } if (ATIData.iOverdriveVersion == 5) { ADL_OVERDRIVE5_ODPARAMETERS_GET ADL_Overdrive5_ODParameters_Get; ADL_Overdrive5_ODParameters_Get = (ADL_OVERDRIVE5_ODPARAMETERS_GET)GetProcAddress(ATIData.hAtiADL, "ADL_Overdrive5_ODParameters_Get"); ATIData.ADL_Overdrive5_CurrentActivity_Get = (ADL_OVERDRIVE5_CURRENTACTIVITY_GET)GetProcAddress(ATIData.hAtiADL, "ADL_Overdrive5_CurrentActivity_Get"); if (NULL == ADL_Overdrive5_ODParameters_Get || NULL == ATIData.ADL_Overdrive5_CurrentActivity_Get) { break; } ADLODParameters overdriveParameters = {0}; overdriveParameters.iSize = sizeof (ADLODParameters); if (ADL_OK != ADL_Overdrive5_ODParameters_Get(adapterInfo.iAdapterIndex, &overdriveParameters) || !overdriveParameters.iActivityReportingSupported) { break; } ATIData.iAdapterId = adapterInfo.iAdapterIndex; } else if (ATIData.iOverdriveVersion == 6) { ADL_OVERDRIVE6_CAPABILITIES_GET ADL_Overdrive6_Capabilities_Get; ADL_Overdrive6_Capabilities_Get = (ADL_OVERDRIVE6_CAPABILITIES_GET)GetProcAddress(ATIData.hAtiADL, "ADL_Overdrive6_Capabilities_Get"); ATIData.ADL_Overdrive6_CurrentStatus_Get = (ADL_OVERDRIVE6_CURRENTSTATUS_GET)GetProcAddress(ATIData.hAtiADL, "ADL_Overdrive6_CurrentStatus_Get"); if (NULL == ADL_Overdrive6_Capabilities_Get || NULL == ATIData.ADL_Overdrive6_CurrentStatus_Get) { break; } ADLOD6Capabilities od6Capabilities = {0}; if (ADL_OK != ADL_Overdrive6_Capabilities_Get(adapterInfo.iAdapterIndex, &od6Capabilities) || (od6Capabilities.iCapabilities & ADL_OD6_CAPABILITY_GPU_ACTIVITY_MONITOR) != ADL_OD6_CAPABILITY_GPU_ACTIVITY_MONITOR) { break; } ATIData.iAdapterId = adapterInfo.iAdapterIndex; } break; } } delete [] lpAdapterInfo; } } } } if (ATIData.iAdapterId == -1 && ATIData.hAtiADL) { Clean(); } if (ATIData.iAdapterId >= 0 && ATIData.hAtiADL) { m_GPUType = ATI_GPU; } } if (m_GPUType == UNKNOWN_GPU) { // NVApi NVData.hNVApi = LoadLibrary(L"nvapi64.dll"); if (NVData.hNVApi == NULL) { NVData.hNVApi = LoadLibrary(L"nvapi.dll"); } if (NVData.hNVApi) { NvAPI_QueryInterface_t NvAPI_QueryInterface = (NvAPI_QueryInterface_t)GetProcAddress(NVData.hNVApi, "nvapi_QueryInterface"); NvAPI_Initialize_t NvAPI_Initialize = NULL; NvAPI_EnumPhysicalGPUs_t NvAPI_EnumPhysicalGPUs = NULL; if (NvAPI_QueryInterface) { NvAPI_Initialize = (NvAPI_Initialize_t)(NvAPI_QueryInterface)(0x0150E828); NvAPI_EnumPhysicalGPUs = (NvAPI_EnumPhysicalGPUs_t)(NvAPI_QueryInterface)(0xE5AC921F); NVData.NvAPI_GPU_GetUsages = (NvAPI_GPU_GetUsages_t)(NvAPI_QueryInterface)(0x189A1FDF); } if (NULL == NvAPI_QueryInterface || NULL == NvAPI_Initialize || NULL == NvAPI_EnumPhysicalGPUs || NULL == NVData.NvAPI_GPU_GetUsages) { Clean(); } if (NVData.hNVApi) { NvAPI_Initialize(); int gpuCount = 0; NvAPI_EnumPhysicalGPUs(NVData.gpuHandles, &gpuCount); if (!gpuCount) { Clean(); } } } if (NVData.hNVApi && NVData.NvAPI_GPU_GetUsages) { m_GPUType = NVIDIA_GPU; } } return m_GPUType == UNKNOWN_GPU ? E_FAIL : S_OK; }
void get_adapter_info (device_t *adapter) { int temp = 0; int pt_caps = 0; int bufsize = 0; ADLOD6StateInfo *default_state; ADLOD6StateInfo *custom_state; ADLOD6Capabilities caps = {0}; ADLOD6CurrentStatus current = {0}; ADLOD6FanSpeedInfo fan_info = {0}; ADLOD6ThermalControllerCaps fan_caps = {0}; ADLOD6PowerControlInfo powertune = {0}; ADL_Overdrive6_Capabilities_Get (adapter->real_id, &caps); adapter->core_clock_min = caps.sEngineClockRange.iMin / 100; adapter->core_clock_max = caps.sEngineClockRange.iMax / 100; adapter->core_clock_step = caps.sEngineClockRange.iStep / 100; adapter->mem_clock_min = caps.sMemoryClockRange.iMin / 100; adapter->mem_clock_max = caps.sMemoryClockRange.iMax / 100; adapter->mem_clock_step = caps.sMemoryClockRange.iStep / 100; ADL_Overdrive6_ThermalController_Caps (adapter->real_id, &fan_caps); adapter->fan_min_rpm = fan_caps.iFanMinRPM; adapter->fan_max_rpm = fan_caps.iFanMaxRPM; adapter->fan_min_percent = fan_caps.iFanMinPercent; adapter->fan_max_percent = fan_caps.iFanMaxPercent; ADL_Overdrive6_FanSpeed_Get (adapter->real_id, &fan_info); if (ADL_Overdrive6_VoltageControl_Get) { ADL_Overdrive6_VoltageControlInfo_Get(adapter->real_id, &adapter->voltage_info); ADL_Overdrive6_VoltageControl_Get (adapter->real_id, &adapter->voltage_current, &adapter->voltage_default); } adapter->fan_rpm_current = fan_info.iFanSpeedRPM; adapter->fan_percent_current = fan_info.iFanSpeedPercent; if (ADL_Overdrive6_TargetTemperatureData_Get) ADL_Overdrive6_TargetTemperatureData_Get (adapter->real_id, &adapter->target_temp_current, &adapter->target_temp_default); ADL_Overdrive6_Temperature_Get (adapter->real_id, &temp); adapter->temp = (int)(temp / 1000); bufsize = sizeof (ADLOD6StateInfo) + sizeof (ADLOD6PerformanceLevel); default_state = (ADLOD6StateInfo *) calloc (1, bufsize); default_state->iNumberOfPerformanceLevels = 2; ADL_Overdrive6_StateInfo_Get (adapter->real_id, ADL_OD6_GETSTATEINFO_DEFAULT_PERFORMANCE, default_state); adapter->core_clock_default_range_min = default_state->aLevels[0].iEngineClock / 100; adapter->core_clock_default_range_max = default_state->aLevels[1].iEngineClock / 100; adapter->mem_clock_default_range_min = default_state->aLevels[0].iMemoryClock / 100; adapter->mem_clock_default_range_max = default_state->aLevels[1].iMemoryClock / 100; free (default_state); custom_state = (ADLOD6StateInfo *) calloc (1, bufsize); custom_state->iNumberOfPerformanceLevels = 2; ADL_Overdrive6_StateInfo_Get (adapter->real_id, ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE, custom_state); adapter->core_clock_custom_range_min = custom_state->aLevels[0].iEngineClock / 100; adapter->core_clock_custom_range_max = custom_state->aLevels[1].iEngineClock / 100; adapter->mem_clock_custom_range_min = custom_state->aLevels[0].iMemoryClock / 100; adapter->mem_clock_custom_range_max = custom_state->aLevels[1].iMemoryClock / 100; free (custom_state); ADL_Overdrive6_CurrentStatus_Get (adapter->real_id, ¤t); adapter->core_clock_current = current.iEngineClock/ 100; adapter->mem_clock_current = current.iMemoryClock/ 100; adapter->utilization = current.iActivityPercent; ADL_Overdrive6_PowerControl_Caps (adapter->real_id, &pt_caps); if (!pt_caps) return; ADL_Overdrive6_PowerControlInfo_Get (adapter->real_id, &powertune); ADL_Overdrive6_PowerControl_Get (adapter->real_id, &adapter->pt_current, &adapter->pt_default); adapter->pt_min = powertune.iMinValue; adapter->pt_max = powertune.iMaxValue; adapter->pt_step = powertune.iStepValue; }