內容監視

本文提供內容監視的相關信息,可讓您在 GPU 引擎之間或跨 CPU 核心和 GPU 引擎進行彈性同步處理。 受監視的柵欄對像是進階形式的柵欄同步處理,可讓 CPU 核心或 GPU 引擎發出訊號或等候特定柵欄物件。

監視的柵欄建立

Direct3D 運行時間會呼叫使用者模式驅動程式的 (UMD) CreateSynchronizationObjectCb 回呼,並使用 D3DDDI_MONITORED_FENCE 同步處理對象類型呼叫受監視的柵欄物件。

系統會建立受監視的柵欄物件以及下列屬性:

  • 初始值
  • 旗標 (指定其等候和訊號行為)

建立時,圖形核心會傳回由下列專案組成的柵欄物件:

項目 描述
hSyncObject 同步處理物件的句柄。 用來在圖形核心的呼叫中參考它。
FenceValueCPUVirtualAddress CPU 的柵欄值 (64 位) 只讀對應。 此位址會對應 WB (可快取) ,從支援 I/O 一致性、UC (在其他平臺上未快取) 的平臺上 CPU 的觀點。 唯讀取此記憶體位置,讓CPU能夠追蹤柵欄進度。 CPU 不允許寫入此記憶體位置。 若要發出柵欄的訊號,必須有 CPU 才能呼叫 SignalSynchronizationObjectFromCpuCb。 支援IoMmu的適配卡應該使用此位址進行 GPU 存取。 在此案例中,位址會對應為讀寫。
FenceValueGPUVirtualAddress GPU 的柵欄值 (64 位) 的讀取/寫入對應。 此位址會對應為支援 I/O 的平臺上需要 I/O 一致性。 若要發出柵欄的訊號,允許 GPU 直接寫入此 GPU 虛擬位址。 IoMmu GPU 不應該使用此位址。

柵欄值是 64 位值,其各自的虛擬位址會對齊 64 位界限。 GPU 應該宣告它們是否能夠透過新增 的 DXGK_VIDSCHCAPS::No64BitAtomics 旗標,將 CPU 所看見的 64 位值更新為可見。 如果 GPU 只能以不可部分完成的方式更新 32 位值,OS 會自動處理柵欄換行案例。 不過,它會限制未完成的等候和訊號柵欄值不能超過 最後一個發出訊號的柵欄值UINT_MAX/2。

GPU 訊號

如果 GPU 引擎無法使用其虛擬位址寫入受監視的柵欄,則使用者模式驅動程式 (UMD) 會使用 SignalSynchronizationObjectFromGpuCb 回呼,將軟體訊號封包排入 GPU 內容佇列。

為了發出 GPU 柵欄的訊號,UMD 會在內容命令數據流中直接插入柵欄寫入命令,而不需要通過核心模式。 核心監視柵欄進度的機制會根據特定 GPU 引擎是否支援受監視柵欄的基本或進階實作而有所不同。

當命令緩衝區在 GPU 上完成執行時,圖形核心:

  • 流覽具有擱置等候的隔離物件清單,此程式可能會發出訊號
  • 讀取其目前的柵欄值
  • 判斷是否有任何需要不想要的等候。

GPU 等候

若要在 GPU 引擎上等候受監視的柵欄,UMD 必須先排清其暫止命令緩衝區,然後呼叫 WaitForSynchronizationObjectFromGpuCb ,以指定柵欄物件 (hSyncObject) ,以及等候的柵欄值。 圖形核心會將相依性排入其內部資料庫的佇列,然後立即傳回 UMD,以便繼續將等候作業後方的工作排入佇列。 等候作業之後提交的命令緩衝區不會排定執行,直到滿足等候作業為止。

CPU 訊號

已新增 SignalSynchronizationObjectFromCpuCb 回呼,以允許 CPU 發出受監視柵欄對象的訊號。 當 CPU 發出受監視柵欄物件的訊號時,圖形核心會使用訊號值來更新柵欄記憶體位置。 這個值會立即顯示給任何使用者模式讀取器,並立即不需要任何滿足的等候。

CPU 等候

已新增 WaitForSynchronizationObjectFromCpuCb 回呼,以允許 CPU 等候受監視的柵欄物件。 有兩種形式的等候作業可供使用。 在第一個窗體中, WaitForSynchronizationObjectFromCpuCb 會封鎖直到滿足等候為止。 第二種形式是 WaitForSynchronizationObjectFromCpuCb 會接受 CPU 事件的句柄,該事件會在滿足等候條件之後收到訊號。