共用方式為


查詢

在 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,而方法 BeginQueryEndQuery

D3D12_QUERY_TYPE_TIMESTAMP是唯一支援 EndQuery 的查詢。 所有其他查詢類型都需要 BeginQueryEndQuery

偵錯層會驗證下列專案:

  • 開始時間戳查詢是非法的, 您只能結束它
  • 在未結束查詢的情況下,不結束查詢是非法的(針對指定的元素)。 對於需要開始和結束的查詢,在對應的開始之前結束查詢是非法的(針對指定的元素)。
  • 傳遞至 BeginQuery 的查詢類型必須符合傳遞至 EndQuery 的查詢類型。

核心執行時間會驗證下列專案:

  • 時間戳查詢上無法呼叫 BeginQuery

  • 對於同時支援 BeginQueryEndQuery 的查詢類型,指定元素的查詢不得跨越命令清單界限。

  • 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