共用方式為


D3DKMTPresent 函式 (d3dkmthk.h)

D3DKMTPresent 函式會將目前命令提交至 Microsoft DirectX 圖形核心子系統, (Dxgkrnl.sys) 。

語法

NTSTATUS D3DKMTPresent(
  [in] D3DKMT_PRESENT *unnamedParam1
);

參數

[in] unnamedParam1

pData:描述要呈現之參數 之D3DKMT_PRESENT 結構的指標。

傳回值

D3DKMTPresent 會傳回 NTSTATUS 值,例如下列其中一個值:

傳回碼 描述
STATUS_SUCCESS 已成功執行目前 。
STATUS_DEVICE_REMOVED 圖形配接器已停止或顯示內容已重設。
STATUS_INVALID_PARAMETER 已驗證參數,並判斷為不正確。
STATUS_NO_MEMORY D3DKMTPresent 因為記憶體不足而無法完成。
STATUS_GRAPHICS_ALLOCATION_INVALID 主要表面控點因為顯示模式變更而失效。 如果 OpenGL 可安裝用戶端驅動程式 (ICD) 收到此錯誤碼,它應該重新開啟或重新建立主要句柄、以新的句柄取代命令緩衝區中的所有參考,然後重新提交緩衝區。
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE 轉譯裝置內容發生錯誤,D3DKMT_PRESENT指定的 hContext 成員。

注意

STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE錯誤碼不會指出啟動逾時偵測和復原 (TDR) 進程,或 GPU 停止回應。 例如,如果顯示迷你埠驅動程式指出從此裝置提交的 DMA 緩衝區造成錯誤,或視訊記憶體管理員無法分頁處理 DMA 緩衝區的所有配置,即使分割 DMA 緩衝區之後,DirectX 圖形核心子系統仍會將裝置放入錯誤狀態。 當裝置處於錯誤狀態之後,就無法再執行任何作業,而且必須終結並重新建立。 ICD 可以呼叫 D3DKMTGetDeviceState 函式來判斷錯誤更精確的原因。

備註

D3DKMTPresent 函式可能會傳回STATUS_INVALID_PARAMETER,視參數值 (的組合而定,也就是 pData 指向 ) D3DKMT_PRESENT 結構成員中的值。 下列清單描述可能導致 D3DKMTPresent 傳回STATUS_INVALID PARAMETER 最常見的參數值組合:

  • hDestination 成員為非 NULL,且下列至少一個條件成立:

    • pSrcSubRects 成員為 NULL
    • SubRectCnt 成員為 0。
    • 未設定 Flags 成員的 Blt 位欄位旗標。
    • 未設定 FlagsSrcRectValid 位字段旗標。
    • 已設定 FlagsColorFill 位欄位旗標。
    • 已設定 FlagsFlipFlipDoNotFlipFlipDoNotWaitFlipRestart 位字段旗標。
    • 已設定 FlagsSrcColorKeyDstColorKey 位欄位旗標。
    • hSource 成員等於 hDestination
    • 來源和目的地不是主要表面。
  • 已設定 Flags翻轉位欄位旗標,且下列至少一個條件成立:

    • 已設定 FlagsColorFill 位欄位旗標。
    • 已設定 FlagsBlt 位字段旗標。
    • 已設定 FlagsSrcColorKeyDstColorKey 位欄位旗標。
    • 已設定 FlagsSrcRectValidDstRectValid 位欄位旗標。
    • 已設定 Flags旋轉位欄位旗標。
    • 已設定 FlagsRestrictVidPnSource 位字段旗標。
    • 來源不是主要表面。
    • 顯示迷你埠驅動程式不支援 FlipInterval 成員指定的翻轉間隔。
    • 先前未呼叫 D3DKMTSetDisplayMode 函式。
  • 已設定 FlagsColorFill 位字段旗標,且下列其中一個條件成立:

    • pSrcSubRectsNULL
    • SubRectCnt 為 0。
    • 已設定 FlagsBlt 位字段旗標。
    • 已設定 FlagsFlipFlipDoNotFlipFlipDoNotWaitFlipRestart 位字段旗標。
    • 已設定 FlagsSrcColorKeyDstColorKey 位欄位旗標。
    • 已設定 FlagsSrcRectValid 位字段旗標。
  • 已設定 FlagsBlt 位字段旗標,且下列其中一個條件成立:

    • pSrcSubRectsNULL
    • SubRectCnt 為 0。
    • 已設定 FlagsColorFill 位欄位旗標。
    • 已設定 FlagsFlipFlipDoNotFlipFlipDoNotWaitFlipRestart 位字段旗標。

呼叫 D3DKMTPresent 來呈現 blit 樣式的使用者模式圖形驅動程式,且已設定 FlagsBlt 位字段旗標,必須特別小心,以確保所有先前提交的工作都會呈現至內容, (呈現的來源) 完全可清空。 若無法這麼做,可能會導致應用程式自行死結,或在某些情況下,使目前的使用者桌面死結。 如果內容只包含 GPU 同步處理物件的等候,其中對應的訊號已排入 GPU 排程器資料庫,且該訊號本身不在另一個無法讀取的等候後方,則內容會完全清空。 換句話說,如果系統中所有進程的用戶空間在呼叫 D3DKMTPresent 之後立即暫停,當相依轉譯鏈結已排入 GPU 排程器的佇列完成轉譯之後,就會滿足等候。 驅動程序絕對不能在相依於 GPU 等候的內容上呼叫 blit,該等候目前未滿足,而且預期會由來自此或其他進程的一些後續作業滿足。

範例

下列程式代碼範例示範 OpenGL ICD 如何使用 D3DKMTPresent 來呈現數據。

HRESULT Present(D3DKMT_HANDLE hDevice, 
                HWND hWnd, 
                RECT* pSrcRect,
                 RECT* pDstRect)
{
    D3DKMT_PRESENT PresentData = {0};

    PresentData.hDevice = hDevice;
    PresentData.Flags.Blt = 
    PresentData.Flags.DstRectValid = 
    PresentData.Flags.SrcRectValid = TRUE;
    PresentData.hWindow = hWnd;
    PresentData.DstRect = *pDstRect;
    PresentData.SrcRect = *pSrcRect;
    PresentData.SubRectCnt = 1;  
    PresentData.pSrcSubRects = pSrcRect; 

    if (NT_SUCCESS((*pfnKTPresent)(&PresentData))) {
        return S_OK;
    }
    return E_FAIL;
}

規格需求

需求
最低支援的用戶端 Windows Vista
目標平台 Universal
標頭 d3dkmthk.h (包含 D3dkmthk.h)
程式庫 Gdi32.lib
Dll Gdi32.dll

另請參閱

D3DKMTGetDeviceState

D3DKMTSetDisplayMode

D3DKMT_PRESENT