(57)【要約】【課題】頂点シェーディング段階を含むグラフィックスプロセッサの動作を改善すること。【解決手段】グラフィックスプロセッサは、頂点バッファからの入力属性値を処理し、画像を処理する時にグラフィックスプロセッサのラスタライザ/フラグメントシェーダにより用いられる、出力である頂点シェーディングされた属性値を生成する頂点シェーダを含む。システムは、頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、いつ、頂点シェーダ入力属性値のコピーになるかを認識する。この場合、頂点シェーダ20は、コピーの頂点シェーダ出力属性値を生成しないが、ラスタライザ/フラグメントシェーダ22が、対応する頂点シェーダ入力属性値を、本来は頂点シェーダ20の頂点シェーダ出力属性値の代わりに処理する。【選択図】図1
2012185820.tif 000002
【特許請求の範囲】
【請求項１】
入力属性値を処理して、グラフィックス処理システムの次の段階が使用する頂点シェーディングされた出力属性値を生成する、頂点シェーディング段階を含む、前記グラフィックス処理システムを動作させる方法であって、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と、いつ同じになるかを認識するステップと、
頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識される場合に、
前記頂点シェーダ出力属性値を、前記頂点シェーダ入力属性値から生成しないように、前記頂点シェーダを制御するステップと、
前記頂点シェーダによって生成されていたであろう前記頂点シェーダ出力属性値を用いる必要がある次のグラフィックス処理段階に、代わりに対応する頂点シェーダ入力属性値を処理させるステップと、
を含むことを特徴とする方法。
【請求項２】
頂点シェーダコンパイラは、頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識される場合に、本来前記頂点シェーダに前記入力属性値を処理させて前記出力属性値を生成させていたであろうコードを、省略するように構成されることを特徴とする請求項1に記載の方法。
【請求項３】
頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識される場合に、前記次のグラフィックス処理段階に、前記頂点シェーダ出力属性値ではなく、前記頂点シェーダ入力属性値から、処理される値をロードさせるように構成される、前記次のグラフィックス処理段階のためのロード命令を用いることで、前記次のグラフィックス処理段階に、前記頂点シェーダ入力属性値を使用させるステップを含むことを特徴とする請求項1から請求項2のいずれか一項に記載の方法。
【請求項４】
適切な属性値を取り出すためにインデックス付け機構が用いられる、請求項1から請求項3のいずれか一項に記載の方法であって、
次のグラフィックス処理段階が頂点シェーダ入力属性値を処理する時に、自身に提供されている出力インデックス値から、前記頂点シェーダ入力属性値を取り出すのに用いられるインデックスを導出する、前記次のグラフィックス処理段階をさらに含むことを特徴とする方法。
【請求項５】
前記次のグラフィックス処理段階が、前記頂点シェーダ入力属性値を取り出すのに用いられるインデックスを導出するのに用いるべき、インデックス導出動作を決定することを特徴とする請求項1から請求項4のいずれか一項に記載の方法。
【請求項６】
実行される前記インデックス導出動作が、対象の前記属性に関連するメタ情報により示されることを特徴とする請求項4または請求項5に記載の方法。
【請求項７】
対象の前記属性の値をロードおよび/または格納する時に用いられるメタ情報を、前記頂点シェーディング段階の1つまたは複数の属性と関連付けるステップと、
頂点シェーディング段階の属性の値をロードおよび/または格納する時に、前記属性と関連する任意のメタ情報をまず読み取り、次に、前記属性の値をロードまたは格納する時に、前記メタ情報を用いる、グラフィックス処理段階と、
を含むことを特徴とする請求項1から請求項6のいずれか一項に記載の方法。
【請求項８】
頂点シェーディング段階への入力属性の値を処理して、グラフィックス処理システムの次の段階が用いる前記頂点シェーディング段階の出力属性の値を生成する、前記頂点シェーディング段階を含む、グラフィックス処理システムを動作させる方法であって、
対象の前記属性の値をロードおよび/または格納する時に用いられるメタ情報を、前記頂点シェーディング段階の1つまたは複数の属性と関連付けるステップを含むことを特徴とする方法。
【請求項９】
前記頂点シェーディング段階の属性の値をロードおよび/または格納する時に、前記属性と関連する任意のメタ情報をまず読み取り、次に、前記属性の値をロードまたは格納しようとする時に、前記メタ情報を用いる、グラフィックス処理段階を含むことを特徴とする請求項8に記載の方法。
【請求項１０】
前記頂点シェーディング段階の属性と関連する前記メタ情報が、前記属性の値を取り出すのに用いられるインデックスの導出に用いるべき技術の表示、および前記導出に必要な任意のデータを含むことを特徴とする請求項7から9のいずれか一項に記載の方法。
【請求項１１】
前記メタ情報が、
前記属性値の基本メモリアドレスと、メモリ内での前記属性値の間隔の表示と、前記基本メモリアドレスに対する対象の前記属性の値の位置の表示と、前記属性のコンポーネントデータタイプおよびコンポーネントの数の表示と、のうちの1つまたは複数を示すことを特徴とする請求項7から請求項10のいずれか一項に記載の方法。
【請求項１２】
グラフィックスを処理するためのシステムであって、
頂点シェーディング段階と、前記頂点シェーディング段階の次の少なくとも1つの処理段階と、を含む、複数のグラフィックス処理段階を含むグラフィックスプロセッサを備え、
前記頂点シェーディング段階は、入力属性値を処理して、前記グラフィックスプロセッサの少なくとも1つの次の処理段階が用いる頂点シェーディングされた出力属性値を生成し、
前記プロセッサは、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と、いつ同じになるかを認識し、
頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識される時、前記頂点シェーダに、前記頂点シェーダ出力属性値を、前記頂点シェーダ入力属性値から生成させないようにし、
頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識された場合、前記頂点シェーディング段階の出力を処理する少なくとも1つの次のグラフィックス処理段階に、本来前記頂点シェーダによって生成されていたであろう前記頂点シェーダ出力属性値の代わりに、対応する頂点シェーダ入力属性値を処理させるように構成されていることを特徴とするシステム。
【請求項１３】
頂点シェーダコンパイラは、頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識される場合に、本来前記頂点シェーダに前記入力属性値を処理させて前記出力属性値を生成させていたであろうコードを、省略するように構成されることを特徴とする請求項12に記載のシステム。
【請求項１４】
頂点シェーダ入力属性値から前記頂点シェーダにより生成される頂点シェーダ出力属性値が、前記頂点シェーダ出力属性値がそこから生成される前記頂点シェーダ入力属性値と同じになると認識される時、前記次のグラフィックス処理段階に前記頂点シェーダ入力属性値を使用させるために、前記グラフィックス処理段階に、前記頂点シェーダ出力属性値ではなく、前記頂点シェーダ入力属性値から、処理される値をロードさせるように構成される、前記グラフィックス処理段階のためのロード命令を使用するように前記プロセッサが構成されることを特徴とする請求項12または請求項13に記載のシステム。
【請求項１５】
適切な属性値を取り出すためにインデックス付け機構が用いられる、請求項12から14のいずれか一項に記載のシステムであって、
少なくとも1つの次のグラフィックス処理段階が頂点シェーダ入力属性値を処理する時に、前記少なくとも1つの次のグラフィックス処理段階が、自身に提供されている出力インデックス値から、前記頂点シェーダ入力属性値を取り出すのに用いられるインデックスを、導出するための手段を含むことを特徴とするシステム。
【請求項１６】
前記少なくとも1つの次のグラフィックス処理段階が、頂点シェーダ入力属性値を取り出すのに用いられるインデックスを導出するのに用いるべき、インデックス導出動作を決定するための手段を含むことを特徴とする請求項12から請求項15のいずれか一項に記載のシステム。
【請求項１７】
実行される前記インデックス導出動作が、対象の前記属性に関連するメタ情報により示されることを特徴とする請求項15または請求項16に記載のシステム。
【請求項１８】
対象の前記属性の値をロードおよび/または格納する時に用いられるメタ情報を、前記頂点シェーディング段階の1つまたは複数の属性と関連付けるように構成されたプロセッサを含む、請求項12から請求項17のいずれか一項に記載のシステムであって、
前記グラフィックス処理段階の1つまたは複数が、頂点シェーディング段階の属性の値をロードおよび/または格納する場合に、前記属性と関連する任意のメタ情報をまず読み取り、次に、前記属性の値をロードまたは格納する時に、前記メタ情報を用いるように構成されていることを特徴とするシステム。
【請求項１９】
グラフィックス処理システムであって、
頂点シェーディング段階と、前記頂点シェーディング段階の次の少なくとも1つの処理段階とを含み、前記頂点シェーディング段階の出力を処理する、複数のグラフィックス処理段階を備え、
前記頂点シェーディング段階は、前記頂点シェーディング段階への入力属性の値を処理して、前記グラフィックス処理システムの次の段階が用いる前記頂点シェーディング段階の出力属性の値を生成し、
対象の前記属性の値をロードおよび/または格納する時に用いられるメタ情報を、前記頂点シェーディング段階の1つまたは複数の属性と関連付けるように構成されることを特徴とするグラフィックス処理システム。
【請求項２０】
前記グラフィックス処理段階のうちの1つまたは複数が、頂点シェーディング段階の属性の値をロードおよび/または格納する時に、前記属性と関連する任意のメタ情報をまず読み取り、次に、前記属性の値をロードまたは格納する時に、前記メタ情報を用いるように構成されることを特徴とする請求項19に記載のシステム。
【請求項２１】
前記頂点シェーディング段階の属性と関連する前記メタ情報が、前記属性の値を取り出すのに用いられるインデックスの導出に用いるべき技術の表示、および前記導出に必要な任意のデータを含むことを特徴とする請求項18から請求項20のいずれか一項に記載のシステム。
【請求項２２】
前記メタ情報が、
前記属性値の基本メモリアドレスと、メモリ内での前記属性値の間隔の表示と、基本メモリアドレスに対する対象の前記属性の値の位置の表示と、前記属性のコンポーネントデータタイプおよびコンポーネントの数の表示と、
のうちの1つまたは複数を示すことを特徴とする請求項18から請求項21のいずれか一項に記載のシステム。
【請求項２３】
データ処理手段上で実行されると、請求項1から請求項11のいずれか一項に記載の方法を実行するためのコンピュータソフトウェアコード部分を含むことを特徴とするコンピュータプログラム要素。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はグラフィックス処理に関し、具体的には、頂点シェーディング段階(stage)を含むグラフィックス処理システムの動作に関する。
【背景技術】
【０００２】
当技術分野で知られているように、グラフィックス処理は通常パイプライン方式で実行され、1つまたは複数のパイプラインの段階がデータに加えられて表示される最終的な画像を生成する。この処理の2つの重要な段階は通常、表示されることになる画像を表すプリミティブ(ポリゴン)の頂点上で実行される変換およびライティングのような、いわゆる頂点シェーディング動作と、表示されることになる画像を構成する個々のフラグメント(ピクセル)をシェーディング(色付け)する、後続のフラグメント(ピクセル)シェーディング動作である。
【０００３】
頂点変換および頂点ライティングのような頂点シェーディング動作は、通常、グラフィックス処理のいわゆる「頂点シェーダ」段階で実行される。頂点シェーダは、通常、入力データ値に対して頂点シェーダプログラムを実行して、グラフィックスパイプラインの残りによる処理のための所望の出力データ(例えば、適切に変換されライティングされた頂点データ)のセットを生成する、プログラム可能な処理ユニットである。(当技術分野で知られているように、あるシーンの各プリミティブ(ポリゴン)は通常、頂点のセットとして定義かつ表現され、各頂点は、自身を頂点のデータ値のセットと関連付けている。頂点シェーディング処理は、例えば、頂点に関連するプリミティブに加えるべき任意の変換またはライティングに基づいて、頂点の最初に定義されたデータ値を修正する。)
【０００４】
あるシーンに対する入力データ値が頂点「シェーディング」されると、次いでそのシーンを表すプリミティブは通常ラスタライズされ、そのシーンのために処理されることになる複数の「フラグメント」を生成する。(当技術分野で知られているように、「フラグメント」は、グラフィックス処理動作(例えばレンダリング)が実行される個別のグラフィカルエンティティである。各フラグメントは、シーンの1つまたは複数のサンプリング点に対応し、サンプリング点を表示できるように、自身と必要なデータとを、例えば、赤、緑、青(RGB)の明度、アルファ(透明度)値、および深度値とを関連付けている。(フラグメントはピクセルとも呼ばれることがあるが、所与のフラグメントが最終的な表示での単一のピクセル(ピクセル要素)と完全に対応するとは必ずしも限らない。それは、ダウンスケーリングのような後処理が、グラフィックス処理の動作の対象のエンティティ(フラグメント)と表示ピクセルの間に、1対1の対応が存在しないことを意味しうるためである。))
【０００５】
グラフィックスフラグメントは、生成されると、自身をシェーディングする複数の処理を経て、最終的な出力などの明度、例えば適用されるテクスチャ、ブレンディングなどを生成する。出力データ値などを導出するためのそのような処理、例えば、フラグメントが表すサンプル点を表示するのに必要な処理は、「フラグメントシェーディング」または「ピクセルシェーディング」と呼ばれることがあり、処理パイプラインのフラグメントシェーディング(ピクセルシェーディングとも呼ばれる)段階で実行される。フラグメントシェーディング処理は、フラグメントの最初に定義されたフラグメントデータ値を処理して、フラグメントの出力データ(フラグメントが表すサンプル点を表示するのに必要なデータ)を正確に導出する。フラグメントシェーダはやはり、1つまたは複数のフラグメントシェーダプログラムを実行してフラグメントを適切にシェーディング(色付け)する、プログラム可能ユニットであってよい。
【０００６】
当技術分野で知られているように、頂点シェーディング動作およびフラグメントシェーディング動作は通常、いわゆる「属性」に対して動作する。属性は、シェーダプログラムにおける入力変数または出力変数であり、例えば、位置、色、またはテクスチャ座標などを表しうる。
【０００７】
頂点シェーダへの入力属性は、プライマリ属性とも呼ばれることがあり、頂点シェーダの出力属性(フラグメントシェーダの入力属性でもある)は、セカンダリ属性と呼ばれることがある。通常、(頂点シェーダおよびフラグメントシェーダとリンクされた)所与のシェーダプログラムに対して、一定数のプライマリ属性(頂点シェーダ入力変数)および一定数のセカンダリ属性(頂点シェーダ出力変数/フラグメントシェーダ入力変数)が存在する。
【０００８】
ある特定の描画呼び出しについて、インスタンス化されていない描画では、各々のプライマリ属性(頂点シェーダ入力変数)が、描画呼び出しの各頂点に対し、定義されたある値を有する。インスタンス化された描画の場合、各々のプライマリ属性(頂点シェーダ入力変数)は、各頂点または各インスタンスのいずれかに対し、定義されたある値を有する。したがって、インスタンス化されたモードの動作では、一部のプライマリ属性は、頂点毎に定義された値を有するので、「頂点毎」の属性であると考えることができる。同様に、値がインスタンス毎に定義されたプライマリ属性が存在することがあり、そうした属性はそれ故「インスタンス毎」の属性であると考えることができる。
【０００９】
当技術分野で知られているように、グラフィックスプロセッサがいわゆる「インスタンス化された」モードで動作している場合、同じ入力ジオメトリの複数の「インスタンス」が(例えば毎回わずかに異なる位置において)描画される。この場合、頂点シェーダは、頂点毎に1回だけではなく、頂点毎およびインスタンス毎に1回実行される(すなわち、実行される回数は頂点の数とインスタンスの数の積に等しい)。したがって、通常、異なる頂点とインスタンスとの組合せの各々に対する、各々のセカンダリ属性(頂点シェーダ出力変数)のために生成された、頂点シェーダ出力(セカンダリ属性値)が存在する。
【００１０】
プライマリ属性値は通常、頂点シェーダが用いるメモリに格納される。(これは通常グラフィックスAPIで指定される。)グラフィックス処理を必要とするホストシステム上のアプリケーションは、通常、頂点シェーダ入力属性のメモリレイアウトおよび入力属性値を指定する。
【００１１】
従来のイミディエイトモードのグラフィックス処理ユニットの場合に、フラグメントシェーダのような、頂点シェーディングされたセカンダリ属性値という出力を次の処理段階へ与えるために、頂点シェーダの出力は通常、チップ内部の内部パイプラインを通じて導かれる。遅延レンダリンググラフィックスプロセッサ(例えばタイルベースグラフィックスプロセッサ)の場合、頂点シェーダの出力(頂点シェーディングされた属性値)は、通常メモリに書き込まれ、メモリにおいて、頂点シェーダの出力は必要に応じてフラグメントシェーダなどによりアクセスされる。
【００１２】
属性値がメモリに格納される場合、頂点シェーダおよびフラグメントシェーダなどは通常、適切なメモリアドレスを備えてそれを使用し、適切な属性値を、そうした属性値が格納されるべき、または格納されているメモリに、格納し、かつそうしたメモリから取り出す。
【００１３】
例えば、頂点シェーダは、処理のために特定の入力属性値をロードするという命令を実行し、その命令は、頂点シェーダが、入力属性値が格納されるメモリから適切な属性値を取り出すことを可能にするための、メモリアドレスを含み、または示す。同様に、フラグメントシェーダは、処理のために特定の頂点シェーディングされた出力属性値をロードするという命令を実行し、その命令は、フラグメントシェーダが、対象のポリゴン(プリミティブ)の各コーナ頂点について、出力属性値(頂点シェーダの出力)が格納されるメモリから適切な出力属性値を取り出すことを可能にするための、メモリアドレスを含み、または示す。
【発明の概要】
【発明が解決しようとする課題】
【００１４】
出願人らは、頂点シェーディング段階を含むグラフィックスプロセッサの動作について、改善の余地があると考える。
【課題を解決するための手段】
【００１５】
本発明の第1の態様によれば、入力属性値を処理して、グラフィックス処理システムの次の段階が使用する頂点シェーディングされた出力属性値を生成する、頂点シェーディング段階を含む、グラフィックス処理システムを動作させる方法が提供され、その方法は、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、頂点シェーダ出力属性値がそこから生成される頂点シェーダ入力属性値と、いつ同じになるかを認識するステップと、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、頂点シェーダ出力属性値がそこから生成される頂点シェーダ入力属性値と同じになると認識される時、
頂点シェーダ出力属性値を、頂点シェーダ入力属性値から生成しないように、頂点シェーダを制御するステップと、
頂点シェーダによって生成されていたであろう頂点シェーダ出力属性値を用いる必要がある次のグラフィックス処理段階に、代わりに対応する頂点シェーダ入力属性値を処理させるステップと
を含む。
【００１６】
本発明の第2の態様によれば、グラフィックスを処理するためのシステムが提供され、そのシステムは、
頂点シェーディング段階と、頂点シェーディング段階の次の少なくとも1つの処理段階とを含む、複数のグラフィックス処理段階を含むグラフィックスプロセッサであって、頂点シェーディング段階が、入力属性値を処理し、グラフィックスプロセッサの少なくとも1つの次の処理段階が用いる頂点シェーディングされた出力属性値を生成する、グラフィックプロセッサと、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、頂点シェーダ出力属性値がそこから生成される頂点シェーダ入力属性値と、いつ同じになるかを認識し、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、頂点シェーダ出力属性値がそこから生成される頂点シェーダ入力属性値と同じになると認識される時、頂点シェーダに、頂点シェーダ出力属性値を、頂点シェーダ入力属性値から生成させないようにし、
頂点シェーダ入力属性値から頂点シェーダにより生成される頂点シェーダ出力属性値が、頂点シェーダ出力属性値がそこから生成される頂点シェーダ入力属性値と同じになると認識された場合、頂点シェーディング段階の出力を処理する少なくとも1つの次のグラフィックス処理段階に、本来頂点シェーダによって生成されていたであろう頂点シェーダ出力属性値の代わりに、対応する頂点シェーダ入力属性値を処理させる
ように構成されたプロセッサとを含む。
【００１７】
本発明では、グラフィックス処理動作は、頂点シェーダの出力が頂点シェーダの入力属性値といつ同じになるか(すなわち、いつ頂点シェーダ出力が単に頂点シェーダ入力属性のコピーになるか)を、認識するように構成される。
【００１８】
出願人らは、いくつかの場合には、所与の頂点シェーダ入力属性への頂点シェーダ動作が、実際には頂点シェーダ入力属性値を変えないままにすることがあり、したがって実質的に、頂点シェーダの動作は、入力値を変えずに頂点シェーダの出力に単に渡すものになることを認識した。このことは、例えば、頂点シェーダ入力属性が、頂点のテクスチャ座標である場合に起こりうる。
【００１９】
そのような「通りぬけ」の状況が認識されると、本発明では、頂点シェーダは出力値を生成しない(すなわち、入力のコピーを生成しない)ように制御され、代わりに、その出力を用いる必要がある任意のグラフィックス処理段階は、代わりに対応する頂点シェーダ入力属性値を処理するように制御される。
【００２０】
この構成にはいくつかの利点がある。第1に、グラフィックス処理の後段階が頂点シェーダ入力を直接用いることができるようにすることで、頂点シェーダが、グラフィックス処理の後段階が用いる「コピー」の出力値を格納する必要がなくなる。したがって、これにより、実質的に不要な「コピー」の出力値の書き込みが避けられ、さらに、第1の場所におけるそうした「コピー」の発生が避けられる。
【００２１】
さらに、コピーの「通りぬけ」の出力値を生成しないように頂点シェーダを制御することで、頂点シェーダにおいてコピーの出力値を生成し、次のグラフィックス処理段階が用いるために出力値を格納するための、メモリトラフィック、メモリ使用量、帯域幅および実行時間が、回避される。
【００２２】
したがって、本発明は、グラフィックス処理システムにおける頂点シェーダ動作において、フラグメントシェーダにより必要とされる全ての頂点シェーダ出力をメモリに単に書き込む構成と例えば比較して、メモリトラフィックおよび使用量を低減し、したがって消費電力を低減することができる。これは一般的に有益であるが、低電力で持ち運び可能なデバイスで用いられるグラフィックス処理システムでは特に有利でありうる。
【００２３】
頂点シェーダが処理する入力属性値(すなわち、上で論じられたように入力変数値)(および対応する出力属性値(出力変数値))は、頂点シェーダが動作対象にしうる(かつ生成しうる)任意の適切な属性値であってよい。当技術分野で知られているように、上記の適切な属性値は通常、かつ好ましい実施形態では、位置、色などのような属性の値である。
【００２４】
マルチコアシステムでありうるように、グラフィックス処理システムが複数の頂点シェーダを含む場合、本発明は同様に適用可能であることに、ここで留意されたい。この場合、頂点シェーディング段階は、例えば並列に動作する、複数の個別の頂点シェーダを含む。そのような構成では、各頂点シェーダは、好ましくは、本発明による方式で、すなわち「通りぬけ」の属性の出力値を格納しないように動作する。
【００２５】
頂点シェーダの出力を用いることになる次のグラフィックス処理段階は、任意の適切で所望される、そのようなグラフィックス処理段階であってよい。次のグラフィックス処理段階は、好ましくは、グラフィックス処理システムの次のシェーダ段階である。特に好ましい実施形態では、次のグラフィックス処理段階は、フラグメントシェーダであり、例えばジオメトリシェーダであってもよい。
【００２６】
頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる状況は、任意の適切な所望の方式で、任意の適切な段階およびシステムのプロセッサにおいて認識することができる。このことは、好ましくは、頂点シェーダ入力属性から直接コピーされる頂点シェーダ出力属性を識別することによって、行われる。最も好ましくは、システムは、特定の描画呼び出しに対して、出力属性の値が、入力値とは無関係に、全ての頂点に対する入力値と同一になる状況を、認識しようとする(および認識する)。
【００２７】
特に好ましい実施形態では、頂点シェーダコンパイラがこれを行う。したがって、好ましい実施形態では、頂点シェーダコンパイラは、頂点シェーダコードをコンパイルする時に、各々の頂点シェーダ出力属性に対して、頂点シェーダ出力属性の値が、頂点シェーダ入力属性の値から直接コピーされるべきかどうか(すなわち、出力属性が「通りぬけ」の属性であるかどうか)を、検出するように構成される。このことは、これを行うのに適した任意の所望のコンパイラ技術を用いて行われうる。
【００２８】
この点において、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーである全ての場合が、本発明において適切に認識され処置されることが好ましいが、出願人らは、頂点シェーダ出力属性値がいつ頂点シェーダ入力属性値のコピーになるかを、動作の際に完全に正確にかつ信頼性を伴って識別する機構が、常に可能ではない場合があることを認識した、ということに留意されたい。例えば、頂点シェーダコンパイラがこれを行うために用いられている場合、コンパイラが、全てのシェーダプログラムに対してこの性質を完全に識別することはできないことがある(そして実際には通常は識別することができないだろう)。
【００２９】
このことを説明すると、特に好ましい実施形態では、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる状況を識別するための機構は、慎重な結果を与えるように、すなわち、「誤りが起きても安全な側に起こす」ように、構成および構築される。したがって、特に好ましい実施形態では、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる状況を認識する際のあらゆる誤りが、実際には「通りぬけ」の状況が存在しない場合に「通りぬけ」の状況が存在すると判定するのではなく、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる場合にそれをシステムが検出しないようなものとなるような、構成になる。
【００３０】
したがって、システムは好ましくは、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる状況を認識する際のあらゆる誤りが、実際には頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる場合に、それを検出しない誤りとなるように、構成される。このことは、全ての状況において正しくシステムが挙動するという効果を有する(しかし、場合によっては、本発明の方式での最適化および好ましい動作のための一部の機会を失う)。
【００３１】
したがって、「通りぬけ」の属性または状況が識別された(すなわち、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなると判定された)場合の、本発明の動作への具体的な言及は、システム、例えばコンパイラが、「通りぬけ」の状況を識別したという状況を指すことにも、ここで留意されたい。
【００３２】
頂点シェーダは、「通りぬけ」の入力が、任意の適切な所望の方式で、任意の適切な段階およびシステムのプロセッサにおいて認識される場合、出力値を生成しないように制御されうる。また、特に好ましい実施形態では、頂点シェーダコンパイラがこれを行う。したがって、好ましい実施形態では、頂点シェーダコンパイラは、「通りぬけ」の入力(例えば「通りぬけ」の属性)が検出されると、本来は、頂点シェーダに、入力属性値を処理させてコピーの出力属性値を生成させていたであろうコードを、省略するように構成される。また、このことは、これを行うのに適した任意の所望のコンパイラ技術によって行われうる。
【００３３】
次のグラフィックス処理段階は、同様に、「通りぬけ」の入力が任意の適切な所望の方式で識別された場合に、頂点シェーダ入力属性値を用いるようになされうる。好ましくは、処理段階(例えばフラグメントシェーダ)は、頂点シェーダ出力値ではなく、頂点シェーダ入力属性値をロードするようになされる。
【００３４】
特に好ましい実施形態では、グラフィックス処理段階のロード命令は、段階に、頂点シェーダ出力属性値ではなく、頂点シェーダ入力属性値から、処理すべき値をロードさせるように、構成される。したがって、特に好ましい実施形態では、フラグメントシェーダのような、かつ好ましくはフラグメントシェーダである、グラフィックス処理段階のロード命令は、グラフィックス処理段階に、頂点シェーダ入力属性値と頂点シェーダ出力属性値のいずれかをロードさせることができる。このことは、好ましくは、値が処理のためにロードされる属性が、頂点シェーダ入力属性である(したがってその値は頂点シェーダ入力属性値から取り出さなければならない)か、頂点シェーダ出力属性である(したがってその値は頂点シェーダ出力属性値から取り出さなければならない)かを特定する、ロード命令によって実現する。
【００３５】
例えばロード命令のそのような構成は、対象のグラフィックス処理段階のコンパイラにより(したがって、例えばフラグメントシェーダコンパイラにより)行われうる。しかし、このことは、フラグメントシェーダのような他のグラフィックス処理段階がコンパイルされる前に頂点シェーダがコンパイルされることを必要としうるので、特に好ましい実施形態では、(複数の段階を一緒に1つのシェーダプログラムにリンクする)シェーダリンカが、「通りぬけ」の状況が識別されると、対象の段階が適切な頂点シェーダ入力属性(値)を読み取るように、段階のコード(例えばロード命令)を修正するように構成される。
【００３６】
(当技術分野で知られているように、例えばシェーダリンカ動作は、通常、フラグメントシェーダへの各々の入力属性を、対応する頂点シェーダ出力属性と一致させる。本発明では、「通りぬけ」の属性が存在する場合、この動作は好ましくは、適切なフラグメントシェーダ入力属性を、代わりに頂点シェーダ入力属性にリンクするように修正される。)
【００３７】
適切なグラフィックス処理段階のコード(例えばロード命令)を生成および/または修正する必要性は、任意の所望の適切な方式で認識されうる。特に好ましい実施形態では、頂点シェーダ出力属性の値が頂点シェーダ入力属性の直接のコピーになることを示し、頂点シェーダ出力属性の値はどの入力属性の値のコピーになるのかを示す、メタ情報が生成され、このメタ情報は好ましくは、対象の出力属性に頂点シェーダ入力値を用いる(頂点シェーダ出力属性値を探す代わりに)、フラグメントシェーダのような1つまたは複数の次のグラフィックス処理段階を、始動させるのに用いられる。
【００３８】
メタ情報は好ましくは、(上で論じられたように)好ましくは頂点シェーダコンパイラが「通りぬけ」の属性の存在を認識した時に、頂点シェーダコンパイラにより生成される。したがって、好ましい実施形態では、頂点シェーダコンパイラは、対象の頂点シェーダ出力属性が頂点シェーダ入力属性のコピーであることと、頂点シェーダ出力属性がどの入力属性のコピーであるかということとを、シェーダコードと関連付けられたメタ情報内に記録するように構成される。同様に、特に好ましい実施形態では、シェーダリンカは、このメタ情報を認識するように構成され、メタ情報の認識に応答して、段階が対応する頂点シェーダ入力属性(値)を読み取るように、対象の段階のコード(例えばロード命令)を修正するように構成される。
【００３９】
通りぬけの属性が識別された場合に、フラグメントシェーダのような次のグラフィックス処理段階を制御して、頂点シェーダ入力属性値を読み取るステップとともに、次のグラフィックス処理段階は、好ましくは、必要とする頂点シェーダ入力属性の具体的な値にアクセスしそれを読み取ることを可能にするための、データも備える。このことは、任意の所望の適切な方式で行われうる。
【００４０】
特に好ましい実施形態では、インデックス付け機構が、適切な属性値を取り出すのに用いられる。
【００４１】
最も好ましくは、グラフィックスプロセッサの全てのシェーダ段階は、属性値をどこから読み取るべきか(および好ましくはどこに格納すべきか)を識別するための、インデックス付けの取り決めを用いる。したがって、頂点シェーダおよびフラグメントシェーダなどは、好ましくは、属性値が格納されているメモリから適切な属性値を取り出すために、適切なインデックスを含みかつ用いる。
【００４２】
例えば、頂点シェーダは、処理のための特定の入力属性値をロードするための命令を実行し、その命令は、頂点シェーダがメモリから適切な属性値を取り出せるようにするための、インデックスを含みまたは示す。同様に、フラグメントシェーダは、特定の、例えば処理のための頂点シェーディングされた出力属性値をロードするための命令を実行し、その命令は、フラグメントシェーダがメモリから適切な出力属性値を取り出せるようにするための、対象のプリミティブの各コーナ頂点のためのインデックスを含みまたは示す。
【００４３】
入力属性値(頂点シェーダ入力属性値)は、好ましくは、自身が関連する頂点またはインスタンス(インスタンス化されたモードが使用される場合)に基づいて、インデックスを付けられる。したがって、頂点毎に定義される頂点シェーダ入力属性値は、好ましくは、自身が関連する頂点に関して(すなわち、(入力)頂点インデックスを用いて)メモリ内でインデックスを付けられる。同様に、インスタンス毎に定義される頂点シェーダ入力属性値は、好ましくは、自身が関連するインスタンスに関して(すなわち、(入力)インスタンスインデックスを用いて)インデックスを付けられる。インスタンス毎の属性はまた、定義されたインスタンス除数によりインスタンスインデックスを割り、(除数が1よりも大きい場合)属性値を除数の数のインスタンスについて繰り返させることができる。
【００４４】
頂点シェーダの出力属性値は、好ましくは「折りたたまれていない(unfolded)」出力インデックスを用いて、インデックスを付けることができる。この理由は、頂点に依存する入力属性の各々の各頂点に対し、頂点シェーダ入力属性値は通常1つだけ存在し、インスタンスに依存する入力属性の各々の各インスタンスに対し、頂点シェーダ入力属性値は通常1つだけ存在するが、頂点シェーダの出力は、各インスタンスの各頂点の(別々の頂点およびインスタンスの組合せの各々の)各出力属性に対して別々の出力属性値を与えるように、通例「折りたたまれていない」かまたは「引き伸ばされている(blown-up)」。したがって、頂点シェーダ出力属性値は、好ましくは、頂点シェーダ入力属性値に用いられる頂点インデックスおよびインスタンスインデックスに対し、異なるインデックスの取り決めを用いることができる。
【００４５】
頂点シェーダにより(頂点シェーダの出力である頂点シェーディングされた属性値を格納する際に)用いられる出力インデックスおよび、頂点シェーダにより用いられる入力インデックスは、例えば、頂点/インスタンスの組合せ毎に1つの頂点シェーダスレッドを起動することによって、頂点シェーダ実行機能の一部として生成されうる。
【００４６】
したがって、通例、フラグメントシェーダのような次のグラフィックス処理段階は、処理のために頂点シェーダの出力属性値を取り出す時、好ましくは「折りたたまれていない」出力インデックスを用いる。しかし、本発明では、「通りぬけ」の状況が識別された場合、上で論じられたように、次のグラフィックス処理段階は、頂点シェーダ出力属性値ではなく頂点シェーダ入力属性値にアクセスする。したがってこの場合、フラグメントシェーダのような次のグラフィックス処理段階は、適切な頂点シェーダ入力属性値（複数可）を取り出し用いることを可能にする、1つまたは複数の適切なインデックスを好ましくは備える。
【００４７】
上記のことが成り立つ場合には、グラフィックス処理システムを、フラグメントシェーダのような次のグラフィックス処理段階に、および必要に応じて、入力属性値の適切な頂点インデックスまたはインスタンスインデックスを直接用いる、次のグラフィックス処理段階に提供できるように構成することが可能である。
【００４８】
しかし、特に好ましい実施形態では、グラフィックス処理システムは、単一の形態の出力インデックス、好ましくは上で論じられたようなセカンダリ(頂点シェーダ出力の)属性値を取り出すのに用いることができる「折りたたまれていない」形態の出力インデックスを、必要な場合に出力インデックスから導出可能であり導出される入力属性値のために用いられる、任意の他の形態のインデックス(例えば、好ましくは上で論じられたように頂点インデックスまたはインスタンスインデックス)とともに、次のグラフィックス処理段階に提供するように構成される。
【００４９】
したがって、特に好ましい実施形態では、フラグメントシェーダのような次のグラフィックス処理段階は、入力属性値(すなわち、好ましくは頂点インデックスまたはインスタンスインデックス)がそこから導かれうる「折りたたまれていない」出力インデックスを、必要であれば備える。このことは、単一の形態のインデックス(すなわち出力の「折りたたまれていない」インデックス)が、次のグラフィックス処理段階に提供されなければならない(グラフィックス処理段階が複数の形態のインデックスをサポートし場合によっては備えることは必要とされない)ということを意味する。さらに、出力を用いて、用いられるインデックスの形態として折りたたまれていないインデックスが有利である。それは、一般にそうした形態のインデックスは、例えば頂点インデックスとインスタンスインデックスの両方を提供するよりも、記憶スペースの使用量が少ないためである。
【００５０】
「折りたたまれていない」出力インデックスは、好ましくは、グラフィックス処理段階が実行することになる、属性ロード(または格納)命令により提供されかつ/または示される。
【００５１】
これらの構成では、入力属性値が用いるインデックスが、次のグラフィックス処理段階に提供される出力インデックスから、任意の適切で所望される方式で導出されうる。出力属性値の単一の格納された組が用いるインデックスは好ましくは、出力インデックスから所定の方式で導出可能である(かつ導出される)。
【００５２】
特に好ましい実施形態では、次のグラフィックス処理段階に提供される出力の「折りたたまれていない」インデックスから導かれうるインデックスは、上で論じられたように、頂点インデックスおよびインスタンスインデックスを含む。
【００５３】
最も好ましくは、次のグラフィックス処理段階に提供される出力の「折りたたまれていない」インデックスは、所定の方式で、頂点シェーディングされた出力属性値という関連する出力を生成するために頂点シェーダが処理する(または処理するであろう)、入力属性値のインスタンスインデックスおよび/または頂点インデックスから導出される。このことは、出力インデックス生成動作を逆にすることで、対応する頂点インデックスまたはインスタンスインデックスを取り出すことができるということを意味する。(言い換えると、出力である折りたたまれていないインデックスが、定義された入力属性値インデックスから適切な方式で導出され、出力インデックスは対応する入力属性値インデックスを得るために分解することができ、これにより、入力属性値インデックスを、それらを直接規定する必要なく取り出すための機構が得られるということを、出願人らは認識した。)
【００５４】
したがって、特に好ましい実施形態では、次のグラフィックス処理段階が頂点シェーダにより生成された出力属性値を処理しようとする時に次のグラフィックス処理段階に提供されるインデックスは、所定の方式で、対応する頂点シェーダ入力属性値が定義される頂点およびインスタンスの頂点インデックスおよびインスタンスインデックスから生成される。
【００５５】
特に好ましい実施形態では、頂点インデックスおよびインスタンスインデックスの一方(好ましくは頂点インデックス)は、出力インデックス値に対するモジュロ演算によって出力インデックスから導出することができ、頂点インデックスおよびインスタンスインデックスの他方(好ましくはインスタンスインデックス)は、出力インデックス値に対する除算を実行することにより出力インデックスから導出されうる。
【００５６】
最も好ましくは、用いられることになる出力インデックス値(フラグメントシェーダなどに提供されるインデックス)は、以下のように導出される。
出力インデックス値 = (頂点インデックス) + (インスタンスインデックス) × (詰め込まれたインスタンスサイズ)
ここで、「詰め込まれたインスタンスサイズ」は、インスタンス当たりの頂点の数に等しいかそれよりも大きい、設定された(選択された)値である。
【００５７】
このことは、(入力)頂点インデックスが、モジュロ演算により出力インデックス値から得られるということを意味し、
頂点インデックス = (出力インデックス値) modulo (詰め込まれたインスタンスサイズ)
であり、また(入力)インスタンスインデックスは、除算により出力インデックス値から得られるということを意味し、
インスタンスインデックス = floor((出力インデックス値) / (詰め込まれたインスタンスサイズ))
である。
【００５８】
このことの効果は、所与の入力頂点の各インスタンスのために生成される各出力インデックスは、例えば、上記のようにモジュロ演算されると同じ頂点インデックスを返し、所与の入力インスタンスの各頂点のために生成される各出力インデックスは、上記のように除算されると同じインスタンスインデックスを返す。したがって、フラグメントシェーダは、例えば、(異なる「コピー」の出力属性値の各々が異なる「出力インデックス」値を有しても)入力属性値のコピーとなる各出力属性値に対する適切な入力属性値を(必要に応じて)取り出すための、同一のインデックス(頂点インデックスまたはインスタンスインデックス)を導出することができる。
【００５９】
「詰め込まれた(padded)インスタンスサイズ」は、インスタンス当たりの頂点の数(例えば対象の描画呼び出しに対して定義される)に少なくとも等しくなければならないが、この数と完全に一致しなくてもよい。好ましくは、ハードウェアでモジュロ演算を実行する時に用いるのに十分な値に設定される(これにより、完全に汎用的なモジュロ演算が必要とする回路よりも簡易的なモジュロ回路が可能になるため)。最も好ましくは、モジュロ演算が(比較的)行いやすい、次に大きい値または等しい値(インスタンス毎の頂点の数よりも大きい)に丸められる。
【００６０】
グラフィックス処理システムが、インスタンス毎の入力値が特定の属性のインスタンスインデックスに対するさらなる除数値を有することを可能にする、インスタンス化のためのAPI機構を用いる場合、それに応じて、そのようなさらなる除数機構が、除数機構が適用されるインスタンス毎のあらゆる入力属性値にインデックスを付ける時に、好ましくは用いられる(さらなる除数は好ましくは、例えばフラグメントシェーダに提供される出力である折りたたまれていない出力から、属性値を取り出すのに用いられることになるインスタンスインデックスを導出する際に、除数値(詰め込まれたインスタンスサイズ)に単純に乗算される)。
【００６１】
したがって、フラグメントシェーダ(または他の次のグラフィックス処理段階)が、頂点シェーダ入力属性値を処理する(すなわち「通りぬけ」の状況が存在する)時、例えばフラグメントシェーダは、頂点シェーダ入力属性値をロードするように指示されるとともに出力インデックス値を備え、この出力インデックス値から、所望の頂点シェーダ入力属性値を取り出すのに用いられるインデックスを導出する。異なる操作を用いて、提供される出力インデックスから所望のインデックスを導出することができる、上で論じられた構成では、グラフィックス処理段階はまた、どのインデックス導出動作を用いるべきか(およびその動作で用いられることになるあらゆる値)を与えられなければならない。
【００６２】
この点において、フラグメントシェーダのようなグラフィックス処理段階へのロード命令が、関連する頂点シェーダ入力属性値を取り出すのに用いられることになるインデックスを導出するのに必要な全ての情報を含むことは可能だが、特に好ましい実施形態では、実行されるべきインデックス導出動作および、好ましくはその動作に必要なあらゆるデータ(値)は、ロード命令自体とは別のメタ情報により好ましくは示され、かつ/またはメタ情報として提供される。このメタ情報は、好ましくは、フラグメントシェーダなどに提供される出力インデックスが、上で論じられたように、モジュロ演算または除算を受け、属性値を取り出す際に用いる頂点インデックスまたはインスタンスインデックスを導出すべきかどうかを示す。最も好ましくは、このメタ情報はまた、所望のインデックスを導出するのに用いられることになる、適切なモジュロ値または除数値(すなわち、詰め込まれたインスタンスサイズおよび、必要であればインスタンス除数)を示し、または含む。
【００６３】
特に好ましい実施形態では、メタ情報は対象の属性と関連する。そして、属性の値が処理されることになる場合は常に、属性に関連するメタ情報は、好ましくは、属性値自体を取り出すのに用いられることになるインデックスを決定するのに用いられることになるインデックス導出方法がもしあれば、それを決定するように読み取られる。
【００６４】
特に好ましい実施形態では、このメタ情報は属性記述子の形態であってよく、属性記述子はとりわけ、対応する属性が「除数(divisor)」属性(すなわち「折りたたまれていない」出力インデックスに除算を適用して、使用するインデックスを導出しなければならない)であるか、「モジュロ」属性(すなわち「折りたたまれていない」出力インデックスに除算を適用して、使用するインデックスを導出しなければならない)であるか、または「通常の」または「線形の」属性(すなわち「折りたたまれていない」出力インデックスを直接用いなければならない)であるかどうか、および必要に応じて、対応する除数値またはモジュロ値(詰め込まれたインスタンスサイズ(および必要ならばインスタンス除数))であるかどうかを、示す。
【００６５】
上で論じられた好ましい構成では、頂点毎に定義された属性は、詰め込まれたインスタンスサイズに等しいモジュロ値を有するモジュロ属性として定義され、インスタンス毎に定義された属性は、詰め込まれたインスタンスサイズ(必要ならば、あらゆる必要なインスタンス除数により乗算される)に等しい除数値を有する除数属性として定義される。
【００６６】
したがって、特に好ましい実施形態では、所望の入力属性値を取り出すことを可能にするための正確なインデックスをどのように導出するかを示す、好ましくは属性記述子の形態にあるメタ情報が、1つの頂点シェーダ入力属性、好ましくは各々の頂点シェーダ入力属性に対して、生成され格納される。次のグラフィックス処理段階(例えばフラグメントシェーダ)は、好ましくはそのメタ情報を用いて、格納された頂点シェーダ入力属性値への所望のインデックスを導出する。
【００６７】
特に好ましい実施形態では、この機構はまた、頂点シェーダの入力属性値にアクセスするために、頂点シェーダにより用いられる。したがって、頂点シェーダへの属性ロード命令は、好ましくは、属性の対象の値に関連して用いられる折りたたまれていない出力インデックスを含みまたは示し、次いで頂点シェーダは、そのインデックスをどのように処理して、処理される入力属性の値を取り出すのに用いられる実際のインデックス(頂点インデックスまたはインスタンスインデックス)を導出するかを、属性に関連するメタ情報から決定する。
【００６８】
特に好ましい実施形態では、各々の頂点シェーダ入力属性は、対応する入力属性記述子を有し、各頂点シェーダ出力属性はまた、対応する出力属性記述子を有する。
【００６９】
そして入力属性記述子は、好ましくは、入力属性値に正しくアクセスするために、頂点シェーダにより用いられ、頂点シェーダ入力属性値にアクセスする「通りぬけ」の状況が存在する場合、フラグメントシェーダのような他のグラフィックス処理段階により用いられる。セカンダリ(頂点シェーダ出力)属性記述子は、好ましくは、自身の出力属性値をどこに書き込むかを決定するために頂点シェーダにより用いられ、出力属性値をどこで読み取るかを決定するために、フラグメントシェーダのような次のグラフィックス処理段階により用いられる。
【００７０】
したがって、特に好ましい実施形態では、頂点シェーダのそれぞれの入力属性に各々関連し対応する、複数の属性記述子を含む、メタ情報のアレイが存在し、その属性記述子はとりわけ、フラグメントシェーダのようなグラフィックス処理段階が、その頂点シェーダ入力属性を用いようとする時にそれぞれの入力属性の適切な格納された値を取り出すことを可能にするための、情報を含む。
【００７１】
同様に、頂点シェーダのそれぞれの出力属性に各々関連し対応する、複数の属性記述子を含む、メタ情報のアレイが好ましくは存在する。
【００７２】
属性記述子は好ましくは、描画呼び出し時にグラフィックスプロセッサドライバにより生成される。
【００７３】
グラフィックス処理段階が属性値を処理しようとする時に読み取る(用いる)ことになる関連するメタ情報、例えば属性記述子は、任意の所望される適切な方式で示されうる。特に好ましい実施形態では、各属性は属性インデックスに割り当てられ、これらの属性インデックスは次いで、用いるべきメタ情報(属性記述子)を示すために用いられる。好都合なことに、属性インデックスは、例えば頂点シェーダコンパイラによって、割り当てられうる。
【００７４】
したがって、特に好ましい実施形態では、メタ情報(属性記述子)は、対象の属性に割り当てられる属性インデックスを用いて、識別され読み取られる。最も好ましくは、属性記述子は、属性記述子アレイ(または複数のアレイ)に格納され、その中で、対象の属性に割り当てられた属性インデックスを用いてインデックスが付けられる。(ここで、属性記述子は特定の属性に関連する(特定の属性値には関連しない)ので、特定のシェーダプログラムについて、任意の特定の描画呼び出しで描かれる頂点およびインスタンスの数に関係なく、一定数の属性記述子が存在することに留意されたい。)
【００７５】
用いられることになるメタ情報(属性記述子)の属性インデックスは、好ましくは、対応するロード命令(または格納命令)において、グラフィックス処理段階に提供される。
【００７６】
したがって、定義された属性インデックスを用いてインデックスが付けられたメタ情報アレイが好ましくは存在する。そして、フラグメントシェーダのようなグラフィックス処理段階は、(例えば、かつ好ましくは、ロード命令または格納命令中の)受け取った属性インデックスを用いてメタ情報を探し、メタ情報がそのような情報を示す場合には、処理すべき属性値を提供された出力インデックスに適切な方式でそこから取り出すのに用いられることになる、実際のインデックスを導出する。
【００７７】
特に好ましい実施形態では、上で論じられたように、属性値を取り出すのに用いられる、インスタンスインデックス、頂点インデックス、または「折りたたまれていない」インデックスのような特定のインデックスが、関連するインデックスが付けられた属性値の開始(基本)アドレスを定める基本メモリ(バッファ)アドレスに関して用いられる。これは、例えば、属性値が関連するインスタンスを参照することでインデックスが付けられる全ての属性値が、メモリ内の単一の共通の基本バッファアドレスと関連してそのようにインデックスが付けられうるということを意味する。このことは、属性値が例えば、属性値に関する頂点、インスタンスまたは頂点/インスタンスの組合せに関連してインデックスを付けることができる時、メモリ内での属性値のローディングおよび格納、ならびに属性値の編成を単純化する。
【００７８】
特に好ましい実施形態では、適切なインデックスおよびバッファ基本アドレスに加えて、属性値を取り出すときに、および取り出すために、さらなる情報が用いられる。特に好ましい実施形態では、このさらなる情報は、メモリ内(バッファ内)の属性値のレイアウトに関するさらなるパラメータまたは情報を含む。メモリ内での属性値のレイアウトに関するこのさらなる情報は、好ましくは、メモリ内の属性値の間隔の表示(好ましくは「ストライド」値の形態)、対象の属性の基本メモリアドレスに対する相対的な位置の表示(好ましくは「オフセット」値の形態)、ならびに/または、属性のコンポーネントデータの種類およびコンポーネントの数を示す、属性値の「タイプ」インジケータのうちの1つまたは複数、好ましくは全てを含む(好ましい実施形態では、属性ロード命令および属性格納命令は、規定されたデータタイプに基づいてデータフォーマット変換を実行する)。
【００７９】
これらの構成では、それに応じて、グラフィックス処理段階は、属性値を取り出すための適切なバッファ基本アドレス(および必要な場合には他の情報)とともに、所望の属性値を取り出す(または格納する)のに用いられることになるインデックスを導出するのに用いる技術を示すもの、および導出に必要な任意のデータを、好ましくは備える。したがって、特に好ましい実施形態では、グラフィックス処理段階は、インデックスおよび基本メモリアドレスを、好ましくはストライド、オフセット、および/またはデータタイプのような他のデータとともに備え、それらのデータから、必要とする属性値を取り出すのに用いるメモリアドレスを導出する。
【００８０】
バッファ基本アドレスなどの情報は、ロード(または格納)命令により直接提供されまたは示されうる。しかし、特に好ましい実施形態では、バッファ基本アドレスは、好ましくは属性記述子の形態にあるメタ情報として提供され、メタ情報は、好ましくは上で論じられた方式で、対象の属性と関連付けられる。ストライド、オフセットおよびデータタイプ(用いられる場合)のような他の情報も、好ましくはこの形態で提供される。
【００８１】
したがって、特に好ましい実施形態では、(上で論じられたような)各属性記述子は、好ましくは、バッファ基本アドレス(メモリ基本アドレス)を、好ましくはその属性の値を取り出すまたは格納する際に用いられることになるストライド、オフセット、データタイプのような他の情報とともに、さらにまたは代わりに(好ましくは同様に)示す。したがって、特に好ましい実施形態では、1つの、好ましくは各々の属性記述子は、とりわけ、関連する属性の値がロードされ格納される時に用いられることになる、基本バッファアドレスおよびインデックス導出機構(および好ましくは、ストライド、オフセット、データタイプのような、他の情報)を示す。
【００８２】
したがって、特に好ましい実施形態では、所望の入力属性値を取り出しできるようにするための適切なインデックス、およびインデックスに関連する基本メモリアドレスとともに、好ましくは、ストライド、オフセット、データタイプのような他の情報を、どのように導出するかを示す、好ましくは属性記述子の形態にあるメタ情報が、1つの、好ましくはいくつかまたは各々の頂点シェーダ出力属性に対して生成され格納される。次いで、グラフィックス処理段階(例えばフラグメントシェーダ)は好ましくは、そのメタ情報を用いて、格納された頂点シェーダ入力属性値のメモリアドレスを導出する。
【００８３】
セカンダリ属性(頂点シェーダ出力属性)は、好ましくは同じ方法で構成される。すなわち、頂点シェーダ出力属性は、対応する関連するメタ情報を、好ましくは属性記述子の形態で有し、メタ情報は、上で論じられた頂点シェーダ入力属性と同じ方式で、インデックスを導出し基本メモリアドレス情報などを提供する。
【００８４】
特に好ましい実施形態では、(属性)ロード命令および(属性)格納命令の両方が、上で論じられた方式で動作する。
【００８５】
上で論じられた方式で、メタ情報、例えば属性記述子を用いて、所望の属性値を取り出す(または格納する)ためのインデックスを導出するのに用いられることになるインデックス導出処理を示すこと、および/または所望の属性値を取り出す(または格納する)際に用いられることになる基本メモリアドレスなどを示すことは、特に有利である。それは、そのようにすることは、例えば、上記のような情報がシェーダコードとは別であり独立であるということを意味するためである。このことはまた、例えば同じシェーダコードをメタ情報(属性記述子)の異なるセットとともに用いることを可能にし、メタ情報により制御されるパラメータ(例えばメモリ内の属性値の編成)が変化した時にシェーダコードを変化させる必要をなくす。また、頂点シェーダからの入力と出力の両方を制御するのに同じ機構を用いること、および頂点シェーダと、フラグメントシェーダのような次のグラフィックス処理段階が同じ機構を用いることも可能にする。
【００８６】
したがって、グラフィックス処理システムにおいて所望の属性値を取り出すために、頂点シェーダ属性に関連するメタ情報をそのように用いて、例えば、インデックスを導出するのに用いられることになるインデックス導出処理を示し、および/または用いられることになる基本メモリアドレスを示すことは、「通りぬけ」の属性が識別された場合に新規かつ有利であるだけではなく、それ自体が新規かつ有利でありうる。
【００８７】
したがって、本発明の第3の態様によれば、頂点シェーディング段階への入力属性の値を処理して、グラフィックス処理システムの次の段階が用いる頂点シェーディング段階の出力属性の値を生成する、頂点シェーディング段階を含む、グラフィックス処理システムを動作させる方法が提供され、その方法が、
対象の属性の値をロードおよび/または格納する時に用いられることになるメタ情報を、頂点シェーディング段階の1つまたは複数の属性と関連付けるステップと、
頂点シェーディング段階の属性の値をロードおよび/または格納しようとする時に、その属性と関連する任意のメタ情報をまず読み取り、次に、属性の値をロードまたは格納する時に、メタ情報を用いる、グラフィックス処理段階とを含む。
【００８８】
本発明の第4の態様によれば、
頂点シェーディング段階および頂点シェーディング段階の次の少なくとも1つの処理段階を含み、頂点シェーディング段階の出力を処理する、複数のグラフィックス処理段階を含む、グラフィックス処理システムが提供され、
頂点シェーディング段階が、頂点シェーディング段階への入力属性の値を処理し、グラフィックス処理システムの次の段階が用いる頂点シェーディング段階の出力属性の値を生成し、
グラフィックス処理システムが、対象の属性の値をロードおよび/または格納する時に用いられることになるメタ情報を、頂点シェーディング段階の1つまたは複数の属性と関連付けるように構成され、
グラフィックス処理段階のうちの1つまたは複数が、頂点シェーディング段階の属性の値をロードおよび/または格納しようとする時に、その属性と関連する任意のメタ情報をまず読み取り、次に、属性の値をロードまたは格納する時に、メタ情報を用いるように構成される。
【００８９】
当業者により理解されるように、本発明のこれらの態様は、必要に応じて、本明細書で説明される本発明の好適な特徴および任意選択の特徴のうちの任意の1つまたは複数または全てを含んでもよく、好ましくは含む。
【００９０】
したがって、例えば、メタ情報は好ましくは、上で論じられたような属性記述子の形態であり、頂点シェーダ属性の少なくとも一部および/または全ては、好ましくは対応する属性記述子を有する。同様に、メタ情報(属性記述子)は、グラフィックスプロセッサドライバにより好ましくは生成され、描画呼び出し時に好ましくは生成される。メタ情報は、属性の値をどのように、ならびに/またはどこに格納するか、および/もしくはどこからロードするかを示す情報を、好ましくは含む。
【００９１】
それに応じて、メタ情報は、属性値が格納される(または格納されることになる)メモリアドレスを決定することを可能にするための情報を、好ましくは含みまたは示す。したがって、メタ情報は好ましくは、属性の値をロードする(または格納する)時に用いられることになるインデックスを決定することを、好ましくは、属性の値をロードする(または格納する)時に用いられることになるインデックスを導出するのに用いられることになる処理を示すことによって、可能にする。最も好ましくは、メタ情報は、属性の値をロードする(または格納する)時に用いられることになる基本メモリアドレスを、さらにまたは代わりに示す。
【００９２】
上で論じられたように、特に好ましい実施形態では、メタ情報は、メモリ内での属性値のレイアウトについてのさらなる情報を示してもよく、好ましくは示す。さらなる情報は、例えば、メモリ内での属性値の間隔の表示(「ストライド」)、対象の属性の基本メモリアドレスに対する相対的な位置(「オフセット」)などを含んでもよく、好ましくは含む。
【００９３】
上で論じられたように、グラフィックス処理システムの少なくとも1つの次の段階は、頂点シェーディング段階の属性を処理しようとする時に、属性に関連するメタ情報を読み取り、メタ情報がそのような情報を示す場合、メタ情報にしたがって属性の値を、好ましくはメタ情報により示される任意の基本メモリアドレスに対して、取り出すのに用いられることになる、インデックスを導出するように構成される。
【００９４】
最も好ましくは、グラフィックスシステムのある段階は、処理されるべき属性を示す属性ロード命令を実行し、次いでその属性ロード命令に応じて、対象の属性に関連するメタ情報を読み取り、必要な属性値を取り出すのに用いられることになるインデックス、および/または必要な属性値を取り出す時に用いられることになる基本メモリアドレスを導出するかどうか、およびどのように導出するかを、そのメタ情報から決定する。
【００９５】
メタ情報は、好ましくは、少なくとも頂点シェーダ属性値がロードされることになる時に用いられる。メタ情報は、好ましくは、頂点シェーダ属性値をロードする時と格納する時の両方で用いられる(したがって、頂点シェーダ入力属性および頂点シェーダ出力属性の両方が、好ましくは自身に関連するメタ情報を有しうる)。
【００９６】
同様に、好ましくは少なくとも1つの次のグラフィックス処理段階、好ましくはフラグメントシェーダは、メタ情報を用いる。最も好ましくは、頂点シェーダもメタ情報を用いる。
【００９７】
本発明はまた、メタデータの生成にまで拡張する。
【００９８】
したがって、本発明の第5の態様によれば、頂点シェーディング段階への入力属性の値を処理してグラフィックス処理システムの次の段階が用いる頂点シェーディング段階の出力属性の値を生成する、頂点シェーディング段階を含む、グラフィックス処理システムを動作させる方法が提供され、その方法が、
対象の属性の値をロードおよび/または格納する時に用いられることになるメタ情報を、頂点シェーディング段階の1つまたは複数の属性と関連付けるステップを含む。
【００９９】
本発明の第6の態様によれば、
頂点シェーディング段階および頂点シェーディング段階の次の少なくとも1つの処理段階を含み頂点シェーディング段階の出力を処理する、複数のグラフィックス処理段階を含む、グラフィックス処理システムが提供され、
頂点シェーディング段階が、頂点シェーディング段階への入力属性の値を処理し、グラフィックス処理システムの次の段階が用いる頂点シェーディング段階の出力属性の値を生成し、
グラフィックス処理システムが、対象の属性の値をロードおよび/または格納する時に用いられることになるメタ情報を、頂点シェーディング段階の1つまたは複数の属性と関連付けるように構成される。
【０１００】
当業者により理解されるように、本発明のこれらの態様は、必要に応じて、本明細書で説明される本発明の好適な特徴および任意選択の特徴のうちの任意の1つまたは複数または全てを含んでもよく、好ましくは含む。したがって、メタ情報は好ましくは上で説明された形態であり、好ましくはグラフィックス処理システムのグラフィックスプロセッサのドライバにより、好ましくは描画呼び出し時に生成される。
【０１０１】
当業者により理解されるように、フラグメントシェーダのような次のグラフィックス処理段階は、通常の処理のためにその属性値(頂点シェーダ入力属性値および/または頂点シェーダ出力属性値)を、通常の方式で(本発明で加えられた変化は除き)、用いることができ用いることになる。例えば、フラグメントシェーダの場合、フラグメントシェーダは、属性値を用いて1つまたは複数のプリミティブをレンダリングし、例えば表示のためのフレームを表すレンダリング出力値のセットを生成する。これらの出力値は、次いで、表示のためのフレームバッファなどに格納して用いるために、外部のメモリにエクスポートされうる。
【０１０２】
したがって、本発明は好ましくは、頂点シェーダ出力属性値または対応する頂点シェーダ入力属性値を必要に応じて用いて、グラフィックス処理システムの所望の出力、例えば表示のためのフレームを表す出力値のセットを生成するために、属性値が関連する1つまたは複数のプリミティブをレンダリングすることを、さらに含む。当技術分野で知られているように、レンダリング処理は、例えば、属性値のブレンディング、フラグメントシェーディング、テクスチャリングなどを含みうる。
【０１０３】
同様に、本発明は好ましくは、頂点シェーダ出力属性値または対応する頂点シェーダ入力属性値を必要に応じて用いて、グラフィックス処理システムからの出力のために出力データ値のセットを生成する、1つまたは複数の次のグラフィックス処理段階をさらに含む。
【０１０４】
好ましい実施形態では、次のグラフィックス処理段階は、フラグメントシェーダを含む。この場合、本発明は好ましくは、頂点シェーダ出力属性値または対応する頂点シェーダ入力属性値を必要に応じて用いて、例えばおよび好ましくは、表示されるべきフレームのような、グラフィックス処理システムにより生成されることになる出力のサンプリング位置のための、フラグメントシェーディングされた出力データ値のセットを生成する、グラフィックス処理システムのフラグメントシェーダをさらに含む。
【０１０５】
次いで、出力、例えばフラグメントシェーディングされたデータ値は、表示のためのフレームバッファなどに格納して用いるために、外部のメモリ、例えばメインメモリに好ましくはエクスポートされる。当技術分野で知られているように、出力は、例えばグラフィックス処理システムの性質および構成に応じて、メインメモリにエクスポートされる前に、一時的にグラフィックスプロセッサのローカルに、例えば1つまたは複数のタイルバッファに格納されうる。
【０１０６】
本発明は、生成するのにグラフィックス処理パイプラインが用いられうる出力の全ての形態、例えば表示のためのフレーム、テクスチャへのレンダリングの出力などに用いられうる。
【０１０７】
グラフィックス処理パイプラインで生成される(レンダリングされる)ことになる出力は通常、複数のプリミティブ(およびタイルベースのシステムでは複数のタイル)で作られているので、実際には、本発明は出力を構成する各プリミティブ(およびタイル)に対して繰り返され、したがって最終的には、レンダリングされたフラグメントデータの適切なセットが、必要とされる出力の各サンプリング点に対して生成されている、ということが理解されるだろう。
【０１０８】
特に好ましい実施形態では、本発明の様々な機能は、例えば表示デバイスのフレームバッファに書き込まれるレンダリングされたフラグメントデータを生成して出力する、単一のグラフィックス処理プラットフォームにおいて実行される。
【０１０９】
本発明は、適切に構成されたマイクロプロセッサベースのシステムのような、任意の適切なシステムで実施されうる。好ましい実施形態では、本発明は、コンピュータベースおよび/またはマイクロプロセッサベースのシステムで実施される。
【０１１０】
本発明の様々な機能は、任意の所望される適切な方式で実行することができる。例えば、本発明の機能は、所望される通りに、ハードウェアまたはソフトウェアで実装されうる。したがって、例えば、本発明の様々な機能的な要素および「手段」は、様々な機能などを実行するように動作可能な、適切な1つまたは複数のプロセッサ、1つまたは複数のコントローラ、機能ユニット、回路、処理論理回路、マイクロプロセッサ配列など、例えば、適切な専用のハードウェア要素および/または所望の方式で動作するようにプログラムされうるプログラム可能なハードウェア要素を含んでもよい。
【０１１１】
頂点シェーダ、フラグメントシェーダ、および任意の他のグラフィックス処理段階は、それに応じて所望されるように任意の適切な方式で実装することができ、任意の所望のかつ適切な頂点シェーディングまたはフラグメントシェーディングなどの機能をそれぞれ実行することができる。
【０１１２】
同様に、様々な入力属性値、出力属性値、メタ情報、属性記述子などは、任意の適切で所望される方式で、定義され格納されうる。
【０１１３】
当業者により理解されるように、本発明の様々な機能などは、所与のプロセッサにおいて重複していてもよく、および/または並列に実行されてもよいことにも留意されたい。したがって、例えば、上で論じられたように、頂点シェーディング段階は、並列に動作する複数の別々の頂点シェーダを含みうる。
【０１１４】
本発明は、好ましくは「パイプライン化された」レンダリング構成を有するプロセッサのような、任意の適切な形態または構成のグラフィックスプロセッサおよびレンダラに適用可能である。本発明は特に、タイルベースのグラフィックスプロセッサおよびグラフィックス処理システムに適用可能である。
【０１１５】
したがって、本発明は、本明細書で説明される本発明の態様の任意の1つまたは複数による装置、またはその方法にしたがって動作する装置を含む、グラフィックスプロセッサおよびグラフィックス処理プラットフォームにまで拡張する。上で論じられた具体的な機能を実行するのに必要な任意のハードウェアがある状態で、そのようなグラフィックスプロセッサは、グラフィックスプロセッサが含む通常の機能ユニットなどの任意の1つまたは複数または全てを他に含みうる。
【０１１６】
本発明の全ての説明された態様および実施形態は、必要に応じて、本明細書で説明された好適な特徴および任意選択の特徴のうちの任意の1つまたは複数または全てを含んでもよいことも、当業者は理解するだろう。
【０１１７】
本発明による方法は、ソフトウェア、例えばコンピュータプログラムを少なくとも部分的に用いて、実施されうる。したがって、さらなる態様から見ると、本発明は、データ処理手段にインストールされると本明細書で説明された手段を実行するように具体的になされたコンピュータソフトウェアと、データ処理手段上で実行されると本明細書で説明された方法を実行するコンピュータソフトウェアコード部分を含むコンピュータプログラム要素と、データ処理システム上で実行されると本明細書で説明された1つまたは複数の方法の全てのステップを実行するようになされたコード手段を含むコンピュータプログラムとを提供することが、理解されるだろう。データ処理システムは、マイクロプロセッサ、プログラム可能なFPGA(フィールドプログラマブルゲートアレイ)などであってよい。
【０１１８】
本発明はまた、データ処理手段を含むグラフィックスプロセッサ、レンダラまたはマイクロプロセッサのシステムを動作させるのに用いられると、前記データ処理手段および前記プロセッサとともに、レンダラまたはシステムに本発明の方法のステップを実行させるような、ソフトウェアを含むコンピュータソフトウェア担体にまで拡張する。そのようなコンピュータソフトウェア担体は、ROMチップ、CD ROMまたはディスクのような物理的な記憶媒体であってもよく、または、配線を介した電気信号、光信号、または衛星などへの無線信号のような、信号でもあってよい。
【０１１９】
本発明の方法のステップの全てが、コンピュータソフトウェアにより実行される必要はなく、したがって、さらに広い態様からは、本発明はコンピュータソフトウェアを提供し、そのようなソフトウェアは、本明細書で述べられる方法のステップの少なくとも1つを担持するためのコンピュータソフトウェア担体にインストールされるということが、さらに理解されるだろう。
【０１２０】
したがって、本発明は、コンピュータシステムとともに用いるためのコンピュータプログラム製品として、適切に具現化されうる。そのような実装形態は、非一時的なコンピュータ可読媒体、例えばディスケット、CD ROM、ROM、またはハードディスクのような、有形媒体にいずれかが固定された、一連のコンピュータ可読命令を含みうる。実装形態は、光通信線またはアナログ通信線を含むが限定はされない有形媒体を通じて、またはマイクロ波、赤外線または他の伝送技術を含むが限定はされないワイヤレス技術を用いて無形に、モデムまたは他のインターフェースデバイスを介し、コンピュータシステムに送信可能な、一連のコンピュータ可読命令も含みうる。一連のコンピュータ可読命令は、本明細書で前に説明された機能の全てまたは一部を具現化する。
【０１２１】
そのようなコンピュータ可読命令は、多くのコンピュータアーキテクチャまたはオペレーティングシステムとともに用いられる複数のプログラミング言語で書かれうることを、当業者は理解するだろう。さらに、そのような命令は、半導体技術、磁気技術、光学技術を含むが限定はされない、現在または未来の任意のメモリ技術を用いて格納することができ、また、光学技術、赤外線技術、マイクロ波技術を含むが限定はされない、現在または未来の任意の通信技術を用いて送信されうる。そのようなコンピュータプログラム製品は、添付の印刷された文書または電子文書とともに取り外し可能媒体として、例えば、システムROMまたは固定ディスク上にコンピュータシステムにより事前にロードされた、例えば市販ソフトウェアとして配布することができ、または、ネットワーク、例えばインターネットまたはワールドワイドウェブを介してサーバまたは電子掲示板から配布することができることが考えられる。
【０１２２】
ここで、本発明のいくつかの好ましい実施形態が、添付の図面を参照して、単なる例として説明される。
【図面の簡単な説明】
【０１２３】
【図１】本発明によるグラフィックス処理システムのある実施形態を概略的に示す図である。
【図２Ａ】本発明のある実施形態の動作を概略的に示す図である。
【図２Ｂ】本発明のある実施形態の動作を概略的に示す図である。
【図３】本発明のある実施形態の動作を概略的に示す図である。
【図４】本発明のある実施形態の動作を概略的に示す図である。
【図５】本発明のある実施形態の動作を概略的に示す図である。
【図６】本発明のある実施形態の動作を概略的に示す図である。
【図７】本発明のある実施形態の動作を概略的に示す図である。
【発明を実施するための形態】
【０１２４】
図1は、本発明の方式で動作しうるタイルベースのグラフィックス処理システムを概略的に示す。この図は、本実施形態の動作に関連するグラフィックス処理システムの主要な要素を示す。当業者により理解されるように、図1に示されていないグラフィックス処理システムの他の要素が存在してもよい。
【０１２５】
図1に示されるように、グラフィックス処理システムは、頂点シェーダ20、タイラ21、ラスタライザおよびフラグメントシェーダ22という、3つの主要な機能ユニット(処理段階)を含む。これらの処理段階は、インデックスバッファ23、描画呼び出し記述子24、プライマリ属性記述子アレイ25、頂点バッファ(プライマリ属性アレイ)26、セカンダリ属性記述子アレイ27、変数バッファ(セカンダリ属性アレイ28)、位置バッファ29、およびポリゴンリストアレイ30を含む、様々なデータアレイ、バッファに格納されるデータを、用い処理する。
【０１２６】
(図1では、角が丸い箱はグラフィックス処理システムのハードウェアユニット(処理段階)を表し、長方形の箱はメモリバッファまたはデータ構造を表す。実線の矢印は、処理段階からメモリバッファおよびデータ構造へのデータフローを示し、点線の矢印は、メモリバッファとデータ構造との間のポインタである(すなわち、1つのデータ構造は異なるメモリアレイへの1つのエントリに対するポインタを含む)。ここで、図1は単なる概略図であり、例えば実際には、頂点シェーダおよびフラグメントシェーダのような示された機能ユニットは、図1で別の段階として概略的に示されていても、重要なハードウェア回路を共有しうることに留意されたい。)
【０１２７】
描画呼び出し記述子は、1つの描画呼び出しを定義する。(当技術分野で知られているように、表示のための画像をレンダリングするためのグラフィックスプロセッサへの「命令」は、グラフィックス表示のためのホストシステム上で実行されるアプリケーションからのコマンドに応答して生成される描画呼び出し記述子の形態で、グラフィックスプロセッサに提供される。簡単にするために、図1は、単一の描画呼び出しのみに対する動作を示す。実際には、当技術分野で知られているように、各々が対応する描画呼び出し記述子を含む、実行される描画呼び出しが複数存在する。複数の描画呼び出しが実行されることになる場合、各描画呼び出しは1つの記述子を有し、描画呼び出し記述子は、描画呼び出し記述子のリンクされたリストとして格納される。各々の別の描画呼び出しは、本実施形態の方式で扱われ処理される。)
【０１２８】
当技術分野で知られているように、原則的に、描画呼び出し記述子が、頂点シェーダ20およびタイラ21の動作の開始点である。グラフィックス処理ユニットは、コマンドを受信して適切な描画呼び出し記述子により規定されるような描画呼び出しを実行し、次いで頂点シェーダおよびタイラは、そのコマンドを実行するように動作する。
【０１２９】
ラスタライザ/フラグメントシェーダ22の動作について、タイラ21は、各描画呼び出しに対し、描画呼び出し記述子へのポインタをポリゴンリスト30に書き込む。次いで、ラスタライザ/フラグメントシェーダ22は、ポリゴンリストアレイ30内のポインタを読み取ることで、どの描画呼び出し記述子が、ラスタライザ/フラグメントシェーダ22がラスタライズおよびシェーディングする各三角形と関連しているかを知る。
【０１３０】
インデックスバッファ23は、各ポリゴン(プリミティブ)の各コーナ頂点の頂点インデックスを格納する。位置バッファ29は、変換された位置を、頂点シェーダ20からの出力(すなわち、グラフィックスを見る側から見て、ポリゴン(グラフィックスプリミティブ)を描くべき位置)として含む。
【０１３１】
当技術分野で知られているように、頂点シェーダ20は、表示すべき画像に対して定義された頂点などに関連する入力データ値をとり、そのようなデータ値を処理して、グラフィックス処理システムの次の段階が用いる対応する「頂点シェーディングされた」出力データ値のセットを生成する。頂点シェーティングは例えば、画像のライティングの効果を考慮するように、入力データを修正する。
【０１３２】
当技術分野で知られているように、タイラ21は、シーンの各タイルに対する適切なポリゴンリスト内に、表示されている画像のポリゴン(プリミティブ)をソートするように動作するので、ラスタライザ/フラグメントシェーダ22は、現在動作の対象になっているタイルのために、どのポリゴンを処理すべきかが分かる。タイラ21は、描画呼び出し記述子24、インデックスバッファ23からのインデックス、および位置バッファ29からの位置情報を読み、ポリゴンリストのセットをポリゴンリストアレイ30に格納し、ポリゴンリストのセットは、以下でさらに論じられるように、リスト中のポリゴンの頂点に関連する関係のあるデータを取り出すことができるようにするための、適切なインデックスを含む。
【０１３３】
当技術分野で知られているように、ラスタライザ/フラグメントシェーダ22は、まず、表示すべき画像の中のポリゴンを、画像を表示するために次にシェーディングされるグラフィックスエンティティである個別のグラフィックスフラグメントにラスタライズし、次いで、ラスタライズされたフラグメントに対して様々なフラグメントシェーディング動作を実行し、最終的な表示されるべきバージョンのフラグメントを生成し、さらにこのフラグメントを、例えば出力のための適切なタイルバッファ、例えば表示のためのフレームバッファに格納する。
【０１３４】
当技術分野で知られているように、頂点シェーダ20は、複数の入力変数を有し出力変数のセットを生成する、頂点シェーダプログラムを実行する。入力変数および出力変数は属性として知られており、処理されている画像の頂点などの、色、位置、テクスチャ座標などのような変数(属性)を表す。頂点シェーダ20の各出力属性は、フラグメントシェーダ22への入力属性(変数)であり、各シェーダプログラム(頂点シェーダおよびフラグメントシェーダとリンクされている)に対し、一定数の頂点シェーダ入力属性(変数)および一定数の頂点シェーダ出力/フラグメントシェーダ入力属性(変数)が存在する。
【０１３５】
本実施形態では、頂点シェーダの入力属性は「プライマリ属性」と呼ばれ、それに応じて頂点シェーダの出力属性は「セカンダリ属性」と呼ばれることになり、または呼ばれる。(頂点シェーダ出力属性値は、(図1に示されるように)「変数(varyings)」とも呼ばれる。)
【０１３６】
本実施形態では、各属性は、シェーダコンパイラにより頂点インデックスを割り当てられる。
【０１３７】
頂点シェーダ20は、描画呼び出し記述子24に基づいて、入力であるプライマリ属性値を処理して、出力である頂点シェーティングされた所望のセカンダリ属性値を生成する。当技術分野で知られているように、各頂点シェーダ出力の(セカンダリ)属性は、1つまたは複数の頂点シェーダ入力の(プライマリ)属性に依存しうる。各頂点シェーダ出力の(セカンダリ)属性は、1つまたは複数の描画呼び出し毎の入力(所与の描画呼び出しに対し一定になる)にも依存しうる。
【０１３８】
特定の描画呼び出しに対し、各々のプライマリ(頂点シェーダ入力)属性は、描画呼び出しの各頂点に対し1つの値を有し、または、インスタンス化された描画の場合、各頂点または各インスタンスのいずれかに対して1つの値を有する。セカンダリ属性(頂点シェーダ出力属性)は、各々の別の頂点/インスタンスの組合せに対し、1つの値を有する。
【０１３９】
(当技術分野で知られているように、「インスタンス化されたモード」の動作の場合、所与の頂点が、その頂点の各々の必要な「インスタンス」について1回、複数回処理されてもよい。この場合、例えば、対象の頂点の特定のインスタンスに対して、頂点シェーダが、頂点属性を処理する時に、そのインスタンスに関連する入力属性値を用いることがありうる。)
【０１４０】
したがって、値が特定の「インスタンス」について定義される、頂点シェーダへのいくつかの入力変数(プライマリ属性)とともに、値が「頂点毎」に定義されるプライマリ属性が存在しうる。
【０１４１】
頂点シェーダの所与の出力属性(セカンダリ属性)は、値が各頂点に対して定義される(頂点毎に定義される)1つまたは複数の入力属性(プライマリ属性)にのみ依存してもよく、または、値が各インスタンスに対して定義される(インスタンス毎に定義される)1つまたは複数の入力属性(プライマリ属性)にのみ依存してもよく、または、値が各頂点に対して定義される1つまたは複数の頂点毎の入力属性(プライマリ属性)と、値が各インスタンスに対して定義される1つまたは複数のインスタンス毎の入力属性(プライマリ属性)との両方に依存してもよい。上で論じられたように、1つまたは複数の頂点シェーダ入力属性(プライマリ属性)への依存性に加えて、頂点シェーダ出力属性(セカンダリ属性)は、1つまたは複数の描画呼び出し毎の入力にも依存しうる。セカンダリ属性も、一定でありうる(一定値を有しうる)。
【０１４２】
属性値は、属性アレイと呼ばれるメモリバッファに格納され、属性アレイは、本実施形態において、頂点インデックスとインスタンスインデックスのいずれかにより、または、出力である折りたたまれていないインデックスにより、インデックスを付けられる(このことは以下でさらに論じられる)。
【０１４３】
したがって、図1で示されるように、入力の(プライマリ)属性値(対象の描画呼び出しの各頂点シェーダ入力属性に対する値)は、プライマリ属性アレイ(頂点バッファ)26に格納される。
【０１４４】
当技術分野で知られているように、プライマリ属性値(頂点シェーダの入力属性に対する値)は、グラフィックス処理を必要とするアプリケーションにより生成され、かつそれに由来し、グラフィックス処理システムが用いるプライマリ属性アレイ(頂点バッファ)26内に適切に格納される。
【０１４５】
プライマリ属性アレイにおけるプライマリ属性値(頂点シェーダ入力属性値)のレイアウトと、プライマリ属性値がどのように1つまたは複数のメモリバッファに分布しているかは、(グラフィックス処理を動作させている)アプリケーションにより決定され制御される。本実施形態では、プライマリ属性値は、頂点毎またはインスタンス毎に定義されているかどうかにしたがって、例えば以下のように、例えば2つのバッファにインターリーブすることができる。
プライマリ属性バッファ1:
-頂点0に対する属性0の値
-頂点0に対する属性1の値
-頂点1に対する属性0の値
-頂点1に対する属性1の値
など。
プライマリ属性バッファ2:
-インスタンス0に対する属性2の値
-インスタンス0に対する属性3の値
-インスタンス1に対する属性2の値
-インスタンス1に対する属性3の値
など。
【０１４６】
このアレイの中の値を読み取るために、頂点毎に定義された値またはインスタンス毎に定義された値の開始位置を表すバッファ基本アドレスが用いられ(属性が頂点に対して定義されるかインスタンスに対して定義されるかどうかに応じて)、関連する頂点インデックスまたはインスタンスインデックスが、その基本アドレスから所望の属性値にインデックスを付けるのに用いられる。(この処理は以下でより詳細に論じられる。)
【０１４７】
各属性に異なるメモリバッファを用いること(すなわち、各属性が他の属性とは別の固有のメモリバッファを有するように)などの、他の構成が所望ならば可能である。本発明は、全てのそのような構成をサポートする。
【０１４８】
したがって、頂点シェーダ20の出力(頂点シェーディングされた出力の(セカンダリ)属性値)は、出力のセカンダリ属性アレイ28に格納される。
【０１４９】
セカンダリ属性アレイ28内のセカンダリ属性値(頂点シェーダの出力の値)のレイアウトは、グラフィックスプロセッサのためのドライバにより決定され制御される。やはりこの実施形態でも、キャッシュ性能の向上を実現するために、属性値は、1つのメモリバッファ(セカンダリ属性アレイ28)にインターリーブされる。
【０１５０】
以下でさらに論じられるように、本実施形態では、セカンダリ属性値は、自身が依存する頂点シェーダ入力の(プライマリ)属性の性質(および具体的には、セカンダリ属性値が頂点毎に決まる入力属性にのみ依存するか、インスタンス毎に決まる入力属性にのみ依存するか、または、頂点毎とインスタンス毎の両方に決まる頂点シェーダ入力属性に依存するか)にしたがって、セカンダリ属性アレイ28内でグループ化される。
【０１５１】
したがって、頂点毎にのみ決まるプライマリ属性のみに依存する全てのセカンダリ属性値は、ある特定のバッファ基本アドレスで開始し、対応する入力属性値の頂点インデックスによりそのアドレスに関してインデックスが付けられた状態で、一緒にグループ化され、インスタンス毎にのみ決まるプライマリ属性のみに依存する全てのセカンダリ属性値は、ある特定のバッファ基本アドレスで開始し、対応する入力属性値のインスタンスインデックスによりそのアドレスに関してインデックスが付けられた状態で、一緒にグループ化され、頂点毎とインスタンス毎の両方に決まるプライマリ属性に依存する全てのセカンダリ属性値は、ある特定のバッファ基本アドレスで開始し、対応する入力属性値の頂点/インスタンスの組合せにより(以下でさらに論じられるように、「折りたたまれていない」インデックスにより)そのアドレスに関してインデックスが付けられた状態で、一緒にグループ化される。
【０１５２】
また、このアレイ内の値を読み取るために、頂点毎にインデックスが付けられた値のセット、またはインスタンス毎にインデックスが付けられた値のセット、または頂点/インスタンスの組合せにインデックスが付けられた値のセットの開始位置を表す適切なバッファ基本アドレスが用いられ(属性が頂点に対して定義されるか、インスタンスに対して定義されるか、または頂点/インスタンスの組合せに対して定義されるかに応じて)、関連する頂点インデックス、インスタンスインデックス、または組み合わされた頂点/インスタンスインデックスが、その基本アドレスから所望の属性値にインデックスを付けるのに用いられる。(この処理は以下でより詳細に論じられる。)
【０１５３】
本実施形態では、頂点シェーダ20の各属性(プライマリおよびセカンダリ属性)は、関連する「属性記述子」を有する。
【０１５４】
各属性記述子は以下のフィールドを含む。
-属性の値を含んでいる、バッファのメモリアドレス。(全てのインターリーブされ共通にインデックスが付けられた属性値のバッファアドレスが、同じメモリバッファを指すように設定される。これが上で言及されたバッファ基本アドレスである。)
-バッファ内への第1の「インデックス」エントリの属性の値に対する、バッファへのオフセット。(すなわち、第1の頂点に対し、属性値が頂点毎にインターリーブされる場合(この場合、各属性に対するオフセットは、対象の頂点のその属性の値(データ)を見つけるべき各頂点のデータブロックへの、オフセットである)には頂点0であり、第1のインスタンスに対し、属性値がインスタンス毎にインターリーブされる場合、インスタンス0である、などである。)
-あるインデックスが付けられたエントリ(例えば頂点)の属性の値から次のインデックスが付けられたエントリ(例えば頂点)の属性の値へのメモリ内の距離である、ストライド。(インターリーブされた属性値のストライドは、したがって、所与のインデックスが付けられたエントリ(頂点またはインスタンスまたは頂点/インスタンスの組合せ)の全ての属性値のサイズの合計(すなわち各属性のデータのサイズの合計)に設定される。このことは、以下で説明される格納タイプフィールドから推測されうる。)
-属性値に対する格納タイプ(コンポーネントのデータタイプおよびコンポーネントの数を示す)。ロード命令および格納命令が、属性記述子で規定されるデータタイプに基づいて、データフォーマット変換を好ましくは実行する。
-属性アレイタイプ(線形、除数またはモジュロ)。以下でさらに説明される。
-除数属性アレイタイプ(除数属性)の場合、除数値。
-モジュロ属性アレイタイプ(モジュロ属性)の場合、モジュロ値
-除数属性またはモジュロ属性の場合、書き込み削減フラグ。
(除数属性およびモジュロ属性は以下でさらに論じられる。)
【０１５５】
属性記述子は、対応する属性インデックスによりインデックスが付けられる、属性記述子アレイにグループ化される。頂点シェーダ入力の(プライマリ)属性の属性記述子は、プライマリ属性記述子アレイ25に格納され、頂点シェーダ出力の(セカンダリ)属性の属性記述子は、セカンダリ属性記述子アレイ27に格納される。属性記述子は、描画呼び出し時にグラフィックスプロセッサドライバにより生成される。
【０１５６】
任意の所与のシェーダプログラムに関して、一定数の頂点シェーダ入力の(プライマリ)属性および出力の(セカンダリ)属性(変数)が存在し、それに応じて、任意の特定のシェーダプログラムに対して、所与の描画呼び出しに対して描かれる頂点およびインスタンスの数とは独立にかつ関係なく、一定数の属性記述子が存在する(したがって属性記述子アレイは一定のサイズを有する)。
【０１５７】
本実施形態の動作において、グラフィックス処理を必要とするアプリケーションが開始されると、関連するシェーダプログラムが最初にコンパイルされる。
【０１５８】
したがって、頂点シェーダコンパイラは、頂点シェーダ20のための適切なコマンドのセットを生成し、頂点シェーダ20に所望の方式でプライマリ属性値を処理させるように、実行される。この処理の一部として、頂点シェーダコンパイラは頂点シェーダ20のための適切な属性ロード命令および属性格納命令を生成し、頂点シェーダにそれぞれ、処理のための関連するプライマリ属性値を、プライマリ属性アレイ26からロードさせ、生成されたセカンダリ属性値をセカンダリ属性アレイ28内に格納させる。
【０１５９】
同様に、フラグメントシェーダなどもコンパイルすることになるので、それにしたがって、属性(変数)ロード命令はとりわけ、フラグメントシェーダ22のために生成される。
【０１６０】
本実施形態では、同様の形態の属性ロード命令および属性格納命令が、頂点シェーダ20とフラグメントシェーダ22の両方に用いられる。シェーダに提供されるそのような属性ロード命令および属性格納命令の各々は、関連する属性記述子がどの(プライマリまたはセカンダリ)属性記述子アレイから読み取られるべきかということと、関連する属性記述子を取り出すことを可能にするインデックスと、属性値自体のためのメモリアドレスを決定する際に用いられることになる1つまたは複数のインデックスとを、以下の複数の情報へのアクセスを有することによって、示す。
-プライマリ属性記述子アレイを用いるか、セカンダリ属性記述子アレイを用いるかを示す、アレイセレクタ。これは、命令に符号化される。
-属性インデックス(すなわち上で論じられるように、対象の属性のインデックス)。これは、命令に符号化されてもよく、または命令に符号化された値でもよく、さらにはレジスタ内の値であってもよい。
-折りたたまれていない1つまたは複数のインデックス。
【０１６１】
属性ロード命令および属性格納命令に用いられる折りたたまれていないインデックスは、対象の属性値が関連するそれぞれの頂点およびインスタンスの頂点インデックスおよびインスタンスインデックス(もしあれば)から、以下のように導出される。
折りたたまれていないインデックス = (頂点インデックス) + (インスタンスインデックス) × (詰め込まれたインスタンスサイズ)
この式における詰め込まれたインスタンスサイズは、インスタンス毎の頂点の数よりも大きいかそれと等しい値であるが、以下でさらに論じられるように、詰め込まれたインスタンスサイズについてのモジュロ演算をハードウェアで実行するのを効率的にするような、ある値にも設定される。
【０１６２】
頂点シェーダ20は上の式を用いて、自身が直接用いることになる折りたたまれていないインデックスを、対象の頂点シェーダスレッドの頂点インデックスおよびインスタンスインデックスから、導出する。(頂点シェーダ動作について、描画呼び出し記述子は、シェーディングおよびタイルすべき頂点およびインスタンスの数を含み、頂点シェーダスレッドは、各頂点/インスタンスの組合せに対して実行され、各スレッドは、その頂点インデックスおよびインスタンスインデックスを内部で知る。)
【０１６３】
フラグメントシェーダの動作の場合、以下でさらに論じられるように、タイラ21が、上の式を用いて折りたたまれていないインデックスを計算し、そのインデックスを(対象の頂点の)ポリゴンリスト30に書き込む。そして、フラグメントシェーダは、ポリゴンリスト30から直接折りたたまれていないインデックスを読み取る。
【０１６４】
この形態の折りたたまれていないインデックスを用いることで、以下の事実を簡単に考慮することができる、インデックスの形態が得られる。その事実とは、インスタンス化されたモードの動作は事実上、頂点毎の各属性に対して1つの値またはインスタンス毎の各属性に対して1つの値を含む入力属性値(プライマリ属性アレイ)を、頂点毎およびインスタンス毎に(すなわち異なる頂点とインスタンスの組合せの各々に対して)1つの属性値(セカンダリ属性値)を含まなければならない、出力である頂点シェーディングされた属性値アレイ(セカンダリ属性アレイ)に、「分解し」または「展開する」ということである。
【０１６５】
さらに、この折りたたまれていないインデックス値を用いて、詰め込まれたインスタンスサイズに等しいモジュロ値によるモジュロ演算を実行することで、入力属性値の元の入力頂点インデックスを導出することができる。同様に、入力属性値の元の入力インスタンスインデックスは、詰め込まれたインスタンスサイズに等しい除数値を用いて除算を実行することによって、導出されうる。したがって、このことは、入力頂点インデックスまたはインスタンスインデックスを、属性ロード命令または属性格納命令に用いられる折りたたまれていないインデックスから比較的簡単に導出できるということを意味する。したがって、この構成は、フラグメントシェーダ22に提供される出力インデックス22もまた、フラグメントシェーダにより用いられ、(以下でさらに論じられるように)必要な場合には適切な入力頂点インデックスまたはインスタンスインデックスに戻ることができるという利点を有する。
【０１６６】
折りたたまれていないインデックスからの、適切な入力頂点インデックスまたはインスタンスインデックスの導出が必要である時に、それを開始するために、(上で言及されたような)2つの特別な種類の属性記述子が用いられる。
i)属性アレイにインデックス付ける前に、折りたたまれたインデックスを、属性記述子で与えられる値により割る、除数属性。除数値dは、3つの数r、p、およびqにより表され、以下のように計算される。
r = floor(log2(d))
f0 = 2r+32 + floor(d/2)
fi = floor(f0/d)
ff = f0 - fi*d
p = fi - 231
q = (ff > floor(d/2)) ? 1 : 0
であり、インデックスuに対する除算は以下のように計算される。
i = (u + q) * (p + 231) / 2r+32
(この形態の除数値を用いることで、完全に汎用的な除算よりも簡単な除算回路を用いることが可能になる。)
ii)属性アレイにインデックス付ける前に、折りたたまれたインデックスのモジュロ演算を、属性記述子で与えられる値により実行する、モジュロ属性。モジュロ値(すなわち詰め込まれたインスタンスサイズ、Spi)は、以下の形態を有する。
Spi = (2p+1) * 2r  ここでpは0、1、2、3または4
(この形態のモジュロ値を用いることで、完全に汎用的なモジュロ演算よりも簡単なモジュロ演算回路を用いることが可能になる。)
【０１６７】
上で論じられたように、属性が除算属性であるか(この場合、属性アレイにインデックス付ける前に、折りたたまれたインデックスを、属性記述子で与えられる値により割らなければならない)、またはモジュロ属性であるか(この場合、属性アレイにインデックス付ける前に、提供される折りたたまれたインデックス値のモジュロ演算を、属性記述子で与えられる値により実行しなければならない)の表示が、対象の属性の関連する属性記述子に、関連する除数値またはモジュロ値(すなわち、この場合詰め込まれたインスタンスサイズ)とともに含まれる。
【０１６８】
インスタンス化のためのAPI機構により、インスタンス毎の入力が、特定の属性のインスタンスインデックスに対するさらなる除数値を有することができるようになる場合、そのさらなる除数は、それらの属性の除数値に単に乗算されうる。その場合、属性記述子は、用いられることになる適切な除数値を示さなければならない。
【０１６９】
そのような属性ロード命令または属性格納命令に応答して、シェーダはまず、命令により示される属性インデックスにより示されるインデックスにおいて、命令内のアレイセレクタで示される(プライマリまたはセカンダリ)アレイから属性記述子を読み取る。
【０１７０】
そしてシェーダは、(ロード命令に対しては)用いることになる属性値を読み取るべきメモリの位置(アドレス)を、または、(格納命令に対しては)生成された属性値を格納すべきメモリの位置(アドレス)を決定する。このことは、命令により示される折りたたまれていないインデックスと、読み取られた属性記述子の中の、バッファアドレスと、属性アレイタイプと、オフセットおよびストライドと、(関連があれば)除数値またはモジュロ値とを用いて行われる。
【０１７１】
そして、ロードすべき属性値(データ)のメモリアドレスは、以下のように導出される。
属性値のアドレス = (バッファアドレス) + オフセット + (ストライド×インデックス)
【０１７２】
上の式のバッファアドレス、ストライドおよびオフセットは、上で論じられたように、関連する属性記述子で与えられる。
【０１７３】
上で論じられたように、インデックスは、必要に応じて、折りたたまれていないインデックス、頂点インデックス、またはインスタンスインデックスであり、属性記述子で示される属性アレイタイプにしたがって決定される。線形属性については、用いるべきインデックスは折りたたまれていないインデックスであるが、除数属性については、上の除算は、折りたたまれていないインデックスからインスタンスインデックスを導出するために用いられ、モジュロ属性については、上のモジュロ演算は、折りたたまれていないインデックスから頂点インデックスを導出するために用いられる。
【０１７４】
属性格納命令は同じように動作するが、シェーダは、決定されたアドレスにデータを格納するように動作する。
【０１７５】
したがって、例えば、頂点シェーダ20が適切な属性ロード命令を実行して頂点シェーダ入力属性値を処理する場合、頂点シェーダは、属性ロード命令のアレイセレクタフィールドから読み取られることになる属性記述子アレイを識別する(この場合、アレイセレクタフィールドはプライマリ属性記述子アレイを示す)。次いで、頂点シェーダは、属性ロード命令中の属性インデックスを用いて、プライマリ属性記述子アレイ25から、対応するプライマリ属性記述子を読み取る。そして、頂点シェーダは、プライマリ属性記述子内の関連する情報を折りたたまれていないインデックスとともに用いて、処理されることになる適切な頂点シェーダ入力の(プライマリ)属性値を取り出す。
【０１７６】
(上で論じられたように、プライマリ属性アレイ中の入力の(プライマリ)属性値は、頂点インデックスまたはインスタンスインデックスのいずれかを用いて、頂点シェーダ20によりアクセスされる。インスタンスインデックスは、インスタンス毎に定義される入力の(プライマリ)属性値を取り出すために用いられ、頂点インデックスは、頂点毎に定義される入力の(プライマリ)属性値を取り出すために用いられる。)
【０１７７】
同様に、以下でより詳細に論じられる特定の場合を除き、頂点シェーダ20が入力の(プライマリ)属性値を処理すると、頂点シェーダは、対応する属性格納命令(およびセカンダリ属性記述子アレイ27の中の関連するセカンダリ属性記述子内の情報)により示されるセカンダリ属性アレイ28に、自身の出力、すなわち生成されたセカンダリ属性値を格納する。
【０１７８】
本実施形態において、グラフィックス処理システムの基本的なコンパイル動作は、2つの特別な場合の頂点シェーディング動作を考慮するように調整される。
【０１７９】
第1に、頂点シェーダコンパイラは、頂点シェーダコードをコンパイルする時に、出力属性が頂点シェーダ入力属性からの直接のコピーであるかどうかを、各頂点シェーダ出力属性(セカンダリ属性)に対して判定する(すなわち、頂点シェーダ出力属性の値が入力属性の値の直接のコピーになる「通りぬけ」の状況を識別する)ように構成される。このことは、例えば、頂点シェーダ入力属性(第1の属性)がテクスチャ座標である場合に起こりうる。
【０１８０】
出力属性が頂点シェーダ入力属性からの直接のコピーであると判定された場合、頂点シェーダコンパイラは、コピー動作を行うためのコードを省略し、代わりに、特定の頂点シェーダ出力の(セカンダリ)属性が特定の頂点シェーダ入力の(プライマリ)属性の直接のコピーであるということと、どの頂点シェーダ入力の(プライマリ)属性のコピーであるかということとを、頂点シェーダコードと関連するメタ情報に記録する。
【０１８１】
上で論じられたように、本実施形態において、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる状況を識別するための機構は、慎重な結果を与えるように、すなわち「誤りが起きても安全な側に起こす」ように構成され構築される。したがって、本実施形態における構成では、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなる状況を認識する際のあらゆる誤りが、システムが、実際には「通りぬけ」の状況ではない場合に「通りぬけ」の状況が存在すると判定するのではなく、実際には「通りぬけ」の状況である場合にそのように判定しないような誤りとなるべきである。
【０１８２】
したがって上で論じられたように、「通りぬけ」の属性または状況が識別された(すなわち、頂点シェーダ出力属性値が頂点シェーダ入力属性値のコピーとなると判定された)場合に、本実施形態の動作に具体的に言及することは、システム、例えばコンパイラが、「通りぬけ」の状況を識別したという状況を指す。
【０１８３】
第2に、頂点シェーダコンパイラは、頂点シェーダの各出力属性(各々のセカンダリ属性)がどの頂点シェーダ入力の(プライマリ)属性に依存するかも、メタ情報に記録する。
【０１８４】
本実施形態では、頂点シェーダ出力属性が依存する頂点シェーダ入力属性を識別するための機構は、慎重な結果を与えるように、すなわち「誤りが起きても安全な側に起こす」ように構成され構築される。したがって、その構成では、頂点シェーダ出力属性が依存する頂点シェーダ入力属性を識別する際のあらゆる誤りが、システムが、出力属性が実際に入力属性に依存している場合にその依存性を見逃すのではなく、実際には頂点シェーダ出力属性が頂点シェーダ入力属性に依存していない場合に、何らかの頂点シェーダ入力属性に依存するものと結論付ける(判定する)(すなわち、実際の依存性の上位集合である入力属性の依存性の所定のセットを与える)ようなものでなければならない。
【０１８５】
したがって、頂点シェーダ出力属性が頂点毎またはインスタンス毎に定義される頂点シェーダ入力属性にのみ依存するものとして識別された場合に、本実施形態の動作に具体的に言及することは、システムがそのような状況(そのような頂点シェーダ出力属性)を識別したという状況を指すことに、ここで留意されたい。同様に、所与の頂点シェーダ出力属性の、所与の頂点シェーダ入力属性への依存性の言及は、別段文脈から要求されない限り、本実施形態のシステム(例えばコンパイラ)により識別されたような依存性を指す。
【０１８６】
第3に、シェーダリンカ動作は、特定の頂点シェーダ出力の(セカンダリ)属性が特定の頂点シェーダ入力の(プライマリ)属性である(すなわち「通りぬけ」属性が存在する)ことを示す、頂点シェーダコードに関連するメタ情報を見た時に、ラスタライザ/フラグメントシェーダ22にセカンダリ(頂点シェーダ出力)属性値を読み取らせる代わりに適切なプライマリ(頂点シェーダ入力)属性値を読み取らせるように、フラグメントシェーダのコードを修正するように、構成される。(当技術分野で知られているように、シェーダリンカは事実上、頂点シェーダの全ての出力をフラグメントシェーダの対応する入力と適合させるように動作する。この動作は、本実施形態では、頂点シェーダからのメタ情報が「通りぬけ」の属性が存在することを示す場合、代わりに、フラグメントシェーダ入力を頂点シェーダ入力(すなわち、「通りぬけ」メタ情報により規定される頂点シェーダ入力)に接続するように修正される。)
【０１８７】
これを行うために、シェーダリンカは、「通りぬけ」属性が存在することを示す頂点シェーダコンパイラからのメタ情報を見ると、ラスタライザ/フラグメントシェーダ22のための適切なロード命令内にアレイセレクタフィールドを設定し、ラスタライザ/フラグメントシェーダ22が、セカンダリ属性記述子アレイ27(すなわち、頂点シェーダの出力属性記述子アレイ)からではなくプライマリ属性記述子アレイ25(すなわち、頂点シェーダの入力属性記述子)から読み取るべきであるということを示すように、フラグメントシェーダのコードを修正し、通りぬけ属性のコピー元のプライマリ(入力)属性を示すように、命令中の属性インデックスを変更する。
【０１８８】
言い換えると、シェーダリンカは、属性ロード命令中にアレイセレクタフィールドおよび属性インデックスを適宜設定することによって、(すなわち、「通りぬけ」属性のコピー元のプライマリ属性記述子アレイおよびプライマリ(入力の)属性を示すために)、関連するプライマリ属性記述子をフラグメントシェーダに読み取らせるように、フラグメントシェーダ属性ロード(変数ロード)命令を修正する(これにより、プライマリ属性アレイ中の関連するプライマリ属性値を読み取るようにフラグメントシェーダが動作させられる)。
【０１８９】
シェーダプログラムがコンパイルされる(必要ならばリンカによって修正される)と、グラフィックス処理を必要とするアプリケーションは、適切なインデックスをインデックスバッファ23にロードし、頂点属性値を頂点バッファ(プライマリ属性アレイ)26にロードする。これは、必ずしも各描画呼び出しの直前ではないが、対象のインデックスおよび属性値を用いて、任意の描画呼び出しよりも前に行われる。アプリケーションはまた、どのバッファから描くべきか、どのシェーダをどれだけ用いるかなどのような、描画呼び出しの全てのパラメータを、グラフィックスAPIを介して規定する。
【０１９０】
次いで、グラフィックスプロセッサのドライバは、対象の描画呼び出しのための描画呼び出し記述子および関連する属性記述子(これは以下でより詳細に論じられる)を生成し、これらをグラフィックスプロセッサに渡す。
【０１９１】
上で論じられたように、本実施形態では処理の一部として、グラフィックス処理のためのドライバが、対象の描画呼び出しの描画呼び出し記述子に基づいて、必要なプライマリおよびセカンダリ属性記述子を生成し格納する。このことは、入力の(プライマリ)属性の頂点毎またはインスタンス毎の依存性状態が各描画呼び出しのためのアプリケーションにより特定されるので、描画呼び出し時に行われる。
【０１９２】
したがって、プライマリ属性について、ドライバは、描画呼び出しの各々のプライマリ属性に対し属性記述子を生成し、頂点シェーダおよび他のグラフィックス処理段階(シェーダなど)が、上で説明された機構を用いて関連するプライマリ属性値にアクセスできるようにする。
【０１９３】
頂点毎に決まるプライマリ(入力の)属性(すなわち、値が頂点毎に定義されるプライマリ属性)は、ドライバによって(関連する属性記述子において)モジュロ属性として定義され、この時モジュロ値は詰め込まれたインスタンスサイズに等しく、インスタンス毎に決まるプライマリ(入力の)属性(すなわち、値がインスタンス毎に定義されるプライマリ属性)は除数属性として定義され、この時除数値は詰め込まれたインスタンスサイズに等しい。(所望ならば、インスタンス毎に決まるプライマリ属性は除数属性として定義されてもよく、この時除数値は、任意の定義されたインスタンス除数により乗算された詰め込まれたインスタンスサイズに等しい。この場合、インスタンス除数毎に1つのプライマリ属性値バッファが必要とされる(一方、詰め込まれたインスタンスサイズのみが用いられる場合、全てのインスタンス毎の入力に対して1つのバッファのみで十分である)。)
【０１９４】
同様に、ドライバは、描画呼び出しに対して生成されることになる各々のセカンダリ属性について、セカンダリ属性記述子を生成し、頂点シェーダがセカンダリ属性値を格納できるようにして、他のシェーダなどが、上で説明された機構を用いて、セカンダリ属性値にアクセスできるようにする。
【０１９５】
これを行うために、生成されることになるそれぞれの頂点シェーダ出力の(セカンダリ)属性の各々に対して、ドライバは、描画呼び出し時にその出力属性に影響する頂点シェーダ入力の(プライマリ)属性(頂点シェーダコンパイラにより記録されている)を調べ、出力の(セカンダリ)属性に対する全ての頂点シェーダ入力の(プライマリ)属性が、頂点毎に定義されるのか、インスタンス毎に定義されるのか、またはこれら2つの混合なのかを判定する。(言い換えると、ドライバは、描画呼び出し時に全ての頂点シェーダ出力属性を調べ、頂点シェーダ出力属性がどのような種類の頂点シェーダ入力の(プライマリ)属性に依存するかに基づいて、すなわち、頂点シェーダ出力属性が頂点毎に定義された入力属性にのみに依存するか、インスタンス毎に定義された入力属性にのみ依存するか、頂点毎とインスタンス毎の両方で定義された入力属性に依存するか、または頂点シェーダ入力属性に全く依存しない(すなわち定数である)かに基づいて、各々の出力の(セカンダリ)属性を分類する。)
【０１９６】
次いで、ドライバはそれにしたがって、各々のセカンダリ属性(頂点シェーダ出力属性)について、適切なセカンダリ属性記述子をセカンダリ属性記述子アレイ27に書き込む(格納する)。
【０１９７】
頂点シェーダ出力属性(セカンダリ属性)が、頂点毎とインスタンス毎の両方で定義された頂点シェーダ入力属性に依存する場合、ドライバは、セカンダリ属性記述子アレイ27にセカンダリ属性記述子を格納し、このセカンダリ属性記述子は、線形属性を示し、(すなわち、頂点シェーダ出力属性が依存する入力の頂点/インスタンスの組合せに基づいて)折りたたまれていない出力インデックスを用いてインデックスが付けられたセカンダリ属性アレイ28内の属性値(すなわちそのバッファアドレスを含む)をポイントする。
【０１９８】
頂点シェーダ出力属性(セカンダリ属性)が、頂点毎にのみ決まる(定義される)頂点シェーダ入力の(プライマリ)属性に依存する場合、ドライバは、セカンダリ属性記述子アレイ27にセカンダリ属性記述子を格納し、このセカンダリ属性記述子は、詰め込まれたインスタンスサイズに等しいモジュロ値を有するモジュロ属性を示し、頂点毎にインデックスが付けられたセカンダリ属性アレイ28の一部(すなわちそのバッファアドレスを含む)をポイントする。
【０１９９】
頂点シェーダ出力属性(セカンダリ属性)が、インスタンス毎にのみ決まる(定義される)頂点シェーダ入力の(プライマリ)属性に依存する場合、ドライバは、セカンダリ属性記述子アレイ27にセカンダリ属性記述子を格納し、このセカンダリ属性記述子は、詰め込まれたインスタンスサイズに等しい除数値を有する除数属性を示し、インスタンス毎にインデックスが付けられたセカンダリ属性アレイ28の一部(すなわちそのバッファアドレスを含む)をポイントする。(やはり、所望ならば、インスタンス毎にのみ定義される頂点シェーダ入力属性に依存するセカンダリ属性は、任意の定義されたインスタンス除数により乗算された詰め込まれたインスタンスサイズに等しい除数値を有する除数属性を用いることができる。この場合、インスタンス除数毎に1つの第2のバッファが必要とされる(一方、詰め込まれたインスタンスサイズのみが用いられる場合、全てのインスタンス毎の出力に対して1つのバッファのみで十分である)。)
【０２００】
したがって、頂点毎にのみ定義される頂点シェーダ入力属性にのみ依存する出力の(セカンダリ)属性はモジュロ属性として定義され、インスタンス毎にのみ定義される頂点シェーダ入力属性にのみ依存する出力の(セカンダリ)属性は除数属性として定義される。
【０２０１】
当技術分野で知られているように、所与の頂点シェーダ出力属性は、1つまたは複数の頂点シェーダ入力属性に依存するとともに、1つまたは複数の描画呼び出し毎の入力にも依存してもよく、この入力は所与の描画呼び出しに対して一定であることにここで留意されたい。本発明は、頂点シェーダ出力属性が、頂点毎またはインスタンス毎に定義される頂点シェーダ入力属性に加えて、描画呼び出し毎の入力(描画呼び出しに対して定義される一定値)に依存する場合に、同様に用いることができる。したがって、本明細書で、頂点シェーダ出力属性が、頂点毎またはインスタンス毎に定義される入力属性にのみ依存すると言及することは、頂点シェーダ出力属性の依存する全ての頂点シェーダ入力属性が、頂点毎またはインスタンス毎にのみ定義される状況をそれぞれ指すことを意図しており、出力属性が、頂点毎またはインスタンス毎に定義される頂点シェーダ入力属性にのみ依存し他の何物にも依存しないことを要求することは意図されない(すなわち、頂点シェーダ出力属性が、描画呼び出し毎に定義される入力のような、頂点シェーダ入力属性ではない他の入力にも依存することを排除しない)。
【０２０２】
ドライバはまた、モジュロおよび除数のセカンダリ属性記述子の中に、以下の動作により「書き込み削減」フラグも含める。
モジュロ属性は、モジュロ値により除算された折りたたまれていないインデックス(丸め済み)が0である場合のみ、書き込みを実行する。これは、
u < Spi
と等価であり(Spiは詰め込まれたインスタンスサイズ)、折りたたまれていないインデックスがモジュロ値よりも大きくまたはそれと等しい場合、モジュロ属性は出力値を格納しないことを意味する。
除数属性は、折りたたまれていないインデックスの除数値に対する剰余が0である場合にのみ、書き込みを実行する。これは、
rem = 除算における最後のシフトからのシフトされたビット
lz = count_leading_zeros(rem)
condition : lz > r OR (lz == r AND q == 1)
と等価であり、折りたたまれていないインデックスが除数により除算できない場合、除数属性は出力値を格納しないことを意味する。
【０２０３】
動作において、頂点シェーダが属性格納命令を実行する時、上で論じられたように、頂点シェーダは、属性格納命令で示された対応するセカンダリ属性記述子を確認し、書き込み削減フラグが存在する場合は、上記のテストのうちの適切な1つを実行し(属性がモジュロ属性か除数属性かに応じて)、テストに通ると、適切な出力値を格納するが、テストに通らないと、格納動作を中止する。
【０２０４】
この結果、頂点毎のみの頂点シェーダ入力属性に依存する出力属性値は、インスタンス0に対してのみ書き込まれ、インスタンス毎のみの頂点シェーダ入力属性に依存する出力属性値は、頂点0に対してのみ書き込まれる。
【０２０５】
この効果として、頂点毎に定義される、またはインスタンス毎に定義される頂点シェーダ入力属性にのみ依存する、頂点シェーダ出力属性(セカンダリ属性)が識別される場合(すなわち、出力属性が依存する頂点シェーダ入力属性は、頂点毎にのみまたはインスタンス毎にのみ定義され、頂点シェーダ入力属性はまた、上で論じられたように、例えば描画呼び出し毎の入力に依存してもよい)(また上で論じられたように、「通りぬけ」の状況は存在しない)、頂点シェーダ20は、生成されることになる出力の(セカンダリ)属性値の各々の異なるバージョンの1つのみのコピーを格納するように動作する(すなわち、頂点シェーダは、出力の(セカンダリ)属性値が実際にどれだけのインスタンスまたは頂点にそれぞれ適用されるかに関係なく、必要に応じて、各々の異なる入力頂点または各々の異なる入力インスタンスについて、出力値の1つのコピーを格納する)。したがって、例えば、頂点毎のみの頂点シェーダ入力属性に依存する所与の頂点シェーダ出力値(セカンダリ属性値)を、複数のインスタンスに対して生成しなければならない場合でも、頂点シェーダ20は、頂点毎にその出力値(セカンダリ属性値)の1つのコピーのみを格納する。
【０２０６】
したがって、そのような出力値の各々は、セカンダリ属性アレイ28に一度だけ書き込まれる。
【０２０７】
頂点毎のみまたはインスタンス毎のみの頂点シェーダ入力属性に依存する出力属性値が、各頂点または各インスタンスに対してそれぞれ単一のコピーとして、セカンダリ属性アレイ28に格納されるという事実を考慮して、セカンダリ属性アレイ中のセカンダリ属性値は、上で論じられたように、依存関係(頂点毎、インスタンス毎、またはその両方)にしたがってグループ化される(そのような属性は(属性毎に)異なる数の属性値を有するため)。
【０２０８】
したがって、頂点毎のみの頂点シェーダ入力属性に依存する出力の(セカンダリ)属性値は、関連する頂点の頂点インデックスにしたがって、一緒にグループ化され((関連するセカンダリ属性記述子に含まれる)基本バッファアドレスに対して)インデックスが付けられる。同様に、インスタンス毎のみの頂点シェーダ入力属性に依存する出力の(セカンダリ)属性値は、関連するインスタンスのインスタンスインデックスにしたがって、一緒にグループ化され(基本バッファアドレスに対して)インデックスが付けられる。インスタンス毎および頂点毎の頂点シェーダ入力属性に依存する任意の出力の(セカンダリ)属性値も、上で論じられた折りたたまれていないインデックスにしたがって、一緒にグループ化され(基本バッファアドレスに対して)インデックスが付けられる。
【０２０９】
それにしたがって、セカンダリ属性記述子は、上で論じられた方式で(すなわち、各々のセカンダリ属性を、対応するバッファ基本アドレスを有する、線形属性、モジュロ属性または除数属性として定義するように)、グラフィックプロセッサドライバにより構成され、頂点シェーダが、自身が生成するセカンダリ属性値を適切な場所に格納し、フラグメントシェーダのような次のグラフィックス処理段階が、セカンダリ属性を処理しようとする時に、適切なセカンダリ属性値をロードすることを、確実にする。
【０２１０】
ドライバが適切な属性記述子を生成すると、次いで描画呼び出しを処理することができる。したがって、頂点シェーダは、上で論じられた手順に続き、頂点/インスタンスの各組合せに対するスレッドを起動し、適切な属性ロード命令を実行して処理のためのプライマリ属性値をロードし、属性格納命令にしたがって、生成されたセカンダリ属性を格納する。
【０２１１】
したがって、上で論じられたように、例えば、頂点シェーダ20が適切な属性ロード命令を実行して頂点シェーダ入力属性値を処理すると、頂点シェーダは、属性ロード命令中のアレイセレクタフィールドから読み取るべき属性記述子アレイを識別する(この場合、属性ロード命令はプライマリ属性記述子アレイを示す)。次いで、頂点シェーダは、属性ロード命令中の属性インデックスを用いて、対応するプライマリ属性記述子を、プライマリ属性記述子アレイ25から読み取る。そして、頂点シェーダは、プライマリ属性記述子中の関連する情報を折りたたまれていないインデックスとともに用いて、処理されるべき適切な頂点シェーダ入力の(プライマリ)属性値を取り出す。
【０２１２】
同様に、頂点シェーダ20が入力の(プライマリ)属性値を処理すると、頂点シェーダはその出力、すなわち生成されたセカンダリ属性値を、対応する属性格納命令(およびセカンダリ属性記述子アレイ27中の関連するセカンダリ属性記述子中の情報)で示される通りにセカンダリ属性アレイ28に格納する。
【０２１３】
頂点シェーダ20が全ての頂点を適切に頂点シェーディングすると、次いで、タイラ21が必要なポリゴンリストを生成し、ラスタライザ/フラグメントシェーダ22が用いる準備のできているポリゴンリストアレイ30にポリゴンリストを格納する。
【０２１４】
この処理の一部として、タイラ21は、各コーナ頂点に対して折りたたまれていないインデックスをポリゴンリスト30内に含める。
【０２１５】
上で論じられたように、ラスタライザ/フラグメントシェーダ22に提供するためのポリゴンリスト30に含まれるこの折りたたまれていないインデックスは、頂点シェーダ20への対応する頂点シェーダ入力の(プライマリ)属性値のためのプライマリ属性アレイ26内にインデックスを付けるのに用いられる、頂点インデックスおよびインスタンスインデックス(もしあれば)から(すなわち、プライマリ属性値が頂点シェーディングされた頂点のセカンダリ属性値を生成するのに用いられた、頂点およびインスタンスの頂点インデックスおよびインスタンスインデックスから)、タイラ21により導出(計算)される。
【０２１６】
インスタンス化されていないモードで実行することは、単にインスタンス「0」を描くこと(およびインスタンス毎の属性を全く有さないこと)と本質的に等価なので、グラフィックス処理システムがインスタンス化されたモードで動作していない場合でも、タイラ21は、上記のようにポリゴンリスト30に含まれる折りたたまれていないインデックスを生成するように動作し、したがって同じ出力インデックス生成機構を用いることができる(この場合、入力頂点インデックスに等しい折りたたまれていないインデックスを生成する)。
【０２１７】
タイラ21がポリゴンリスト30を準備すると、ラスタライザ/フラグメントシェーダ22は、適切にシェーディングされたフラグメントを生成して画像を表示できるようにするために、ポリゴンリストに対する操作を進める。
【０２１８】
これを行うために、通常の動作では、ラスタライザ/フラグメントシェーダ22は、受け取った属性(変数)ロード命令にしたがって、適切な頂点シェーディングされた出力の(セカンダリ)属性値を、セカンダリ属性値アレイ28からロードする。
【０２１９】
したがって、上で論じられたように、フラグメントシェーダ22が適切な属性ロード命令を実行して適切な属性値を処理すると、フラグメントシェーダ22は、属性ロード命令中の属性アレイ指示を用いて、プライマリ属性記述子アレイから読み取るか、またはセカンダリ属性記述子アレイから読み取るかを決定する。そして、フラグメントシェーダは、ロード命令中の属性インデックスを用いて、関連する属性記述子アレイ中の属性記述子を識別する。
【０２２０】
セカンダリ属性の場合、フラグメントシェーダ22はそれに応じて、提供された属性インデックスを用いて、適切なセカンダリ属性記述子をセカンダリ属性記述子アレイ27から取り出し、次いでセカンダリ属性記述子からの情報をポリゴンリスト中の関連する折りたたまれていないインデックスとともに用いて、適切な属性値(頂点シェーディングされた属性値)をセカンダリ属性アレイ28から取り出す。
【０２２１】
(当業者により理解されるように、フラグメントシェーダ22は、3つの頂点により定義されるポリゴン(ポリゴンは三角形である)内での具体的な位置を表すフラグメントを処理するので、フラグメントシェーダ22は、実際には、受け取った各々の属性ロード命令に対して、関連する属性記述子を1回読み取るが、残りのステップ(属性アレイ内にインデックスを付けるために用いるインデックスを導出し、属性値のアドレスを計算し、メモリから属性値をロードするステップ)は3回、すなわち現在のポリゴンの各頂点に対して1回実行し、3つのロードされた属性値(すなわち3つの頂点に対して格納された属性値)の間の補間を実行して、フラグメントシェーディング動作で用いられることになる実際の属性値を導出する。)
【０２２２】
「線形の」セカンダリ属性が存在する場合、ラスタライザ/フラグメントシェーダ22はそれに応じて、対象のセカンダリ属性が線形の属性であるということをセカンダリ属性記述子から判定し、ポリゴンリスト30からの関連する折りたたまれていないインデックス、ならびに属性記述子中のバッファアドレス、オフセットおよびストライドを用いて、適切なセカンダリ属性値をセカンダリ属性アレイ28から識別して取り出す。
【０２２３】
頂点毎またはインスタンス毎のみの定義された頂点シェーダ入力属性に依存するセカンダリ属性が存在する場合、ラスタライザ/フラグメントシェーダ22はそれに応じて、対象のセカンダリ属性が除数属性であるかモジュロ属性であるかをセカンダリ属性記述子から判定し、セカンダリ属性記述子により示される関連する除算またはモジュロ演算を、ポリゴンリスト30からの折りたたまれていないインデックス、ならびに属性記述子中のバッファアドレス、オフセットおよびストライドとともに用いて、適切なセカンダリ属性値をセカンダリ属性アレイ28から識別して取り出す。
【０２２４】
このようにして、ラスタライザ/フラグメントシェーダ22が、頂点毎またはインスタンス毎のみの頂点シェーダ入力属性に依存する適切な出力の(セカンダリ)属性値のコピーを用いる必要がある度に、ラスタライザ/フラグメントシェーダ22は、その出力の(セカンダリ)属性値の単一のコピーをセカンダリ属性アレイ28から取り出すように指示され、またそのようにすることができる。
【０２２５】
ロード命令が、プライマリ属性(頂点シェーダ入力属性)値がロードされるべきであることを示す(すなわち「通りぬけ」の状況が存在する)場合、フラグメントシェーダ22は属性インデックスを用いて、プライマリ属性記述子アレイ25内の対応する属性記述子を検索する。次いで、フラグメントシェーダは、属性が除数属性であるかモジュロ属性であるかということと、用いるべき適切な除数値またはモジュロ値を、その属性記述子から決定する。そして、フラグメントシェーダは、除数値またはモジュロ値を、(ポリゴンリスト30から)提供された折りたたまれていないインデックスとともに用いて、属性記述子中のバッファアドレス、オフセットおよびストライドとともに用いるべき頂点インデックスまたはインスタンスインデックスを計算し、関連する属性値をプライマリ属性(頂点シェーダ入力属性値)アレイ26から取り出す。
【０２２６】
当技術分野で知られているように、フラグメントシェーダ22は次いで、ロードした属性値を適切に処理し、対象の各フラグメントのための適切なフラグメントシェーディングされたデータ値を生成し、適切な場合には、例えば次に表示のためのフレームバッファへエクスポートするために、例えばタイルバッファ内にそのデータ値を格納する。
【０２２７】
上記のことから分かるように、本実施形態の属性記述子の機構は、シェーダコードと独立した属性値について、インデックス計算を表すこととメモリレイアウトを表すことの両方に用いられ、同じ機構が頂点シェーダからの入力および出力を制御するために用いられ、頂点シェーダおよびフラグメントシェーダの両方が、(描画時に何ら関わることなく通りぬけの属性が動作することを可能にする)同じ記述子へのアクセスを有する。
【０２２８】
さらに、本実施形態の方式のシェーダコードとは別の属性記述子を用いることで、同じシェーダコードを、属性記述子の異なるセットと用いることができるようにし、属性記述子により制御されるパラメータが変化する時にシェーダコードを変化させる必要のない手段を可能にする。
【０２２９】
図2から7は、本実施形態の動作を例示する。
【０２３０】
これらの図面において、長方形の箱はメモリ内のデータのアレイを示す。複数の箱が点線でつながれている場合、それらは同じアレイの一部である。複数の箱の間に空間がある場合、それらは異なるアレイである。
【０２３１】
角が丸い箱は、シェーダコードの実行を示す。頂点シェーディングについては、箱1つ当たり1つの実行が存在する。図の右側にあるシェーダ(これは通常フラグメントシェーダであるが、他の種類でもよい)については、頂点を2つ以上のポリゴンにより読み取ることができ、1つのポリゴンが多くのフラグメントを含みうるので、各箱に対して多くの実行が存在する。矢印は、シェーダによるデータの読み取りまたは書き込みを示す。
【０２３２】
図2は、インスタンス化されていない動作のための実施形態の動作を示す。図2Aは、「通りぬけ」の場合が識別されない状況を示し、図2Bは、「通りぬけ」の入力属性が識別された動作を示す。
【０２３３】
図2Aで示されるように、頂点シェーダ20は、各頂点の入力属性値をプライマリ属性アレイ26から読み取り、それらの属性値を処理して、出力である頂点シェーディングされた属性値としてセカンダリ属性アレイ28に格納し、各頂点の入力属性値は、セカンダリ属性アレイ28からフラグメントシェーダ22により読み取られ処理される。
【０２３４】
図2Bは、出力属性が「通りぬけ」の属性として識別された状況を示す。この場合、図2Bに示されるように、頂点シェーダ20はその「通りぬけ」の出力属性を処理しない。代わりに、フラグメントシェーダ22は、矢印35で示されるように、関連する属性値をプライマリ属性アレイ26から直接読み取る。(ここで、通りぬけの出力の(セカンダリ)属性のコピー元である入力の(プライマリ)属性は、他の出力の(セカンダリ)属性のために、すなわち、そのプライマリ属性も1つまたは複数の他の(通り抜けではない)セカンダリ属性の計算で必要とされる場合に、頂点シェーダによって読み取られ処理されうる。)
【０２３５】
図3から7は、インスタンス化されたモードで動作する時の本実施形態の動作を例示する。
【０２３６】
まず、図3は、「通りぬけ」または「頂点毎」または「インスタンス毎」の入力のみの場合が識別されない、インスタンス化されたモードの動作を例示する。(したがって、これは事実上、「通常の」インスタンス化されたモードの動作を示す。)
【０２３７】
この場合、図3に示されるように、入力の(プライマリ)属性アレイ26は2つのバッファとして編成され、1つは、値がインスタンス毎に定義された属性に対するバッファ40であり、もう1つは、値が頂点毎に定義された属性に対するバッファ41である。頂点シェーダ20は、これらの属性値バッファの両方から読み取り、事実上、両方の値を組み合わせて、各々の属性のためのセカンダリ(出力の)属性アレイ28内の各々の異なる頂点およびインスタンスの組合せに対する出力値を提供する。次いで、フラグメントシェーダ22は、必要に応じて、関連する頂点およびインスタンスの組合せの属性値を、セカンダリ属性アレイ28から読み取る。
【０２３８】
図4は、インスタンス毎の入力属性からの「通りぬけ」が存在する状況を示す。この場合、図4の矢印50により示されるように、識別された「通りぬけ」のインスタンス毎の属性は、頂点シェーダ20によっては処理されず、代わりに、フラグメントシェーダ22が、インスタンス毎の属性値を、必要になると、入力のインスタンス毎の属性バッファ40から(上で説明された除数属性の機構を用いて)直接読み取る。
【０２３９】
図5は、頂点毎の属性からの「通りぬけ」が存在する、対応する場合を示す。この場合、図5の矢印60により示されるように、識別された「通りぬけ」の頂点毎の属性は、頂点シェーダ20によっては処理されず、代わりに、フラグメントシェーダ22が、頂点毎の属性値を、必要になると、入力の頂点毎の属性バッファ41から(上で説明されたモジュロ属性の機構を用いて)直接読み取る。
【０２４０】
図6は、インスタンス毎に定義された頂点シェーダ入力属性にのみ依存する頂点シェーダ出力の(セカンダリ)属性が存在する状況を示す。この場合、図6に示されるように、頂点シェーダ20は、頂点0に対しては、矢印70で示されるように、関連する出力属性値のコピーを、セカンダリ属性アレイ28の適切なバッファ71に書き込み、インスタンス毎の入力にのみ依存する属性も処理されることになる他の頂点に対しては、頂点シェーダ20は、(図6の点線72で示されるように)対応する出力値をセカンダリ属性バッファ71に格納しない。こうして、セカンダリ属性値の1つだけのコピーが、セカンダリ属性アレイ28に格納される。
【０２４１】
そして、フラグメントシェーダ22がそのインスタンス毎の入力にのみ依存する出力属性を必要とする場合は常に、フラグメントシェーダは、矢印73により示されるように(上で説明された除数属性の機構を用いて)、適切なセカンダリ属性記述子を用いることによって、セカンダリ属性アレイ28のバッファ71内の関連する出力の(セカンダリ)属性値の適切な単一のコピーを読み取るように指示される。
【０２４２】
図7は、頂点毎に定義される頂点シェーダ入力属性にのみ依存する頂点シェーダ出力の(セカンダリ)属性が存在する、対応する状況を示す。この場合、図7に示されるように、頂点シェーダ20は、インスタンス0に対しては、矢印80で示されるように、関連する出力属性値のコピーを、セカンダリ属性アレイ28の適切なバッファ71に書き込み、頂点毎の入力にのみ依存する属性も処理されることになる他のインスタンスに対しては、頂点シェーダ20は、(図7の点線82で示されるように)対応する出力値をセカンダリ属性バッファ71に格納しない。こうして、セカンダリ属性値の1つだけのコピーが、セカンダリ属性アレイ28に格納される。
【０２４３】
そして、フラグメントシェーダ22がその頂点毎の入力にのみ依存する出力属性を必要とする場合は常に、フラグメントシェーダは、矢印83により示されるように(上で説明されたモジュロ属性の機構を用いて)、適切なセカンダリ属性記述子を用いることによって、セカンダリ属性アレイ28のバッファ71内の関連する出力の(セカンダリ)属性値の適切な単一のコピーを読み取るように指示される。
【０２４４】
上の図2から7は、本実施形態の基本的な動作のモードを示す。一般に、頂点シェーダ出力の(セカンダリ)属性は、上で示された異なる5つの場合(通常、頂点毎の通りぬけ、インスタンス毎の通りぬけ、頂点毎の書き込み削減、またはインスタンス毎の書き込み削減)の任意の組合せであってよい。
【０２４５】
出力の(セカンダリ)属性が一定である、第6の場合も存在する。この場合、一定であるセカンダリ属性の必要とされるコピーの各々が、別のセカンダリ属性値として格納されうる。代替として、1つの値だけのためのスペースを有するバッファ、およびモジュロ値が1である(書き込み削減を有する)モジュロ属性タイプを用いて、一定であるセカンダリ属性値の1つのみのコピーを格納できる(および格納させる)ようにすることができる(この場合、頂点0/インスタンス0のスレッドのみが一定値を格納する)。
【０２４６】
本実施形態では、プライマリならびにセカンダリ属性および属性記述子アレイなどが、別々のアレイであるものとして示されてきたが、そのような構成は必須ではなく、適切な属性記述子および属性値が使用の際に識別され取り出されることが可能であれば、そうしたデータ要素をメモリに格納するための実際の構成は、所望の通りであってよいことを、当業者は理解するだろう。例えば、入力および出力の(プライマリおよびセカンダリ)属性記述子の両方を格納する、単一の属性記述子アレイが存在してもよい。同様に、所望ならば、様々な属性記述子および属性値およびアレイは全て、同じメモリに格納されても異なるメモリに格納されてもよく、少なくとも一部などがキャッシュされてもよい。
【０２４７】
上記から、本発明は、少なくとも好ましい実施形態において、グラフィックス処理システムにおける頂点シェーダコアのメモリトラフィックおよびメモリ使用量(および、したがって消費電力)を低減する機構を提供することが理解されうる。
【０２４８】
このことは少なくとも、本発明の好ましい実施形態において、頂点シェーダ出力がいつ頂点シェーダ入力から直接コピーされるかを検出し、その状況では、コピーの出力値を生成してメモリに格納するのではなく、代わりに、フラグメントシェーダのようなグラフィックスパイプラインのさらなる段階が、頂点シェーダ入力値に直接アクセスできるようにすることで、実現される。
【０２４９】
好ましい実施形態では、自身が依存する頂点シェーダ入力属性が、頂点毎にのみまたはインスタンス毎にのみ定義される、頂点シェーダ出力(すなわち、頂点毎にのみ定義される頂点シェーダ入力属性またはインスタンス毎にのみ定義される頂点シェーダ入力属性に依存する頂点シェーダ出力)も識別され、そのような出力が識別される場合、そうした出力の各値の1つのコピーのみが格納され、フラグメントシェーダのような次のグラフィックス処理段階が、出力値が必要とされる各々の異なる時点で、出力値の単一のコピーを再利用するように、システムが構成される。
【符号の説明】
【０２５０】
20  頂点シェーダ
21  タイラ
22  ラスタライザおよびフラグメントシェーダ
23  インデックスバッファ
24  描画呼び出し記述子
25  プライマリ属性記述子アレイ
26  頂点バッファ
27  セカンダリ属性記述子アレイ
28  変数バッファ
29  位置バッファ
30  ポリゴンリストアレイ
【図１】
2012185820.tif 000003
【図２Ａ】
2012185820.tif 000004
【図２Ｂ】
2012185820.tif 000005
【図３】
2012185820.tif 000006
【図４】
2012185820.tif 000007
【図５】
2012185820.tif 000008
【図６】
2012185820.tif 000009
【図７】
2012185820.tif 000010
【外国語明細書】
2012185820.tif 000011
2012185820.tif 000012
2012185820.tif 000013
2012185820.tif 000014
2012185820.tif 000015
2012185820.tif 000016
2012185820.tif 000017
2012185820.tif 000018
2012185820.tif 000019
2012185820.tif 000020
2012185820.tif 000021
2012185820.tif 000022
2012185820.tif 000023
2012185820.tif 000024
2012185820.tif 000025
2012185820.tif 000026
2012185820.tif 000027
2012185820.tif 000028
2012185820.tif 000029
2012185820.tif 000030
2012185820.tif 000031
2012185820.tif 000032
2012185820.tif 000033
2012185820.tif 000034
2012185820.tif 000035
2012185820.tif 000036
2012185820.tif 000037
2012185820.tif 000038
2012185820.tif 000039
2012185820.tif 000040
2012185820.tif 000041
2012185820.tif 000042
2012185820.tif 000043
2012185820.tif 000044
2012185820.tif 000045
2012185820.tif 000046
2012185820.tif 000047
2012185820.tif 000048
2012185820.tif 000049
2012185820.tif 000050
2012185820.tif 000051
2012185820.tif 000052
2012185820.tif 000053
2012185820.tif 000054
2012185820.tif 000055
2012185820.tif 000056
2012185820.tif 000057
2012185820.tif 000058
2012185820.tif 000059
2012185820.tif 000060
2012185820.tif 000061
2012185820.tif 000062
2012185820.tif 000063
2012185820.tif 000064
2012185820.tif 000065
2012185820.tif 000066
2012185820.tif 000067
2012185820.tif 000068
2012185820.tif 000069
2012185820.tif 000070
2012185820.tif 000071
2012185820.tif 000072
2012185820.tif 000073
2012185820.tif 000074
2012185820.tif 000075
2012185820.tif 000076