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を呼び出します。
デバッグ レイヤーは、メモリ リークを一覧表示すると、フレンドリ名と共にオブジェクト インターフェイス ポインターの一覧を出力します。 既定のフレンドリ名は "<名前のない>" です。 フレンドリ名は、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 実装を使用します。 パイプラインがハードウェア デバイスから参照デバイスに切り替えられると、レンダリング操作はハードウェアとソフトウェアの両方で同時に実行されます。 ソフトウェア デバイスがレンダリングされるときに、リソースをシステム メモリにダウンロードする必要があります。 これにより、システム メモリにキャッシュされた他のリソースを削除して、容量を作る必要がある場合があります。
手記
この参照レイヤーへの切り替え機能は、Direct3D 10 および Direct3D 10.1 でのみサポートされ、Direct3D 11 以降のバージョンではサポートされなくなりました。
Thread-Safe レイヤー
このレイヤーは、マルチスレッド アプリケーションが複数のスレッドからデバイスにアクセスできるように設計されています。
Direct3D 10 アプリケーションは、デバイス機能を使用してデバイスの同期を制御できます。 これにより、アプリケーションはクリティカル セクションを有効または無効にし (マルチスレッド保護を一時的に有効または無効にする)、複数の Direct3D 10 API エントリ ポイントに対してクリティカル セクション ロックを取得/解放できます。 スレッド セーフ レイヤーは既定で有効になっています。 シングル スレッド アプリケーションの場合、スレッド セーフレイヤーはパフォーマンスに影響しません。
Direct3D 9 と Direct3D 10 の違い:
- Direct3D 9 とは異なり、Direct3D 10 API の既定値は完全にスレッド セーフです。
関連トピック