Windows Advanced Rasterization Platform (WARP) ガイド

この記事では、Windows Advanced Rasterization Platform (WARP) と WARP の次の側面について説明します。

WARP とは

WARP は、高速で完全に準拠したソフトウェア ラスタライザーです。 これは、Direct3D 11 ランタイムによって導入された DirectX グラフィックス テクノロジのコンポーネントです。 Direct3D 11 ランタイムは、[KB971644] 更新プログラムを使用して Windows 7、Windows Server 2008 R2、および Windows Vista にインストールされます。 Windows 8、Windows 10、上記のWindows Server 2012&、およびWindows RTには、更新されたバージョンの WARP を持つ Direct3D 11.1 ランタイムが含まれます。 Windows 10 Fall Creators Update (1709) には、Direct3D 11 と Direct3D 12 ランタイムの両方をサポートする WARP のバージョンが含まれています。

WARP の利点

WARP には、次の利点があります。

カスタム ソフトウェア ラスタライザーの必要性を取り除く

WARP を使用すると、ハードウェア用にアプリケーションをチューニングする代わりに、カスタム ソフトウェア ラスタライザーを構築し、アプリケーションを調整する必要がなくなります。 単一の汎用ソフトウェア ラスタライザーを提供することで、さまざまな機能を備えたハードウェアまたはソフトウェアで実行するために、イメージ レンダリング アルゴリズムを複数の方法で記述する必要がなくなります。 パフォーマンスやスケーリングを向上させるために、複数の方法でアルゴリズムを実装できます。ただし、これらのアルゴリズムの実装に使用される API またはレンダリング アーキテクチャを変更する必要はありません。 代わりに、同じように見え、ハードウェアまたはソフトウェアで適切に動作する優れた Direct3D 10 以降のアプリケーションを作成することに集中できます。

グラフィックス ハードウェアからの最大パフォーマンスの有効化

アプリケーションがハードウェア上で効率的に実行されるようにチューニングされると、WARP でも効率的に実行されます。 逆も当てはまります。WARP で適切に動作するようにチューニングされたアプリケーションは、ハードウェアで適切に動作します。 Direct3D 10 以降を非効率的に使用するアプリケーションは、異なるハードウェアで効率的にスケーリングできない可能性があります。 WARP にはハードウェアと同様のパフォーマンス プロファイルがあるため、大規模なバッチ用にアプリケーションをチューニングし、状態の変更を最小限に抑え、ポイントまたはロックの同期を解除すると、ハードウェアと WARP の両方にメリットがあります。

Direct3D ハードウェアを使用できない場合のレンダリングの有効化

WARP を使用すると、次のようなハードウェア実装が望ましくない、または使用できないさまざまな状況で高速レンダリングが可能になります。

  • ユーザーが Direct3D 対応ハードウェアを持っていない場合
  • アプリケーションがサービスとして、またはサーバー環境で実行される場合
  • アプリケーションが他の用途のために Direct3D ハードウェア リソースを予約する場合
  • ビデオ カードがインストールされていない場合
  • ビデオ ドライバーが使用できない場合、または正しく動作していない場合
  • ビデオ カードがメモリ不足、ハング、または初期化に必要なシステム リソースが多すぎる場合

ソフトウェア レンダリングに既存のリソースを活用する

Direct3D 10 以降のシェーダー ベースのイメージ レンダリングを利用するのに役立つ、膨大なコミュニティ、多くの書籍、Web サイト、SDK、サンプル、ホワイト ペーパー、メーリング リスト、その他のリソースがあります。 ソフトウェア フォールバックとして WARP を使用すると、ハードウェアに関する既存の知識を使用して、ハードウェアまたはソフトウェアで実行するときのアプリケーションのパフォーマンスを向上させることができます。 さらに、グラフィックス カード ベンダーや DirectX SDK の優れたツールの多くは、グラフィックス アプリケーションのパフォーマンスの問題を設計、ビルド、開発、デバッグ、分析するのに役立ちます。 これらのツールと知識は、WARP を使用するときにハードウェアとソフトウェアの両方を対象とするアプリケーション開発に役立つようになりました。

グラフィックス ハードウェアを必要としないシナリオの有効化

さまざまなアルゴリズムとアプリケーション (画像処理アルゴリズム、印刷、リモート処理、仮想 PC などのエミュレーター、高品質のフォント レンダリング、グラフ、グラフなど) は、通常、ハードウェアに依存しないため、CPU 用に最適化されています。 WARP を使用すると、これらのアルゴリズムとアプリケーションを実行し、ソフトウェアで完全に実行できる 1 つのアーキテクチャを使用できます。ただし、ハードウェア アクセラレーションが使用可能な場合は、それを利用できます。

DirectX グラフィックス プラットフォームの完了

WARP を使用すると、Direct3D 10 以降のグラフィックス ハードウェアを搭載していないコンピューターでも、Direct3D 10 以降のすべてのグラフィックス機能にアクセスできます。 Direct3D 10 の機能ビット (キャップ) が削除されました。つまり、Direct3D 10 以降ではこの可用性が保証されるため、グラフィックス機能がグラフィックス ハードウェアから使用できるかどうかを確認する必要がなくなります。 これで、さまざまなビデオ カードのすべての機能を使用して、アプリケーションが動作し、あらゆる場所で同じように見えるようになります。 これらのアプリケーションのパフォーマンスをスケーリングするには、ローエンドのビデオ カードで高価なグラフィックス機能を無効にするか、小さなターゲットにレンダリングするだけです。

WARP の機能と要件

WARP は、Direct3D 10 および 10.1 のすべての機能を完全にサポートします。 たとえば、WARP では、次の最も重要な機能がサポートされています。

  • Direct3D 10 および 10.1 仕様のすべての精度要件
  • Direct3D 11 を機能レベル 9_1、9_2、9_3、10_0、および 10_1 と共に使用する場合 (機能レベルの詳細については、「 D3D_FEATURE_LEVEL」を参照してください)
  • マルチサンプル レンダー ターゲットや浮動小数点サーフェスからのサンプリングなど、すべてのオプションのテクスチャ形式
  • アンチエイリアシング、最大 8 倍のマルチサンプル アンチエイリアシング (MSAA) までの高品質レンダリング
  • 異方性フィルタリング
  • 32 ビットおよび 64 ビット アプリケーションと大きなアドレス対応 32 ビット アプリケーション

Windows 7 SP1 または Windows Server 2008 R2 SP1 に Windows 7 用プラットフォーム更新プログラム をインストールすると、そのオペレーティング システムには Direct3D 11.1 ランタイムと、 機能レベル 9_1、9_2、9_3、10_0、10_1、11_0 で使用する場合に Direct3D 11.x をサポートする WARP のバージョンが含まれます。

上記のWindows 8、Windows 10、Windows Server 2012&、Windows RTには、Direct3D 11.1 ランタイムと新しいバージョンの WARP が含まれます。 このバージョンでは、 機能レベル 9_1、9_2、9_3、10_0、10_1、11_0、11_1 で使用する場合、Direct3D 11.x がサポートされます。

Windows 10 Fall Creators Update (1709) には、機能レベル 12_0 と 12_1 Direct3D 12サポートする新しいバージョンの WARP が含まれています。

WARP の最小コンピューター要件は、Windows Vista の場合と同じです。具体的には次のとおりです。

  • 最小 800 MHz CPU
  • MMX、SSE、または SSE2 は必要ありません
  • 最小 512 MB の RAM

WARP の使用方法

Direct3D 12の場合、WARP デバイスを作成するには、最初に WARP アダプターを識別する必要があります。 これを容易にするために、DXGI 1.4 には IDXGIFactory4::EnumWarpAdapter メソッドが 用意されています。 その後、WARP アダプターを D3D12CreateDevice に提供して、WARP デバイスを作成できます。

Direct3D 10、10.1、および 11 コンポーネントでは、デバイスを作成するときに指定できる追加のドライバーの種類を使用できます (たとえば、 D3D11CreateDevice 関数を呼び出すとき)。 そのドライバーの種類が D3D10_DRIVER_TYPE_WARP または D3D_DRIVER_TYPE_WARP。 そのドライバーの種類を指定すると、ランタイムは WARP デバイスを作成し、ハードウェア デバイスを初期化しません。

WARP は参照ラスタライザーと同じソフトウェア インターフェイスを Direct3D に使用するため、参照ラスタライザーでの実行をサポートできる Direct3D アプリケーションは WARP を使用してテストできます。 WARP を使用するには、D3d10warp.dllの名前を D3d10ref.dll に変更し、サンプルまたはアプリケーションと同じフォルダーに配置します。 次に、ref に切り替えると、WARP レンダリングが表示されます。

WARP の名前を D3d10ref.dll に変更し、それを C:\Program Files (x86)\Microsoft DirectX SDK (2010 年 6 月)\Samples\C++\Direct3D\Bin\x86 に配置した場合は、サンプルの "Toggle Ref" ボタンをクリックするか、コマンド ラインで /ref を指定してサンプルを実行することで、WARP に対してすべての DirectX サンプルを実行できます。

Direct3D を使用できるすべてのアプリケーションで WARP を使用できます。 これには、次の種類のアプリケーションが含まれます。

カジュアル ゲーム

通常、ゲームには単純なレンダリング要件があります。 ただし、ハードウェア アクセラレーションが必要になる可能性がある印象的な視覚効果の使用も必要です。 Windows の最も売れているゲーム タイトルの大部分は、シミュレーションまたはカジュアル ゲームのいずれかであり、どちらもハイ パフォーマンス グラフィックスを必要としていません。 ただし、どちらのスタイルのゲームも、最新のシェーダーベースのグラフィックスとハードウェアでスケーリングする機能の恩恵を大きく受けます。

既存のゲーム以外のアプリケーション

大量のグラフィカル アプリケーションでは、レンダリング レイヤーに最小限のコード パスが必要です。 WARP を使用すると、これらのアプリケーションは、多数のコンピューター構成をターゲットにできる 1 つの Direct3D コード パスを実装できます。

高度なレンダリング ゲーム

ゲーム開発者は、グラフィックスカードまたはドライバー固有のレンダリング エラーを分離したい場合があります。 したがって、非常にグラフィカルに要求の厳しいゲームであっても、すべてのゲームは WARP を使用してコンテンツをレンダリングできることから恩恵を受けることができます。 WARP を使用して、検出されたビジュアル成果物が、ハードウェアまたはドライバーに関するエラーまたは問題をレンダリングしているかどうかを検証できます。

その他のアプリケーション

WARP のターゲット アプリケーションには、現在 Direct3D 10 または Direct3D 10.1 を使用していない可能性があるアプリケーションも含まれます。 これらのターゲット アプリケーションには、すべてのコンピューターで常に動作する必要があるアプリケーション、CPU と GPU バージョンの画像処理アルゴリズムを記述しない画像処理アプリケーション、GPU の速度や使用が重要でない画像処理アルゴリズム (印刷など)、高度な 3D グラフィックスを表示するエミュレーターと仮想環境が含まれます。

WARP アーキテクチャとパフォーマンス

WARP は、参照ラスタライザーのコードベースに基づいています。 そのため、WARP は Direct3D 10 以降と DXGI の両方に同じソフトウェア インターフェイスを使用します。 WARP は、Windows システム フォルダーにあるD3d10warp.dllの Windows 7 に含まれています。 WARP の 2 つのバージョンは、x86 と x64 バージョンの 64 ビット コンピューターにインストールされます。 WARP に含まれるコード ジェネレーターは、ユーザーが 64 ビット アプリケーションを実行するときに使用できる追加のレジスタを利用できるため、特定の状況では x64 バージョンの方が高速に実行される可能性があります。

WARP には、次の 2 つの高速リアルタイム コンパイラが含まれています。

  • HLSL バイトコードと現在のレンダリング状態を、パイプラインのジオメトリ シェーダー (GS)、頂点シェーダー (VS)、ピクセル シェーダー (PS) ステージのベクター コマンドの最適化されたストリームに変換する高レベルの中間言語コンパイラ。
  • これらのコマンドを受け取り、最適化された SSE2、SSE4.1、x86、x64、arm、arm64 アセンブリ コードを生成できる、高性能の Just-In-Time コード ジェネレーター。

WARP は、Windows Vista で導入されたスレッド プールと複雑なタスク管理と依存関係の追跡を使用して、レンダリング パイプラインのすべての部分を使用可能な CPU コア間で効率的に分散できるようにします。

WARP では遅延レンダリングが使用されます。 つまり、WARP では、すべての CPU リソースを効率的に使用するのに十分なデータが使用可能な場合にのみラスター化が行われるように、レンダリング コマンドをバッチ処理できます。 メイン アプリケーション スレッドでの作業は最小限に抑えられ、アプリケーションはできるだけ早くコマンドを送信できます。 アプリケーションもマルチスレッドであり、スレッド プールを使用している場合、WARP とアプリケーションの間で作業が均等に分散されます。

WARP コード ジェネレーターは、最新の CPU アーキテクチャを最大限に活用するように調整されています。 WARP は、コンピューターが SSE をサポートしていない場合でも、Windows Vista 以降のオペレーティング システムを実行できるすべてのコンピューターで実行されます。 ただし、WARP は SSE2 をサポートするコンピューター用に最適化されています。 また、AMD および Intel プロセッサの特定のアーキテクチャの最適化と、SSE 4.1 拡張機能のサポートも含まれています。

WARP では、グラフィックス ハードウェアを実行する必要はありません。 ハードウェアが使用できない、または初期化できない状況でも実行できます。

WARP の知識がなくても Direct3D 10 以降のハードウェアで実行するように設計および構築されたアプリケーションとサンプルは、WARP を使用して適切に動作する可能性があります。 ただし、使用可能なフレーム レートを実現するには、品質設定と解像度をできるだけ低くすることをお勧めします。 WARP を使用して、ハードウェアとソフトウェアの両方で適切に動作するアプリケーションを開発および調整できます。

WARP は並列実行に複数の CPU コアを使用するため、最新のマルチコア CPU で最適に実行されます。 また、SSE4.1 拡張機能がインストールされているコンピューターでも WARP の実行速度が大幅に向上します。 これらのハイエンド コンピューターは Windows 7 以降のオペレーティング システムの有効期間中により一般的になるため、Microsoft は 8 つ以上のコアと SSE4.1 を搭載したコンピューターに対して大幅なテストとパフォーマンス チューニングを行いました。

WARP が CPU で実行されている場合、グラフィックス カードに比べて、さまざまな方法で制限されます。 通常、CPU のフロントサイド バス速度は約 10 GB/秒以下です。 これに対し、グラフィックス カードには、多くの場合、20 ~ 100 GB/秒以上のグラフィックス帯域幅を使用する専用メモリがあります。 また、グラフィックス ハードウェアには、テクスチャ フィルター処理、形式圧縮解除、変換などの複雑でコストの高いタスクを、オーバーヘッドや電力コストをほとんどかからなく非同期的に実行できる固定機能ユニットもあります。 一般的な CPU でこれらの操作を実行すると、電力消費とパフォーマンス サイクルの両方の面でコストがかかります。

Intel Penryn ベースの 3.0 GHz Quad Core マシンの一般的なパフォーマンス数値は、WARP が多くのベンチマークでローエンドの統合 Direct3D 10 以降のグラフィックス GPU よりも優れている場合があることを示しています。 ローエンドのディスクリートグラフィックスハードウェアは、通常、これらのベンチマークを実行する際に WARP の 4 倍から 5 倍高速です。 これらのローエンドの統合 GPU またはディスクリート GPU は、CPU リソースの使用を最小限に抑えます。 ミッドレンジまたはハイエンドのグラフィックス カードは、多くのアプリケーションで WARP よりも大幅に高速です。特に、アプリケーションでこれらのグラフィックス カードが提供する並列処理とメモリ帯域幅を利用できる場合です。

WARPはグラフィックスハードウェアの代わりではありません。特にローエンドの Direct3D 10 以降のディスクリートハードウェアが安価になりました。 WARP の目的は、アプリケーションが Direct3D 互換レベルのハードウェアをターゲットにできるようにすることで、ハードウェア上でもソフトウェアでも、大幅に異なるコード パスやテスト要件を持たなくても済みます。

次の 2 つの表は、さまざまな CPU とグラフィックス カードを含む WARP のサンプル データを示しています。

最初の表は、Direct3D 10 Crysis が 800x600 で実行され、すべての品質設定が最も低いレベルで実行されている WARP サンプル データを示しています。

CPU Time Ave FPS 最小 FPS 最小フレーム 最大 FPS 最大フレーム数
Core i7 8 Core @ 3.0GHz 271.57 7.36 3.46 1966 15.01 995
Penryn 4 Core @ 3.0GHz 351.35 5.69 2.49 1967 10.95 980
Penryn 2 Core @ 3.0GHz 573.98 3.48 1.35 1964 6.61 988
コア 2 Duo @ 2.6GHz 707.19 2.83 0.81 1959 5.18 982
コア 2 Duo @ 2.4GHz 763.25 2.62 0.76 1964 4.70 984
コア 2 Duo @ 2.1GHz 908.87 2.20 0.64 1965 3.72 986
Xeon 8 Core @ 2.0GHz 424.04 4.72 1.84 1967 9.56 988
AMD FX74 4 コア @ 3.0 GHz 583.12 3.43 1.41 1967 5.78 986
Phenom 9550 4 コア @ 2.2 GHz 664.69 3.01 0.53 1959 5.46 987

2 番目の表は、さまざまなグラフィックス カードで同じテストを実行しているデータの例を示しています。

グラフィックス カード Time Ave FPS 最小 FPS 最小フレーム 最大 FPS 最大フレーム数
NVIDIA 8800 GTS 23.58 84.80 60.78 1957 130.83 1022
NVIDIA 8500 GT 47.63 41.99 25.67 1986 72.57 991
NVIDIA Quadro 290 67.16 29.78 18.19 1969 49.87 1017
NVIDIA 8400 GS 59.01 33.89 21.22 1962 51.82 1021
ATI 3400 53.79 37.18 22.97 618 59.77 1021
ATI 3200 67.19 29.77 18.91 1963 45.74 980
ATI 2400 PRO 67.04 29.83 17.97 606 45.91 987
Intel DX10 Integrated 386.94 5.17 1.74 1974 16.22 995

WARP 準拠

WARP は、Direct3D ハードウェア デバイスを検証するための標準的な Windows Hardware Quality Labs (WHQL) 準拠テストすべてに合格します。

WARP は、Direct3D 10 と Direct3D 10.1 のアプリケーションとベンチマークのスイートに対して、および DirectX、NVIDIA、AMD の SDK サンプルに対してテストされています。

WARP は、テストで Windows 用 の PIX デバッグおよび分析ツールを使用しました。Microsoft には、ハードウェアと WARP の比較に使用されるアプリケーションの単一フレーム キャプチャの大規模なライブラリがあります。 画像の大部分は、ハードウェアと WARP の間でほぼ同じように見えます。小さな違いが生じることがある場合は、Direct3D 10 仕様で定義されている許容範囲内にあることが判明します。