次の方法で共有


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 に Platform Update for Windows 7 をインストールすると、 そのオペレーティング システムには、Direct3D 11.1 ランタイムと、9_1、9_2、9_3、10_0、10_1 機能レベル 使用した場合に Direct3D 11.x をサポートする WARP のバージョンが含まれます。 と 11_0。

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) には、Direct3D 12 機能レベル 12_0 と 12_1 サポートする新しいバージョンの 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 で最適に実行されます。 WARP は、SSE4.1 拡張機能がインストールされているコンピューターでも大幅に高速に実行されます。 Microsoft は、8 つ以上のコアと SSE4.1 を搭載したコンピューターで、Windows 7 以降のオペレーティング システムの有効期間中にこれらのハイエンド コンピューターがより一般的になるため、大幅なテストとパフォーマンスチューニングを行いました。

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 時間 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.6 GHz 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 Core @ 2.2GHz 664.69 3.01 0.53 1959 5.46 987

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

ビデオカード 時間 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 ハードウェア品質ラボ (WHQL) 準拠テストすべてに合格します。

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

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