(57)【特許請求の範囲】
【請求項１】
それぞれが描画演算処理に繰り返し利用されるデータの単位である描画ユニットのデータを保持する複数のレジスタと、
前記複数のレジスタを交互に選択し、選択されたレジスタが保持する前記描画ユニットのデータを読み出す選択部と、
前記選択部により読み出された前記描画ユニットのデータが順次投入され、前記複数の描画ユニットを連続的に演算処理する演算部とを含み、
前記選択部は、順次投入される前記描画ユニットのデータの前記演算部への投入タイミングを、１つ前に投入された描画ユニットのデータの投入直後に最初に投入可能となるタイミングを避けて所定の時間だけシフトさせることを特徴とする描画処理装置。
【請求項２】
前記投入タイミングのシフト量は、前記演算部による演算レイテンシに応じた値に設定されることを特徴とする請求項１に記載の描画処理装置。
【請求項３】
前記演算部は、同一の描画ユニットに適用すべき命令を、交互に投入される描画ユニット数に応じた間隔を空けて実行することを特徴とする請求項１または２に記載の描画処理装置。
【請求項４】
前記演算部による描画ユニットの演算処理結果をメモリに書き込む処理を行う書き込み部をさらに含み、前記投入タイミングのシフト量は、前記書き込み部による処理レイテンシに応じた値に設定されることを特徴とする請求項１に記載の描画処理装置。
【請求項５】
前記描画ユニットのデータに対する既に生成済みの演算処理結果をメモリから読み出し、前記演算部による描画ユニットのデータに対する演算処理結果との間で処理を行って、前記メモリに書き戻すリードモディファイライト部をさらに含み、前記投入タイミングのシフト量は、前記リードモディファイライト部によるリードモディファイライトのレイテンシに応じた値に設定されることを特徴とする請求項１に記載の描画処理装置。
【請求項６】
各描画ユニットを処理するプログラムの命令を描画ユニット単位で交互に前記演算部に供給する制御部をさらに含むことを特徴とする請求項１から５のいずれかに記載の描画処理装置。
【請求項７】
前記制御部は、各描画ユニットを処理する前記プログラムの命令のアドレスを指すプログラムカウンタ値を発生する手段を有し、前記制御部は、各プログラムカウンタ値に基づいて各描画ユニットを処理する前記プログラムの命令を読み出して前記演算部に供給することを特徴とする請求項６に記載の描画処理装置。
【請求項８】
前記制御部は、交互に投入される描画ユニット数に対応した個数のプログラムカウンタを有し、各プログラムカウンタは、各描画ユニットを処理する前記プログラムの命令のアドレスを保持し、前記制御部は、各プログラムカウンタの値を交互にカウントアップしながら、各プログラムカウンタの値に基づいて各描画ユニットを処理する前記プログラムの命令を読み出して前記演算部に供給することを特徴とする請求項６に記載の描画処理装置。
【請求項９】
前記制御部は、各描画ユニットのデータの前記演算部への前記投入タイミングに合わせて、その描画ユニットを処理するプログラムの命令のアドレスを保持するプログラムカウンタの値のカウントアップを開始することを特徴とする請求項８に記載の描画処理装置。
【請求項１０】
前記制御部は、各プログラムカウンタ値に基づいて読み出された前記プログラムの命令を前記演算部の演算処理の段階に合わせてシフトさせて前記演算部に供給するシフタをさらに含むことを特徴とする請求項７から９のいずれかに記載の描画処理装置。
【請求項１１】
描画演算処理に繰り返し利用されるデータの単位である描画ユニットを複数個連続的に演算処理する演算部に複数の前記描画ユニットのデータが順次投入される際に、順次投入される前記描画ユニットのデータの前記演算部への投入タイミングが、１つ前に投入された描画ユニットのデータの投入直後に最初に投入可能となるタイミングを避けて所定の時間だけシフトされた上で、複数の前記描画ユニットが交互に前記演算部に投入されることを特徴とする描画処理方法。
【請求項１２】
前記投入タイミングのシフト量は、前記処理によるレイテンシに応じた値に設定されることを特徴とする請求項１１に記載の描画処理方法。
【請求項１３】
前記演算部において、同一の描画ユニットに適用すべき命令が、交互に投入される描画ユニット数に応じた間隔を空けて実行されることを特徴とする請求項１１または１２に記載の描画処理方法。
【請求項１４】
データ処理に繰り返し利用されるデータの単位であるデータユニットを複数個連続的に処理するデータ処理部と、
前記複数のデータユニットの各々の投入タイミングを前記データ処理部による処理のレイテンシに応じてシフトした上で、前記複数のデータユニットを交互に前記データ処理部に投入する選択部とを含み、
前記選択部は、前記複数のデータユニットの各々の前記データ処理部への投入タイミングを、１つ前に投入されたデータユニットの投入直後に最初に投入可能となるタイミングを避けてシフトさせることを特徴とする情報処理装置。
【請求項１５】
各データユニットを処理するプログラムの命令をデータユニット単位で交互に前記データ処理部に供給する制御部をさらに含むことを特徴とする請求項１４に記載の情報処理装置。
【請求項１６】
データ処理に繰り返し利用されるデータの単位であるデータユニットを複数個連続的に処理するデータ処理部に複数の前記データユニットが投入される際に、複数の前記データユニットの各々の前記処理部への投入タイミングが、１つ前に投入されたデータユニットの投入直後に最初に投入可能となるタイミングを避けて所定の時間だけシフトされた上で、複数の前記データユニットが交互に前記データ処理部に投入されることを特徴とする情報処理方法。
【請求項１７】
各データユニットを処理するプログラムの開始タイミングを各データユニットのデータの前記処理への前記投入タイミングに合わせた上で、各データユニットを処理する前記プログラムの命令がデータユニット単位で交互に前記データ処理部に制御部により供給されることを特徴とする請求項１６に記載の情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明はデータを演算処理する情報処理技術、とくに描画データを処理する描画処理装置および描画処理方法に関する。
【背景技術】
【０００２】
３次元コンピュータグラフィックスにおけるレンダリングエンジンは、複雑で高度なシェーディングアルゴリズムに対応するため、プログラマビリティをもった、よりプロセッサライクなものに変わりつつある。すなわち、レンダリングエンジンは、固定のグラフィックス機能を実装したハードウエアから、ＣＰＵと同じような命令セットを備えた演算ユニットを内蔵し、プログラミングによってフレキシブルに機能を追加していくことができるプロセッサへとその姿を変えつつある。
【０００３】
ＣＰＵの高速化に伴って、レンダリングエンジンにおけるメモリのアクセス性能と演算ユニットの処理性能の格差が広がる傾向にある。具体的には、演算ユニットがピクセルデータを演算処理し、リードモディファイライト（Read-Modify-Write；ＲＭＷ）ユニットがフレームバッファに対してピクセルデータを読み書きするが、ピクセルデータをリードモディファイライトするためのレイテンシが演算ユニットのレイテンシに比べて非常に長いため、レンダリング処理の性能を低下させてしまう。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
プロセッサタイプのレンダリングエンジンでは、演算ユニットがある程度長いレイテンシをもち、投入するデータの依存性によっては、演算レイテンシ分だけ動作を停止させる必要があることから、パイプライン処理に空き時間（バブルという）が発生することがあり、効率が低下しやすい。また、バブルを隠蔽化させるためには、シェーダのコードに工夫を加えるなど、ソフトウエアで対応するしかなく、アプリケーションの開発を困難にさせる要因になっている。
【０００５】
メモリレイテンシの問題については、フレームバッファのリードモディファイライト時には、データの一貫性（consistency）を保証する必要があり、複雑な制御を実装できないといった制限があるため、シェーダとＲＭＷユニットを分離し、ＲＭＷユニットはフレームバッファへの読み書きを単純なパイプラインで処理することで対処していた。シェーダは、フレームバッファにアクセスしないため、プログラムを柔軟に実行できるようになるが、シェーダにより複雑なシェーディングアルゴリズムを実行させたり、画像処理などの高度な演算処理を行わせるために、ＲＭＷ機能も含めた描画処理全体をより一層、高機能化したいというニーズが高まっている。しかし、ＲＭＷ機能を含めて高機能するには、メモリレイテンシが非常に長いため、演算レイテンシの場合以上に、バブルによる処理効率の低下の問題が大きくなる。
【０００６】
本発明はこうした課題に鑑みてなされたものであり、その目的は、処理レイテンシを隠蔽化し、処理効率を高めることができる情報処理技術および描画処理技術を提供することにある。また、別の目的は、プログラマビリティが高く、柔軟に複雑な機能を実現することのできる描画処理技術を提供することにある。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明のある態様の描画処理装置は、それぞれが描画ユニットのデータを保持する複数のレジスタと、前記複数のレジスタを交互に選択し、選択されたレジスタが保持する前記描画ユニットのデータを読み出す選択部と、前記選択部により読み出された前記描画ユニットのデータが順次投入されて、前記複数の描画ユニットを連続的に演算処理する演算部とを含む。
【０００８】
ここで、「描画ユニット」は、描画演算処理に利用される任意のデータのあるまとまった単位であり、たとえば、単一のピクセル、複数のピクセルの集まりなどである。「複数の描画ユニットを連続的に演算処理する」とは、たとえば、複数の段階からなる一続きの処理について、各段階の処理機構を独立して動作させることにより、多数の処理を流れ作業的に高速に実行するパイプライン処理などで演算処理することを含む。この演算部は、複数のパイプラインで並列に命令を処理するスーパースカラの構成を備えてもよい。
【０００９】
前記選択部は、前記複数の描画ユニットのデータの前記演算部への投入タイミングを描画ユニット毎にシフトさせてもよい。前記投入タイミングのシフト量は、演算レイテンシやメモリレイテンシなど、描画ユニットの一連の処理のレイテンシに応じた値に設定されてもよい。たとえば、順に投入される２つの描画ユニットの投入間隔が、そのような処理のレイテンシ分もしくはそれ以上空いていてもよい。ここで、投入タイミングのシフト量は、ハードウエア固有の値に設計時に設定され、固定されてもよい。また、投入タイミングのシフト量は、任意の値に設定でき、外部から適宜変更可能であってもよい。
【００１０】
前記演算部は、同一の描画ユニットに適用すべき命令を、交互に投入される描画ユニット数に応じた間隔を空けて実行してもよい。たとえば、同一の描画ユニットに適用される連続する２つの命令の実行タイミングの間隔が、交互に投入される描画ユニット数分の命令の処理時間もしくはそれ以上空いていてもよい。
【００１１】
各描画ユニットを処理するプログラムの命令を描画ユニット単位で交互に前記演算部に供給する制御部をさらに含んでもよい。前記制御部は、さらに各描画ユニットを処理するプログラムの命令を描画ユニット単位で交互に前記書き込み部や前記リードモディファイライト部などのデータ処理部に供給してもよい。
【００１２】
前記制御部は、各描画ユニットを処理する前記プログラムの命令のアドレスを指すプログラムカウンタ値を発生する手段を有し、前記制御部は、各プログラムカウンタ値に基づいて各描画ユニットを処理する前記プログラムの命令を読み出して前記演算部に供給してもよい。各描画ユニットを処理するプログラムのプログラムカウンタ値を発生する手段として、描画ユニット数に対応した個数のプログラムカウンタを設け、各プログラムカウンタに各描画ユニットを処理するプログラムの命令のアドレスを保持させてもよい。あるいは、単一のプログラムカウンタを設け、その単一のプログラムカウンタの値から演算によって各描画ユニットを処理するプログラムのプログラムカウンタ値を生成してもよい。
【００１３】
前記制御部は、交互に投入される描画ユニット数に対応した個数のプログラムカウンタを有し、各プログラムカウンタは、各描画ユニットを処理する前記プログラムの命令のアドレスを保持し、前記制御部は、各プログラムカウンタの値を交互にカウントアップしながら、各プログラムカウンタの値に基づいて各描画ユニットを処理する前記プログラムの命令を読み出して前記演算部に供給してもよい。前記制御部は、各描画ユニットのデータの前記演算部への前記投入タイミングに合わせて、その描画ユニットを処理するプログラムの命令のアドレスを保持するプログラムカウンタの値のカウントアップを開始してもよい。これにより、前記選択部による描画ユニットの投入タイミングに合わせて、前記制御部は、投入された描画ユニットに対する命令を前記演算部に供給することができる。
【００１４】
前記制御部は、各プログラムカウンタ値に基づいて読み出された前記プログラムの命令を前記演算部の演算処理の段階に合わせてシフトさせて前記演算部に供給するシフタをさらに含んでもよい。これにより、前記演算部の演算処理の各段階に応じて、前記制御部は、描画ユニットに適用すべき命令を順次供給することができる。
【００１５】
本発明の別の態様は、描画処理方法である。この方法は、複数の描画ユニットを連続的に処理する際に、前記複数の描画ユニットを交互に前記処理に投入する。前記複数の描画ユニットのデータの前記処理への投入タイミングを描画ユニット毎にシフトさせてもよい。前記処理において、同一の描画ユニットに適用すべき命令が、交互に投入される描画ユニット数に応じた間隔を空けて実行されてもよい。
【００１６】
本発明のさらに別の態様は、情報処理装置である。この装置は、複数のデータユニットを連続的に処理するデータ処理部と、前記複数のデータユニットの各々の投入タイミングを前記データ処理部による処理のレイテンシに応じてシフトした上で、複数のデータユニットを交互に前記データ処理部に投入する選択部とを含む。各データユニットを処理するプログラムの命令をデータユニット単位で交互に前記データ処理部に供給する制御部をさらに含んでもよい。
【００１７】
本発明のさらに別の態様は、情報処理方法である。この方法は、複数のデータユニットを連続的に処理する際に、前記複数のデータユニットの各々の投入タイミングを前記処理のレイテンシに応じてシフトした上で、前記複数のデータユニットを交互に前記処理に投入する。各データユニットを処理するプログラムの開始タイミングを各データユニットのデータの前記処理への前記投入タイミングに合わせた上で、各データユニットを処理する前記プログラムの命令をデータユニット単位で交互に前記処理に供給してもよい。
【００１８】
なお、以上の構成要素の任意の組合せ、本発明の表現を方法、装置、システム、コンピュータプログラム、データ構造などの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【００１９】
本発明によれば、連続処理されるデータの演算効率を上げることができ、また、効率良く描画処理を行うことができる。
【発明を実施するための最良の形態】
【００２０】
図１は、実施の形態に係る描画処理装置１００の構成図である。描画処理装置１００は、３次元モデル情報をもとに描画データを生成するレンダリング処理を行う。
【００２１】
ラスタライザ１０は、メモリもしくは他のプロセッサや頂点シェーダなどから描画プリミティブの頂点データを取得し、描画するスクリーンに対応したピクセル情報に変換する。描画プリミティブは一般的には三角形であり、ラスタライザ１０は、３次元空間上の三角形を投影変換により描画平面上の三角形に変換するビュー変換を行い、さらに、描画平面上の三角形を描画平面の水平方向に沿ってスキャンしながら、１列毎に量子化されたピクセルに変換する。ラスタライザ１０により、描画プリミティブがピクセル展開され、各ピクセルについて、ＲＧＢ３原色で表されるカラー値、透明度を示すアルファ（α）値、奥行きを示すＺ値などを含むピクセル情報が算出される。
【００２２】
ラスタライザ１０は、スキャンラインに沿って描画ユニットを生成し、シェーダユニット３０に与える。ラスタライザ１０からシェーダユニット３０に供給された描画ユニットは、キューにスタックされ、シェーダユニット３０は、キューにスタックされた描画ユニットを順に処理する。
【００２３】
ここで、描画ユニットは、一般には、所定の大きさのピクセル領域であり、１つのピクセルであることも、複数のピクセルの集合であることもある。以下では、説明の簡単のため、描画ユニットが複数のピクセルからなる場合でも、描画ユニット内部での個々のピクセルの処理を隠蔽して、描画ユニット全体で１つのピクセルであるとみなして、本実施の形態に特徴的な描画処理方法を説明する。
【００２４】
テクスチャユニット５０は、シェーダユニット３０からテクスチャデータを指定するパラメータの入力を受け取り、テクスチャデータのアドレスを算出して、フレームバッファ４０に対して必要なテクスチャデータを要求する。テクスチャユニット５０は、フレームバッファ４０から読み出されたテクスチャデータをキャッシュし、画像データや法線データなどの２次元または３次元データをマッピングして、ラスタライザ１０において算出された各ピクセルのＵＶ座標に対応したピクセルデータを生成する。テクスチャユニット５０は、生成したピクセルデータをシェーダユニット３０に出力する。
【００２５】
シェーダユニット３０は、ラスタライザ１０により算出されたピクセルデータをもとに、シェーディング処理を行い、テクスチャユニット５０により得られたピクセルデータをもとに、テクスチャマッピング後のピクセル色を定め、フレームバッファ４０に描画データを書き込む。シェーダユニット３０は、さらに、フレームバッファ４０に保持された描画データに対して、フォギング、アルファブレンディング等の処理を行い、最終的な描画色を求め、フレームバッファ４０の描画データを更新する。フレームバッファ４０に記憶された描画データは、表示装置に出力されて表示される。
【００２６】
ＲＭＷユニット２０は、フレームバッファ４０に記憶された生成済みのピクセルデータを読み込み、シェーダユニット３０で生成されたピクセルデータと比較し、Ｚテストや、アルファブレンディングなどのピクセルデータの合成処理などを行い、更新されたピクセルデータをフレームバッファ４０に書き戻す。ＲＭＷユニット２０は、このリード、モディファイ、ライトの一連の動作からなるリードモディファイライト操作をパイプライン処理で行う。後述のように、実施の形態では、ＲＭＷユニット２０を外し、シェーダユニット３０にＲＭＷ機能をもたせ、シェーダユニット３０が直接フレームバッファ４０に対してピクセルデータのリードモディファイライトができるようにする。ここでは、後述のＲＭＷ機能をもつシェーダユニット３０との比較のため、ＲＭＷユニット２０の構成を示している。
【００２７】
図２は、本実施の形態に係るシェーダユニット３０の構成を説明する図である。シェーダユニット３０は、レジスタ群３２とオペレータ３４を含む。レジスタ群３２は、複数のレジスタを含み、ラスタライザ１０およびテクスチャユニット５０から投入されるピクセルデータを保持する。また、レジスタ群３２は、フレームバッファ４０に記憶されたピクセルデータを読み込んで保持する。オペレータ３４は、レジスタ群３２からピクセルデータを読み出し、シェーダコードを実行してピクセルデータをパイプライン処理し、その結果をレジスタ群３２に書き戻したり、フレームバッファ４０に書き込んだりする。
【００２８】
シェーダユニット３０が実行するプログラムにおいて、たとえば、ある命令の実行結果を次の命令で使用するなど、命令間に依存性が存在する場合、オペレータ３４の演算レイテンシ分だけ動作を停止させる必要がある。この停止により生じる命令間の空き時間はバブルと呼ばれる。処理効率を上げるためには、依存性のない命令を連続して並べ、できるだけバブルを発生させないようにする必要がある。しかし、概してピクセルシェーダコードは、ＣＰＵの汎用プログラムと違って、非常に単純な処理を実行するものであるから、依存性の少ない命令を並べることは困難である。そこで、複数の異なるピクセルに対する命令を交互に実行するピクセルインターリーブにより、演算レイテンシを隠蔽化することが考えられる。以下、ここで説明するピクセルインターリーブを、後述の拡張ピクセルインターリーブと区別する意味で、「単純なピクセルインターリーブ」と呼ぶことにする。
【００２９】
図３（ａ）、（ｂ）は、シェーダユニット３０による単純なピクセルインターリーブを説明する図である。ここでは、４個のピクセルをインターリーブする例を示す。図３（ａ）は、ピクセルインターリーブを行うためのシェーダユニット３０の構成を示す。レジスタ群３２は、インターリーブするピクセル数（以下、ピクセルインターリーブ数ともいう）に対応して第１〜第４のレジスタ３２ａ〜３２ｄを含み、第１〜第４のレジスタ３２ａ〜３２ｄのいずれかに格納されたピクセルデータがセレクタ３３ａ〜３３ｃを介してオペレータ３４に交互に投入されることにより、４ピクセルのインターリーブが実現される。
【００３０】
ここで、セレクタ３３ａ〜３３ｃはオペレータ３４における演算子の項数に応じて設けられ、命令サイクル毎に、第１〜第４のレジスタ３２ａ〜３２ｄのいずれかを交互に選択し、選択されたレジスタに保持されたピクセルデータをオペレータ３４に投入する。ここでは、オペレータ３４が（ａ×ｂ＋ｃ）の形の３項演算子であるため、３個のセレクタ３３ａ〜３３ｃが設けられている。以下、セレクタ３３ａ〜３３ｃを総称してセレクタ３３という。オペレータ３４は、複数の演算操作をパイプライン処理するものであり、パイプラインによる演算のレイテンシはここでは８サイクルであるとする。
【００３１】
図３（ｂ）は、４個のピクセルに対する命令がインターリーブされて実行される様子を示す。ここで、Ｐｎ−ｍ（ｎ、ｍは整数）は、ピクセル演算の１単位の命令を示し、ｎはピクセルＩＤ、ｍは命令ＩＤを示す。同図では、横軸に時間ｔをとり、命令の実行順序が示されている。１サイクルから９サイクルまで、Ｐ０−１、Ｐ１−１、Ｐ２−１、Ｐ３−１、Ｐ０−２、Ｐ１−２、Ｐ２−２、Ｐ３−２、Ｐ０−３の順に命令が実行されている。ピクセルＩＤが０〜３のピクセルをピクセル０〜３と呼ぶことにする。
【００３２】
厳密に言えば、セレクタ３３により、第１〜第４のレジスタ３２ａ〜３２ｄのピクセルデータがこの順にオペレータ３４以降のデータ処理ユニットに投入されることで、各ピクセルに対する処理が開始され、各ピクセルデータに適用されるプログラムの連続する命令が後述の制御機構によりオペレータ３４以降のデータ処理ユニットに与えられる。これにより、４個のピクセルに対する命令を交互に実行する単純ピクセルインターリーブが実現される。ここでは、投入されたピクセルデータとそのピクセルデータに対して適用される命令を組み合わせて「ピクセルに対する命令」と呼んでいる。
【００３３】
いまピクセル０に着目すると、ピクセル０に対する命令Ｐ０−１、Ｐ０−２、Ｐ０−３は、ピクセル０に対するプログラムの連続する命令であるが、他のピクセル１〜３の命令が挿入されることによりインターリーブされている。他のピクセル１〜３に着目した場合も同様である。
【００３４】
前半の４つの命令Ｐ０−１、Ｐ１−１、Ｐ２−１、Ｐ３−１は、４つの異なるピクセル０〜３に対して、命令ＩＤが１である同一の命令を実行するものである。また、後半の４つの命令Ｐ１−２、Ｐ２−２、Ｐ３−２は、同様に４つの異なるピクセル０〜３に対して、命令ＩＤが２である同一の命令を実行するものである。
【００３５】
ここで、ピクセル０に対する命令に注目すると、符号２０１で示す命令ＩＤが１である命令Ｐ０−１と、符号２０２で示す命令ＩＤが２である命令Ｐ０−２の間は、４サイクル離れており、オペレータ３４の演算レイテンシである８サイクルより短いため、これら２つの命令は、互いに独立したものでなければならない。仮に依存性があれば、先の命令Ｐ０−１が完了する前に、後の命令Ｐ０−２の実行が始まり、処理結果の一貫性が失われる。
【００３６】
一方、符号２０１で示す命令ＩＤが１である命令Ｐ０−１と、符号２０３で示す命令ＩＤが３である命令Ｐ０−３の間は、８サイクル離れているため、オペレータ３４の演算レイテンシが確保されており、これら２つの命令には依存性があっても問題は生じない。
【００３７】
図３（ｂ）のような単純なピクセルインターリーブをせずに、仮に、同一のピクセルについて命令を順次実行する場合は、オペレータ３４の演算レイテンシが８サイクルであるため、８サイクル分は互いに依存関係にある命令を実行することができない。したがって、演算レイテンシの８サイクルの間は、互いに独立した８個の命令を実行することになる。
【００３８】
一方、図３（ｂ）のように、演算レイテンシが８サイクルである場合に、４ピクセルの命令を交互に実行する単純なピクセルインターリーブを行えば、第１サイクルから第４サイクルまでは、４個の異なるピクセルが順次処理されるため、同一命令が実行されてもよい。第５サイクルでは、第１サイクルと同一のピクセルが処理され、まだ演算レイテンシ内であるから、第１サイクルの命令に依存しない命令が実行されなければならない。このように、４個のピクセルをインターリーブした場合、演算レイテンシの８サイクル内に実行される独立した命令の個数は２個までに減らすことができる。
【００３９】
ただし、上記のピクセルインターリーブにおいて、ＲＭＷ機能を実現した場合、インターリーブされた複数のピクセルはそれぞれフレームバッファ４０の異なる位置を描画するものでなければならない。
【００４０】
たとえば、図３（ｂ）において、第１〜第４サイクルまで、ピクセル０〜３に対して同一の命令を実行しているが、ピクセル０〜３は、ピクセルＩＤが異なっていても、同一位置である可能性がある。なぜなら、描画処理は、複数のオブジェクトをポリゴンモデルで表し、ポリゴン単位で描画処理が行われるため、異なるポリゴンの描画でも画面上の同一ピクセルに対する描画を行っていることが十分にありえる。また、最近の高品質の描画処理では、１つのポリゴンが比較的小さい画素領域に対応しており、極端な場合、１ポリゴンが１ピクセルに対応していることもある。したがって、描画対象のポリゴンが異なっているためにピクセルＩＤが違う番号であったとしても、同一のピクセル位置を指している可能性はかなり高い。
【００４１】
仮に、第１〜第４サイクルにおいて、同一のピクセル位置を描画処理したとすると、たとえば、命令Ｐ０−１でフレームバッファ４０の特定のメモリ領域を取得し、モディファイが完了する前に、次の命令Ｐ１−１で同一位置のピクセルを取得することになり、リードアフターライトエラーが発生する。これを避けるためにはメモリインターロックによる制御、もしくは同一位置の処理がインターリーブ内に存在するかどうかを確認して処理自体をロックさせるなどの制御が必要となる。どちらの制御も性能低下や制御機構の複雑化につながる。そこで、同一位置の描画処理が続けて実行されない工夫が必要となる。
【００４２】
また別の問題として、ピクセルインターリーブにおいてＲＭＷ機能を実現するには、オペレータ３４による演算レイテンシよりも長いＲＭＷのレイテンシを隠蔽する必要が生じる。ＲＭＷのレイテンシは主にメモリレイテンシである。
【００４３】
図４は、ＲＭＷ機能を含むシェーダユニット３０の構成において、ＲＭＷレイテンシを説明する図である。オペレータ３４から出力されたピクセルの処理結果はフォーマットコンバータ３６においてフォーマット変換され、キャッシュ３８を介してフレームバッファ４０に書き込まれる。また、フレームバッファ４０からキャッシュ３８にキャッシュされたデータは、第１〜第４のレジスタ３２ａ〜３２ｄに振り分けられて読み出される。ＲＭＷレイテンシは、符号２１０で示すように、オペレータ３４、フォーマットコンバータ３６、およびキャッシュ３８が、第１〜第４のレジスタ３２ａ〜３２ｄにピクセルデータを保持するために、フレームバッファ４０に対してピクセルデータを読み書きするのにかかる時間である。
【００４４】
このＲＭＷレイテンシは、図３（ａ）で説明したオペレータ３４の演算レイテンシよりもさらに長いため、ＲＭＷレイテンシを隠蔽化するために、図３（ｂ）で示した単純なピクセルインターリーブを行うと、相当数のピクセルをインターリーブすることで、ＲＭＷ命令がＲＭＷレイテンシ内に重複して出現することを避ける必要がある。これはインターリーブするピクセルのデータを保持するためのレジスタ数の増加につながり、実装上困難である。
【００４５】
そこで、本実施の形態では、単純なピクセルインターリーブにおいて、ピクセルの投入タイミングをずらす「ピクセルシフト」を行うことで、ピクセルインターリーブ数を増加させることなく、ＲＭＷの長いレイテンシを隠蔽する。また、ピクセルの投入タイミングをずらしたことにより、ピクセルが離れて投入されるため、同一のピクセル位置に描画してしまうリスクも回避することができる。
【００４６】
以下、単純なピクセルインターリーブにピクセルシフトを組み合わせたピクセルインターリーブを「拡張ピクセルインターリーブ」と呼ぶ。拡張ピクセルインターリーブでは、複数のピクセルに対する命令がピクセル単位でインターリーブされるとともに、ピクセルの投入タイミングすなわちピクセルに対するプログラムの開始タイミングがピクセル毎にずれることにより、ＲＭＷレイテンシ以上の命令間隔が確保される。拡張ピクセルインターリーブは、これから述べるピクセルシフト量とインストラクションシフト量の２つのシフト量で規定される。
【００４７】
ピクセルシフト量とは、連続して投入するピクセルの投入間隔をいう。言い換えれば、ピクセルシフト量は、２つの連続して投入されるピクセルの処理開始時刻の差であり、第１のピクセルに対する最初の命令が実行されてから第２のピクセルに対する最初の命令が実行されるまでの時間間隔のことである。ピクセルシフト量は、ＲＭＷレイテンシ以上の時間間隔に設定される。ＲＭＷレイテンシはハードウエア固有のため、ピクセルシフト量はハードウエア毎に一意の値に定まる。たとえば、ＲＭＷレイテンシが７サイクルであれば、ピクセルシフト量は７サイクル以上に設定される。
【００４８】
一方、インストラクションシフト量とは、同一のピクセルに対するプログラムの命令（インストラクション）の実行間隔をいう。言い換えれば、インストラクションシフト量とは、あるピクセルに対するプログラムにおける連続する命令間の実行間隔であり、第１の命令が実行されてから第２の命令が実行されるまでの時間間隔のことである。インストラクションシフト量は、ピクセルインターリーブ数に対応して設定される。４ピクセルのインターリーブの場合、インストラクションシフト量は、４サイクルに設定される。ここでは、説明の簡単のため、１ピクセルの処理に１サイクルかかるとするが、１ピクセルの処理に数サイクルかかる場合は、インストラクションシフト量は、ピクセルインターリーブ数に処理にかかるサイクル数を乗じたものとなる。また、描画ユニットが複数のピクセルの集合である場合には、ピクセル集合内のピクセル数に応じたサイクル数となる。
【００４９】
インストラクションシフト量を大きくすることは、ピクセルインターリーブ数を増やすことにつながり、ピクセルデータを保持するレジスタなどのハードウエアリソースを消費することになる。インストラクションシフト量は、ハードウエアの設計条件によって決めることができる。
【００５０】
図５は、本実施の形態に係る拡張ピクセルインターリーブを説明する図である。横軸を時間に取り、ピクセル演算プログラムの命令が実行される順序が示されている。
【００５１】
同図において、命令を「ｎ−ｍ」（ｎ、ｍは整数）で表す。ｎはピクセルＩＤ、ｍは命令ＩＤである。同図は、ＲＭＷレイテンシが６サイクルのときに、４ピクセルをインターリーブする例であり、ピクセルシフト量は７サイクルであり、インストラクションシフト量は４サイクルである。ピクセルＩＤは０〜７であり、命令ＩＤは０〜８である。ピクセルＩＤが０〜７のピクセルをピクセル０〜７と呼ぶ。
【００５２】
ピクセル０の最初の命令０−０（符号２２０）が実行されてから、ピクセル１の最初の命令１−０（符号２２２）が実行されるまでには、７サイクルのピクセルシフト量の間隔が設けられる。
【００５３】
ピクセル０に対する第１の命令０−０（符号２２０）が実行されてから、ピクセル０に対する第２の命令０−１（符号２２１）が実行されるまでは、４サイクルのインストラクションシフト量の間隔が設けられる。この間隔は、ピクセルインターリーブ数４に対応している。同様に、ピクセル０の第３の命令０−２が第２の命令０−１の４サイクル後に実行され、以降、同図の斜線で示したように、４サイクルずつ間隔を空けて、第４の命令０−３、第５の命令０−４、…、第９の命令０−８が順に実行される。
【００５４】
同様に、ピクセル１に対するプログラムの命令１−０、１−１、１−２、…、１−８は、ピクセル０に対するプログラムの開始位置から７サイクルだけずれた符号２２２の位置から各命令間を４サイクルずつ間隔を空けて実行される。
【００５５】
以降、ピクセル２、３に対するプログラムの命令が、一つ前のピクセルに対するプログラムの開始位置から７サイクルだけずれた位置から各命令間を４サイクルずつ間隔を空けて実行される。
【００５６】
次に、ピクセル４に対するプログラムの命令の実行位置を見ると、命令４−０は、ピクセルシフトにより、一つ前のピクセル３に対するプログラムの開始位置、すなわち命令３−０の位置から７サイクル後に実行されることになるが、この位置では既に命令０−７が実行されているため、命令４−０は、最も早く実行可能な位置として、命令３−０の位置から１５サイクル後において実行される。このように、ピクセルシフト量だけずらした位置が既に埋まっている場合は、それ以降の空いている最初の位置において命令が実行される。それ以降は、命令４−１、４−２、…、４−８が、各命令間を４サイクルずつ空けて実行される。
【００５７】
以降、同様にしてピクセル５〜７に対するプログラムの命令が順次実行される。
【００５８】
一般に、ピクセルシフト量を大きく取ると、命令間隔が大きくなるが、プログラムが長く、プログラムの命令の数が十分に多ければ、図５のように、プログラムの中間期間ではその命令間隔を完全に埋め尽くすことができる。
【００５９】
同図に示すように、最初に実行される命令０−０から命令２−１の直前までの期間は、実行される命令間に空きがあり、完全には命令が埋まっていない。このようにプログラムの実行が始まり、命令が埋まり始める直前までの時間をプロローグ期間という。また、命令５−７の直後から最後に実行される命令７−８までの期間も、実行される命令間に空きが生じ、完全には命令が埋まっていない。このように命令間に空きが生じ始めてからプログラムが終了するまでの期間をエピローグ期間という。
【００６０】
プログラムの最初のプロローグ期間と最後のエピローグ期間において、命令間に空きが生じるのは、ピクセルシフトを行っていることが原因であるが、ピクセルシフト量は、最低限ＲＭＷレイテンシの時間間隔に設定すればよく、プログラムの大部分である中間期間では連続的に命令が実行されるため、プログラム全体の処理効率を考えた場合、プロローグ期間とエピローグ期間による処理効率への影響は無視できる。
【００６１】
いま、命令ＩＤ＝７がＲＭＷ命令を示しているとする。たとえば、命令０−７、１−７、２−７などがＲＭＷ命令である。符号２３０で示すＲＭＷ命令である命令４−７のレイテンシは６サイクルであり、符号２３１で示す命令７−３の位置でライトが完了する。命令４−７の後のＲＭＷ命令は、命令４−７から数えて７サイクル後の符号２３２で示す命令５−７であり、このときには既に命令４−７のライトは完了している。このように同一の命令は必ずピクセルシフト量だけずれ、ピクセルシフト量はＲＭＷレイテンシ以上に設定しているため、ＲＭＷレイテンシ内でＲＭＷ命令が重複することはない。
【００６２】
ここで、プログラムによってはＲＭＷをリード、モディファイ、ライトに分離して実行する場合もあるが、これは静的に判明することであるから、アセンブラなどのツールにて警告メッセージを出すことで対応することができる。
【００６３】
図６は、図５の拡張ピクセルインターリーブを実行するための制御機構を説明する図である。ピクセルインターリーブ数４に対応して、符号７２で示す第１〜第４のプログラムカウンタＰＣ０〜ＰＣ３が設けられる。第１〜第４のプログラムカウンタＰＣ０〜ＰＣ３を総称するときは、プログラムカウンタＰＣと呼ぶことにする。それぞれのプログラムカウンタＰＣは、ピクセルに対するプログラムにおいて、次に読み込むべき命令のアドレスを記憶するレジスタであり、インストラクションローダ７６によりメモリからプログラムカウンタＰＣで指定された命令が読み込まれるたびに、インクリメンタ７４によりカウントアップされる。
【００６４】
キックカウンタ７０は、これから処理が始まるピクセルに対するプログラムの該当プログラムカウンタＰＣを選択してキックすることで、そのプログラムの実行を開始させる。たとえば、ピクセル０に対するプログラムを開始するタイミング、すなわち図５における命令０−０を実行するタイミングにおいて、キックカウンタ７０はプログラムカウンタＰＣ０をキックする。これにより、ピクセル０に対するプログラムの最初の命令０−０がインストラクションローダ７６により読み出される。
【００６５】
また、キックカウンタ７０は、ピクセル１に対するプログラムを開始するタイミング、すなわち図５における命令１−０を実行するタイミングにおいて、プログラムカウンタＰＣ１をキックする。これにより、ピクセル１に対するプログラムの最初の命令１−０がインストラクションローダ７６により読み出される。
【００６６】
ピクセルインターリーブ数４に対応して設けられた４個のプログラムカウンタＰＣ０〜ＰＣ３は、交互にインストラクションローダ７６によって読み出され、インストラクションローダ７６は、４個のプログラムカウンタＰＣ０〜ＰＣ３で指定されたアドレスにしたがって、４個のピクセル０〜３のそれぞれに対するプログラムの命令を交互にロードする。これにより、４個のピクセルに対する命令のインターリーブが実現される。
【００６７】
キックカウンタ７０によって、ピクセルシフト量にしたがって、４個のピクセル０〜３のそれぞれに対するプログラムの開始タイミングがずらされるため、図５で説明したピクセルシフトが実現し、さらに、インストラクションローダ７６によって、４個のピクセル０〜３のそれぞれに対応する４個のプログラムカウンタＰＣ０〜３が交互に読み出され、インクリメンタ７４によってカウントアップされることから、図５で説明したインストラクションシフトが実現する。このようにして、図５に示した、ピクセルシフトとインストラクションシフトで規定される拡張ピクセルインターリーブが実現される。
【００６８】
インストラクションローダ７６は、プログラムカウンタＰＣで指定された命令をメモリからロードして、インストラクションキャッシュ６０に蓄積する。インストラクションフェッチャ６２がインストラクションキャッシュ６０から命令を取得し、インストラクションデコーダ６４がその命令をデコードする。インストラクションデコーダ６４によりデコードされた命令はコントロールバッファ６６にバッファされる。
【００６９】
上述のように、４個のピクセル０〜３のそれぞれに対応する４個のプログラムカウンタＰＣ０〜ＰＣ３が順次カウントアップされながらインストラクションローダ７６によって参照されることから、コントロールバッファ６６には、４個のピクセル０〜３のそれぞれに対応する命令が交互にＦＩＦＯ（First-In First-Out）方式でバッファされることになる。
【００７０】
コントロールバッファ６６には、ピクセル０に対応する命令（符号２４０）、ピクセル１に対応する命令（符号２４１）、ピクセル２に対応する命令（符号２４２）、ピクセル３に対応する命令（符号２４３）が順にバッファされる。また、その後に、同様に、次に実行されるべきピクセル０に対応する命令（符号２５０）、ピクセル１に対応する命令（符号２５１）、ピクセル２に対応する命令（符号２５２）、ピクセル３に対応する命令（符号２５３）が順にバッファされる。ピクセル０の処理が終われば、次のピクセル４に対応する命令がバッファされ、以降、ピクセル７までの命令が順次バッファされることになる。コントロールバッファ６６は、バッファされた命令をＦＩＦＯ方式にしたがって順次コントロールシフタ６８に出力する。
【００７１】
コントロールシフタ６８は、コントロールバッファ６６にバッファされた命令を同時にオペレータ３４、フォーマットコンバータ３６，およびキャッシュ３８に供給するが、オペレータ３４、フォーマットコンバータ３６、およびキャッシュ３８のパイプラインの位置に合わせて命令の供給時間をシフトさせる。このために、コントロールシフタ６８は、命令を一時的にバッファして供給時間を所定サイクルだけずらすためのシフタをもつ。
【００７２】
コントロールシフタ６８は、オペレータ３４の演算パイプラインが３段階で構成される場合、シフタを用いて、パイプラインの段階に合わせて命令の供給時間を１サイクルずつ遅らせる。また、フォーマットコンバータ３６における演算は、パイプライン処理として、オペレータ３４の演算の後段に位置するため、オペレータ３４の最終段の演算よりもさらに命令の供給時間を１サイクル遅らせる。さらに、キャッシュ３８における演算は、パイプライン処理として、フォーマットコンバータ３６の演算の後段に位置するため、フォーマットコンバータ３６の演算よりもさらに命令の供給時間を１サイクル遅らせる。
【００７３】
このように、コントロールシフタ６８は、命令をパイプラインの位置に合わせてシフトして供給することにより、ピクセルに対するパイプライン処理の段階が進むにつれて、その段階に該当する命令がオペレータ３４、フォーマットコンバータ３６、およびキャッシュ３８に供給され、ピクセルに対するパイプライン処理が遂行される。
【００７４】
なお、上記の説明では、ピクセルインターリーブ数４に対応して４個のプログラムカウンタを設け、それぞれのプログラムカウンタが各ピクセルに対するプログラムの命令のアドレスを保持したが、別の実施例として、プログラムカウンタを１個だけ設け、そのプログラムカウンタの値をもとに、ピクセルシフト量とインストラクションシフト量にしたがって、各ピクセルに対するプログラムのプログラムカウンタ値を演算により求めるように構成してもよい。これにより、物理的には１個のプログラムカウンタによって、実質的には４個のプログラムカウンタを設けた場合と同等の作用が得られる。
【００７５】
以上述べたように、本実施の形態によれば、シェーダユニットにおいて、複数のピクセルに対する命令を交互に実行するピクセルインターリーブを行い、演算ユニットやメモリに対する長いレイテンシを隠蔽化することができる。さらに、交互に投入するピクセルの投入タイミングや命令の実行間隔を調整することにより、同一ピクセルに対する依存性のある命令が連続して実行されることを避け、ピクセル間で命令に依存性が存在する場合にも対処することができる。これにより、従来では効率低下要因であったバブルを低減し、処理効率を上げることが可能である。
【００７６】
また、本実施の形態によれば、ピクセルの投入タイミングをずらすピクセルシフトによって、リードモディファイライトするピクセルデータの局所性がなくなり、同一ピクセル位置をリードモディファイライトする状況を回避することができる。これにより、描画対象のピクセル領域内の複数の隣接するピクセルを連続的に投入しても、バブルが生じないでパイプライン処理を実行することができる。また、ピクセルの投入タイミングをシフトした上で、ピクセルに対する命令を交互に実行することにより、命令についても同一命令が連続して実行される状況が回避され、実行される命令の局所性も同時になくなっている。したがって、ＲＭＷ命令のようなデータの一貫性の保証が必要な命令がＲＭＷレイテンシ内に重複して実行される問題が発生しない。
【００７７】
シェーダユニットにおいて、演算処理の過程にあるピクセルデータを保持するためのレジスタの数には、ハードウエアの設計上の制約がある。そのため、シェーダユニットは、キャッシュやフレームバッファなどのメモリにピクセルデータの中間結果をいったん書き出し、必要に応じてそのピクセルデータをメモリから読み出してさらに演算処理を進め、更新されたピクセルデータを書き戻すことになる。したがって、メモリに対するＲＭＷ機能は描画処理において不可欠である。本実施の形態では、拡張ピクセルインターリーブにより、長いＲＭＷレイテンシを隠蔽化することができ、シェーディングユニットにＲＭＷ機能をもたせることができる。従来、プログラマビリティを導入できず、シェーディングエンジンと分離せざるを得なかったＲＭＷユニットをシェーディングエンジンと統合して一体化することにより、ＲＭＷを含めた描画処理全体の高機能化を図ることができるため、フレキシビリティが格段に向上する。
【００７８】
以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【００７９】
そのような変形例を説明する。上記の実施の形態では、ピクセル単位でピクセルに対する命令をインターリーブする方法を説明したが、複数のピクセルの集合を１つの単位としてインターリーブしてもよい。このとき、ピクセル集合内では同一のピクセル位置に対して命令を実行することがなく、ピクセル集合内のピクセル間では命令の依存性がないものとする。そこで、ピクセル集合内では命令を単純な順番で実行し、ピクセル集合間では、ピクセル集合を１つのピクセルと見なして、上記の拡張ピクセルインターリーブを行うことができる。
【００８０】
また、上記の実施の形態では、ピクセル演算のパイプライン処理を例に挙げ、演算命令をピクセル単位でインターリーブすることにより、演算レイテンシやメモリレイテンシなどの処理レイテンシを隠蔽する方法を説明したが、本発明は、ピクセル演算に限らず、他の大量データを処理する場合にも適用することができる。特に、本発明は、同じようなプログラムを大量のデータに対して実行する場合に適用し、同様の方法で、個々のデータに対する命令をインターリーブし、演算レイテンシやメモリレイテンシなどを隠蔽化することができる。たとえば、本発明は、音声やビデオのマルチメディアデータの処理に適用することができる。音声やビデオなどのマルチメディアの符号化や復号の処理では、時間軸方向のデータについて差分演算や畳み込み演算を行うため、参照するデータの局所性や命令の相互依存性が生じやすい。したがって、音声やビデオのデータユニット単位で命令をインターリーブして処理することにより、音声やビデオのデータの符号化や復号の処理効率を上げることができる。
【図面の簡単な説明】
【００８１】
【図１】実施の形態に係る描画処理装置の構成図である。
【図２】実施の形態に係るシェーダユニットの構成を説明する図である。
【図３】シェーダユニットによる単純なピクセルインターリーブを説明する図である。
【図４】ＲＭＷ機能を含むシェーダユニットの構成において、ＲＭＷレイテンシを説明する図である。
【図５】本実施の形態に係る拡張ピクセルインターリーブを説明する図である。
【図６】図５の拡張ピクセルインターリーブを実行するための制御機構を説明する図である。
【符号の説明】
【００８２】
１０  ラスタライザ、  ２０  ＲＭＷユニット、  ３０  シェーダユニット、  ３２  レジスタ群、  ３３  セレクタ、  ３４  オペレータ、  ３６  フォーマットコンバータ、  ３８  キャッシュ、  ４０  フレームバッファ、  ５０  テクスチャユニット、  ６０  インストラクションキャッシュ、  ６２  インストラクションフェッチャ、  ６４  インストラクションデコーダ、  ６６  コントロールバッファ、  ６８  コントロールシフタ、  ７０  キックカウンタ、  ７２  プログラムカウンタ、  ７４  インクリメンタ、  ７６  インストラクションローダ、  １００  描画処理装置。
【要約】
【課題】  ピクセルデータのパイプライン処理において、演算レイテンシやメモリレイテンシがあるために処理効率が落ちる。
【解決手段】  レジスタ３２ａ〜３２ｄはインターリーブするピクセルのデータを保持する。オペレータ３４は、各レジスタからピクセルデータを読み出し、プログラムコードにしたがって処理し、処理結果をキャッシュ３８を介して各レジスタに書き戻したり、メモリに書き込んだりする。インターリーブするピクセル数のプログラムカウンタＰＣ０〜ＰＣ３は、各ピクセルに対するプログラムの命令のアドレスを記憶する。各プログラムカウンタは、交互にインストラクションローダ７６によって読み出され、インクリメンタ７４によりカウントアップされる。これにより、各ピクセルに対するプログラムの命令が交互にロードされ、ピクセル単位で命令がインターリーブされて、オペレータ３４などに与えられる。
【選択図】図６
【図１】
0003706383.tif 000002
【図２】
0003706383.tif 000003
【図３】
0003706383.tif 000004
【図４】
0003706383.tif 000005
【図５】
0003706383.tif 000006
【図６】
0003706383.tif 000007