次の方法で共有


機能の概要 (Windows Vista 用 Direct3D 9)

このドキュメントでは、特に DirectX グラフィックス用の Windows Vista 拡張機能を参照しています。 Windows Vista 用 DirectX の機能を開発するには、Windows Vista SDK と DirectX SDK をインストールする必要があります。 Windows Vista 用 DirectX を使用するアプリケーションでは、XPDM (XP ドライバー モデル) ではなく WDDM ドライバー (Windows デバイス ドライバー モデル) を使用するハードウェアを使用している必要があります。WDDM を実装していないドライバーは、Windows Vista DirectX グラフィックス インターフェイスをインスタンス化できません。

次のいずれかのセクションで、Windows Vista の新しい DirectX グラフィックス機能について説明します。

デバイスの動作の変更

デバイスは 2 つの状況でのみ失われるようになりました。ハードウェアがハングしているためにハードウェアがリセットされたとき、およびデバイス ドライバーが停止したとき。 ハードウェアがハングすると、 ResetEx を呼び出してデバイスをリセットできます。 ハードウェアがハングすると、テクスチャ メモリが失われます。

ドライバーが停止した後、レンダリングを再開するには、IDirect9Ex オブジェクトを再作成する必要があります。

ウィンドウ モードで別のウィンドウでプレゼンテーション領域が隠れている場合、または全画面表示アプリケーションが最小化されている場合、 PresentEx はS_D3DPRESENTATIONOCCLUDEDを返します。 全画面表示アプリケーションは、 WM_ACTIVATEAPP コールバック メッセージを受信したときにレンダリングを再開できます。

以前のバージョンの DirectX では、アプリケーションでモードの変更が発生したときに、デバイスをリセットし、すべてのビデオ メモリ リソースとスワップ チェーンを再作成する唯一の方法でした。 Windows Vista 用 DirectX では、モード変更後に Reset を呼び出しても、テクスチャ メモリサーフェス、テクスチャ、および状態情報が失われず、これらのリソースを再作成する必要はありません。

マルチスレッド ソフトウェア頂点処理の無効化

ソフトウェア頂点処理 (swvp) のマルチスレッドを無効にする新しいキャップ ビット (D3DCREATE_DISABLE_PSGP_THREADING) が追加されました。 このマクロを使用して、IDirect3D9::CreateDevice の動作フラグを生成します。

#define D3DCREATE_DISABLE_PSGP_THREADING

1 ビット サーフェス

テキスト グリフの処理に特に役立つ新しい 1 ビットのサーフェス形式の種類があります。 新しい形式は D3DFMT_A1 と呼ばれます。 1 ビットサーフェスは、ピクセル単位のテクスチャとして使用するか、ComposeRects または ColorFill によって生成されるレンダー ターゲット出力として使用するように設計されています。 サーフェスの幅と高さには個別のキャップはありません。実装では、2K テクセル x 8K テクセルである単一サイズのサーフェスをサポートする必要があります。

1 ビットサーフェスにはテクセルあたり 1 ビットがあります。したがって、ピクセルのすべてのコンポーネント (r,g,b,a) が 1 であることを意味し、0 は、すべてのコンポーネントが 0 であることを意味します。 1 ビット サーフェスは、ColorFill、UpdateSurface、UpdateTexture の API で使用できます。

1 ビットサーフェスが読み取られた場合、ランタイムはポイント サンプルまたは畳み込みフィルター処理を実行できます。 畳み込みフィルターは調整可能です ( 「SetConvolutionMonoKernel」を参照)。

1 ビット サーフェスにはいくつかの制限があります。

  • Mip マッピングはサポートされていません
  • sRGB データを読み取ったり、1 ビットサーフェスに書き込んだりすることはできません。
  • 1 ビット サーフェスは、頂点テクスチャまたはマルチサンプリングには使用できません。

深度/ステンシル バッファーの読み取り

IDirect3DDevice9::UpdateSurface を使用して、IDirect3DDevice9::CreateDepthStencilSurface または IDirect3DDevice9::GetDepthStencilSurface から取得したサーフェスから深度/ステンシル データを読み取りまたは書き込みます。

まず、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 に設定します。 これは、Windows Vista より前の DirectX の動作と同じです。
  • 共有リソースを作成するには、初期化されていないハンドル (ポインター自体は NULL (pSharedHandle != NULL) ではなく、ポインターが NULL 値 (*pSharedHandle == NULL) を指すリソース作成 API (下記参照) を呼び出します。 API によって共有リソースが生成され、有効なハンドルが返されます。
  • NULL 以外の共有リソース ハンドルを使用して以前に作成した共有リソースを開いてアクセスするには、pSharedHandle をそのハンドルのアドレスに設定します。 この方法で以前に作成した共有リソースを開いた後は、Direct3D 9 または Direct3D 9Ex API で返されたインターフェイスを、インターフェイスがその種類の一般的なリソースであるかのように使用できます。

リソース作成 API には、 CreateTextureCreateVolumeTextureCreateCubeTextureCreateRenderTargetCreateVertexBufferCreateIndexBufferCreateDepthStencilSurfaceCreateOffscreenPlainSurfaceCreateDepthStencilSurfaceExCreateOffscreenPlainSurfaceExCreateRenderTargetEx が含まれます。

共有リソースの使用にはいくつかの制限があります。 具体的な内容は次のとおりです。

  • 共有リソースを開くために使用する API は、共有リソースの作成に使用した API と一致している必要があります。 たとえば、 CreateTexture を 使用して共有リソースを作成した場合は、 CreateTexture を 使用してその共有リソースを開く必要があります。 CreateRenderTarget を 使用して共有リソースを作成する場合は、 CreateRenderTarget を 使用してその共有リソースを開く必要があります。
  • 共有リソースを開く場合は、D3DPOOL_DEFAULTを指定する必要があります。
  • ロック可能なリソース (D3DUSAGE_DYNAMICを持つテクスチャ、頂点バッファー、インデックス バッファーなど) では、共有時にパフォーマンスが低下する可能性があります。 ロック可能なレンダーターゲットは、一部のハードウェアで共有できません。
  • クロスプロセス共有リソースへの参照には、元のリソースと同じディメンションが必要です。 プロセス間でハンドルを渡す場合は、参照を同じように作成できるようにディメンション情報を含めます。
  • 共有のプロセス間サーフェスでは、同期メカニズムは提供されません。 共有サーフェスに対する読み取り/書き込みの変更は、必要に応じ、参照プロセスのサーフェスビューを反映しない場合があります。 同期を提供するには、イベント クエリを使用するか、テクスチャをロックします。
  • 最初に共有リソースを作成したプロセスのみが、それをロックできます (その共有リソースへの参照を開くプロセスではロックできません)。
  • 共有リソースがロックされている場合、リソースが使用可能かどうかを他のプロセスが確認するための検証はありません。

ブレンド前の sRGB 変換

チェックして、フレーム バッファー ブレンドの前に、デバイスがパイプライン データを sRGB に変換できるかどうかを確認できるようになりました。 これは、デバイスがレンダー ターゲットの値を sRGB から変換することを意味します。 変換がハードウェアでサポートされているかどうかを確認するには、次の上限をチェックします。

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

このキャップは、ブレンド前に sRGB への変換をサポートするハードウェアを識別します。 この機能は、デスクトップ ウィンドウ マネージャー (DWM) の fp16 フレーム バッファーからの高品質のレンダリングに重要です。

StretchRect の機能強化

以前のバージョンの DirectX では、StretchRect にはさまざまなドライバーに対応するための多くの制限があります (「IDirect3DDevice9::StretchRect」を参照)。 Windows Vista は、Windows デバイス ドライバー モデル (WDDM) 上に構築されています。 この新しいドライバー モデルははるかに堅牢であり、ドライバーはハードウェア内の特殊なケースを処理できます。

一般に、唯一の制限は、レンダー ターゲットをレンダー ターゲットの使用 (D3DUSAGE_RENDERTARGET) で作成する必要があるということです。 この制限は、単純なコピー (ソースと dest が同じ形式、同じサイズ、サブ四角形がない) を実行している場合に解除されます。

システム メモリでのテクスチャの作成

システム メモリの使用、割り当て、削除をより柔軟に行う必要があるアプリケーションで、システム メモリ ポインターからテクスチャを作成できるようになりました。 たとえば、アプリケーションは 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)

システム メモリ テクスチャには、次の制限があります。

  • テクスチャ ピッチは、テクスチャの幅とピクセルあたりのバイト数の倍にする必要があります。
  • 圧縮形式 (DXT 形式) を使用する場合、アプリケーションは正しいサイズを割り当てる必要があります。
  • 1 つのミップマップ レベルを持つテクスチャのみがサポートされます。
  • Pool 引数の CreateTexture に渡される値は、D3DPOOL_SYSTEMMEMする必要があります。
  • この API は、指定されたメモリをテクスチャでラップします。 このメモリの割り当てが完了するまで、このメモリの割り当てを解除しないでください。