Ati ADL

  • Hallo
    Ich bin gerade dabei mir ein Tool zu schreiben was mir meine Grafikkartenauslastung in Prozent angeben soll.
    Dafür will ich die structure ADLGetClocksOUT aus der atiadlxy.dll auslesen. Mein Problem ist nur, dass ich nahezu keine Erfahrung mit DLLs habe
    und dementsprechend schnell überfordert war mit den von Ati bereitgestellten Informationen und google mir auch keine Hilfe war.

    Dementsprechend meine Frage, ob mir jemand helfen kann, an die structure zu kommen oder mir einen Tipp gibt wie ich an die Infos dafür selbst kommen könnte.

  • Das sollte man stattdessen über die Overdrive API auslesen. Das ganze ist mit AutoIt ein bisschen aufwändig und nicht unbedingt für Anfänger geeignet.
    In den Code habe ich viel mehr Arbeit gesteckt als ich geplant habe. Dafür sollte aber auch alles korrekt und zuverlässig funktionieren.
    Das ganze könnte man eigentlich mal zu einer UDF ausbauen, aber den Aufwand kann ich mir im Moment nicht zumuten. ^^

    Das Script liest die GPU Auslastung für alle angeschlossenen Grafikadapter in Prozent aus. Meine neue Radeon R9 280X wird leider 6 mal aufgelistet (1 Eintrag für jedes virtuell präsente Display). Das variiert eventuell, je nach Treiber und/oder Grafikkarte.

    Spoiler anzeigen
    [autoit]

    #include <Memory.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; - "Inspired" by this script http://www.autoit.de/index.php?page…0736#post250736 (written by Andy)
    ; - Author: name22 (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit]

    #Region Structure Definitions
    Global Const $tagAdapterInfo = "int iSize;" & _
    "int iAdapterIndex;" & _
    "char strUDID[256];" & _
    "int iBusNumber;" & _
    "int iDeviceNumber;" & _
    "int iFunctionNumber;" & _
    "int iVendorID;" & _
    "char strAdapterName[256];" & _
    "char strDisplayName[256];" & _
    "int iPresent;" & _
    "int iExist;" & _
    "char strDriverPath[256];" & _
    "char strDriverPathExt[256];" & _
    "char strPNPString[256];" & _
    "int iOSDisplayIndex"

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $tagADLPMActivity = "int iSize;" & _
    "int iEngineClock;" & _
    "int iMemoryClock;" & _
    "int iVddc;" & _
    "int iActivityPercent;" & _
    "int iCurrentPerformanceLevel;" & _
    "int iCurrentBusSpeed;" & _
    "int iCurrentBusLanes;" & _
    "int iMaximumBusLanes;" & _
    "int iReserved"
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    Global $sDLL_ADL, $hCallback_Alloc, $pCallback_Alloc, $iNumberAdapters, $aAdapterInfo, $tBuffer, $tActivity

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("_Shutdown")

    [/autoit] [autoit][/autoit] [autoit]

    $hDLL_ADL = DllOpen("atiadlxx.dll")
    If $hDLL_ADL = -1 Then $hDLL_ADL = DllOpen("atiadlxy.dll")

    [/autoit] [autoit][/autoit] [autoit]

    $hCallback_Alloc = DllCallbackRegister("_Main_Memory_Alloc", "int_ptr", "int")
    $pCallback_Alloc = DllCallbackGetPtr($hCallback_Alloc)

    [/autoit] [autoit][/autoit] [autoit]

    _ADL_Main_Control_Create($pCallback_Alloc)
    $iNumberAdapters = _ADL_Adapter_NumberOfAdapters_Get()

    [/autoit] [autoit][/autoit] [autoit]

    If $iNumberAdapters > 0 Then
    $aAdapterInfo = _ADL_Adapter_AdapterInfo_Get($iNumberAdapters)
    For $i = 0 To UBound($aAdapterInfo) - 1
    $tActivity = _ADL_Overdrive5_CurrentActivity_Get($aAdapterInfo[$i].iAdapterIndex)
    ConsoleWrite("GPU " & $i + 1 & ". " & $aAdapterInfo[$i].strAdapterName & ": Activity [%] =" & @TAB & $tActivity.iActivityPercent & @CRLF)
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main_Memory_Alloc($iSize)
    ConsoleWrite("!Global_Mem_Alloc:" & @TAB & $iSize & @CRLF)
    Return _MemGlobalAlloc($iSize)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main_Memory_Free($pMem)
    ConsoleWrite("!Global_Mem_Free:" & @TAB & $pMem & @CRLF)
    Return _MemGlobalFree($pMem)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    _ADL_Main_Control_Destroy()
    DllCallbackFree($hCallback_Alloc)
    DllClose($hDLL_ADL)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #Region ADL-DLL Functions
    Func _ADL_Main_Control_Create($pMemAlloc, $iEnumConnectedAdapters = 0)
    $aRet = DllCall($hDLL_ADL, "int:cdecl", "ADL_Main_Control_Create", "ptr", $pCallback_Alloc, "int", $iEnumConnectedAdapters)
    If Not @error Then
    Return $aRet[0]
    Else
    Return SetError(@error, 0, 0)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ADL_Main_Control_Destroy()
    $aRet = DllCall($hDLL_ADL, "int:cdecl", "ADL_Main_Control_Destroy")
    If Not @error Then
    Return $aRet[0]
    Else
    Return SetError(@error, 0, 0)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ADL_Adapter_NumberOfAdapters_Get()
    Local $iNumberAdapters
    $aRet = DllCall($hDLL_ADL, "int:cdecl", "ADL_Adapter_NumberOfAdapters_Get", "int*", $iNumberAdapters)
    If Not @error Then
    Return $aRet[1]
    Else
    Return SetError(@error, 0, 0)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ADL_Adapter_AdapterInfo_Get($iNumberAdapters)
    Local $iStructSize = DllStructGetSize(DllStructCreate($tagAdapterInfo))
    $tBuffer = DllStructCreate("byte[" & $iStructSize * $iNumberAdapters & "]")
    Local $pBuffer = DllStructGetPtr($tBuffer)
    Local $aAdapterInfo[$iNumberAdapters]
    For $i = 0 To $iNumberAdapters - 1
    $aAdapterInfo[$i] = DllStructCreate($tagAdapterInfo, $pBuffer + $i * $iStructSize)
    Next
    $aRet = DllCall($hDLL_ADL, "int:cdecl", "ADL_Adapter_AdapterInfo_Get", "ptr", $pBuffer, "int", DllStructGetSize($tBuffer))
    If Not @error Then
    Return $aAdapterInfo
    Else
    Return SetError(@error, 0, 0)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ADL_Overdrive5_CurrentActivity_Get($iAdapterIndex)
    Local $tADLPMActivity = DllStructCreate($tagADLPMActivity), $pADLPMActivity = DllStructGetPtr($tADLPMActivity)
    $tADLPMActivity.iSize = DllStructGetSize($tADLPMActivity)
    $aRet = DllCall($hDLL_ADL, "int:cdecl", "ADL_Overdrive5_CurrentActivity_Get", "int", $iAdapterIndex, "ptr", $pADLPMActivity)
    If Not @error Then
    Return $tADLPMActivity
    Else
    Return SetError(@error, 0, 0)
    EndIf
    EndFunc
    #EndRegion

    [/autoit]


    Ich habe übrigens meinen Namen in das Script eingefügt, weil es so ein Krampf war, dass zum Laufen zu bringen :rolleyes: . Andys Name steht auch drin, weil ich vieles aus seinem Script übernommen habe.
    Die "Alloc" Funktionen werden nicht wirklich gebraucht, da der Teil der API den ich hier benutze, sowieso keinen Speicher auf dem Heap des Benutzers registriert.

    Ich bin mir allerdings nicht sicher, wie diese Ansteuerung auf ältere GPUs/Treiber reagiert, dass müsstest du dann bei Bedarf testen.

  • Zitat

    ich werde meinen Erstgeborenen nach dir benennen!


    Das ist ja wohl das Mindeste :rofl: .

    Es freut mich aber natürlich wenn es bei dir so funktioniert wie es soll. ;)

    Edit: Du könntest aber noch das Präfix des Themas auf "[gelöst]" setzen (1. Beitrag bearbeiten).