(57)【特許請求の範囲】
【請求項１】
入力属性値を処理して、グラフィックス処理システムの次のステージが使用する頂点シェーディングされた出力属性値を生成する頂点シェーディングステージを含むグラフィックス処理を処理するグラフィックス処理システムを動作させる方法であって、
前記頂点シェーディングステージがインスタンス化されたモードで動作している場合、所与の描画呼び出しについて、
頂点シェーダ出力属性の依存する頂点シェーダ入力属性が、頂点毎にのみ定義されるか、またはインスタンス毎にのみ定義される、前記頂点シェーディングステージにより生成される頂点シェーダ出力属性を識別するステップを備え、
前記生成される頂点シェーダ出力属性の依存する前記頂点シェーダ入力属性が、前記頂点毎にのみ定義されるか、または前記インスタンス毎にのみ定義されると認識されるとき、
前記頂点シェーディングステージは、
前記頂点シェーダ出力属性が、前記頂点毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用されるインスタンスの数に関係なく、所与の頂点のために前記グラフィックス処理システムの次のステージが用いる、前記頂点シェーディングステージにより生成される前記頂点シェーダ出力属性値の1つのコピーのみを格納するステップと、
前記頂点シェーダ出力属性が、前記インスタンス毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用される頂点の数に関係なく、所与のインスタンスのために前記グラフィックス処理システムの次のステージが用いる、前記頂点シェーディングステージにより生成される前記頂点シェーダ出力属性値の1つのコピーのみを格納するステップと、
を含み、
続く1つまたは複数のグラフィックス処理ステージは、
前記出力属性が前記頂点毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用される各インスタンスについて、所与の頂点のために単一の前記格納された頂点シェーダ出力属性値を用いるステップと、
前記出力属性が前記インスタンス毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用される各頂点について、所与のインスタンスのために単一の前記格納された頂点シェーダ出力属性値を用いるステップと、
を含むことを特徴とする方法。
【請求項２】
前記頂点シェーダ出力属性の依存する前記頂点シェーダ入力属性が前記頂点毎にのみまたは前記インスタンス毎にのみ定義される、前記頂点シェーディングステージにより生成される前記頂点シェーダ出力属性を識別する前記ステップが、
頂点シェーダコードをコンパイルする時に、前記出力属性がどの1つまたは複数の前記頂点シェーダ入力属性に依存しているかを、前記頂点シェーダ出力属性の各々について識別し、前記頂点シェーダの各出力属性がどの1つまたは複数の前記頂点シェーダ入力属性に依存しているかを、メタ情報に記録するステップと、
前記メタ情報と、前記頂点シェーダ入力属性の前記頂点毎または前記インスタンス毎の依存性を定義する、描画呼び出しのためのパラメータ内の情報とを用いて、所与の前記頂点シェーダ出力属性の前記頂点シェーダ入力属性が、前記頂点毎にのみ決まる属性なのか、前記インスタンス毎にのみ決まる属性なのかを判定するステップと、
を含むことを特徴とする請求項1に記載の方法。
【請求項３】
前記頂点シェーダ出力属性が、前記頂点毎に定義された入力属性にのみ依存した場合、前記出力属性値が依存する対応する入力属性値の頂点インデックスによりインデックスが付けられたメモリの位置に前記出力属性の値を格納するステップと、
前記頂点シェーダ出力属性が、前記インスタンス毎に定義された入力属性にのみ依存した場合、前記出力属性値が依存する対応する入力属性値のインスタンスインデックスによりインデックスが付けられたメモリの位置に前記出力属性の値を格納するステップと、
を含むことを特徴とする請求項1または請求項2に記載の方法。
【請求項４】
前記頂点シェーダ出力属性値を生成する時に、前記属性値をメモリに書き込むべきかどうかを判定する前記頂点シェーディングステージをさらに含み、
前記属性値をメモリに書き込むことが必要かどうかは、対象の前記属性に関連するメタ情報により示されることを特徴とする請求項1から請求項3のいずれか一項に記載の方法。
【請求項５】
前記頂点シェーダ出力属性値を生成する時に、前記出力属性値がメモリに書き込まれるべきかどうかをテストする必要があるかどうかを判定する前記頂点シェーディングステージを含み、
前記出力属性値がメモリに書き込まれるべきかどうかをテストする必要性は、対象の前記属性に関連するメタ情報により示されることを特徴とする請求項1から請求項4のいずれか一項に記載の方法。
【請求項６】
対象の前記属性の値を格納する時に用いられるメタ情報を、前記頂点シェーディングステージの1つまたは複数の前記出力属性と関連付けるステップと、
前記頂点シェーディングステージの前記出力属性の値を格納する時に、前記属性と関連する任意のメタ情報をまず読み取り、その後、前記属性の値を格納する時に、前記メタ情報を用いる、前記頂点シェーディングステージと、
を含むことを特徴とする請求項1から請求項5のいずれか一項に記載の方法。
【請求項７】
複数のグラフィックス処理を処理する、グラフィックスを処理するためのシステムであって、
前記複数のグラフィックス処理は、
頂点シェーディングステージと、前記頂点シェーディングステージの次の少なくとも1つの処理ステージと、を備え、
前記頂点シェーディングステージは、入力属性値を処理して、グラフィックスプロセッサの少なくとも1つの次の処理ステージが用いる出力属性値を生成し、
前記システムは、
前記頂点シェーディングステージがインスタンス化されたモードで動作している場合、所与の描画呼び出しについて、
頂点シェーダ出力属性の依存する頂点シェーダ入力属性が、頂点毎にのみ定義されるか、またはインスタンス毎にのみ定義される、前記頂点シェーディングステージにより生成される頂点シェーダ出力属性を識別し、
前記生成される頂点シェーダ出力属性の依存する前記頂点シェーダ入力属性が、前記頂点毎にのみ定義されるか、または前記インスタンス毎にのみ定義されると認識されるとき、
前記頂点シェーディングステージに、
前記頂点シェーダ出力属性が、前記頂点毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用されるインスタンスの数に関係なく、所与の頂点のために前記グラフィックスを処理するためのシステムの次のステージが用いる前記頂点シェーディングステージにより生成される前記頂点シェーダ出力属性値の1つのコピーのみを格納させ、
前記頂点シェーダ出力属性が、前記インスタンス毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用される頂点の数に関係なく、所与のインスタンスのために前記グラフィックスを処理するためのシステムの次のステージが用いる前記頂点シェーディングステージにより生成される前記頂点シェーダ出力属性値の1つのコピーのみを格納させ、
前記生成される頂点シェーダ出力属性が、前記頂点毎に定義された入力属性にのみ、または前記インスタンス毎に定義された入力属性にのみ依存すると認識されたとき、
前記頂点シェーディングステージの出力を処理する、続く少なくとも1つのグラフィックス処理ステージに、
前記出力属性が前記頂点毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用される各インスタンスについて、所与の頂点のために単一の前記格納された頂点シェーダ出力属性を用いさせ、
前記出力属性が前記インスタンス毎に定義された入力属性にのみ依存した場合、前記出力属性値が適用される各頂点について、所与のインスタンスのために単一の前記格納された頂点シェーダ出力属性値を用いさせる
ように構成される少なくとも1つのプロセッサを含むことを特徴とするシステム。
【請求項８】
前記プロセッサは、
頂点シェーダコードをコンパイルする時に、前記出力属性がどの1つまたは複数の前記頂点シェーダ入力属性に依存しているかを、各前記頂点シェーダ出力属性について識別し、前記頂点シェーダの各出力属性がどの1つまたは複数の前記頂点シェーダ入力属性に依存しているかを、メタ情報に記録し、
前記メタ情報および、前記頂点シェーダ入力属性の前記頂点毎または前記インスタンス毎の依存性を定義する、描画呼び出しのためのパラメータ内の情報を用いて、所与の頂点シェーダ出力属性の前記頂点シェーダ入力属性が、前記頂点毎にのみ決まる属性なのか、前記インスタンス毎にのみ決まる属性なのかを判定する、
ように構成されることを特徴とする請求項7に記載のシステム。
【請求項９】
前記プロセッサは、前記頂点シェーディングステージにおいて、
前記頂点シェーダ出力属性が、前記頂点毎に定義された入力属性にのみ依存した場合、前記出力属性値が依存する対応する入力属性値の頂点インデックスによりインデックスが付けられたメモリの位置に前記出力属性の値を格納させ、
前記頂点シェーダ出力属性が、前記インスタンス毎に定義された入力属性にのみ依存した場合、前記出力属性値が依存する対応する入力属性値のインスタンスインデックスによりインデックスが付けられたメモリの位置に前記出力属性の値を格納させ、
るように構成されることを特徴とする請求項7または請求項8に記載のシステム。
【請求項１０】
前記頂点シェーディングステージは、頂点シェーダ出力属性値を生成する時に、前記属性値をメモリに書き込むべきかどうかを判定するように構成され、
前記属性値をメモリに書き込むことが必要かどうかは、対象の前記属性に関連するメタ情報により示されることを特徴とする請求項7から9のいずれか一項に記載のシステム。
【請求項１１】
前記頂点シェーディングステージは、頂点シェーダ出力属性値を生成する時に、前記出力属性値がメモリに書き込まれるべきかどうかをテストする必要があるかどうかを判定するように構成され、
前記出力属性値がメモリに書き込まれるべきかどうかをテストする必要性は、対象の前記属性に関連するメタ情報により示されることを特徴とする請求項7から請求項10のいずれか一項に記載のシステム。
【請求項１２】
対象の前記属性の値を格納する時に用いられるメタ情報を、前記頂点シェーディングステージの1つまたは複数の前記出力属性と関連付けるように構成されるプロセッサを含み、
前記頂点シェーディングステージは、前記頂点シェーディングステージの出力属性の値を格納する時に、前記属性と関連する任意のメタ情報をまず読み取り、その後、前記属性の値を格納する時に、前記メタ情報を用いるように構成されることを特徴とする請求項7から11のいずれか一項に記載のシステム。
【請求項１３】
データ処理手段上で実行されると、請求項1から請求項6のいずれか一項に記載の方法を実行するためのコンピュータソフトウェアコード部分を含むことを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はグラフィックス処理に関し、具体的には、頂点シェーディング段階(stage)を含むグラフィックス処理システムの動作に関する。
【背景技術】
【０００２】
当技術分野で知られているように、グラフィックス処理は通常パイプライン方式で実行され、1つまたは複数のパイプラインの段階がデータに加えられて表示される最終的な画像を生成する。この処理の2つの重要な段階は通常、表示されることになる画像を表すプリミティブ(ポリゴン)の頂点上で実行される変換およびライティングのような、いわゆる頂点シェーディング動作と、表示されることになる画像を構成する個々のフラグメント(ピクセル)をシェーディング(色付け)する、後続のフラグメント(ピクセル)シェーディング動作である。
【０００３】
頂点変換および頂点ライティングのような頂点シェーディング動作は、通常、グラフィックス処理のいわゆる「頂点シェーダ」段階で実行される。頂点シェーダは、通常、入力データ値に対して頂点シェーダプログラムを実行して、グラフィックスパイプラインの残りによる処理のための所望の出力データ(例えば、適切に変換されライティングされた頂点データ)のセットを生成する、プログラム可能な処理ユニットである。(当技術分野で知られているように、あるシーンの各プリミティブ(ポリゴン)は通常、頂点のセットとして定義かつ表現され、各頂点は、自身を頂点のデータ値のセットと関連付けている。頂点シェーディング処理は、例えば、頂点に関連するプリミティブに加えるべき任意の変換またはライティングに基づいて、頂点の最初に定義されたデータ値を修正する。)
【０００４】
あるシーンに対する入力データ値が頂点「シェーディング」されると、次いでそのシーンを表すプリミティブは通常ラスタライズされ、そのシーンのために処理されることになる複数の「フラグメント」を生成する。(当技術分野で知られているように、「フラグメント」は、グラフィックス処理動作(例えばレンダリング)が実行される個別のグラフィカルエンティティである。各フラグメントは、シーンの1つまたは複数のサンプリング点に対応し、サンプリング点を表示できるように、自身と必要なデータとを、例えば、赤、緑、青(RGB)の明度、アルファ(透明度)値、および深度値とを関連付けている。(フラグメントはピクセルとも呼ばれることがあるが、所与のフラグメントが最終的な表示での単一のピクセル(ピクセル要素)と完全に対応するとは必ずしも限らない。それは、ダウンスケーリングのような後処理が、グラフィックス処理の動作の対象のエンティティ(フラグメント)と表示ピクセルの間に、1対1の対応が存在しないことを意味しうるためである。))
【０００５】
グラフィックスフラグメントは、生成されると、自身をシェーディングする複数の処理を経て、最終的な出力などの明度、例えば適用されるテクスチャ、ブレンディングなどを生成する。出力データ値などを導出するためのそのような処理、例えば、フラグメントが表すサンプル点を表示するのに必要な処理は、「フラグメントシェーディング」または「ピクセルシェーディング」と呼ばれることがあり、処理パイプラインのフラグメントシェーディング(ピクセルシェーディングとも呼ばれる)段階で実行される。フラグメントシェーディング処理は、フラグメントの最初に定義されたフラグメントデータ値を処理して、フラグメントの出力データ(フラグメントが表すサンプル点を表示するのに必要なデータ)を正確に導出する。フラグメントシェーダはやはり、1つまたは複数のフラグメントシェーダプログラムを実行してフラグメントを適切にシェーディング(色付け)する、プログラム可能ユニットであってよい。
【０００６】
当技術分野で知られているように、頂点シェーディング動作およびフラグメントシェーディング動作は通常、いわゆる「属性」に対して動作する。属性は、シェーダプログラムにおける入力変数または出力変数であり、例えば、位置、色、またはテクスチャ座標などを表しうる。
【０００７】
頂点シェーダへの入力属性は、プライマリ属性とも呼ばれることがあり、頂点シェーダの出力属性(フラグメントシェーダの入力属性でもある)は、セカンダリ属性と呼ばれることがある。通常、(頂点シェーダおよびフラグメントシェーダとリンクされた)所与のシェーダプログラムに対して、一定数のプライマリ属性(頂点シェーダ入力変数)および一定数のセカンダリ属性(頂点シェーダ出力変数/フラグメントシェーダ入力変数)が存在する。
【０００８】
ある特定の描画呼び出しについて、インスタンス化されていない描画では、各々のプライマリ属性(頂点シェーダ入力変数)が、描画呼び出しの各頂点に対し、定義されたある値を有する。インスタンス化された描画の場合、各々のプライマリ属性(頂点シェーダ入力変数)は、各頂点または各インスタンスのいずれかに対し、定義されたある値を有する。したがって、インスタンス化されたモードの動作では、一部のプライマリ属性は、頂点毎に定義された値を有するので、「頂点毎」の属性であると考えることができる。同様に、値がインスタンス毎に定義されたプライマリ属性が存在することがあり、そうした属性はそれ故「インスタンス毎」の属性であると考えることができる。
【０００９】
当技術分野で知られているように、グラフィックスプロセッサがいわゆる「インスタンス化された」モードで動作している場合、同じ入力ジオメトリの複数の「インスタンス」が(例えば毎回わずかに異なる位置において)描画される。この場合、頂点シェーダは、頂点毎に1回だけではなく、頂点毎およびインスタンス毎に1回実行される(すなわち、実行される回数は頂点の数とインスタンスの数の積に等しい)。したがって、通常、異なる頂点とインスタンスとの組合せの各々に対する、各々のセカンダリ属性(頂点シェーダ出力変数)のために生成された、頂点シェーダ出力(セカンダリ属性値)が存在する。
【００１０】
プライマリ属性値は通常、頂点シェーダが用いるメモリに格納される。(これは通常グラフィックスAPIで指定される。)グラフィックス処理を必要とするホストシステム上のアプリケーションは、通常、頂点シェーダ入力属性のメモリレイアウトおよび入力属性値を指定する。
【００１１】
従来のイミディエイトモードのグラフィックス処理ユニットの場合に、フラグメントシェーダのような、頂点シェーディングされたセカンダリ属性値という出力を次の処理段階へ与えるために、頂点シェーダの出力は通常、チップ内部の内部パイプラインを通じて導かれる。遅延レンダリンググラフィックスプロセッサ(例えばタイルベースグラフィックスプロセッサ)の場合、頂点シェーダの出力(頂点シェーディングされた属性値)は、通常メモリに書き込まれ、メモリにおいて、頂点シェーダの出力は必要に応じてフラグメントシェーダなどによりアクセスされる。
【００１２】
属性値がメモリに格納される場合、頂点シェーダおよびフラグメントシェーダなどは通常、適切なメモリアドレスを備えてそれを使用し、適切な属性値を、そうした属性値が格納されるべき、または格納されているメモリに、格納し、かつそうしたメモリから取り出す。
【００１３】
例えば、頂点シェーダは、処理のために特定の入力属性値をロードするという命令を実行し、その命令は、頂点シェーダが、入力属性値が格納されるメモリから適切な属性値を取り出すことを可能にするための、メモリアドレスを含み、または示す。同様に、フラグメントシェーダは、処理のために特定の頂点シェーディングされた出力属性値をロードするという命令を実行し、その命令は、フラグメントシェーダが、対象のポリゴン(プリミティブ)の各コーナ頂点について、出力属性値(頂点シェーダの出力)が格納されるメモリから適切な出力属性値を取り出すことを可能にするための、メモリアドレスを含み、または示す。
【発明の概要】
【発明が解決しようとする課題】
【００１４】
出願人らは、特に、そうした頂点シェーディング段階がインスタンス化されたモードで動作している場合の、頂点シェーディング段階を含むグラフィックスプロセッサの動作について、改善の余地があると考える。
【課題を解決するための手段】
【００１５】
本発明の第1の態様によれば、入力属性値を処理して、グラフィックス処理システムの次の段階で用いる頂点シェーディングされた出力属性値を生成する、頂点シェーディング段階を含む、グラフィックス処理システムを動作させる方法が提供され、その方法は、
頂点シェーディング段階がインスタンス化されたモードで動作している場合、所与の描画呼び出しについて、
頂点シェーダ出力属性の依存する頂点シェーダ入力属性が頂点毎にのみまたはインスタンス毎にのみ定義される、頂点シェーディング段階により生成されることになる頂点シェーダ出力属性を、特定するステップと、
生成されることになる頂点シェーダ出力属性の依存する頂点シェーダ入力属性が、頂点毎にのみ定義される、またはインスタンス毎にのみ定義されると認識されるとき、
頂点シェーディング段階が、
頂点シェーダ出力属性が、頂点毎に定義された入力属性にのみ依存した場合、グラフィックス処理システムの次の段階で所与の頂点のために用いる、頂点シェーディング段階により生成されることになる頂点シェーダ出力属性値の1つのコピーのみを、出力属性値が適用されるインスタンスの数に関係なく、格納するステップ、および
頂点シェーダ出力属性が、インスタンス毎に定義された入力属性にのみ依存した場合、グラフィックス処理システムの次の段階で所与のインスタンスのために用いる、頂点シェーディング段階により生成されることになる頂点シェーダ出力属性値の1つのコピーのみを、出力属性値が適用される頂点の数に関係なく、格納するステップと、
1つまたは複数の次のグラフィックス処理段階が、
出力属性が頂点毎に定義された入力属性にのみ依存した場合、出力属性値が適用される各インスタンスについて、所与の頂点のために単一の格納された頂点シェーダ出力属性値を用いるステップ、および
出力属性がインスタンス毎に定義された入力属性にのみ依存した場合、出力属性値が適用される各頂点について、所与のインスタンスのために単一の格納された頂点シェーダ出力属性値を用いるステップと
を含む。
【００１６】
本発明の第2の態様によれば、グラフィックスを処理するためのシステムが提供され、このシステムは、
頂点シェーディング段階と、頂点シェーディング段階の次の少なくとも1つの処理段階とを含む、複数のグラフィックス処理段階であって、頂点シェーディング段階が入力属性値を処理して、グラフィックスプロセッサの少なくとも1つの次の処理段階が用いる出力属性値を生成する、複数のグラフィックス処理段階と、
頂点シェーディング段階がインスタンス化されたモードで動作している場合、所与の描画呼び出しについて、
頂点シェーダ出力属性の依存する頂点シェーダ入力属性が頂点毎にのみまたはインスタンス毎にのみ定義される、頂点シェーディング段階により生成されることになる頂点シェーダ出力属性を、特定し、
生成されることになる頂点シェーダ出力属性の依存する頂点シェーダ入力属性が、頂点毎にのみ定義される、またはインスタンス毎にのみ定義されると認識されるとき、
頂点シェーディング段階に、
頂点シェーダ出力属性が、頂点毎に定義された入力属性にのみ依存した場合、グラフィックス処理システムの次の段階で所与の頂点のために用いる、頂点シェーディング段階により生成されることになる頂点シェーダ出力属性値の1つのコピーのみを、出力属性値が適用されるインスタンスの数に関係なく、格納させ、
頂点シェーダ出力属性が、インスタンス毎に定義された入力属性にのみ依存した場合、グラフィックス処理システムの次の段階で所与のインスタンスのために用いる、頂点シェーディング段階により生成されることになる頂点シェーダ出力属性値の1つのコピーのみを、出力属性値が適用される頂点の数に関係なく、格納させ、
生成されることになる頂点シェーダ出力属性が、頂点毎に定義された入力属性にのみ、またはインスタンス毎に定義された入力属性にのみ依存すると認識された時、
頂点シェーディング段階の出力を処理する少なくとも1つの次のグラフィックス処理段階に、
出力属性が頂点毎に定義された入力属性にのみ依存した場合、出力属性値が適用される各インスタンスについて、所与の頂点のために単一の格納された頂点シェーダ出力属性を用いさせ、
出力属性がインスタンス毎に定義された入力属性にのみ依存した場合、出力属性値が適用される各頂点について、所与のインスタンスのために単一の格納された頂点シェーダ出力属性値を用いさせる
ように構成される、プロセッサとを含む。
【００１７】
本発明では、グラフィックス処理動作は、インスタンス化されたモードで動作している時、出力属性の依存する頂点シェーダ入力属性が、頂点毎にのみ定義される(すなわち、属性値は頂点毎に設定されるが、その頂点の全てのインスタンスに対して同一)、またはインスタンス毎にのみ定義される(すなわち、属性値はインスタンス毎に設定されるが、そのインスタンスの全ての頂点に対して同一)、頂点シェーダの出力属性を認識するように構成される。
【００１８】
出願人らは、インスタンス化モードで動作している場合、頂点シェーダの出力属性のための頂点シェーダの入力属性が、頂点毎に定義された入力属性(すなわち、値が頂点毎に定義される頂点シェーダ入力属性)にのみ依存すると、頂点シェーダは、所与の頂点と異なるインスタンスとの各組合せに対して、同一の出力属性値を生成する(すなわち、頂点シェーダが生成する出力属性値は、任意の所与の頂点の全てのインスタンスで同一である)ということを認識した。このことは、例えば、頂点シェーダ入力属性が、頂点のテクスチャ座標である場合に起こりうる。
【００１９】
同様に、頂点シェーダの出力属性のための頂点シェーダの入力属性が、インスタンス毎に定義された入力属性(すなわち、値がインスタンス毎に定義される入力属性)にのみ依存すると、頂点シェーダは、所与のインスタンスと異なる頂点との各組合せに対して、同一の出力属性値を生成する(すなわち、頂点シェーダが生成する出力属性値は、対象のインスタンスの各頂点に対して同一である)。
【００２０】
出願人らは、次のグラフィックス処理段階の動作が続くような状況では、ある頂点とインスタンスの組合せに対する出力属性値を、同一の出力属性値を有するであろう他の頂点とインスタンスの組合せに再利用することができるので、インスタンスと頂点の組合せの各々に対して、頂点シェーディングされた出力属性値を格納する必要はないことがあるということを、さらに認識した。
【００２１】
本発明は、そのような頂点毎のみまたはインスタンス毎のみに定義された頂点シェーダ入力属性に依存する出力属性がいつ存在するかを判定し、頂点シェーダに、(各々の)関連する出力属性値の1つのコピーのみを格納させることによって、前段落で述べたことを利用し、関連する出力属性値は次いで、次のグラフィックス処理段階がその値を必要とする度に再利用される。
【００２２】
このことは、次のグラフィックス処理段階で用いるために複数の同一の出力属性値を格納することを避け、それにより例えば、インスタンス化されたモードの頂点シェーダ動作において、各々の同一の出力属性値を別々に格納する構成と例えば比較して、メモリ使用量を低減し、したがって消費電力を低減するという利点を有する。これは一般的に有益であるが、低電力で持ち運び可能なデバイスで用いられるグラフィックス処理システムでは特に有利でありうる。
【００２３】
別の面から見ると、本発明は事実上、インスタンス化されたモードで動作している時に頂点シェーダの出力が同一になる場合を識別し、そのような同一の頂点シェーダ出力属性値の各々の1つのコピーのみを格納(および必要があれば再利用)するように動作する。
【００２４】
したがって、頂点毎にのみ定義された頂点シェーダ入力属性に依存する、異なる頂点シェーダ出力属性の各々について、本発明は、出力属性値が生成されるべき頂点の異なるインスタンスがいくつあるかに関係なく、それぞれの頂点の頂点シェーダ出力属性に対して生成されることになる頂点シェーダ出力属性値の1つのコピーのみを格納する。
【００２５】
同様に、インスタンス毎にのみ定義された頂点シェーダ入力属性に依存する、異なる頂点シェーダ出力属性の各々について、本発明は、出力属性値が生成されるべきインスタンスの異なる頂点がいくつあるかに関係なく、それぞれのインスタンスの頂点シェーダ出力属性に対して生成されることになる頂点シェーダ出力属性値の1つのコピーのみを格納する。
【００２６】
頂点シェーダが処理する入力属性値(すなわち、上で論じられたように入力変数値)(および対応する出力属性値(出力変数値))は、頂点シェーダが動作対象にしうる(かつ生成しうる)任意の適切な属性値であってよい。当技術分野で知られているように、上記の適切な属性値は通常、かつ好ましい実施形態では、位置、色などのような属性の値である。
【００２７】
マルチコアシステムでありうるように、グラフィックス処理システムが複数の頂点シェーダを含む場合、本発明は同様に適用可能であることに、ここで留意されたい。この場合、頂点シェーディング段階は、例えば並列に動作する、複数の個別の頂点シェーダを含む。そのような構成では、各頂点シェーダは、本発明の方式で好ましくは動作し、すなわち、頂点毎のみの頂点シェーダ入力属性およびインスタンス毎のみの頂点シェーダ入力属性に依存する、各々の異なる頂点シェーダ出力属性値の1つのコピーのみを格納するように動作する。
【００２８】
頂点シェーダの出力を用いることになる次のグラフィックス処理段階は、任意の適切で所望される、そのようなグラフィックス処理段階であってよい。次のグラフィックス処理段階は、好ましくは、グラフィックス処理システムの次のシェーダ段階である。特に好ましい実施形態では、次のグラフィックス処理段階は、フラグメントシェーダであり、例えばジオメトリシェーダであってもよい。
【００２９】
頂点シェーダ出力属性が依存する頂点シェーダ入力属性が、頂点毎にのみ定義される(すなわち、出力属性が、値が頂点に関してのみ定義される(したがって所与の頂点の全てのインスタンスで同一である)1つまたは複数の頂点シェーダ入力属性に依存する)、またはインスタンス毎のみに定義される(すなわち、出力属性が、値がインスタンスに関してのみ定義される(したがって所与のインスタンスの全ての頂点で同一である)1つまたは複数の頂点シェーダ入力属性に依存する)、状況は、任意の適切で所望される方式で、かつ任意の適切な段階およびシステムのプロセッサにおいて、認識することができる。
【００３０】
このことは好ましくは、各頂点シェーダ出力属性がどの頂点シェーダ入力属性に依存しているかを識別し、そうした入力属性がインスタンス毎にのみ依存する属性なのか、頂点毎にのみ依存する属性なのかを判定することによって行われる。各頂点シェーダ出力属性が依存する頂点シェーダ入力属性は、処理の比較的早い段階で設定されうるが、入力属性の頂点毎の性質またはインスタンス毎の性質は、グラフィックス処理の遅い段階(例えば描画呼び出し時)でようやく設定されることがあるので、上記のような二段階の処理が好ましい。
【００３１】
特に好ましい実施形態では、頂点シェーダコンパイラは、この処理の少なくとも一部を行う。したがって、好ましい実施形態では、頂点シェーダコンパイラは、頂点シェーダコードをコンパイルする時に、出力属性がどの頂点シェーダ入力属性に依存しているかを、各頂点シェーダ出力属性について識別し、頂点シェーダの各出力属性がどの頂点シェーダ入力属性に依存しているかを、好ましくはコンパイルされた頂点シェーダコードと関連付けられた、メタ情報に記録するように構成される。このことは、これを行うのに適した任意の所望のコンパイラ技術により行われうる。またこれにより、各頂点シェーダ出力属性がどの頂点シェーダ入力属性に依存するかが、識別される。
【００３２】
この点において、頂点シェーダ出力属性のための頂点シェーダ入力属性が頂点毎のみまたはインスタンス毎のみで定義される全ての場合が、本発明において適切に認識され処置されることが好ましいが、出願人らは、頂点シェーダ出力属性がどの頂点シェーダ入力属性に依存しているかを、動作の際に完全に正確にかつ信頼性を伴って識別する機構が、常に可能ではない場合があることを認識した、ということに留意されたい。例えば、頂点シェーダコンパイラがこれを行うために用いられている場合、コンパイラが、全てのシェーダプログラムに対してこの性質を完全に識別することはできないことがある(そして実際には通常は識別することができないだろう)。
【００３３】
このことを説明すると、特に好ましい実施形態では、頂点シェーダ出力属性が依存する入力属性を識別するための機構は、慎重な結果を与えるように、すなわち、「誤りが起きても安全な側に起こす」ように、構成および構築される。したがって、特に好ましい実施形態では、頂点シェーダ出力属性が依存する入力属性を識別する際のあらゆる誤りが、システムが、頂点シェーダ出力属性が実際に依存している出力属性の依存性を見逃すのではなく、頂点シェーダ出力属性が実際には依存していない何らかの入力属性に依存するものと結論付ける(判定する)(すなわち、実際の依存性の上位集合である入力属性の依存性の判定された集合を与える)ものとなるような、構成となる。
【００３４】
したがって、システムは好ましくは、頂点シェーダ出力属性が依存する頂点シェーダ入力属性の判定におけるあらゆる誤りが、頂点シェーダ出力属性が実際には依存していない場合に何らかの入力属性に依存していると判定する誤りとなるように、構成される。このことは、全ての状況において正しくシステムが挙動するという効果を有する(しかし、場合によっては、本発明の方式での最適化および好ましい動作のための一部の機会を失う)。
【００３５】
したがって、頂点シェーダ出力属性が、頂点毎のみまたはインスタンス毎のみに定義される頂点シェーダ入力属性に依存するものと識別されたという、本発明の動作への具体的な言及は、システム、例えばコンパイラが、そのような状況(そのような頂点シェーダ出力属性)を識別したという状況を指すことにも、ここで留意されたい。同様に、所与の頂点シェーダ入力属性に対する、所与の頂点シェーダ出力属性の依存性への言及は、文脈から別段示されない限り、本発明のシステム(例えばコンパイラ)により識別されるような依存性を指す。
【００３６】
所与の出力属性のための頂点シェーダ入力属性が頂点毎にのみ依存する属性かインスタンス毎にのみ依存する属性かを次に識別することは、好ましくはグラフィックスプロセッサドライバにより行われ、好ましくは描画呼び出し時に行われ、好ましくは、頂点シェーダコンパイラからのメタ情報および入力属性が頂点毎の性質かインスタンス毎の性質かを定義する描画呼び出しのパラメータ中の情報を用いて行われる。
【００３７】
したがって、好ましくは、ドライバは、頂点シェーダ出力属性が依存する頂点シェーダ入力属性が、頂点毎にのみ定義されるかどうか、またはインスタンス毎に定義されるかどうかを、1つの頂点シェーダ出力属性に対して、好ましくは各々の頂点シェーダ出力属性に対して、識別する。好ましくは、全ての頂点シェーダ出力属性は、頂点シェーダ出力属性がどのような種類の頂点シェーダ入力属性に依存するか(すなわち、頂点シェーダ出力属性が、頂点毎に定義される頂点シェーダ入力にのみ依存するか、インスタンス毎に定義される頂点シェーダ入力のみに依存するか、その両方に依存するか、または頂点シェーダ入力属性には依存しないか(すなわち、出力属性は各描画呼び出しに対し一定値を有するか))にしたがって分類される。
【００３８】
したがって、特に好ましい実施形態では、どの場合に、頂点シェーダ出力属性がインスタンス毎にのみまたは頂点毎にのみ定義された頂点シェーダ入力属性に依存するかを識別する、かつ上記の依存性があるかどうかを識別するのは、グラフィックスプロセッサの頂点シェーダコンパイラとドライバとの組合せである。
【００３９】
当技術分野で知られているように、所与の頂点シェーダ出力属性は、1つまたは複数の頂点シェーダ入力属性に依存するとともに、1つまたは複数の描画呼び出し毎の入力にも依存し、この入力は所与の描画呼び出しに対して一定である、ということにここで留意されたい。本発明は、頂点シェーダ出力属性が、頂点毎またはインスタンス毎に定義された頂点シェーダ入力属性に加えて、描画呼び出し毎の入力(描画呼び出しに対して定義される一定値)に依存する場合に、同様に用いることができる。したがって、本明細書において、頂点シェーダ出力属性が、頂点毎に定義された入力属性のみまたはインスタンス毎に定義された入力属性のみに依存すると言及することは、頂点シェーダ出力属性が依存する頂点シェーダ入力属性の全てが、頂点毎またはインスタンス毎にのみ定義される状況をそれぞれ指し、出力属性が、頂点毎またはインスタンス毎に定義された頂点シェーダ入力属性にのみ依存し、他の何物にも依存しないことは要求されない(すなわち、頂点シェーダ出力属性が、描画呼び出し毎に定義された入力のような、頂点シェーダ入力属性ではない他の入力にも依存することを排除しない)。
【００４０】
頂点毎のみのまたはインスタンス毎のみの頂点シェーダ入力属性に依存する出力属性が識別されると、頂点シェーダ(または頂点シェーディング段階が複数の個別の頂点シェーダを含む場合は、複数の頂点シェーダ)は、出力属性が頂点毎またはインスタンス毎に定義された頂点シェーダ入力属性にのみ依存する場合、頂点シェーディングされた属性値という出力の1つのコピーのみを、任意の適切で所望される方式で、かつ任意の適切な段階においてシステムのプロセッサにより格納するように、制御することができる。
【００４１】
好ましい実施形態では、(各々の)頂点シェーダは、出力属性値を生成する度に、メモリの同じ場所(例えば、かつ好ましくは、出力属性値のアレイの中)に(重複)出力属性値を書き込むように構成される。こうして、メモリに格納される関連する出力属性値の1つのコピーのみが存在することになる(後に生成されたその出力属性値の全てのコピーは、メモリの同じ場所に書き込まれる、すなわち、事実上、同じ出力属性値の前に格納されたものを上書きするだけであるため)。したがって、例えば、頂点毎にのみ定義された頂点シェーダ入力属性に依存する出力属性の所与の値が初めて生成される時に、出力属性値は例えばメモリの位置Xに書き込まれうる。次いで、頂点毎にのみ定義される頂点シェーダ入力属性に依存する出力属性のその値が、別のインスタンスのために生成されると、その出力属性値は再びメモリの位置Xに書き込まれ、以下同様である。
【００４２】
したがって、好ましい実施形態では、頂点シェーダ(または複数のシェーダ)は、頂点毎に定義された頂点シェーダ入力属性値の所与のセットにのみ依存する頂点シェーダ出力属性値が発生する度に、メモリの同じ場所に書き込み、インスタンス毎に定義された頂点シェーダ入力属性値の所与のセットにのみ依存する頂点シェーダ出力属性値が発生する度に、メモリの同じ場所に書き込むように制御される。言い換えると、頂点シェーダ出力属性値が依存する頂点シェーダ入力属性が、頂点毎にのみ定義される、またはインスタンス毎にのみ定義される、頂点シェーダ出力属性値が生成され始める度に、対応する生成された出力属性値が、メモリの同じ場所に格納される。
【００４３】
このことは、頂点シェーダに、メモリの同じ場所に属性値を毎回格納させるための、適切な属性格納命令を用いて、好都合に実現することができ、好ましくはそのように実現される。好ましくは、属性格納命令が実行される時に読み取られるおよび/または使用される属性に関連するメタ情報は、頂点シェーダに、メモリの同じ場所に属性値を毎回格納させるために用いられる。
【００４４】
特に好ましい実施形態では、頂点毎にのみまたはインスタンス毎にのみ依存する出力属性が識別される場合、頂点シェーダ(または複数の頂点シェーダ)は、(各々の)関連する出力属性値をメモリ(例えば、かつ好ましくは、出力属性値のアレイ)に一度だけ書き込む(すなわち、同じ出力属性値が生成されることになる他の時に、(メモリの同じ場所に上書きするのではなく)出力属性値がメモリに全く書き込まれないように)ように構成(制御)される。したがって、例えば、頂点毎の入力属性にのみ依存する出力属性の所与の値が、特定のインスタンス、例えばインスタンス0に対して生成されると、出力属性値はメモリに書き込まれるが、頂点毎の入力属性にのみ依存する出力属性値が、同一の頂点の他のインスタンスに対して生成されると、値はメモリには全く書き込まれない。
【００４５】
したがって、特に好ましい実施形態では、頂点シェーダ(または複数のシェーダ)は、頂点毎に定義された頂点シェーダ入力属性値の所与のセットにのみ依存する、または、インスタンス毎に定義された頂点シェーダ入力属性値の所与のセットにのみ依存する、頂点シェーダ出力属性値が1個発生すると、メモリに書き込むが、その頂点シェーダ出力属性値が他に発生しても全てメモリに書き込まないように、制御される。言い換えると、頂点毎に定義された頂点シェーダ入力属性値の所与のセットにのみ依存する、または、インスタンス毎に定義された頂点シェーダ入力属性値の所与のセットにのみ依存する、頂点シェーダ出力属性値が一度(例えば初めて)生成され始めると、その出力属性値はメモリに書き込まれるが、その出力属性値が別の時に(例えば再び)生成され始めると、出力属性値はメモリに書き込まれない。
【００４６】
このことは、重複した頂点シェーダ出力属性値を格納するためのメモリの使用が避けられるだけではなく、そのような値のメモリへの書き込みおよび、したがって対応する書き込みのトラフィックも避けられるという利点を有する。これにより、グラフィックス処理システムの頂点シェーダ動作における、メモリのトラフィックおよび使用量をさらに低減し、したがって消費電力をさらに低減することができる。
【００４７】
そのような構成はまた、当技術分野で知られているように、複数の頂点シェーダが同時に出力属性アレイに書き込みを試みうる、マルチコアグラフィックス処理システムにおいて特に有利でありうる。その場合、複数の頂点シェーダが同じ場所に書き込みを試みると、キャッシュラインの所有権についての競合が起こることがあり、場合によっては性能が低下する。重複出力属性値の各々を一度だけメモリに書き込むことで、この問題は回避されうる。
【００４８】
それぞれの属性値をメモリに一度だけ書き込むように頂点シェーダを制御するための好ましい機構が、以下でより詳細に論じられる。
【００４９】
システムは、少なくとも頂点シェーディング段階がインスタンス化されたモードで動作している場合に、本発明の方式で動作しなければならないが、所望であれば、常時この方式で動作してもよい。上で論じられたように、コンパイラおよびドライバが本発明を実施するために用いられる場合、動作のコンパイラの部分は好ましくは、常に行われるが(インスタンス化されたモードが用いられるかどうかをコンパイラは知らないため)、動作のドライバの部分は好ましくは、インスタンス化されたモードの描画呼び出しによってのみ動作させられる。
【００５０】
システムは、処理されることになるそれぞれの描画呼び出しの各々について、本発明の方式で動作しなければならない。したがって、例えば、出力属性値の単一のコピーを格納することへの言及は、所与の描画呼び出しに対して単一のコピーを格納することを指す。したがって、システムは好ましくは、システムが処理することになるそれぞれの描画呼び出し(好ましくは各々の描画呼び出し)について要求される方式で動作する。同様に、例えば、最初に定義された単一の描画呼び出しが、処理のために複数の異なる描画呼び出し(例えば、連続的に、並列に、またはその何らかの組合せのいずれかの様式で扱われることになる)に分割されうる場合、別々の(分割された)描画呼び出しの各々は、本発明の方式において別々に(それ自体で)処理されなければならない(すなわち、適切な場合には、格納された出力属性値の単一のコピーなどのみを有する)。
【００５１】
当業者により理解されるように、頂点毎にのみまたはインスタンス毎にのみ依存する出力属性値の単一のコピーは、フラグメントシェーダのような、次のグラフィックス処理段階で用いるのに適切な方法で、メモリ内に格納され編成されなければならない。このことを実現するために、出力属性値の単一のコピーは、任意の適切で所望される方法で、メモリ内に配置されうる。
【００５２】
特に好ましい実施形態では、頂点毎のみおよびインスタンス毎のみの出力属性値は、出力属性値が依存する頂点シェーダ入力属性値に対して、それぞれ関連する頂点インデックスまたはインスタンスインデックスを用いることに基づいて、メモリ内で配置しインデックスを付けることができる。言い換えると、頂点毎にのみ定義された頂点シェーダ入力属性に依存する所与の出力属性の出力属性値は、出力属性値が依存する対応する頂点シェーダ入力(頂点依存の)属性値が定義されるそれぞれの頂点の頂点インデックスを用いて、インデックスが付けられる。同様に、インスタンス毎にのみ定義された頂点シェーダ入力属性に依存する所与の出力属性の出力属性値は、出力属性値が依存する対応する頂点シェーダ入力の(インスタンス依存の)属性値が定義されるそれぞれのインスタンスのインスタンスインデックスを用いて、インデックスが付けられる。
【００５３】
これは、出力属性値が、頂点毎またはインスタンス毎に一度格納された場合に、出力属性値のインデックスを付けるのに、特に都合のよい機構である。したがって、特に好ましい実施形態では、頂点シェーダは、出力属性値が依存する対応する入力属性値の頂点インデックスまたはインスタンスインデックスによりそれぞれインデックスが付けられたメモリの位置に、頂点毎またはインスタンス毎の入力属性にのみ依存する出力属性値を格納する。
【００５４】
頂点シェーダは、任意の所望される適切な方式で、適切なメモリの位置(例えば、適切な場合には頂点インデックスまたはインスタンスインデックスでインデックスが付けられた)に、出力属性値を格納するように構成されうる。好ましくは、頂点シェーダ属性格納命令は、実行されると、頂点シェーダに、属性値を所望のメモリの位置に格納させる。
【００５５】
頂点シェーダ入力属性値もまた、好ましくは、自身が関連する頂点またはインスタンス(インスタンス化されたモードが使用される場合)に基づいて、インデックスを付けられる。したがって、頂点毎に定義される頂点シェーダ入力属性値は、好ましくは、自身が関連する頂点に関して(すなわち、(入力)頂点インデックスを用いて)メモリ内でインデックスを付けられる。同様に、インスタンス毎に定義される頂点シェーダ入力属性値は、好ましくは、自身が関連するインスタンスに関して(すなわち、(入力)インスタンスインデックスを用いて)インデックスを付けられる。インスタンス毎の属性はまた、定義されたインスタンス除数によりインスタンスインデックスを割ることができる。
【００５６】
さらに、上で論じられたように、頂点毎のみまたはインスタンス毎のみの入力に依存する、頂点シェーダの特定の出力属性は、好ましくは、頂点毎またはインスタンス毎にメモリ内でインデックスを付けられるが、頂点シェーダの出力属性値はまた、「折りたたまれていない(unfolded)」出力インデックスを用いて、インデックスを付けることができる。この理由は、頂点に依存する入力属性の各々の各頂点に対し、頂点シェーダ入力属性値は通常1つだけ存在し、インスタンスに依存する入力属性の各々の各インスタンスに対し、頂点シェーダ値の入力は通常1つだけ存在するが、頂点シェーダの出力は、各インスタンスの各頂点の(別々の頂点およびインスタンスの組合せの各々の)各出力属性に対して別々の出力属性値を与えるように、通例「折りたたまれている」かまたは「引き伸ばされている(blown-up)」ためである。
【００５７】
フラグメントシェーダのような、次のグラフィックス処理段階は、単一の格納された頂点シェーディングされた出力属性値を、そのような属性値が必要とされる度に、任意の適切で所望される方法で用いるように構成されうる。
【００５８】
このことは、好ましくは、実行されるとグラフィックス処理段階に所望の属性値をロードさせる、フラグメントシェーダのようなグラフィックス処理段階のための属性ロード命令を用いて行われる。このことは例えば、関連する出力属性値がロード命令自体に格納される、1つまたは複数のメモリアドレスを提供することを含んでもよいが、特に好ましい実施形態では、属性値を取り出す(ロードする)時に、インデックスを付ける機構(および好ましくは上記のインデックスを付ける機構)が用いられる。
【００５９】
したがって、特に好ましい実施形態では、好ましくはフラグメントシェーダのような次のグラフィックス処理段階は、対象の出力属性値のコピーを処理しようとする度に、頂点シェーディングされた出力属性値のコピーを、頂点シェーディングされた出力属性値に同一のインデックスを用いることで処理しようとする度に(すなわち、格納された頂点シェーディングされた出力属性値から毎回同じエントリを読むことになるように)、単一の格納された頂点シェーディングされた出力属性値を再利用する。
【００６０】
したがって、特に好ましい実施形態では、フラグメントシェーダのような次のグラフィックス処理段階は、出力属性値が用いられようとする度に、インスタンス毎にのみまたは頂点毎にのみ定義された頂点シェーダ入力属性に依存する、同一の格納された出力属性値を取り出して使用できるようにするための、適切なインデックスを備える。
【００６１】
次のグラフィックス処理段階は、任意の適切な方法で、例えば用いる同一の適切なインデックスが毎回直接提供されることによって、格納された出力属性値に同一のインデックスを用いるように行われうる。したがって、例えば、フラグメントシェーダコンパイラなどが、適切なインデックスを含むまたは示すフラグメントシェーダのための、入力ロード命令を生成することができる。上で論じられたように、頂点毎にのみまたはインスタンス毎にのみ定義された頂点シェーダ入力属性に依存する出力属性値が、関連する入力頂点インデックスまたはインスタンスインデックスによりインデックスを付けられる場合、フラグメントシェーダのような次のグラフィックス処理段階は、これにしたがって、これらの構成においては、出力属性値を直接取り出すのに用いられることになる関連する頂点インデックスまたはインスタンスインデックスを提供される(また、ある好ましい実施形態ではこれは完了している)。
【００６２】
しかし、上で論じられたように、頂点シェーダの出力(頂点シェーダ出力属性値)(および、したがってフラグメントシェーダなどへの入力)に対して、「折りたたまれていない」出力インデックスも用いることができることが好ましい。その理由は、頂点シェーダ入力属性値アレイは通常、頂点に依存する各入力属性の各頂点に対して1つのエントリ(属性値)のみを含み、インスタンスに依存する各入力属性の各インスタンスに対して1つのエントリ(属性値)のみを含むが、頂点シェーダの出力は、各インスタンスの各頂点の(別々の頂点およびインスタンスの組合せの各々の)各出力属性に対して別々の出力属性値を与えるように、通例「折りたたまれている」かまたは「引き伸ばされている」ためである。
【００６３】
上記のことが成り立つ場合には、グラフィックス処理システムを、フラグメントシェーダのような次のグラフィックス処理段階に、および必要に応じて、出力属性値の「折りたたまれていない」出力インデックスまたは頂点インデックスまたはインスタンスインデックスのいずれかを直接用いる、次のグラフィックス処理段階に提供できるように構成することが可能である。
【００６４】
しかし、特に好ましい実施形態では、グラフィックス処理システムは、単一の形態の出力インデックス、好ましくは上で論じられたような「折りたたまれていない」形態の出力インデックスを、必要な場合に出力インデックスから導出可能であり導出される、頂点毎にのみおよびインスタンス毎にのみ定義される頂点シェーダ入力属性に依存する出力属性値のために用いられることになる、任意の他の形態のインデックス(例えば、好ましくは上で論じられたように頂点インデックスまたはインスタンスインデックス)とともに、次のグラフィックス処理段階に提供するように構成される。
【００６５】
したがって、特に好ましい実施形態では、フラグメントシェーダのような次のグラフィックス処理段階は、出力である頂点シェーディングされた属性値を処理しようとする時に、頂点毎にのみまたはインスタンス毎にのみ定義される頂点シェーダ入力属性にのみ依存する出力属性値(すなわち、上の好ましい実施形態での頂点インデックスまたはインスタンスインデックス)がそこから導かれうる「折りたたまれていない」出力属性値インデックスを、必要であれば備える。このことは、単一の形態のインデックス(すなわち出力の「折りたたまれていない」インデックス)が、次のグラフィックス処理段階に提供されなければならない(グラフィックス処理段階が複数の形態のインデックスをサポートし場合によっては備えることは必要とされない)ということを意味する。さらに、出力を用いて、用いられるインデックスの形態として折りたたまれていないインデックスが有利である。それは、一般にそうした形態のインデックスは、例えば頂点インデックスとインスタンスインデックスの両方を提供するよりも、記憶スペースの使用量が少ないためである。
【００６６】
「折りたたまれていない」出力インデックスは、好ましくは、グラフィックス処理段階が実行することになる、属性ロード(または格納)命令により提供されかつ/または示される。
【００６７】
これらの構成では、出力属性値の単一の格納された組が用いるインデックスが、次のグラフィックス処理段階に提供される出力インデックスから、任意の適切で所望される方式で導出されうる。出力属性値の単一の格納された組が用いるインデックスは好ましくは、出力インデックスから所定の方式で導出可能である(かつ導出される)。
【００６８】
特に好ましい実施形態では、次のグラフィックス処理段階に提供される出力の「折りたたまれていない」インデックスから導かれうるインデックスは、上で論じられたように、頂点インデックスまたはインスタンスインデックスを含む。
【００６９】
特に好ましい実施形態では、頂点インデックスおよびインスタンスインデックスのうちの1つ(好ましくは頂点インデックス)は、出力インデックス値へのモジュロ演算により出力インデックスから導出することができ、頂点インデックスおよびインスタンスインデックスの他方(好ましくはインスタンスインデックス)は、出力インデックス値に対する除算を実行することにより出力インデックスから導出されうる。
【００７０】
最も好ましくは、頂点シェーダ出力属性値のために用いられる(および、とりわけ次のグラフィックス処理段階に提供される)出力の「折りたたまれていない」インデックスは、所定の方式で、頂点シェーディングされた出力属性値という関連する出力を生成するために頂点シェーダが処理する(または処理するであろう)、入力属性値のインスタンスインデックスおよび/または頂点インデックスから導出される。このことは、出力インデックス生成動作を逆にすることで、対応する頂点インデックスまたはインスタンスインデックスを取り出すことができるということを意味する。(言い換えると、出力である折りたたまれていないインデックスが、定義された頂点およびインスタンスの入力属性値インデックスから適切な方式で導出され、出力インデックスは対応する頂点インデックスまたはインスタンスインデックスを得るために分解することができ、これにより、頂点属性値インデックスまたはインスタンス属性値インデックスを、それらを直接規定する必要なく取り出すための機構が得られるということを、出願人らは認識した。)
【００７１】
したがって、特に好ましい実施形態では、頂点シェーダ出力属性値に使用される(および次のグラフィックス処理段階が頂点シェーダにより生成された出力属性値を処理しようとする時に次のグラフィックス処理段階に提供される)インデックスは、所定の方式で、対応する頂点シェーダ入力属性値が定義される頂点およびインスタンスの頂点インデックスおよびインスタンスインデックスから生成される。
【００７２】
最も好ましくは、用いられることになる出力インデックス値(フラグメントシェーダなどに提供されるインデックス)は、以下のように導出される。
出力インデックス値 = (頂点インデックス) + (インスタンスインデックス) × (詰め込まれたインスタンスサイズ)
ここで、「詰め込まれたインスタンスサイズ」は、インスタンス当たりの頂点の数に等しいかそれよりも大きい、設定された(選択された)値である。
【００７３】
このことは、(入力)頂点インデックスが、モジュロ演算により出力インデックス値から得られるということを意味し、
頂点インデックス = (出力インデックス値) modulo (詰め込まれたインスタンスサイズ)
であり、また(入力)インスタンスインデックスは、除算により出力インデックス値から得られるということを意味し、
インスタンスインデックス = floor((出力インデックス値) / (詰め込まれたインスタンスサイズ))
である。
【００７４】
このことの効果は、所与の入力頂点の各インスタンスのために生成される各出力インデックスは、例えば、上記のようにモジュロ演算されると同じ頂点インデックスを返し、所与の入力インスタンスの各頂点のために生成される各出力インデックスは、上記のように除算されると同じインスタンスインデックスを返す。したがって、フラグメントシェーダは、例えば、出力属性値が必要になる度に、(出力属性値が発生する度に異なる「出力インデックス」値を有することになっても)頂点毎またはインスタンス毎にのみ定義された頂点シェーダ入力属性に依存する出力属性値の単一のコピーを取り出すための、同一のインデックス(頂点インデックスまたはインスタンスインデックス)を(必要に応じて)導出することができる。
【００７５】
「詰め込まれた(padded)インスタンスサイズ」は、インスタンス当たりの頂点の数(例えば対象の描画呼び出しに対して定義される)に少なくとも等しくなければならないが、この数と完全に一致しなくてもよい。好ましくは、ハードウェアでモジュロ演算を実行する時に用いるのに十分な値に設定される(これにより、完全に汎用的なモジュロ演算が必要とする回路よりも簡易的なモジュロ回路が可能になるため)。最も好ましくは、モジュロ演算が(比較的)行いやすい、次に大きい値または等しい値(インスタンス毎の頂点の数よりも大きい)に丸められる。
【００７６】
グラフィックス処理システムが、インスタンス毎の入力値が特定の属性のインスタンスインデックスに対するさらなる除数値を有することを可能にする、インスタンス化のためのAPI機構を用いる場合、それに応じて、そのようなさらなる除数機構が、除数機構が適用されるインスタンス毎のあらゆる入力属性値にインデックスを付ける時に、好ましくは用いられる(さらなる除数は好ましくは、例えばフラグメントシェーダに提供される出力である折りたたまれていない出力から、属性値を取り出すのに用いられることになるインスタンスインデックスを導出する際に、除数値(詰め込まれたインスタンスサイズ)に単純に乗算される)。
【００７７】
したがって、フラグメントシェーダ(または他の次のグラフィックス処理段階)が、頂点シェーダ出力属性の依存する頂点シェーダ入力属性が頂点毎またはインスタンス毎にのみ定義される、頂点シェーダ出力属性値を処理しようとする時、例えばフラグメントシェーダは、頂点シェーダ出力属性値をロードするように指示されるとともに出力インデックス値を備え、この出力インデックス値から、所望の頂点シェーダ出力属性値を取り出すのに用いられることになるインデックスを導出する。
【００７８】
異なる操作を用いて、提供される出力インデックスから所望のインデックスを導出することができる、上で論じられた構成では、グラフィックス処理段階はまた、どのインデックス導出動作を用いるべきか(およびその動作で用いられることになるあらゆる値)を与えられなければならない。
【００７９】
この点において、フラグメントシェーダのようなグラフィックス処理段階へのロード命令が、関連する頂点シェーダ出力属性値を取り出すのに用いられることになるインデックスを導出するのに必要な全ての情報を含むことは可能だが、特に好ましい実施形態では、実行されるべきインデックス導出動作および、好ましくはその動作に必要なあらゆるデータ(値)は、ロード命令自体とは別のメタ情報により好ましくは示され、かつ/またはメタ情報として提供される。このメタ情報は、好ましくは、フラグメントシェーダなどに提供される出力インデックスが、上で論じられたように、モジュロ演算または除算を受け、属性値を取り出す際に用いる頂点インデックスまたはインスタンスインデックスを導出すべきかどうかを示す。最も好ましくは、このメタ情報はまた、所望のインデックスを導出するのに用いられることになる、適切なモジュロ値または除数値(すなわち、詰め込まれたインスタンスサイズおよび、必要であればインスタンス除数)を示し、または含む。
【００８０】
特に好ましい実施形態では、メタ情報は対象の属性と関連する。そして、属性の値が処理されることになる場合は常に、属性に関連するメタ情報は、好ましくは、属性値自体を取り出すのに用いられることになるインデックスを決定するのに用いられることになるインデックス導出方法がもしあれば、それを決定するように読み取られる。
【００８１】
したがって、特に好ましい実施形態では、頂点毎またはインスタンス毎にのみ定義される頂点シェーダ入力属性に依存する、各々の識別された出力属性は、その頂点シェーダ出力属性が必要とされる時に、次のグラフィックス処理段階に適切な単一の格納された頂点シェーディングされた出力属性値を使用させる、メタ情報を自身と関連付けている。このメタ情報は、好ましくは、用いる正しい頂点シェーダ出力属性値(頂点シェーディングされた出力属性値の単一の格納されたコピー)を取り出すために、次のグラフィックス処理段階により用いられる。
【００８２】
特に好ましい実施形態では、このメタ情報は属性記述子の形態であってよく、属性記述子はとりわけ、対応する属性が「除数(divisor)」属性(すなわち「折りたたまれていない」出力インデックスに除算を適用して、使用するインデックスを導出しなければならない)であるか、「モジュロ」属性(すなわち「折りたたまれていない」出力インデックスに除算を適用して、使用するインデックスを導出しなければならない)であるか、または「通常の」または「線形の」属性(すなわち「折りたたまれていない」出力インデックスを直接用いなければならない)であるかどうか、および必要に応じて、対応する除数値またはモジュロ値(詰め込まれたインスタンスサイズ(および必要ならばインスタンス除数))であるかどうかを、示す。
【００８３】
上で論じられた好ましい構成では、頂点毎に定義された頂点シェーダ入力属性にのみ依存する頂点シェーダ出力属性は、詰め込まれたインスタンスサイズに等しいモジュロ値を有するモジュロ属性として定義され、インスタンス毎に定義された頂点シェーダ入力属性にのみ依存する頂点シェーダ出力属性は、詰め込まれたインスタンスサイズ(必要ならば、あらゆる必要なインスタンス除数により乗算される)に等しい除数値を有する除数属性として定義される。
【００８４】
したがって、特に好ましい実施形態では、所望の出力属性値を取り出すことを可能にするための正確なインデックスをどのように導出するかを示す、好ましくは属性記述子の形態にあるメタ情報が、1つの頂点シェーダ出力属性、好ましくは各々の頂点シェーダ出力属性に対して、生成され格納される。次のグラフィックス処理段階(例えばフラグメントシェーダ)は、好ましくはそのメタ情報を用いて、格納された頂点シェーダ出力属性値への所望のインデックスを導出する。
【００８５】
特に好ましい実施形態では、この機構はまた、頂点シェーダの出力属性値を格納するために、頂点シェーダにより用いられる。このことは、頂点シェーダに、頂点毎またはインスタンス毎の頂点シェーダ入力属性にのみ依存する出力属性値の1つのコピーのみを格納させるための機構にとって、特に都合がよい。その理由は、頂点シェーダに、出力属性値が生成され始める頂点およびインスタンスの各組合せについて、出力属性値を格納すべき同一の頂点インデックスまたはインスタンスインデックスを導出させるためである。
【００８６】
したがって、頂点シェーダへの属性格納命令は、好ましくは、属性の対象の値に関連して用いられることになる折りたたまれていない出力インデックスを含みまたは示し、次いで頂点シェーダは、そのインデックスをどのように処理して、処理されることになる出力属性の値を格納するのに用いられることになる実際のインデックス(頂点インデックスまたはインスタンスインデックス)を導出するかを、メタ情報から決定する。
【００８７】
特に好ましい実施形態では、各々の頂点シェーダ出力属性は、対応する出力属性記述子を有する。最も好ましくは、各頂点シェーダ入力属性はまた、対応する入力属性記述子を有する。
【００８８】
頂点シェーダ出力属性記述子は、上で論じられたように、好ましくは、自身の出力属性値をどこに書き込むかを決定するために頂点シェーダにより用いられ、出力属性値をどこで読み取るかを決定するために、フラグメントシェーダのような次のグラフィックス処理段階により用いられる。入力属性記述子は好ましくは、とりわけ頂点シェーダの入力属性値に正確にアクセスするために頂点シェーダによって用いられる。
【００８９】
したがって、特に好ましい実施形態では、頂点シェーダのそれぞれの出力属性に各々関連し対応する、複数の属性記述子を含む、メタ情報のアレイが存在し、その属性記述子はとりわけ、頂点シェーダまたはフラグメントシェーダのようなグラフィックス処理段階が、メモリ内の適切な場所に属性値を格納し、またはそこから属性値を取り出すことを可能にするための、情報を含む。
【００９０】
同様に、頂点シェーダのそれぞれの入力属性に各々関連し対応する、複数の属性記述子を含む、メタ情報のアレイが好ましくは存在する。
【００９１】
属性記述子は好ましくは、描画呼び出し時にグラフィックスプロセッサドライバにより生成される。最も好ましくは、ドライバは、頂点シェーダ出力属性(および入力属性)の頂点毎またはインスタンス毎の依存性(またはその両方の依存性またはどちらにも依存性がないこと)を判定すると、属性記述子を適切に生成し格納する。
【００９２】
したがって、好ましい実施形態では、グラフィックスプロセッサドライバは、頂点シェーダに、頂点毎のみまたはインスタンス毎のみの頂点シェーダ入力属性に依存する出力属性値を、生成される度にメモリの同じ場所に書き込ませるために、メタ情報(好ましくは頂点シェーダ出力属性と関連する)を生成するように構成される。
【００９３】
グラフィックス処理段階が属性値を処理しようとする時に読み取る(用いる)ことになる関連するメタ情報、例えば属性記述子は、任意の所望される適切な方式で示されうる。特に好ましい実施形態では、各属性は属性インデックスに割り当てられ、これらの属性インデックスは次いで、用いるべきメタ情報(属性記述子)を示すために用いられる。好都合なことに、属性インデックスは、例えば頂点シェーダコンパイラによって、割り当てられうる。
【００９４】
したがって、特に好ましい実施形態では、メタ情報(属性記述子)は、対象の属性に割り当てられる属性インデックスを用いて、識別され読み取られる。最も好ましくは、属性記述子は、属性記述子アレイ(または複数のアレイ)に格納され、その中で、対象の属性に割り当てられた属性インデックスを用いてインデックスが付けられる。(ここで、属性記述子は特定の属性に関連する(特定の属性値には関連しない)ので、特定のシェーダプログラムについて、任意の特定の描画呼び出しで描かれる頂点およびインスタンスの数に関係なく、一定数の属性記述子が存在することに留意されたい。)
【００９５】
用いられることになるメタ情報(属性記述子)の属性インデックスは、好ましくは、対応する格納命令またはロード命令において、グラフィックス処理段階に提供される。
【００９６】
したがって、定義された属性インデックスを用いてインデックスが付けられたメタ情報アレイが好ましくは存在する。そして、頂点シェーダまたはフラグメントシェーダのようなグラフィックス処理段階は、(例えば、かつ好ましくは、ロード命令または格納命令中の)受け取った属性インデックスを用いてメタ情報を探し、メタ情報がそのような情報を示す場合には、処理すべき属性値を提供された出力インデックスに適切な方式で格納するまたはそこから取り出すのに用いられることになる、実際のインデックスを導出する。
【００９７】
特に好ましい実施形態では、上で論じられたように、属性値を取り出すのに用いられる、インスタンスインデックス、頂点インデックス、または「折りたたまれていない」インデックスのような特定のインデックスが、関連するインデックスが付けられた属性値の開始(基本)アドレスを定める基本メモリ(バッファ)アドレスに関して用いられる。これは、例えば、属性値が関連するインスタンスを参照することでインデックスが付けられる全ての属性値が、メモリ内の単一の共通の基本バッファアドレスと関連してそのようにインデックスが付けられうるということを意味する。このことは、属性値が例えば、属性値に関する頂点、インスタンスまたは頂点/インスタンスの組合せに関連してインデックスを付けることができる時、メモリ内での属性値のローディングおよび格納、ならびに属性値の編成を単純化する。
【００９８】
特に好ましい実施形態では、適切なインデックスおよびバッファ基本アドレスに加えて、属性値を取り出すときに、および取り出すために、さらなる情報が用いられる。特に好ましい実施形態では、このさらなる情報は、メモリ内(バッファ内)の属性値のレイアウトに関するさらなるパラメータまたは情報を含む。メモリ内での属性値のレイアウトに関するこのさらなる情報は、好ましくは、メモリ内の属性値の間隔の表示(好ましくは「ストライド」値の形態)、対象の属性の基本メモリアドレスに対する相対的な位置の表示(好ましくは「オフセット」値の形態)、ならびに/または、属性のコンポーネントデータの種類およびコンポーネントの数を示す、属性値の「タイプ」インジケータのうちの1つまたは複数、好ましくは全てを含む(好ましい実施形態では、属性ロード命令および属性格納命令は、規定されたデータタイプに基づいてデータフォーマット変換を実行する)。
【００９９】
これらの構成では、それに応じて、グラフィックス処理段階は、属性値を格納または取り出すための適切なバッファ基本アドレス(および必要な場合には他の情報)とともに、所望の属性値を取り出す(または格納する)のに用いられることになるインデックスを導出するのに用いる技術を示すもの、および導出に必要な任意のデータを、好ましくは備える。したがって、特に好ましい実施形態では、グラフィックス処理段階は、インデックスおよび基本メモリアドレスを、好ましくはストライド、オフセット、および/またはデータタイプのような他のデータとともに備え、それらのデータから、属性値を格納または取り出すのに用いるメモリアドレスを導出する。
【０１００】
バッファ基本アドレスなどの情報は、ロード(または格納)命令により直接提供されまたは示されうる。しかし、特に好ましい実施形態では、バッファ基本アドレスは、好ましくは属性記述子の形態にあるメタ情報として提供され、メタ情報は、好ましくは上で論じられた方式で、対象の属性と関連付けられる。ストライド、オフセットおよびデータタイプ(用いられる場合)のような他の情報も、好ましくはこの形態で提供される。
【０１０１】
したがって、特に好ましい実施形態では、(上で論じられたような)各属性記述子は、好ましくは、バッファ基本アドレス(メモリ基本アドレス)を、好ましくはその属性の値を取り出すまたは格納する際に用いられることになるストライド、オフセット、データタイプのような他の情報とともに、さらにまたは代わりに(好ましくは同様に)示す。したがって、特に好ましい実施形態では、1つの、好ましくは各々の属性記述子は、とりわけ、関連する属性の値がロードされ格納される時に用いられることになる、基本バッファアドレスおよびインデックス導出機構(および好ましくは、ストライド、オフセット、データタイプのような、他の情報)を示す。
【０１０２】
したがって、特に好ましい実施形態では、所望の出力属性値を取り出しまたは格納できるようにするための適切なインデックス、およびインデックスに関連する基本メモリアドレスとともに、好ましくは、ストライド、オフセット、データタイプのような他の情報を、どのように導出するかを示す、好ましくは属性記述子の形態にあるメタ情報が、1つの、好ましくはいくつかまたは各々の頂点シェーダ出力属性に対して生成され格納される。次いで、グラフィックス処理段階(例えば頂点シェーダまたはフラグメントシェーダ)は好ましくは、そのメタ情報を用いて、頂点シェーダ出力属性値を格納すべきまたは格納するメモリアドレスを導出する。
【０１０３】
頂点シェーダ入力属性は、好ましくは同じ方法で構成される。すなわち、頂点シェーダ入力属性は、対応する関連するメタ情報を、好ましくは属性記述子の形態で有し、メタ情報は、上で論じられた頂点シェーダ出力属性と同じ方式で、インデックスを導出し基本メモリアドレス情報を提供する。
【０１０４】
上で論じられたように、頂点シェーダ(または複数の頂点シェーダ)は、好ましくは、頂点毎またはインスタンス毎にのみ定義された頂点シェーダ入力属性に依存する所与の出力属性値を、メモリに一度だけ書き込むように制御される。頂点シェーダ(または複数の頂点シェーダ)は、任意の適切で所望される方式でこれを行うように制御されうる。
【０１０５】
頂点毎にのみ定義される頂点シェーダ入力属性に依存する出力属性値が、その頂点毎に依存する出力値が生成されるべき対象のインスタンスの列の中の1つの特定のインスタンス  (例えば、かつ好ましくは、インスタンスが0、1、2、…と番号付けられる場合にはインスタンス0)にのみ書き込まれ、インスタンス毎にのみ定義される頂点シェーダ入力属性に依存する出力属性値が、そのインスタンス毎に依存する出力値が生成されるべき対象の頂点の列の中の1つの特定の頂点(例えば、かつ好ましくは、頂点が0、1、2、…と番号付けられる場合には頂点0)にのみ書き込まれるような、構成が好ましい。
【０１０６】
特に好ましい実施形態では、頂点シェーダ(または複数の頂点シェーダ)は、頂点毎のみまたはインスタンス毎のみの頂点シェーダ入力属性に依存する所与の出力属性値を、頂点シェーダの出力属性に関連するメタ情報によって、メモリに一度書き込むように好ましくは制御され、このメタ情報は好ましくは、出力属性値をメモリに書き込むかどうかを判定するように、頂点シェーダを動作させる。
【０１０７】
最も好ましくは、出力属性値をメモリ(例えば出力属性値アレイ)に書き込むかどうかを判定しなければならないかどうかを見るために、データを生成する頂点シェーダが確認することができるフラグ(「書き込み削減」フラグ)が存在する。
【０１０８】
メタ情報(例えば「書き込み削減」フラグ)は、好ましくは、グラフィックスプロセッサドライバにより、好ましくは上で論じられたように描画呼び出し時に生成される。それは、描画呼び出し時が、出力属性の頂点毎のみまたはインスタンス毎のみの関連する依存性が判定されうる時であるためである。
【０１０９】
特に好ましい実施形態では、この「書き込み」メタ情報(例えば「書き込み削減」フラグ)は、対象の出力属性のための(上で論じられたような)関連する属性記述子に含まれる。そして、属性記述子を読み取ることによって、出力属性値を出力属性値アレイに書き込むべきかどうかが判定されうる。
【０１１０】
「書き込み」メタ情報(例えば属性記述子中の)は、好ましくは、出力値が書き込まれるべきかどうかを試験(test)する必要があるかどうかを示す。好ましくは、書き込みメタ情報および/または他のメタ情報は、試験がとらなければならない形態および試験に必要な任意のパラメータを示す(試験の結果、出力値がメモリ(例えば出力属性値アレイ)に書き込まれるべきかどうかを判定する)。
【０１１１】
したがって、好ましい実施形態では、頂点シェーダは、属性値(または少なくとも属性値の現在の反復)がメモリに書き込まれるべきかどうかを判定するために、試験を実行するように動作させられる。
【０１１２】
上で論じられたような、頂点毎にのみまたはインスタンス毎にのみ定義される頂点シェーダ入力属性に依存する頂点シェーダ出力属性がモジュロ属性または除数属性として分類される、特に好ましい実施形態では、書き込みメタ情報、例えば書き込み削減フラグが設定されると、モジュロ値(詰め込まれたインスタンスサイズ)により除算された、丸められた出力インデックスが0である場合は、頂点シェーダはモジュロ属性の出力値のみを格納し(メモリに書き込み)、出力インデックスの除数値に対する剰余が0である場合は、除数属性の出力値のみを格納する(メモリに書き込む)。
【０１１３】
このことは、頂点毎にのみ定義された頂点シェーダ入力属性に依存する出力属性値は、インスタンス0に対してのみ書き込まれ、インスタンス毎にのみ定義された頂点シェーダ入力属性に依存する出力属性値は、頂点0に対してのみ書き込まれる、という効果を有する。したがって、重複出力属性値の各々の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つのバッファのみで十分である)。)
【０２３１】
したがって、頂点毎にのみ定義される頂点シェーダ入力属性にのみ依存する出力の(セカンダリ)属性はモジュロ属性として定義され、インスタンス毎にのみ定義される頂点シェーダ入力属性にのみ依存する出力の(セカンダリ)属性は除数属性として定義される。(上で論じられたように、頂点毎にのみ(またはインスタンス毎にのみ)定義される頂点シェーダ入力属性にのみ依存する頂点シェーダ出力の(セカンダリ)属性へのここまたは他での言及は、頂点シェーダ出力の(セカンダリ)属性が依存する全ての頂点シェーダ入力の(プライマリ)属性に関して、そのことが成り立つということを指す。頂点シェーダ出力の(セカンダリ)属性は、例えば描画呼び出し毎の入力の値など、他の値に依存してもよく、頂点シェーダ出力の(セカンダリ)属性が頂点毎にのみ(またはインスタンス毎にのみ)定義される頂点シェーダ入力属性にのみ依存するものとして言及することは、頂点シェーダ出力の(セカンダリ)属性が、そのような他の入力、例えば描画呼び出し毎の入力にも依存することを排除しない。)
【０２３２】
ドライバはまた、モジュロおよび除数のセカンダリ属性記述子の中に、以下の動作により「書き込み削減」フラグも含める。
モジュロ属性は、モジュロ値により除算された折りたたまれていないインデックス(丸め済み)が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  ポリゴンリストアレイ
【図１】
0006008515.tif 000002
【図２Ａ】
0006008515.tif 000003
【図２Ｂ】
0006008515.tif 000004
【図３】
0006008515.tif 000005
【図４】
0006008515.tif 000006
【図５】
0006008515.tif 000007
【図６】
0006008515.tif 000008
【図７】
0006008515.tif 000009