[0001]本出願は、そのすべての内容全体が参照により本明細書に組み込まれる、2012年4月4日に出願された米国仮出願第61/620,340号、2012年4月4日に出願された米国仮出願第61/620,358号、および2012年4月4日に出願された米国仮出願第61/620,333号の利益を主張する。
[0040]本開示の技法は一般に、グラフィックスレンダリングパイプラインのシェーダステージと関連付けられるシェーディング操作を実行することに関する。たとえば、グラフィックスプロセシングユニット(GPU)は、グラフィックスレンダリングパイプラインのシェーダステージと関連付けられるシェーディング操作を実行するために、1つまたは複数のシェーディングユニットを呼び出すことができる。本開示の態様によれば、GPUは次いで、第1のシェーディング操作を実行するために指定されたシェーディングユニットを用いて、グラフィックスレンダリングパイプラインの第2の異なるシェーダステージと関連付けられるシェーディング操作を実行することができる。たとえば、GPUは、第1のシェーダステージと関連付けられる入力/出力インターフェースを堅持しながら、第2のステージと関連付けられるシェーディング操作を実行することができる。このようにして、GPUは、同じシェーディングユニットを用いて複数のシェーディング操作を実行することによって、より多くのシェーディングリソースを有するGPUをエミュレートすることができる。
[0041]図1は、本開示で説明される技法を実装し得るコンピューティングデバイス30を示すブロック図である。コンピューティングデバイス30の例には、限定はされないが、ワイヤレスデバイス、いわゆるスマートフォンを含む携帯電話またはセルラー電話、携帯情報端末(PDA)、ビデオディスプレイを含むビデオゲームコンソール、モバイルビデオゲームデバイス、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、タブレットコンピューティングデバイス、電子ブックリーダー、固定式または移動式のメディアプレーヤーなどがある。
[0042]図1の例では、コンピューティングデバイス30は、CPUメモリ34を有する中央処理装置(CPU)32と、グラフィックスプロセシングユニット(GPU)メモリ38と1つまたは複数のシェーディングユニット40とを有するGPU 36と、ディスプレイユニット42と、ディスプレイバッファユニット44と、ユーザインターフェースユニット46と、ストレージユニット48とを含む。加えて、ストレージユニット48は、コンパイラ54と、GPUプログラム52と、ローカルにコンパイルされたGPUプログラム56とを有する、GPUドライバ50を記憶することができる。
[0043]CPU 32の例には、限定はされないが、デジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路がある。CPU 32およびGPU 36は図1の例では別個のユニットとして示されるが、いくつかの例では、CPU 32およびGPU 36は単一のユニットへとマージされ得る。CPU 32は1つまたは複数のアプリケーションを実行し得る。アプリケーションの例には、ウェブブラウザ、電子メールアプリケーション、スプレッドシート、ビデオゲーム、オーディオキャプチャおよび/またはビデオキャプチャ、再生または編集アプリケーション、あるいは、ディスプレイユニット42を介して提示されるべき画像データの生成を開始する他のアプリケーションがあり得る。
[0044]図1に示される例では、CPU 32はCPUメモリ34を含む。CPUメモリ34は、機械コードまたはオブジェクトコードを実行する際に使用されるオンチップストレージまたはメモリを表し得る。CPUメモリ34は各々、一定の数のデジタルビットを記憶することが可能なハードウェアメモリレジスタを備え得る。CPU 32は、たとえばシステムバスを通じてアクセスされ得るストレージユニット48から値を読み取ること、またはそれに値を書き込むことよりも迅速に、ローカルCPUメモリ34から値を読み取り、またはそれに値を書き込むことが可能であり得る。
[0045]GPU 36は、グラフィカルな操作を実行するための1つまたは複数の専用プロセッサを表す。すなわち、たとえば、GPU 36は、グラフィックスをレンダリングしGPUアプリケーションを実行するための、固定機能のコンポーネントとプログラマブルコンポーネントとを有する専用ハードウェアユニットであり得る。GPU 36はまた、DSP、汎用マイクロプロセッサ、ASIC、FPGA、あるいは他の等価な集積回路またはディスクリート論理回路を含み得る。
[0046]GPU 36はまた、機械コードまたはオブジェクトコードを実行する際に使用されるオンチップストレージまたはメモリを表し得る、GPU メモリ38を含む。GPUメモリ38は各々、一定の数のデジタルビットを記憶することが可能なハードウェアメモリレジスタを備え得る。GPU 36は、たとえばシステムバスを通じてアクセスされ得るストレージユニット48から値を読み取ること、またはそれに値を書き込むことよりも迅速に、ローカルGPUメモリ38から値を読み取り、またはそれに値を書き込むことが可能であり得る。
[0047]GPU 36は、シェーディングユニット40を含む。以下でより詳細に説明されるように、シェーディングユニット40は、プロセシングコンポーネントのプログラム可能なパイプラインとして構成され得る。いくつかの例では、シェーディングユニット40は、「シェーダプロセッサ」または「統一されたシェーダ」と呼ばれることがあり、グラフィックスをレンダリングするために、ジオメトリシェーディング操作、頂点シェーディング操作、ピクセルシェーディング操作、または他のシェーディング操作を実行することができる。シェーディングユニット40は、命令をフェッチして復号するためのコンポーネント、算術計算を実行するための1つまたは複数の算術論理ユニット(「ALU」)、および1つまたは複数のメモリ、キャッシュ、もしくはレジスタのような、わかりやすくするために図1には特に示されていない1つまたは複数のコンポーネントを含み得る。
[0048]ディスプレイユニット42は、閲覧者により使用される、ビデオデータ、画像、テキストまたは他のタイプのデータを表示することが可能なユニットを表す。ディスプレイユニット42は、液晶ディスプレイ(LCD)、発光ダイオード(LED)ディスプレイ、有機LED(OLED)、アクティブマトリックスOLED(AMOLED)ディスプレイなどを含み得る。
[0049]ディスプレイバッファユニット44は、ディスプレイユニット42のための、写真またはビデオフレームのような像の提示のためのデータを記憶することに専用のメモリまたはストレージデバイスを表す。ディスプレイバッファユニット44は、複数の記憶位置を含む2次元バッファを表し得る。ディスプレイバッファユニット44内の記憶位置の数は、ディスプレイユニット42上に表示されるべきピクセルの数と実質的に同様であり得る。たとえば、ディスプレイユニット42が640×480のピクセルを含むように構成される場合、ディスプレイバッファユニット44は640×480の記憶位置を含み得る。ディスプレイバッファユニット44は、GPU 36によって処理されるピクセルの各々に対する最終的なピクセル値を記憶し得る。ディスプレイユニット42は、ディスプレイバッファユニット44から最終的なピクセル値を取り出し、ディスプレイバッファユニット44に記憶されたピクセル値に基づいて最終的な画像を表示し得る。
[0050]ユーザインターフェースユニット46は、ユーザが、CPU 32のような、コンピューティングデバイス30の他のユニットと対話し得るときに用いる、または別様にそれらのユニットと通信するためにインターフェースし得るときに用いるユニットを表す。ユーザインターフェースユニット46の例には、限定はされないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェースユニット46はまた、タッチスクリーンであってよく、ディスプレイユニット42の一部として組み込まれ得る。
[0051]ストレージユニット48は1つまたは複数のコンピュータ可読記憶媒体を備え得る。ストレージユニット48の例には、限定はされないが、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、電気消去可能プログラマブル読取り専用メモリ(EEPROM(登録商標))、CD−ROMもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、フラッシュメモリ、または、命令もしくはデータ構造の形態の所望のプログラムコードを記憶するために使用されコンピュータまたはプロセッサによってアクセスされ得る、任意の他の媒体がある。
[0052]いくつかの例示的な実装形態では、ストレージユニット48は、本開示においてCPU 32およびGPU 36に起因する機能をCPU 32および/またはGPU 36に実行させる命令を含み得る。ストレージユニット48は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。しかしながら、「非一時的」という用語は、ストレージユニット48が可動ではないことを意味するものと解釈されるべきでない。一例として、ストレージユニット48は、コンピューティングデバイス30から取り外され、別のデバイスに移され得る。別の例として、ストレージユニット48と実質的に同様のストレージユニットが、コンピューティングデバイス30に挿入され得る。いくつかの例では、非一時的記憶媒体は、時間経過に伴って変動し得るデータを(たとえば、RAMに)記憶し得る。
[0053]図2の例に示されるように、ストレージユニット48は、GPUドライバ50と、コンパイラ54と、GPUプログラム52と、ローカルにコンパイルされるGPUプログラム56とを記憶する。GPUドライバ50は、GPU 36にアクセスするためのインターフェースを与えるコンピュータプログラムまたは実行可能コードを表す。CPU 32は、GPU 36とインターフェースするために、GPUドライバ50またはその一部を実行し、これが理由で、GPUドライバ50は、図1の例では、CPU 32内に「GPUドライバ50」と標識された破線ボックスとして示されている。GPUドライバ50は、GPUプログラム52を含む、CPU 32によって実行されるプログラムまたは他の実行ファイルにとってアクセス可能である。
[0054]GPUプログラム52は、たとえば、アプリケーションプログラミングインターフェース(API)を使用する、高水準(HL)プログラミング言語で書かれたコードを含み得る。APIの例には、Open−Computing Language(「OpenCL」)、Open Graphics Library(「OpenGL」)、およびMicrosoft社により開発されたDirectXがある。一般に、APIは、関連するハードウェアによって実行される、所定の標準化されたコマンドのセットを含む。APIコマンドは、ユーザが、ハードウェアコンポーネントの仕様についてのユーザの知識を伴わずに、コマンドを実行するようにGPUのハードウェアコンポーネントに命令することを可能にする。
[0055]GPUプログラム52は、GPUドライバ50によって与えられる1つまたは複数の機能を呼び出すか、またはさもなければ含み得る。CPU 32は一般に、GPUプログラム52が埋め込まれたプログラムを実行し、GPUプログラム52に遭遇すると、GPUプログラム52をGPUドライバ50に(たとえば、コマンドストリームの形式で)渡す。CPU 32は、この状況では、GPUプログラム52を処理するために、GPUドライバ50を実行する。すなわち、たとえば、GPUドライバ50は、GPUプログラム52を、GPU 36によって実行可能なオブジェクトコードまたは機械コードへとコンパイルすることによって、GPUプログラム52を処理し得る。このオブジェクトコードは、ローカルにコンパイルされたGPUプログラム56として図1の例では示されている。
[0056]いくつかの例では、コンパイラ54は、リアルタイムまたは準リアルタイムで動作して、GPUプログラム52が埋め込まれたプログラムの実行の間に、GPUプログラム52をコンパイルすることができる。たとえば、コンパイラ54は一般に、HLプログラミング言語に従って定義されたHL命令を低水準(LL)プログラミング言語のLL命令へと縮小するモジュールを表す。コンパイルの後に、これらのLL命令は、FPGA、ASICなど(たとえば、CPU 32およびGPU 36を含む)のような、特定のタイプのプロセッサまたは他のタイプのハードウェアによって実行されることが可能である。
[0057]LLプログラミング言語は、それらが、プロセッサまたは他のタイプのハードウェアの命令セットアーキテクチャからの抽象化をほとんど行わず、またはより低水準の抽象化を行うという意味において、低水準と見なされ得る。LL言語は一般に、アセンブリ言語および/または機械語を指す。アセンブリ言語は、機械語よりもわずかに高度なLL言語であるが、一般に、アセンブリ言語は、コンパイラまたは他の変換モジュールを使用せずに機械語に変換され得る。機械語は、x86機械コードのような、基礎をなすハードウェア、たとえば、プロセッサによってネイティブに実行されるものと、同じではないとしても同様である命令を定義する任意の言語を表す(x86は、Intel Corporationによって開発されたx86プロセッサの命令セットアーキテクチャを指す)。
[0058]いずれの場合でも、コンパイラ54は、HLプログラミング言語に従って定義されたHL命令を、基礎をなすハードウェアによってサポートされるLL命令へと変換することができる。これらのHLプログラミング言語に従って定義されたソフトウェアが、実際の基礎をなすハードウェアによってより直接的に実行されることが可能なように、コンパイラ54は、HLプログラミング言語(およびAPI)と関連付けられる抽象性を除去する。
[0059]図1の例では、コンパイラ54は、GPUプログラム52を含むHLコードを実行するとき、CPU 32からGPUプログラム52を受け取り得る。コンパイラ54は、LLプログラミング言語に準拠するローカルでコンパイルされたGPUプログラム56を生成するために、GPUプログラム52をコンパイルし得る。コンパイラ54は、次いで、LL命令を含むローカルにコンパイルされたGPUプログラム56を出力する。
[0060]GPU 36は一般に、(GPU 36内で「ローカルにコンパイルされたGPUプログラム56」と標識された破線ボックスによって示されるように)ローカルにコンパイルされたGPUプログラム56を受け取り、その後、いくつかの例では、GPU 36は、画像をレンダリングし、画像のレンダリングされた部分をディスプレイバッファユニット44に出力する。たとえば、GPU 36は、ディスプレイユニット42において表示されるべき多数のプリミティブを生成することができる。プリミティブは、線(曲線、スプラインなどを含む)、点、円、楕円、多角形(通常、多角形は1つまたは複数の三角形の集合体として定義される)、または任意の他の2次元(2D)プリミティブの1つまたは複数を含み得る。「プリミティブ」という用語は、立方体、円柱、球体、円錐、三角錐、トーラスなどのような、3次元(3D)プリミティブも指し得る。一般に、「プリミティブ」という用語は、ディスプレイユニット42を介して画像(またはビデオデータの状況ではフレーム)として表示するための、GPU 36によってレンダリングされることが可能な任意の基本的な幾何学的形状または要素を指す。
[0061]GPU 36は、1つまたは複数のモデル変換(これは状態データにおいても規定され得る)を適用することによって、プリミティブとプリミティブの他の状態データ(たとえば、色、テクスチャ、照明、カメラ構成、または他の様相)とを、いわゆる「ワールド空間」へと変換することができる。変換されると、GPU 36は、アクティブなカメラに対するビュー変換を適用して(これも、カメラを定義する状態データにおいて規定され得る)、プリミティブおよび照明の座標を、カメラ空間またはアイ空間に変換することができる。GPU 36はまた、任意のアクティブな照明のもとでの、プリミティブの外観をレンダリングするために頂点シェーディングを実行することができる。GPU 36は、上のモデル、ワールド空間またはビュー空間の1つまたは複数において頂点シェーディングを実行することができる(しかし、頂点シェーディングは通常、ワールド空間において実行される)。
[0062]プリミティブがシェーディングされると、GPU 36は投影を実行して、画像を、一例では(−1,−1,−1)および(1,1,1)において端点を伴う単位立方体へと投影することができる。この単位立方体は通常、標準ビューボリュームと呼ばれる。モデルをアイ空間から標準ビューボリュームへと変換した後で、GPU 36は、ビューボリューム内に少なくとも部分的にも存在しないあらゆるプリミティブを除去するために、クリッピングを実行することができる。言い換えると、GPU 36は、カメラのフレーム内にないあらゆるプリミティブを除去することができる。GPU 36は次いで、プリミティブの3D座標をスクリーンの2D座標へと実質的に縮小する、プリミティブの座標をビューボリュームからスクリーン空間へとマッピングすることができる。
[0063]関連するシェーディングデータを伴うプリミティブを定義する変換され投影された頂点が与えられると、GPU 36は次いで、プリミティブをラスタライズすることができる。たとえば、GPU 36は、プリミティブによって覆われるスクリーンのピクセルに対する色を計算し設定することができる。ラスタライズの間、GPU 36は、プリミティブと関連付けられる任意のテクスチャを適用することができる(テクスチャは状態データを備え得る)。GPU 36はまた、ラスタライズの間に、深度テストとも呼ばれるZバッファアルゴリズムを実行して、プリミティブおよび/またはオブジェクトのいずれかが任意の他のオブジェクトによって塞がれるかどうかを判定することができる。GPU 36が各プリミティブをスクリーンに描く順序を知るように、Zバッファアルゴリズムは、プリミティブの深度に従ってプリミティブを分類する。GPU 36は、レンダリングされたピクセルをディスプレイバッファユニット44に出力する。
[0064]ディスプレイバッファユニット44は、画像全体がレンダリングされるまで、レンダリングされた画像のレンダリングされたピクセルを一時的に記憶し得る。ディスプレイバッファユニット44は、この状況では画像フレームバッファと見なされ得る。ディスプレイバッファユニット44は、次いで、ディスプレイユニット42上に表示されるべきレンダリングされた画像を送信し得る。いくつかの代替的な例では、GPU 36は、画像をディスプレイバッファユニット44に一時的に記憶するのではなく、画像のレンダリングされた部分を表示のためにディスプレイユニット42に直接出力し得る。ディスプレイユニット42は、次いで、ディスプレイバッファユニット78に記憶された画像を表示し得る。
[0065]上で説明された方式でピクセルをレンダリングするために、GPU 36は、(たとえば、図2および図8に関してより詳細に説明されるように)種々のシェーディング操作を実行するように、シェーディングユニット40を指定することができる。しかしながら、比較的短いレンダリングパイプラインをサポートするように設計されたいくつかのGPU(GPU 36のような)は、拡大されたレンダリングパイプラインを有するAPIをサポートすることが不可能であり得る。たとえば、いくつかのGPUは、3つ以上の異なるタイプのシェーディング操作を実行するようにシェーディングユニット40を指定することを妨げられ得る。
[0066]ある例では、GPU 36は、頂点シェーディング操作とピクセルシェーディング操作とを実行するようにシェーディングユニット40を指定することができる。この例では、GPU 36は、ハルシェーダ、ドメインシェーダ、および/またはジオメトリシェーダと関連付けられる操作を実行するようにシェーディングユニット40を指定するためのリソースを欠いていることがある。すなわち、ハードウェアおよび/ソフトウェアの制約は、GPU 36が、ハルシェーディング操作、ドメインシェーディング操作、および/またはジオメトリシェーディング操作を実行するようにシェーディングユニット40を指定することを妨げ得る。したがって、GPU 36は、そのような機能を含むAPIと関連付けられるシェーダステージをサポートすることが不可能であり得る。
[0067]たとえば、以前のDirectX 9 API(Direct3D 9 APIを含み得る、Microsoftによって開発された)をサポートしていた以前のGPUは、DirectX 10 API(Direct3D 10 APIを含み得る)をサポートすることが不可能であり得る。すなわち、DirectX 10 APIの特徴の少なくともいくつか(たとえば、いくつかのシェーダステージのような)は、以前のGPUを使用して実行されることが不可能であり得る。その上、以前のDirectX 9 APIとDirectX 10 APIとをサポートしていたGPUは、DirectX 11 APIのすべての機能をサポートすることが不可能であり得る。そのような非互換性は、DirectX 10またはDirectX 11を利用するソフトウェアまたは他のアプリケーションを実行することに対するサポートをもはや提供し得ない、現在展開されている大量のGPUをもたらし得る。上の例はAPIのMicrosoftのDirectXのファミリーに関して説明されるが、同様の互換性の問題は、他のAPIおよびレガシーのGPU 36について存在し得る。
[0068]加えて、比較的長いグラフィックスプロセシングパイプライン(たとえば、追加のシェーダステージを有するレンダリングパイプライン)をサポートすることは、より複雑なハードウェア構成を必要とし得る。たとえば、シェーディングユニット40の専用の1つによって実施されるときに、ジオメトリシェーダステージをレンダリングパイプラインに導入して、ジオメトリシェーディングを実行することは、オフチップメモリに対する追加の読取りと書込みとをもたらし得る。すなわち、GPU 36は最初に、シェーディングユニット40の1つを用いて頂点シェーディングを実行し、頂点をストレージユニット48に記憶することができる。GPU 36はまた、頂点シェーダによって出力される頂点を読み取り、シェーディングユニット40の1つによってジオメトリシェーディングを実行するときに生成される新たな頂点を書き込むことができる。テッセレーションステージ(たとえば、ハルシェーダステージおよびドメインシェーダステージ)をレンダリングパイプラインに含めることは、以下で説明されるように、同様の複雑さをもたらし得る。
[0069]オフチップメモリに対する追加の読取りおよび書込みは、メモリバスの帯域幅(たとえば、GPU 36をストレージユニット48に接続する通信チャネル)を消費しながら、また、読取りおよび書込みが各々、メモリバスとストレージユニット48とに電力供給することを必要とすることを考えると、消費される電力の量を潜在的に増やし得る。この意味で、各シェーダステージに対して専用のシェーディングユニット40を使用する、多くのステージを伴うグラフィックスパイプラインを実装することは、より電力効率の低いGPUをもたらし得る。加えて、そのようなGPU 36はまた、ストレージユニット48からのデータの取り出しの遅延により、レンダリングされる画像の出力に関して実行がより低速であり得る。
[0070]本開示の態様は一般に、シェーディングユニット40の1つが2つ以上のシェーディング機能を実行できるように、シェーディングユニット40の1つまたは複数の機能をマージすることに関する。たとえば、通常、GPU 36は、特定のシェーディング操作を実行するようにシェーディングユニット40を指定することによって、レンダリングプロセス(シェーダステージを有するレンダリングパイプラインと呼ばれ得る)を実行することができ、シェーディングユニット40の各々は、同じシェーダの複数のインスタンスを同時に実装することができる。すなわち、GPU 36は、たとえば、頂点シェーダの最大で256個の同時のインスタンスをサポートする、頂点シェーディング操作を実行するように、シェーディングユニット40の1つまたは複数を指定することができる。GPU 36はまた、たとえば、ピクセルシェーダの最大で256個の同時のインスタンスをサポートする、ピクセルシェーディング操作を実行するように、シェーディングユニット40の1つまたは複数を指定することができる。これらのハードウェアユニットは、次の指定されたハードウェアユニットがグラフィックスプロセシングパイプラインにおいて以前のハードウェアユニットの出力を処理することに利用可能となるまで、ストレージユニット48のようなオフチップメモリに、3つのシェーダのうちの実行されている1つからの出力を記憶することができる。
[0071]本開示の態様は、単数形(たとえば、1つのハードウェアシェーディングユニット)で特定のハードウェアシェーディングユニットに言及することがあるが、そのようなユニットは実際には、1つまたは複数のシェーディングユニット40(2つ以上のシェーダプロセッサ)、さらには、シェーディング操作を実行するためのGPU 36の1つまたは複数の他のコンポーネントを備え得ることを理解されたい。たとえば、上で述べられたように、GPU 36は、複数の関連するシェーディングユニット40を有し得る。GPU 36は、同じシェーディング操作を実行するように、シェーディングユニット40のうちの2つ以上を指定することができ、シェーディングユニット40の各々は、シェーディング操作をマージするための、本開示の技法を実行するように構成される。一般に、ハードウェアシェーディングユニットは、特定のシェーディング操作を実行するための、GPU 36のようなGPUによって呼び出されるハードウェアコンポーネントのセットを指し得る。
[0072]一例では、本開示の態様は、単一のハードウェアシェーディングユニットを用いて、頂点シェーディング操作とジオメトリシェーディング操作とを実行することを含む。別の例では、本開示の態様は、単一のハードウェアシェーディングユニットを用いて、頂点シェーディング操作とハルシェーディング操作とを実行することを含む。さらに別の例では、本開示の態様は、単一のハードウェアシェーディングユニットを用いて、ドメインシェーディング操作とジオメトリシェーディング操作とを実行することを含む。本開示の態様はまた、ハードウェアシェーディングユニットが複数のシェーディング操作の間を移行する方式に関する。すなわち、本開示の態様は、ハードウェアシェーディングユニットを用いて第1のシェーディング操作を実行することと、同じハードウェアシェーディングユニットを用いて第2のシェーディング操作を実行することとの間を移行することに関する。
[0073]たとえば、本開示の態様によれば、GPU 36は、頂点シェーディング操作を実行するように指定されたシェーディングユニット40を用いて、頂点シェーディングされた頂点を出力するために、頂点シェーディング操作を実行して、入力された頂点をシェーディングすることができる。この例では、シェーディングユニット40は、入力として単一の頂点を受け取り出力として単一の頂点を生成するインターフェースを用いて構成され得る。加えて、GPU 36は、同じシェーディングユニット40を用いて、ジオメトリシェーディング操作を実行して、頂点シェーディングされた頂点の1つまたは複数に基づいて、1つまたは複数の新たな頂点を生成することができる。ジオメトリシェーディング操作は、1つまたは複数の頂点シェーディングされた頂点の少なくとも1つに対して行われて、1つまたは複数の新たな頂点を出力することができる。再び、単一のシェーディングユニット40に関して説明されるが、これらの技法は、GPU 36の複数のシェーディングユニット40によって同時に実施され得る。
[0074]いくつかのAPIは、頂点シェーディング操作を実行するように指定されたシェーディングユニット40が1:1インターフェースを実装または堅持することを求めることがあり、1:1インターフェースは、入力として単一の頂点を受け取り出力として単一の頂点を生成する。対照的に、ジオメトリシェーディング操作を実行するように指定されたシェーディングユニット40は、1:Nインターフェースを実装または堅持することができ、1:Nインターフェースは、入力として1つまたは複数の頂点を受け取り、出力として1つまたは複数の(かつしばしば多数の、したがって上で「N」が使用される)頂点を生成する。
[0075]本開示の態様によれば、GPU 36は、頂点シェーディング操作を実行するように指定されたシェーディングユニット40の1:1インターフェースを利用して、ジオメトリシェーダプログラムの複数のインスタンスを呼び出すことによって、この1:Nジオメトリシェーダインターフェースをエミュレートすることができる。GPU 36は、これらのジオメトリシェーダプログラムの各々を同時に実行して、ジオメトリシェーダ操作を実行することから得られる新たな頂点の1つを生成することができる。すなわち、シェーディングユニット40が一般に「シェーダプログラム」と呼ばれるものの複数のインスタンスを同時に実行できるように、シェーディングユニット40は、HLSL(たとえば、グラフィックスレンダリングAPIを伴う)を使用してプログラム可能であり得る。これらのシェーダプログラムは、「ファイバー」または「スレッド」(これらの両方が、プログラムまたは実行のスレッドを形成する命令のストリームを指し得る)と呼ばれ得る。本開示の態様によれば、かつ以下でより詳細に説明されるように、GPU 36は、頂点シェーディング操作のために指定されるハードウェアシェーディングユニットを使用して、ジオメトリシェーダプログラムの複数のインスタンスを実行することができる。同じシェーディングユニット40が両方のシェーダ、たとえば、頂点シェーダとジオメトリシェーダとを順番に実行するように、GPU 36は、ジオメトリシェーダ命令を頂点シェーダ命令に付加することができる。
[0076]別の例では、本開示の態様によれば、GPU 36は、頂点シェーディング操作を実行するように指定されたハードウェアシェーディングユニットを用いて、頂点シェーディングされた頂点を出力するために、頂点シェーディング操作を実行して、入力された頂点をシェーディングすることができる。ハードウェアシェーディングユニットは、入力として単一の頂点を受け取り出力として単一の頂点を生成するインターフェースを堅持し得る。加えて、GPUは、頂点シェーディング操作を実行するために指定された同じハードウェアシェーディングユニットを用いて、1つまたは複数のテッセレーション操作(たとえば、ハルシェーディング操作および/またはドメインシェーディング操作)を実行して、頂点シェーディングされた頂点の1つまたは複数に基づいて1つまたは複数の新たな頂点を生成することができる。1つまたは複数のテッセレーション操作は、1つまたは複数の頂点シェーディングされた頂点の少なくとも1つに対して行われて、1つまたは複数の新たな頂点を出力することができる。
[0077]たとえば、上で説明されたシェーダステージに加えて、いくつかのグラフィックスレンダリングパイプラインはまた、ハルシェーダステージと、テッセレータステージと、ドメインシェーダステージとを含み得る。一般に、ハルシェーダステージ、テッセレータステージ、およびドメインシェーダステージが、ハードウェアテッセレーションに対応するために含まれる。すなわち、ハルシェーダステージ、テッセレータステージ、およびドメインシェーダステージが、たとえば、CPU 32によって実行されているソフトウェアアプリケーションによる実行ではなく、GPU 36によるテッセレーションに対応するために含まれる。
[0078]本開示の態様によれば、GPU 36は、同じシェーディングユニット40を用いて、頂点シェーディング操作とテッセレーション操作とを実行することができる。たとえば、GPU 36は、2つのパスで頂点シェーディング操作とテッセレーション操作とを実行することができる。本開示の態様によれば、かつ以下でより詳細に説明されるように、GPU 36は、異なるシェーディング操作の間の移行を可能にするための種々の値を記憶することができる。
[0079]ある例では、第1のパスでは、GPU 36は、頂点シェーディング操作とハルシェーディング操作とを実行するように1つまたは複数のシェーディングユニット40を指定することができる。この例では、GPU 36は、ハルシェーダ命令を頂点シェーダ命令に付加することができる。したがって、同じシェーディングユニット40が、頂点シェーディング命令とハルシェーダ命令とを順番に実行する。
[0080]第2のパスでは、GPU 36は、ドメインシェーディング操作とジオメトリシェーディング操作とを実行するように1つまたは複数のシェーディングユニット40を指定することができる。この例では、GPU 36は、ドメインシェーダ命令をジオメトリシェーダ命令に付加することができる。したがって、同じシェーディングユニット40が、ドメインシェーディング操作とジオメトリシェーディング操作とを順番に実行する。複数のパスで複数のシェーディング操作を実行することによって、GPU 36は、同じシェーディングハードウェアを使用して、追加のシェーディング能力を有するGPUをエミュレートすることができる。
[0081]本開示の態様はまた、GPU 36が複数のシェーディング操作の間を移行する方式に関する。たとえば、本開示の態様は、操作が同じハードウェアシェーディングユニットによって順番に実行されるように、シェーディング操作が一緒にパッチされる方式に関する。
[0082]ある例では、本開示の態様によれば、GPU 36は、レンダリングパイプラインの第1のシェーダステージと関連付けられる第1のシェーディング操作を実行するように、1つまたは複数のシェーディングユニット40を指定することができる。GPU 36は、第1のシェーディング操作が完了すると、シェーディングユニット40の動作モードを切り替えることができる。GPU 36は次いで、第1のシェーディング操作を実行するように指定された同じシェーディングユニット40を用いて、レンダリングパイプラインの第2の異なるシェーダステージと関連付けられる第2のシェーディング操作を実行することができる。
[0083]いくつかの例によれば、GPU 36は、複数のモードを使用するシェーディング操作を一緒にパッチされることができ、各モードは、関連するシェーディング操作の特定のセットを有する。たとえば、第1のモードは、ドローコールが頂点シェーディング操作のみを含むことを示し得る。この例では、ドローコールを実行すると、GPU 36は、モード情報に従って頂点シェーディング操作を実行するように、1つまたは複数のシェーディングユニット40を指定することができる。加えて、第2のモードは、ドローコールが頂点シェーディング操作とジオメトリシェーディング操作の両方を含むことを示し得る。この例では、ドローコールを実行すると、GPU 36は、頂点シェーディング操作を実行するように、1つまたは複数のシェーディングユニット40を指定することができる。加えて、本開示の態様によれば、同じシェーディングユニットが頂点シェーディング操作とジオメトリシェーディング操作の両方を実行するように、GPU 36は、ジオメトリシェーダ命令を頂点シェーダ命令に付加することができる。以下でより詳細に説明されるように、追加のモードが、シェーダの他の組合せを示すために使用され得る。
[0084]いくつかの例では、GPUドライバ50は、GPU 36によって使用されるモード情報を生成することができる。本開示の態様によれば、異なるシェーダ(たとえば、頂点シェーディング操作、ジオメトリシェーディング操作、ハルシェーディング操作、ドメインシェーディング操作など)は、同じシェーディングユニット40によって順番に実行されるように、特定の方式でコンパイルされる必要はない。むしろ、各シェーダは、GPU 36によって、ドローのときに独立にコンパイルされ(任意の他のシェーダを参照することなく)、一緒にパッチされ得る。すなわち、ドローコールを実行すると、GPU 36は、ドローコールと関連付けられるモードを決定し、それに従ってコンパイルされたシェーダを一緒にパッチされることができる。
[0085]本開示の技法は、シェーディング操作を実行するための限られた数のシェーディングユニット40を有するGPU(GPU 36のような)が、より多数のシェーディングユニット40を有するGPUをエミュレートすることが可能になり得る。たとえば、GPU 36は、3つ以上のシェーディング操作(たとえば、頂点シェーディング操作およびピクセルシェーディング操作)を実行するようにシェーディングユニット40を指定することを妨げられ得るが、本開示の技法は、GPU 36が、シェーディングユニット40を再構成することなく、追加のシェーディング操作(たとえば、ジオメトリシェーディング操作、ハルシェーディング操作、および/またはドメインシェーディング操作)を実行することを可能にし得る。すなわち、本技法は、シェーディングユニット40が、他のシェーディング操作を実行しながら、いくつかのシェーダステージの入力/出力の制約を堅持することを可能にし得る。
[0086]その上、同じシェーディングユニット40を用いて複数のシェーディング操作を実行することによって、本技法は、メモリのバス帯域幅の消費を減らすことができる。たとえば、他のシェーディング操作(たとえば、ジオメトリシェーディング)とともに頂点シェーディングが実行される場合、頂点シェーディングのために使用されるシェーディングユニット40は、他のシェーダ操作を実行する前に、頂点シェーディングの結果をオフチップメモリ(ストレージユニット48のような)に記憶する必要はない。むしろ、頂点シェーディングの結果は、GPUメモリ38に記憶され、ジオメトリシェーディング操作のために直ちに使用され得る。
[0087]このようにして、本技法は、追加のシェーディングユニット40を有するGPUと比較して、メモリのバス帯域幅の消費を減らすことができ、これにより電力消費が減り得る。したがって、本技法は、追加のハードウェアシェーダユニットを有するGPUよりも電力消費が少ない、より電力効率の高いGPUを促進し得る。したがって、いくつかの例では、本技法は、モバイルデバイス、ラップトップコンピュータ、および一定の専用の電力供給を有さない他のタイプのデバイスのような、電力が限られているデバイスにおいて展開され得る。
[0088]コンピューティングデバイス30は、明快のために図1に示されていない追加のモジュールまたはユニットを含み得ることを理解されたい。たとえば、コンピューティングデバイス30は、データを送信し受信するための送受信機モジュールを含んでよく、コンピューティングデバイス30と別のデバイスまたはネットワークとの間のワイヤレス通信または有線通信を可能にするための回路を含み得る。コンピューティングデバイス30はまた、コンピューティングデバイス30がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも図1に示されていないスピーカーとマイクロフォンとを含んでよく、または、コンピューティングデバイス30がメディアプレーヤーである例においてスピーカーを含んでよい。いくつかの例では、ユーザインターフェースユニット46およびディスプレイユニット42は、コンピューティングデバイス30が、外部ユーザインターフェースまたはディスプレイとインターフェースする能力があるデスクトップコンピュータまたは他のデバイスである例において、コンピューティングデバイス30の外部にあり得る。
[0089]図2は、例示的なグラフィックスプロセシングパイプライン80を示すブロック図である。例示的なパイプライン80は、入力アセンブラステージ82と、頂点シェーダステージ84と、ジオメトリシェーダステージ86と、ラスタライザステージ88と、ピクセルシェーダステージ90と、出力マージャステージ(merger stage)92とを含む。いくつかの例では、DirectX 10(またはDirect3D 10)のようなAPIは、図2に示されるステージの各々を使用するように構成され得る。グラフィックスプロセシングパイプライン80は、GPU 36によって実行されるものとして以下で説明されるが、種々の他のグラフィックスプロセッサによって実行され得る。
[0090]グラフィックスプロセシングパイプライン80は一般に、プログラム可能なステージ(たとえば、丸い角によって示される)と固定された機能のステージ(たとえば、四角形の角によって示される)とを含む。たとえば、グラフィックスレンダリングパイプライン80のいくつかのステージと関連付けられるグラフィックスレンダリング操作は一般に、シェーディングユニット40の1つのようなプログラム可能なシェーダプロセッサによって実行され、一方、グラフィックスレンダリングパイプライン80の他のステージと関連付けられる他のグラフィックスレンダリング操作は一般に、GPU36と関連付けられるプログラム可能ではない固定された機能のハードウェアユニットによって実行される。シェーディングユニット40によって実行されるグラフィックスレンダリングステージは一般に、「プログラム可能」ステージと呼ばれることがあり、一方、固定された機能のユニットによって実行されるステージは一般に、固定された機能ステージと呼ばれることがある。
[0091]入力アセンブラステージ82は、固定された機能ステージとして図2の例では示され、一般に、グラフィックスプロセシングパイプライン80にグラフィックスデータ(三角形、線、および点)を供給することを担う。たとえば、入力アセンブラステージ82は、高次の表面、プリミティブなどに対する頂点データを収集し、頂点データと属性とを頂点シェーダステージ84に出力することができる。したがって、入力アセンブラステージ80は、固定された機能の操作を使用して、ストレージユニット48のようなオフチップメモリから頂点を読み取ることができる。入力アセンブラステージ80は次いで、これらの頂点からパイプラインのワークアイテムを作成することができ、一方、また、頂点識別子(「VertexID」)と、インスタンス識別子(「InstanceID」、これは頂点シェーダに対して利用可能にされる)と、プリミティブ識別子(「PrimitiveID」、これはジオメトリシェーダおよびピクセルシェーダに対して利用可能にされる)とを生成する。入力アセンブラステージ80は、頂点を読み取ると、VertexIDと、InstanceIDと、PrimitiveIDとを自動的に生成することができる。
[0092]頂点シェーダステージ84は、受信された頂点データと属性とを処理することができる。たとえば、頂点シェーダステージ84は、変換、スキニング、頂点変位、および頂点ごとのマテリアルの属性の計算のような、頂点ごとの処理を実行することができる。いくつかの例では、頂点シェーダステージ84は、テクスチャの座標、頂点の色、頂点の照明、フォグファクタなどを生成することができる。頂点シェーダステージ84は一般に、単一の入力された頂点を取り込み、単一の処理された出力される頂点を出力する。
[0093]ジオメトリシェーダステージ86は、頂点データ(たとえば、三角形に対しては3つの頂点、線に対しては2つの頂点、または点に対しては単一の頂点)によって定義されるプリミティブを受け取り、このプリミティブをさらに処理することができる。たとえば、ジオメトリシェーダステージ86は、他のあり得るプロセシング操作の中でもとりわけ、シルエット−エッジの検出およびシャドウボリュームの突出のような、プリミティブごとの処理を実行することができる。したがって、ジオメトリシェーダステージ86は、入力(1つまたは複数の頂点を含み得る)として1つのプリミティブを受け取ることができ、0個、1個、または複数個のプリミティブ(やはり1つまたは複数の頂点を含み得る)を出力する。出力プリミティブは、ジオメトリシェーダステージ86を伴わずに可能であり得るものよりも多くのデータを含み得る。出力データの総量は、頂点の数を乗算された頂点のサイズに等しくてよく、呼出しごとに制限され得る。ジオメトリシェーダステージ86からのストリーム出力は、このステージに達したプリミティブが、メモリユニット48のようなオフチップメモリに記憶されることを可能にし得る。ストリーム出力は通常、ジオメトリシェーダステージ86と結び付けられ、(たとえば、APIを使用して)両方が一緒にプログラムされ得る。
[0094]ラスタライザステージ88は通常、プリミティブをクリッピングして、ピクセルシェーダステージ90のためにプリミティブを準備することを担う、固定された機能のステージである。たとえば、ラスタライザステージ88は、(カスタムクリップ境界を含む)クリッピングと、パースペクティブ分割と、ビューポート/シザーの選択および実装と、レンダリング対象の選択と、プリミティブのセットアップとを実行することができる。このようにして、ラスタライザステージ88は、ピクセルシェーダステージ90によるシェーディングのために多数のフラグメントを生成することができる。
[0095]ピクセルシェーダステージ90は、ラスタライザステージ88からフラグメントを受け取り、色のようなピクセルごとのデータを生成する。ピクセルシェーダステージ96はまた、テクスチャ混合および照明モデル計算のような、ピクセルごとの処理を実行することができる。したがって、ピクセルシェーダステージ90は、入力として1つのピクセルを受け取ることができ、同じ相対的な位置において1つのピクセル(またはそのピクセルに対して0の値)を出力することができる。
[0096]出力マージャステージ92は一般に、様々なタイプの出力データ(ピクセルシェーダ値、深度およびステンシル情報のような)を組み合わせて最終的な結果を生成することを担う。たとえば、出力マージャステージ92は、レンダリング対象(ピクセル位置)に対して、固定された機能である混合、深度、および/またはステンシル操作を実行することができる。頂点シェーダステージ84、ジオメトリシェーダステージ86、およびピクセルシェーダステージ90に一般に関して上では説明されたが、前述の説明の各々は、それぞれのシェーディング操作を実行するようにGPUによって指定された1つまたは複数のシェーディングユニット(シェーディングユニット40のような)を指し得る。
[0097]一部のGPUは、図2に示されたシェーダステージのすべてをサポートすることが不可能であり得る。たとえば、一部のGPUは、ハードウェアおよび/またはソフトウェアの制約(たとえば、限られた数のシェーディングユニット40および関連するコンポーネント)により、3つ以上のシェーディング操作を実行するようにシェーディングユニットを指定することが不可能であり得る。ある例では、一部のGPUは、ジオメトリシェーディングステージ86と関連付けられる操作をサポートすることができない。むしろ、GPUは、頂点シェーダステージ84とピクセルシェーダステージ90とを実行するようにシェーディングユニットに指定することに対するサポートのみを含み得る。したがって、シェーディングユニットによって実行される操作は、頂点シェーダステージ84およびピクセルシェーダステージ90と関連付けられる入力/出力インターフェースを堅持しなければならない。
[0098]加えて、いくつかの例では、ジオメトリシェーダステージ86をパイプラインに導入することで、ジオメトリシェーダステージ86を含まないグラフィックスプロセシングパイプラインと比較して、ストレージユニット48に対する追加の読取りと書込みとが発生し得る。たとえば、上で述べられたように、頂点シェーダステージ86は、ストレージユニット48のようなオフチップメモリに頂点を書き出すことができる。ジオメトリシェーダステージ86は、これらの頂点(頂点シェーダステージ84によって出力された頂点)を読み取り、新たな頂点を書き込むことができ、新たな頂点は次いでピクセルシェーディングされる。ストレージユニット48に対するこれらの追加の読取りおよび書込みは、メモリのバス帯域幅を消費しつつ、消費される電力の量も増やす可能性がある。この意味で、頂点シェーダステージ84、ジオメトリシェーダステージ86、およびピクセルシェーダステージ90の各々を含むグラフィックスプロセシングパイプラインを実装することは、ストレージユニット48からデータを取り出す際の遅延が原因で、レンダリングされた画像を出力するのがより遅い可能性もある、電力効率の低いGPUをもたらし得る。
[0099]上で述べられたように、本開示の態様は一般に、ある特定のシェーディング操作のために指定された1つのシェーディングユニット40が2つ以上のシェーディング機能を実行できるように、シェーディングユニット40の1つまたは複数の機能をマージすることに関する。以下でより詳細に説明されるように、いくつかの例では、1つのシェーディングユニット40は、頂点シェーダステージ84と関連付けられる頂点シェーディング操作を実行することを指定され得る。本開示の態様によれば、同じシェーディングユニット40はまた、ジオメトリシェーダステージ86と関連付けられるジオメトリシェーディング操作を実行するように実装され得る。すなわち、GPU 36は、頂点シェーディング操作を実行するためにシェーディングユニット40を呼び出すことができるが、ジオメトリシェーディングのタスクを実行するようにシェーディングユニット40を再指定することなく、ジオメトリシェーディング操作を実行するようにシェーディングユニット40を実装することもできる。
[0100]図3Aおよび図3Bは、本開示の態様による、グラフィックスレンダリングパイプラインにおけるデータフローの概念図である。たとえば、図3Aは、頂点シェーダステージ100と、ジオメトリシェーダステージ102、ストリームアウト104と、ピクセルシェーダステージ106とを示す。一般に、図3Aに示される頂点シェーダステージ100、ジオメトリシェーダステージ102、およびピクセルシェーダステージ106は各々、シェーディング操作を実行するための関連するハードウェアを表す。すなわち、たとえば、頂点シェーダステージ100、ジオメトリシェーダステージ102、およびピクセルシェーダステージ106の各々は、それぞれのタスクを実行するように指定されたシェーディングユニット40のような、別々に指定されたプロセシングユニットと関連付けられ得る。
[0101]たとえば、頂点シェーダステージ100は、頂点シェーディング操作を実行する(シェーディングユニット40のような)1つまたは複数のユニットを表す。すなわち、頂点シェーダステージ100は、頂点シェーディング操作を実行するためにGPU 36によって呼び出されたコンポーネントを含み得る。たとえば、頂点シェーダステージ100は、入力として頂点を受け取り、3次元(3D)モデル空間からスクリーン空間中の2次元(2D)座標へと、入力された頂点を変換することができる。頂点シェーダステージ100は次いで、頂点の変換されたバージョン(これは「変換された頂点」と呼ばれ得る)を出力することができる。頂点シェーダステージ100は普通は新たな頂点を生成しないが、一度に1つの頂点に対して行われる。結果として、頂点シェーダステージ100は、1対1(1:1)ステージと呼ばれることがあり、その頂点シェーダステージ100は、単一の入力される頂点を受け取り、単一の出力される頂点を出力する。
[0102]ジオメトリシェーダステージ102は、ジオメトリシェーディング操作を実行する(シェーディングユニット40のような)1つまたは複数のユニットを表す。すなわち、ジオメトリシェーダステージ102は、ジオメトリシェーディング操作を実行するためにGPU 36によって呼び出されたコンポーネントを含み得る。たとえば、ジオメトリシェーダステージ102は、キューブマップに対する単一パスのレンダリング、ポイントスプライトの生成などのような、多種多様な操作を実行するのに有用であり得る。通常、ジオメトリシェーダステージ102は、頂点シェーダステージ100によって頂点シェーディングされた1つまたは複数の変換された頂点からなるプリミティブを受け取る。ジオメトリシェーダステージ102は、ジオメトリシェーディング操作を実行して、新たなプリミティブを形成し得る新たな頂点を作成する(または場合によっては、追加の新たな頂点を有する新たなタイプのプリミティブへと入力プリミティブを変換する)。
[0103]たとえば、ジオメトリシェーダステージ102は通常、1つまたは複数の変換された頂点によって定義されるプリミティブを受け取り、受け取られたプリミティブに基づいて1つまたは複数の新たな頂点を生成する。ジオメトリシェーダステージ102は次いで、新たな頂点を出力する(1つまたは複数の新たなプリミティブを形成し得る)。結果として、ジオメトリシェーダステージ102は、ジオメトリシェーダステージ102が1つまたは複数の変換された頂点を受け取り多数の新たな頂点を生成するという点で、1対多数(1:N)ステージまたはさらには多数対多数(N:N)ステージと呼ばれることがある。
[0104]1対多数またはさらには多数対多数であると説明されるが、ジオメトリシェーダステージ102はまた、いくつかの例では、新たな頂点を何ら出力しなくてよく、または、単一の新たな頂点のみを出力してよい。この点で、本技法は、すべてのインスタンスにおいて多数の頂点を出力するジオメトリシェーダのみに限定されるべきではなく、以下でより詳細に説明されるように、0個、1個、または多数の新たな頂点を出力し得る任意のジオメトリシェーダステージ102に関して一般に実装され得る。
[0105]ジオメトリシェーダステージ102の出力は、(たとえば、ストリームアウト104の間の)追加のジオメトリシェーディングのために記憶され得る。ジオメトリシェーダステージ102の出力はまた、新たな頂点(および変換された頂点)をラスタライズしてピクセルからなるラスター画像を生成する、ラスタライザに出力され得る。
[0106]ジオメトリシェーダステージ102からのピクセルはまた、ピクセルシェーダステージ106にも渡され得る。ピクセルシェーダステージ106(フラグメントシェーダとも呼ばれ得る)は、各ピクセルの色と他の属性とを計算し、多種多様な操作を実行してシェーディングされたピクセルを生成することができる。シェーディングされたピクセルは、深度マップとマージされてよく、他のシェーディング後操作が、コンピュータモニタ、テレビジョン、または他のタイプのディスプレイデバイスなどのディスプレイデバイスを介して表示するための出力画像を生成するために実行され得る。
[0107]図3Aに示されるシェーダステージは、1つまたは複数のグラフィックスAPIをサポートすることができる。説明のための例では、頂点シェーダステージ100、ジオメトリシェーダステージ102、およびピクセルシェーダステージ106は、DirectX 10 APIをサポートすることができる。すなわち、DirectX 10 APIを使用して作成されたコードが、グラフィックスデータをレンダリングするために、頂点シェーダステージ100、ジオメトリシェーダステージ102、およびピクセルシェーダステージ106によって実行され得る。しかしながら、ジオメトリシェーダステージ102は、すべてのグラフィックスレンダリングパイプラインに含まれなくてよく、すべてのGPUによって実行可能でなくてよい。たとえば、DirectX 10 APIはジオメトリシェーダステージ102に対するサポートを含むが、いくつかのより以前の改訂(たとえば、DirectX 9)はそのようなサポートを含まない。したがって、DirectX APIのより以前の改訂によって作成されたコードを実行するように設計されるGPU(または他のAPIのために設計されたGPU)は、ジオメトリシェーダステージ102を実行するようにシェーディングユニット40を指定することが不可能であり得る。
[0108]図3Bは、本開示の技法による、(図3Aに示される例に対する)グラフィックスレンダリングパイプラインにおけるデータフローの修正された概念図を示す。図3Bに示される例は、マージされた頂点シェーダ/ジオメトリシェーダ(VS/GS)ステージ110と、ストリームアウト112と、ピクセルシェーダステージ114とを含む。本開示の態様によれば、マージされたVS/GSステージ110は、頂点シェーダステージ100およびジオメトリシェーダステージ102に関して上で説明された機能を実行するための1つまたは複数のプロセシングユニットを含み得る。すなわち、頂点シェーダステージ100およびジオメトリシェーダステージ102は、頂点シェーディング操作およびジオメトリシェーディング操作をそれぞれ実行するための、GPU(GPU 36のような)によって呼び出される別個のユニットを表すが、本開示の態様によれば、そのような機能は、実質的に同一のハードウェア(たとえば、シェーディングユニット40)によって実行され得る。
[0109]たとえば、頂点シェーディング操作がGPU 36によって呼び出されると、VS/GSステージ110は、頂点シェーディング操作とジオメトリシェーディング操作の両方を実行することができる。すなわち、マージされたVS/GSステージ110は、頂点シェーダステージ100に関して上で説明された操作を実行し、ジオメトリシェーダステージ102に関して上で説明された操作を実行するための、シェーディングユニット40の同じセットを含み得る。
[0110]しかしながら、GPU 36は最初は、頂点シェーディングユニットとして各シェーディングユニット40を呼び出すので、GPU 36のコンポーネントは、特定のフォーマットで、たとえば、1:1の入力/出力インターフェースを堅持して、頂点シェーディングユニットからデータを受け取るように構成され得る。たとえば、GPU 36は、単一のエントリーをキャッシュ(たとえば、以下でより詳細に説明されるような頂点パラメータキャッシュ)へと割り振り、シェーディングされた頂点に対するシェーディングユニット40からの出力を記憶することができる。GPU 36はまた、シェーディングユニット40が呼び出される方式に基づいて、何らかのラスタライズ操作を実行することができる。以下でより詳細に説明されるように、本開示の態様は、GPU 36が、頂点シェーディング操作と同じシェーディングユニットによってジオメトリシェーディング操作を実行しつつ、適切なインターフェースを依然として堅持することを可能にする。
[0111]いくつかの例では、ジオメトリシェーダステージ102は、基本的に、データの小さな増幅(たとえば、ポイントスプライトの生成)のために使用され得る。そのような操作は、ジオメトリシェーダの呼出しごとに、比較的低いALU使用量しか必要としないことがある。したがって、シェーディングユニット40のALUは、ジオメトリシェーダステージ102の間は完全には利用されないことがある。本開示の態様によれば、ジオメトリシェーダステージ102は、マージされたVS/GSステージ110を形成するために頂点シェーダステージ100に付加されてよく、マージされたVS/GSステージ110は、GPUアーキテクチャにおいて頂点シェーダステージ100として呼び出され得る。上で説明された方式でマージされたVS/GSステージ110を呼び出すことで、頂点シェーディング操作とジオメトリシェーディング操作の両方が同じプロセシングユニットによって実行されることを可能にすることによって、ALUの利用率を上げることができる。
[0112]マージされたVS/GSステージ110を可能にするために、図4に示される例に関してより詳細に説明されるように、GPU 36は、頂点シェーディング操作(1:1のステージ)とジオメトリシェーディング操作(1:Nのステージ)との間の移行のための機能を実行することができる。このようにして、本開示の技法は、限られたリソース(たとえば、このことは、GPUが3つ以上のシェーディング操作を実行するようにシェーディングユニット40を指定するのを妨げ得る)を有するGPUが、追加のリソースを有するGPUをエミュレートすることを可能にする。
[0113]図4は、本開示で説明される技法を実施して頂点シェーディング操作とジオメトリシェーディング操作とを実行する、ハードウェアシェーディングユニットの例示的な動作を示す図である。GPU 36(図1)に関して説明されるが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0114]図4の例では、GPU 36は、頂点シェーディング操作を実行するようにシェーディングユニット40を指定することができる。したがって、GPU 36のコンポーネントは、頂点のデータをシェーディングユニット40に送り、シェーディングされた頂点のデータをシェーディングユニット40から受け取るように構成され得る(たとえば、1:1のインターフェース)。シェーディングユニット40は、頂点シェーダを実行して頂点シェーディング操作を行うことができ、これによって、プリミティブの第1のセット120を生成する。図4の例では、プリミティブの第1のセット120は、点p0〜p3として図示される4つの頂点を有する、隣接した三角形を含む。
[0115]頂点シェーディング操作を実行した後で、GPU 36は、シェーディングされた頂点をローカルのメモリリソースに記憶することができる。たとえば、GPU 36は、(もしあれば)「切断」情報およびstreamidとともに、(たとえば、GPUメモリ38の)位置キャッシュに頂点シェーダ出力をエクスポートすることができる。頂点シェーディング操作およびジオメトリシェーディング操作は、VS END命令によって分離され得る。したがって、VS END命令を実行し頂点シェーディング操作を完了した後、頂点シェーディング操作を実行するように指定された1つまたは複数のシェーディングユニット40は、各々、ジオメトリシェーディング操作の実行を開始する。
[0116]すなわち、本開示の態様によれば、頂点シェーディング操作を実行するように指定された同じシェーディングユニット40はまた、ジオメトリシェーディング操作を実行する。たとえば、GPU 36は、1つまたは複数のリソースポインタを変更することによって、状態をジオメトリシェーダ固有のリソース(たとえば、ジオメトリシェーダ定数、テクスチャオフセットなど)へと変更することができる。GPU 36は、シェーディング操作に割り当てられたモード(ドローモード)に従って、この状態変更を実行することができる。
[0117]いくつかの例では、GPU 36は、ドローコールを実行するときにドローモードを設定することができる。ドローモードは、どのシェーディング操作がドローコールと関連付けられるかを示し得る。説明のための例では、0というドローモードは、ドローコールが頂点シェーディング操作のみを含むことを示し得る。1というドローモードは、ドローコールが頂点シェーディング操作とジオメトリシェーディング操作の両方を含むことを示し得る。以下でより詳細に説明されるように、他のドローモードも可能である。表1は、2つのモードを有する例示的なモードの表を与える。
[0118]上の表1の例では、「フロー」は、それぞれのモードと関連付けられる操作(GPU 36によって実行されるような)のフローを示す。たとえば、モード0は、頂点シェーディング(VS)操作とピクセルシェーディング(PS)操作とを含む。したがって、GPU 36は、モード0のドローコールを実行すると、頂点シェーディング操作とピクセルシェーディング操作とを実行するようにシェーディングユニット40を指定することができる。表1のモード1は、頂点シェーディング操作およびピクセルシェーディング操作、さらには、ジオメトリシェーディング(GS)操作を含む。
[0119]したがって、GPU 36は、頂点シェーディング操作とピクセルシェーディング操作とを実行するようにシェーディングユニット40を指定することができる。しかしながら、GPU 36はまた、頂点シェーダ操作を実行することを担う同じシェーディングユニット40によってジオメトリシェーダ操作が実行されるように、頂点シェーダ命令にジオメトリシェーダ命令を付加することができる。「misc」ビットは、同じシェーディングユニット40が連続して複数の異なるシェーダを実行することを可能にするために使用される変数(たとえば、rel_primID、rel_vertex、GsInstance、Gsoutvertex)のために確保される。
[0120]図4の例では、同じシェーディングユニット40はまた、プリミティブの第1のセット120を入力として使用して、頂点V0〜V5を有するプリミティブの第2のセット124(トライアングルストリップと呼ばれ得る)を生成する。頂点V0〜V5を生成するために、頂点シェーディングのために指定されたシェーディングユニット40は、メモリシェーダ操作の複数のインスタンス(たとえば、出力識別子(outID)によって図示され、同じジオメトリシェーダプログラムの異なるインスタンスとしても言及され得る)を実行する。ジオメトリシェーダ操作の各インスタンスは、同じアルゴリズムを実行して、同じジオメトリシェーディング操作を実行し、1つまたは複数の新たな頂点V0〜V5のそれぞれのインスタンスを生成する。
[0121]図4に示される表の8個の列は、ジオメトリシェーダ操作(またはプログラム)の8個の別個のインスタンスに対応し、各列は左から右へ、0〜7のジオメトリシェーダ操作outIDによって識別され得る。入力されたプリミティブごとのマージされたVS/GSの出力の数は、dcl_maxoutputvertexcount*GSInstancecountに等しくてよく、各VS/GSの出力は、ジオメトリシェーダステージから放出される1つの頂点である。ジオメトリシェーダステージの出力される頂点の数がdcl_maxoutputvertexcountより少ない例では、その出力される頂点は、以下でより詳細に説明されるように、条件に応じて廃棄または省略され得る(「消滅させられる」と呼ばれ得る)。したがって、各ファイバーは、MaxVertexOutputによって規定されるジオメトリシェーダの出力される頂点ごとの、頂点シェーダの1回の呼出しおよびそれに続くジオメトリシェーダの1回の呼出しに対応する。
[0122]図4に示される例では、ジオメトリシェーダ操作の8個のインスタンスの各々は、頂点シェーディング操作のために指定されたのと同じシェーディングユニット40によって、しばしば同時に付加され実行されて、1つまたは複数の新たな頂点の別個のインスタンスを生成する。したがって、ジオメトリシェーダ操作のインスタンスの各々は、6個すべての頂点(V0〜V5)を生成するが、6個の新たな頂点の対応する1つのみを出力する。ジオメトリシェーダ操作の各インスタンスは、頂点シェーディング操作を実行するようにシェーディングユニット40を呼び出すことと関連付けられる1:1のインターフェースを堅持するために、6個の新たな頂点の対応する1つのみを出力する。
[0123]図4の例で示されるように、ジオメトリシェーダ操作の各々は、そのoutIDと一致する6個の新たな頂点の1つを出力する。したがって、outID = 0を有するジオメトリシェーダ操作の第1のインスタンスは、6個の新たな頂点のうちの第1の頂点、V0を出力する。outID = 1を有するジオメトリシェーダ操作の第2のインスタンスは、6個の新たな頂点のうちの第2の頂点、V1を出力する。outID = 2を有するジオメトリシェーダ操作の第3のインスタンスは、6個の新たな頂点のうちの第3の頂点、V2を出力する。outID = 3を有するジオメトリシェーダ操作の第4のインスタンスは、6個の新たな頂点のうちの第4の頂点、V3を出力する。outID = 4を有するジオメトリシェーダ操作の第5のインスタンスは、6個の新たな頂点のうちの第2の頂点、V4を出力する。outID = 5を有するジオメトリシェーダ操作の第6のインスタンスは、6個の新たな頂点のうちの第6の頂点、V5を出力する。
[0124]ジオメトリシェーダ操作は6個の新たな頂点のみを生成し、ジオメトリシェーダ操作の第7および第8のインスタンスのoutIDは6個の新たな頂点のいずれにも対応しないので、ジオメトリシェーダ操作の第7および第8のインスタンスは、「消滅させられ」、または終了させられる。したがって、シェーディングユニット40は、ジオメトリシェーダ操作のこれらのインスタンスと関連付けられる対応する頂点がないと判定すると、ジオメトリシェーダ操作の第7および第8のインスタンスの実行を終了する。
[0125]以下に示される表2は、頂点シェーディング操作とジオメトリシェーディング操作とを実行するためにGPU 36によって保持され得るいくつかのパラメータを示す。
[0126]表2に示されるいくつかのパラメータ(たとえば、uv_msb、Rel_patchid)は、VS/GS操作のために使用されず、以下でより詳細に説明される。表2の例では、インデックスは、頂点の相対的なインデックスを示す。PrimitiveIDは、関連する頂点のプリミティブを識別するために、ジオメトリシェーディング操作の間に使用されるプリミティブIDを示し、システムにより生成される値(たとえば、GPU 36の1つまたは複数のハードウェアコンポーネントによって生成される)であり得る。上で述べられるように、Miscは、VS操作の後にGS操作を実行するための、確保されたキャッシュの値を示す。たとえば、以下で示される表3は、図4に関して上で説明された頂点シェーディング操作とジオメトリシェーディング操作とを実行するときのパラメータ値を示す。
[0127]多数のファイバー(たとえば、命令)が頂点シェーディング操作とジオメトリシェーディング操作とを実行するために割り振られるが、いくつかの例では、GPU 36は、ファイバーのサブセットのみを実行し得る。たとえば、GPU 36は、シェーディングユニット40を用いて命令を実行する前に、命令が有効かどうかを判定することができる(上の表3に示されるvalid_as_input)。割り振られたファイバーのうちの3つのみがシェーディングされた頂点を生成するために使用されるので、GPU 36は、頂点シェーディング操作を実行するときに残りのファイバー(上の表3のファイバー3〜7)を実行しなくてよく、このことは電力を節減し得る。以下でより詳細に説明されるように、GPU 36は、マスク(たとえば、以下の図5Bのcov_mask_1)に基づいて、どのファイバーが実行されるべきかを判定することができる。
[0128]いくつかのAPI(たとえば、DirectX 10 API)は、ジオメトリシェーダステージからのいわゆる「ストリームアウト」を提供し、ここでストリームアウトは、新たな頂点がジオメトリシェーダに再び入力され得るように、ストレージユニット48のようなメモリへとジオメトリシェーダからこれらの新たな頂点を出力することを指す。
[0129]本技法は、ハードウェアユニットが、ジオメトリシェーダ操作を実行することで得られる新たな頂点をストレージユニット48に出力することを可能にすることによって、このストリームアウトの機能に対するサポートを提供することができる。このストリームアウトを介して出力される新たな頂点は、ラスタライザによって予想されるフォーマットではなく、予想されるジオメトリシェーダフォーマットで規定される。ハードウェアユニットは、これらの新たな頂点を取り出し、既存のジオメトリシェーダ操作を実施し続け、または、この状況では「ストリームアウト頂点」と呼ばれ得る、これらの頂点に対する新たなジオメトリシェーダ操作を実施し続けることができる。このようにして、本技法は、比較的限られた数のシェーディングユニット40を有する、GPU 36のようなGPUが、より多くのシェーディングユニットを有するGPUをエミュレートすることを可能にし得る。
[0130]図5Aおよび図5Bは、本開示の技法を実施するハードウェアシェーディングユニットによって実行され得る例示的な動作を示す。たとえば、図5Aは一般に、頂点シェーディング操作とジオメトリシェーディング操作とを実行するときにマージされたVS/GSハードウェアシェーディングユニットによって実行される動作のフローを示す。マージされたVS/GSハードウェアシェーディングユニットは、いくつかの例では、頂点シェーディング操作を実行するようにGPU 36によって指定されるが、本開示の技法に従って頂点シェーディング操作とハードウェアシェーディング操作の両方を実行する、シェーディングユニット40を含み得る。
[0131]図5Bは、マージされたVS/GSハードウェアシェーディングユニットによって実行され得る、図5Aに示される動作のフローに対応する擬似コードを一般に示す。図5Aおよび図5Bのいくつかの態様はGPU 36(図1)に関して説明され得るが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0132]図5Aに示される例では、マージされたVS/GSハードウェアシェーディングユニットは、頂点の属性、vertex_id、nstance_id、primitive_id、miscのようなシステム値を、一連のレジスタR0、R1、およびR2に書き込む(140)。通常、システム値は、GPUの任意のそれ以外には割り振られないメモリに記憶され得る。システムにより生成された値を所定の位置にある一連のレジスタに記憶することによって、GPU 36は、VSステージおよびGSステージの各々に対する、システムにより生成された値にアクセスすることができる。したがって、GSステージは、システムにより生成された値がどこに記憶されたかを判定するために、VSステージに基づいてコンパイルされる必要がない。むしろ、GPU 36は、ステージの各々を実行するときに所定のメモリ位置にアクセスして、システムにより生成された必要とされる値にアクセスすることができる。
[0133]マージされたVS/GSハードウェアユニットが次いで、頂点シェーディング操作を実行する(142)。頂点シェーディング操作に続いて、マージされたVS/GSハードウェアシェーディングユニットが、汎用レジスタ(GPR)の内容(たとえば、頂点シェーディング操作からのプリミティブの頂点)を、GPUメモリ38などのローカルメモリに書き込むことができる。図5Bに関して以下でより詳細に説明されるように、マージされたVS/GSハードウェアシェーディングユニットは次いで、GSのテクスチャおよび定数のオフセットに(146)、かつGSプログラムカウンタに(148)切り替えることができる。
[0134]マージされたVS/GSハードウェアシェーディングユニットは、頂点シェーディング操作からのプリミティブの頂点のような、ローカルメモリの内容を読み取り、ジオメトリシェーディング操作を実行することができる(150)。マージされたVS/GSハードウェアシェーディングユニットは、1つの頂点の属性を頂点パラメータキャッシュ(VPC)に出力し、さらに、ジオメトリシェーディングされた頂点の位置の指示、stream_id、任意の切断の指示、および任意の変換された値を、位置キャッシュに出力することができる。
[0135]図5Bは、マージされたVS/GSハードウェアシェーディングユニットによって実行され得る、図5Aに示される動作のフローに対応する擬似コードを一般に示す。各シェーダステージは、(たとえば、特定のステージが別のステージとどのようにリンクされるかの知識を伴わずに)、別々に、かつ独立にコンパイルされ得る。単一のハードウェアシェーディングユニットが複数のシェーディング操作を実行することを可能にするために、ハードウェアシェーディングユニットは、ローカルメモリにおいていくつかの位置を確保することができる。たとえば、ハードウェアシェーディングユニットは、シェーダステージ(VSまたはGS)の両方によってアクセスされ得るローカルメモリ中の位置を確保することができる。いくつかの変数(たとえば、PrimitiveID、misc、およびrel_patchid)は、2つ以上のシェーダステージによって使用され得る。したがって、ローカルメモリにおいて確保された位置は、2つ以上のシェーダステージによってアクセスされ得る、一般に使用される変数に対する標準化された位置を提供する。
[0136]図5Bに示される例では、ハードウェアシェーディングユニットは最初に、頂点シェーディング操作(VS)(図5Aの例ではステップ140〜142に対応し得る、上から下への第1の破線のボックスに含まれる)を実行することができる。本開示の態様によれば、ハードウェアシェーディングユニット(またはGPUの別のコンポーネント)は次いで、いわゆる「パッチコード」を実行して、頂点シェーディング操作からジオメトリシェーディング操作(図5Aの例ではステップ144〜148に対応し得る、上から下への第2の破線のボックスに含まれる)への切り替えを開始することができる。より具体的には、コマンドCHMSKおよびCHSHは、ハードウェアシェーディングユニットに、(上で説明されたような)実行されているドローコールのモードに従って、動作モードを切り替えさせることができる。
[0137]たとえば、ハードウェアシェーディングユニットは、頂点シェーディング操作からローカルGPUメモリに頂点データを書き込めるので、シェーディングされる頂点は、ジオメトリシェーディング操作を実行するときに利用可能である。ハードウェアシェーディングユニット(またはGPUの別のコンポーネント)は次いで、ジオメトリシェーディング操作のためのハードウェアシェーディングユニットのリソースを切り替えるマスク変更(CHMSK)命令を実行する。たとえば、CHMSK命令を実行することは、ハードウェアシェーディングユニットに、どのモードが現在実行されているかを判定させ得る。
[0138]上の表2に関して、CHMSKを実行することはまた、ハードウェアシェーディングユニットに、どのシェーダステージが有効か(たとえば、vs_valid、gs_validなど)を判定させ得る。上で述べられたように、GPU 36は、頂点シェーディング操作とジオメトリシェーディング操作とを実行するための多数のファイバーを割り振ることができる。しかしながら、CHMSKを実行すると、GPU 36は、ファイバーのサブセットのみを実行することができる。たとえば、GPU 36は、シェーディングユニット40を用いて命令を実行する前に、命令が有効かどうかを判定することができる。GPU 36は、有効ではないファイバーを実行しなくてよく(たとえば、シェーディングされた頂点を生成しない)、このことは電力を節減し得る。
[0139]ハードウェアシェーディングユニットはまた、シェーダ変更(CHSH)命令を実行して、ジオメトリシェーディング操作を実行するためにプログラムカウンタ(PC)を適切な状態オフセットへと切り替える。以下でより詳細に説明されるように、このパッチコード(図5Aの例ではステップ144〜148に対応し得る、上から下への第2の破線のボックスに含まれる)は、どのシェーダステージがマージされているかどうかに関係なく同一であり得る。
[0140]パッチコードを実行した後で、ハードウェアシェーダユニットは、頂点シェーディング操作を停止し、ジオメトリシェーディング操作(図5Aの例ではステップ150に対応する、上から下への第3の破線のボックスに含まれる)を実行する。通常、複数のシェーディング操作を実行するハードウェアシェーディングユニットによって実行されるシェーダ(シェーディング操作を実行するためのコード)は、シェーダの依存関係に基づく再コンパイルを必要とし得る。たとえば、primitiveID(システムにより生成される値)がGSステージによって使用される場合、VSステージは、GSステージがそこから値を選ぶことができる位置に、primitiveID値を置くように(たとえば、コンパイラ54によって)コンパイルされ得る。したがって、VSステージのコンパイルは、GSステージの必要性に依存し得る。
[0141]本開示の態様によれば、シェーダの各々は、他のシェーダとは関係なく独立にコンパイルされ得る。たとえば、シェーダは、他のシェーダがいつ実行されかの知識を伴わずに、独立にコンパイルされ得る。コンパイルの後、GPU 36は、ドローのときに実行されているドローコールと関連付けられるモード情報に基づいて、図5Bに示されるパッチコードを使用して、シェーダを一緒にパッチされることができる。システムにより生成される値であるvertexIDおよびinstanceIDのみが、頂点シェーダにおいて使用されてよく、VSステージをコンパイルすることによって計算されるような規定された汎用レジスタスロット(GPR)にロードされ得る。しかしながら、primitiveIDおよび、miscおよびrel_patchidのような、プリミティブコントローラ(PC)からの他のマージシェーダ関連の値(たとえば、図6に示されるような)は、シェーダステージのいずれかによって使用され得る。
[0142]上で説明されたパッチコードは、GPUドライバ50のようなGPU 36のためのドライバによって、コンパイルされたシェーダに追加され得る。たとえば、GPUドライバ50は、どのシェーダが各ドローコールに対して必要とされるかを判定する。GPUドライバ50は、図5Bに示されるパッチコードを、いわゆるドライバ時間またはリンク時間において適切なシェーダ(マージされているシェーダ)に付加することができ、これによって、シェーダが同じハードウェアシェーディングユニットによって実行されるように、コンパイルされたシェーダをリンクする。GPUドライバ50は、シェーダ全体を再コンパイルする必要がなく、これによって、計算リソースを節約する。
[0143]このようにして、GPU 36は、複数のモードを使用するシェーディング操作を一緒にパッチされることができ、各モードは、関連するシェーディング操作の特定のセットを有する。そのような技法は、GPU 36が、シェーディングユニット40を再構成することなく、追加のシェーディング操作(たとえば、ジオメトリシェーディング操作、ハルシェーディング操作、および/またはドメインシェーディング操作)を実行することを可能にし得る。すなわち、本技法は、シェーディングユニット40が、他のシェーディング操作を実行しながら、いくつかのシェーダステージの入力/出力の制約を堅持することを可能にし得る。
[0144]図6は、本開示の態様による、マージされた頂点シェーディング操作とジオメトリシェーディング操作とを実行するためのグラフィックスプロセシングユニット178の例示的なコンポーネントを示す図である。図6の例は、マージされたVS/GSユニット180と、頂点パラメータキャッシュ(VPC)182と、プリミティブコントローラ(PC)184と、頂点フェッチデコーダ(VFD)186と、グラフィックスラスタライザ(GRAS)188と、レンダーバックエンド(RB)190と、コマンドプロセッサ(CP)192と、ピクセルシェーダ(PS)194とを含む。加えて、図6は、PM4パケットバッファ198と、頂点オブジェクト200と、インデックスバッファ202と、ストリームアウトバッファ204と、フレームバッファ206とを有する、メモリ196を含む。
[0145]図6の例では、VS/GSユニット180は、上で説明された方式で頂点シェーディング操作を実行するように指定された1つまたは複数のシェーディングユニットによって実装される。VPC 182は、ストリームアウトデータをストリームアウトバッファ204に記憶するために、ストリームアウト機能を実装することができる。PC 184は、変換される必要があり得る頂点を管理することができる。たとえば、PC 184は、複数の頂点を三角形のプリミティブへと組み立てることができる。VFD 186は、頂点のフォーマット状態に基づいて、頂点データをフェッチすることができる。GRAS 188は、入力として三角形の頂点を受け取ることができ、三角形の境界内にあるピクセルを出力することができる。プリフェッチパーサ(PFP)は、コマンドストリームを事前に復号し、メインCPエンジン192がデータを必要とし得るときまでにそのデータの準備ができているように、そのデータをポインタ(たとえば、リソースポインタ)を介してフェッチすることができる。
[0146]説明のための例では、DirectX 10のディスパッチ機構が、図6に示されるグラフィックスプロセシングユニット178を使用して実装され得る。たとえば、DirectXドローコールは、VS操作とGS操作がマージされる、たとえば同じシェーディングユニットによって実行されることを示す、モードビット(モード情報)を有するドローインジケータを伴う、単一パスのドローコールとして扱われ得る。このモードは、PC 184内のGSblockが、GS出力vertexIDおよびGS instanceIDを伴うVFD 186のためのデータを生成することを可能にする。GSblockは、宣言されたmaxoutputvertexcountおよびGSinstancecountに基づいて、入力プリミティブに対する多数のVSファイバーを作成する。ウェーブ中のファイバーの数(たとえば、32個のファイバーのような、1つのシェーディングユニットによって行われる作業の量)がmaxoutputvertexcount * GSinstancecountより大きい場合、ウェーブは、完全な入力GSプリミティブを有し得る。それ以外の場合、GSの入力プリミティブの頂点インデックスは、maxoutputvertexcount * GSinstancecount個のファイバーが作成されるまで、次のウェーブに対して繰り返され得る。入力プリミティブの頂点に対して、頂点の再使用は必要ではない。
[0147]VPC 182の出力において、PC 184は、GSの出力プリミティブのタイプに基づいて、プリミティブの接続を生成する。たとえば、(VS/GS 180の)GSからの第1の出力された頂点は通常、この頂点の前のプリミティブ(ストリップ)の完成を示し得る、位置キャッシュ中の「切断」ビットから構成され得る。PC 184はまた、VPC 182に対する完成したプリミティブのこの接続情報を、ストリームアウトGS出力に対するVPC 182のstreamidとともに、所与のストリームと結び付けられたバッファ204に送る。GS 180中の複数の完全なプリミティブの間に部分的なプリミティブがある場合、そのような部分的なプリミティブは、プリミティブを脱落させるために、GRAS 188についてPRIM_AMP_DEADとして標識される。PC 184はまた、無効なプリミティブのタイプをVPC 182に送り、そのようなプリミティブに対するパラメータのキャッシュの割り振りを解除する。
[0148]maxoutputvertexcountに基づいて、GPUドライバ(図1に示されるGPUドライバ50のような)は、どれだけの入力プリミティブの頂点がローカルメモリに記憶されるかを計算することができる。この入力プリミティブ値は、次の式に従って、変数GS_LM_SIZEとして計算され得る。
このタイプのドローコールを受け取るハイレベルシーケンサ(HLSQ)は、どのシェーダプロセッサのローカルメモリ(LM)がGS_LM_SIZEのために十分な記憶容量を有するかを(たとえば、場合によってはラウンドロビン手法を使用して)確認することができる。HLSQは、そのような割り振りの開始基本アドレス、さらには、割り振られたウェーブによるローカルメモリに対する任意の読取りまたは書込みのアドレスを保持することができる。HLSQはまた、ローカルメモリに書き込むときに、割り振られたメモリ内の計算されたオフセットを基本アドレスに追加することができる。
[0149]したがって、本開示の態様によれば、入力と出力との関係は、VS/GS180に対して、(頂点シェーディング操作を実行するように指定されるシェーディングユニットでは通常そうであるように)1:1ではない。むしろ、GSは、各々の入力プリミティブから1つまたは複数の頂点を出力することができる。加えて、GSによって出力される頂点の数は動的であり、1から、APIにより課される最大のGSの出力(たとえば、1024個の頂点という出力の最大値に等しいことがある、1024ダブルワード(dwords))まで変化し得る。
[0150]すなわち、GSは、最小で1つの頂点、かつ最大で1024個の頂点を生成することができ、GSからの出力全体が1024dwordsであり得る。GSは、変数dcl_maxoutputvertexcountを使用して、GSからの出力された頂点の最大の数を、コンパイル時に宣言することができる。しかしながら、出力される頂点の実際の数は、GPU 36がGSを実行する時点では知られていないことがある。むしろ、dcl_maxoutputvertexcountの宣言は、GSに対するパラメータとしてのみ必要とされ得る。
[0151]GSはまた、入力プリミティブごとに呼び出されるべきGSのインスタンス(操作)の数に対する変数instancecountを宣言することができる。この宣言は、GSの呼出しのための外側のループとして機能し得る(ジオメトリシェーダインスタンスの最大の数を特定する)。最大のinstancecountは32に設定され得るが、他の値も使用され得る。したがって、GSは、ジオメトリシェーダ操作における変数GSInstanceIDへのアクセス権を有し、それは、所与のGSがどのインスタンスに対して行われているかを示す。GSのインスタンスの各々は、最大で1024dwordsを出力することができ、各々は、最大の出力される頂点の数として、dcl_maxoutputvertexcountを有し得る。加えて、各々のGSのインスタンスは、他のGSのインスタンスとは独立であり得る。
[0152]GSの入力においてGPU 36が宣言し得る入力プリミティブのタイプは、点、線、三角形、隣接を伴う線、隣接を伴う三角形、およびパッチ1〜32であり得る。隣接を伴う三角形は、DirectX 10のようないくつかのAPIの新たな機能であり得る。加えて、パッチ1〜32は、DirectX 11 APIに対して追加されたさらなる改善であり得る。GSからの出力プリミティブのタイプは、点、ラインストリップ、またはトライアングルストリップであり得る。GSの出力は、GSにおいて宣言され得る4つのストリームのうちの1つに向かうことができ、GSは、どれだけのストリームが使用されるかを宣言し得る。一般に、「ストリーム」は、(たとえば、メモリバッファに)記憶される、またはラスタライザのようなGPUの別のユニットに送られる、シェーディングされたデータを指す。各頂点の「放出」命令は、頂点がどのストリームに向かっているかを示し得る「放出ストリーム」の指定を使用することができる。
[0153]GSは、「ストリーム切断」命令または「ストリーム放出後切断」命令を使用して、ストリップのプリミティブのタイプを完成させることができる。そのような例では、次の頂点は、所与のストリームに対する新たなプリミティブを開始する。いくつかの例では、プログラマは、(APIを使用して)ストリームをセットアップするときにラスタライズされたストリームとして使用されるべき、多くとも1つのストリームを宣言することができる。加えて、4つの1Dバッファが1つのストリームと結び付けられ得るが、GSストリームのすべてと結び付けられるバッファの総数は、4を超えなくてよい。オフチップバッファは通常、複数のストリームの間で共有されない。
[0154]頂点が所与のストリームに対して放出される場合、ストリームと結び付けられる各バッファに対する頂点のサブセクションは、完成したプリミティブとしてオフチップバッファ(ストレージユニット48のような)に書き込まれる。すなわち、部分的なプリミティブは一般に、オフチップバッファに書き込まれない。いくつかの例では、オフチップバッファに書き込まれるデータは、プリミティブのタイプの指示を含むように拡張されてよく、2つ以上のストリームが所与のGSに対して可能にされる場合、GSに対する出力プリミティブのタイプは「点」のみであり得る。
[0155]GSステージは、PrimitiveIDパラメータを入力として受け取ることができ、それは、PrimitiveIDがシステムにより生成される値であるからである。GSはまた、PrimitiveIDパラメータと、iewportIndexパラメータと、RenderTargetArrayIndexパラメータとを1つまたは複数のレジスタに出力することができる。GSの入力に対する補間モードという属性は通常、定数として宣言される。いくつかの例では、GSをNULLとして宣言しながら、依然として出力を可能にすることが可能である。そのような例では、ストリーム0のみがアクティブであり得る。したがって、VSの出力は、プリミティブのタイプを一覧にするように拡張されてよく、ストリーム0と結び付けられたバッファに値を書き込むことができる。入力プリミティブのタイプが隣接というプリミティブのタイプであると宣言される場合、隣接する頂点情報が脱落させられ得る。すなわち、たとえば、隣接したプリミティブの内部の頂点のみ(たとえば、偶数の頂点番号)が、非隣接というプリミティブのタイプを形成するために処理され得る。
[0156]パッチの入力プリミティブのタイプがNULL GSを伴う場合、パッチは、ストリームと結び付けられたバッファに、点のリストとして書き出される。宣言されたストリームもラスタライズされる場合、GPU 36は、パッチ制御ポイントによって規定されるような、複数の点としてパッチをレンダリングすることができる。加えて、GSがNULLである場合、viewportindexパラメータおよびrendertargetarrayindexパラメータは0であると仮定され得る。
[0157]クエリカウンタは、どれだけのVS操作またはGS操作がGPU 36によって処理されているかを決定するために実装されてよく、これによって、ハードウェアコンポーネントがプログラムの実行を記録することが可能になる。クエリカウンタは、stat_startイベントおよびstat_endイベントに基づいて、カウントを開始し停止することができる。カウンタは、stat_sampleイベントを使用してサンプリングされ得る。stat_starttイベントおよび/またはstat_stopイベントを受け取る動作ブロックは、インクリメント信号が送信されそのようなイベントを受け取る様々な点において、カウントを開始または停止する。
[0158]GPU 36のドライバがそのようなカウンタを読み取る必要がある場合、ドライバは、図5Bに関して示され説明されるように、コマンドプロセッサ(CP)を通じてstat_sampleイベントを送ることができる。レジスタバックボーン管理(RBBM)ユニットが、カウンタをインクリメントすることを担う動作ブロックから確認応答(または「ack」)を受け取るまで、CPは、任意の追加のドローコールをGPU 36に送るのを控えることができる。「ack」が受け取られると、RMMBユニットは、カウンタを読み取り、次のドローコールの送信を再開することができる。
[0159]GPU 36は、種々のデータをローカルGPUメモリ38に記憶することができる。たとえば、次のクエリカウントは、ハードウェア中のCPによって保持され得る。いくつかの例では、次のクエリカウントは64ビットカウンタとして形成されてよく、これは、以下に示されるように、様々な動作ブロックからの1〜3ビットのパルスを使用してインクリメントされ得る。
・IAVerticesは、プリミティブを生成する際に使用される頂点の数を指し得る。したがって、入力プリミティブのタイプが、三角形を生成するストリップである場合、IAVerticesは6であり得る。この値は、Windows(登録商標) Hardware Quality Labs(WHQL)の数字と一致し得る。この値は、プリミティブコントローラ(PC)からの2ビットのパルスを使用して制御され得る。パッチのプリミティブのために、値は、制御ポイントごとに1だけインクリメントされ得る。
・IAPrimitivesは、生成された完成した入力プリミティブの数を指し得る。この値は、リセットをもたらし得る部分的なプリミティブを何ら含まなくてよい。この値は、WQHLの数字と一致し得る。この値は、プリミティブが生成された後で、さらには、リセットインデックスと部分的なプリミティブの脱落とを確認した後で、PCからの1ビットのパルスを使用して制御され得る。
・VSInvocationsは、VS操作が呼び出される回数を指し得る。この値は頂点の再使用の後に設定されてよく、VSステージが呼び出される対象である固有の頂点の数を決定し得る。この値は、GPU 36の具体的なハードウェアに依存し得る。この値は、一度に最大で3つの頂点に対する頂点の再使用をPCが確認すると、PCからの2ビットのパルスを使用して制御され得る。GSおよびハルシェーダ(HS)(たとえば、図12A〜図13Bに関して以下で説明されるような)の場合に対しては通常、頂点の再使用はない。したがって、PCは、VSInvocationsとして、ドローコール中のプリミティブにおける頂点の数を送ることができる。
・HSInvocationsは、HSを経たパッチの数を指し得る。この値は、DirectX 11のようないくつかのAPIの新たな値であり得る。この値は、部分的なパッチを何ら含まなくてよい。この値は、パッチが頂点フェッチデコーダ(VFD)に完全に送られると、PCおよびHSブロックからの1つのビットパルスを使用して制御され得る。この値はまた、WHQLの数字と一致すべきである。
・DSInvocationsは、ドメインシェーダ(DS)操作が呼び出される回数を指し得る。この値は、テッセレーションの出力プリミティブのタイプが点というタイプである場合、WHQLと一致すべきである。この値は、生成されている各ドメイン点(u,v)に対して、PC中のテッセレーションエンジン(TE)からの1ビットのパルスを使用して制御される。
・GSInvocationsは、GS操作が呼び出される回数を指し得る。GSinstancecount値が使用される場合、各インスタンスは、1つのGS呼出しとしてカウントされる。この値は、WHQLの数字と一致すべきである。この値は、Gsinstanceごとに、入力プリミティブごとに一度送られる、GSブロックからの1ビットのパルスを使用して制御され得る。いくつかの例では、GSブロックは、GS増幅がウェーブサイズより大きい場合、入力GSプリミティブを複数回送ることができる。この値は通常、GS入力プリミティブごとに一度カウントされる。
・GSPrimitivesは、生成されるGS出力プリミティブの数を指し得る。この値は、「切断」操作に起因する部分的なプリミティブを何ら含まなくてよい。この値は、WHQLの数字と一致し得る。この値は、プリミティブが構成される位置キャッシュへのアクセスの後で、かつ、「切断」操作または頂点消滅イベントが原因で部分的なプリミティブが脱落した後で、PCからの出力プリミティブごとに1ビットのパルスを使用して制御され得る。
・CInvocationsは、いわゆる「クリッパー」が実行される回数を指し得る。この値は、GPU 36の具体的なハードウェアに依存し得る。
・CPrimitivesは、クリッパーが生成したプリミティブの数を指し得る。この値は、GPU 36の具体的なハードウェアに依存し得る。
・PSInvocationsは、ピクセルシェーダ(PS)のスレッド(「ファイバー」とも呼ばれ得る)が呼び出される回数を指し得る。
・CSInvocationsは、計算ファイバーが呼び出される回数を指し得る。
[0160]上で説明された値に加えて、ストリームごとに保持される、2つのストリームアウト関連のクエリカウントがあり得る。これらのストリームアウト関連の値は、次の値を含み得る。
・NumPrimitiveWrittenは、ドローコールが終了する前に、所与のストリームに対して書かれるプリミティブの総数を指し得る。この値はまた、完成したプリミティブのためのバッファの記憶容量がなくなったときに、ストリームと結び付けられるバッファのデータを含み得る。この値は、完成したプリミティブを記憶するための空間が所与のストリームのバッファのいずれかに存在するたびに、頂点パラメータキャッシュ(VPC)からCPへのストリームごとの1ビットのパルスを使用して制御され得る。
・PrimitiveStorageNeededは、ストリームと結び付けられるいずれのバッファの記憶容量もなくなっていなければ書き込まれることが可能であったであろう、プリミティブの総数を指し得る。この値は、ストリームに対するプリミティブがGSによって生成されるたびに、VPCからCPへのストリームごとに1ビットのパルスを使用して制御され得る。
[0161]通常、GPU 36は、VPCから直接、ストリームアウトをサポートすることができる。上で述べられたように、GSによってサポートされる最大で4つのストリームがあり得る。これらのストリームの各々は、最大で4つのバッファに束縛されることがあり、バッファは通常、異なるストリームの間で共有可能ではない。各バッファへの出力のサイズは、最大で128dwordsであってよく、これは頂点の最大サイズと同じである。しかしながら、ストライドは最大で512dwordsであり得る。ストリームからの出力データは複数のバッファに記憶され得るが、データは一般に、バッファ間で複製され得ない。説明のための例では、「color.x」がストリームと結び付けられたバッファの1つに書き込まれる場合、この「color.x」は、同じストリームと結び付けられた別のバッファに送られなくてよい。
[0162]バッファへのストリームアウトは、完成したプリミティブとして実行され得る。すなわち、たとえば、2つのみの頂点に対する所与のストリームのための空間がいずれかのバッファにあり、プリミティブのタイプが三角形である(たとえば、3つの頂点を有する)場合、プリミティブの頂点は、そのストリームと結び付けられるいずれのバッファにも書き込まれなくてよい。
[0163]GSがヌルであり、ストリームアウトが有効にされる場合、ストリームアウトは、デフォルトのストリーム0として識別され得る。ストリームアウトが実行されているとき、位置情報は、VPC、さらにはPCにも書き込まれることがあり、これはさらなるスロットを消費し得る。加えて、ビニングが実行されるとき(たとえば、タイルベースのレンダリングのために頂点をビンに割り当てるプロセス)、ストリームアウトはビニングパスの間に実行され得る。
[0164]DirectX 10のようないくつかのAPIでは、ストリームアウトデータを消費する、DrawAuto機能(以前に作成されたストリームをパッチしてレンダリングし得る)が規定され得る。たとえば、GPUドライバは、メモリアドレスとともに、所与のストリームに対するストリームアウトフラッシュのイベントを送ることができる。VPCは、そのようなイベントを受け取ると、RBBMに確認応答(ack)ビットを送ることができる。RBBMは、ackビットを受け取ると、バッファにおいて利用可能なバッファ空間の量(バッファリングされた満杯のサイズ)を、ドライバにより規定されるメモリまたはメモリ位置に書き込む。
[0165]その間、コマンドプロセッサ(CP)内に含まれ得るプリフェッチパーサ(PFP)は、任意のドローコールの送信を待機する。メモリアドレスが書き込まれると、PFPは次いで、次のドローコールを送ることができる。次のドローコールが自動ドローコールである場合、GPUドライバは、ドローコールと状態の変化とを示すパケット(たとえば、いわゆる「PM4」パケット)の一部として、満杯のバッファサイズを含むメモリアドレスを送ることができる。PFPは、そのメモリ位置からbuffer_filled_sizeを読み取り、ドローコールをPCに送る。
[0166]図7は、本開示の態様による、頂点シェーディング操作とジオメトリシェーディング操作とを実行するための例示的なプロセスを示すフローチャートである。GPU 36(図1)によって実行されるものとして説明されるが、図7に関して説明される技法は、種々のGPUまたは他のプロセシングユニットによって実行され得ることを理解されたい。
[0167]GPU 36は最初に、たとえば、頂点シェーダ命令を受け取ると、頂点シェーディング操作を呼び出すことができる(210)。頂点シェーディング操作を呼び出すことで、GPU 36は、頂点シェーディング操作のために1つまたは複数のシェーディングユニット40を指定し得る。加えて、GPU 36の他のコンポーネント(頂点パラメータキャッシュ、ラスタライザなどのような)は、指定されたシェーディングユニット40の各々からの入力ごとに、単一の出力を受け取るように構成され得る。
[0168]GPU 36は、頂点シェーディング操作のために指定されたハードウェアシェーディングユニットによって、頂点シェーディング操作を実行して、入力される頂点をシェーディングすることができる(212)。すなわち、ハードウェアシェーディングユニットは、頂点シェーディング操作を実行して、入力された頂点をシェーディングし、頂点シェーディングされたインデックスを出力することができる。ハードウェアシェーディングユニットは、1つの頂点を受け取り、1つのシェーディングされた頂点を出力することができる(たとえば、入力と出力との間の1:1の関係)。
[0169]GPU 36は、ジオメトリシェーディング操作を実行するかどうかを判定することができる(214)。GPU 36は、たとえば、モード情報に基づいて、そのような判定を行うことができる。すなわち、GPU 36は、パッチコードを実行して、任意の有効なジオメトリシェーダ命令が実行された頂点シェーダ命令に付加されるかどうかを判定することができる。
[0170]GPU 36がジオメトリシェーディング操作を実行しない場合(ステップ214のいいえの分岐)、GPUのハードウェアシェーディングユニットは、各々の入力された頂点に対する1つのシェーディングされた頂点を出力することができる(222)。GPU 36がジオメトリシェーディング操作を実行する場合(ステップ214のはいの分岐)、ハードウェアシェーディングユニットは、ジオメトリシェーディング操作の複数のインスタンスを実行して、受け取られた頂点に基づいて1つまたは複数の新たな頂点を生成することができる(216)。たとえば、ハードウェアシェーディングユニットは、所定の数のジオメトリシェーディングのインスタンスを実行することができ、各インスタンスは出力識別子と関連付けられる。ハードウェアシェーディングユニットは、ジオメトリシェーディング操作の各インスタンスに対する出力カウントを保持することができる。加えて、出力識別子は、各々の出力された頂点に割り当てられ得る。
[0171]したがって、ジオメトリシェーディングされた頂点をいつ出力するかを決定するために、ハードウェアシェーディングユニットは、出力カウントが出力識別子と一致するときを決定することができる(218)。たとえば、ジオメトリシェーディング操作に対する出力カウントが出力識別子と一致しない場合(ステップ218のいいえの分岐)、そのジオメトリシェーディング操作と関連付けられる頂点は廃棄される。ジオメトリシェーディング操作に対する出力カウントが出力識別子と一致する場合(ステップ218のはいの分岐)、ハードウェアシェーディングユニットは、ジオメトリシェーディング操作と関連付けられる頂点を出力することができる。このようにして、頂点シェーディングのために指定されるハードウェアシェーディングユニットは、単一のシェーディングされた頂点を出力し、ジオメトリシェーディングプログラムの各インスタンスに対する任意の使用されない頂点を廃棄し、これによって、1:1という入力対出力の比を維持する。
[0172]図8は、テッセレーションステージを含む例示的なグラフィックスプロセシングパイプライン238を示すブロック図である。たとえば、パイプライン238は、入力アセンブラステージ240と、頂点シェーダステージ242と、ハルシェーダステージ244と、テッセレータステージ246と、ドメインシェーダステージ248と、ジオメトリシェーダステージ250と、ラスタライザステージ252と、ピクセルシェーダステージ254と、出力マージャステージ256とを含む。いくつかの例では、DirectX 11 APIのようなAPIは、図8に示されるステージの各々を使用するように構成され得る。グラフィックスプロセシングパイプライン238は、GPU 36によって実行されるものとして以下で説明されるが、種々の他のグラフィックスプロセッサによって実行され得る。
[0173]図8に示されるいくつかのステージは、図2に関して示され説明されたステージ(たとえば、アセンブラステージ240、頂点シェーダステージ242、ジオメトリシェーダステージ250、ラスタライザステージ252、ピクセルシェーダステージ254、および出力マージャステージ256)と同様に、またはそれと同じように構成され得る。加えて、パイプライン238は、ハードウェアテッセレーションのための追加のステージを含む。たとえば、グラフィックスプロセシングパイプライン238は、図2に関して上で説明されたステージに加えて、ハルシェーダステージ244と、テッセレータステージ246と、ドメインシェーダステージ248とを含む。すなわち、ハルシェーダステージ244、テッセレータステージ246、およびドメインシェーダステージ248が、たとえば、CPU 32によって実行されているソフトウェアアプリケーションによる実行ではなく、GPU 36によるテッセレーションに対応するために含まれる。
[0174]ハルシェーダステージ244は、頂点シェーダステージ242からプリミティブを受け取り、少なくとも2つの動作を実行することを担う。まず、ハルシェーダステージ244は通常、テッセレーション係数のセットを決定することを担う。ハルシェーダステージ244は、プリミティブごとに一度、テッセレーション係数を生成することができる。テッセレーション係数は、所与のプリミティブのテッセレーションをどの程度精密に行うか(たとえば、プリミティブをどのようにより小さな部分に分割するか)を判定するために、テッセレータステージ246によって使用され得る。ハルシェーダステージ244はまた、ドメインシェーダステージ248によって後で使用される制御ポイントを生成することを担う。すなわち、たとえば、ハルシェーダステージ244は、ドメインシェーダステージ248によって使用される制御ポイントを生成し、レンダリングにおいて最終的に使用される、実際のテッセレーションが行われた頂点を作成することを担う。
[0175]テッセレータステージ246がハルシェーダステージ244からのデータを受け取ると、テッセレータステージ246は、いくつかのアルゴリズムの1つを使用して、現在のプリミティブのタイプに対する適切なサンプリングパターンを決定する。たとえば、一般に、テッセレータステージ246は、現在の「ドメイン」内の座標点のグループへと、要求された量のテッセレーション(ハルシェーダステージ244によって決定されるような)を変換する。すなわち、ハルシェーダステージ244からのテッセレーション係数、さらにはテッセレータステージ246の具体的な構成に応じて、テッセレータステージ246は、より小さな部分への入力プリミティブのテッセレーションを行うために、現在のプリミティブのどの点がサンプリングされる必要があるかを決定する。テッセレータステージの出力は、重心座標を含み得るドメイン点のセットであり得る。
[0176]ドメインシェーダステージ248は、ハルシェーダステージ244によって生成される制御ポイントに加えてドメイン点を取り込み、ドメイン点を使用して新たな頂点を作成する。ドメインシェーダステージ248は、現在のプリミティブ、テクスチャ、手順的アルゴリズム、または他の何かに対して生成される制御ポイントの完全なリストを使用して、各々のテッセレーションが行われた点に対する重心「位置」を、パイプライン中の次のステージに渡される出力ジオメトリへと変換することができる。上で述べられたように、一部のGPUは、図8に示されたシェーダステージのすべてをサポートすることが不可能であり得る。たとえば、一部のGPUは、ハードウェアおよび/またはソフトウェアの制約(たとえば、限られた数のシェーディングユニット40および関連するコンポーネント)により、3つ以上のシェーディング操作を実行するようにシェーディングユニットを指定することが不可能であり得る。ある例では、いくつかのGPUは、ジオメトリシェーダステージ250、ハルシェーダステージ244、およびドメインシェーダステージ248と関連付けられる動作をサポートしないことがある。むしろ、GPUは、頂点シェーダステージ242とピクセルシェーダステージ252とを実行するようにシェーディングユニットに指定することに対するサポートのみを含み得る。したがって、シェーディングユニットによって実行される操作は、頂点シェーダステージ84およびピクセルシェーダステージ90と関連付けられる入力/出力インターフェースを堅持しなければならない。
[0177]加えて、比較的長いグラフィックスプロセシングパイプラインをサポートすることは、比較的複雑なハードウェアの構成を必要とし得る。たとえば、ハルシェーダステージ244、テッセレータステージ246、およびドメインシェーダステージ248からの、制御ポイント、ドメイン点、およびテッセレーション係数は、オフチップメモリに対する読取りと書込みとを必要とすることがあり、このことは、メモリのバス帯域幅を消費し、消費される電力の量を増やし得る。この意味で、各シェーダステージに対して専用のシェーディングユニット40を使用する、多くのステージを伴うグラフィックスパイプラインを実装することは、より電力効率の低いGPUをもたらし得る。加えて、そのようなGPUはまた、メモリのバス帯域幅が限られている結果としての、オフチップメモリからのデータの取り出しの遅延により、レンダリングされる画像の出力がより遅くなり得る。
[0178]本開示の態様によれば、以下でより詳細に説明されるように、特定のシェーディング操作を実行するようにGPU 36によって指定されるシェーディングユニット40は、2つ以上の操作を実行することができる。たとえば、頂点シェーディング(VS)操作を実行するように指定されるシェーディングユニット40はまた、ハルシェーダステージ244と関連付けられるハルシェーディング操作を実行することができる。別の例では、同じシェーディングユニット40はまた、ドメインシェーダステージ248と関連付けられるドメインシェーディング操作を実行し、続いて、ジオメトリシェーダステージ250と関連付けられるジオメトリシェーダ操作を実行することができる。
[0179]以下でより詳細に説明されるように、GPU 36は、ドローコールを2つのサブドローコール(たとえば、パスIおよびパスII)へと分割することによって上のシェーディング操作を実行することができ、各サブドローコールは関連するマージされたシェーダステージを有する。すなわち、GPU 36は、頂点シェーディング操作を実行するためにシェーディングユニット40を呼び出すことができるが、第1のパスの間にハルシェーディング操作を実行するように、シェーディングユニット40を実装することもできる。GPU 36は次いで、同じシェーディングユニット40(頂点シェーディング操作を実行するように指定される)を使用して、ハルシェーディング、ドメインシェーディング、またはジオメトリシェーディングのタスクを実行するようにシェーディングユニット40を決して再指定することなく、ドメインシェーディング操作とジオメトリシェーディング操作とを実行することができる。
[0180]図9は、より詳細にテッセレーションを示す概念図である。ハルシェーダ(HS)ステージ244およびドメインシェーダ(DS)248は、完全なシェーダステージであってよく、このステージの各々は、定数バッファ、テクスチャ、および他のリソースの固有のセットを伴う。一般に、テッセレーションは、パッチと呼ばれるプリミティブのタイプを使用して実行され得る。したがって、図9に示される例では、ハルシェーダステージ244は最初に、1つまたは複数の入力される制御ポイントを受け取り、これはパッチ制御ポイントと呼ばれ得る。パッチ制御ポイントは、(たとえば、APIを使用して)開発者により制御されるものであり得る。ハルシェーダステージ244は、以下で説明されるように、計算を実行して、ドメインシェーダステージ248によって使用される制御ポイントを含むいわゆるベジェパッチを生成することができる。
[0181]ハルシェーダステージ244はまた、パッチのテッセレーションの量を制御するために使用され得る、テッセレーション係数を生成する。たとえば、ハルシェーダステージ244は、パッチの視点および/または視距離に基づいて、どの程度テッセレーションを行うかを決定し得る。オブジェクトがあるシーンにおいて見る者に比較的近い場合、比較的多量のテッセレーションが、一般に滑らかに見えるパッチを生成するために必要とされ得る。オブジェクトが比較的遠い場合、より少量のテッセレーションが必要とされ得る。
[0182]テッセレータステージ246は、テッセレーション係数を受け取り、テッセレーションを実行する。たとえば、テッセレータステージ246は、多数の{U,V}座標を生成するための均一の等級を有する所与のパッチ(たとえば、ベジェパッチ)に対して行われる。{U,V}座標は、パッチに対するテクスチャを提供することができる。したがって、ドメインシェーダステージ248は、制御ポイント(変位情報を有する)と、{U,V}座標(テクスチャ情報を有する)と、出力されるテッセレーションが行われた頂点とを受け取ることができる。上で説明されたように、これらのテッセレーションが行われた頂点は次いで、ジオメトリシェーディングされ得る。
[0183]本開示の態様によれば、かつ以下でより詳細に説明されるように、ハルシェーダステージ244およびドメインシェーダステージ248と関連付けられるシェーディング操作は、GPUの同じシェーディングユニット(シェーディングユニット40のような)によって実行され得る。すなわち、たとえば、1つまたは複数のシェーディングユニット40は、頂点シェーディング操作を実行するように指定され得る。頂点シェーディング操作に加えて、GPUは、シェーダが、順番に、かつテッセレーション操作を実行するように再構成されることなく、同じシェーディングユニットによって実行されるように、ハルシェーダステージ244およびドメインシェーダステージ248と関連付けられるシェーダ命令を付加することができる。
[0184]図10Aおよび図10Bは、本開示の態様による、グラフィックスレンダリングパイプラインにおけるデータフローの概念図である。たとえば、図10Aは、頂点シェーダステージ260と、ハルシェーダステージ262と、テッセレータステージ264と、ドメインシェーダステージ266と、ジオメトリシェーダステージ268と、ストリームアウト270と、ピクセルシェーダステージ272とを示す。一般に、図10Aに示されるシェーダステージの各々は、シェーディング操作を実行するための関連するハードウェアを表す。すなわち、たとえば、頂点シェーダステージ260、ハルシェーダステージ262、ドメインシェーダステージ266、ジオメトリシェーダステージ268、およびピクセルシェーダステージ272の各々は、シェーディングユニット40のような、別々に指定されたプロセシングユニットと関連付けられ得る。
[0185]図10Aに示される例では、頂点シェーダステージ260は、いわゆる「パッチ制御ポイント」(または、図8および図9に関して上で説明されるような「制御ポイント」)で呼び出され得る。所与のパッチの中の点は、ハルシェーダステージ262に可視であってよく、ハルシェーダステージ262は、それらの点を使用して、テッセレーションステージ264による使用のためのテッセレーション係数を計算する。ハルシェーダステージ262はまた、ドメインシェーダステージ266による使用のための、パッチ制御ポイントと定数データとを出力することができる。
[0186]いくつかの例では、テッセレータステージ264は、テッセレーションを実行するための固定された機能のハードウェアユニットを含み得る。テッセレータステージ264は、ハルシェーダステージ262からテッセレーション係数と制御ポイントとを受け取り、いわゆるドメイン点(たとえば、どこでテッセレーションを行うかを規定する{U,V}点)を出力することができる。ドメインシェーダステージ266は、これらのドメイン点を使用して、ハルシェーダステージ262からの出力されるパッチデータを使用して頂点を計算する。ドメインシェーダステージ266からのあり得る出力プリミティブは、ラスタライズのために、ストリームアウト270のために、またはジオメトリシェーダステージ268へと送信され得る、たとえば、点、線、または三角形を含む。テッセレーション係数のいずれかが0以下である場合、または数字ではない(NaN)場合、パッチは間引かれ得る(さらに計算されることなく廃棄され得る)。
[0187]図10Aに示されるシェーダステージは、1つまたは複数のグラフィックスAPIをサポートすることができる。説明のための例では、頂点シェーダステージ260、ハルシェーダステージ262、ドメインシェーダステージ266、ジオメトリシェーダステージ268、およびピクセルシェーダステージ272は、DirectX 11 APIをサポートすることができる。すなわち、DirectX 11 APIを使用して作成されたコードが、グラフィックスデータをレンダリングするために、頂点シェーダステージ260、ハルシェーダステージ262、ドメインシェーダステージ266、ジオメトリシェーダステージ268、およびピクセルシェーダステージ272によって実行され得る。しかしながら、ハルシェーダステージ262、ドメインシェーダステージ266、および/またはジオメトリシェーダステージ268のようないくつかのステージは、すべてのグラフィックスレンダリングパイプラインに含まれなくてよく、すべてのGPUによって実行されなくてよい。たとえば、DirectX 11 APIはそのようなステージに対するサポートを含むが、いくつかのより以前の改訂(たとえば、DirectX 9および10)はそのようなサポートを含まない。したがって、DirectX APIのより以前の改訂によって作成されたコードを実行するように設計されるGPU(または他のAPIのために設計されたGPU)は、ハルシェーダステージ262、ドメインシェーダステージ266、および/またはジオメトリシェーダステージ268と関連付けられる操作を実行するようにシェーディングユニット40を指定することが不可能であり得る。
[0188]本開示の態様によれば、図10Aのシェーダステージの2つ以上は、シェーダステージが単一のハードウェアシェーディングユニット(たとえば、シェーディングユニット40のような)によって実行されるという点でマージされ得る。たとえば、本開示の態様によれば、GPU(GPU 36のような)は、図10Bに関して以下で説明されるように、ドローコールを実行して図10Aに示されるシェーダステージを行うとき、複数のパスを実行することができる。
[0189]図10Bは、マージされた頂点シェーダおよびハルシェーダ(VS/HS)ステージ280を有する第1のパス(パスI)を含む、グラフィックスレンダリングパイプラインにおけるデータフローを示す。加えて、データフローは、テッセレーションステージ282と、マージされたドメインシェーダおよびジオメトリシェーダ(DS/GS)ステージ284と、ストリームアウト286と、ピクセルシェーダステージ288とを有する、第2のパス(パスII)を含む。図10Bに示されるパスは、テッセレーション操作を有するドローコールを実行するように実施され得る。
[0190]たとえば、図10Aに関して上で説明されたように、GPU 36は、テッセレーション操作を含む入力ドローコールを実行することができる。GPU 36は最初に、複数のサブドローコールへとドローコールを分割することができ、各サブドローコールは、パスI操作とパスII操作の両方を含む。GPU 36がドローコールを分割する方式は、利用可能なメモリ(たとえば、オンチップGPUメモリ、L2、グローバルメモリ(GMEM)、またはオフチップメモリ)の量に少なくとも部分的に依存し得る。たとえば、GPU 36は、GPU 36がパスI操作によって生成されたデータのすべてをパスII操作において使用するためにローカルメモリに記憶することが可能であるように、サブドローコールを構成することができる。ドローコールの分割は、コマンドプロセッサ(CP)コードの制御のもとで、CPにおいて行われてよく、CPコードは、入力ドローコールのタイプに基づき得る。
[0191]説明のための例では、ドローコールがレンダリングのための1000個の関連するパッチを含むことを仮定する。加えて、ローカルメモリは100個のパッチと関連付けられるデータを記憶するための容量を有すると仮定する。この例では、GPU 36(または、GPUドライバ50のようなGPUのためのドライバ)は、ドローコールを10個のサブドローコールへと分割することができる。GPU 36は次いで、10個のサブドローコールの各々に対するパスI操作とパスII操作とを順番に実行する。
[0192]パスI操作に関して、頂点シェーディング操作がGPU 36によって呼び出されると、VS/HSステージ280は、頂点シェーディング操作とハルシェーディング操作の両方を実行することができる。すなわち、マージされたVS/HSステージ280は、1つまたは複数のシェーディングユニットの単一のセットを含んでよく、頂点シェーダステージ260およびハルシェーダステージ262に関して上で説明された操作を順番に実行してよい。以下でより詳細に説明されるように、本開示の態様は、GPU 36が、頂点シェーディング操作と同じシェーディングユニットによってハルシェーディング操作を実行しつつ、適切なインターフェースを依然として堅持することを可能にする。いくつかの例では、ハルシェーダ命令は、パッチコードを使用して頂点シェーダ命令に付加されてよく、これによって、同じシェーディングユニットが命令の両方のセットを実行することを可能にする。
[0193]GPU 36は次いで、パスII操作を実行する。たとえば、テッセレーションステージ282は、上のテッセレーションステージ264に関して説明されたように、テッセレーションを実行することができる。マージされたDS/GSステージ284は、上で説明されたマージされたVS/HSステージ280と同じ、1つまたは複数のシェーディングユニット40のセットを含み得る。マージされたDS/GSステージ284は、ドメインシェーダステージ266およびジオメトリシェーダステージ368に関して上で説明されたドメインシェーディング操作とジオメトリシェーディング操作とを順番に実行することができる。いくつかの例では、ジオメトリシェーダ命令は、パッチコードを使用してドメインシェーダ命令に付加されてよく、これによって、同じシェーディングユニットが命令の両方のセットを実行することを可能にする。その上、これらのドメインシェーダ命令およびジオメトリシェーダ命令は、(パスIの)ハルシェーダ命令に付加され得るので、同じシェーディングユニットが、頂点シェーディングと、ハルシェーディングと、ドメインシェーディングと、ジオメトリシェーディングとを、再構成されることなく実行することができる。
[0194]パスIIのジオメトリシェーディング操作は、上で説明されたものと同じジオメトリシェーディング操作を基本的に含み得る。しかしながら、パスII操作を開始するとき、GPRにより初期化された入力(前はVSステージのための、今はDSステージのための)は、頂点フェッチデコーダ(VFD)からフェッチされたデータではなく、テッセレーションステージ282によって生成される(u, v, patch_id)を含み得る。PCは、パスIIに対するrel_patch_idも計算することができ、テッセレーションステージ282によって計算される(u, v)とともに、パッチID情報をDSに渡すことができる。テッセレーションステージ282は、テッセレーション係数を使用して、テッセレーションが行われた頂点の(u, v)座標を生成することができる。テッセレーションステージ282の出力は、さらなる増幅(ジオメトリシェーディング)またはストリームアウト286のためにテッセレーションが行われることを準備するために、マージされたDS/GSステージ284に与えられ得る。DSは、オフチップスクラッチメモリからの、ハルシェーダ(HS)の出力制御ポイントデータとHSパッチ定数データとを使用する。
[0195]いくつかの例では、図10Bに示される2つのパスは、連続的に実行され得るが、2つのパスの間のアイドル状態の待機によって分離され得る。たとえば、GPUのCPは、パスI操作のためのドローコールを送ることができる。データに対してパスIIを開始する前に、GPUは、制御ポイントの値がローカルメモリに完全に書き込まれるのを待機することができる。現在値がローカルメモリにおいて利用可能であることを確実にするために、GPUは、GPUのコンポーネントがパスII操作を開始する前はアイドル状態であることを確認することができる。
[0196]コマンドプロセッサ(CP)は次いで、パスIIのためのドローコールを送ることができる。ある例では、パスIIにおいて行われた作業の量に対する、第1の有用な頂点を開始するための遅延の量の比は、およそ2%未満であり得る。したがって、いくつかの例では、パスIとパスIIとの間には重複がないことがある。他の例では、以下で説明されるように、GPUは、パスI操作とパスII操作の間に重複を含み得る。すなわち、GPUは、以前のドローコールのパスIIのピクセルシェーダステージ288のピクセルシェーディング操作を、現在のドローコールのパスIのVS/HSステージ280の頂点シェーディング操作と重複させることができ、それは、ピクセルシェーダの処理が頂点シェーダの処理よりも長くかかり得るからである。
[0197]本開示の態様によれば、プリミティブコントローラ(PC)は、パスIの後にPASS_doneイベントを送ることができ、これは、ハードウェアユニットがパスIIに切り替えることを助け得る。パスIとパスIIとの間に重複があり得る例では、パスI操作とパスII操作の存在は、命令を実行するシェーダプロセッサにおいて相互に排他的であり得る。しかしながら、パスIIに対するテッセレーション係数は、パスIがまだ実行されている間にフェッチされ得る。
[0198]図11に関して以下で説明されるように、PCは、どれだけのパスIのウェーブが完了したかを記録するために、シェーディングされたパッチごとにカウンタを保持することができる。これらのカウンタは、どれだけのパッチがパスIの処理を完了したかを示すことができる。すべてのカウンタ値が0より大きくなるとすぐに、テッセレーション係数が、パスIIのためにフェッチされ得る。したがって、パスIIは、パスIが完了する前に開始し得る。しかしながら、パスIのドローコールに対するインデックスのすべてが処理されるまで、パスIIに対するドローコールは開始しなくてよい。このようにして、複数のパスの間でのパイプラインのフラッシュ(ローカルGPUメモリから外部メモリへの移行)が回避され得る。
[0199]図11は、本開示で説明される技法を実施して頂点シェーディング操作とハルシェーディング操作とを実行する、ハードウェアシェーディングユニットの例示的な動作を示す図である。たとえば、図11は一般に、本開示の技法に従って、図10Bに関して上で説明されたように、ドローコールの第1のパス(パスI)の間に頂点シェーディング操作とハルシェーディング操作とを実行することを示す。GPU 36(図1)に関して説明されるが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0200]図11の例では、GPU 36は、頂点シェーディング操作を実行するようにシェーディングユニット40を指定することができ、このシェーディングユニット40はまた、最終的に、以下でより詳細に説明されるように、ハルシェーディングと、ドメインシェーディングと、ジオメトリシェーディングとを、そのようなシェーディング操作を実行するように再構成されることなく、実行することができる。たとえば、シェーディングユニット40は最初に、頂点シェーディング操作を実行して、点p0〜p2として図示される3つの頂点を有する入力プリミティブ(トライアングルストリップ)を生成することができる。
[0201]頂点シェーディング操作を実行した後で、GPU 36は、シェーディングされた頂点をローカルのメモリリソースに記憶することができる。たとえば、GPU 36は、(たとえば、GPUメモリ38の)位置キャッシュに頂点シェーダ出力をエクスポートすることができる。頂点シェーディング操作およびハルシェーディング操作は、VS END命令によって分離され得る。したがって、VS END命令を実行し頂点シェーディング操作を完了した後、頂点シェーディング操作を実行するように指定された1つまたは複数のシェーディングユニット40は、各々、ハルシェーディング操作の実行を開始する。
[0202]同じシェーディングユニット40は次いで、ハルシェーディング操作を実行して、制御ポイントV0〜V3を有する出力パッチを生成することができる。この例では、シェーディングユニット40は、ハルシェーダ操作の複数のインスタンスを実行する(これは、図4に関して上で説明されたジオメトリシェーダ操作と同様の方式で、出力識別子(Outvert)によって図示されている)。ハルシェーダ操作の各インスタンスは、同じアルゴリズムを実行して、同じハルシェーディング操作を実行し、1つまたは複数の新たな制御ポイントV0〜V3のそれぞれのインスタンスを生成する。
[0203]すなわち、図11に示される表の4個の列は、ハルシェーダ操作(またはプログラム)の4個の別個のインスタンスに対応し、各列は左から右へ、0〜3のハルシェーダ操作Outvertによって識別され得る。ハルシェーダ操作のこれらの4個のインスタンスの各々は、シェーディングユニット40によって、しばしば同時に実行されて、1つまたは複数の新たな制御ポイントの別個のインスタンスを生成する。したがって、ハルシェーダ操作のインスタンスの各々は、4個すべての頂点(V0〜V3)を生成するが、4個の新たな制御ポイントの対応する1つのみを出力する。ハルシェーダ操作の各インスタンスは、頂点シェーディング操作のために呼び出された、シェーディングユニット40の1:1のインターフェースを堅持するために、4個の新たな制御ポイントの対応する1つのみを出力する。
[0204]図11の例では、ハルシェーダ操作の各々は、そのOutvertと一致する4個の新たな頂点の1つを出力する。したがって、Outvert = 0を有するハルシェーダ操作の第1のインスタンスは、4個の新たな頂点のうちの第1の頂点、V0を出力する。したがって、Outvert = 1を有するハルシェーダ操作の第2のインスタンスは、4個の新たな頂点のうちの第2の頂点、V1を出力する。したがって、Outvert = 2を有するハルシェーダ操作の第3のインスタンスは、4個の新たな頂点のうちの第3の頂点、V2を出力する。したがって、Outvert = 3を有するハルシェーダ操作の第4のインスタンスは、4個の新たな頂点のうちの第4の頂点、V3を出力する。ハルシェーダ値がローカルメモリに書き込まれた後、上で説明されたように、ドメインシェーディング操作およびジオメトリシェーディング操作が、第2のパス(パスII)の間に実行され得る。
[0205]本開示の態様によれば、頂点シェーディング操作を実行するように指定された同じシェーディングユニット40はまた、上で説明されたハルシェーディング操作を実行する。その上、同じシェーディングユニット40がまた、ドローコールの第2のパス(パスII)の間に、ドメインシェーディング操作とジオメトリシェーディング操作とを実行することができる。たとえば、GPU 36は、状態をシェーダ固有のリソース(たとえば、ハルシェーダ、ドメインシェーダ、および/またはジオメトリシェーダの定数、テクスチャオフセットなど)へと変更することができる。GPU 36は、シェーディング操作に割り当てられたモード(ドローモード)に従って、この状態変更を実行することができる。
[0206]以下に示される表4は、頂点シェーディングと、ハルシェーディングと、ドメインシェーディングと、ジオメトリシェーディングとを同じシェーディングユニット40によって実行するための、GPU 36によって保持され得る動作モードとパラメータとを示す。
[0207]いくつかの例では、上の表4に示されるように、いくつかのシェーディング操作は、特定のドローコールに対しては実行されなくてよい。たとえば、ドローコールは、頂点シェーディング操作と、ハルシェーディング操作と、ドメインシェーディング操作と、ピクセルシェーディング操作とを含み得るが、(モード3について示されるように)ジオメトリシェーディング操作を含まないことがある。GPU 36は、モード情報を使用して、ドローコールを実行するときにどのシェーディング操作を行うかを決定することができる。
[0208]以下で示される表5は、ジオメトリシェーディング操作を実行することなくパスII操作を実行するときのパラメータ値を示す。
[0209]以下で示される表6は、ジオメトリシェーディング操作を実行することを含むパスII操作を実行するときのパラメータ値を示す。
[0210]図11に示されるような第1のパス(パスI)と関連付けられる操作を完了した後、GPU 36はアイドル状態を待機することができる。GPU 36は次いで、ドローコールの第2のパス(パスII)を実行して、ドローコールを完了することができる。
[0211]図12Aおよび図12Bは、本開示の技法を実施するハードウェアシェーディングユニットによって実行され得る例示的な動作を示す。図12Aおよび図12Bは一般に、パスIに関して上で説明されたシェーディング操作に対応し得る。
[0212]たとえば、図12Aは一般に、頂点シェーディング操作とハルシェーディング操作とを実行するときにマージされたVS/HSハードウェアシェーディングユニットによって実行される動作のフローを示す。マージされたVS/HSハードウェアシェーディングユニットは、いくつかの例では、頂点シェーディング操作を実行するようにGPU 36によって指定されるが本開示の技法に従って頂点シェーディング操作とハルシェーディング操作の両方を実行する、シェーディングユニット40を含み得る。図12Bは、マージされたVS/HSハードウェアシェーディングユニットによって実行され得る、図12Aに示される動作のフローに対応する擬似コードを一般に示す。
[0213]図12Aに示されるように、ハードウェアシェーディングユニットは、VS操作を実行し、続いてHS操作を実行することができる。たとえば、GPU(GPU 36のような)は、頂点の属性、vertex_id、instance_id、primitive_id、およびmisc(上で説明されたような)を含む、システムにより生成された値をレジスタに書き込むことができる。上で述べられたように、システムにより生成された値を所定の位置にある一連のレジスタに記憶することによって、GPU 36は、VSステージおよびHSステージの各々に対する、システムにより生成された値にアクセスすることができる。したがって、HSステージは、システムにより生成された値がどこに記憶されたかを判定するために、VSステージに基づいてコンパイルされる必要がない。むしろ、GPU 36は、ステージの各々を実行するときに所定のメモリ位置にアクセスして、システムにより生成された必要とされる値にアクセスすることができる。
[0214]ハードウェアシェーディングユニットは次いで、頂点シェーディング操作を実行して、1つまたは複数のシェーディングされた頂点を生成することができる。ハードウェアシェーディングユニットは、シェーディングされた頂点がハルシェーディング操作のために利用可能であるように、シェーディングされた頂点をローカルメモリに書き込むことができる。
[0215]GPUは次いで、ハルシェーディング操作を実行する前に、メモリオフセットとプログラムカウンタとを切り替えることができる。GPUは、たとえば、上で説明されたパッチコードを実行するときに、そのようなタスクを実行することができる。ハードウェアシェーディングユニットは次いで、ローカルメモリからシェーディングされた頂点を読み取り、ハルシェーディング操作を実行して、1つまたは複数の制御ポイントとテッセレーション係数とを生成することができる。
[0216]第1のパスの間に生成される制御ポイントおよびテッセレーション係数は、たとえば、ローカルGPUメモリに記憶され得る。いくつかの例では、制御ポイントおよびテッセレーション係数は、ローカルGPUメモリ内の別個のバッファに記憶され得る。
[0217]図12Bは、上で説明されたパスI操作を実行するハードウェアシェーディングユニットによって実行され得るコードの例示的な一部分である。図12Bに示される例では、大文字の用語は、状態または定数レジスタである。斜字の用語は、シェーダ入力を示す。VS/HS操作に割り振られるGPRの数は、(gprs_needed_for_vsとgprs_needed_for_hs)の大きい方である。したがって、VS操作で使用された後、GPRは解放され、HS操作のために使用される。
[0218]いくつかの例では、シェーディング操作のVS部分では、(図5Bに関して上で述べられたように)有効なVSファイバーのみが実行される。「SWITCH_ACTIVE」命令に遭遇すると、カバレッジマスクビットが、HSシェーダと関連付けられるように変更され、アクティブなHSファイバーのみが実行される。このようにして、確保されたレジスタはVSとHSの両方のために使用されてよく、VSおよびHSは、HS操作を実行するようにシェーディングユニットを再指定することなく、単一のハードウェアシェーディングユニットによって実施され得る。
[0219]図13Aおよび図13Bは、本開示の技法を実施するハードウェアシェーディングユニットによって実行され得る例示的な動作を示す。図13Aおよび図13Bは一般に、上で説明されたパスIIシェーディング操作に対応し得る。
[0220]たとえば、図13Aは一般に、ドメインシェーディング操作とジオメトリシェーディング操作とを実行するときにマージされたDS/GSハードウェアシェーディングユニットによって実行される動作のフローを示す。マージされたDS/GSハードウェアシェーディングユニットは、いくつかの例では、図12Aおよび図12Bに関して上で説明されたものと同じ、かつ最初は頂点シェーディング操作を実行するようにGPU 36によって指定された、シェーディングユニット40を含み得る。図13Bは、マージされたDS/GSハードウェアシェーディングユニットによって実行され得る、図13Aに示される動作のフローに対応する擬似コードを一般に示す。
[0221]本開示の態様によれば、第1のパス(図12Aおよび図12Bに関して説明された)の後に、「アイドル状態を待機する」が続き得る。すなわち、データが第1のパスの間にメモリへ完全に書き込まれる前に、第2のパスの間にデータがローカルメモリから読み取られるのを防ぐために、GPUは、図13Aおよび図13Bに示される第2のパスの操作を開始する前はアイドル状態(たとえば、データを計算または転送していない)であるものとして登録するために、GPUの1つまたは複数のコンポーネントを待機することができる。
[0222]いずれの場合でも、図13Aに示されるように、ハードウェアシェーディングユニットは、ドメインシェーディングとジオメトリシェーディングとを含むパスII操作を実行することができる(テッセレーションも、固定された機能のテッセレーションユニットによって実行され得る)。たとえば、GPUは、{U, V}座標と、primitive_idと、misc(上で説明されたような)とを含む、システムにより生成された値をレジスタに書き込むことができる。上で述べられたように、システムにより生成された値を所定の位置にある一連のレジスタに記憶することによって、GPU 36は、DSステージおよびGSステージの各々に対する、システムにより生成された値にアクセスすることができる。したがって、GSステージは、システムにより生成された値がどこに記憶されたかを判定するために、DSステージに基づいてコンパイルされる必要がない。むしろ、GPU 36は、ステージの各々を実行するときに所定のメモリ位置にアクセスして、システムにより生成された必要とされる値にアクセスすることができる。
[0223]ハードウェアシェーディングユニットは次いで、ドメインシェーディング操作を実行して、1つまたは複数のテッセレーションが行われた頂点を生成することができる。ハードウェアシェーディングユニットは、テッセレーションが行われた頂点がジオメトリシェーディング操作のために利用可能であるように、テッセレーションが行われた頂点をローカルメモリに書き込むことができる。
[0224]GPUは次いで、ジオメトリシェーディング操作を実行する前に、メモリオフセットとプログラムカウンタとを切り替えることができる。GPUは、たとえば、上で説明されたパッチコードを実行するときに、そのようなタスクを実行することができる。ハードウェアシェーディングユニットは次いで、ローカルメモリからテッセレーションが行われた頂点を読み取り、ジオメトリシェーディング操作を実行して、頂点パラメータキャッシュに記憶され得る1つまたは複数のジオメトリシェーディングされた頂点を生成することができる。
[0225]図13Bに示される例では、大文字の用語は、状態または定数レジスタである。斜字の用語は、シェーダ入力を示す。このシェーダに割り振られるGPRの数は、(gprs_needed_for_vsとgprs_needed_for_gs)の大きい方である。したがって、DS操作で使用されたGPRは、解放されGS操作のために使用される。「SWITCH_ACTIVE」命令に遭遇すると、カバレッジマスクビットが、GS操作と関連付けられるように変更され、アクティブなGSファイバーのみが実行される。「END_1st」命令に遭遇すると、ハードウェアシェーダユニットは、定数ファイルおよびテクスチャポインタ(たとえば、リソースポインタ)に対するリソースオフセットを、GSによりプログラムされたオフセットへと切り替え、GSの第1の命令にジャンプすることができる。このようにして、確保されたレジスタは、DSシェーダステージとGSシェーダステージの両方によって使用されてよく、DSシェーダステージおよびGSシェーダステージは、パスI操作を実行した同じハードウェアシェーディングユニットによって実行され得る。
[0226]図12A〜図13Bの例に示されるように、単一のハードウェアシェーディングユニットが、4個の異なるシェーダステージを実行することができる。いくつかの例によれば、シェーダステージをマージするためのパッチコードは、どのシェーダステージがマージされているかに関係なく、同じであり得る。たとえば、DS操作は、(図12Bの一番上から2番目の破線のボックスにおいて示される)VS操作とHS操作とをマージするために使用されたものと同じパッチコードを使用して、GS操作とマージされ得る(図13Bの一番上から2番目の破線のボックスにおいて示される)。ハードウェアシェーディングユニットは、動作モード(上の表に関して示された説明されたような)に基づいて、適切なシェーディング操作へと切り替えることができ、これは、ドローのときにGPUによって決定され得る。
[0227]本開示の態様によれば、各シェーダステージ(VS/GS/HS/DS)は、別個に、かつ、実行の間にどのようにステージがリンクされるかを知ることなく、まとめられ得る。したがって、3個のGPRが、primitveID、rel_patch_ID、およびmiscのようなパラメータを記憶するために確保され得る。コンパイラは、DX10/DX11の適用形態において、入力の属性または内部変数を、2つ超のGPRs IDへ記憶させ得る。
[0228]図14は、本開示の態様による、マージされた頂点シェーディング操作と、ハルシェーディング操作と、ドメインシェーディング操作と、ジオメトリシェーディング操作とを実行するためのグラフィックスプロセシングユニット330の例示的なコンポーネントを示す図である。図14の例は、マージされたVS/HSユニット(パスI)およびマージされたDS/GSユニット(パスII)332と、頂点パラメータキャッシュ(VPC)334と、テッセレータ337を有するプリミティブコントローラ(PC)336と、頂点フェッチデコーダ(VFD)338と、グラフィックスラスタライザ(GRAS)340と、レンダーバックエンド(RB)342と、コマンドプロセッサ(CP)344と、ピクセルシェーダ(PS)346とを含む。加えて、図14は、PM4パケットバッファ350と、頂点オブジェクト352と、インデックスバッファ354と、システムスクラッチ356と、フレームバッファ358とを有する、メモリ348を含む。
[0229]図14の例では、VS/GSユニット332は、上で説明された方式で1つまたは複数のシェーディングユニットによって実装される。VPC 334は、ストリームアウトデータをメモリ348に記憶するために、ストリームアウト機能を実装することができる。PC 336は、変換される必要があり得る頂点を管理することができ、頂点を三角形のプリミティブへと組み立てる。VFD 338は、頂点のフォーマット状態に基づいて、頂点データをフェッチすることができる。GRAS 340は、入力として三角形の頂点を受け取ることができ、三角形の境界内にあるピクセルを出力することができる。プリフェッチパーサ(PFP)は、コマンドストリームを事前に復号し、メインCPエンジン344がデータを必要とするときまでにそのデータの準備ができているように、そのデータをポインタ(たとえば、リソースポインタ)を介してフェッチすることができる。
[0230]DirectX 11のためのディスパッチ機構に関して、ドローコールが、CP 344によって2つのパスのドローへと分割され得る。パスIの出力を記憶するために利用可能な記憶容量に基づいて、ドローコールは、複数のサブドローコールへと分割されてよく、各サブドローコールはパスIとパスIIとを有する。パスIがあるサブドローコールのために実行され、続いて、パスIIがそのサブドローコールのために実行されるように、各サブドローコールは、パスの順序を堅持することができる。
[0231]パスIでサブドローコールを受け取ると、PC 336は、インデックスをフェッチし、VS/HS 332を使用してパッチプリミティブのタイプを処理することができる。VS/HS 332は、パッチごとに、
個のVSファイバーを作成し、ウェーブごとに整数個のパッチを収める(ウェーブは所与の量の作業である)。入力における頂点の再使用はない。VS/HS 332の出力はオフチップからシステムスクラッチ356へと転送されるので、位置キャッシュおよびパラメータキャッシュの割り振りはないことがある。
[0232]HS_FIBERS_PER_PATCHに基づいて、GPUドライバ(図1に示されるGPUドライバ50のような)は、どれだけの入力プリミティブの頂点がローカルメモリ(VS/HS 332に対してローカル)に記憶されるかを計算することができる。これは次のように行われ得る。
ドライバが最終的なデータをメモリ348に書き込む前に中間のデータをローカルメモリに書き込むべきである場合、ドライバはまた、追加のサイズをHS_LM_SIZEに加算することができる。そのような追加の空間は、HSがHSの複数のステージにおいて(たとえば、HSの不変のステージにおいて)計算された制御ポイントを使用している場合、有用であり得る。このタイプのドローコールを受け取るハイレベルシーケンサ(HLSQ)は、どのシェーディングユニットのローカルメモリ(LM)がGS_LM_SIZEのために十分な記憶容量を有するかを確認することができる。HLSQは、そのような割り振りの開始基本アドレス、さらには、割り振られたウェーブによるローカルメモリに対する任意の読取りまたは書込みのアドレスを保持することができる。HLSQはまた、ローカルメモリに書き込むときに、割り振られたメモリ内の計算されたオフセットを基本アドレスに追加することができる。
[0233]システムにより解釈される値(SIV)(たとえば、クリップ/間引きの距離、レンダリング対象、ビューポート)も、PS 346へとロードするためにVPC 334に提供され得る。シェーダステージ(たとえば、VSまたはGS)は、条件的にそれらの値を出力することができる。したがって、PS 346がそれらの値を必要とする場合、PS 346は、そのような条件を状態の一部として設定することができる。PS 346がそれらの値を必要とせず、そのような決定がピクセルシェーディング操作の集約の後に行われる場合、これらのSIVを出力する状態は、VSまたはGSがドローのときにそれらの値をVPC 334に書き込まないように、リセットされ得る。
[0234]ヌルのGSに対して(ジオメトリシェーダステージが実行されていない場合)、ヌルのGSまたはヌルではないGSに対する別個のパスが存在しないように、コンパイラは、テンプレートGSも作成することができる。このテンプレートGSは、VSまたはドメインシェーダ(DS)の出力をローカルメモリに複製して、ローカルメモリからさらに複製してVPC 334へ出力することができる。これは、ストリームアウトが実行される場合にのみ行われ得る。
[0235]どのシェーダが実施されているかに応じて、可視性ストリームをビニングして消費するプロセスは異なり得る。たとえば、いくつかのGPUは、タイルまたは「ビン」へとレンダリングされるように画像データを分割することができ、画像全体がレンダリングされるまで、各ビンを連続的に(または場合によっては、同時にもしくは並列に)レンダリングする。画像をビンへと分割することによって、GPUは、(オンチップメモリが、タイルをレンダリングするために十分な画像データを記憶するのに十分大きい可能性があることを考慮すると)オンチップメモリの要件を低減しつつ、オフチップメモリからのデータの取り出しをより少なくすることを助けることもできる。
[0236]可視性ストリームに関して、Zバッファアルゴリズムが、他のプリミティブによって塞がれるプリミティブを決定するために使用され得る(したがって、レンダリングされる必要はない)。たとえば、GPUは、(深度の順で)最も後ろにあるプリミティブから、(やはり深度の順で)最も前にあるプリミティブへと作業して、各プリミティブを描くことができる。この例では、いくつかのプリミティブはレンダリングされるが、結局他のプリミティブがその上に描かれることがある。
[0237]このいわゆる「オーバードロー」の結果として、GPUは、早期のZバッファアルゴリズムのテストを実行するように適合されてよく、これは、GPUがレンダリングを実行するときに無視または迂回されるべき、完全に塞がれる、または視界の中にないプリミティブをGPUが識別することを可能にする。この観点で、GPUは、各プリミティブおよび/またはオブジェクトに関して可視性情報と呼ばれ得るものを決定するように適合され得る。
[0238]DX10に関して、ビニングパスの間、PC 336は、GSからのすべての出力プリミティブの終了の時点で、「プリミティブの終了」をGRAS 340に送る。したがって、可視性情報は、入力プリミティブごとに記録される。ストリームアウトは、ビニングパスの間に実行され得る。CP 344は、ビニングパスの終了の時点で、すべてのストリームアウトバッファ関連の情報を読み取ることができる。ジオメトリ関連のクエリカウンタは、ビニングパスの間に更新され得る。
[0239]可視性パスは、可視性ストリームを読み取り、プリミティブごとの可視性情報が読み取られるとストリームを進めることができる。ストリームがラスタライズされていない場合、可視性パスは飛ばされ得る。それ以外の場合、PC 336は、可視性入力GSプリミティブを確認して、ストリームアウトを何ら伴わずにレンダリングするように処理する。
[0240]DX11に関して、ビニングパスの間、PC 336は、パスIIにおけるGSからのすべての出力プリミティブの終了の時点で、「プリミティブの終了」をGRAS 340に送る(たとえば、入力パッチごとに1ビット)。ストリームアウトは、上で説明されたように実行され得る。可視性パスの間、可視性ストリームは、パッチとともにパスIにおいて処理される(可視性のあるパッチのみが処理され得る)。パスIIは、可視のパッチのみを処理し、可視のパッチのみに対してテッセレーション係数をフェッチする。
[0241]以下に示される表7は、5個の異なる動作のモードの各々に対する、ビニングパスとレンダリングパスとに関する情報を提供する。各モードは、上で説明されたように、単一のハードウェアシェーディングユニットによって実行されるある動作に対応する。
[0242]図15は、本開示の態様による、同じハードウェアシェーディングユニットを使用して2つのレンダリングパスでグラフィックスレンダリングを実行することを示すフロー図である。GPU 36(図1)に関して説明されるが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0243]図15の例では、GPU 36は、グラフィックスをレンダリングするために現在実行されているドローコールがテッセレーション操作を含むかどうかを判定する(380)。上で説明されたように、テッセレーション操作は、たとえば、ハルシェーダステージ、テッセレーションステージ、およびドメインシェーダステージと関連付けられる操作を含み得る。ドローコールがテッセレーション操作を含まない場合、GPU 36は、単一のパスを伴うレンダリングを実行することができる(382)。たとえば、GPU 36は、上で説明された方式で、頂点シェーディングと、ジオメトリシェーディングと、ピクセルシェーディングとを実行することができる。
[0244]ドローコールがテッセレーション操作を含まない場合、GPU 36は、GPUメモリ38のようなローカルのGPUメモリリソースのサイズを決定することができる(384)。GPU 36は次いで、ドローコールを複数のサブドローコールへと分割することができる(386)。いくつかの例では、各サブドローコールは、上で説明されたパスI操作とパスII操作とを含み得る。たとえば、パスI操作は、頂点シェーディング操作とハルシェーディング操作とを含み得るが、パスII操作は、ドメインシェーディング操作とジオメトリシェーディング操作とを含み得る。
[0245]各サブドローコールによってレンダリングされるデータの量は、GPUメモリ38のサイズに基づいて決定され得る。たとえば、GPU 36は、GPU 36がパスI操作によって生成されたデータのすべてをパスII操作において使用するためにローカルメモリに記憶することが可能であるように、サブドローコールを構成することができる。このようにして、上で説明されたように、GPU 36は、ローカルGPUメモリと、GPUの外部のメモリとの間で転送されるデータの量を減らすことができ、これにより、レンダリングと関連する遅延が減り得る。
[0246]サブドローコールを決定した後で、GPU 36は、第1のサブドローコールに対するパスI操作を実行することができる(388)。上で述べられたように、パスI操作は、同じハードウェアシェーディングユニット、たとえば、1つまたは複数のシェーディングユニット40の各々を使用して、頂点シェーディング操作とハルシェーディング操作とを実行することを含み得る。すなわち、GPU 36は、頂点シェーディングを実行するようにいくつかのシェーディングユニット40を指定することができ、シェーディングユニット40の各々は、頂点シェーディング操作とハルシェーディング操作の両方を実行することができる。
[0247]GPU 36はまた、第1のサブドローコールに対するパスII操作を実行することができる(390)。上で述べられたように、パスII操作は、同じ1つまたは複数のシェーディングユニット40を使用して、ドメインシェーディング操作とジオメトリシェーディング操作とを実行することを含み得る。やはり、GPU 36は、頂点シェーディング操作を実行するようにいくつかのシェーディングユニット40を指定し得るが、シェーディングユニット40の各々は、シェーディングユニット40の各々が頂点シェーディング操作と、ハルシェーディング操作と、ドメインシェーディング操作と、ジオメトリシェーディング操作とを実行するように、パスII操作を実行することができる。
[0248]GPU 36はまた、サブドローコールに対するピクセルシェーディング操作を実行することができる(392)。GPU 36は、1つまたは複数の他のシェーディングユニット40を使用して、ピクセルシェーディング操作を実行することができる。他の例では、GPU 36は、サブドローコールのすべてが完了した後で、ドローコール全体に対するピクセルシェーディングを実行することができる。
[0249]GPU 36は次いで、完了したサブドローコールがドローコールの最後のサブドローコールかどうかを判定することができる(392)。サブドローコールがドローコールの最後のサブドローコールである場合、GPU 36は、ドローコールと関連付けられるレンダリングされたグラフィックスデータを出力することができる。サブドローコールがドローコールの最後のサブドローコールではない場合、GPU 36は、ステップ388に戻り、次のサブドローコールに対するパスI操作を実行することができる。
[0250]図15に示されるステップは一例として与えられたものにすぎないことを理解されたい。すなわち、図15に示されるステップは必ずしも示される順序で実行される必要があるとは限らず、より少数の、追加の、または代替のステップが実行され得る。
[0251]図16は、本開示の態様による、2つのパスのグラフィックスレンダリングプロセスの第1のパスと関連付けられる、グラフィックスレンダリング操作を実行することを示すフロー図である。図16に示されるプロセスは、図15のステップ388に関して上で説明されたパスI操作に対応し得る。GPU 36(図1)に関して説明されるが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0252]図16の例では、上で説明されたように、GPU 36は最初に、グラフィックスレンダリングパイプラインの頂点シェーダステージと関連付けられる頂点シェーディング操作を実行するように、1つまたは複数のシェーディングユニット40を指定することができる(400)。頂点シェーディング操作を実行した後、指定されたシェーディングユニット40の各々は、ハルシェーディング操作のために、シェーディングされた頂点をローカルメモリに記憶することができる(402)。GPU 36はまた、ハルシェーディング操作を記録するためのプログラムカウンタを変更し、さらに、1つまたは複数のリソースポインタをハルシェーダリソースオフセットへと変更することができる。たとえば、リソースポインタは、ハルシェーディング操作に割り振られたデータ位置を指し得る。
[0253]この意味で、シェーディングユニット40の各々は、動作モードを変更してハルシェーディング操作を実行する。しかしながら、モード変更は、ハルシェーディング操作を実行するようにシェーディングユニット40を再指定することを含まない。すなわち、GPU 36のコンポーネントは依然として、頂点シェーディング操作のために指定されたシェーディングユニットの1:1のインターフェースのフォーマットとの間でデータを送信し受信するように構成され得る。
[0254]GPU 36は次いで、上で説明されたように、頂点シェーディング操作を実行した同じシェーディングユニット40を使用して、グラフィックスレンダリングパイプラインのハルシェーダステージと関連付けられるハルシェーディング操作を実行することができる(404)。たとえば、各シェーディングユニット40は、シェーディングされた頂点に対して動作して、テッセレーションのために使用され得る1つまたは複数の制御ポイントを生成することができる。
[0255]図16に示されるステップは一例として与えられたものにすぎないことを理解されたい。すなわち、図16に示されるステップは必ずしも示される順序で実行される必要があるとは限らず、より少数の、追加の、または代替のステップが実行され得る。
[0256]図17は、本開示の態様による、2つのパスのグラフィックスレンダリングプロセスの第2のパスと関連付けられる、グラフィックスレンダリング操作を実行することを示すフロー図である。図17に示されるプロセスは、図15のステップ390に関して上で説明されたパスII操作に対応し得る。GPU 36(図1)に関して説明されるが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0257]図17の例では、GPU 36は、図17の操作を実行するために、図16に関して上で説明された同じシェーディングユニット40を使用することができる。たとえば、パスII操作を実行するために、同じシェーディングユニット40はまず、上で説明されたように、グラフィックスレンダリングパイプラインのドメインシェーダステージと関連付けられるドメインシェーディング操作を実行することができる(420)。すなわち、シェーディングユニット40は、(ハルシェーダステージからの)制御ポイントに対して動作して、ドメインシェーディングされた頂点を生成することができる。
[0258]ドメインシェーディング操作を実行した後、指定されたシェーディングユニット40の各々は、ジオメトリシェーディング操作のために、ドメインシェーディングされた頂点をローカルメモリに記憶することができる(402)。GPU 36はまた、ハルシェーディング操作を記録するためのプログラムカウンタを変更し、さらに、1つまたは複数のリソースポインタをハルシェーダリソースオフセットへと変更することができる。図17の操作が図16に関して説明されたものに従う例では、これらの機能(たとえば、値をローカルメモリに記憶すること、プログラムカウンタを変更すること、リソースオフセットを変更すること)も、ステップ420の前に実行され得る。
[0259]この意味で、シェーディングユニット40の各々は、動作モードを変更して、ドメインシェーディング操作とジオメトリシェーディング操作とを実行する。しかしながら、モード変更は、ドメインシェーディング操作とジオメトリシェーディング操作とを実行するようにシェーディングユニット40を再指定することを含まない。すなわち、GPU 36のコンポーネントは依然として、頂点シェーディング操作のために指定されたハードウェアシェーディングユニットの1:1のインターフェースのフォーマットとの間でデータを送信し受信するように構成され得る。
[0260]GPU 36は次いで、上で説明されたように、ドメインシェーディング操作を実行した同じシェーディングユニット40を使用して、グラフィックスレンダリングパイプラインのジオメトリシェーダステージと関連付けられるジオメトリシェーディング操作を実行することができる(424)。たとえば、各シェーディングユニット40は、ドメインシェーディングされた頂点に対して動作して、1つまたは複数のジオメトリシェーディングされた頂点を生成することができる。
[0261]図17に示されるステップは一例として与えられたものにすぎないことを理解されたい。すなわち、図17に示されるステップは必ずしも示される順序で実行される必要があるとは限らず、より少数の、追加の、または代替のステップが実行され得る。
[0262]図18は、本開示の態様による、同じハードウェアシェーディングユニットによる実行のために2つ以上のシェーダステージを一緒にパッチされることを示すフロー図である。GPU 36(図1)に関して説明されるが、本開示の態様は、種々の他のコンポーネントを有する多種多様な他のGPUによって実行され得る。
[0263]図18の例では、GPU 36は、第1のシェーダステージと関連付けられるシェーディング操作を実行するように、1つまたは複数のハードウェアシェーディングユニット、たとえば、1つまたは複数のシェーディングユニット40を指定することができる(440)。いくつかの例では、第1のシェーダステージは、GPU 36が頂点シェーディング操作を実行するように1つまたは複数のシェーディングユニットを指定するように、頂点を生成するための頂点シェーダステージであり得る。
[0264]第1のシェーダステージと関連付けられる操作を完了すると、GPU 36は動作モードを切り替えて、同じシェーディングユニット40が種々の他のシェーディング操作を実行することを可能にし得る(442)。たとえば、上で説明されたように、GPU 36は、第2のシェーディング操作を実行するために、プログラムカウンタと1つまたは複数のリソースポインタとを変更することができる。
[0265]いくつかの例では、GPU 36は、実行されているドローコールと関連付けられるモード情報に基づいて、シェーディングユニット40の動作モードを切り替えることができる。たとえば、GPU 36のドライバ(GPUドライバ50のような)は、どのシェーダステージがドローコールにおいて実行されるべきかを示す、ドローコールに対するモード番号を生成することができる。GPU 36は、このモード番号を使用して、上で説明されたように、パッチコードを実行すると、シェーディングユニットの動作モードを変更することができる。
[0266]以下に示される表8は、シェーダステージの種々の組合せに対するモード番号を含む、モード情報を一般に示す。
[0267]表8に示されるように、各モードは、どのシェーダステージがシェーディングユニットによって実行されるかを決定する。したがって、GPU 36は、シェーダ命令を一緒にひと続きにして、同じシェーディングユニット40が複数のシェーディング操作を実行することを可能にし得る。すなわち、GPU 36は、実行されているドローコールのモード番号に基づいて、適切なシェーダ命令を一緒にパッチされることができる。
[0268]このようにして、GPU 36は次いで、第1のシェーディング操作を実行するように指定された同じシェーディングユニット40を用いて、第2のシェーディング操作を実行することができる(444)。たとえば、GPU 36は、上の表8に示されるように、頂点シェーディング操作、ハルシェーディング操作、ドメインシェーディング操作、およびジオメトリシェーディング操作の組合せを実行することができる。
[0269]図18に示されるステップは一例として与えられたものにすぎないことを理解されたい。すなわち、図18に示されるステップは必ずしも示される順序で実行される必要があるとは限らず、より少数の、追加の、または代替のステップが実行され得る。
[0270]上で説明されたいくつかの例は、頂点シェーディング操作を実行するようにハードウェアシェーディングユニットを最初に指定することと、同じハードウェアシェーディングユニットを用いて他のシェーディング操作を実行することへと移行することとを含むが、本開示の技法はこのように限定されないことを理解されたい。たとえば、GPUは、種々の他のシェーディング操作を実行するようにハードウェアシェーディングユニットのセットを最初に指定することができる。すなわち、3個の異なるシェーディング操作を実行するようにハードウェアシェーディングユニットをGPUが指定することを可能にするシステムにおいて、GPUは、頂点シェーディング操作と、ハルシェーディング操作と、ピクセルシェーディング操作とを実行するように、ハードウェアシェーディングユニットを指定することができる。この例では、GPUは、ハルシェーディング操作を実行するように1つまたは複数のハードウェアシェーディングユニットを最初に指定することができるが、上で説明されたように、同じハードウェアシェーディングユニットによってドメインシェーディング操作とジオメトリシェーディング操作とを実行することもできる。種々の他の操作の組合せも可能である。
[0271]1つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装される場合、機能は、非一時的コンピュータ可読媒体を備える製造品に1つまたは複数の命令またはコードとして記憶され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明された技法の実装のための命令、コードおよび/またはデータ構造を取り出すために1つまたは複数のコンピュータあるいは1つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、RAM、ROM、EEPROM、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気ストレージデバイス、フラッシュメモリ、あるいは、命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用されコンピュータによってアクセスされ得る、任意の他の媒体を備え得る。本明細書で使用されるディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピー(登録商標)ディスク(disk)およびブルーレイ(登録商標)ディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
[0272]コードは、1つまたは複数のDSP、汎用マイクロプロセッサ、ASIC、FPGA、あるいは他の等価な集積回路またはディスクリート論理回路など、1つまたは複数のプロセッサによって実行され得る。さらに、いくつかの態様では、本明細書で説明される機能は、専用のハードウェアモジュールおよび/またはソフトウェアモジュールの内部で与えられ得る。また、本技法は、1つまたは複数の回路または論理要素中で完全に実装され得る。
[0273]本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(たとえば、チップセット)を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示される技法を実行するように構成されたデバイスの機能的態様を強調するために、様々なコンポーネント、モジュール、またはユニットが説明されたが、それらのコンポーネント、モジュール、またはユニットは、必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上で説明されたように、様々なユニットが、好適なソフトウェアおよび/またはファームウェアとともに、上記で説明した1つまたは複数のプロセッサを含めて、コーデックハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
[0274]様々な例が説明された。これらおよび他の例は、以下の特許請求の範囲内に入る。