將虛擬位址對應至記憶體區段
顯示迷你埠驅動程式可以指定它所定義之每個記憶體空間或光圈空間區段,CPU 虛擬位址是否可以直接對應至區段中的配置,方法是在DXGK_SEGMENTDESCRIPTOR區段的Flags成員中設定 [旗標] 成員中的[cpuVisible位欄位旗標]。
若要將 CPU 虛擬位址對應至區段,區段應該具有透過 PCI 光圈的線性存取。 換句話說,區段內任何配置的位移應該與 PCI 光圈中的位移相同。 因此,視訊記憶體管理員可以根據指定區段內配置位移,計算任何配置的匯流排相對實體位址。
下圖說明虛擬位址如何對應至線性記憶體空間區段。
下圖說明虛擬位址如何對應至線性光圈空間區段的基礎頁面。
在將虛擬位址對應至區段的一部分之前,視訊記憶體管理員會呼叫 display miniport 驅動程式的 DxgkDdiAcquireSwizzlingRange 函式,讓驅動程式可以設定用來存取可能雜亂配置位的光圈。 驅動程式無法將位移變更為存取配置所在的 PCI 光圈,也無法將配置佔用在光圈中的空間量變更。 例如,如果驅動程式無法讓配置 CPU 可供存取, (例如,硬體可能用盡了未撥動的光圈) ,視訊記憶體管理員就會收回配置給系統記憶體,並讓應用程式存取該處的位。
如果使用者模式顯示驅動程式呼叫 pfnLockCb 函式來要求直接存取記憶體時,先前建立的配置內容位於系統記憶體中,則視訊記憶體管理員會將系統記憶體緩衝區傳回給使用者模式顯示驅動程式,而顯示迷你埠驅動程式則不涉及存取配置。 因此,顯示迷你埠驅動程式不會修改配置的內容,而且會維持不模糊的格式。 這表示當從視訊記憶體收回 CPU 存取配置時,顯示迷你埠驅動程式必須取消撥動配置,讓應用程式可以直接存取產生的系統記憶體位。
如果收回目前對應給直接應用程式存取之配置的 GPU 資源,配置的內容會傳輸到系統記憶體,讓應用程式可以繼續存取相同虛擬位址但不同實體媒體的內容。 若要設定傳輸,視訊記憶體管理員會呼叫 display miniport 驅動程式的 DxgkDdiBuildPagingBuffer 函 式來建立分頁緩衝區,而 GPU 排程器會呼叫驅動程式的 DxgkDdiSubmitCommand 函式,將分頁緩衝區排入 GPU 執行單位。 硬體特定的傳輸命令位於分頁緩衝區中。 如需詳細資訊,請參閱 提交命令緩衝區。 視訊記憶體管理員可確保視訊轉換至系統記憶體對應用程式看不見。 不過,驅動程式必須確定透過 PCI 光圈的配置位元組順序完全符合配置收回時的位元組順序。
對於光圈空間區段,配置的基礎位已經在系統記憶體中,因此在收回程式期間不需要傳輸 (不) 資料。 因此,如果應用程式直接存取位於光圈空間區段的 CPU 可存取配置,則無法撥動。
如果應用程式可透過 CPU 直接存取表面,但會在光圈空間區段中撥動,則顯示器驅動程式應該實作表面做為兩個不同的配置。 當使用者模式顯示驅動程式建立這類表面時,它可以呼叫pfnAllocateCb函式,並將D3DDDICB_ALLOCATE結構的NumAllocations成員設定為 2,並將D3DDDI_ALLOCATIONINFO結構pPrivateDriverData 成員設定為 D3DDDICB_ALLOCATE 的pAllocationInfo陣列中的pPrivateDriverData成員,以指向 (配置的相關私人資料,例如其) ) 。 GPU 將使用的配置包含撥動格式的位,而應用程式將存取的配置則包含未撥入格式的位。 視訊記憶體管理員會呼叫 display miniport 驅動程式的 DxgkDdiCreateAllocation 函式來建立配置。 顯示迷你埠驅動程式會針對從使用者模式顯示驅動程式傳遞的每個配置) ,解譯DXGK_ALLOCATIONINFO結構pPrivateDriverData成員中的私人資料 (。 影片記憶體管理員不會察覺配置的格式;它只會為配置特定大小和對齊方式的記憶體區塊。 呼叫使用者模式顯示驅動程式的 Lock 函式來鎖定介面進行處理會導致下列動作:
使用者模式顯示驅動程式會呼叫 pfnRenderCb 函式,以將命令緩衝區中的取消wizzle 作業提交至 Direct3D 執行時間,並開啟至顯示迷你埠驅動程式。
使用者模式顯示驅動程式會呼叫 pfnLockCb 函式來鎖定未撥開的配置。 請注意,使用者模式顯示驅動程式不得在 D3DDDICB_LOCK 結構的 Flags 成員中設定D3DDDILOCKCB_DONOTWAIT旗標。
pfnLockCb函式會等候,直到執行配置之間的傳輸 (不) 。
pfnLockCb函式會要求顯示迷你埠驅動程式取得未撥入配置的虛擬位址,並將虛擬位址傳回至 D3DDDICB_LOCKpData成員中的使用者模式顯示驅動程式。
使用者模式顯示驅動程式會將未撥開的配置虛擬位址傳回至 D3DDDIARG_LOCK pSurfData 成員中的應用程式。