初始化與 Direct3D 第 11 版 DDI 的通訊
本節僅適用于 Windows 7 和更新版本,以及 Windows Server 2008 R2 和更新版本的 Windows 作業系統。
通訊初始化
若要初始化與使用者模式顯示驅動程式 DLL 第 11 版 DDI 的通訊,Direct3D 第 11 版執行時間會在 DLL 尚未載入時先載入 DLL。 Direct3D 執行時間接著會透過 DLL 的匯出資料表呼叫使用者模式顯示驅動程式 的 OpenAdapter10_2 函式,以開啟圖形介面卡的實例。 OpenAdapter10_2函式是 DLL 唯一匯出的函式。
注意
OpenAdapter10_2函式與OpenAdapter10函式相同,除了如何傳回驅動程式配接器特定函式的資料表之外:
- OpenAdapter10_2會傳回D3D10DDIARG_OPENADAPTER結構pAdapterFuncs_2成員中的資料表,其中pAdapterFuncs_2指向D3D10_2DDI_ADAPTERFUNCS結構。
- OpenAdapter10 會傳回 pAdapterFuncs 成員中 D3D10DDIARG_OPENADAPTER的資料表,其中 pAdapterFuncs 指向 D3D10DDI_ADAPTERFUNCS 結構。
OpenAdapter10_2 的設計目的是要讓驅動程式初始化更有效率。 您必須在 Direct3D 11 版驅動程式中 實作OpenAdapter10_2 。 您也可以在 Direct3D 10.1 版驅動程式中實作 OpenAdapter10_2 (,而不是 OpenAdapter10) ,以提高這些驅動程式的初始化效率。 如需在 Direct3D 10.1 版驅動程式中實作 OpenAdapter10_2 的詳細資訊,請參閱 版本探索支援。 OpenAdapter10_2 處理執行時間與驅動程式之間的版本設定和其他資訊的交換。
版本控制
OpenAdapter10_2 和驅動程式的配接器特定函式變更 Direct3D API 與 Direct3D DDI 之間的版本控制方式,會從 Direct3D 10 處理版本控制的方式 (,以取得 Direct3D 10 處理版本控制的詳細資訊,請參閱 初始化與 Direct3D 版本 10 DDI) 的通訊 。 除了依賴驅動程式OpenAdapter10_2函式失敗的 Direct3D API,以指出不支援特定版本 ( ,如同 OpenAdapter10_2) ,驅動程式必須明確列出其支援的 DDI 版本。 Direct3D 執行時間會呼叫使用者模式顯示驅動程式的 GetSupportedVersions 函式, (其中一個驅動程式的配接器特定函式) 來查詢驅動程式支援的 DDI 版本。
Direct3D 11 DDI 函式至少有兩個新的 DDI 版本。 每個 DDI 版本都會區分 DDI 是在 Windows Vista 或 Windows 7 上執行。 不過,Direct3D 11 DDI 的支援不一定表示與D3D_FEATURE_LEVEL_11相關聯的硬體功能完整支援。 驅動程式可以使用不支援 Direct3D 11 DDI 公開的其他功能的硬體來支援 Direct3D 11 DDI 的新執行緒功能,例如鑲嵌等等。 下列程式碼示範如何區分每個 DDI 版本:
// D3D11.0 on Vista
#define D3D11_DDI_MAJOR_VERSION 11
#define D3D11_0_DDI_MINOR_VERSION ...
#define D3D11_0_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_DDI_MINOR_VERSION)
#define D3D11_0_DDI_BUILD_VERSION ...
#define D3D11_0_DDI_SUPPORTED \
((((UINT64)D3D11_0_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_DDI_BUILD_VERSION) << 16))
// D3D11.0 on Windows 7
#define D3D11_0_7_DDI_MINOR_VERSION ...
#define D3D11_0_7_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_7_DDI_MINOR_VERSION)
#define D3D11_0_7_DDI_BUILD_VERSION ...
#define D3D11_0_7_DDI_SUPPORTED \
((((UINT64)D3D11_0_7_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_7_DDI_BUILD_VERSION) << 16))
#ifndef IS_D3D11_WIN7_INTERFACE_VERSION
#define IS_D3D11_WIN7_INTERFACE_VERSION( i ) (D3D11_0_7_DDI_INTERFACE_VERSION == i)
#endif
資訊交換
除了指定版本資訊之外,驅動程式 的 OpenAdapter10_2 函式也會在執行時間與驅動程式之間交換其他資訊。
在對驅動程式OpenAdapter10_2函式的呼叫中,執行時間會在D3D10DDIARG_OPENADAPTER結構的pAdapterCallbacks成員中提供pfnQueryAdapterInfoCb配接器回呼函式。 使用者模式顯示驅動程式應該呼叫 pfnQueryAdapterInfoCb 配接器回呼函式,以查詢顯示迷你埠驅動程式中的圖形硬體功能。
執行時間會呼叫使用者模式顯示驅動程式的 CreateDevice (D3D10) 函式, (其中一個驅動程式的配接器特定函式) 來建立顯示裝置來處理轉譯狀態集合並完成初始化。 初始化完成時,Direct3D 第 11 版執行時間可以呼叫 顯示驅動程式提供的 Direct3D 第 11 版函式,而使用者模式顯示驅動程式可以呼叫 執行時間提供的函式。
使用者模式顯示驅動程式的 CreateDevice (D3D10) 函式會以下列方式設定成員的 D3D10DDIARG_CREATEDEVICE 結構來呼叫,以初始化使用者模式顯示驅動程式第 11 版 DDI:
執行時間會將 Interface 設定為執行時間從使用者模式顯示驅動程式所需的介面版本。
執行時間會將 Version 設定為驅動程式可用來識別何時建置執行時間的數位。 例如,驅動程式可以使用版本號碼來區分使用 Windows Vista 發行的執行時間,以及後續 Service Pack 發行的執行時間,其中可能包含驅動程式所需的修正程式。
執行時間會設定 hRTDevice ,以指定驅動程式在驅動程式回呼回執行時間時應該使用的控制碼。
執行時間會設定 hDrvDevice ,以指定執行時間在後續驅動程式呼叫中使用的控制碼。
執行時間會在pKTCallbacks指向的 D3DDDI_DEVICECALLBACKS結構中,提供其裝置特定回呼函式的資料表。 使用者模式顯示驅動程式會呼叫執行時間提供的回呼函式,以存取顯示迷你埠驅動程式中的核心模式服務。
使用者模式顯示驅動程式會在p11DeviceFuncs指向的 D3D11DDI_DEVICEFUNCS結構中傳回其裝置特定函式的資料表。
執行時間會提供DXGIBaseDDI指向的DXGI_DDI_BASE_ARGS結構。 執行時間和使用者模式顯示驅動程式會將其 DirectX 圖形基礎結構 DDI 提供給此結構。
執行時間會將 hRTCoreLayer 設定為指定驅動程式回呼執行時間時應該使用的控制碼,以存取核心 Direct3D 10 功能 (,也就是呼叫 p11UMCallbacks 成員指定的函式) 。
執行時間會在p11UMCallbacks指向的 D3D11DDI_CORELAYER_DEVICECALLBACKS結構中,提供其核心回呼函式的資料表。 使用者模式顯示驅動程式會呼叫執行時間提供的核心回呼函式,以重新整理狀態。