Časování (grafika Direct3D 12)
Tato část se zabývá dotazováním časových razítek a kalibrací čítačů časového razítka GPU a procesoru.
Frekvence časového razítka
Vaše aplikace může dotazovat frekvenci časového razítka GPU pro jednotlivé fronty příkazů (viz metoda ID3D12CommandQueue::GetTimestampFrequency).
Vrácená frekvence se měří v Hz (tiků/s). Pokud zadaná fronta příkazů nepodporuje časová razítka (viz tabulka v části Dotazy), toto rozhraní API selže (a vrátí E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT a D3D12_COMMAND_LIST_TYPE_COMPUTE vždy podporují časová razítka. D3D12_COMMAND_LIST_TYPE_COPY volitelně podporuje časové razítko, pokud D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported člen je TRUE.
Kalibrace časového razítka
D3D12 umožňuje aplikacím korelovat výsledky získané z dotazů časového razítka s výsledky získanými z volání QueryPerformanceCounter
. To je povoleno voláním ID3D12CommandQueue::GetClockCalibration.
Časové razítko je vzorkováno GPU v okamžiku, kdy GPU dokončí všechny předchozí úlohy. Je to stejné chování, které direct3D 11 přijímá (viz D3D11_QUERY_TIMESTAMP ve funkční specifikaci Direct3D 11.3 na GitHubu). To znamená, že dotazy časového razítka jsou operací typu BOP (bottom-of-pipe) v Direct3D 12.
GetClockCalibration vzorkuje čítač časového razítka GPU pro danou frontu příkazů a vzorkuje čítač procesoru prostřednictvím QueryPerformanceCounter
téměř ve stejnou dobu. Toto rozhraní API znovu selže (vrací E_FAIL), pokud zadaná fronta příkazů nepodporuje časové razítka (viz tabulka v tématu Dotazy).
Všimněte si, že čítače časových razítek GPU a CPU nemusí nutně přímo souviset s taktovací frekvencí těchto procesorů, ale místo toho pracují z tiků časových razítek.
Dotazy na časová razítka
Časové razítka můžete získat jako součást seznamu příkazů (místo volání na straně procesoru ve frontě příkazů) prostřednictvím dotazů časového razítka. (Pro více informací o dotazech obecně viz dotazy).
Všechny dotazy časového razítka používají typ D3D12_QUERY_TYPE_TIMESTAMP pro skutečný dotaz. Vzhledem k hardwarovým omezením ale D3D12_COMMAND_LIST_TYPE_DIRECT a D3D12_COMMAND_LIST_TYPE_COMPUTE používat jiný D3D12_QUERY_HEAP_TYPE než ten, který D3D12_COMMAND_LIST_TYPE_COPY používá.
Přímé a výpočetní fronty používají D3D12_QUERY_HEAP_TYPE_TIMESTAMP.
Fronta pro kopírování používá D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.
Dotazy fronty kopírování jsou podporovány pouze v případě, že D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported člen je TRUE.
Dotazy časového razítka, jakmile jsou vyřešeny prostřednictvím ID3D12GraphicsCommandList::ResolveQueryData, jsou UINT64, který představuje tiky, jak je vráceno ID3D12CommandQueue::GetClockCalibration, a proto musí být rozděleny podle frekvence fronty, aby získaly délku v sekundách.
Důležitý
Pro přesnost použijte aritmetiku s plovoucí desetinnou čárkou při výpočtu intervalů sekund nebo milisekund časových razítek. Například místo queriedTicks / Frequency
použijte queriedTicks / (double)Frequency
.