機能のまとめ (Direct3D 9 for Windows Vista)
このドキュメントでは、DirectX グラフィックに関する Windows Vista の拡張機能について取り上げます。Windows Vista で DirectX を有効活用するには、DirectX SDK と同様に Windows Vista SDK もインストールする必要があります。Windows Vista に DirectX を使用するアプリケーションは、XPDM (XP ドライバー モード) ではなく、WDDM ドライバー (Windows Device Driver Model) を搭載したハードウェアを使用する必要があります。WDDM を実装していないドライバーは、Windows Vista DirectX グラフィック インターフェイスをインスタンス化できません。
Windows Vista の新しい DirectX グラフィック機能は、次のとおりです。
- デバイスの動作の変更
- マルチスレッド ソフトウェア頂点処理の無効化
- 1 ビット サーフェス
- 深度/ステンシル バッファーの読み取り
- リソースの共有
- ブレンディング前の sRGB 変換
- StretchRect の改善
- システム メモリーでのテクスチャーの作成
デバイスの動作の変更
デバイスは、2 つの状況下でのみ喪失するようになりました。つまり、ハードウェアがハングアップしているためにリセットされている場合、およびデバイス ドライバーが停止されている場合です。ハードウェアがハングアップしている場合、デバイスは IDirect3DDevice9Ex::ResetEx を呼び出すことでリセットできます。ハードウェアがハングアップすると、テクスチャー メモリーは失われます
ドライバーが停止された後は、IDirect9Ex オブジェクトを再作成してレンダリングを再開する必要があります。
プレゼンテーション領域がウィンドウ表示モードの別のウィンドウによって隠されている場合、または全画面のアプリケーションが最小化されている場合、IDirect3DDevice9Ex::PresentEx は S_D3DPRESENTATIONOCCLUDED を返します。全画面アプリケーションは、WM_ACTIVATEAPP コールバック メッセージを受信するとレンダリングを再開できます。
DirectX の以前のバージョンでは、アプリケーションにモード変更が発生した場合、これを復旧するには、デバイスをリセットして、すべてのデバイス メモリー リソースとスワップ チェーンを再作成するほかありませんでした。DirectX for Windows Vista では、モード変更の後に Reset を呼び出しても、テクスチャー メモリー のサーフェス、テクスチャー、およびステート情報は失われず、これらのリソースを再作成する必要がなくなりました。
マルチスレッド ソフトウェア頂点処理の無効化
ソフトウェア頂点処理 (swvp) のマルチスレッドを無効にする新しい Caps ビット (D3DCREATE_DISABLE_PSGP_THREADING) が追加されました。IDirect3D9::CreateDevice の動作フラグを生成するには、このマクロを使用します。
#define D3DCREATE_DISABLE_PSGP_THREADING
1 ビット サーフェス
テキスト グリフの処理に特に有益な、1 ビット サーフェス フォーマット タイプが新しく導入されました。この新しいフォーマットは、D3DFMT_A1 と呼ばれます。1 ビット サーフェスは、ピクセル別テクスチャーとして、または ComposeRects または ColorFill によって生成されるレンダー ターゲットとして使用するように設計されています。サーフェスの幅と高さに関しては別々の CAP はないため、実装では、2K テクセル x 8K テクセルの単一サイズのサーフェスをサポートしなけれなりません。
1 ビット サーフェスではテクセルごとのビット数が 1 ビットです。したがって 1 ビット サーフェスが 1 である場合はピクセルのすべての成分 (r,g,b,a) が 1 であり、0 の場合はすべての成分が 0 です。1 ビット サーフェスは ColorFill、UpdateSurface、および UpdateTexture の各 API で使用できます。
1 ビットのサーフェスが読み取られると、ランタイムはポイント サンプルと畳み込みフィルターリングのいずれかを実行します。畳み込みフィルターリングは調整可能です (「IDirect3DDevice9Ex::SetConvolutionMonoKernel」を参照)。
1 ビット サーフェスには次のようないくつかの制約があります。
- ミップマッピングがサポートされていない。
- 1 ビット サーフェスでは、sRGB データは読み取ることも書き込むこともできない。
- 1 ビット サーフェスは頂点テクスチャーとして、またはマルチサンプリング用には使用できない。
深度/ステンシル バッファーの読み取り
IDirect3DDevice9::CreateDepthStencilSurface または IDirect3DDevice9::GetDepthStencilSurface から取得したサーフェスから深度/ステンシル データを読み取る、または書き込むには、IDirect3DDevice9::UpdateSurface を使用します。
まず、IDirect3DDevice9::CreateOffscreenPlainSurface を使用してロック可能な深度のみ、またはステンシルのみのサーフェスを作成します。次のいずれかのフォーマットを使用します。
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
次に、深度/ステンシル バッファーと新しく作成されたロック可能な深度/ステンシル サーフェス間でデータを転送します。転送は、IDirect3DDevice9::UpdateSurface を使用して実行されます。
両方のサーフェスが LOCKABLE フォーマットであるとき、または両方がロック可能ではない場合、UpdateSurface は異常終了します。
存在しないデータを転送すると、エラーが発生します (たとえば、ロックできない深度のみのサーフェスから D3DFMT_S8_LOCKABLE サーフェスに転送した場合など)。
IDirect3DDevice9::UpdateSurface の残りの制約も適用されます。
リソースの共有
Direct3D リソースはデバイスまたはプロセス間で共有できるようになりました。これは、テクスチャー、頂点バッファー、インデックス バッファー、サーフェスを含む、あらゆる Direct3D リソース (レンダー ターゲット、深度ステンシル バッファー、オフスクリーン プレーン サーフェス など) に適用されます。共有するには、作成時に共有するリソースを指定して、リソースを既定のプール (D3DPOOL_DEFAULT) に配置する必要があります。リソースを共有向けに作成したら、プロセス内のデバイス間で、またはプロセス間で共有できます。
共有リソースを有効にするために、リソース作成 API は追加のハンドル パラメーターを持ちます。これは、共有リソースをポイントする HANDLE です。DirectX の以前のリビジョンでは、この引数は API 署名の一部でしたが、使用されていないため、NULL に設定する必要があります。Windows Vista を起動して、次の用法で pSharedHandle を使用してください。
- ポインター (pSharedHandle) を NULL に設定して、リソースを共有しないようにします。これは、Widnows Vista の前の DirectX の動作と同じです。
- 共有リソースを作成するには、初期化されていないハンドル (ポインター自身は NULL (pSharedHandle != NULL) ではありませんが、ポインターは NULL 値 (*pSharedHandle == NULL) をポイントします) を使用していずれかのリソース作成 API (以下参照) を呼び出します。API は共有リソースを生成し、有効なハンドルを返します。
- 共有リソースにアクセスするには、単純に共有リソースハンドルを使用します。
リソース作成 API は CreateTexture、CreateVolumeTexture、CreateCubeTexture、CreateRenderTarget、CreateVertexBuffer、CreateIndexBuffer、CreateDepthStencilSurface、および CreateOffscreenPlainSurface を含みます。
共有リソースの使用にはいくつかの制約があります。制限およびライセンスを次に示します。
- ロック可能なリソース (D3DUSAGE_DYNAMIC が指定されたテクスチャー、頂点バッファー、索引バッファーなど) では、共有時にパフォーマンスの劣化が生じることがある。ロック可能なレンダー ターゲットを共有できないハードウェアもあります。
- プロセス間の共有リソースへの参照は、元のリソースと同じサイズでなければならない。ハンドルをプロセス間で渡す場合は、参照が等しく作成できるようにサイズ情報を含めます。
- 共有されているプロセス間サーフェスは、同期メカニズムを提供しない。共有サーフェスへの読み取り/書き込み変更は、予想時にサーフェスの参照するプロセスのビューを反映できません。同期を提供するには、イベント クエリを使用するか、テクスチャーをロックします。
- 共有リソースを最初に作成するプロセス (共有リソースがロックできないリソースを開くあらゆるプロセス) のみがこれをロックできる。
- 共有リソースがロックされていない場合、他のプロセスにとってリソースが使用できるかどうかを確認する方法がない。
ブレンディング前の sRGB 変換
フレームバッファー ブレンディングの前に、デバイスがパイプライン データを sRGB に変換できるかどうかを確認できるようになりました。これは、デバイスがレンダリングターゲットの値を sRGB から変換することを意味します。変換がハードウェアでサポートされているかどうかを確認するには、次の CAP を確認します。
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
この CAP はブレンディング前の sRGB への変換をサポートするハードウェアを識別します。この能力は、デスクトップ ウィンドウ マネージャー (DWW) において fp16 フレーム バッファーから高品質レンダリングを行うために重要です。
StretchRect の改善
DirectX の以前のバージョンでは、StretchRect には、さまざまなドライバー (IDirect3DDevice9::StretchRect を参照) を収めるために多くの制約がありました。Windows Vista は、Windows Device Driver Model (WDDM) にビルドされています。この新しいドライバー モデルははるかに堅牢で、ドライバーはハードウェアの特殊なケースを処理することができます。
概して、唯一残っている制約とは、レンダー ターゲット用途を使用してレンダー ターゲットを作成する必要があるというものです (D3DUSAGE_RENDERTARGET)。この制約は、単純なコピーを実行する場合に問題となります (コピー元とコピー先が同じフォーマット、同じサイズであり、サブ矩形がない場合)。
システム メモリーでのテクスチャーの作成
システム メモリーの用法、割り当て、削除に関してより柔軟性が必要なアプリケーションは、システム メモリーのポインターからテクスチャーを作成できるようになりました。たとえば、アプリケーションは GDI システムメモリー のビットマップ ポインターから Direct3D テクスチャーを作成できます。
そのようなテクスチャーを作成するには、次の 2 つを行う必要があります。
- 十分なシステム メモリーを割り当てて、テクスチャー サーフェスを保持する。最小バイト数は、幅 x 高さ x ピクセルあたりのバイト数です。
- HANDLE* パラメーターのシステム メモリー サーフェスへのポインターのアドレスを IDirect3DDevice9::CreateTexture に渡す。
IDirect3DDevice9::CreateTexture の関数プロトコルは次のとおりです。
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle)
システムメモリーのテクスチャーには、次の制約があります。
- テクスチャー ピッチは、テクスチャー幅 x ピクセルあたりのバイト数と等しくなければならない。
- 圧縮フォーマット (DXT フォーマット) を使用する場合、アプリケーションは正しいサイズを割り当てる必要がある。
- 単一のミップマップ レベルのあるテクスチャーのみがサポートされている。
- Pool 引数の CreateTexture に渡された値は、D3DPOOL_SYSTEMMEM でなければならない。
- この API はテクスチャー内の提供されているメモリーをラップする。このメモリーは、これを使って処理するまでは再割り当てしないでください。