分割 DMA 緩衝區

視訊記憶體管理員會使用分割點,將顯示迷你埠驅動程式所提交的大型工作專案分割成較小的工作專案,這些工作專案需要較少的 GPU 資源才能執行。 例如,大型 DMA 緩衝區可能會參考一組可能不符合本機視訊記憶體或非本機記憶體的配置。 處理這類工作專案的唯一方法是將它分割成需要較少 GPU 資源的多個較小的工作專案。

注意 DMA 緩衝區分割和 DMA 緩衝區先占是不同的獨立概念。 顯示迷你埠驅動程式一律必須支援 DMA 緩衝區分割,即使在 GPU 上,DMA 緩衝區預先佔用也不可行。 在無法儲存和還原內容的 GPU 系統上,GPU 排程器會將 DMA 緩衝區的分割部分排程回,以確保分割部分不會與其他 DMA 緩衝區從不同的 GPU 內容交錯。 不過,分頁緩衝區應該在分割 DMA 緩衝區的部分之間提交,因為 DMA 緩衝區的分割部分之間需要分頁作業。 驅動程式用來建置應用程式 DMA 資料流程的每個分割點,都會由視訊記憶體管理員使用。 提交的 DMA 緩衝區應該在每個分割點之後重新設計足夠的 GPU 狀態,以考慮可能插入該位置的潛在分頁緩衝區。

若要指定分割點,顯示迷你埠驅動程式會針對 D3DDDI_PATCHLOCATIONLIST 的AllocationIndex成員所參考的每個配置,指定D3DDDI_PATCHLOCATIONLIST結構的SplitOffsetSlotId成員中的值。 若要追蹤特定 DMA 緩衝區內的配置使用量,視訊記憶體管理員會使用驅動程式對其DxgkDdiQueryAdapterInfo函式呼叫所提供的DXGK_DRIVERCAPS結構MaxAllocationListSlotId成員,建立陣列的必要維度。 這個陣列會初始化為零,並會在處理修補程式位置清單的分割部分專案時填滿。 修補程式位置D3DDDI_PATCHLOCATIONLISTSlotId成員表示必須更新資源資料表的資料列,而SplitOffset成員則表示 DMA 緩衝區中需要配置的位移。 DMA 緩衝區可以執行到 SplitOffset 所指定的點,而不需要 GPU 存取資源。 同樣地,如果新的修補程式位置分割部分專案參考相同的 SlotId,則先前的配置會由新的配置取代,而先前的配置不再需要 (亦即,先前的配置可以分頁) 。

在 DMA 緩衝區所需的資源中分頁時,視訊記憶體管理員會從第一個專案開始並向下移至最後一個專案,來處理修補位置清單。 驅動程式所填入 的D3DDDI_PATCHLOCATIONLIST 元素必須在其 SplitOffset 成員中包含值;元素會嚴格增加 (,也就是說,配置必須依資料流程) 使用的順序顯示。 在修補程式位置清單中參考的配置中,視訊記憶體管理員頁面會依提供的順序來參考。 到達視訊記憶體管理員因為記憶體不足而無法再分頁配置的位置時,視訊記憶體管理員會提交 DMA 緩衝區的目前部分以供執行。 從上一個分割點的開頭執行 DMA 緩衝區,到無法帶入的配置所指定的 SplitOffset 值。 提交之後,視訊記憶體管理員會使用資源資料表,判斷 DMA 資料流程中目前分割位移的必要配置清單。 資料表上的所有配置都會保留在其目前實體位置,而不再使用的其他配置可能會被收回。 然後,視訊記憶體管理員會繼續處理修補程式位置清單,可能會再次分割多次。

每次配置系結或未系結時,驅動程式都應該指定分割點。 若要指定配置未系結,驅動程式可以在DXGK_ALLOCATIONLIST結構的hDeviceSpecificAllocation成員中指定Null配置控制碼,並在相關聯D3DDDI_PATCHLOCATIONLISTSlotId成員中指定適當的值。 驅動程式應該將大型資源解除系結,以提高視訊記憶體管理員可以解決複雜記憶體放置問題的機會。

同樣地,驅動程式應該在每個分割點重新建構大型資源。 取得分割點時,視訊記憶體管理員會強制將先前系結的配置保留至先前的配置。 這會導致記憶體片段,導致無法解決可能尚未解決于先前系結配置限制時可能已解決的複雜記憶體放置問題。 在分割點計算狀態時,視訊記憶體管理員會決定 (SlotId (位置 識別碼) 重新編譯在該分割點 (,也就是每個與其他元素共用相同 SplitOffset 值的修補程式位置清單元素) ,並忽略此分割點上的放置限制。 例如,如果驅動程式使用 64 MB 紋理,請在每個分割點重新設計該紋理,可讓視訊記憶體管理員彈性地視訊記憶體管理員在必要時,在分割點之間移動該紋理。