DXGKDDI_PRESENT回呼函式 (d3dkmddi.h)
DxgkDdiPresent 函式會將來源配置的內容複製到主要介面 (,有時也會複製到螢幕外系統記憶體配置) 。
語法
DXGKDDI_PRESENT DxgkddiPresent;
NTSTATUS DxgkddiPresent(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}
參數
[in] hContext
複製資訊的裝置內容句柄。 顯示迷你埠驅動程式的 DxgkDdiCreateContext 函式先前在 dxgkDdiCreateContext 參數指向的 DXGKARG_CREATECONTEXT 結構 hContext 成員中傳回此句柄。
如果驅動程式不支持內容建立,Microsoft DirectX 圖形核心子系統會將內容的句柄取代為裝置的句柄。 顯示迷你連接埠驅動程式的 DxgkDdiCreateDevice 函式先前傳回DXGKARG_CREATEDEVICE 結構之 pCreateDevice 參數指向的 hDevice 成員中的裝置句柄。
[in/out] pPresent
包含複製作業相關信息 之DXGKARG_PRESENT 結構的指標。
傳回值
DxgkDdiPresent 會傳回下列其中一個值:
傳回碼 | Description |
---|---|
STATUS_SUCCESS | DxgkDdiPresent 已成功複製內容。 |
STATUS_NO_MEMORY或STATUS_INSUFFICIENT_RESOURCES | DxgkDdiPresent 無法配置完成所需的記憶體。 |
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | 目前直接記憶體存取 (DMA) 緩衝區已耗盡。 |
STATUS_GRAPHICS_CANNOTCOLORCONVERT | 顯示迷你埠驅動程式偵測到位區塊傳輸 (bitblt) 裝置無法執行的色彩轉換。 Microsoft Direct3D 運行時間可防止應用程式繼續,而且應用程式收到無法複製內容。 |
STATUS_PRIVILEGED_INSTRUCTION | DxgkDdiPresent 偵測到非特殊許可權的指令 (,也就是存取記憶體超出目前中央處理單位 [CPU] 進程許可權的指示) 。 |
STATUS_ILLEGAL_INSTRUCTION | DxgkDdiPresent 偵測到圖形硬體不支援的指示。 |
STATUS_INVALID_HANDLE | DxgkDdiPresent 偵測到命令緩衝區中的無效句柄。 |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | 顯示迷你埠驅動程式在 DMA 數據流中偵測到錯誤。 如果驅動程式傳回此錯誤碼,圖形內容裝置會處於遺失狀態。 |
備註
DirectX 圖形核心子系統會呼叫顯示迷你埠驅動程式的 DxgkDdiPresent 函式,以將內容從來源配置通常複製到主要介面。 (此函式也可以將內容複製到螢幕外系統記憶體配置。) 因為主要介面已鬆散定義,因此可以針對下列案例實作 DxgkDdiPresent :
- 視視窗的位置而定, DxgkDdiPresent 函式必須在位於相同適配卡或不同適配卡的不同主要上執行。
- 主要復本位於遠端監視器上,可透過終端機服務用戶端或 Microsoft NetMeeting 存取。
- 最近發生模式切換,且主要格式與來源格式不同,因此需要色彩轉換。 此外,因為視窗裁剪和排序,所以可以裁剪 DxgkDdiPresent 作業。
只要驅動程序支援下列抽象概念,就不需要顯示迷你埠驅動程式,才能注意上述案例的詳細數據:
- 在從視訊記憶體來源複製到主要視訊或系統記憶體目的地的複製作業中,從螢幕外系統記憶體來源複製到主要目的地、從主要來源到主要目的地的複本,或從主要來源複製到非螢幕系統記憶體目的地的複本,來源是由 pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 陣列元素的 hDeviceSpecificAllocation 成員指定,而 pPresent 結構之DXGKARG_PRESENT結構的 hDeviceSpecificAllocation 成員會指定來源DxgkDdiPresent 的參數指向 。 目的地是裝置的目前主要或螢幕外系統記憶體配置,是由 pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 陣列 DXGKARG_PRESENT元素的 hDeviceSpecificAllocation 成員所指定。 如果目的地等於來源 (,也就是目的地 == 來源) ,則複製作業是螢幕對螢幕位區塊傳輸 (bitblt) 。 因此,圖形子系統會將來源和目的地設定為下列值:
- destination != NULL (也就是 destination == nonNULL)
- source != NULL (也就是 source == nonNULL)
- 在從目前配置翻轉到另一個配置的視訊記憶體中,可由操作系統指定來源,並在 pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 陣列元素的 hDeviceSpecificAllocation 成員中設定DXGKARG_PRESENT。 圖形子系統會將來源和目的地設定為下列值:
- destination == NULL
- source != NULL (也就是 source == nonNULL)
注意 您可以從與目前掃描輸出配置相同的來源設定執行無作業翻轉。 無作業翻轉可用來在轉譯數據流中插入佇列等候垂直空白。 顯示迷你埠驅動程序應該插入硬體翻轉命令,就像是翻轉到另一個配置一樣。 - 在主要介面的色彩填滿作業中,不需要任何來源配置,而目的地是由 pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 陣列元素 DXGKARG_PRESENT的 hDeviceSpecificAllocation 成員所指定的主要配置句柄。 DXGKARG_PRESENT的 Color 成員通常是來自 D3DDDIFORMAT 列舉類型的D3DDDIFMT_A8R8G8B8格式。 不過,當主要格式為 Palettized RGB 時, Color 會包含調色盤索引。 因此,圖形子系統會將來源和目的地設定為下列值:
- destination != NULL (也就是 destination == nonNULL)
- source == NULL
然後,圖形子系統會取得新的 DMA 緩衝區,並以與先前 DxgkDdiPresent 呼叫相同的 RECT 結構清單再次呼叫驅動程式的 DxgkDdiPresent 函式。 驅動程式必須使用 pPresent 所指向之DXGKARG_PRESENT結構的 MultipassOffset 成員,以記錄在先前呼叫 DxgkDdiPresent 中完成 RECT 列表的進度量,讓驅動程式可以從停止新的 DMA 緩衝區的位置繼續。 當驅動程式的 DxgkDdiPresent 函式完成 RECT 結構清單時,它會傳回STATUS_SUCCESS。
除了產生 DMA 緩衝區之外,顯示迷你埠驅動程式還必須產生修補程式位置清單,指出 DMA 緩衝區中稍後在已知配置實體地址時必須修補的各種位移。 有時候,視訊記憶體管理員會提供驅動程序預先修補的資訊 (,也就是配置清單中來源和目的地) 的最後一個已知實體位址。
當視訊記憶體管理員提供這項資訊時,驅動程式必須判斷這些實體位址是 DirectX 圖形核心子系統將提供的最終位址,以產生 DMA 緩衝區。 圖形子系統可能不會在 DMA 緩衝區上呼叫 DxgkDdiPatch 函式,稍後再修補。 因此,驅動程式必須使用預先修補資訊來正確產生 DMA 緩衝區。 DXGKARG_PRESENT pAllocationList 陣列中第 N個元素的 SegmentId 成員為非零時,會針對元素 N 提供預先修補的資訊。
來源的主要配置是在 DxgkDdiCommitVidPn 函式中指定。 如果多個路徑源自指定的來源 (複製模式) ,則顯示迷你埠驅動程序必須確定輸出已正確旋轉,因為不同目標的路徑旋轉模式。 提供給 DxgkDdiPresent 的所有參數都是無從回應的旋轉。 來源和目標矩形可能是整個畫面,因為客戶端認為它 (例如 768 x 1024) 。
DxgkDdiPresent 應設為可分頁。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows Vista |
目標平台 | 桌面 |
標頭 | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |
另請參閱
DXGKARG_PRESENT