查詢
在 Direct3D 12 中,查詢會分組成稱為查詢堆積的查詢陣列。 查詢堆積具有類型,可定義可與該堆積搭配使用的有效查詢類型。
從 Direct3D 11 到 Direct3D 12 的查詢差異
下列查詢類型不再存在於 Direct3D 12 中,其功能會併入其他進程:
- 事件查詢 - 事件 功能上現在由柵欄處理。
- 停機時間戳查詢 - GPU 時鐘可以在 Direct3D 12 中設定為穩定狀態, (請參閱 計時 一節) 。 如果時間戳記之間完全閒置的 GPU (稱為脫離查詢) ,GPU 時鐘比較就不有意義。 從不同命令清單發出穩定電源的兩個時間戳記查詢可哥靠地進行比較。 相同命令清單中的兩個時間戳記一律會可靠地比較。
- 串流輸出統計資料查詢 - 在 Direct3D 12 中,所有輸出資料流程沒有單一資料流程輸出 (SO) 溢位查詢。 應用程式需要發出多個單一資料流程查詢,然後讓結果相互關聯。
- 串流輸出統計資料述詞和遮蔽 述詞查詢 - 查詢 (寫入記憶體) 和預先 分割 (不再結合記憶體) 讀取,因此不需要這些查詢類型。
新的二進位遮蔽查詢類型已新增至 Direct3D 12。 這允許預先分割策略,只關心物件是否完全遮蔽 (,而不是) 遮蔽多少圖元,以向裝置指出這點,這可能會更有效率地執行查詢。
查詢堆積
查詢可以是數種類型 (D3D12_QUERY_HEAP_TYPE) ,而且會先分組成查詢堆積,再提交至 GPU。
新的查詢類型D3D12_QUERY_TYPE_BINARY_OCCLUSION可供使用,而且作用類似D3D12_QUERY_TYPE_OCCLUSION,不同之處在于它會傳回二進位 0/1 結果:0 表示沒有樣本通過深度和樣板測試,1 表示至少有一個樣本通過深度和樣板測試。 這可讓遮蔽查詢不會干擾與深度/樣板測試相關聯的任何 GPU 效能優化。
建立查詢堆積
與建立查詢堆積相關的 API 是列舉 D3D12_QUERY_HEAP_TYPE、結構 D3D12_QUERY_HEAP_DESC,以及 CreateQueryHeap方法。
核心執行時間會驗證查詢堆積類型是否為 D3D12_HEAP_TYPE 列舉的有效成員,且計數大於 0。
您可以個別啟動和停止查詢堆積內的每個個別查詢專案。
使用查詢堆積的 API 是列舉 D3D12_QUERY_TYPE,以及 BeginQuery 和 EndQuery方法。
D3D12_QUERY_TYPE_TIMESTAMP是唯一支援 EndQuery 的查詢。 所有其他查詢類型都需要 BeginQuery 和 EndQuery。
偵錯層會驗證下列專案:
- 開始時間戳查詢不合法,您只能結束它
- 不合法地開始查詢兩次,而不結束查詢 (指定元素) 。 對於需要開始和結束的查詢,在給定元素的對應開始 (之前,結束查詢不合法) 。
- 傳遞至 BeginQuery 的查詢類型必須符合傳遞至 EndQuery的查詢類型。
核心執行時間會驗證下列各項:
無法對時間戳記查詢呼叫BeginQuery。
對於同時支援 BeginQuery 和 EndQuery 的查詢類型 (,除了時間戳記) 以外,所有專案都不能跨越命令清單界限的查詢。
ElementIndex 必須位於範圍內。
查詢類型是 D3D12_QUERY_TYPE 列舉的有效成員。
查詢類型必須與查詢堆積相容。 下表顯示每個查詢類型所需的查詢堆積類型:
查詢類型 查詢堆積類型 D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS 命令清單類型支援查詢類型。 下表顯示哪些命令清單類型支援哪些查詢。
查詢類型 支援的命令清單類型 D3D12_QUERY_TYPE_OCCLUSION 直接 D3D12_QUERY_TYPE_BINARY_OCCLUSION 直接 D3D12_QUERY_TYPE_TIMESTAMP 直接、計算和選擇性地複製 D3D12_QUERY_TYPE_PIPELINE_STATISTICS 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 直接
從查詢擷取資料
從查詢擷取資料的方式是使用 ResolveQueryData 方法。 ResolveQueryData適用于所有記憶體類型, (它們是否為系統記憶體或裝置本機記憶體) ,但需要目的地資源D3D12_RESOURCE_STATE_COPY_DEST。