共用方式為


DXGI 簡報路徑

DXGI 為應用程式提供「正常運作」的呈現方法。例如,應用程式不需要執行任何特殊作業,即可在視窗模式和全螢幕模式之間轉換。 因為 DXGI 和使用者模式顯示驅動程式可以一起運作,以在多個範例消除鋸齒 (MSAA) 、監視旋轉、後端和前端緩衝區大小和格式的差異,以及全螢幕與視窗模式的組合之間保留呈現方式。 DXGI 的另一個優點是,它讓顯示器介面卡能夠有限地掃描 MSAA 和旋轉表面,因為 DXGI 提供「無狀態」DDI。 在無狀態 DDI 中,不需要介面卡的驅動程式,即可在 DDI 呼叫之間記錄資料。

簡報的基本工作是將資料從轉譯的背景緩衝區移至主要介面以供檢視。 此工作會在下列各節所述的不同情況下執行。

開啟 DWM 的視窗模式

在桌面 Windows Manager (DWM) 案例的視窗模式中,DXGI 會與 DWM 通訊,並開啟共用資源的檢視,該共用資源是 DXGI 產生者的轉譯目標,以及 DWM 的紋理。 除了應用程式建立的任何背景緩衝區之外,還會存在此共用資源。 DXGI 會呼叫驅動程式的 BltDXGI 函式,將資料從任何後端緩衝區移至共用表面。 這項作業可能需要延展、色彩轉換和 MSAA 解析。 不過,這項作業永遠不需要來源和目的地子矩形。 事實上,這些子矩形無法在 呼叫 BltDXGI中表示。 這個位區塊傳輸 (bitblt) 一律在pBltData參數指向之 DXGI_DDI_ARG_BLT結構的Flags成員中設定Present旗標。 設定 Present 旗標表示驅動程式應該以不可部分完成的方式執行作業。 驅動程式會以不可部分完成的方式執行 bitblt 作業,以將 DWM 讀取共用資源以進行組合時,將卸載的可能性降到最低。

關閉 DWM 的視窗模式

在具有 DWM 關閉案例的視窗模式中,DXGI 會呼叫驅動程式的PresentDXGI函式,並在pPresentData參數指向之 DXGI_DDI_ARG_PRESENT結構的Flags成員中設定Blt旗標。 在此 PresentDXGI 呼叫中,DXGI 可以在 hSurfaceToPresentSrcSubResourceIndex 成員中指定任何應用程式建立的背景緩衝區DXGI_DDI_ARG_PRESENT。 沒有額外的共用表面。

全螢幕模式

全螢幕案例比開啟或關閉 DWM 的視窗模式更複雜。

當 DXGI 轉換至全螢幕模式時,它會嘗試利用翻轉作業來減少頻寬並取得垂直同步處理。 下列條件可防止使用翻轉作業:

  • 應用程式未以符合主要表面的方式重新配置其背景緩衝區。

  • 驅動程式指定它不會掃描後端緩衝區 (例如,因為後端緩衝區會旋轉或是 MSAA) 。

  • 應用程式指定它無法接受 Direct3D 執行時間捨棄後端緩衝區的內容,而且只要求一個緩衝區, (鏈結中的總) 。 (在此情況下,DXGI 會配置後臺表面和主要表面;不過,DXGI 會使用驅動程式的 PresentDXGI 函式搭配 Blt 旗標 set.)

當上述其中一個情況發生時,因此會防止翻轉作業,以及呼叫具有Blt旗標集的驅動程式PresentDXGI函式也不適合 (,因為後端緩衝區與前端緩衝區完全不相符) ,DXGI 會配置Proxy 介面。 此 Proxy 介面符合前端緩衝區。 因此,Proxy 介面與前端緩衝區之間的翻轉會變成可能。 如果 Proxy 表面存在,DXGI 會使用驅動程式的 BltDXGI 函式,並將 Present 旗標清除 (0) ,將應用程式的背景緩衝區複製到 Proxy 介面。 在此 BltDXGI 呼叫中,DXGI 可能會要求轉換、延展和解析。 DXGI 接著會呼叫驅動程式的PresentDXGI函式,並在DXGI_DDI_ARG_PRESENT結構的Flags成員中設定Flip旗標,以移動 Proxy 表面位以掃描出。

若要通知使用者模式顯示驅動程式,驅動程式可以退出宣告掃描,驅動程式會收到選擇性和非選擇性掃描表面類別的資源建立呼叫。 選擇性的掃描表面是由DXGI_DDI_PRIMARY_OPTIONAL旗標所指定。 非選擇性的掃描表面未設定DXGI_DDI_PRIMARY_OPTIONAL旗標。 如需這些資源建立呼叫類型的詳細資訊,請參閱 在資源建立期間傳遞 DXGI 資訊

DXGI 會設定DXGI_DDI_PRIMARY_OPTIONAL旗標來建立 (的所有背景緩衝區表面,也就是選擇性表面) ,而且不會為任何前端緩衝區或 Proxy (表面設定旗標,也就是非選擇性表面) 。

如果已針對背景緩衝區設定DXGI_DDI_PRIMARY_OPTIONAL,驅動程式可以設定DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT旗標。 如需設定此旗標的詳細資訊,請參閱 在資源建立階段傳遞 DXGI 資訊。 如果驅動程式為選擇性緩衝區設定DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT,則除了造成 DXGI 呼叫驅動程式的 PresentDXGI 函式以外,沒有作用,而是使用 Blt 旗標集來呼叫驅動程式的 PresentDXGI 函式,而不是設定 Flip 旗標。

如果未為前端緩衝區或 Proxy 介面設定DXGI_DDI_PRIMARY_OPTIONAL,驅動程式仍可透過失敗資源建立呼叫,並DXGI_DDI_ERR_UNSUPPORTED錯誤碼和設定DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT,退出宣告掃描。

注意 如果建立呼叫失敗,但未設定DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT會保留給實際的失敗案例,例如記憶體不足。

DXGI 會在嘗試為 MSAA 或旋轉回緩衝區建立全螢幕簡報鏈結時,利用這個退出方法。 如果驅動程式不會掃描上述任一或兩種類型,驅動程式將會退出宣告。DXGI 接著會嘗試建立非旋轉表面、非 MSAA 表面,或兩者,直到驅動程式接受資源建立為止。 因此,DXGI 會逐漸回復,直到非選擇性表面完全符合前端緩衝區格式、樣本計數、旋轉和大小為止。

如果驅動程式退出宣告任何非選擇性表面,DXGI 仍然必須有方法,才能將位從背景緩衝區移至主要表面。 因此,如果驅動程式退出宣告 MSAA 和旋轉的掃描,則當 DXGI 呼叫驅動程式的 BltDXGI 函式時,驅動程式會加入宣告解析、旋轉或兩者。 當驅動程式退出宣告時,DXGI 會建立 Proxy 表面,並呼叫 BltDXGI 將資料從背景緩衝區移至該 Proxy 表面。 驅動程式不應該退出宣告此 Proxy 介面,因為 Proxy 完全符合前端緩衝區。

當應用程式在轉換成或移出全螢幕模式之後,不會重新建立其表面時,會發生下列不尋常的情況:

  • 如果應用程式在進入全螢幕模式時不會重新建立其表面,DXGI 會判斷後端緩衝區與前端緩衝區不符,即使它們確實符合格式、大小、旋轉和樣本計數也一樣。 此判斷的原因是作業系統需要在建立這些緩衝區時標記後端緩衝區,才能掃描到特定監視器。 視窗式背景緩衝區尚未明確指派給特定監視器,因為當進入全螢幕時,會動態選擇監視器。 因此,DXGI 不得透過翻轉作業) ,將這些背景緩衝區傳送至驅動程式以進行掃描 (。 此類型的應用程式通常會強制 DXGI 建立 Proxy 介面。

  • 如果應用程式在返回視窗模式時不會重新建立其背景緩衝區,DXGI 可能會呼叫驅動程式的 BltDXGIPresentDXGI (,並將 Blt 設定為) ,在先前為翻轉作業建立的介面上執行位。 這種情況不應該是問題,但這裡會提及以求完整性。 請注意,當應用程式轉換為視窗模式時,DXGI 一律會終結 Proxy 介面。

此外,請注意,當應用程式處於全螢幕模式時,應用程式可以動態調整其背景緩衝區的大小。 此動作會導致上述情況中描述的邏輯再次發生。 因此,Proxy 介面可能會建立和終結,而退出宣告可能會或可能不需要經過一段時間,即使應用程式維持全螢幕模式也一樣。 應用程式也可以動態將其輸出傳輸到另一個監視器,而不需要離開全螢幕模式。 因此,應用程式會產生切換回 bitblt 模式,因為應用程式的背景緩衝區已標記不同的監視器。

最後,如果驅動程式沒有退出宣告 MSAA 掃描,您應該注意與 MSAA 背景緩衝區相關的情況。在此情況下,驅動程式會退出宣告 MSAA。 因此,DXGI 會透過翻轉作業交換 MSAA 背景緩衝區和 MSAA 前端緩衝區,並透過相當於數位對類比轉換器 (DAC) 來執行解析作業。 在此情況下,應用程式可以在全螢幕模式中動態調整其背景緩衝區的大小,以強制 DXGI 切換呼叫驅動程式的 BltDXGI 函式。 由於後端緩衝區和前端緩衝區的 MSAA 特性仍然相符,DXGI 會指定驅動程式執行非解析,可能是色彩轉換、延展位。 然後,驅動程式應該複寫而不解析多重取樣至前端緩衝區,如果驅動程式選擇掃描 MSAA,則這是必要的。