(57)【要約】グラフィックス処理パイプラインのステージ間通信用のメモリ使用量を改善する技法が開示される。本技法は、第１のシェーダプログラムの出力命令を分析して、そのような出力命令が、第２のシェーダプログラムによって使用されない何らかのデータを出力しているかどうかを判定することを含む。コンパイラは、使用される出力データの間にギャップが存在する場合に、データパッキングを実行して、メモリフットプリントを削減する。コンパイラは、出力データの使用率やデータパッキングに関する情報に基づいて、第１のシェーダプログラムに最適化された出力命令と、第２のシェーダプログラムに最適化された入力命令とを生成して、使用されるデータを第１のシェーダプログラムから出力し、そのデータをパック形式で第２のシェーダプログラムに入力する。必要に応じて、コンパイラは、コンパイル時に不明な情報に基づいて、第１のシェーダプログラムの使用されない出力データを識別するための実行時確認を実行する命令を挿入する。【選択図】図６
2021525414.tif 000002
【特許請求の範囲】
【請求項１】
１つ以上のシェーダプログラムのうちの少なくとも１つのシェーダプログラムを変更して、前記シェーダプログラム間で伝送されるデータのためのメモリ性能を改善する方法であって、
グラフィックスパイプライン状態に基づいて、分析するための第１のシェーダプログラム及び第２のシェーダプログラムを識別することと、
前記第１のシェーダプログラムによって出力されるデータ点であって、前記第２のシェーダプログラムによって入力されない前記データ点があるかどうかを判定することを含む第１の判定と、
前記第１のシェーダプログラムによって出力されるが、前記第２のシェーダプログラムによって入力されないデータ点の識別が、コンパイル時に実行できず、実行時に実行することができる識別であるかどうかを判定することを含む第２の判定と、
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを変更して、コンパイル済み第１のシェーダプログラムを生成することと、
グラフィックス処理パイプラインでの実行のために、前記コンパイル済み第１のシェーダプログラムを出力することと
を含む、前記方法。
【請求項２】
前記第１のシェーダプログラムの変更されていない命令に従って、使用されるデータの間にギャップが存在するかどうかを判定することを含む第３の判定を更に含む、請求項１に記載の方法。
【請求項３】
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを前記変更することは、
前記第１のシェーダプログラムの少なくとも１つの出力命令を変更して、前記第２のシェーダプログラムによって使用されないデータを出力しないことを含む、請求項１に記載の方法。
【請求項４】
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを前記変更することは、
前記第１のシェーダプログラムの少なくとも１つの出力命令を変更して、連続データの複数の出力を集約するパック形式でデータを出力することを含む、請求項１に記載の方法。
【請求項５】
前記第１のシェーダプログラムの前記少なくとも１つの出力命令に加えられた前記変更に基づいて、前記第２のシェーダプログラムを変更して、パック形式でデータを入力することを更に含む、請求項４に記載の方法。
【請求項６】
前記第１のシェーダプログラムがハルシェーダプログラムであり、前記第２のシェーダプログラムがドメインシェーダプログラムである、請求項１に記載の方法。
【請求項７】
前記第１のシェーダプログラムによって出力される前記データ点が、制御点及びパッチ定数の一方または両方である、請求項６に記載の方法。
【請求項８】
前記グラフィックスパイプライン状態が、アプリケーションの起動時に事前定義され、
前記識別すること、前記判定すること、及び前記変更することのステップが、アプリケーションの起動時に行われる、請求項１に記載の方法。
【請求項９】
前記グラフィックスパイプライン状態が描画時に指定され、
前記識別すること、前記判定すること、及び前記変更することのステップが、描画時に行われる、請求項１に記載の方法。
【請求項１０】
１つ以上のシェーダプログラムのうちの少なくとも１つのシェーダプログラムを変更して、前記シェーダプログラム間で伝送されるデータのためのメモリ性能を改善するコンピュータシステムであって、
シェーダプログラムを実行して、グラフィックスをレンダリングするように構成されたグラフィックス処理パイプラインを含むアクセラレーテッド処理デバイスと、
コンパイラを実行するように構成されたプロセッサと、を備え、
前記プロセッサが、
グラフィックスパイプライン状態に基づいて、分析するための第１のシェーダプログラム及び第２のシェーダプログラムを識別することと、
前記第１のシェーダプログラムによって出力されるデータ点であって、前記第２のシェーダプログラムによって入力されない前記データ点があるかどうかを判定することを含む第１の判定を実行することと、
前記第１のシェーダプログラムによって出力されるが、前記第２のシェーダプログラムによって入力されないデータ点の識別が、コンパイル時に実行できず、実行時に実行することができる識別であるかどうかを判定することを含む第２の判定を実行することと、
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを変更して、前記グラフィックス処理パイプラインでの実行のために出力されることになるコンパイル済み第１のシェーダプログラムを生成することと、を行うように構成されている、コンピュータシステム。
【請求項１１】
前記コンパイラは、更に、
前記第１のシェーダプログラムの変更されていない命令に従って、使用されるデータの間にギャップが存在するかどうかを判定することを含む第３の判定を実行するように構成されている、請求項１０に記載のコンピュータシステム。
【請求項１２】
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを前記変更することは、
前記第１のシェーダプログラムの少なくとも１つの出力命令を変更して、前記第２のシェーダプログラムによって使用されないデータを出力しないことを含む、請求項１０に記載のコンピュータシステム。
【請求項１３】
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを前記変更することは、
前記第１のシェーダプログラムの少なくとも１つの出力命令を変更して、連続データの複数の出力を集約するパック形式でデータを出力することを含む、請求項１０に記載のコンピュータシステム。
【請求項１４】
前記コンパイラは、更に、
前記第１のシェーダプログラムの前記少なくとも１つの出力命令に加えられた前記変更に基づいて、前記第２のシェーダプログラムを変更して、パック形式でデータを入力するように構成されている、請求項１３に記載のコンピュータシステム。
【請求項１５】
前記第１のシェーダプログラムがハルシェーダプログラムであり、前記第２のシェーダプログラムがドメインシェーダプログラムである、請求項１０に記載のコンピュータシステム。
【請求項１６】
前記第１のシェーダプログラムによって出力される前記データ点が、制御点及びパッチ定数の一方または両方である、請求項１５に記載のコンピュータシステム。
【請求項１７】
前記グラフィックスパイプライン状態が、アプリケーションの起動時に事前定義され、
前記識別すること、前記判定すること、及び前記変更することのステップが、アプリケーションの起動時に行われる、請求項１０に記載のコンピュータシステム。
【請求項１８】
前記グラフィックスパイプライン状態が描画時に指定され、
前記識別すること、前記判定すること、及び前記変更することのステップが、描画時に行われる、請求項１０に記載のコンピュータシステム。
【請求項１９】
プロセッサによって実行されると、
グラフィックスパイプライン状態に基づいて、分析するための第１のシェーダプログラム及び第２のシェーダプログラムを識別することと、
前記第１のシェーダプログラムによって出力されるデータ点であって、前記第２のシェーダプログラムによって入力されない前記データ点があるかどうかを判定することを含む第１の判定と、
前記第１のシェーダプログラムによって出力されるが、前記第２のシェーダプログラムによって入力されないデータ点の識別が、コンパイル時に実行できず、実行時に実行することができる識別であるかどうかを判定することを含む第２の判定と、
前記第１の判定及び前記第２の判定に基づいて、前記第１のシェーダプログラムを変更して、コンパイル済み第１のシェーダプログラムを生成することと、
グラフィックス処理パイプラインでの実行のために、前記コンパイル済み第１のシェーダプログラムを出力することと
により、１つ以上の前記シェーダプログラムのうちの少なくとも１つの前記シェーダプログラムを変更して、前記シェーダプログラム間で伝送されるデータのためのメモリ性能を改善する命令を格納する、非一時的なコンピュータ可読媒体。
【請求項２０】
前記第１のシェーダプログラムがハルシェーダプログラムであり、前記第２のシェーダプログラムがドメインシェーダプログラムである、請求項１９に記載の非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
本願は、２０１８年５月３０日に出願された米国特許出願第１５／９９２，２３９号の利益を主張するものであり、上記米国特許出願に記載された内容を参照により本明細書に完全に明記されているかのように援用する。
【背景技術】
【０００２】
３次元グラフィックス処理パイプラインは、ホスト（コンピューティングシステムの中央処理装置など）からコマンドを受け付けて、それらのコマンドを処理し、それによってディスプレイデバイス上にレンダリングするためのピクセルを生成する。グラフィックス処理パイプラインは、頂点位置及び頂点属性の変換、ピクセル色の計算などの個々のタスクを実行するいくつかのステージを含む。グラフィックス処理パイプラインは絶えず開発され、改良されている。
【０００３】
添付の図面と共に例として与えられた場合、以下の説明から、より詳細に理解することができる。
【図面の簡単な説明】
【０００４】
【図１】開示された１つ以上の実施形態を実施することができる例示的なデバイスのブロック図である。
【図２】図１のデバイスのブロック図であり、更なる詳細を示す。
【図３】図２に示すグラフィックス処理パイプラインの更なる詳細を示すブロック図である。
【図４】一実施例による、シェーダ間データ通信のためのメモリ使用率を改善する技法を示す。
【図５】一実施例による、ハルシェーダプログラム及びドメインシェーダプログラム対の分析を説明するブロック図である。
【図６】一実施例による、シェーダプログラム間で伝送されるデータのメモリフットプリントを削減するためにシェーダプログラムを変更する方法のフロー図である。
【発明を実施するための形態】
【０００５】
グラフィックス処理パイプラインのパイプラインステージ間通信用のメモリ使用量を改善する技法が開示される。本技法は、分析のためのシェーダプログラムを識別することを含む。このようなシェーダプログラムは、一方のシェーダプログラム（第１のシェーダプログラム）が、他方のシェーダプログラム（第２のシェーダプログラム）によって使用されるデータを出力する少なくとも２つのシェーダプログラムによって識別される。第１のシェーダプログラムの出力命令をコンパイラが分析して、そのような出力命令が、第２のシェーダプログラムによって入力されない何らかのデータを出力しているかどうかを判定する。そのような命令が１つ以上存在する場合に、コンパイラは、第１のシェーダプログラムによって出力されるとともに、第２のシェーダプログラムによって入力されるデータ点を識別し、第１のシェーダプログラムによって出力されるが、第２のシェーダプログラムによって入力されないデータ点を書き込むメモリ書き込みの生成を回避する。第１のシェーダプログラムに関してのメモリ書き込みにより、出力されるデータに「ギャップ」が生じる場合、コンパイラは、パック形式を使用してそのようなギャップを除去するようにメモリ書き込みを変更する。このギャップ除去により、メモリフットプリントが削減され、同様に、最初は分離されていた複数のメモリ書き込みまたはメモリ読み出しをより少ないメモリアクセス命令に集約することで、実行されるメモリアクセス命令の数もまた削減される。全体的に、これらの変更により、メモリアクセスが少なくなり、メモリフットプリントが小さくなり、有効帯域幅が増加するようになる。
【０００６】
この分析が役立つグラフィックスパイプラインの一特定部分は、テッセレーションを実施するパイプラインの一部であり、これは、ハルシェーダステージ及びドメインシェーダステージを含む。具体的には、ハルシェーダは、ドメインシェーダによる使用のために、制御点及びパッチ定数（テッセレーション係数など）などのデータを出力する。このデータは、通常は、テッセレーション以外のことに使用されている汎用メモリに出力される。ハルシェーダは、それぞれが複数のデータ項目（例えば、複数の制御点、複数のテッセレーション係数）を出力する命令を含む。更に、ハルシェーダは一般化可能であり、複数のドメインシェーダは、通常は、単一のハルシェーダと共に使用されるように記述されている。したがって、ハルシェーダは、一部のドメインシェーダで使われないデータを出力するのが普通である。ハルシェーダはまた、実行時に、パッチがカリングされるかどうかを、計算されたテッセレーション係数値に基づいて識別することができ、この結果としてハルシェーダは、全パッチのデータがドメインシェーダで使われるかどうかを把握している。本明細書で説明する技法は、ハルシェーダからドメインシェーダに伝送されるデータのメモリフットプリント及びメモリアクセスを削減するのに役立つ。
【０００７】
図１は、本開示の１つ以上の態様が実施される例示的なデバイス１００のブロック図である。デバイス１００には、例えば、コンピュータ、ゲーミングデバイス、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話、またはタブレット型コンピュータが含まれる。デバイス１００は、プロセッサ１０２、メモリ１０４、ストレージデバイス１０６、１つ以上の入力デバイス１０８、及び１つ以上の出力デバイス１１０を含む。デバイス１００はまた、任意選択で入力ドライバ１１２及び出力ドライバ１１４を含む。デバイス１００は、図１に示されない更なる構成要素を含み得ることが理解されよう。
【０００８】
プロセッサ１０２としては、中央処理装置（ＣＰＵ）、グラフィックス処理装置（ＧＰＵ）、同一ダイ上に設置されたＣＰＵ及びＧＰＵ、または各プロセッサコアがＣＰＵもしくはＧＰＵであり得る１つ以上のプロセッサコアが含まれる。メモリ１０４は、プロセッサ１０２と同じダイ上に設置されるか、またはプロセッサ１０２とは別に設置され得る。メモリ１０４としては、例えば、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックＲＡＭ、またはキャッシュなどの揮発性または不揮発性のメモリが含まれる。
【０００９】
ストレージデバイス１０６としては、例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク、またはフラッシュドライブである固定式またはリムーバブル式のストレージデバイスが含まれる。入力デバイス１０８としては、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、バイオメトリックスキャナ、またはネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／または受信用の無線ローカルエリアネットワークカード）が含まれる。出力デバイス１１０としては、ディスプレイ、スピーカ、プリンタ、触覚フィードバックデバイス、１つ以上の照明、アンテナ、またはネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／または受信用の無線ローカルエリアネットワークカード）が含まれる。
【００１０】
入力ドライバ１１２はプロセッサ１０２及び入力デバイス１０８と通信し、入力ドライバ１１２により、プロセッサ１０２が入力デバイス１０８から入力を受け取ることが可能になる。出力ドライバ１１４は、プロセッサ１０２及び出力デバイス１１０と通信し、出力ドライバ１１４により、プロセッサ１０２が出力デバイス１１０に出力を送ることが可能になる。出力ドライバ１１４は、ディスプレイデバイス１１８に結合されたアクセラレーテッド処理デバイス（ＡＰＤ）１１６を含む。ＡＰＤは、プロセッサ１０２から計算コマンド及びグラフィックスレンダリングコマンドを受け付け、それらの計算コマンド及びグラフィックスレンダリングコマンドを処理し、表示のためにディスプレイデバイス１１８にピクセル出力を供給するように構成されている。
【００１１】
ＡＰＤ１１６は、単一命令複数データ（「ＳＩＭＤ」）パラダイムに従って計算を実行するように構成された１つ以上の並列処理装置を含む。しかし、ＡＰＤ１１６によって実行されると説明される機能がまた、ＳＩＭＤパラダイムに従ってデータを処理しない処理デバイスによって実行されてもよい。
【００１２】
図２は、デバイス１００のブロック図であり、ＡＰＤ１１６での処理タスクの実行に関連する更なる詳細を示す。プロセッサ１０２は、システムメモリ１０４内に、プロセッサ１０２によって実行するための１つ以上の制御論理モジュールを保持する。この制御論理モジュールは、オペレーティングシステム１２０、ドライバ１２２、及びアプリケーション１２６を含み、任意選択で、図示しない他のモジュールを含んでもよい。これらの制御論理モジュールは、プロセッサ１０２及びＡＰＤ１１６の動作の様々な態様を制御する。例えば、オペレーティングシステム１２０は、ハードウェアと直接通信し、プロセッサ１０２で実行中の他のソフトウェアにハードウェアへのインタフェースを提供する。ドライバ１２２は、例えば、プロセッサ１０２で実行中のソフトウェア（例えば、アプリケーション１２６）にアプリケーションプログラミングインタフェース（「ＡＰＩ」）を提供して、ＡＰＤ１１６の様々な機能にアクセスすることにより、ＡＰＤ１１６の動作を制御する。ドライバ１２２はまた、シェーダコードを、ＡＰＤ１１６の処理構成要素（以下で更に詳細に説明するＳＩＭＤ装置１３８など）によって実行するためのシェーダプログラムにコンパイルする実行時コンパイラを含む。
【００１３】
ＡＰＤ１１６は、グラフィックス演算及び非グラフィックス演算などの並列処理に適し得る選択された機能のためのコマンド及びプログラムを実行する。ＡＰＤ１１６は、プロセッサ１０２から受け取ったコマンドに基づいて、ピクセル演算、幾何学的計算などのグラフィックスパイプライン演算を実行し、ディスプレイデバイス１１８に画像を描画するために使用され得る。ＡＰＤ１１６はまた、ビデオ、物理シミュレーション、計算流体力学、もしくは他のタスクに関連した演算など、グラフィックス演算に直接関連しない計算処理演算を、プロセッサ１０２から受け取ったコマンドに基づいて実行し、またはグラフィックス処理パイプラインの「通常」の情報フローの一部ではない計算処理演算を実行する。
【００１４】
ＡＰＤ１１６は、ＳＩＭＤパラダイムに従いプロセッサ１０２の要求に応じて並列に演算を実行するように構成された１つ以上のＳＩＭＤ装置１３８を含む（本明細書では、総称して「プログラマブル処理装置２０２」と呼ばれ得る）シェーダエンジン１３２を含む。ＳＩＭＤパラダイムとは、複数の処理要素が、単一のプログラム制御フロー装置及びプログラムカウンタを共有し、したがって同一のプログラムを実行するが、そのプログラムを別のデータで実行することができるモデルのことである。一例では、各ＳＩＭＤ装置１３８は１６個のレーンを含み、各レーンはＳＩＭＤ装置１３８内の他のレーンと同時に同じ命令を実行するが、異なるデータでその命令を実行することができる。全てのレーンが所与の命令を実行する必要がない場合には、条件付き実行制御でレーンをオフに切り替えることができる。条件付き実行制御は、分岐制御フロー付きのプログラムを実行するために使用することもできる。より具体的には、制御フローが個々のレーンによって実行された計算に基づく条件付き分岐または他の命令を含むプログラムについては、現在実行されていない制御フローパスに対応するレーンの条件付き実行制御と、種々の制御フローパスの直列実行とにより、任意の制御フローに従うことが可能になる。
【００１５】
シェーダエンジン１３２における実行の基本単位は、ワークアイテムである。各ワークアイテムは、特定のレーンで並列に実行されるシェーダプログラムの単一のインスタンシエイションに相当する。ワークアイテムは、単一のＳＩＭＤ装置１３８で「ウエーブフロント」として同時に実行することができる。複数のウエーブフロントが「ワークグループ」に含まれ得、このワークグループは、同じプログラムを実行するように指定されたワークアイテムの集まりを含む。ワークグループを構成するウエーブフロントのそれぞれを実行することにより、このワークグループを実行することができる。ウエーブフロントは、単一のＳＩＭＤ装置１３８で順次実行され得、または別々のＳＩＭＤ装置１３８で部分的もしくは完全に並列に実行され得る。ウエーブフロントは、シェーダプログラムの並列実行のインスタンスであると考えられ得、その場合、各ウエーブフロントは、ＳＩＭＤパラダイムに則して（例えば、１つの命令制御装置が、命令の同一ストリームを複数のデータで実行する）、単一のＳＩＭＤ装置１３８で同時に実行する複数のワークアイテムを含む。
【００１６】
各シェーダエンジン１３２内のローカルデータストアメモリ２１２は、シェーダプログラムが使用する値を格納する。ローカルデータストアメモリ２１２の物理的近接性により、シェーダエンジン１３２内に含まれないＡＰＤ１１６内のグローバルメモリ２１０、またはＡＰＤ１１６内にないメモリ１０４などの他のメモリと比べると待ち時間が改善される。スケジューラ１３６が、異なるシェーダエンジン１３２及びＳＩＭＤ装置１３８で様々なウエーブフロントをスケジューリングすることに関連する演算を実行するように構成されている。
【００１７】
シェーダエンジン１３２によって提供される並列性は、ピクセル値計算、頂点変換、テッセレーション、ジオメトリシェーディング演算、及びその他のグラフィックス演算などのグラフィックス関連演算に適している。したがって、プロセッサ１０２からグラフィックス処理コマンドを受け付けるグラフィックス処理パイプライン１３４が、計算タスクを並列に実行するためにシェーダエンジン１３２に提供する。
【００１８】
シェーダエンジン１３２はまた、グラフィックスに関係しない、またはグラフィックス処理パイプライン１３４の「通常」の演算の一部として実行されない計算タスク（例えば、グラフィックス処理パイプライン１３４の演算のために実行される処理を補う目的で実行されるカスタム演算）を実行するようにも使用される。プロセッサ１０２で実行中のアプリケーション１２６または他のソフトウェアは、そのような計算タスクを定義するプログラム（多くの場合、「計算シェーダプログラム」と呼ばれ、ドライバ１２２によってコンパイルされ得る）を、実行のためＡＰＤ１１６に送る。
【００１９】
図３は、図２に示すグラフィックス処理パイプライン１３４の更なる詳細を示すブロック図である。グラフィックス処理パイプライン１３４は、それぞれが特定の機能を実行するステージを含む。ステージは、グラフィックス処理パイプライン１３４の機能の一部を表す。各ステージは、プログラマブル処理装置２０２内で実行されるシェーダプログラムとして部分的もしくは完全に実装され、またはプログラマブル処理装置２０２の外部にある固定機能の非プログラマブルハードウェアとして部分的もしくは完全に実装される。
【００２０】
入力アセンブラステージ３０２は、ユーザ充填バッファ（例えば、プロセッサ１０２によって実行されたアプリケーション１２６などのソフトウェアの要求で充填されたバッファ）からプリミティブデータを読み出し、そのデータをアセンブルしてパイプラインのその他の部分で使用するためのプリミティブにする。入力アセンブラステージ３０２は、ユーザ充填バッファに含まれるプリミティブデータを基に、様々な種類のプリミティブを生成し得る。入力アセンブラステージ３０２は、パイプラインのその他の部分による使用のために、アセンブルしたプリミティブの形式を合わせる。
【００２１】
頂点シェーダステージ３０４は、入力アセンブラステージ３０２によってアセンブルされたプリミティブの頂点を処理する。頂点シェーダステージ３０４は、変換、スキニング、モーフィング、及び頂点ごとのライティングなどの様々な頂点ごとの演算を実行する。変換の演算は、頂点の座標を変換するための様々な演算を含み得る。これらの演算には、モデリング変換、ビューイング変換、投影変換、透視除算、及びビューポート変換のうちの１つ以上が含まれ得る。本明細書では、このような変換は、変換が実行される頂点の座標または「位置」を変更すると考えられている。座標以外の属性を変更する頂点シェーダステージ３０４の他の演算は、非位置属性を変更すると考えられている。
【００２２】
頂点シェーダステージ３０４は、１つ以上のシェーダエンジン１３２において実行すべき頂点シェーダプログラムとして部分的または完全に実装される。頂点シェーダプログラムは、コンピュータプログラマによって事前に書かれたプログラムとしてプロセッサ１０２によって提供される。ドライバ１２２は、そのようなコンピュータプログラムをコンパイルして、シェーダエンジン１３２内での実行に適した形式を有する頂点シェーダプログラムを生成する。
【００２３】
ハルシェーダステージ３０６、テッセレータステージ３０８、及びドメインシェーダステージ３１０は連携してテッセレーションを実施し、それにより、パッチプリミティブを指定のドメインに細分化を用いて変換する。ドメインタイプの例には、ポイント、ライン、トライ、及びクワッドが含まれ、これらのドメインタイプは、グラフィックス処理パイプライン２００によってレンダリングされることが可能である。ハルシェーダステージ３０６及びドメインシェーダステージ３１０のいずれかまたは両方は、プログラマブル処理装置２０２で実行されることになるシェーダプログラムとして実装することができる。
【００２４】
ハルシェーダステージ３０６は、一組の頂点及び他の情報によって定義される入力プリミティブに基づいて、テッセレーションのためのパッチを生成する。より具体的には、ハルシェーダステージ３０６は、頂点シェーダステージ３０４から入力制御点を受け付け、その場合、これらの入力制御点は、ハルシェーダステージ３０６によって処理すべき幾何プリミティブ（例えば、三角形）を画定する。入力制御点は、パッチの形状及び位置を合わせて画定する位置情報を含む。ハルシェーダステージ３０６は、入力制御点と、プログラム可能なハルシェーダプログラムの命令とに基づいて、パッチ定数と共に出力パッチを生成する。出力パッチは、少なくとも部分的には、この場合もやはりハルシェーダプログラムの命令に基づいて、入力制御点と同じであり得る出力制御点、または入力制御点と同じでない場合がある出力制御点によって画定される。出力制御点は、テッセレータステージ３０８によって処理するためのパッチの形状及び位置を画定する。パッチ定数は、少なくともテッセレーション係数を含み、これは、出力パッチがテッセレータステージ３０８によってどのように細分化されるかを定義する。テッセレーション係数は、エッジテッセレーション係数を含み、内部テッセレーション係数を含む場合もある。内部テッセレーション係数は、出力パッチの内部部分の細分化の程度を定義する。エッジテッセレーション係数は、出力パッチのエッジに隣接する部分の細分化の程度を定義する。
【００２５】
テッセレータステージ３０８は、Ｕ及びＶ、またはＵ、Ｖ、及びＷの座標で定義される一組のドメイン点を生成し、座標のそれぞれは０から１の範囲である。これらのドメイン点は、パッチ内の細分化頂点である。様々なパッチ分割技法が実行可能である。
【００２６】
ドメインシェーダ３１０は、単位空間Ｕ、Ｖ、及びＷの位置をパッチの３次元空間ドメインに変換する。３次元空間（または「ワールド空間」）に入ると、頂点はクリップ空間と呼ばれる同次（ｘ、ｙ、ｚ、ｗ）座標系に変換される。このステップは、例えば、頂点バッファから頂点を読み出した後に頂点シェーダが行うことに似ている。ドメインシェーダステージ３１０は、対応するドメインシェーダプログラムの命令に基づいてワールド空間位置を生成し、テッセレータステージ３０８によって出力されたドメイン点に基づいてワールド空間位置を生成し、ハルシェーダステージ３０６によって出力された制御点に基づいてワールド空間位置を生成する。ドメインシェーダステージ３１０はまた、出力頂点を生成する際に、ハルシェーダステージ３０６が出力するテッセレーション係数などのパッチ定数を使用し得る。ドメインシェーダプログラムは、テッセレータステージ３０８によって出力されるドメイン点との定義可能な任意の関係を有する出力頂点を、ドメインシェーダプログラムが生成し得るという点で柔軟性がある。ただし、既知の技法が多く存在する。簡単な例では、ドメインシェーダステージ３１０は、Ｕ、ＶまたはＵ、Ｖ、Ｗ座標をテッセレータステージ３０８から制御点のワールド空間座標にマッピングして、ワールド空間位置を有する中間出力頂点を生成する。ドメインシェーダステージ３１０は、中間出力頂点のワールド空間位置を、パッチの平面に垂直な方向に（パッチの平面内の位置を変更せずに）そのような位置を移動させることによって変更する。ドメインシェーダステージ３１０は、出力頂点の位置を決定するために、ハルシェーダステージ３０６からのテッセレーション係数などのパッチ定数を使用し得る。ドメインシェーダステージ３１０はまた、任意選択で、出力頂点ごとに１つ以上の頂点パラメータを、制御点に関してテッセレータステージ３０８によって出力されるドメイン点の位置に基づいて、制御点の対応するパラメータを補間することなどによる実行可能な任意の方法で生成する。
【００２７】
ジオメトリシェーダステージ３１２は、プリミティブごとに頂点演算を実行する。ジオメトリシェーダプログラムは通常、プリミティブ全体（例えば、頂点の集合）を入力として受け付け、ジオメトリシェーダプログラムの命令によって指定されたプリミティブ全体に対して演算を実行する。ジオメトリシェーダステージ３１２により、ポイントスプライト拡張、動的パーティクルシステム演算、ファー／フィンの生成、シャドウボリュームの生成、キューブマップへのシングルパスレンダリング、プリミティブごとのマテリアルスワップ、及びプリミティブごとのマテリアルセットアップなどの演算を含む多種多様な演算を実行し得る。ジオメトリシェーダステージ３１２のための演算が、プログラマブル処理装置２０２で実行されるシェーダプログラムによって実行されてもよい。
【００２８】
ラスタライザステージ３１４は、上流で生成された単純プリミティブを受け付けてラスタライズする。ラスタ化は、どのスクリーンピクセル（またはサブピクセルサンプル）が特定のプリミティブによってカバーされているかを判定することからなる。ラスタ化は、固定機能ハードウェアによって実行されるか、またはプログラマブル処理装置２０２内で実行されるシェーダプログラムによって実行されてもよい。
【００２９】
ピクセルシェーダステージ３１６は、上流で生成されたプリミティブとラスタ化の結果とに基づいて、スクリーンピクセルの出力値（例えば、色の値）を計算する。ピクセルシェーダステージ３１６は、テクスチャメモリからのテクスチャを適用し得る。ピクセルシェーダステージ３１６のための演算は、プログラマブル処理装置２０２で実行されるシェーダプログラムによって実行される。
【００３０】
出力結合ステージ３１８は、ピクセルシェーダステージ３１６からの出力を受け付け、それらの出力を結合して、スクリーンピクセルの最終色を判定するためにｚテストやアルファブレンディングなどの演算を実行し、それらの出力は、ディスプレイデバイス１１８への出力のためにフレームバッファに書き込まれる。
【００３１】
上記のように、図３に示され、グラフィックス処理パイプライン１３４内に含まれると説明されているステージの多くは、図２に示されるシェーダエンジン１３２内で実行されるシェーダプログラムとして実装することができる。シェーダエンジン１３２内のシェーダプログラムの実行を容易にするために、ドライバ１２２内及びＡＰＤ１１６内で様々な演算が行われる。
【００３２】
本明細書の他の箇所で説明されているように、シェーダプログラムは、多くの場合、アプリケーションプログラマによってコードに指定され、シェーダプログラムは、アプリケーションプログラムによる使用のためにコンパイラによってコンパイルされる。通常は、このコンパイルは、描画時（すなわち、アプリケーションの起動後に、アプリケーションが実際にオブジェクトのレンダリングを要求しているとき）ではなく、アプリケーションの起動中にドライバ１２２によって行われる。しかしながら、必要が生じた場合には、ドライバ１２２は、描画時にシェーダプログラムの実行時コンパイルを実行することが可能である。
【００３３】
アプリケーションは、グラフィックス処理パイプライン１３４の具体的な構成を定義する。この「グラフィックスパイプライン構成」は、任意選択のどのシェーダステージが使用されるか（例えば、ジオメトリシェーダステージ３１２が使用されるかどうか、及び／またはハルシェーダステージ３０６、テッセレータステージ３０８、及びドメインシェーダステージ３１０を使用するテッセレーションが使用されるかどうか）を含む、グラフィックス処理パイプライン１３４の様々な態様を定義する。グラフィックスパイプライン構成情報はまた、有効化され、シェーダプログラムを実行するシェーダステージ（例えば、頂点シェーダステージ３０４、ピクセルシェーダステージ３１６、及びハルシェーダステージ３０６、有効な場合、ドメインシェーダステージ３１０、及びジオメトリシェーダステージ３１２）に使用される特定のシェーダプログラムなど、これに限定されないグラフィックス処理パイプライン１３４の他の態様、ラスタライザステージ３１４の態様（三角形のどちらの面が前面であるか、ピクセルに深度値を適用する方法、カリングを実行する方法、三角形を塗りつぶす方法、及び他の態様など）、出力結合ステージ３１８で混合及び他の処理がどのように行われるかの態様、グラフィックス処理パイプライン１３４への入力（例えば、入力頂点）がどのように解釈されるかの態様、及びその他の態様を定義する。グラフィックスパイプライン構成を定義するプログラミング構造の一例は、Ｒｅｄｍｏｎｄ，Ｗａｓｈｉｎｇｔｏｎ，Ｕ．Ｓ．のＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎが提供するＤｉｒｅｃｔ  ３Ｄ  １２アプリケーションプログラミングインタフェースのＤｉｒｅｃｔ  ３Ｄバージョン１２グラフィックスパイプライン状態構造体（Ｄ３Ｄ１２＿ＧＲＡＰＨＩＣＳ＿ＰＩＰＥＬＩＮＥ＿ＳＴＡＴＥ＿ＤＥＳＣ構造体）である。場合によっては（Ｍｉｃｒｏｓｏｆｔ  Ｄｉｒｅｃｔ  Ｘ  １２が使用されるハードウェア及びソフトウェア構成などの場合）、様々な事前定義されたグラフィックスパイプライン構成が、アプリケーションの起動時にアプリケーションによってドライバ１２２に通信される。描画時に、アプリケーションは、特定の事前定義されたグラフィックスパイプライン構成に切り替えるようにドライバ１２２に要求を発行することにより、事前定義された種々のグラフィックスパイプライン構成を切り替えることができる。他の状況（Ｍｉｃｒｏｓｏｆｔ  Ｄｉｒｅｃｔ  Ｘ  １１が使用されるハードウェア及びソフトウェア構成など）では、アプリケーションは、実行時に、ドライバ１２２にグラフィックスパイプライン構成を指定しない。その代わりに、アプリケーションは、状態変更コマンドを発行することにより、描画時に、どのパイプラインステージがレンダリングに関与することになるのか、どのシェーダプログラムが様々なパイプラインステージに使用されるのかなど、グラフィックスパイプライン構成を変更する。
【００３４】
シェーダプログラムは、シェーダステージ間でデータがどのように通信されるかを示す入力及び出力を有する。これらの入力及び出力は、グラフィックス処理パイプライン１３４の先行ステージからシェーダプログラムに提供されるべきデータが何であるかを表し、また同様に、シェーダプログラムから出力されてグラフィックス処理パイプライン１３４の後続ステージに提供されるべきデータが何であるかを表す。一部のシェーダプログラムは、メモリロード命令及び／またはメモリストア命令を利用して、それらの入力をメモリ（ローカルデータストアメモリ２１２またはグローバルメモリ２１０など）から読み出し、またそれらの出力をメモリ（ローカルデータストアメモリ２１２またはグローバルメモリ２１０など）に格納する。他のシェーダプログラムは、入力及び出力の直接宣言であって、ハードウェアによって解釈されると、ハードウェアが、先行ステージから特定値をインポートして、それらの値をシェーダプログラム用のローカルメモリ及び／またはレジスタに配置し、及び／またはシェーダ用のレジスタ及び／またはローカルメモリから、後続のシェーダステージで使用される位置に特定値をエクスポートする直接宣言などの他のタイプの命令を使用する。ステージ間の伝送は、汎用メモリ（ローカルデータストアメモリ２１２またはグローバルメモリ２１０など）を介して、または特定のデータタイプ専用のより特定のストレージ領域を介して行われ得る。
【００３５】
ある特定のシェーダプログラムが、パイプラインの後続の部分で使用されない何らかのデータを出力することが起こり得る。そのような出力データが、ローカルデータストアメモリ２１２またはグローバルメモリ２１０などのストレージに格納されている場合、グラフィックスレンダリングは、使用されないデータを格納するメモリや、使用されるデータ間のメモリにおけるギャップのため、効率が低下する。このような非効率性が生じる状況の一例は、ハルシェーダ及びドメインシェーダを含むシェーダプログラムの対を用いる状況である。この例示的な状況では、アプリケーションプログラマが、単一のバージョンまたは限られた数のバージョンの特定のハルシェーダプログラムを作成し、それ以上のバージョンのドメインシェーダプログラムを作成することが起こり得る（そして実際に頻繁に発生する）。このような状況では、１つ以上のハルシェーダプログラムは、それぞれ複数の異なるドメインシェーダプログラムと連携するように設計されている。したがって、１つ以上のハルシェーダプログラムは、そのような各ハルシェーダと連携し得る様々なドメインシェーダが使用できる可能な全ての出力を出力する必要がある。したがって、いずれかの特定のハルシェーダ／ドメインシェーダの組み合わせでは、ハルシェーダによって出力されたデータの一部がそのドメインシェーダによって使用されず、ハルシェーダのためのストレージスペースの少なくとも一部が無駄になる。更に、コンパイラの実装方法によっては、使用されるデータ間にメモリにおけるギャップが存在する場合がある。パック形式でメモリ内のデータを再編成することで、メモリフットプリントを削減し、有効なメモリ帯域幅を増加させる。いくつかのシナリオでは、コンパイラ４５０は、ハルシェーダによって出力された特定のデータ点が、グラフィックス処理パイプライン２００の後続のステージによって使用されるかどうかを識別することができない。このような状況では、コンパイラは、控えめな推定または実行時の確認を使用する可能性がある。一例では、パッチは、０以下であるか、または数ではない、エッジテッセレーション係数を有する。このようなシナリオでは、コンパイラは、ハルシェーダに追加の命令を生成して、実行時にテッセレーション係数を確認する。
【００３６】
図４は、一実施例による、シェーダ間データ通信のためのメモリ使用率を改善する技法を示す。一般に、本技法は、１つ以上の他のシェーダプログラムがデータをどのように使用するかに関する情報に基づいて、そのデータを出力するシェーダプログラムを変更すること、及びそのデータを使用する１つ以上の他のシェーダプログラムを変更することを含む。コンパイラ４５０は、ドライバ１２２の一部として示されている。コンパイラ４５０は、アプリケーションプログラムに指定されたコードを受け付け、そのコードをコンパイルして、グラフィックス処理パイプライン１３４の様々なステージで使用するためのコンパイル済みシェーダプログラムを生成する。ドライバ１２２は、コンパイル済みシェーダプログラムを、実行のためグラフィックス処理パイプライン１３４に伝送する。コンパイラ４５０はドライバ１２２の一部として示されているが、当業者であれば、コンパイラ４５０は、代わりに独立したものであってもよく、または別のソフトウェアモジュールの一部であってもよいことを理解するであろう。
【００３７】
本明細書の他の箇所で説明するように、アプリケーションは、有効にされる任意選択のシェーダステージと、グラフィックス処理パイプライン１３４の様々なステージに使用されることになる特定のシェーダプログラムとを指定するグラフィックスパイプライン構成情報を指定する。このグラフィックスパイプライン構成情報は、図４にグラフィックスパイプライン状態４７０として示されている。
【００３８】
ドライバ１２２は、グラフィックスパイプライン状態４７０を調べて、どのシェーダステージが有効化されているか、ならびに、どの特定のシェーダプログラムがそれらのステージに使用されるかを判定する。ドライバ１２２は、第１のシェーダプログラム４０２がパイプラインステージの１つに使用され、かつ１つ以上の第２のシェーダプログラム４１０が後続のパイプラインステージに使用されることを判定し、その判定した情報をコンパイラ４５０に渡す。コンパイラ４５０は、第１のシェーダプログラム４０２の命令、及び場合によっては第２のシェーダプログラム（複数可）４１０の命令を分析して、第１のシェーダプログラム４０２が、第２のシェーダプログラム（複数可）４１０のいずれによっても使用されないデータを出力するかどうかを判定する（この分析は、本明細書の他の箇所では「出力使用分析」と呼ばれる）。
【００３９】
いくつかの実施態様では、コンパイラ４５０は、特定のシェーダプログラムからの特定の出力が、特定の他のシェーダプログラムによってのみ使用され得ることを把握している。そのような状況では、いずれかの特定の分析された第１のシェーダプログラム４０２について、コンパイラ４５０は、出力使用分析のために分析される第２のシェーダプログラム（複数可）４１０を、第１のシェーダプログラム４０２から出力されるデータを場合により使用し得るシェーダプログラムに限定する（例えば、ハルシェーダは、ドメインシェーダによってのみ使用されるデータを出力することが知られているので、コンパイラ４５０は、ハルシェーダプログラムが第１のシェーダプログラム４０２である出力使用分析の少なくとも１つのインスタンスを、ドメインシェーダプログラムのみが第２のシェーダプログラム４１０として分析されるように制限する）。他の実施態様では、コンパイラは、データを出力するシェーダプログラムの後に実行される各シェーダプログラムを分析して、そのデータ出力が他の何らかのシェーダプログラムによって使用されるかどうかを判定する。出力使用分析の実行に応答して、コンパイラ４５０は、第１のシェーダプログラム４０２によって出力されるデータの一部が、第２のシェーダプログラム４１０のいずれによっても使用されないと判定した場合に、コンパイラ４５０は、出力使用分析に基づいて、第１のシェーダプログラム４０２及び第２のシェーダプログラム４１０のうちの１つ以上を変更する。
【００４０】
コンパイラ４５０によって実行される出力使用分析は、第１のシェーダプログラム４０２によって出力されるデータを識別することを含む。より具体的には、コンパイラ４５０は、出力命令４０８を調べて、第１のシェーダプログラム４０２によって出力されるデータを識別する。いくつかの状況において、第１のシェーダプログラム４０２によって出力される特定の各データは、コンパイラ４５０が第２のシェーダプログラム４１０を調べて、第１のシェーダプログラム４０２によって出力されたデータのうち、第２のシェーダプログラム４１０のいずれによっても使用されていないデータがあるかどうかを判定する。
【００４１】
コンパイラ４５０は、第１のシェーダプログラム４０２によって出力されたデータのうち、第２のシェーダプログラム４１０のいずれによっても使用されていないデータがあるかどうかを判定するために、第２のシェーダプログラム４１０のそれぞれの入力命令４１２を調べて、入力命令４１２が第１のシェーダプログラム４０２の出力命令４０８によって出力されるデータの全てを入力するかどうかを判定する。第１のシェーダプログラム４０２の出力命令４０８によって出力されたデータのうち、第２のシェーダプログラム４１０のいずれの入力命令４１２によっても入力されないデータがある場合、コンパイラ４５０は、そのようなデータが第２のシェーダプログラム４１０のいずれによっても使用されていないと判定する。いくつかの状況では、データが第２のシェーダプログラム４１０によって使用されるかどうかに関する確認は、コンパイル時に実行することができない。そのような状況では、コンパイラ４５０は、実行時確認を実行する命令を挿入して、第１のシェーダプログラム４０２から出力されるデータが、後続のシェーダプログラムによって使用されるかどうかを検出する（その一例は、テッセレーション係数がゼロ以下であることに基づいて、パッチがカリングされるべきかどうかを判定するハルシェーダである）。
【００４２】
コンパイラ４５０が、第２のシェーダプログラム４１０によって使用されないデータが存在せず、かつメモリ内で第１のシェーダプログラムから第２のシェーダプログラムに渡されたデータの間にギャップが存在しないであろうことを判定した場合、コンパイラ４５０は、本明細書に記載の技法に従って、第１のシェーダプログラム４０２または第２のシェーダプログラム４１０を変更することはない。メモリ内の使用されるデータ間にギャップが存在する場合、コンパイラ４５０はデータにデータパッキングを適用する。コンパイラは、第１のシェーダプログラムの出力命令と第２のシェーダプログラムの入力命令との両方を変更して、パック形式に従ってメモリにアクセスする。コンパイラ４５０が、第２のシェーダプログラム４１０のいずれによっても使用されていないデータがあると判定した場合、コンパイラ４５０は、その第１のシェーダプログラムの使用されないデータのメモリ書き込みまたはメモリ格納を発生させない。使用されないデータを特定した後にデータパッキングが行われる状況では、コンパイラ４５０は、第１のシェーダプログラムにおける出力命令と、第２のシェーダプログラムにおける入力命令とを、パック形式のメモリデータにアクセスする形式で生成する。いくつかの状況では、コンパイラ４５０は、（テッセレーション係数の数が０未満であるかどうかを確認するなどのために）使用されないデータの実行時確認を実行するための命令を挿入する。
【００４３】
次に、データのパッキングの概念について更に詳細に説明する。第２のシェーダプログラム４１０のいずれによっても使用されないデータを出力する出力命令４０８には、複数のデータ項目を出力するものがある。一実施例では、ハルシェーダプログラムの出力命令は、ドメインシェーダプログラムによって消費される複数の制御点データ点を出力するが、それらの制御点データ点の少なくとも一部は、ドメインシェーダプログラムによって使用されない。複数のデータ項目を出力する出力命令の場合、コンパイラ４５０は、それらのデータ項目のうち、どれが第２のシェーダプログラム４１０のいずれによっても使用されないかを判定する。コンパイラ４５０は、それらのデータ項目の全てが使用されない場合には、メモリ書き込み命令またはメモリ格納命令を削除し、または使用されるデータの書き込みもしくは格納を行うだけの命令を生成する。元の出力命令に従って、または出力使用分析後に、データ間のギャップがメモリ内に存在する場合、コンパイラ４５０はデータパッキングを実行する。このデータパッキングは、第２のシェーダプログラムによって使用されるデータのメモリ位置を識別することを含む。コンパイラ４５０は、この情報を使用して、第１のシェーダプログラム４２０内のパッキング済みデータに対する変更済み出力命令４２６と、第２のシェーダプログラム４３０内の、それらのパッキング済みデータを使用する変更済み入力命令４３４とを生成する。データパッキングはまた、コンパイラ４５０が小さなサイズの出力命令及び入力命令を集約し、その結果、より大きなデータチャンクで動作するより少ない命令が実行されることを可能にする。
【００４４】
データ項目をパッキングすることで、データ項目に割り当てられる総メモリスペースが削減され、コンパイラ４５０が、複数のメモリアクセス命令を集約することが可能になる。使用されないデータを出力使用分析によって特定することは、データパッキングにおいて、使用されるデータのみをパッキングするのに有用である。一実施例では、第１の出力命令は４つのデータ項目を出力するが、１つのみが第２のシェーダプログラム４１０によって使用され、第２の出力命令は異なる４つのデータ項目を出力するが、３つのみが第２のシェーダプログラム４１０によって使用される。これらのデータ項目をパッキングすることにより、コンパイラ４５０は、使用される４つの項目（１つのデータ項目に３つのデータ項目を加えた４つの項目）を出力する１つの出力命令を生成することが可能になる。なお、生成された出力命令４２６が、いくつかの使用されないデータを出力する出力命令を少なくともいくつか含むように、パッキングが不完全である可能性があることに留意されたい。上記の実施例の変更においては、第１の出力命令と第２の出力命令とが共に１つのデータ項目を出力する場合には、結果として生じる出力命令は４つのデータ項目を出力し、そのうちの２つのみが使用され得る。しかし、そのシナリオでは、８つのデータ項目の代わりに４つのデータ項目のためにメモリを使用して、使用されるメモリが少なくなり、２つの出力命令の代わりに１つの出力命令を発行して、発行されるメモリ命令が少なくなるので、この結果は、それぞれ１つのデータ項目のみを出力する２つの出力命令よりも優れている。
【００４５】
コンパイラ４５０はまた、変更済み出力命令４２６を生成することに加えて、第２のシェーダプログラム４１０の入力命令４１２に基づいて、変更済み入力命令４３４を生成する。より具体的には、第２のシェーダプログラム４１０において、入力命令４１２は、出力命令４０８によって出力されるデータと同じ形式のデータを入力する。データがメモリにパッキングされると、コンパイラ４５０は、パック形式を有するデータを入力するために、第２のシェーダプログラム４３０内に変更済み入力命令４３４を生成する。上記の例を用いて、コンパイラ４５０は、第２のシェーダプログラム４３０の本体４３２で使用されるデータ項目を入力するための入力命令を１つ生成し、または、あまり理想的ではないパック形式（４つのデータ項目）で、そのうちの２つが本体４３２で使用される４つのデータ項目を入力するための入力命令を生成する。入力データは通常、シェーダプログラムのその他の部分で使用される前に、メモリからレジスタへ、またはローカルデータストアメモリ２１２などのローカルメモリへ読み出される。
【００４６】
上記のように、出力使用分析は、コンパイラ４５０が第１のシェーダプログラム４０２によって出力されるどのデータ項目が、他の第２のシェーダプログラム４１０によって使用されないかを判定し、特定のシェーダステージ（したがって、特定のグラフィックスパイプライン状態４７０によって定義される特定のプログラム）に限定され得る。コンパイラ４５０が分析を特定のシェーダプログラムに制限する状況の一実施例は、ハルシェーダステージ３０６及びドメインシェーダステージ３１０を含み、これらは固定機能テッセレータステージ３０８と共にテッセレーションを実装する。本実施例では、ハルシェーダプログラムは、テッセレーション係数を含むパッチ制御点及びパッチ定数を出力し、ドメインシェーダプログラムは、ハルシェーダから出力される制御点、テッセレーションステージ３０８から出力されるドメイン点、及びハルシェーダプログラムから出力されるパッチ定数を入力する。この状況では、コンパイラ４５０は、ハルシェーダプログラムの出力命令とドメインシェーダプログラムの入力命令とを分析して、ハルシェーダプログラムによって出力されたデータ（例えば、パッチ制御点またはパッチ定数）のうち、ドメインシェーダプログラムによって入力されていないデータがあるかどうかを判定する。そのようなデータが存在すると判定した時点で、コンパイラ４５０は、本明細書に記載の技法に従って、ハルシェーダプログラム及び／またはドメインシェーダプログラムを変更する。コンパイラ４５０は、他の任意のシェーダプログラム（ジオメトリシェーダプログラムまたはピクセルシェーダプログラムなど）を分析して、ハルシェーダプログラムの出力がそれらの他のシェーダプログラムのいずれかによって使用されるかどうかを判定することはしない。
【００４７】
異なるグラフィックスパイプライン状態４７０では、異なるバージョンのシェーダプログラムが使用されることが起こり得ることに留意されたい。コンパイラ４５０は、本明細書で説明される分析を様々なグラフィックスパイプライン状態に対して実行する。したがって、コンパイラ４５０は、様々な第１のシェーダプログラムを異なるように変更することが可能であり、または、あるグラフィックスパイプライン状態で使用される、あるシェーダプログラムを、異なるグラフィックスパイプライン状態で使用される同じシェーダプログラムとは異なる方法で変更することさえも可能である。例えば、第１のグラフィックスパイプライン状態において、ある第１のシェーダプログラムは、第２のシェーダプログラムと組み合わされて使用されるが、第２のグラフィックスパイプライン状態において、同じ第１のシェーダプログラムは、別の第２のシェーダプログラムと組み合わされて使用されることが可能である。この状況では、コンパイラ４５０は、グラフィックスパイプライン状態ごとに、本明細書で説明されるシェーダプログラムの分析及び変更を実行し、それによって、結果として、様々なグラフィックスパイプライン状態に対して、同じ第１のシェーダプログラムの異なる変更バージョンがもたらされ得る。
【００４８】
図５は、一実施例による、ハルシェーダプログラム及びドメインシェーダプログラム対の分析を説明するブロック図である。グラフィックスパイプライン状態５７０は、図４のグラフィックスパイプライン状態４７０に類似しており、テッセレーションが有効であることをグラフィックスパイプライン状態５７０が指定し、更にハルシェーダプログラム５０２及びドメインシェーダプログラム５１０が、それぞれハルシェーダステージ３０６及びドメインシェーダステージ３１０に使用されることになることをグラフィックスパイプライン状態５７０が指定する特定の特徴を有する。
【００４９】
入力ハルシェーダプログラム５０２及び入力ドメインシェーダプログラム５１０は、例えば、アプリケーションによって指定される事前コンパイルプログラムである。コンパイラ４５０は、これらのシェーダプログラムを、それぞれコンパイル済みハルシェーダプログラム５２０及びコンパイル済みドメインシェーダプログラム５３０に変換する。入力ハルシェーダプログラム５０２は、アプリケーションによって指定されるように、入力命令５０４、本体５０６、及び出力命令５０８を含む。入力命令５０４により、パッチ制御点などのハルシェーダ入力データは（例えば、頂点シェーダステージ３０４によって書き込まれた位置から）本体５０６内の命令が利用可能な位置に入力される。本体５０６は、入力の処理または変更を行って、入力ハルシェーダの入力データに少なくとも部分的に基づき、パッチ制御点及びパッチ定数データのうちの１つ以上を生成するなど、ハルシェーダの作業を実行するための命令を含む。出力命令５０８により、生成された１つ以上のパッチ制御点またはパッチ定数などのデータは、ドメインシェーダプログラム５１０（及びテッセレータステージ３０８）による入力に利用可能な出力位置に書き込まれる。いくつかの実施態様では、この出力位置は、ローカルデータストアメモリ２１２またはグローバルメモリ２１０などのメモリである。
【００５０】
ドメインシェーダプログラム５１０は、アプリケーションによって指定されるように、入力命令５１２、本体５１４、及び出力命令５１６を含む。入力命令５１２により、ハルシェーダプログラム５０２から出力される制御点、テッセレータステージ３０８によって生成されるドメイン点、及びハルシェーダプログラム５０２によって出力されるパッチ定数などのドメインシェーダ入力データが読み込まれ、本体４１４の命令が利用可能な位置（レジスタ内またはローカルデータストアメモリ２１２内など）に配置される。本体５１４は、入力データに基づいて出力頂点を生成する命令を含み、出力命令５１６は、後続のステージによる使用のための位置（特殊メモリ、ローカルデータストアメモリ２１２、またはグローバルメモリ２１０など）に出力頂点を出力する。
【００５１】
動作中、コンパイラ４５０は、グラフィックスパイプライン状態５７０を調べて、後続のジオメトリをレンダリングするために使用されるパイプラインがテッセレーションを有効にしており、ハルシェーダプログラム及びドメインシェーダプログラムが、図５に示されるハルシェーダプログラム５０２及びドメインシェーダプログラム５１０であることを判定する。コンパイラ４５０は、ハルシェーダプログラム５０２の出力命令５０８及びドメインシェーダプログラム５１０の入力命令５１２を分析する。コンパイラ４５０は、出力命令５０８の少なくともいくつかの命令が、入力命令５１２によって入力されない少なくともいくつかの制御点またはパッチ定数を出力することを判定する。この決定に応答して、コンパイラ４５０は、メモリ内のデータレイアウトがデータパッキングによって変更された場合、入力ハルシェーダプログラム５０２内の出力命令５０８から変更済み出力命令５２６を生成し、入力ドメインシェーダプログラム５１０内の入力命令５１２から変更済み入力命令５３４を生成する。「変更済み」という用語は、コンパイル済み命令が、本明細書に開示された技法が適用されなかった場合と異なることを意味する。コンパイラは、ドメインシェーダ５１０の入力命令５１２によって使用されない制御点またはパッチ定数を出力する出力命令を生成しない。制御点及びパッチ定数を含む使用されるデータの間にメモリにおいてギャップが存在する場合、コンパイラ４５０は、データパッキングを実行するように命令を構成する。具体的には、コンパイラ４５０は、パッキングされた制御点及びパッチ定数のデータのメモリ位置を追跡する。コンパイラ４５０は、この情報を使用して、入力ハルシェーダプログラム５０２内の出力命令５０８を、変更済みハルシェーダプログラム４２０内の変更済み出力命令５２６に変換して、制御点及びパッチ定数をパック形式でメモリに出力する。コンパイラ４５０はまた、この情報を使用して、入力ドメインシェーダプログラム５１０内の入力命令５１２を、生成されたドメインシェーダプログラム５３０内の変更済み入力命令５３４に変換して、制御点及びパッチ定数をパック形式でメモリから入力する。入力ハルシェーダプログラム５０２からの複数の出力命令は、それらの出力データがメモリ内で連続しており、組み合わされたデータサイズがメモリ出力命令に適合する場合、変更済み出力命令５２６に「集約」される。同様に、入力ドメインシェーダプログラム５１０の複数の入力命令５１２は、それらの入力データがメモリ内で連続しており、組み合わされたデータサイズがメモリ入力命令に適合する場合、変更済み入力命令５３４に集約される。変更済み入力命令５３４によって入力されるデータは、データが本体５３２のその他の部分によって使用される前に、レジスタか、またはローカルデータストアメモリ２１２などのローカルメモリにロードされる。ハルシェーダによって出力されたデータのうち、ドメインシェーダで使用されていないデータを識別するために、実行時確認が使用される場合がある。このような場合には、計算されたテッセレーション係数（例えば、テッセレーション係数は、０、０未満、または非数である）に基づいてカリングされるパッチのデータが含まれる。コンパイラ４５０は、パッチがカリングされるかどうかを判定するためにテッセレーション係数の値を確認するための追加の命令を生成し、それらのカリングされたパッチのデータについては変更済み出力命令５２６に出力命令を生成しない。
【００５２】
データパッキングと、データパッキングを用いたハルシェーダの出力命令の生成との具体例もまた示される。データパッキングなしで生成されたハルシェーダプログラムの出力命令のためのメモリ内のデータレイアウト５８０を示す。更に、データパッキングを用いて生成されたハルシェーダの出力命令に従ったメモリ内のデータレイアウト５８２を示す。データパッキングなしのハルシェーダ出力５８０は、６つの出力命令を含む。命令１から４はそれぞれ、対応するドメインシェーダによって入力された１つの制御点またはパッチ定数のデータ要素を出力する。命令５は、対応するドメインシェーダによって使用される制御点またはパッチ定数データ要素を出力しない。命令６によって出力された制御点またはパッチ定数データ要素は全て、対応するドメインシェーダによって使用される。制御点またはパッチ定数データ要素には、明確にするために、０から７までの任意の番号が付けられている。ドメインシェーダによって入力されないメモリ内の制御点またはパッチ定数データ要素には、「Ｘ」のマークが付けられている。
【００５３】
制御点またはパッチ定数データ要素０〜７がドメインシェーダによって入力され、他の制御点またはパッチ定数データ要素はドメインシェーダによって入力されないことを識別したことに応答して、コンパイラは、変更済みハルシェーダ出力命令５８２を生成する。より具体的には、コンパイラ４５０は、データパッキングが施されたハルシェーダ出力５８２に示すように、８つのデータ要素全てをメモリにパッキングすることができると判定する。コンパイラ４５０はまた、最初の４つのデータ要素が単一の命令（変更済みＨＳ出力命令１）によって出力され得、次の４つのデータ要素が別の単一の命令（変更済みＨＳ出力命令２）によって出力され得ることを判定する。このパッキングにより、メモリフットプリントが２４データ要素のサイズから８データ要素のサイズに削減され、メモリアクセス命令の数も６から２に削減される。更に、コンパイラ４５０は、パック形式でデータを入力するように構成された、ドメインシェーダプログラムの対応する入力命令を生成する。ドメインシェーダプログラムのこれらのパック形式の入力命令は、非パッキング済みデータを入力する命令がより少ない命令に集約されるので、使用される命令の数を減らすことになる。
【００５４】
状況次第で、コンパイラ４５０は、シェーダステージによって出力されたデータが、後続の何らかのシェーダステージによって使用されるかどうかを実行時に確認するための追加の命令を挿入する。具体的には、ハルシェーダとドメインシェーダとの組み合わせの場合、エッジテッセレーション係数がゼロ以下または非数のパッチがカリングされ、このパッチのデータはドメインシェーダで使用されないようになる。したがって、コンパイラ４５０は、一度計算されたテッセレーション係数の値を確認し、カリングされたパッチのデータを出力しないようにする命令を挿入する。
【００５５】
１つのグラフィックスパイプライン状態５７０は、ハルシェーダが特定のドメインシェーダと共に使用されるべきであると指定し、第２のグラフィックスパイプライン状態５７０は、同じハルシェーダが異なるドメインシェーダと共に使用されるべきであると指定することが可能である。この例の場合、コンパイラ４５０は、２つの異なるバージョンのハルシェーダを生成し、１つは各ドメインシェーダと共に使用するためのものである（もちろん、ドメインシェーダがハルシェーダによって出力されたデータを異なる方法で使用すると仮定している）。
【００５６】
図６は、一実施例による、メモリアクセスの数とシェーダプログラム間で伝送されるデータのメモリフットプリントとを削減するために、シェーダプログラムを変更する方法６００のフロー図である。図１〜５に関して示し、説明したシステムに関して説明されるが、技術的に実行可能な任意の順序で本方法を実行するように構成されるいずれのシステムも本開示の範囲内に含まれることが理解されるべきである。
【００５７】
方法６００は、ステップ６０２で始まり、ここでコンパイラ４５０は、グラフィックスパイプライン構成（例えば、グラフィックスパイプライン状態４７０内またはグラフィックスパイプライン状態５７０内に含まれるグラフィックスパイプライン構成）に基づいて分析するシェーダプログラムを識別する。グラフィックスパイプライン構成は、（例えば、Ｄｉｒｅｃｔ３Ｄ  １２の場合のように）アプリケーションの起動時に事前定義してもよく、または描画時に変更してもよい。アプリケーションの起動時に事前定義される場合、コンパイラ４５０は、シェーダコンパイルにおけるアプリケーションの起動時にも、方法６００を実行して、シェーダプログラム間で伝送されるデータのメモリフットプリントを削減することができる。描画時に変更された場合、コンパイラ４５０は、分析されたシェーダプログラムの実行時コンパイル中に、描画時にも方法６００を実行することができる。
【００５８】
グラフィックスパイプライン構成は、使用される特定のシェーダステージと、プログラマブルシェーダステージをサポートするステージで使用される特定のシェーダプログラムとを定義する。コンパイラ４５０は、分析する第１のシェーダプログラムを識別し、識別した第１のシェーダプログラムに基づいて、分析する１つ以上の第２のシェーダプログラムを識別する。第１のシェーダプログラムは、グラフィックスパイプライン構成によって指定される任意のシェーダプログラムであってよい。第２のシェーダプログラムは、第１のシェーダプログラムによって出力されたデータを使用することが知られているシェーダプログラムである。一実施例では、ハルシェーダが制御点及びパッチ定数などのデータを出力し、ドメインシェーダがそれらの制御点及びパッチ定数を入力する。
【００５９】
ステップ６０４において、コンパイラ４５０は、第１のシェーダプログラムによって出力されるが、任意の第２のシェーダプログラムによって使用されないデータを識別する。ステップ６０６において、コンパイラ４５０は、第２のシェーダプログラムでの使用法をコンパイル時に知ることができないデータを判定し、実行時確認と、そのようなデータが使用されない場合のデータ除去とのための命令を追加する。ステップ６０８において、メモリに書き込まれたときにギャップがある使用されるデータについて、コンパイラ４５０は、データパッキングを使用すべきかどうかと、どのように使用すべきかとを判定する。ステップ６１０において、コンパイラ４５０は、データパッキングを適用し、パック形式でデータの書き込み及び読み出しを行う、第１のシェーダのための出力命令と、第２のシェーダのための入力命令とを生成する。
【００６０】
１つ以上のシェーダプログラムのうちの少なくとも１つのシェーダプログラムを変更して、シェーダプログラム間で伝送されるデータのためのメモリ性能を改善する方法が、本明細書で提供される。本方法は、グラフィックスパイプライン状態に基づいて、分析するための第１のシェーダプログラム及び第２のシェーダプログラムを識別することと、第１のシェーダプログラムによって出力されるデータ点であって、第２のシェーダプログラムによって入力されないデータ点があるかどうかを判定することを含む第１の判定と、第１のシェーダプログラムによって出力されるが、第２のシェーダプログラムによって入力されないデータ点の識別が、コンパイル時に実行できず、実行時に実行することができる識別であるかどうかを判定することを含む第２の判定と、第１の判定及び第２の判定に基づいて、第１のシェーダプログラムを変更して、コンパイル済み第１のシェーダプログラムを生成することと、グラフィックス処理パイプラインでの実行のために、コンパイル済み第１のシェーダプログラムを出力することとを含む。
【００６１】
１つ以上のシェーダプログラムのうちの少なくとも１つのシェーダプログラムを変更して、シェーダプログラム間で伝送されるデータのためのメモリ性能を改善するコンピュータシステムが提供される。本コンピュータシステムは、シェーダプログラムを実行して、グラフィックスをレンダリングするように構成されたグラフィックス処理パイプラインを含むアクセラレーテッド処理デバイスと、コンパイラを実行するように構成されたプロセッサとを含む。コンパイラは、グラフィックスパイプライン状態に基づいて、分析するための第１のシェーダプログラム及び第２のシェーダプログラムを識別することと、第１のシェーダプログラムによって出力されるデータ点であって、第２のシェーダプログラムによって入力されないデータ点があるかどうかを判定することを含む第１の判定を実行することと、第１のシェーダプログラムによって出力されるが、第２のシェーダプログラムによって入力されないデータ点の識別が、コンパイル時に実行できず、実行時に実行することができる識別であるかどうかを判定することを含む第２の判定を実行することと、第１の判定及び第２の判定に基づいて、第１のシェーダプログラムを変更して、グラフィックス処理パイプラインでの実行のために出力されることになるコンパイル済み第１のシェーダプログラムを生成することとを行うように構成されている。
【００６２】
プロセッサによって実行されると、グラフィックスパイプライン状態に基づいて、分析するための第１のシェーダプログラム及び第２のシェーダプログラムを識別することと、第１のシェーダプログラムによって出力されるデータ点であって、第２のシェーダプログラムによって入力されないデータ点があるかどうかを判定することを含む第１の判定と、第１のシェーダプログラムによって出力されるが、第２のシェーダプログラムによって入力されないデータ点の識別が、コンパイル時に実行できず、実行時に実行することができる識別であるかどうかを判定することを含む第２の判定と、第１の判定及び第２の判定に基づいて、第１のシェーダプログラムを変更して、コンパイル済み第１のシェーダプログラムを生成することと、グラフィックス処理パイプラインでの実行のために、コンパイル済み第１のシェーダプログラムを出力することとにより、１つ以上のシェーダプログラムのうちの少なくとも１つのシェーダプログラムを変更して、シェーダプログラム間で伝送されるデータのためのメモリ性能を改善する命令を格納する、非一時的なコンピュータ可読媒体が提供される。
【００６３】
本明細書の開示に基づいて、多くの変形が可能であることを理解されたい。特徴及び要素が特定の組み合わせで上述されているが、各特徴または要素は、他の特徴及び要素無しに単独で用いられてもよく、または他の特徴及び要素の有無に関わらず様々な組み合わせで用いられてもよい。
【００６４】
提供される方法は、汎用コンピュータ、プロセッサまたはプロセッサコアにおいて実施されてもよい。好適なプロセッサとしては、一例として、汎用プロセッサ、専用プロセッサ、従来型プロセッサ、デジタルシグナルプロセッサ（ＤＳＰ）、複数のマイクロプロセッサ、ＤＳＰコアに関連した１つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）回路、任意の他の種類の集積回路（ＩＣ）、及び／またはステートマシンが挙げられる。そのようなプロセッサは、処理されるハードウェア記述言語（ＨＤＬ）命令及びネットリストを含む他の中間データ（コンピュータ可読媒体上に記憶されることが可能なそのような命令）の結果を用いて製造プロセスを構成することによって製造されてもよい。そのような処理の結果は、実施形態の態様を実施するプロセッサを製造する半導体製造プロセスにおいて次いで用いられるマスク作業であってもよい。
【００６５】
本明細書で提供される方法またはフローチャートは、汎用コンピュータまたはプロセッサによる実行のために非一時的コンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェアまたはファームウェアにおいて実施されてもよい。非一時的コンピュータ可読記憶媒体の例としては、リードオンリーメモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク及び可搬型ディスクなどの磁気媒体、光磁気媒体、ならびにＣＤ−ＲＯＭディスク及びデジタル多用途ディスク（ＤＶＤ）などの光学媒体が挙げられる。
【図１】
2021525414.tif 000003
【図２】
2021525414.tif 000004
【図３】
2021525414.tif 000005
【図４】
2021525414.tif 000006
【図５】
2021525414.tif 000007
【図６】
2021525414.tif 000008
【国際調査報告】
2021525414.tif 000009
2021525414.tif 000010