共用方式為


情境監控

本文提供內容監視的相關資訊,這是在 Windows 10 (WDDM 2.0) 中引進的。

內容監控允許在 GPU 引擎之間或跨 CPU 核心和 GPU 引擎進行靈活同步。 受監視的柵欄物件是柵欄同步處理的進階形式,可讓 CPU 核心或 GPU 引擎發出訊號或等候特定柵欄物件。

受監控的柵欄創建

Direct3D 執行階段會呼叫使用者模式驅動程式 (UMD) 的 pfnCreateSynchronizationObject2Cb 回呼,以建立受監視的柵欄物件,並具有 D3DDDICB_CREATESYNCHRONIZATIONOBJECT2 結構。 此結構的 Info 成員是描述要建立的同步處理物件的 D3DDDI_SYNCHRONIZATIONOBJECTINFO2 結構。 執行階段會將 Info.Type 設定為 D3DDDI_MONITORED_FENCE ,以指出要在建立期間使用 Info.MonitoredFence 結構。

建立的受監視柵欄物件具有下列屬性:

  • 初始柵欄值。
  • 指定其等候和訊號行為的旗標。

建立時,會傳回受監視的柵欄物件,其中包含下列資訊:

項目 說明
hSync物件 同步處理物件的控制碼。 此控制碼會用於 Dxgkrnl 的後續呼叫中。
FenceValueCPUVirtualAddress CPU 的唯讀映射柵欄值(64 位)。 此位址在支援 I/O 一致性的平臺上從 CPU 的觀點對應為 WB(可快取),而在其他平臺上則對應為 UC(未快取)。 允許 CPU 通過讀取此內存位置來跟踪柵欄進度。 不允許 CPU 寫入此記憶體位置。 若要發出柵欄訊號,CPU 必須呼叫 SignalSynchronizationObjectFromCpuCb。 支援 IoMmu 的介面卡應該使用此位址進行 GPU 存取。 在此情況下,位址會映射為讀寫。
FenceValueGPUVirtualAddress GPU 柵欄值 (64 位) 的讀取/寫入對應。 此位址會對應為在支援它的平臺上需要 I/O 一致性。 為了向柵欄發出信號,允許 GPU 直接寫入此 GPU 虛擬地址。 IoMmu GPU 不應使用此位址。

柵欄值是 64 位值,其各自的虛擬位址在 64 位邊界上對齊。 GPU 應該宣告它們是否能夠以原子方式更新由 CPU 可見的 64 位元值,這是透過新增的DXGK_VIDSCHCAPS標誌No64BitAtomics來實現的。 如果 GPU 只能以原子性地更新 32 位值,OS 會自動處理柵欄回繞情況。 不過,它會設定一個限制,即未完成的等候和訊號柵欄值與最後一個訊號柵欄值的距離不能超過 UINT_MAX/2。

GPU 訊號

如果 GPU 引擎無法使用其虛擬位址寫入受監視的柵欄,UMD 會使用 SignalSynchronizationObjectFromGpuCb 回呼,將軟體訊號封包排入 GPU 上下文的佇列。

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

當命令緩衝區在 GPU 上完成執行時, Dxgkrnl

  • 瀏覽具有等待中的柵欄物件清單,這些等候可以為此程式發出訊號。
  • 讀取其目前的柵欄值。
  • 判斷是否有任何等待需要被解除。

GPU 等待

若要等候 GPU 引擎上受監視的柵欄,UMD 必須先排清其擱置的命令緩衝區,然後呼叫 WaitForSynchronizationObjectFromGpuCb ,以指定柵欄物件 (hSyncObject) 和等候的柵欄值。 Dxgkrnl 將依賴關係排入其內部資料庫的佇列,然後立即返回 UMD,以便可以繼續將等候操作後的工作排入佇列。 在等待作業之後提交的命令緩衝區不會排程執行,直到滿足等待作業為止。

CPU訊號

已新增 SignalSynchronizationObjectFromCpuCb 回呼,以允許 CPU 發出受監視柵欄物件的訊號。 當 CPU 發出受監視柵欄物件的訊號時, Dxgkrnl 會使用訊號值更新柵欄記憶體位置。 任何使用者模式讀取器都會立即看到此值,並立即解除任何已滿足條件的等待。

CPU 等候

已新增 WaitForSynchronizationObjectFromCpuCb 回呼,以允許 CPU 在受監視的柵欄物件上等候。 有兩種形式的等候作業可供使用:

  • 在第一種形式中,WaitForSynchronizationObjectFromCpuCb 會阻塞直到等候條件被滿足為止。
  • 在第二種形式中, WaitForSynchronizationObjectFromCpuCb 會取得 CPU 事件的控制碼,一旦滿足等候條件,就會發出訊號。