API レイヤー (Direct3D 10)
Direct3D 10 ランタイムは、コアの基本的な機能から始まり、外部レイヤーでオプションの開発者支援機能を構築するレイヤーで構築されます。
コア レイヤー
コア レイヤーは既定で存在します。API とデバイス ドライバーの間に非常に薄いマッピングを提供し、高頻度の呼び出しのオーバーヘッドを最小限に抑えます。 コア レイヤーはパフォーマンスに不可欠であるため、重要な検証のみを実行します。
残りのレイヤーは省略可能です。 一般的なルールとして、レイヤーは機能を追加しますが、既存の動作は変更しません。 たとえば、コア関数の戻り値は、インスタンス化されるデバッグ レイヤーとは無関係に同じですが、デバッグ レイヤーがインスタンス化された場合は追加のデバッグ出力が提供される場合があります。
D3D10CreateDevice を呼び出し、1 つ以上のD3D10_CREATE_DEVICE_FLAG値を指定して、デバイスが作成されたときにレイヤーを作成します。
デバッグ レイヤー
デバッグ レイヤーは、パラメーターと整合性に関して広範な追加の検証を行うためのものです (たとえばシェーダー リンケージとリソースのバインドの検証、パラメーターの整合性の検証、エラーの説明のレポート)。 デバッグ レイヤーによって生成される出力は、 ID3D10InfoQueue インターフェイス を使用してアクセスできる文字列のキューで構成されます ( 「ID3D10InfoQueue (Direct3D 10) を使用してデバッグ出力をカスタマイズする」を参照してください)。 コア レイヤーによって生成されたエラーは、デバッグ レイヤーによって警告で強調表示されます。
デバッグ レイヤーをサポートするデバイスを作成するには、(D3D10SDKLayers.DLLを取得するために) DirectX SDK をインストールし、 D3D10CreateDevice を呼び出すときに D3D10_CREATE_DEVICE_DEBUG フラグを指定する必要があります。 もちろん、デバッグ レイヤーを使用したアプリケーションの実行は、大幅に遅くなります。 D3DX10 API のデバッグ メッセージを有効または無効にするには、 D3DX10DebugMute を呼び出します。
デバッグ レイヤーによってメモリ リークがリストされると、オブジェクト インターフェイス ポインターのリストがフレンドリ名とともに出力されます。 既定のフレンドリ名は "<unnamed>" です。 フレンドリ名は、 ID3D10DeviceChild::SetPrivateData メソッドと D3Dcommon.h 内 のWKPDID_D3DDebugObjectName GUID を使用して設定できます。 たとえば、mytexture.jpgの SDKLayer 名で pTexture に名前を付ける場合は、次のコードを使用します。
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
一般的に、このような呼び出しは本番バージョンのコンパイル時に除外してください。
参照レイヤーへの切り替え
このレイヤーを使用すると、アプリケーションはハードウェア デバイス (HAL) と参照またはソフトウェア デバイス (REF) の間で切り替えることができます。 デバイスを切り替えるには、最初に参照レイヤーへの切り替えをサポートするデバイスを作成し ( D3D10CreateDevice を参照)、 ID3D10SwitchToRef::SetUseRef を呼び出す必要があります。
すべてのデバイスの状態、リソース、およびオブジェクトは、このデバイスの切り替えを通じて維持されます。 ただし、リソース データを正確に照合できない場合があります。 これは、参照デバイスで使用できないハードウェア デバイスで一部の情報を使用できるという事実が原因です。
ほぼすべてのリアルタイム アプリケーションは、パイプラインの HAL 実装を使用します。 パイプラインをハードウェア デバイスから参照デバイスに切り替えると、レンダリング操作はハードウェアとソフトウェアの両方で同時に実行されます。 ソフトウェア デバイスのレンダリング中は、リソースをシステム メモリにダウンロードする必要があります。 これには、システム メモリにキャッシュされている他のリソースを削除して、スペースを作成する必要がある場合があります。
Note
この参照レイヤーへの切り替え機能は、Direct3D 10 および Direct3D 10.1 でのみサポートされ、Direct3D 11 以降のバージョンではサポートされなくなりました。
Thread-Safe レイヤー
このレイヤーは、マルチスレッド アプリケーションが複数のスレッドからデバイスにアクセスできるように設計されています。
Direct3D 10 アプリケーションでは、デバイス関数を使用してデバイスの同期を制御できます。 これにより、アプリケーションはクリティカル セクションを有効または無効にし (マルチスレッド保護を一時的に有効または無効にする)、複数の Direct3D 10 API エントリ ポイントに対してクリティカル セクション ロックを取得/解放できます。 スレッド セーフ レイヤーは、既定で有効になっています。 シングル スレッド アプリケーションの場合、スレッド セーフレイヤーはパフォーマンスに影響しません。
Direct3D 9 と Direct3D 10 の違い:
- Direct3D 9 とは異なり、Direct3D 10 API の既定値は完全にスレッド セーフです。
関連トピック