(57)【要約】  グラフィックス処理パイプライン30は、それが実行しているフラグメントシェーダプログラムに含まれている「テスト」命令に応答して、適切な場合に、処理されているフラグメントに対するアルファトゥカバレッジ動作41、後期ステンシルテスト42、および後期深度テスト43の実行をトリガーし、次いで更新されたカバレッジ情報をフラグメントシェーダ40に返すように動作可能であるプログラム可能フラグメントシェーダ40を備える。  これは、シェーダ実行時にアルファトゥカバレッジおよび後期ステンシルおよび深度テスト動作が、それらの動作を実行する前にシェーダ実行が完了するまで待たなくても、トリガーされ実行されることを可能にする。
2018514034.tif 000002
【特許請求の範囲】
【請求項１】
グラフィックス処理パイプラインを含むグラフィックス処理システムを動作させる方法であって、
前記グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対して前記フラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対する前記フラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるステップと、
前記グラフィックス処理パイプラインの前記プログラム可能フラグメントシェーディング段が、フラグメントを処理するために前記フラグメントシェーダプログラムを実行したときに、前記命令に応答して、
処理されている前記フラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対して前記フラグメント毎の動作の実行をトリガーし、それによって処理されている前記フラグメントに対する前記フラグメント毎の動作の結果を生成するステップとを含む方法。
【請求項２】
グラフィックス処理パイプラインのラスタライザによって生成されるグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行するグラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段を動作させる方法であって、
前記方法は、
前記グラフィックス処理パイプラインの前記プログラム可能フラグメントシェーディング段が、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、
前記フラグメントシェーダプログラムに含まれるグラフィックスプログラム命令に応答して、
処理されている前記フラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対して前記フラグメント毎の動作の実行をトリガーし、それによって処理されている前記フラグメントに対する前記フラグメント毎の動作の結果を生成するステップを含む方法。
【請求項３】
前記フラグメントシェーダプログラムに含まれる前記命令がトリガーする前記フラグメント毎の動作は、前記フラグメントに対するカバレッジに影響を及ぼし、および/またはこれを決定する動作である請求項1または2に記載の方法。
【請求項４】
前記フラグメントシェーダプログラムに含まれる前記命令がトリガーする前記フラグメント毎の動作は、アルファトゥカバレッジおよび/またはアルファテスト動作である請求項1、2、または3に記載の方法。
【請求項５】
前記フラグメントシェーダプログラムに含まれる前記命令がトリガーする前記フラグメント毎の動作は、深度および/またはステンシルテストである請求項1、2、3、または4に記載の方法。
【請求項６】
前記命令がトリガーする前記フラグメント毎の動作は、前記フラグメントに対するアルファ値が特定の1つまたは複数の値を有するかどうかの決定であり、前記命令は、前記フラグメントが前記特定のアルファ値または前記特定のアルファ値のうちの1つを有するときに特定の1つまたは複数の動作の実行をトリガーするようにさらに動作可能である請求項1から5のいずれか一項に記載の方法。
【請求項７】
前記命令は、前記フラグメントのカバレッジがゼロであるかどうかを決定し、前記フラグメントの前記カバレッジがゼロであるときに、前記フラグメントに対するシェーダプログラムの実行を停止するように動作可能である請求項1から6のいずれか一項に記載の方法。
【請求項８】
前記フラグメントシェーディング段は、前記命令が関係する前記動作が前記フラグメントに対して実行されるべきかどうかを、
前記フラグメントに対する深度および/またはステンシルテストが前記命令が実行されるべきであるときに完了しているかどうか、
アルファトゥカバレッジまたはアルファテストが前記フラグメントに対して有効化されているかどうか、および
前記フラグメントシェーダプログラムが深度および/またはステンシル値を出力するように動作可能であるかどうか
のうちの1つまたは複数に基づき決定する請求項1から7のいずれか一項に記載の方法。
【請求項９】
グラフィックス処理システムを動作させる方法であって、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対して前記フラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対する前記フラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるステップを含む方法。
【請求項１０】
前記命令を前記シェーダプログラム内の、フラグメントカバレッジに影響を及ぼす前記シェーダプログラム内の命令の後に含めるステップを含む請求項1から9のいずれか一項に記載の方法。
【請求項１１】
前記命令を前記シェーダプログラム内の、深度またはステンシル値を出力する命令の前に含めるステップを含む請求項1から10のいずれか一項に記載の方法。
【請求項１２】
前記フラグメントに対する深度テストおよび/またはステンシルテストの前記実行をトリガーするように動作可能であるさらなる命令を前記シェーダプログラム内の、前記フラグメント毎の動作をトリガーする前記命令の後に含めるステップをさらに含む請求項1から11のいずれか一項に記載の方法。
【請求項１３】
グラフィックス処理システムであって、
グラフィックス処理パイプラインであって、
処理されるべきグラフィックスフラグメントを生成するために入力プリミティブをラスター処理し、ここで、各グラフィックスフラグメントはそれに関連付けられている1つまたは複数のサンプリング点を有する、ラスタライザと、
前記ラスタライザによって生成されたグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行するプログラム可能フラグメントシェーディング段とを備える、グラフィックス処理パイプラインを備え、
前記グラフィックス処理システムは、
前記グラフィックス処理パイプラインの前記プログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対して前記フラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対する前記フラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるように構成されている処理回路をさらに備え、
前記グラフィックス処理パイプラインの前記プログラム可能フラグメントシェーディング段は、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、前記命令に応答して、
処理されている前記フラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対して前記フラグメント毎の動作の実行をトリガーし、それによって処理されている前記フラグメントに対する前記フラグメント毎の動作の結果を生成するように構成されるグラフィックス処理システム。
【請求項１４】
グラフィックス処理パイプラインに対するプログラム可能フラグメントシェーディング段であって、
ラスタライザによって生成されたグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行する処理回路を備え、
前記プログラム可能フラグメントシェーディング段は、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、
フラグメントシェーダプログラムに含まれるグラフィックスプログラム命令に応答して、
処理されている前記フラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対して前記フラグメント毎の動作の実行をトリガーし、それによって処理されている前記フラグメントに対する前記フラグメント毎の動作の結果を生成するように構成されるグラフィックス処理パイプラインに対するプログラム可能フラグメントシェーディング段。
【請求項１５】
前記フラグメントシェーダプログラムに含まれる前記命令がトリガーする前記フラグメント毎の動作は、前記フラグメントに対するカバレッジに影響を及ぼし、および/またはこれを決定する動作である請求項13に記載のシステム、または請求項14に記載の段。
【請求項１６】
前記フラグメントシェーダプログラムに含まれる前記命令がトリガーする前記フラグメント毎の動作は、アルファトゥカバレッジおよび/またはアルファテスト動作である請求項13もしくは15に記載のシステム、または請求項14もしくは15に記載の段。
【請求項１７】
前記フラグメントシェーダプログラムに含まれる前記命令がトリガーする前記フラグメント毎の動作は、深度および/またはステンシルテストである請求項13、15、もしくは16に記載のシステム、または請求項14、15、もしくは16に記載の段。
【請求項１８】
前記命令がトリガーする前記フラグメント毎の動作は、前記フラグメントに対するアルファ値が特定の1つまたは複数の値を有するかどうかの決定であり、前記命令は、前記フラグメントが前記特定のアルファ値または前記特定のアルファ値のうちの1つを有するときに特定の1つまたは複数の動作の実行をトリガーするようにさらに動作可能である請求項13、15、16、もしくは17に記載のシステム、または請求項14、15、16、もしくは17に記載の段。
【請求項１９】
前記フラグメントシェーディング段は、前記命令に応答して、前記フラグメントのカバレッジがゼロであるかどうかの決定、および前記フラグメントのカバレッジがゼロであると決定されたときに、前記フラグメントに対するシェーダプログラムの実行の停止をトリガーする請求項13、15、16、17、もしくは18に記載のシステム、または請求項14、15、16、17、もしくは18に記載の段。
【請求項２０】
前記フラグメントシェーディング段は、前記命令が関係する前記動作が前記フラグメントに対して実行されるべきかどうかを、
前記フラグメントに対する深度および/またはステンシルテストが、前記命令が実行されるべきであるときに完了しているかどうか、
アルファトゥカバレッジまたはアルファテストが前記フラグメントに対して有効化されているかどうか、および
前記フラグメントシェーダプログラムが深度および/またはステンシル値を出力するように動作可能であるかどうか
のうちの1つまたは複数に基づき決定する請求項13、15、16、17、18、もしくは19に記載のシステム、または請求項14から19のいずれか一項に記載の段。
【請求項２１】
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段による実行のための命令を生成するようにプログラムをコンパイルするコンパイラであって、前記コンパイラは、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対して前記フラグメント毎の動作が実行され得ると決定されたときに、処理されている前記フラグメントに対する前記フラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるように構成されるコンパイラ。
【請求項２２】
前記命令は、前記シェーダプログラム内の、フラグメントカバレッジに影響を及ぼす前記シェーダプログラム内の命令の後に含まれる請求項13、15、16、17、18、19、もしくは20に記載のシステム、または請求項14から20のいずれか一項に記載の段、または請求項21に記載のコンパイラ。
【請求項２３】
前記命令は、前記シェーダプログラム内の、深度またはステンシル値を出力する命令の前に含まれる請求項13、15、16、17、18、19、20、もしくは22に記載のシステム、または請求項14から20もしくは22のいずれか一項に記載の段、または請求項21もしくは22に記載のコンパイラ。
【請求項２４】
前記処理回路またはコンパイラは、
前記フラグメントに対する深度テストおよび/またはステンシルテストの前記実行をトリガーするように動作可能であるさらなる命令を前記シェーダプログラム内の、前記フラグメント毎の動作をトリガーする前記命令の後に含めるようにさらに構成される請求項13、15、16、17、18、19、20、22、もしくは23に記載のシステム、または請求項14から20もしくは22もしくは23のいずれか一項に記載の段、または請求項21、22、もしくは23に記載のコンパイラ。
【請求項２５】
コンピュータプログラムであって、前記プログラムがデータプロセッサ上で実行されたときに請求項1から12のいずれか一項に記載の方法を実行するためのコンピュータソフトウェアコードを含むコンピュータプログラム。
【請求項２６】
添付図面のうちの1つを参照しつつ実質的に本明細書で説明されているようなグラフィックス処理システムを動作させる方法。
【請求項２７】
添付図面のうちの1つを参照しつつ実質的に本明細書で説明されているようなグラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段を動作させる方法。
【請求項２８】
添付図面のうちの1つを参照しつつ実質的に本明細書で説明されているようなグラフィックス処理システム。
【請求項２９】
添付図面のうちの1つを参照しつつ実質的に本明細書で説明されているようなグラフィックス処理パイプラインに対するプログラム可能フラグメントシェーディング段。
【請求項３０】
添付図面のうちの1つを参照しつつ実質的に本明細書で説明されているようなグラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段のためのコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書で説明されている技術は、グラフィックス処理システムに関し、特に、1つまたは複数のプログラム可能処理段(「シェーダ」)を備えるグラフィックス処理システムの動作に関する。
【背景技術】
【０００２】
グラフィックス処理動作がより容易に実行されるように、通常、表示されるべきフレームなどの、生成されるべき出力を最初に多数の類似の基本コンポーネント(いわゆる「プリミティブ」)に分割することによってグラフィックス処理が実行される。これらの「プリミティブ」は、通常、三角形などの単純な多角形の形態を取る。
【０００３】
たとえば、フレームを表示するために、プリミティブが生成され、定義された後、これらは、グラフィックス処理システムにより処理され得る。
【０００４】
このプロセスは、基本的に、処理する出力領域をカバーするサンプリング点の配列内のどのサンプリング点が1つのプリミティブによってカバーされるかを判定するステップと、そのサンプリング点でプリミティブを表すためにそれぞれのサンプリング点が(たとえば、色などに関して)有するべき外観を決定するステップとを伴う。これらのプロセスは、一般に、ラスター処理およびレンダリングとそれぞれ称される。
【０００５】
ラスター処理プロセスでは、プリミティブに対し使用されるべきサンプル位置(すなわち、出力(たとえば、表示されるべきフレーム)内のプリミティブを表すために使用されるサンプル点の(x,y)位置)を決定する。
【０００６】
次いで、レンダリングプロセスは、サンプル点でプリミティブを表す(すなわち、それぞれのサンプル点に「陰影を付ける」)のに必要な、赤、緑、および青(RGB)の色値ならびに「アルファ」(透明度)値などのデータを導出する。これは、テクスチャを適用するステップ、サンプル点データ値をブレンドするステップなどを伴い得る。
【０００７】
これらのプロセスは、典型的には、1つまたは複数のサンプリング点からなる集合をテストし、次いで、注目している(テストしている)プリミティブの内側にある(プリミティブによってカバーされている)サンプル点を含むことが判明しているサンプリング点の集合毎に、グラフィックス処理動作(レンダリングなど)が実行される「フラグメント」と通常称される離散グラフィカルエンティティを生成することによって実行される。したがって、カバーされているサンプリング点は、実際には、注目するサンプリング点でプリミティブをレンダリングするために使用されるフラグメントとして処理される。「フラグメント」は、レンダリングプロセス(レンダリングパイプライン)を通るグラフィカルエンティティである。生成され処理される各フラグメントは、たとえば、グラフィックス処理システムが構成される仕方に応じて、単一のサンプリング点または複数のサンプリング点からなる集合を表し得る。
【０００８】
現在、多くのグラフィックス処理システムは、「シェーダ」と一般的に称される1つまたは複数のプログラム可能な処理段を備えており、これは所望のグラフィックスデータを生成するためにグラフィックス処理動作を実行するプログラムを実行する。これらのシェーダは、入力されたデータ値に対してシェーダプログラムを実行して出力データの所望の集合を生成する(グラフィックス処理パイプラインの残り部分による処理のため、および/または出力のため)プログラム可能処理段である。グラフィックス処理パイプラインのシェーダは、プログラム可能処理回路を共有し得るか、または各々、明確に異なるプログラム可能処理ユニットであり得る。
【０００９】
グラフィックス処理パイプラインが典型的には備え得る1つのシェーダは、フラグメントシェーダであり、これはレンダリングプロセスの一部としてラスタライザによって生成されたフラグメントに対してフラグメントシェーディング動作を実行する。
【００１０】
ラスター処理およびレンダリング(フラグメントシェーディング)動作に加えて、グラフィックス処理は、通常、アルファトゥカバレッジ(alpha to coverage)および/またはアルファテスト(alpha test)、ステンシルテスト(stencil test)および/または深度テスト(depth test)などの隠面消去(hidden surface removal)または他のカリング(culling)テスト、ならびにブレンディングなどの、フラグメント毎の多数の動作を実行するステップも含む。グラフィックス処理API(標準)は、通常、これらのフラグメント毎の動作が、フラグメントシェーディングが実行された後に生じることを必須としている。
【００１１】
図1は、上で説明されている方式で動作可能である例示的なグラフィックス処理パイプライン1を示している。
【００１２】
図1に示されているように、グラフィックス処理パイプライン1は、プリミティブ組み立て段2、ラスター処理段(ラスタライザ)3、フラグメントシェーディング動作を実行するフラグメントシェーダ(シェーダ実行)段4、アルファトゥカバレッジ動作を実行するアルファトゥカバレッジ段5、ステンシルテストを実行するステンシルテスト段6、深度テストを実行する深度テスト段7、およびブレンディング動作を実行するブレンディング段8を備える。次いで、ブレンディング動作の出力は、グラフィックス処理パイプライン1の出力としてメモリ9に書き込まれ得る。
【００１３】
グラフィックス処理標準(API)は、アルファトゥカバレッジ、アルファテスト、ステンシルテスト、および深度テストなどの様々なフラグメント毎の動作が、フラグメントシェーディング動作の後に実行されなければならないことを要求しているが、フラグメントシェーダ動作の前にこれらのテストのうちの少なくともいくつか(通常は、ステンシルテストおよび深度テスト)を実装することは、それを行うときにプロセス全体がフラグメントシェーダ動作の後にテストが行われたかのように振る舞う限り可能である(すなわち、結果は、テストがフラグメントシェーダ動作の後に行われた場合と同じである)。ステンシルテストおよび深度テストを「早期(early)に」(少なくとも可能な場合に)実行することによって、隠面消去を向上させることができ、それにより最終的な出力の中には実際には見えないフラグメントおよびプリミティブに対するフラグメントシェーディング動作は回避することができる。
【００１４】
図2は、ステンシルテストおよび深度テストを「早期に」(すなわち、フラグメントシェーダ実行の前に)(可能であれば)実行する能力を有する対応するグラフィックス処理パイプラインを示している。
【００１５】
この場合、図2に示されているように、グラフィックス処理パイプライン20は、ラスタライザ3とフラグメントシェーダ4との間に早期ステンシルテスト段21および早期深度段22を備える。これらの段は、ラスタライザ3によって発行されるフラグメントに対してそれぞれのテストを実行するが、これは、グラフィックス処理パイプラインが、それを行うことが可能であると決定した場合に実行する。
【００１６】
しかしながら、図2に示されているように、パイプラインは、「従来の」後期(late)ステンシルテスト段6および後期深度テスト段7を、早期ステンシルテスト段21または早期深度テスト段22を使用してそれらのテストを実行することが可能でなかった場合にフラグメントに対してこれらのテストを実行するために、依然として含んでいなければならない。これは、たとえば、アルファトゥカバレッジまたはアルファテストが有効化されているか、またはフラグメントシェーダそれ自体が破棄動作を有し、出力カバレッジマスク(coverage mask)を変更するか、またはそれ自体が出力深度(output depth)および/もしくはステンシル値(stencil value)を決定する場合であり得る。これらの場合に、ステンシルテストおよび深度テストは「早期」(すなわち、フラグメントシェーダの前)に実行され得ない。
【先行技術文献】
【特許文献】
【００１７】
【特許文献１】英国特許出願第GB A 2511177号
【発明の概要】
【発明が解決しようとする課題】
【００１８】
出願者らは、フラグメントシェーダを備え、1つまたは複数のフラグメント毎の動作を実行するグラフィックス処理パイプラインの動作に対して改善を行う余地があると確信している。
【課題を解決するための手段】
【００１９】
次に、本明細書において説明されている技術の多数の実施形態が、添付図面を参照しつつ例のみを用いて説明される。
【図面の簡単な説明】
【００２０】
【図１】例示的なグラフィックス処理パイプラインを示す図である。
【図２】例示的なグラフィックス処理パイプラインを示す図である。
【図３】例示的なコンピュータグラフィックス処理システムを示す図である。
【図４】本明細書で説明されている技術の方式で動作するグラフィックス処理パイプラインの概略を示す図である。
【図５】本明細書で説明されている技術に従ってグラフィックス処理システムの動作の実施形態の概略を示す図である。
【図６】本明細書で説明されている技術に従ってグラフィックス処理システムの動作の実施形態の概略を示す図である。
【図７】本明細書で説明されている技術に従ってグラフィックス処理システムの動作の実施形態の概略を示す図である。
【発明を実施するための形態】
【００２１】
類似の参照番号は、図面中で適切な場合に類似のコンポーネントに使用される。
【００２２】
本明細書で説明されている技術の第1の実施形態は、グラフィックス処理パイプラインを備えるグラフィックス処理システムを動作させる方法を含み、このグラフィックス処理パイプラインは、
複数の処理段であって、処理されるべきグラフィックスフラグメントを生成するために入力プリミティブをラスター処理し、ここで、各グラフィックスフラグメントはそれに関連付けられている1つまたは複数のサンプリング点を有する、少なくとも1つのラスタライザを備える、複数の処理段と、
ラスタライザによって生成されたグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行するプログラム可能フラグメントシェーディング段とを備え、
この方法は、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対するフラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるステップと、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段が、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、命令に応答して、
処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対してフラグメント毎の動作の実行をトリガーし、それによって処理されているフラグメントに対するフラグメント毎の動作の結果を生成するステップとを含む。
【００２３】
本明細書で説明されている技術の第2の実施形態は、グラフィックス処理システムを備え、このグラフィックス処理システムは、
グラフィックス処理パイプラインであって、
処理されるべきグラフィックスフラグメントを生成するために入力プリミティブをラスター処理し、ここで、各グラフィックスフラグメントはそれに関連付けられている1つまたは複数のサンプリング点を有する、少なくとも1つのラスタライザと、
ラスタライザによって生成されたグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行するプログラム可能フラグメントシェーディング段とを備える、グラフィックス処理パイプラインを備え、
グラフィックス処理システムは、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対するフラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるように構成されている処理回路をさらに備え、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段は、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、命令に応答して、
処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対してフラグメント毎の動作の実行をトリガーし、それによって処理されているフラグメントに対するフラグメント毎の動作の結果を生成するように構成される。
【００２４】
本明細書で説明されている技術において、フラグメント毎の動作(たとえば、以下で説明されるように、アルファトゥカバレッジ動作、アルファテスト、ステンシルテスト、および/または深度テストなど)の実行を(場合によっては)トリガーできる命令が、グラフィックス処理パイプラインのフラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに含まれる。そこで、これは、たとえば、フラグメントシェーディングプログラム(フラグメントシェーダ)がそれらの動作を実行できるようになる前に完了するのを待たなければならないのではなくむしろ、フラグメントシェーダプログラムの実行中に(すなわち、フラグメントシェーダがまだ実行中である間に)それらのフラグメント毎の動作が(場合によっては)トリガーされ実行され得るという効果を有する。
【００２５】
以下でさらに説明されるように、出願人らは、この配置構成が有益であり得ることを認識しているが、それというのも、フラグメント毎の動作が、注目しているフラグメントが深度およびステンシルテストなどのフラグメント毎の動作を「早期」に(すなわち、フラグメントシェーダの前に)実行することが可能でない状況において後期深度およびステンシルテスト段などの「後期」のフラグメント毎の動作段にそれらの動作を受けるために達していなければならなかった場合よりも早期に(すなわち、フラグメントシェーダがまだ実行中である間に)実行されることを可能にすることができるからである。
【００２６】
言い換えれば、本明細書で説明されている技術は、フラグメントシェーディングプロセスが行われている間に、通常であればフラグメントシェーディングプロセスが完了した後に実行されるフラグメント毎の動作および更新を(場合によっては)実行するように動作可能である。これは、次いで、たとえば、以下でさらに説明されるように、フラグメント毎の動作の結果を使用してその段における注目しているフラグメントに対するフラグメントシェーディングプログラム(たとえば)のさらなる実行を(場合によっては)停止することを円滑にする(注目しているフラグメントに対するフラグメントシェーディング動作を完了させなければならず、次いで注目しているフラグメントが実際に破棄され得ると「後期」のフラグメント毎のテスト段を使用して決定することよりはむしろ)。これは、次いで、フラグメントの処理がグラフィックス処理動作のシーケンスにおいて早期に(場合によっては)停止できるので、注目しているグラフィックス処理に必要な、処理リソース、メモリ帯域幅、電力などを節減することができる。
【００２７】
以下でさらに説明されるように、本明細書で説明されている技術は、また、テスト/動作が所定のフラグメントに対するフラグメント毎の動作の結果に依存する他のフラグメントがそれに対応してそのフラグメント毎の動作(たとえば、深度テスト)を早期に完了し、それによって、(トリガーされたフラグメント毎の動作を受けるべきである所定のフラグメントがそれ自体破棄され得ない場合であっても)グラフィックス処理動作のシーケンスにおいて早期に場合によっては破棄されることも可能にし得る。
【００２８】
出願人らは、この点に関して、深度およびステンシルテストなどの「早期」のフラグメント毎の動作(テスト)が、処理されている所定のフラグメント、プリミティブなどについて可能でなくてよい(たとえば、フラグメントシェーディング動作がそれ自体それらのテストに必要である値を生成するので)という場合があり得るとしても、フラグメントシェーディング動作それ自体においてフラグメント毎の動作を実行するのに必要な値が、完全なフラグメントシェーディング動作(プログラム)が完了する前に利用可能になり得る(および/または以下でさらに説明されるように、フラグメントシェーディングプログラムそれ自体が、その前にそれらの値が利用可能になるように構成され得る)という場合がなおもあり得ることを認識している。たとえば、フラグメントシェーダは、色値が計算される前にフラグメントに対するアルファ(透明度)値を決定するものとしてよく、それにより、アルファ値を使用するアルファトゥカバレッジなどのフラグメント毎の動作はアルファ値が利用可能になった後(およびフラグメントシェーダが色値を生成する前に)実行される可能性がある。
【００２９】
本明細書で説明されている技術は、フラグメントシェーダプログラムに、シェーダプログラムの実行時に、たとえば、一実施形態では、フラグメント毎の動作に対する関連する値が利用可能になった後に、フラグメント毎の動作をトリガーできる「テスト」命令を含めることによってこれを利用する。
【００３０】
本明細書で説明されている技術は、本質的にテスト命令に応答してフラグメントシェーダの動作に拡大適用される。
【００３１】
したがって、本明細書で説明されている技術の第3の実施形態は、グラフィックス処理パイプラインのラスタライザによって生成されるグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行するグラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段を動作させる方法を含み、
この方法は、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段が、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、
フラグメントシェーダプログラムに含まれるグラフィックスプログラム命令に応答して、
処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対してフラグメント毎の動作の実行をトリガーし、それによって処理されているフラグメントに対するフラグメント毎の動作の結果を生成するステップを含む。
【００３２】
本明細書で説明されている技術の第4の実施形態は、グラフィックス処理パイプラインに対するプログラム可能フラグメントシェーディング段を備え、このグラフィックス処理パイプラインは、
ラスタライザによって生成されたグラフィックスフラグメントに対してフラグメントシェーディング動作を実行するためにフラグメントシェーダプログラムを実行する処理回路を備え、
プログラム可能フラグメントシェーディング段は、フラグメントを処理するためにフラグメントシェーダプログラムを実行したときに、
フラグメントシェーダプログラムに含まれるグラフィックスプログラム命令に応答して、
処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、
処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対してフラグメント毎の動作の実行をトリガーし、それによって処理されているフラグメントに対するフラグメント毎の動作の結果を生成するように構成される。
【００３３】
グラフィックス処理パイプラインのラスタライザは、表示されるべきフレームなどの、所望のグラフィックス出力のサンプリング点に対するレンダリングされたグラフィックスデータを生成するために、レンダリングされるべきグラフィックスフラグメントを生成する。ラスタライザによって生成される各グラフィックスフラグメントは、それに、グラフィックス出力のサンプリング点の集合を関連付けており、フラグメントに関連付けられているサンプリング点の集合のサンプリング点のうちの1つまたは複数に対するレンダリングされたグラフィックスデータを生成するために使用されることになる。この目的のために、ラスタライザによって生成される各フラグメントは、サンプリング点の集合のどのサンプリング点がレンダリングのためにフラグメントが実際に使用されているフラグメントに関連付けられているか(すなわち、どのサンプリング点に対してレンダリングされたフラグメントデータを生成するためにフラグメントが使用されているか)を示すカバレッジ情報をそれに関連付けていてよく、一実施形態ではそのように関連付けている。このカバレッジ情報は、たとえば、フラグメントに関連付けられているカバレッジマスクを用いて、望み通りに提供され得る。
【００３４】
ラスタライザは、任意の所望の適当な方式でレンダリングするためのフラグメントを生成するように構成され得る。これは、たとえば、ラスター処理されるべきプリミティブを受け取り、サンプリング点および/またはサンプリング点位置の集合に対してそれらのプリミティブをテストし、それらのプリミティブをしかるべく表すフラグメントを生成する。ラスタライザは、これを行うために任意の所望の適当な方式で動作し得る。
【００３５】
プログラム可能フラグメントシェーディング段(フラグメントシェーダ)は、ラスタライザによって生成されたフラグメントを処理し、フラグメントが表す(カバーされている)サンプリング点に対するレンダリングされたフラグメントデータを生成する。これらのフラグメントシェーディングプロセスは、たとえば、テクスチャマッピングなどを含み得る。
【００３６】
フラグメントシェーディングプロセスを実行するために、プログラム可能フラグメントシェーディング段は、1つまたは複数のグラフィックスフラグメントシェーディングプログラムを実行する。そのような各プログラムは、所望のフラグメントシェーディングプロセスを実行するために適切な順序で実行されるグラフィックスプログラム命令の集合を含むことになり、また一実施形態では含む。本明細書で説明されている技術によれば、フラグメントシェーディング段が実行するフラグメントシェーディングプログラムのうちの1つまたは複数に対するグラフィックスプログラム命令の集合は、本明細書で説明されている技術の1つまたは複数の「テスト」命令を含む。
【００３７】
フラグメントシェーディング段は、それがラスタライザから受け取る(フラグメントシェーディングプロセスが実行されるべき対象の)各フラグメントに対して注目しているフラグメントシェーディングプログラムを実行すべきであり、また一実施形態では実行する。したがって、一実施形態では、本明細書で説明されている技術の動作は、ラスタライザによって生成される複数のフラグメントからなる集合の各フラグメントについてそれぞれ実行される(グラフィックス処理パイプラインのフラグメントシェーディング段は、しかるべく構成される)。
【００３８】
プログラム可能フラグメントシェーダは、プログラム可能処理回路などの任意の好適なプログラム可能なハードウェア要素を備え得る。これは、グラフィックス処理パイプラインの他のプログラム可能な段に別個の回路要素として用意され得る。しかしながら、これは、また、共有されるプログラム可能なグラフィックス処理回路から少なくとも部分的に形成され得る。
【００３９】
フラグメントシェーダプログラムに含まれる「テスト」命令が(場合によっては)トリガーするフラグメント毎の動作は、任意の所望の適当なフラグメント毎の1つまたは複数の動作とすることができる。一実施形態において、これは、アルファテスト、深度テスト、および/またはステンシルテストなどのテストをフラグメントに対して実行する動作である。したがって、一実施形態において、「テスト」命令は(場合によっては)フラグメント毎の(1つまたは複数の)テスト動作をトリガーする。
【００４０】
一実施形態において、フラグメント毎の動作は、フラグメントカバレッジ(すなわち、注目しているフラグメントでカバーされる(したがって処理される)サンプリング点)に影響を及ぼし、および/または決定し、一実施形態では、ファイナライズする動作である。これは、次いで、たとえば、フラグメントカバレッジがテスト命令の実行の後にゼロであると決定される(決定できる)(それによりフラグメントに対するサンプリング点のうちのどれも実際にはレンダリングされる必要がない)場合、注目しているフラグメントに対するシェーダプログラム実行はその地点で停止できる(一実施形態では停止される)という効果を有する。
【００４１】
したがって、一実施形態において、テスト命令はフラグメントに対するカバレッジがゼロかそうでないかの決定をトリガーする(そして、フラグメントに対するカバレッジがゼロであると決定されたときには、フラグメントは一実施形態において破棄される(フラグメントに対するシェーダ実行が停止される))。
【００４２】
それに対応して、一実施形態において、シェーダプログラムに含まれる命令がトリガーすることができるフラグメント毎の動作は、アルファトゥカバレッジ動作、アルファテスト、ステンシルテスト、および深度テストのうちの1つまたは複数であり、一実施形態では、そのすべてである。
【００４３】
命令は、これらの動作のうちの1つのみ、またはそれらのうちのいくつか(複数)またはすべてをトリガーするように構成されることも可能である。
【００４４】
一実施形態において、テスト命令は(一実施形態のみにおいて)アルファトゥカバレッジおよび/またはアルファテスト動作をトリガーすることができる。別の実施形態において、命令は(一実施形態のみにおいて)深度テスト動作をトリガーすることができる。別の実施形態において、命令はアルファトゥカバレッジ動作および深度テスト動作の両方をトリガーすることができる。
【００４５】
シェーダプログラムに含まれるテスト命令によってトリガーされるフラグメント毎の動作は、任意の所望の適当な方式で実行され得る(テスト命令がその動作をトリガーする場合)。たとえば、テスト命令は、グラフィックス処理パイプラインの既存の機能ユニットに関連する動作を実行させるように動作可能であるものとしてよい。これは、たとえば、フラグメント毎の動作がステンシルまたは深度テストである場合に好適であり得る(また一実施形態において、これはステンシルまたは深度テストの場合である、すなわち、テスト命令は、グラフィックス処理パイプラインの既存のステンシルおよび/または深度テスト段によるステンシルまたは深度テストの実行をトリガーする)。
【００４６】
それに加えて、または代替的に、シェーダコアそれ自体に専用ハードウェアを設けてテスト命令によってトリガーされ得る動作を実行することが可能であろう。これは、フラグメント毎の動作が、アルファトゥカバレッジ動作の場合のように、ハードウェアで実行し、実現するのが比較的簡単である場合に特に好適であり得る。したがって、一実施形態において、テスト命令が(場合によっては)アルファトゥカバレッジ動作をトリガーする場合に、その動作はシェーダコア内の専用ハードウェアを用いて実行される。
【００４７】
さらに、または代わりにフラグメントシェーダによって実行されるシェーダルーチンを用いることでフラグメント毎の動作を実行することも可能である。この場合、フラグメントシェーダプログラムは、フラグメント毎の動作を実行するための適切なシェーダルーチン(命令の集合)を含むことが可能であり、そのルーチンは、テスト命令がそのテストをトリガーする場合にトリガーされる(したがってフラグメントシェーダによって実行される)。このプロセスは、たとえば、シェーダプログラム内の適切な条件付き分岐コマンドを使用することによって(または他の好適な任意の方法で)実装され得るであろう。
【００４８】
テスト命令がトリガーするフラグメント毎の動作を実行するための他の配置構成(動作が命令によってトリガーされる場合)は、もちろん、望ましい場合に使用されることも可能である。
【００４９】
フラグメントシェーダは、テスト命令が関係する1つまたは複数の動作が任意の好適な所望の方法で注目するフラグメントに対してトリガーされる(実行される)べきかどうかを決定することができる。この決定は、一実施形態においてテスト命令が関係するフラグメント毎の1つまたは複数の動作を実行することが適切かどうかを示すことができる1つまたは複数の基準に基づく。
【００５０】
一実施形態において、この決定は、少なくとも一部は、注目しているグラフィックス処理タスク(たとえば、描画コール)に対する状態、たとえば、レンダリング状態に基づく。
【００５１】
したがって、一実施形態において、(場合によっては)動作が命令によってトリガーされるかどうかおよび/またはどの動作がトリガーされるかは、実行されているフラグメント処理に対する現在の状態(レンダリング状態)などの、いくつかの条件または基準が満たされていることに依存する。たとえば、一実施形態において、命令は所定の1つまたは複数の動作を、それらの動作が有効化されている場合に(たとえば、レンダリング状態において)のみトリガーするように構成され得る。
【００５２】
一実施形態において、テスト命令によるフラグメント毎の動作のトリガーは、テスト命令に到達した(テスト命令の実行を開始する)ときに注目しているフラグメントに対する深度および/またはステンシルテストが完了しているかどうかに依存する。
【００５３】
テスト命令に到達する前に深度/ステンシルテストが完了している場合、テスト命令は、一実施形態において、フラグメントカバレッジがゼロ(フラグメントに対するカバレッジがゼロ)であるかどうかの決定をトリガーし、一実施形態において、その場合に、フラグメントの破棄(フラグメントに対するシェーダ実行の停止)をトリガーするように動作可能である。
【００５４】
これは、シェーダプログラムが「副作用」を有し得る(すなわち、たとえば平易なメモリ記憶またはメモリのアトミック操作を実行することによって、結果として得られる色を用いる場合以外の方法でメモリに影響を及ぼし得る)状況を考慮しているが、その場合に、フラグメントが早期深度/ステンシルテストを受け、それらのテストに合格しなかった場合であってもシェーダプログラムは実行しなければならない(これは、グラフィックス標準(API)が通常、それらのテストがシェーダ実行の後に完了しなければならないことを指定するという理由による)。テスト命令に、フラグメントカバレッジがゼロであるかどうかの決定をトリガーさせることによって、次いで、テスト命令が、フラグメントが早期深度/ステンシルテストを受け、その結果カバレッジがゼロであるフラグメントが得られた場合にシェーダ実行を終了することが可能になる。
【００５５】
その一方で、深度およびステンシルテストが、テスト命令の実行を開始する(テスト命令に到達した)ときに完了していない場合、テスト命令が関係するフラグメント毎の動作のうちの1つまたは複数が、一実施形態においてトリガーされる。
【００５６】
この場合、一実施形態において、テスト命令がアルファトゥカバレッジ動作をトリガーするように動作可能である(および適切であれば、グラフィックス処理状態が、アルファトゥカバレッジまたはアルファテストが有効化されるような状態である)場合、テスト命令は一実施形態において注目しているフラグメントに対するアルファトゥカバレッジおよび/またはアルファテスト動作の実行をトリガーする。
【００５７】
フラグメント毎の動作のトリガーおよびテスト命令によってトリガーされるフラグメント毎の動作は、一実施形態において、アルファトゥカバレッジまたはアルファテストが有効化されているかどうおよび/またはシェーダプログラムが深度および/またはステンシル値を出力するように動作可能であるかどうかにさらに、またはその代わりに(および実施形態ではさらに)依存する。
【００５８】
一実施形態において、アルファトゥカバレッジまたはアルファテスト動作が有効化されている場合(たとえば、注目しているグラフィックス処理タスクに対するレンダリング状態ではアルファトゥカバレッジまたはアルファテストが有効化されている)、テスト命令は、実行されたときに、アルファトゥカバレッジまたはアルファテストの実行をトリガーする。
【００５９】
それに対応して、シェーダプログラムが深度および/またはステンシル値を出力しない場合、テスト命令は実行されたときに一実施形態では深度および/またはステンシルテストの実行を(適宜)トリガーする。
【００６０】
一実施形態において、テスト命令の実行は、注目しているフラグメントに対する深度および/またはステンシル「エージチェック」(用意されている場合)、すなわち、フラグメントが早期深度/ステンシルテストを完了したか、または深度/ステンシルテストをまだ完了していないその位置における最も古いフラグメントであるかどうかに依存する。一実施形態において、テスト命令の実行は、注目しているフラグメントに対して深度および/またはステンシルエージチェックが完了していることを必要とする(完了するのを待つ)(すなわち、フラグメントは早期深度/ステンシルテストを完了していなければならないか、または実行されるべきテスト命令に対する深度/ステンシルテストをまだ完了していないその位置における最も古いフラグメントでなければならない)。これは、標準(API)が必要とする順序で、フラグメントがテストされることなどを確実にするのに役立ち得る。
【００６１】
テスト命令に対する1つまたは複数の動作がトリガーされる場合、それらの動作は、動作結果を生成するように適切に実行されるべきである(たとえば、アルファトゥカバレッジ動作の場合にフラグメントに対するカバレッジを修正するために)。次いで、動作の結果は、一実施形態において、適切な方式で使用され、および/または記憶され、および/または示される。したがって、たとえば、一実施形態において、この動作は注目しているフラグメントに対する(更新された)カバレッジ情報(たとえば、新規カバレッジマスク)を出力し得る。
【００６２】
注目しているフラグメントに対する、カバレッジ情報などの、情報を(場合によっては)更新するだけでなく、テスト命令がトリガーする1つまたは複数の動作は、適切であれば、グラフィックス処理動作に対する他の情報を更新するためにも使用されてよく、一実施形態では使用される(たとえば、一実施形態ではそれは他のフラグメントの処理に関連し得る)。したがって、たとえば、テスト命令が深度テストの実行をトリガーする場合、注目しているフラグメントに対するそのテストの結果は、一実施形態において、注目しているグラフィックス処理タスクに対して記憶されている深度情報(たとえば、深度バッファ)を更新するために使用され、たとえば、一実施形態において、それにより、注目しているフラグメントに対する深度値は、テストされる他の(たとえば、後期の)フラグメントに対して利用可能となる。
【００６３】
したがって、一実施形態において、テスト命令が注目しているフラグメントに対する深度および/またはステンシルテストの実行をトリガーする場合、そのテストの結果は、グラフィックス処理パイプラインに(たとえば、一実施形態では、グラフィックス処理パイプラインの早期深度および/またはステンシルテスト段に)、たとえば、一実施形態では、深度および/またはステンシルバッファを更新することによって、利用可能にされる。これは、次いで、「後期」の代わりに「早期」に実行されるより後期のフラグメントに対する深度および/またはステンシルテストを円滑にすることができる。これは、全体の実行に対して適切であり得る。
【００６４】
一実施形態において、関連する条件が満たされている場合に関連するフラグメント毎の処理動作をトリガーするだけでなく、テスト命令は、また、さらなる動作および効果を、たとえば、一実施形態において、テスト命令がトリガーされた関連するフラグメント毎の動作の結果に依存して、トリガーし得る。
【００６５】
したがって、一実施形態において、テスト命令は(実行された場合に)、フラグメントのカバレッジがゼロかどうかを決定し、もしそうであれば、その地点で(すなわち、テスト命令において)注目しているフラグメントに対するシェーダプログラムの実行を停止するように動作可能である。一実施形態において、カバレッジテストは、一実施形態において、テスト命令によってトリガーされるアルファトゥカバレッジまたはアルファテストが実行された後、ただし(場合によっては)深度および/またはステンシルテストの実行前に実行される。
【００６６】
同様に、一実施形態において、深度/ステンシルテスト(トリガーされた場合)が注目しているフラグメントについて完了した後、一実施形態において、フラグメントに対するカバレッジ(たとえば、カバレッジマスク)が深度/ステンシルテストの後に結局ゼロで終わった場合、注目しているフラグメントに対するフラグメントシェーダの実行は、ここでもまた、一実施形態では、その地点で停止(キル)される。これは、たとえば、フラグメントカバレッジがゼロに達した場合に注目しているフラグメントに対する実行スレッドを自動破棄することによって、望み通りに実装され得る。
【００６７】
一実施形態において、ブレンディングモードが、フラグメントが常に不透明であるようなモードであるか、またはアルファブレンディングが有効化され、フラグメントに対するアルファ値が、フラグメントが不透明であることを示している(すなわち、アルファ値が1.0以上である)場合に、テスト命令は、実行されたときに、注目しているフラグメントが深度/ステンシルテストに合格した場合に同じ位置を有しているより古いフラグメントを削除する(処理を停止する)ように動作することもできる(一実施形態ではそのようにも動作する)(それらのより古いフラグメントは次いで不透明フラグメントの背後にあることが知られ、したがって見ることができないので)。
【００６８】
一実施形態において、この動作は、出願人の早期の英国特許出願第GB A 2511177号において説明されている機構を使用して実装される。
【００６９】
したがって、一実施形態において、フラグメントがテスト命令によってトリガーされた深度/ステンシルテストに合格した場合、テスト命令によってトリガーされた深度/ステンシルテストに合格したフラグメントに関係する情報(および一実施形態では位置情報)は、たとえば、フラグメントシェーディング段によって、フラグメントシェーディング段に現在ある他のフラグメント(フラグメントシェーダが実行中である)が深度/ステンシルテストに合格したフラグメントによってオーバードローされるかどうかを決定するために使用され、そのようなフラグメントが存在している場合に、それらのオーバードローされたフラグメントの処理(すなわち、フラグメントシェーディング)は(一実施形態では選択的に)停止される。
【００７０】
同様に、一実施形態において、アルファブレンディングが有効化され、アルファ値が、フラグメントが完全に透明である(すなわち、0.0以下である)ことを指示している場合に、テスト命令は、実行された場合に、フラグメントに対する深度/ステンシルテストをトリガーするが(それらのテストは依然として実行される必要があるので)、完全に透明なフラグメントは色バッファに影響を及ぼし得ないので、テスト命令は一実施形態において深度/ステンシルテストが完了した後に注目しているフラグメントに対するフラグメントシェーダをキル(停止)する(フラグメントを破棄する)。
【００７１】
したがって、一実施形態においてテスト命令が(場合によっては)トリガーするフラグメント毎の動作(またはそのうちの1つ)は、フラグメントに対するアルファ値が特定の、一実施形態では選択された、1つまたは複数の値を有するかどうかの決定であり(一実施形態では、アルファ値が、フラグメントが完全に透明であることまたは完全に不透明であることを示すかどうかを決定し)、テスト命令は、一実施形態において、フラグメントが特定のアルファ値または特定のアルファ値のうちの1つを有するときに特定の、一実施形態では選択された、1つまたは複数の動作をトリガーし、および/または実行するようにさらに動作可能である。
【００７２】
したがって、一実施形態において、テスト命令は、フラグメントに対するアルファ値に対する特別な場合を検出し、特別な場合のアルファ値の条件が満たされた場合に所定の1つまたは複数の動作をしかるべくトリガーするように動作可能である。
【００７３】
一実施形態において、テスト命令によってトリガーされ得るこれらの動作のうちの1つまたは複数、および一実施形態ではすべては、使用中にテスト命令によって(場合によっては)トリガーされるように設定できる。したがって、一実施形態において、グラフィックス処理パイプラインは、テスト命令に応答してこれらの動作のうちの1つまたは複数を実行するように使用時に構成され得る。一実施形態において、各動作は、独立して有効化(または無効化)できる。
【００７４】
これは、注目している動作が有効化されているか(そのトリガーに対する条件が満たされている場合)いないかを示すように、たとえば状態情報(たとえば、状態ビット)の適切な設定によって、望み通りに構成され得る。一実施形態では、グラフィックス処理パイプラインに対するドライバは、たとえば、状態情報を適切に設定することによってこれらの動作を有効化するか、または無効化することができる。
【００７５】
上記の説明から、一実施形態において、テスト命令が実行されたときに、早期深度および/またはステンシルテストが処理されているフラグメントに対して完了したかどうかが最初に決定されることは理解されるであろう。
【００７６】
もしそうであれば、一実施形態において、フラグメントカバレッジがゼロであるかどうかが決定される。フラグメントカバレッジがゼロであると決定された場合、フラグメントは、一実施形態において、破棄される(フラグメントに対するシェーダプログラムの実行は終了する)。フラグメントカバレッジがゼロでないと決定された場合、シェーダ実行は一実施形態において次の命令に進む。
【００７７】
その一方で、早期深度および/またはステンシルテストが処理されているフラグメントに対して完了していない場合、アルファトゥカバレッジが有効化されているかどうかが決定され、もしそうであれば、アルファトゥカバレッジ動作が実行され、フラグメントに対するカバレッジが更新される。次いで、一実施形態において、フラグメントカバレッジが非ゼロであるかどうかが決定される。フラグメントカバレッジがゼロである場合、フラグメントは一実施形態において破棄されるが、フラグメントカバレッジが非ゼロであると決定された場合、一実施形態においてシェーダプログラムが深度またはステンシル値を出力するように動作するかどうかが決定される。もしそうであれば、フラグメントシェーダは一実施形態においてフラグメントシェーダプログラム内の次の命令に進むが、シェーダが深度および/またはステンシル値を出力しない場合、深度またはステンシルテストは一実施形態では実行される。次いで、プログラムは次の命令に進む。
【００７８】
テスト命令が上記の動作の(場合によっては)すべてをトリガーするように動作可能でない場合、テスト命令がトリガーするように動作可能である関連する動作は、それに対応して、示されている状態および/または条件にそれぞれ依存してトリガーされ得る。
【００７９】
その動作を円滑にするために、テスト命令は、所望の方式で動作可能にするようにその入力として適切な入力情報を取ることができ、一実施形態において、取る。
【００８０】
一実施形態において、テスト命令は、入力として、注目しているフラグメントに対するカバレッジ(たとえば、その地点でシェーダによって計算されたとおりの)およびアルファ値を取る。(複数のレンダリングターゲットが有効化されている場合、テスト命令は一実施形態において少なくとも任意のアルファトゥカバレッジ動作についてレンダリングターゲット0に対してアルファ値を使用する)
【００８１】
これは、また、一実施形態において、実行されているグラフィックス処理タスクに対するグラフィックス状態(構成)(たとえば、レンダリング状態および/またはダイナミックGPU(グラフィックス処理ユニット)状態)を入力として取る(および/またはアクセスできる)。
【００８２】
本明細書で説明されている技術のテスト命令は、実行されるべきであるフラグメントシェーダプログラム内の好適な所望の地点に含まれ得る。しかしながら、出願人らは、たとえば、テスト命令の効果を促すため、および/またはテスト命令が実行され得る可能性を高めるために、シェーダプログラム内の特定の地点にテスト命令を含めることが有益であり得ることを認識した。
【００８３】
一実施形態において、テスト命令は(優先的に)(シェーダプログラムに対する命令のシーケンス内で)シェーダプログラムに可能な限り早期に含められる。
【００８４】
しかしながら、出願人らは、いくつかのシェーダプログラム動作(シェーダプログラム内に存在している場合)が、テスト命令が(場合によっては)実行される前に完了することが有益であり得ることを認識している。
【００８５】
したがって、一実施形態において、テスト命令は、シェーダプログラム内の、フラグメントカバレッジを(場合によっては)修正する任意の(およびすべての)命令(「破棄」命令を含む)の後に含まれる。言い換えれば、一実施形態において、フラグメントカバレッジを(場合によっては)修正するすべての命令は、テスト命令が(場合によっては)実行される前に実行されるべきである。
【００８６】
逆に、シェーダプログラムが深度および/またはステンシル値を出力する命令を含む場合に、一実施形態において、テスト命令は、シェーダプログラム内の、深度またはステンシル値を出力する命令の前に含まれる(すなわち、シェーダが深度またはステンシル値を出力する場合に、それは一実施形態においてテスト命令の後に行われる)。それに対応して、シェーダプログラムは、一実施形態において、深度および/またはステンシル値を出力するように動作し、さらにそれがテスト命令の後に行われる場合に、それはシェーダプログラムのブレンド出力の前に行われるように配置構成される。
【００８７】
同様に、一実施形態において、テスト命令は、シェーダプログラム内の、ブレンド出力を生成する命令の前に含まれる(すなわち、シェーダプログラムのブレンド出力は一実施形態においてテスト命令が(場合によっては)実行された後に行われる)。シェーダプログラムは一実施形態において、また、すべてのブレンド出力もシェーダプログラムの深度および/またはステンシル出力の後に行われるように配置構成される。(しかしながら、ブレンド出力それ自体は、任意の所望の順序で行われ得る)
【００８８】
一実施形態において、テスト命令は、シェーダプログラム内の、テスト命令が関係する状態(カバレッジ、アルファ値など)が今ではシェーダプログラムによって変更されるべきでない地点に含まれる(およびテスト命令は次いでシェーダプログラム内のその地点において(たとえば、一実施形態において、その時に引き継がれた状態を使用するフラグメント毎の1つまたは複数の動作(たとえば、テスト)を実行することによって)その状態に対する関連する出力を生成するように効果的に動作する)。したがって、テスト命令は、シェーダプログラム内の、フラグメントに対するアルファ値が生成された地点の後に含まれる。
【００８９】
一実施形態において、フラグメントシェーダプログラムが「副作用」を有している(たとえば、レンダラを通るデータ以外のデータを生成する)場合、一実施形態において、テスト命令は、シェーダプログラム内の、シェーダプログラムが生成する副作用を引き起こす命令の後に含まれる(すなわち、一実施形態において、シェーダによって引き起こされる副作用はテスト命令が(場合によっては)実行される前に生じる)。一実施形態において、テスト命令は、シェーダプログラム内の、最終的な「副作用」命令(可能な場合)の直後に含まれる。
【００９０】
テスト命令は、グラフィックス処理システム全体の好適なおよび所望のコンポーネントまたは段によってシェーダプログラム内に含められ得る。一実施形態において、テスト命令は、注目しているシェーダに対するコンパイラ(したがってフラグメントシェーダコンパイラ)によってシェーダプログラム内に含められる。
【００９１】
コンパイラは、テスト命令をシェーダプログラム内に好適な所望の任意の方式で含めるように動作可能であり得る。たとえば、これは、シェーダプログラムの各動作を(たとえば、順に)考慮し、テスト命令が動作の前または後に含まれ得るかどうかを決定することが可能である(シェーダプログラムの動作のすべてが考慮されるまで、続ける)。他の配置構成も、もちろん、可能である。
【００９２】
本明細書で説明されている技術は、また、テスト命令をグラフィックス処理パイプラインのフラグメントシェーダによって実行されるべきフラグメントシェーダプログラム内に含める動作に拡大適用される。
【００９３】
したがって、本明細書で説明されている技術の第5の実施形態は、グラフィックス処理システムを動作させる方法を含み、この方法は、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対するフラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるステップを含む。
【００９４】
本明細書で説明されている技術の第6の実施形態は、グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段による実行のための命令を生成するようにプログラムをコンパイルするコンパイラを含み、コンパイラは、
グラフィックス処理パイプラインのプログラム可能フラグメントシェーディング段によって実行されるべきフラグメントシェーダプログラムに、実行されると、フラグメントシェーダが、処理されているフラグメントに対してフラグメント毎の動作が実行され得るかどうかを決定し、処理されているフラグメントに対してフラグメント毎の動作が実行され得ると決定されたときに、処理されているフラグメントに対するフラグメント毎の動作の実行をトリガーするようにする、グラフィックスプログラム命令を含めるように構成される。
【００９５】
当業者であれば理解するように、本明細書において説明されている技術のこれらの実施形態は、本明細書で説明されている技術の特徴の1つもしくは複数またはすべてを含むことができ、一実施形態において、含む。
【００９６】
一実施形態において、フラグメントシェーダプログラム内の適切な地点に含まれる本明細書で説明されている技術のテスト命令は1つのみである。しかしながら、望ましい場合に、本明細書で説明されている技術の形態の複数のテスト命令を所定のフラグメントシェーダプログラム内に含めることも可能である。この場合、各テスト命令は、あるテスト命令がアルファトゥカバレッジまたはアルファテスト動作を(場合によっては)トリガーするように動作可能であり、次いで別の(たとえば、後期の)テスト命令が(場合によっては)1つまたは複数の深度および/またはステンシルテストをトリガーするように動作可能であるなど、異なるフラグメント毎の動作をトリガーするように動作可能であることも可能である。
【００９７】
上で説明されているように一実施形態において本明細書で説明されている技術のテスト命令は(実行された場合に)深度およびステンシルテストの実行をトリガーするが、出願人らは、それが、テスト命令がたとえばシェーダプログラムそれ自体が深度および/またはステンシル値を生成する場合にそれらのテストをトリガーすることができないか、またはトリガーするように構成されていない場合であり得ることを認識している。
【００９８】
この場合、一実施形態において、テスト命令をシェーダプログラムに含めるだけでなく、深度および/またはステンシルテストをトリガーするように動作可能であるさらなる命令が、シェーダプログラム内の、テスト命令の後(たとえば、および一実施形態において、テスト命令の後および深度および/またはステンシル値を生成するシェーダプログラム内の命令の後)の適切な地点に含まれる。この深度/ステンシルテスト命令は一実施形態において実行されたときに深度およびステンシルテストをトリガーするように動作可能であり、それにより現在のフラグメントが破棄され得るかどうかを決定するために使用できる深度および/またはステンシル値を生成し、および/または他のフラグメントをテストするために使用する深度およびステンシル値を与える。
【００９９】
これは、シェーダプログラムの一部として「後期」深度および/またはステンシルテストを、初期テスト命令がそれらのテストをトリガーできないときに、たとえば、それらのテストが実行できるようになるまでシェーダプログラムが完了するのを待つ必要なく、より直截的にトリガーするのを円滑にする。
【０１００】
ここでもまた、深度/ステンシルテスト命令は一実施形態においてシェーダプログラム内の適切な地点に含まれ、一実施形態においてシェーダで計算した1つまたは複数の深度および/またはステンシル値を深度および/またはステンシルテストに送出し、深度および/またはステンシルテストの結果に応じて、注目しているフラグメントに対するシェーダをキルするか、またはフラグメントをレンダリングすることを継続するように動作可能である。
【０１０１】
この配置構成において、より早期のテスト命令は、深度/ステンシルテストを除いてこれが実行するように構成されている様々なすべての動作を実行し、次いでさらなる深度/ステンシルテスト命令はシェーダで生成された深度および/またはステンシル値が利用可能になった後にそれらのテストの実行をトリガーする。
【０１０２】
ここでもまた、この深度/ステンシルテスト命令は、所望の好適な任意の方式でシェーダプログラムに含められ得る。一実施形態において、シェーダプログラムに対するコンパイラは、シェーダプログラムをコンパイルするときにシェーダプログラム内の適切な地点に深度/ステンシルテスト命令を含めるように動作可能である。
【０１０３】
本明細書で説明されている技術は、グラフィックス処理パイプラインによって実行されるべき所望のシェーダプログラムに関して使用することができる。これは、所定のグラフィックス処理動作(タスク)に対して実行されるべきシェーダプログラムのすべてではなくいくつかに関して適用され得るが、一実施形態では、所定のグラフィックス処理動作に対して実行されるべきすべてのシェーダプログラムに関して実行される。
【０１０４】
本明細書で説明されている技術は、表示用のフレーム、テクスチャレンダリング出力などの、グラフィックス処理パイプラインが使用されて生成され得る出力のすべての形態に使用できる。グラフィックス処理からの出力、たとえば、フラグメントシェーディングデータは、一実施形態において、記憶および使用のために外部メモリ、たとえば、主メモリにエクスポートされる、たとえば、表示のためにフレームバッファにエクスポートされる。
【０１０５】
ラスタライザおよびフラグメントシェーダだけでなく、グラフィックス処理パイプラインは、早期深度(または早期深度およびステンシル)テスタ、後期深度(または深度およびステンシル)テスタ、ブレンダ、タイルバッファ(タイルベースのグラフィックス処理パイプラインの場合)、書き出しユニットなどのグラフィックス処理パイプラインが含むことができる他の好適な所望の処理段も含むことができ、一実施形態において、含む。
【０１０６】
実施形態において、グラフィックス処理パイプラインは、本明細書で説明されているデータを記憶し、および/または本明細書で説明されているプロセスを実行するためのソフトウェアを記憶する1つもしくは複数のメモリおよび/またはメモリデバイスを備え、および/またはこれと通信する。グラフィックス処理パイプラインは、ホストマイクロプロセッサ、および/またはグラフィックスプロセッサによって生成されるデータに基づき画像を表示するためのディスプレイとも通信し得る。
【０１０７】
本明細書で説明されている技術は、グラフィックスプロセッサの好適な所望の任意の形態もしくは構成に適用可能である。これは、タイルベースのグラフィックスプロセッサおよびグラフィックス処理システムに特に適用可能である。したがって、一実施形態において、グラフィックス処理システムおよびグラフィックス処理パイプラインは、それぞれタイルベースシステムおよびパイプラインである。
【０１０８】
一実施形態において、本明細書で説明されている技術の様々な機能は、たとえば表示デバイスのフレームバッファに書き込まれる、レンダリングされるフラグメントのデータを生成して出力する単一のグラフィックス処理プラットフォーム上で実行される。
【０１０９】
本明細書で説明されている技術は、適宜構成されたマイクロプロセッサベースのシステムなどの、好適なシステムにおいて実装され得る。一実施形態において、本明細書で説明されている技術は、コンピュータおよび/またはマイクロプロセッサベースのシステムにおいて実装される。
【０１１０】
本明細書において説明されている技術の様々な機能は、所望の好適な方式で実行され得る。たとえば、本明細書において説明されている技術の機能は、必要に応じて、ハードウェアまたはソフトウェアで実装され得る。したがって、たとえば、断りのない限り、本明細書で説明されている技術の様々な機能要素、段、および「手段」は、適切に専用化されたハードウェア要素および/または処理回路および/または所望の方式で動作するようにプログラムすることができるプログラム可能ハードウェア要素および/または処理回路などの、様々な機能などを実行するように動作可能な、好適な1つまたは複数のプロセッサ、1つまたは複数のコントローラ、機能ユニット、回路、処理論理、マイクロプロセッサ配置構成などを含むものとしてよい。
【０１１１】
また、ここでは、当業者であれば理解するように、本明細書で説明されている技術の様々な機能などは、所定のプロセッサ上に複製され、および/または所定のプロセッサ上で並列実行され得ることに留意されたい。同等のことであるが、様々な処理段は、望ましい場合に、処理回路などを共有してよい。
【０１１２】
さらに、本明細書で説明されている技術の処理段のうちの1つもしくは複数またはすべては、たとえば、1つまたは複数の固定機能ユニット(ハードウェア)(処理回路)の形態、および/または所望の動作を実行するようにプログラムできるプログラム可能処理回路の形態で、処理段回路として具現化され得る。同等のことであるが、本明細書で説明されている技術の処理段および処理段回路の1つまたは複数は、別個の回路要素として、他の処理段または処理段回路のうちの1つまたは複数に備えられるものとしてよく、および/または処理段および処理段回路のうちの1つもしくは複数またはすべては、共有される処理回路から少なくとも部分的に形成され得る。
【０１１３】
上述の特定の機能を実行するためのハードウェアが必要であることを前提条件とすると、グラフィックス処理システムおよびパイプラインは、他の何らかの方法で、グラフィックス処理パイプラインが備える、通常の機能ユニットなどの1つもしくは複数またはすべてを備えることができる。
【０１１４】
当業者であれば、本明細書で説明されている技術の説明されている実施形態はすべて、適宜、本明細書で説明されている特徴の1つもしくは複数またはすべてを含み得る、および一実施形態では含むことも理解するであろう。
【０１１５】
本明細書で説明されている技術による方法は、少なくとも部分的にはソフトウェアを使用して、たとえばコンピュータプログラムを使用して実装され得る。したがって、さらなる実施形態から見たときに、本明細書で説明されている技術は、データプロセッサにインストールされたときに本明細書で説明されている方法を実行するように特に適合されているコンピュータソフトウェア、データプロセッサ上でプログラム要素が実行されたときに本明細書で説明されている方法を実行するコンピュータソフトウェアコード部分を含むコンピュータプログラム要素、およびデータ処理システム上でプログラムが実行されたときに本明細書で説明されている1つまたは複数の方法のすべてのステップを実行するように適合されているソフトウェアコードを含むコンピュータプログラムを提供することがわかる。データプロセッサは、マイクロプロセッサシステム、プログラマブルFPGA(フィールドプログラマブルゲートアレイ)などであってよい。
【０１１６】
本明細書で説明されている技術は、データプロセッサを含むグラフィックスプロセッサ、レンダラ、またはマイクロプロセッサシステムを動作させるために使用されたときに前記データプロセッサと併せて前記プロセッサ、レンダラ、またはシステムに本明細書で説明されている技術の方法のステップを実行させるそのようなソフトウェアを含むコンピュータソフトウェアキャリアにも拡大適用される。このようなコンピュータソフトウェアキャリアは、ROMチップ、CD ROM、RAM、フラッシュメモリ、またはディスクなどの物理的記憶媒体であり得るか、またはワイヤ上の電子信号、光信号、または衛星もしくは同様のものなどへの無線信号などの信号であり得る。
【０１１７】
さらに、本明細書で説明されている技術の方法のステップすべてが、コンピュータソフトウェアによって実行される必要はないことは理解されるであろうし、したがって、さらに広い実施形態の観点から、本明細書で説明されている技術は、本明細書で説明されている方法の複数のステップのうちの少なくとも1つを実行するために、コンピュータソフトウェアおよびコンピュータソフトウェアキャリア上にインストールされたそのようなソフトウェアを提供する。
【０１１８】
したがって、本明細書で説明されている技術は、コンピュータシステムとともに使用するためにコンピュータプログラム製品として適宜具現化され得る。このような実装は、コンピュータ可読媒体、たとえば、ディスケット、CD-ROM、ROM、RAM、フラッシュメモリ、またはハードディスクなどの有形の、非一時的媒体上に固定された一連のコンピュータ可読命令を含み得る。これは、限定はしないが、光もしくはアナログ通信回線を含む有形の媒体上で、または限定はしないが、マイクロ波、赤外線、もしくは他の伝送技術を含む無線技術の無形の手段を使用して、モデムもしくは他のインターフェースデバイスを介して、コンピュータシステムに伝送可能な、一連のコンピュータ可読命令を含むことも可能である。これら一連のコンピュータ可読命令は、本明細書ですでに説明されている機能の全部または一部を具現化する。
【０１１９】
当業者であれば、このようなコンピュータ可読命令は、多くのコンピュータアーキテクチャまたはオペレーティングシステムとともに使用するために多くのプログラミング言語で作成され得ることを理解するであろう。さらに、このような命令は、限定はしないが半導体、磁気、または光を含む、現在の、または将来のメモリ技術を使用して記憶されるか、または、限定はしないが光、赤外線、またはマイクロ波を含む、現在の、または将来の通信技術を使用して伝送され得る。このようなコンピュータプログラム製品は、印刷もしくは電子文書を添付した取り外し可能媒体、たとえばシステムROMもしくは固定ディスク上にコンピュータシステムとともにプリインストールされている、たとえば市販ソフトウェアとして配布されるか、またはサーバもしくはネットワーク、たとえばインターネットもしくはワールドワイドウェブ上の電子掲示板から配布され得る。
【０１２０】
次に、本明細書で説明されている技術の多数の実施形態が説明される。
【０１２１】
図3は、典型的なコンピュータグラフィックス処理システムを示している。
【０１２２】
ホストプロセッサ31上で実行する、ゲームなどのアプリケーション32は、グラフィックス処理動作が関連するグラフィックス処理ユニット(グラフィックス処理パイプライン)30によって実行されることを必要とする。これを行うために、アプリケーションはアプリケーション32によって必要とされるグラフィックス出力を生成するグラフィックスプロセッサ30への適切なコマンドを生成するためにホストプロセッサ31上で実行しているグラフィックスプロセスパイプライン30用のドライバ34によって解釈されるAPI(アプリケーションプログラミングインターフェース)コールを生成する。これを円滑にするために、グラフィックス出力(たとえば、表示されるべきフレームの生成)のためにホストシステム31上で実行しているアプリケーション32からのコマンドに応答して「コマンド」の集合がグラフィックスプロセッサ30に供給される。
【０１２３】
図4は、本明細書で説明されている技術に従って動作するグラフィックス処理パイプライン30の概略を示している。
【０１２４】
図4は、本実施形態の動作に関連するグラフィックス処理パイプライン30の主要素およびパイプライン段を示している。当業者であれば理解するように、図4に示されていないグラフィックス処理パイプラインの他の要素もあり得る。ここで、図4は、概略図にすぎず、たとえば、実際には図示されている機能ユニットおよびパイプライン段は、図4に別個の段として概略が示されているとしても、重要なハードウェア回路を共有し得ることにも留意されたい。図4に示されているようなグラフィックス処理パイプラインの段、要素、およびユニットなどの各々は、望み通りに実装されてよく、したがって、たとえば、必要な動作および機能を実行するための適切な回路、および/または処理論理などを備える。
【０１２５】
図4は、ラスター処理プロセスへの入力のためにグラフィックスプリミティブ(ポリゴン)2の組み立てから始まるパイプライン段の概略を示している。したがって、この地点で、グラフィックスデータ(頂点データ)は、変換および照明動作(図示せず)などの、フラグメントフロントエンド動作を受けている。次いで、プリミティブセットアップ(組み立て)段2は、グラフィックスプロセッサに供給されるコマンドおよび頂点データに応答して、レンダリングされるべきプリミティブをセットアップする(組み立てる)。
【０１２６】
図4に示されているように、グラフィックス処理パイプライン30は、次いで、ラスター処理段3、早期ステンシルテスト段21、早期深度テスト段22、フラグメントシェーディング段40の形態のレンダラ、およびブレンディング段8を含む、多数のさらなる段を備える。
【０１２７】
グラフィックス処理パイプライン30のラスター処理段3は、レンダリング出力(たとえば、表示されるべき画像)を構成するプリミティブを処理のために個別のグラフィックスフラグメントにラスター処理するように動作する。これを行うために、ラスタライザ3は、レンダリングのためのグラフィックスプリミティブを受け取り、プリミティブをサンプリング点にラスター処理し、プリミティブをレンダリングするために適切な位置(適切なサンプリング位置を表す)を有するグラフィックスフラグメントを生成する。
【０１２８】
次いで、ラスタライザによって生成されたフラグメントは、処理のために前方のパイプラインの残り部分に送出される。
【０１２９】
早期ステンシルテスト段21は、ラスタライザ3から受け取ったフラグメントに対してステンシルテストを実行する(適切な場合に)。
【０１３０】
早期深度テスト段22は、この段でフラグメントが破棄(カリング)され得るかどうかを確認するために、ラスタライザ3から受け取ったフラグメントに対して深度テストを(可能な場合に)実行する。これを行うために、ラスタライザ3から発行されるフラグメントの(関連付けられている)深度値をすでにレンダリングされているフラグメントの深度値と比較する(これらの深度値は、新規フラグメントがすでにレンダリングされている(またはレンダリングされていない)フラグメントによって塞がれるかどうかを決定するために深度(Z)バッファに記憶される)。
【０１３１】
次いで、フラグメント早期Zおよびステンシルテストを通った(または受けない)フラグメントがフラグメントシェーディング段40に送られる。フラグメントシェーディング段40は、それが受け取ったフラグメントに対して適切なフラグメント処理動作を実行し、それにより、フラグメントを処理して適切なレンダリングされたフラグメントデータを生成する。
【０１３２】
本実施形態において、フラグメントシェーディング段40は、シェーダパイプライン(プログラム可能フラグメントシェーダ)の形態を取る。したがって、フラグメントシェーダ40は、グラフィックスパイプラインの残り部分による処理のため、および/または出力のために、入力されたデータ値に対してシェーダプログラムを実行して出力データの所望の集合を生成するプログラム可能処理段である。
【０１３３】
フラグメントシェーダ40によって実行されるフラグメント処理は、好適な所望のフラグメントシェーディングプロセスを含むものとしてよく、これにより、たとえば、テクスチャ、フォギング、および他の効果をフラグメントに適用し、適切な「フラグメントシェーディングされた」フラグメントデータを生成する。
【０１３４】
次いで、フラグメントシェーディング段40を完了したフラグメントは、必要ならば、ブレンダ9において必要なブレンディング動作(たとえば、他のフラグメントとのシェーディング)を受ける。ディザなど(図示せず)のフラグメント上で必要な残りの他の動作も、この段で実行される。
【０１３５】
最後に、(ブレンドされた)出力フラグメントデータ(値)が、それらがたとえば表示用にフレームバッファに出力できるところからメモリ9に書き込まれる。(タイルベースのグラフィックス処理パイプラインの場合、出力されたフラグメントデータ値は、最初に、主メモリ9に書き出される前にタイルバッファ(図示せず)に書き込まれ得る)
【０１３６】
データをメモリ9に書き込むステップは、望ましい場合に、出力バッファに適した解像度までフラグメントデータをダウンサンプリングするステップを含み得る(たとえば、出力デバイスのピクセルに対応するピクセルデータの配列が生成されるように)。
【０１３７】
レンダリング出力データ配列は、当技術分野で知られているように、典型的には、画面もしくはプリンタなどの、表示デバイス上に表示することが意図されている出力フレームであってよいが、たとえば、後期レンダリングパスで使用することが意図されている中間データ(「テクスチャレンダリング」出力とも称される)も含み得る。
【０１３８】
次いで、このプロセスは、次のレンダリング出力(たとえば、フレーム)などについて繰り返される。
【０１３９】
グラフィックス処理パイプライン30に対する他の配置構成も、もちろん、可能である。
【０１４０】
上の説明では、図4に示されているグラフィックス処理パイプラインの動作のいくつかの特徴を説明している。次に、本明細書で説明されている技術の実施形態による図4に示されているグラフィックス処理パイプラインの動作のさらなる特徴が、説明される。
【０１４１】
図4に示されているように、本実施形態において、フラグメントシェーダ40は、それが実行しているフラグメントシェーダプログラムに含まれている「テスト」命令に応答して、適切な場合に、処理されているフラグメントに対するアルファトゥカバレッジ動作41、後期ステンシルテスト42、および後期深度テスト43の実行をトリガーし、次いで、たとえば、更新されたカバレッジ情報をフラグメントシェーダ40に返すように動作可能である。これを行うために、テスト命令は、その入力として、就中、フラグメントに対する現在のカバレッジおよびアルファ値(ならびに適切な場合に、深度およびステンシル値)ならびに現在のグラフィックス処理(レンダリング)状態を取り、出力として、就中、フラグメントに対する更新されたカバレッジ情報を与えることができる。
【０１４２】
これは、シェーダ実行時にアルファトゥカバレッジおよび後期ステンシルおよび深度テスト動作が、たとえば、それらの動作を実行する前にシェーダ実行が完了するまで待たなくても、(場合によっては)トリガーされ実行されることを可能にする。
【０１４３】
図5は、テスト命令が実行されるとき(ステップ50)の図4に示されているグラフィックス処理パイプライン30の動作の概略および詳細を示している。(フラグメントシェーダ40は、フラグメントを処理するためにシェーダプログラムを実行するときに、シェーダプログラム内の各命令を順に実行するが、テスト命令に到達したときに以下で説明されている方式で動作する)
【０１４４】
図5に示されているように、テスト命令が実行されたときに、早期深度/ステンシルテストが処理されているフラグメントに対して完了したかどうかが最初に決定される(ステップ51)。早期深度/ステンシルテストが注目しているフラグメントに対して完了している場合、フラグメントに対するカバレッジがゼロであるかどうかが決定される(ステップ52)。フラグメントカバレッジがゼロであると決定された場合、フラグメントは破棄される(ステップ59)(すなわち、注目しているフラグメントに対するフラグメントシェーダ実行はこの地点で終了する)。その一方で、フラグメントカバレッジが非ゼロであると決定された(すなわち、レンダリングするためにフラグメントが使用されるべきであるカバーされたサンプリング位置がまだある)場合、フラグメントシェーダ実行は次の命令に進行する(ステップ58)。
【０１４５】
早期深度/ステンシルテストがフラグメントに対して完了していない場合、アルファトゥカバレッジ動作が有効化されているかどうか(実行されているグラフィックス処理タスクの状態において)が決定される(ステップ53)。アルファトゥカバレッジ動作が有効化されている場合、テスト命令はアルファトゥカバレッジ動作をトリガーし、アルファ値に基づきフラグメントに対するカバレッジを更新する(ステップ54)。
【０１４６】
本実施形態において、アルファトゥカバレッジ動作は、フラグメントシェーダ実行コア内の専用ハードウェアを用いて実行される。これに対する他の配置構成も可能である。(アルファトゥカバレッジ動作は、フラグメントに対するアルファ値に基づきフラグメントに対するカバレッジを比例的に取り除く(したがって、たとえば、アルファ値が、フラグメントが少なくとも部分的に透明であることを示している場合にフラグメントからサンプル位置を取り除く))
【０１４７】
カバレッジが更新された後(またはアルファトゥカバレッジ動作が有効化されていない場合)、フラグメントカバレッジがゼロであるかどうかが決定される(ステップ55)。フラグメントカバレッジがゼロであると決定された場合、フラグメントは破棄される(ステップ59)(すなわち、注目しているフラグメントに対するフラグメントシェーダ実行はこの地点で終了する)。
【０１４８】
その一方で、フラグメントカバレッジが非ゼロであると決定された(すなわち、レンダリングするためにフラグメントが使用されるべきであるカバーされたサンプリング位置がまだある)場合、シェーダプログラムが深度またはステンシル値を出力するように動作可能であるかどうかが決定される(ステップ56)。(ここでもまた、これは、たとえば、注目しているグラフィックス処理タスクに対する状態から、決定され得る)
【０１４９】
シェーダプログラムが深度またはステンシル値を出力すべきであると決定された場合、実行はそのプログラムに対する次の命令に進む(ステップ58)。
【０１５０】
シェーダプログラムが深度またはステンシル値を出力するように動作可能でない場合(すなわち、この地点で最終的な深度およびステンシル値が利用可能であるように)、テスト命令は、注目しているフラグメントに対する深度および/またはステンシルテストの実行を(適宜)トリガーする(ステップ57)。
【０１５１】
本発明の実施形態において、深度およびステンシルテストは、グラフィックス処理パイプラインの既存の深度およびステンシルテスト段を使用して実行される(したがって、テスト命令はフラグメントに対する深度およびステンシルテストを実行するようにそれらの段の動作をトリガーする)。ここでもまた、他の配置構成も、望ましい場合に可能である。
【０１５２】
フラグメントが深度およびステンシルテストに合格した場合、シェーダ実行は、シェーダプログラム内の次の命令に進む(ステップ58)。そうでない場合、フラグメントは破棄される(フラグメントに対するシェーダ実行は停止される)(すなわち、深度/ステンシルテストの後にフラグメントに対するカバレッジが結局ゼロで終わる場合、注目しているフラグメントに対するフラグメントシェーダの実行は、その地点で停止(キル)される)。
【０１５３】
本発明の実施形態において、上記の動作を実行するためのテスト命令は、グラフィックス処理パイプラインに対するシェーダコンパイラによるグラフィックス処理パイプラインのフラグメントシェーダ実行段40についてフラグメントシェーダプログラム(命令ストリーム)中に含まれる。
【０１５４】
コンパイラは、たとえば、グラフィックス処理パイプライン30を備えるデータ処理システムのホストプロセッサ31上で実行され得る。(コンパイラは、たとえば、ドライバ4の一部であってよく、たとえば、コンパイラを実行させるための特別なAPIコールがある。したがって、コンパイラ実行は、アプリケーションによって生成されるAPIコールに応答してドライバによって行われるグラフィックス処理準備の一部であってよい)。しかしながら、コンパイラがコンパイルされたコードと同じプロセッサ上で実行される、またはコンパイラが別個のプロセッサ上で実行される、プログラムが別個のシステム上でプリコンパイルされ、コンパイル済み形式で配布されるなどの、他の配置構成も可能である。
【０１５５】
図6は、テスト命令をグラフィックス処理パイプラインのフラグメントシェーダによって実行されるべきシェーダプログラム内に含めるコンパイラの動作の一実施形態の概略を示している。
【０１５６】
シェーダコンパイラは、コンパイルされるべき高水準プログラミング言語のシェーダプログラムを受け取り、図6に示されているように、最初にシェーダプログラムのソースコードを構文解析し、次いで、シェーダプログラムを最適化する(たとえば、通常のコンパイラ動作に従って)(ステップ60および61)。
【０１５７】
次いで、コンパイラは、テスト命令を構文解析されたプログラム内に挿入する(ステップ62)。
【０１５８】
次いで、コンパイラは、構文解析されたシェーダプログラム内のテスト命令に対する所望の位置を決定するためステップのシーケンスを実行する。
【０１５９】
したがって、シェーダプログラムの先頭から始めて(ステップ63)、コンパイラは第1のシェーダ動作を分析し(ステップ64)、そのシェーダ動作がテスト命令に影響を及ぼすかどうかを決定する(ステップ65)(たとえば、テスト命令が使用するかまたは使用しない値に対して影響を有する)。
【０１６０】
シェーダの動作がテスト命令に影響を及ぼすと決定された場合、その動作は移動されて可能な場合にテスト命令の前に実行される(ステップ66)。逆に、注目しているシェーダの動作がテスト命令に影響を及ぼさないと決定された場合、その動作は移動されて可能な場合にテスト命令の後に実行される(ステップ67)。
【０１６１】
これは、次いで、シェーダプログラムが実行するすべての動作について繰り返される(ステップ68)。
【０１６２】
本実施形態において、テスト命令は、できる限り早期に、シェーダプログラム内に(シェーダプログラムに対する命令のシーケンスにおいて)、ただしフラグメントカバレッジを(場合によっては)修正する(「破棄」命令を含む)か、または副作用を発生させる任意の(およびすべての)命令の後に含められる。
【０１６３】
テスト命令は、シェーダプログラム内の、深度またはステンシル値を出力する命令の前(すなわち、シェーダが深度またはステンシル値を出力する場合、それはテスト命令の後に行われる)、およびブレンド出力を生成する命令の前(すなわち、シェーダプログラムのブレンド出力はテスト命令が(場合によっては)実行された後に行われる)にも含まれる。
【０１６４】
他の配置構成も、もちろん、可能である。
【０１６５】
その時のこの影響は、シェーダプログラムにおいて可能な限り早期に、ただしテスト命令の実行(および/または実行する能力)に影響する可能性があるシェーダプログラム動作の後にテスト命令が実行されるべきであるというものである。
【０１６６】
すべてのシェーダプログラム命令が分析された後、シェーダプログラムのコンパイルはファイナライズすることができ(ステップ69)、コンパイル済みシェーダプログラムは実行のためにグラフィックス処理パイプラインに出力することができる(ステップ70)。
【０１６７】
これは、所定の望ましいグラフィックス処理出力に対して実行されるべきシェーダプログラムのいくつかに対して、また一実施形態ではすべてに対して行われる。
【０１６８】
図7は、本実施形態のテスト命令を含む例示的ないくつかのフラグメントシェーダプログラムを示している。
【０１６９】
図7に示されている第1のシェーダプログラムは、比較的単純なプログラムであり、したがってテスト命令81は、プログラム内の、第1のブレンド命令82の前に含まれる。テスト命令81は、たとえば、注目しているフラグメントがブレンド命令82(およびそのブレンド命令に続く任意の命令83)の実行の前に破棄され得ると決定するように動作可能であってよい。
【０１７０】
図7に示されている第2のプログラム84は、破棄命令85を含む。この場合、テスト命令81は、破棄命令85の後に置かれる。
【０１７１】
図7に示されている第3のプログラム86は、たとえば、シェーダプログラムそれ自体が処理されているフラグメントに対する深度およびステンシル値を生成するように動作するので、テスト命令81が深度およびステンシルテストを実行することができないという状況を示している。
【０１７２】
この場合、さらなる深度/ステンシルテスト命令87がシェーダプログラムに含まれ、テスト命令81の後に深度およびステンシルテストをトリガーする。深度/ステンシルテスト命令87は、フラグメントシェーダで計算した深度および/またはステンシル値をグラフィックス処理パイプラインの深度および/またはステンシルテスト段に送出するように動作し、次いで、これは、関連する深度および/またはステンシルテストを実行し、結果を返す(およびフラグメントを「キル」するか、またはその処理を続行するかのいずれかをしかるべく行う)。
【０１７３】
上で説明されている実施形態に対する変形、変更、および改変は、望ましい場合に可能である。
【０１７４】
たとえば、テスト命令の実行は、注目しているフラグメントに対する深度および/またはステンシル「エージチェック」、すなわち、フラグメントが早期深度/ステンシルテストを完了したか、または深度/ステンシルテストをまだ完了していないその位置における最も古いフラグメントであるかに依存し得る。
【０１７５】
注目しているフラグメントに対してカバレッジ情報を(場合によっては)更新するだけでなく、テスト命令がトリガーする1つまたは複数の動作は、グラフィックス処理動作に対する他の情報を更新するためにも使用されてよい(たとえば、一実施形態では、それは他のフラグメントの処理に関連し得る)。したがって、たとえば、テスト命令が深度テストの実行をトリガーする場合、注目しているフラグメントに対するそのテストの結果は、一実施形態において、注目しているグラフィックス処理タスクに対して記憶されている深度情報(たとえば、深度バッファ)を更新するために使用され、たとえば、一実施形態において、それにより、注目しているフラグメントに対する深度値は、テストされる他の(たとえば、後期の)フラグメントに対して利用可能である。
【０１７６】
テスト命令は、処理されているフラグメントに対するアルファ値が特定の1つまたは複数の値を有するかどうかを決定するように、さらに、またはその代わりに、動作し、アルファ値が特定の1つまたは複数の値を有する場合に特定の動作をトリガーし、および/または実行することが可能である。
【０１７７】
たとえば、ブレンディングモードが、フラグメントが常に不透明であるようなモードであるか、またはアルファブレンディングが有効化され、フラグメントに対するアルファ値が、フラグメントが不透明であることを示している(すなわち、アルファ値が1.0以上である)場合に、テスト命令は、実行されたときに、注目しているフラグメントが深度/ステンシルテストに合格した場合に同じ位置を有しているより古いフラグメントを削除する(処理を停止する)ように動作することも可能である(それらのより古いフラグメントは次いで不透明フラグメントの背後にあることが知られ、したがって見ることができないので)。(この動作は、一実施形態において、出願人の早期の英国特許出願第GB A 2511177号において説明されている機構を使用して実装される)。
【０１７８】
同様に、アルファブレンディングが有効化され、アルファ値が、フラグメントが完全に透明である(すなわち、0.0以下である)ことを指示している場合に、テスト命令は、実行された場合に、フラグメントに対する深度/ステンシルテストをトリガーするが(それらのテストは依然として実行される必要があるので)、完全に透明なフラグメントは色バッファに影響を及ぼし得ないので、深度/ステンシルテストが完了した後に注目しているフラグメントに対するフラグメントシェーダをキル(停止)する(フラグメントを破棄する)ことも可能である。
【０１７９】
上記の説明からわかるように、本明細書で説明されている技術は、その実施形態において少なくとも、フラグメントシェーディング段を含むグラフィックス処理パイプラインに対する改善された動作を実現する。
【０１８０】
特に、その実施形態において少なくとも、本明細書で説明されている技術は、フラグメントシェーダプログラムの実行が完了する前にフラグメントの最終的なカバレッジのより早期の決定を円滑にすることができ、それによって、フラグメントシェーダプログラムのより早期の停止を円滑にする。
【０１８１】
これはまた後期深度/ステンシルテストがシェーダプログラム実行においてより早期に実行されることも可能にし、後期深度/ステンシルテストのより単純なトリガーを円滑にすることができる。
【０１８２】
これは、本明細書で説明されている技術の実施形態において少なくとも、実行されるべきフラグメントシェーダプログラム内に1つまたは複数のフラグメント毎の動作を実行するようにフラグメントシェーダをトリガーする命令を含めることによって達成される。
【０１８３】
前述の詳細な説明は、例示および説明を目的として提示されている。網羅的であることも本明細書で説明されている技術を開示されている正確な形態に限定することも意図されていない。上記の教示に照らして、多数の変更および改変が可能である。説明されている実施形態は、本明細書で説明されている技術の原理およびその実用的用途を最もよく説明するために選択されており、それにより、当業者は、考え付く特定の用途に適しているような様々な変更とともに様々な実施形態において本明細書で説明されている技術を最もよく利用することができる。本明細書で説明されている技術の範囲は、付属の請求項によって定義されることが意図されている。
【符号の説明】
【０１８４】
1  グラフィックス処理パイプライン
2  プリミティブ組み立て段
3  ラスター処理段(ラスタライザ)
4  フラグメントシェーダ(シェーダ実行)段
5  アルファトゥカバレッジ段
6  ステンシルテスト段
7  深度テスト段
8  ブレンディング段
9  メモリ
20  グラフィックス処理パイプライン
21  早期ステンシルテスト段
22  早期深度段
30  グラフィックス処理ユニット(グラフィックス処理パイプライン)
31  ホストプロセッサ
32  アプリケーション
34  ドライバ
40  フラグメントシェーディング段
41  アルファトゥカバレッジ動作
42  後期ステンシルテスト
43  後期深度テスト
81  テスト命令
82  第1のブレンド命令
84  第2のプログラム
85  破棄命令
86  第3のプログラム
87  深度/ステンシルテスト命令
【図１】
2018514034.tif 000003
【図２】
2018514034.tif 000004
【図３】
2018514034.tif 000005
【図４】
2018514034.tif 000006
【図５】
2018514034.tif 000007
【図６】
2018514034.tif 000008
【図７】
2018514034.tif 000009
【国際調査報告】
2018514034.tif 000010
2018514034.tif 000011
2018514034.tif 000012