次の方法で共有


Direct3D バージョン 11 DDI との通信の初期化

このセクションは、Windows 7 以降、および Windows Server 2008 R2 以降のバージョンの Windows オペレーティング システムのみを対象としています。

通信の初期化

ユーザー モード ディスプレイ ドライバー DLL のバージョン 11 DDI との通信を初期化するために、DLL がまだ読み込まれていない場合、Direct3D バージョン 11 ランタイムは最初に DLL を読み込みます。 Direct3D ランタイムは次に、DLL のエクスポート テーブルを介してユーザー モード ディスプレイ ドライバーの OpenAdapter10_2 関数を呼び出して、グラフィックス アダプターのインスタンスを開きます。 OpenAdapter10_2 関数は、DLL の唯一のエクスポート関数です。

Note

OpenAdapter10_2 関数は、ドライバーのアダプター固有の関数のテーブルを返す方法を除き、 OpenAdapter10 関数と同じです。

  • OpenAdapter10_2 は、 D3D10DDIARG_OPENADAPTER 構造体の pAdapterFuncs_2 メンバー内のテーブルを返します。ここで、 pAdapterFuncs_2D3D10_2DDI_ADAPTERFUNCS 構造体を指します。
  • OpenAdapter10 は、 D3D10DDIARG_OPENADAPTERpAdapterFuncs メンバー内のテーブルを返します。ここで、 pAdapterFuncsD3D10DDI_ADAPTERFUNCS 構造体を指します。

OpenAdapter10_2 は、ドライバーの初期化をより効率的にするように設計されています。 Direct3D バージョン 11 ドライバーに OpenAdapter10_2 を実装する必要があります。 また、 Direct3D バージョン 10.1 ドライバーに ( OpenAdapter10ではなく) OpenAdapter10_2を実装して、それらのドライバーの初期化効率を向上させることもできます。 Direct3D バージョン 10.1 ドライバーでの OpenAdapter10_2 の実装の詳細については、 「バージョン検出のサポート」を参照してくださいOpenAdapter10_2 は、ランタイムとドライバー間のバージョン管理やその他の情報の交換を処理します。

バージョン管理

OpenAdapter10_2 とドライバーのアダプター固有の関数は、Direct3D API と Direct3D DDI の間のバージョン管理の処理方法を Direct3D 10 がバージョン管理を処理する方法を変更します (Direct3D 10 でのバージョン管理の処理方法の詳細については、 「Direct3D バージョン 10 DDIとの通信の初期化」を参照してください)。 (OpenAdapter10_2 と同様 に) 特定のバージョンのサポートがないことを示すために、ドライバーの OpenAdapter10_2関数の障害に依存する Direct3D API の代わりに、ドライバーはサポートする DDI バージョンを明示的に一覧表示する必要があります。 Direct3D ランタイムは、ユーザー モード ディスプレイ ドライバーの GetSupportedVersions 関数 (ドライバーのアダプター固有の関数の 1 つ) を呼び出して、ドライバーがサポートする DDI バージョンを照会します。

Direct3D 11 DDI 関数には、少なくとも 2 つの新しい 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 関数の呼び出しでは、ランタイムは D3D10DDIARG_OPENADAPTER 構造体の pAdapterCallbacks メンバーに pfnQueryAdapterInfoCb アダプターコールバック関数を 提供 します。 ユーザー モードディスプレイ ドライバーは、 pfnQueryAdapterInfoCb アダプターコールバック関数を呼び出して、ディスプレイ ミニポート ドライバーからグラフィックス ハードウェア機能を照会する必要があります。

ランタイムは、ユーザー モード ディスプレイ ドライバーの CreateDevice(D3D10) 関数 (ドライバーのアダプター固有の関数の 1 つ) を呼び出して、レンダリング状態のコレクションを処理し、初期化を完了するためのディスプレイ デバイスを作成します。 初期化が完了すると、Direct3D バージョン 11 ランタイムは ディスプレイ ドライバー提供の Direct3D バージョン 11 関数を呼び出すことができます。また、ユーザー モードディスプレイ ドライバーは ランタイム提供の関数を呼び出すことができます。

ユーザー モード ディスプレイ ドライバーの CreateDevice(D3D10) 関数は、ユーザーモード ディスプレイ ドライバーのバージョン 11 DDI を初期化するために次の方法でメンバーを設定する D3D10DDIARG_CREATEDEVICE 構造体で呼び出されます。

  • ランタイムは、 ユーザー モード のディスプレイ ドライバーからランタイムが必要とするインターフェイスのバージョンにインターフェイスを設定します。

  • ランタイムは、ランタイムがビルドされるタイミングを識別するためにドライバーが使用できる番号に バージョン を設定します。 たとえば、ドライバーはバージョン番号を使用して、Windows Vista でリリースされたランタイムと、後続のサービス パックでリリースされたランタイムを区別できます。これには、ドライバーに必要な修正プログラムが含まれている可能性があります。

  • ランタイムは、ドライバーがランタイムに再度呼び出すときにドライバーが使用するハンドルを指定するように hRTDevice を設定します。

  • ランタイムは、後続のドライバー呼び出しでランタイムが使用するハンドルを指定するように hDrvDevice を設定します。

  • ランタイムは、pKTCallbacks がポイントする D3DDDI__DEVICECALLBACKS 構造体内のデバイス特有のコールバック関数の テーブル を提供します。 ユーザー モードのディスプレイ ドライバーは、ディスプレイ ミニポート ドライバーのカーネル モード サービスにアクセスするランタイム指定のコールバック関数を呼び出します。

  • ユーザー モード ディスプレイ ドライバーは、 p11DeviceFuncs がポイントする D3D11DDI_DEVICEFUNCS 構造体内のデバイス固有の関数のテーブルを返します。

  • ランタイムは、 DXGIBaseDDI がポイントする DXGI_DDI_BASE_ARGS 構造体を提供します。 ランタイムとユーザー モードのディスプレイ ドライバーは、この構造体に DirectX グラフィックス インフラストラクチャ DDI を提供します。

  • ランタイムは、ドライバーがコア Direct3D 10 機能にアクセスするためにランタイムに戻るときにドライバーが使用するハンドルを指定するように hRTCoreLayer を設定します (つまり、 p11UMCallbacks メンバーが指定する関数の呼び出し)。

  • ランタイムは、p11UMCallback がポイントする D3D11DDI_CORELAYER_DEVICECALLBACKS 構造体内のコア コールバック関数の テーブル を提供します。 ユーザー モードのディスプレイ ドライバーは、ランタイムが提供するコア コールバック関数を呼び出して状態を更新します。