Direct3D 12 概要 パート 2: パイプライン状態オブジェクト

同カテゴリーの次の記事

Direct3D 12 概要 パート 3: リソースバインド

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Direct3D 12 Overview Part 2: Pipeline State Object 」の日本語参考訳です。


このシリーズの パート 1 で述べたように、D3D12 の主な目的は CPU のオーバーヘッドを軽減することでした。それは、CPU にレンダリング・コマンドを送って実行した方が効率的であることを意味します。この記事で紹介する D3D 12 の新機能である、パイプライン状態オブジェクトや PSO がそれを可能にします。PSO に関して議論するには、まず D3D 11 のレンダリング・コンテキストに触れ、その後 D3D 12 における変更点を見ていきます。2014 年 4 月に開催された BUILD 2014 で、D3D 開発リードである Max McCullen 氏が紹介した D3D11 レンダリング・コンテキストを以下で見つけることができます。

D3D 11

矢印は、ゲームの要求に応じて、それぞれの状態を取得したり設定できる個別のパイプラインを示しています。一番下にある ‘other states’ は、ビューポートやシザー矩形などの固定関数の状態で構成されています。図の残りの部分に関連する機能については、この記事の以降のパートで触れていきます。この記事で議論を進める上で、図の左半分を見直す必要があります。D3D 11 のスモール状態オブジェクトは、D3D 9 から CPU のオーバーヘッドを軽減しましたが、ドライバーはこれらの小さなオブジェクトの状態を取得して、レンダリング時に GPU コードにそれらを組み合わせる追加の作業が残っていました。これをハードウェアのミスマッチによるオーバーヘッドと呼ぶことにします。 BUILD 2014 で紹介された別の図を見てみましょう。

Direct3D 11 – パイプラインの状態のオーバーヘッド

図の左側は、単純な状態を持つ D3D 9 スタイルのパイプラインを示しており、アプリケーションがその処理を行うために使用します。右側は、プログラムするハードウェアです。HW State 1 は、シェーダーコードを表現します。HW State 2 は、ラスタライザーをシェーダーにリンクするラスタライザーと制御フローの組み合わせです。HW State 3 は、ブレンドとピクセルシェーダー間のリンクです。D3D バーテックス・シェーダーは、HW State 1 と 2 に影響し、ラスタライザーは HW State 2、ピクセルシェーダーは State 1-3 に影響していることが分かります。大部分のドライバーは、アプリケーションと同時に呼び出しを行う必要はありませんが、アプリケーションが実際に必要とする処理を完了するまで、記録して延期しようとします。これは、「ダーティー」とマークされ CPU のオーバーヘッドを意味します。そして描画する際に、各オブジェクトの状態を確認し、ゲームの状況に合わせてハードウェアをプログラムする制御フローを備えています。つまり、追加の処理が沢山あり、それが複雑であれば複雑であるほど物事がうまくいかないということです。理想的には、ゲームがいったんパイプラインの状態を設定し、ドライバーはゲームが何を意図するかを知って一度だけハードウェアをプログラムします。下記の図では、D3D 12 パイプラインは、パイプライン状態オブジェクトと呼ばれます。

Direct3D 12 – パイプラインの状態の最適化

D3D 11 のコンテキストの描画では、other とマークされたいくつかの状態を記憶しています。D3D 12 開発チームは、制御中に PSO サイズを維持し、コンパイル済みの PSO に影響を与えずにゲームが描画ターゲットを変更できるのを実現しました。そのため、ビューポートやシザー矩形などは独立したまま残されて、プログラムされた残りのパイプラインを多くのハードウェアが扱うことができます。その結果 PSO は以下のようになります:

パイプライン・ステート・オブジェクト (PSO)

それぞれの個別の状態を設定および取得する代わりに、一つのポイントに置き換えられます。ハードウェアとのミスマッチによるオーバーヘッドを軽減もしくは完全に排除します。ドライバーが単純に API コマンドを受け取り、制御フローの追加オーバーヘッドなしに GPU コードに変換する間、アプリケーションは必要な PSO を設定します。アプリケーションは、少ないサイクルの描画コマンドとパフォーマンスの増加により ‘ハードウェアに近く’ なります。

次のパート 3 では、リソースバインドについて説明します。

BUILD 2014 からの図は、マイクロソフトの D3D 開発リードである Max McCullen によるプレゼンテーションから抜粋したものです。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • Direct3D 12 特集Direct3D 12 特集 2014 年 3 月にサンフランシスコで開催されたゲーム・デベロッパー・カンファレンス (GDC) で、Microsoft 社は 2009 年以降に初めてのグラフィック API を、DirectX 12 […]
  • Direct3D 12 概要 パート 1: ハードウェアに近くDirect3D 12 概要 パート 1: ハードウェアに近く この記事は、インテル® デベロッパー・ゾーンに掲載されている「Direct3D 12 Overview Part 1: 'Closer To The Metal'」の日本語参考訳です。 GDC 2014 […]
  • Direct3D 12 概要 パート 3: リソースバインドDirect3D 12 概要 パート 3: リソースバインド この記事は、インテル® デベロッパー・ゾーンに掲載されている「Direct3D 12 Overview Part 3: Resource Binding」の日本語参考訳です。 本シリーズの パート 2 […]
  • Direct3D* 12 概要 パート 9: まとめDirect3D* 12 概要 パート 9: まとめ この記事は、インテル® デベロッパー・ゾーンに公開されている「Direct3D* 12 - Console API Efficiency & Performance on PCs – […]
  • インテル・ゲーム開発者コミュニティーインテル・ゲーム開発者コミュニティー インテル・ゲーム開発者コミュニティーへようこそ! このページでは、みなさんのゲームを際立たせるコードサンプル、ツール、およびその他のリソースを紹介します。 "GUID Autosport の開発" […]