(57)【特許請求の範囲】
【請求項１】
画像の描画単位となるピクセルの集合であるスレッドを複数個、同一のタスク内で処理する描画装置であって、
前記スレッドに関するデータを保持する保持手段と、
前記タスクに応じて各々の前記スレッドに対して為される命令を複数の副命令に分割して管理する管理手段と、
前記副命令に従って、前記保持手段に保持されるデータに基づき前記スレッドに対して描画処理を行う描画処理手段と
を具備し、前記管理手段は、各々に前記スレッドが割り当てられ、且つ各々に割り当てられた前記スレッドが次に実行すべき前記副命令の番号を登録される複数のエントリを有するテーブルを備え、
前記保持手段は、前記管理手段に登録された番号の前記副命令を実行可能であるか否かを示すレディ情報を各スレッドにつき保持し、
前記描画処理手段は、前記保持手段において前記副命令が実行可能とされた前記スレッドにつき描画処理を行う
ことを特徴とする描画装置。
【請求項２】
前記スレッドに貼付するテクスチャデータを保持するテクスチャユニットを更に備え、
前記保持手段の備える前記レディ情報は、前記副命令の実行直後に無効化され、前記テクスチャユニットから該副命令に対応した前記テクスチャデータの読み出しを全て完了した際に有効化される
ことを特徴とする請求項１記載の描画装置。
【請求項３】
前記管理手段において、前記テーブルの各エントリには、各々の前記エントリに割り当てられた前記スレッドにつき、前記副命令の実行の許否を示す実行許諾情報が更に登録され、
前記副命令の前記番号が同一の前記スレッドが複数存在する場合、前記保持手段に最も早く保持された前記スレッドについてのみ前記副命令の実行が許可される
ことを特徴とする請求項１または２記載の描画装置。
【請求項４】
前記管理手段において、前記テーブルの各エントリには、同一ＸＹ座標を有する他の前記スレッドに対する前記副命令の実行を強制的に禁止するか否か示すロック情報が更に登録され、
前記管理手段は、前記副命令の前記番号が同一の前記スレッドが複数存在し、且つ前記保持手段に最も早く保持された前記スレッドに対して前記ロック情報が無効にされている場合、前記副命令の前記番号が同一な全てのスレッドに対して、有効とされている前記ロック情報を無効化する
ことを特徴とする請求項３記載の描画装置。
【請求項５】
画像描画の際に実行される命令を、複数の副命令に分割して実行する描画方法であって、
画像の描画単位となるピクセルの集合である複数のスレッドに関するデータを保持手段に登録するステップと、
前記のスレッドの各々について、次に実行すべき前記副命令の番号を管理手段に登録するステップと、
前記副命令を実行することにより画像描画処理、及び前記副命令の前記番号のカウントアップを繰り返すステップと、
最後の前記副命令を実行した後、前記保持手段及び前記管理手段から前記スレッドを抹消するステップと
を具備し、前記画像描画処理において、実行すべき前記副命令の前記番号が同一の前記スレッドが複数存在する場合、前記保持手段に最も早く登録された前記スレッドに対する前記副命令のみが実行される
ことを特徴とする描画方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、描画装置及び描画方法に関するもので、例えば複数のピクセルを同時に並列処理する画像処理ＬＳＩに関する。
【背景技術】
【０００２】
近年、ＣＰＵ（Central Processing Unit）の動作の高速化に伴って、画像描画装置に対しても高速化の要求が高まってきている。
【０００３】
画像描画装置は一般に、投入された図形をピクセルに分解する図形分解手段と、ピクセルに描画処理を加えるピクセル処理手段と、描画結果を読み書きする記憶手段とを備える。近年、ＣＧ（Computer Graphics）技術の進歩により、複雑なピクセル処理技術が頻繁に用いられるようになってきている。その結果ピクセル処理手段の負荷が大きくなるため、ピクセル処理手段を並列化することが行われている（例えば特許文献１参照）。
【０００４】
しかしながら、上記従来の画像描画装置であると、あるピクセルを描画処理した後にテクスチャマッピングを行う場合、テクスチャデータのロードを完了するまで処理を待たねばならず、処理効率が低下するという問題があった。
【特許文献１】米国特許６，５３２，０１３号
【発明の開示】
【発明が解決しようとする課題】
【０００５】
この発明は、上記事情に鑑みてなされたもので、その目的は、描画処理を効率化出来る描画装置及び描画方法を提供することにある。
【課題を解決するための手段】
【０００６】
上記目的を達成するために、この発明の一態様に係る描画装置は、画像の描画単位となるピクセルの集合であるスレッドを複数個、同一のタスク内で処理する描画装置であって、前記スレッドに関するデータを保持する保持手段と、タスクに応じて各々の前記スレッドに対して為される命令を複数の副命令に分割して管理する管理手段と、前記副命令に従って、前記保持手段に保持されるデータに基づき前記スレッドに対して描画処理を行う描画処理手段とを具備し、前記管理手段は、各々に前記スレッドが割り当てられ、且つ各々に割り当てられた前記スレッドが次に実行すべき前記副命令の番号を登録される複数のエントリを有するテーブルを備え、前記保持手段は、前記管理手段に登録された番号の前記副命令を実行可能であるか否かを示すレディ情報を各スレッドにつき保持し、前記描画処理手段は、前記保持手段において前記副命令が実行可能とされた前記スレッドにつき描画処理を行う。
【０００７】
またこの発明の一態様に係る描画方法は、画像描画の際に実行される命令を、複数の副命令に分割して実行する描画方法であって、画像の描画単位となるピクセルの集合である複数のスレッドに関するデータを保持手段に登録するステップと、前記のスレッドの各々について、次に実行すべき前記副命令の番号を管理手段に登録するステップと、前記副命令を実行することにより画像描画処理、及び前記副命令の前記番号のカウントアップを繰り返すステップと、最後の前記副命令を実行した後、前記保持手段及び前記管理手段から前記スレッドを抹消するステップとを具備し、前記画像描画処理において、実行すべき前記副命令の前記番号が同一の前記スレッドが複数存在する場合、前記保持手段に最も早く登録された前記スレッドに対する前記副命令のみが実行される。
【発明の効果】
【０００８】
この発明によれば、描画処理を効率化出来る描画装置及び描画方法を提供できる。
【発明を実施するための最良の形態】
【０００９】
以下、この発明の実施形態を図面を参照して説明する。この説明に際し、全図にわたり、共通する部分には共通する参照符号を付す。
【００１０】
この発明の第１の実施形態に係るグラフィックプロセッサについて、図１を用いて説明する。図１は、本実施形態に係るグラフィックプロセッサのブロック図である。
【００１１】
図示するように、グラフィックプロセッサ２３はラスタライザ（rasterizer）２４、複数のピクセルシェーダ（pixel shader）２５−０〜２５−３、及びローカルメモリ２６を備えている。なお、本実施形態ではピクセルシェーダ２５の数は４個であるがこれは一例に過ぎず、８個、１６個、３２個等でも良く、その数は限定されるものではない。ラスタライザ２４は、入力された図形情報に従ってピクセル（pixel）を生成する。ピクセルとは、所定の図形を描画する際に取り扱われる最小単位の領域のことであり、ピクセルの集合によって図形が描画される。生成されたピクセルはピクセルシェーダ２５−０〜２５−３へ投入される。
【００１２】
ピクセルシェーダ２５−０〜２５−３は、ラスタライザ２４から投入されたピクセルにつき演算処理を行い、ローカルメモリ（後述する）上に画像データを生成する。ピクセルシェーダ２５−０〜２５−３の各々は、データ振り分け部３０、同期回路３１、テクスチャユニット（texture unit）３３、及び複数のピクセルシェーダユニット３４を備えている。
【００１３】
データ振り分け部３０はラスタライザ２４からデータを受け取る。そして、受け取ったデータをピクセルシェーダ２５−０〜２５−３へ割り振る。
【００１４】
同期回路３１は、ピクセルシェーダユニット３４の動作の同期化を行う。
【００１５】
テクスチャユニット３３はテクスチャ処理を行い、ピクセルシェーダユニット３４で処理されたピクセルにテクスチャデータを貼り付ける。
【００１６】
ピクセルシェーダユニット３４はシェーダエンジン部であり、ピクセルデータに対してシェーダプログラムを実行する。そしてピクセルシェーダユニット３４のそれぞれはＳＩＭＤ（Single Instruction Multiple Data）動作を行って、４個のピクセルを同時に処理する。ピクセルシェーダユニット３４はそれぞれ、命令制御部３５、描画処理部３６、及びデータ制御部３７を備えている。
【００１７】
命令制御部３５については後に詳細に説明する。描画処理部３６はピクセルの演算処理を行う。データ制御部３７は、ローカルメモリ２６からのデータの読み出しを制御する。
【００１８】
ローカルメモリ２６は例えばｅＤＲＡＭ（embedded DRAM）であり、ピクセルシェーダ２５−０〜２４−３で描画されたピクセルデータを記憶する。
【００１９】
次に、本実施形態に係るグラフィックプロセッサにおける図形描画の概念について説明する。図２は、図形を描画すべき全体の空間を示す概念図である。なお、図２に示す描画領域は、ローカルメモリ内においてピクセルデータを保持するメモリ空間（以下、フレームバッファと呼ぶ）に相当する。
【００２０】
図示するように、フレームバッファは、マトリクス状に配置された（（ｍ＋１）×（ｌ＋１））個のブロックＢＬＫ０〜ＢＬＫｎを含んでいる。図２ではｌ＝２９、ｍ＝１９、ｎ＝５９９の場合について示しているが、この数は一例に過ぎず、限定されるものではない。ピクセルシェーダ２５−０〜２５−３は、ブロックＢＬＫ０〜ＢＬＫ５９９順にピクセルを生成する。各ブロックＢＬＫ０〜ＢＬＫ５９９はそれぞれ、マトリクス状に配置された３２個のスタンプ（stamp）を含んで形成されている。図３は、図２に示された各ブロックが複数のスタンプを有する様子を示している。
【００２１】
各スタンプは、同一のピクセルシェーダによって描画される複数のピクセルの集合体である。本実施形態では１個のスタンプは（４×４）＝１６個のピクセルを含んでいるが、この数は例えば１個、４個、…等でも良く、限定されるものではない。図３において、各スタンプに記載された番号（＝０〜３１）を以下スタンプＩＤ（ＳｔＩＤ）と呼び、各ピクセルに記載された番号（＝０〜１５）を以下ピクセルＩＤ（ＰｉｘＩＤ）と呼ぶ。また、各スタンプにおける（２×２）個のピクセルの集合をクアッド（quad）と呼ぶことにする。すなわち、１個のスタンプには（２×２）個のクアッドが含まれる。これらの４つのクアッドを、以下クアッドＱ０〜Ｑ３と呼ぶことにする。ブロックＢＬＫ０〜ＢＬＫ５９９の各々には、上記スタンプが（８×４）＝３２個含まれている。従って、全体として（６４０×４８０）個のピクセルによって、図形を描画すべき空間が形成されている。
【００２２】
次に、上記フレームバッファに描画される図形に関して説明する。まず図形を描画するにあたって、ラスタライザ２４に図形情報が入力される。図形情報は、例えば図形の頂点座標や色情報などである。ここで、例として三角形を描画する場合について説明する。ラスタライザ２４に入力された三角形は、描画空間において図４に示すような位置を占めるとする。すなわち、三角形の３つの頂点座標が、ブロックＢＬＫ１におけるＳｔＩＤ＝７のスタンプ、ブロックＢＬＫ４０におけるＳｔＩＤ＝１９のスタンプ、及びブロックＢＬＫ４２におけるＳｔＩＤ＝０のスタンプに位置すると仮定する。ラスタライザ５５は、描画すべき三角形が占める位置に対応するスタンプを生成する。この様子を示しているのが図５である。生成されたスタンプデータは、それぞれ予め対応付けられたピクセルシェーダ２５−０〜２５−３に送られる。
【００２３】
そしてピクセルシェーダ２５−０〜２５−３は、入力されたスタンプデータに基づいて、自らの担当するピクセルについて描画処理を行う。その結果、図５に示されるような三角形が、複数のピクセルによって描画される。ピクセルシェーダ２５−０〜２５−３によって描画されたピクセルデータは、スタンプ単位でローカルメモリに格納される。
【００２４】
図６は、図５におけるブロックＢＬＫ１の拡大図である。図示するようにブロックＢＬＫ１に関して、ラスタライザ２４は８個のスタンプを生成する。それらのスタンプＩＤはそれぞれＳｔＩＤ＝７、１１〜１５、２４、２６、２７である。前述の通り、ラスタライザ２４で生成されたスタンプの個々には（４×４）＝１６個のピクセルが含まれている。しかし、例えスタンプが発行されたとしても、図形によっては全てのピクセルに対して描画処理を行う必要はない。例えば図６において、ＳｔＩＤ＝１５のスタンプは三角形の内部にあるので、このスタンプ内に含まれる全てのピクセルに対して描画処理を行う必要がある。しかし、例えばＳｔＩＤ＝７のスタンプにおいては、ＰｉｘＩＤ＝０〜８、１２、１３、１５のピクセルは三角形の外部にあるため描画処理の必要はない。描画処理の必要なピクセルは、ＰｉｘＩＤ＝９〜１１、１４のピクセルのみである。このように、描画処理すべきであることを以下では「バリッド（valid）である」と呼び、描画不要であることを「インバリッド（invalid）である」と呼ぶことにする。
【００２５】
次に、各ピクセルシェーダユニット３４に含まれる命令制御部３５の構成について、以下詳細に説明する。図７は命令制御部３５のブロック図である。図７は命令制御部３５のブロック図である。図示するように命令制御部３５は、書き込み制御部４０、コンフィギュレーションレジスタ（configuration register）４１、第１データ保持部４２、第２データ保持部４３、スタンプ保持部４４、オーバーラップ検出部４５、スレッド生成部４６、スレッド保持部４７、及び命令管理部４８を備えている。
【００２６】
命令制御部３５は、データ振り分け部３０から複数のデータを受け取る。そのデータは図形を描画するために必要となる情報に関するデータであり、例えばＸＹ座標、第１乃至第３データ、及びピクセルバリッド信号である。ＸＹ座標は当該スタンプのＸＹ座標である。第３データは描画方向やポリゴンの面（face）情報である。第１データは描画すべき図形の有するパラメータの代表値を示す。第２データは図形の奥行き情報を示す。ピクセルバリッド信号は、当該ピクセルがバリッドか否かを示す情報である。これらのデータのことを、以下ではまとめて「スタンプデータ」と呼ぶことがある。
【００２７】
上記スタンプデータはクロック信号ＣＬＫ２に同期して、命令制御部３５へ入力される。そして、第２データ以外のデータは第１スタート信号に応答して命令制御部３５へ入力される。図８は各データ信号のタイミングチャートである。
【００２８】
図８に示すように、時刻ｔ１で第１スタート信号がアサートされると、その時刻ｔ１から、命令制御部３５は第３データ、第１データ、ピクセルバリッド信号、ＸＹ座標を受け取る。これらのスタンプデータは連続した８クロックサイクルに分割されて、命令制御部３５に送られる。命令制御部３５は、例えば最大１６スタンプのデータを保持することが出来る。
【００２９】
第２データは、第１スタート信号ではなく第２スタート信号に応答して、命令制御部３５へ入力される。図９はクロックＣＬＫ２、第２スタート信号、及び第２データのタイミングチャートである。図示するように、時刻ｔ２１において、第２スタート信号がアサートされると共に、第２データが受信される。なお、第２スタート信号は、対応するそれ以外のスタンプデータを転送するための第１スタート信号よりも数サイクルだけ遅れてアサートされる。従って命令制御部３５は、第２データを、それ以外のスタンプデータより遅れて受信する。
【００３０】
次に命令制御部３５の備える各ブロックについて説明する。命令制御部３５は、外部からのチップセレクト、アドレス指定により与えられたデータをコンフィギュレーションレジスタ４１に書き込む。コンフィギュレーションレジスタ４１は例えば複数のレジスタを含み、それぞれのレジスタに信号ＩＮＳＴＢＡＳＥ、ＰＲＥＬＤＴＩＭＥを保持する。
【００３１】
ＩＮＳＴＢＡＳＥは、スタンプ（スレッド）に関して処理を開始すべき最初の命令のアドレスを示す。ＰＲＥＬＤＴＩＭＥはプリロードタイミングを示す。すなわち、スレッドがイールド命令を実行してからプリロードを要求するまでのクロックサイクル数を指定する。なお、スレッド、スレッドＩＤ、クアッドマージ、プリロード、及びイールド命令については後に説明する。プリロードとは下記のことを言う。すなわち、ピクセルシェーダユニット３４は内部にキャッシュメモリ（図示せず）を有している。そしてキャッシュメモリに読み出したデータを用いて描画処理を行う。この描画処理のために、実際に処理を行う前に、データをローカルメモリ２６から読み出しておくことがある。これがプリロードである。
【００３２】
次に、上記命令制御部３５に含まれる書き込み制御部４０の構成について図１０を用いて説明する。図１０は書き込み制御部４０のブロック図である。図示するように書き込み制御部４０は、第１ステートマシーン５０、第２ステートマシーン５１、クアッドバリッド（quad valid: ＱＶ）発生器５２、シフトレジスタ５３−０〜５３−４、及びメモリ５４を備えている。
【００３３】
書き込み制御部４０はデータ振り分け部３０から送られる第１スタート信号、第２スタート信号、ＸＹ座標、ピクセルバリッド信号、第３データ、第２データ、及び第１データをフリップフロップＦ／Ｆにラッチする。また、上記データ信号が入力されるのと同時、または入力される以前に、タスク同期信号をＦ／Ｆにラッチする。タスク同期信号は同期回路３１が発生する。
【００３４】
次に、第１ステートマシーン５０が第１スタート信号に基づいて、第１データライトイネーブル信号及びスタンプデータライトイネーブル信号を生成する。第１データライトイネーブル信号は第１データ保持部４２に対する書き込み動作をイネーブルにする信号であり、スタンプデータライトイネーブル信号はスタンプ保持部４４に対する書き込み動作をイネーブルにする信号である。また、スタンプ保持部４４から送られるスタンプ番号ＳｔＮに基づき、第１データライトアドレス信号が生成される。スタンプ番号ＳｔＮとは、スタンプに固有に与えられた識別番号のことである。第１データライトアドレス信号は、第１データ保持部４２において第１データを書き込むべきアドレスを示す。
【００３５】
また第１ステートマシーン５０は、内部にカウンタを有しており、信号第１スタート信号がアサートされるとカウンタを起動する。カウンタは、第１スタート信号がアサートされたサイクルでゼロに初期化され、以後、クロックに同期して順次カウントアップする。そしてカウンタ値が例えば７の時、データライト終了信号をアサートする。データライト終了信号は、データの転送終了を示す信号である。データの転送が終了すると、第１ステートマシーン５０は動作を停止する。
【００３６】
第１スタート信号がアサートされてから第１ステートマシーン５０が動作停止するまでの８サイクルの期間、第１データは第１データ保持部４２に毎サイクル書き込まれる。第１データを第１データ保持部４２に書き込む際の動作を図１１に示す。図１１は各種信号のタイミングチャートである。
【００３７】
図示するように、時刻ｔ０で信号第１スタート信号がアサートされると同時に第１データが入力され、また第１ステートマシーン５０のカウンタがカウントを開始する（図１１における“カウント数”）。第１データは８サイクルに渡って連続して入力される。第１スタート信号がアサートされた１サイクル後の時刻ｔ２において、第１ステートマシーン５０は第１データライトイネーブル信号をアサートして、第１データ保持部４２への書き込みを許可する。同時に時刻ｔ２から８サイクルに渡って、第１データ保持部４２において第１データを書き込むべきアドレス（第１データライトアドレス信号）を生成する。従って、時刻ｔ２からの８サイクルの期間、第１データが、第１データ保持部４２における第１データライトアドレス信号の示すアドレスに順次書き込まれる。そしてカウンタのカウンタ値が７に達すると（時刻ｔ８）、第１ステートマシーン５０はデータライト終了信号をアサートして、データの転送を終了する。また、時刻ｔ８の次のサイクルで、スタンプデータライトイネーブル信号がアサートされる。これにより、スタンプ保持部４４へのデータの書き込みが許可される。またタスク同期信号がアサートされる。
【００３８】
更に、クアッドバリッド発生器５２は、ピクセルバリッド信号を基にしてクアッドバリッドＱＶを生成する。クアッドバリッドとはクアッドがバリッドであるか否か、すなわちクアッド内に含まれる４個のピクセルのうちいずれか１個でもバリッドであるか否かを示す。
【００３９】
また、シフトレジスタ５３−０〜５３−２は、それぞれＸＹ座標、第３データ、ピクセルバリッド信号を受信する。シフトレジスタ５３−０〜５３−４はそれぞれ受信した信号を毎サイクル、受信したビット数だけ左シフトしながら保持する。従って、第１ステートマシーン５０のカウンタ値が７に達したとき、換言すればデータライト終了信号がアサートされた時に、当該スタンプにおける全ビットがシフトレジスタ５３−０〜５３−５内に揃うことになる。そして次のサイクルにて、これらのデータがスタンプ保持部４４に書き込まれる。またこの際、スタンプ番号ＳｔＮがメモリ５４に書き込まれ、且つメモリ５４において対応するエントリのバリッドビットＥｎＶがセットされる（この点については後述する）。
【００４０】
第１スタート信号がアサートされてから所定のクロックサイクルの後、第２スタート信号がアサートされ、第２データが書き込み制御部４０に入力される。第２スタート信号がアサートされることにより、書き込み制御部は第２データの送付が開始されたことを認識し、第２ステートマシーン５１は動作を開始する。第２データが送付されている期間、シフトレジスタ５３−５は受信した信号を毎サイクル、受信したビット数だけＭＳＢ（most significant bit）側へシフトさせつつ保持する。第２ステートマシーン５１は、第１ステートマシーン５０と同様に内部にカウンタを有している。そして第２スタート信号がアサートされるとカウントを開始する。カウンタ値が７に達すると第２データライト終了信号をアサートして、第２データの転送を終了する。
【００４１】
次にメモリ５４について図１２を用いて説明する。メモリ５４は、例えばＦＩＦＯ（First In First Out）方式の半導体メモリであり、Ｎ個（Ｎは２以上の自然数であり、８個、１６個、またはそれ以上）のエントリを有している。各エントリは、バリッドビットＥｎＶ、スタンプ番号ＳｔＮ、第２データレディビットＲｄｙ２、及び同期ビットＳｙｎｃを保持できる。ＥｎＶは当該エントリが使用された際に書き込まれる（“１”とされる）。ＳｔＮはスタンプ番号であり、当該エントリに対応するスタンプに固有に与えられた識別番号のことである。Ｒｄｙ２は、第２データに関するレディビットであり、当該エントリに対応するスタンプの第２データが第２データ保持部４３に書き込み済みか否かを示す。Ｓｙｎｃは、タスクと各データとの同期を取るためのビットであり、当該エントリに対応するスタンプがタスク内における最初のスタンプか否かを示す。
【００４２】
スタンプデータライトイネーブル信号（図１１参照）がアサートされて、スタンプデータがスタンプ保持部４４に書き込まれると、スタンプ保持部４４に対応したスタンプ番号ＳｔＮがメモリ５４に書き込まれる。この際、メモリ５４において使用されるエントリは、バリッドビットＥｎＶがセットされておらず且つ最も古いエントリである。このエントリは、第１書き込みポインタによって指定される（図１０参照）。スタンプ番号ＳｔＮが書き込まれると、そのエントリのバリッドビットＥｎＶが“１”にセットされる。すなわち使用中となる。そして第１書き込みポインタがインクリメントされる。
【００４３】
次に第２スタート信号がアサートされると、メモリ５４のうちでＲｄｙ２がセットされていない最も古いエントリのＲｄｙ２がセット（“１”）される。このエントリは、第２書き込みポインタによって指定される（図１０参照）。また、そのエントリに保持されるスタンプ番号ＳｔＮが、第２データ保持部４３において、当該第２データが書き込まれるエントリのエントリ番号となる。Ｒｄｙ２がセットされると、第２書き込みポインタがインクリメントされる。
【００４４】
スレッド保持部４７がフル（full）ではなく、メモリ５４の読み出しポインタの示すエントリのバリッドビットＥｎＶがセットされており、且つ第２データレディビットＲｄｙ２もセットされており、そしてスタンプ保持部のリードポートが空いている（読み出し命令が無い）ならば、スタンプ保持部４４からＱＶ、及びＸＹ座標が読み出されてスレッド生成部４６に送られ、スレッド生成部４６でクアッドマージが行われる。読み出しポインタは、メモリ５４において、読み出すべきデータが保持されているエントリを指定する。
【００４５】
ここで、クアッドマージについて図１３を用いて簡単に説明する。図１３はクアッドマージの概念図である。クアッドマージとは、同一ＸＹ座標の連続する２つのスタンプを１つのスタンプにマージすることである。クアッドマージを行うことで、２つのスタンプのうちバリッドなクアッドを１つのスタンプに合成出来、一度に処理出来る。従って、描画処理すべきデータ量を圧縮出来る。
【００４６】
図１３に示すように、１つのスタンプに含まれる４つのクアッドをそれぞれクアッドＱ０〜Ｑ３と呼ぶことにする。まず始めにクアッドＱ０、Ｑ２がバリッドで且つクアッドＱ１、Ｑ３がインバリッドなスタンプ１が命令制御部に入力され、引き続きクアッドＱ１、Ｑ２がバリッドで且つクアッドＱ０、Ｑ３がインバリッドなスタンプ２が入力された場合を考える。この場合、２つのスタンプ１、２をマージすることにより、スタンプ１のクアッドＱ０、Ｑ２と、スタンプ２のクアッドＱ１、Ｑ２とを含む新規なスタンプを生成する。この新規なスタンプを、クアッドマージ前のスタンプと区別するために以後スレッド（thread）と呼ぶことにする。
【００４７】
書き込み制御部４０の説明に戻る。書き込み制御部４０は、同期回路３１の発生するタスク同期信号をラッチする。タスク同期信号がアサートされると、メモリ５４のうちでバリッドビットＥｎＶがセットされておらず、且つそれらのうちで最も先頭（バリッドビットがセットされた最後のスタンプに対応するエントリの次）のエントリの同期ビットＳｙｎｃをセットする。図１１は、タスク同期信号が最も早いタイミングでアサートされた場合を示しており、前のタスクの最後のスタンプをメモリ５４に書き込むタイミング（スタンプデータライトイネーブル信号がアサートされるタイミング）の次のサイクルで同期ビットＳｙｎｃがセットされる。メモリ５４の第１、第２書き込みポインタは、ちょうど同期ビットＳｙｎｃを書き込むべき位置を指している。同期ビットＳｙｎｃの書き込みでは第１、第２書き込みポインタはインクリメントされない。よって、次のタスクの最初のスタンプは、同期ビットＳｙｎｃがセットされたエントリに書き込まれる。
【００４８】
リセット直後（例えば電源投入直後など）は、読み出しポインタはゼロに初期化され、エントリ０の同期ビットＳｙｎｃが１にされる。タスクの処理開始を示すタスク実行命令がアサートされると、読み出しポインタが示すエントリの同期ビットＳｙｎｃがクリアされる。よって、読み出しポインタが示すエントリの同期ビットＳｙｎｃがクリアされていれば、当該エントリに対応するスタンプは既に開始されたタスクに属するものである。従って、この場合にはクアッドマージの為にスタンプ保持部からのデータ読み出しが要求される。逆に読み出しポインが示すエントリの同期ビットＳｙｎｃが１であれば、そのエントリのスタンプは次のタスクのものであり、且つそのタスクに対するタスク実行命令がアサートされていないことを意味する。
【００４９】
また書き込み制御部は、タスクの最初のスタンプであることを意味する新規タスク信号を生成する。これは、タスク実行命令がアサートされて、最初のスタンプがメモリ５４からスレッド生成部４６に出力される際にアサートされる。
【００５０】
次に第１データ保持部４２について説明する。第１データ保持部４２は、複数のエントリを有する半導体メモリである。第１データライトイネーブル信号がアサートされると、第１データ保持部４２におけるエントリのうち、第１データライトアドレス信号の示すエントリに第１データが書き込まれる。これら３つの信号は書き込み制御部４０から送られる。
【００５１】
また、第１データリードイネーブル信号がアサートされると、第１データ保持部４２は描画処理部３６から第１データリードアドレス信号を受信する。第１データリードアドレス信号は、読み出すべきスタンプのアドレスを示す。そして、第１データ保持部４２におけるエントリのうち、第１データリードアドレス信号により示されるエントリから、第１データが読み出される。
【００５２】
次に第２データ保持部４３について説明する。第２データ保持部４３は、複数のエントリを有する半導体メモリである。書き込み時において、データ振り分け部３０から１サイクルあたり例えば６４ビットの第２データが送付されてくる。そして、書き込み制御部４０が第２データを複数サイクル保持して第２データを組み立てた後、書き込み制御部４０が第２データライト終了信号をアサートする。これにより、第２データ保持部４３において、第２スタンプ番号ＳｔＮＷが示すアドレスに第２データが書き込まれる。なお、第２スタンプ番号ＳｔＮＷは、第２データ保持部４３において、当該スタンプに対して付与されたスタンプ番号ＳｔＮと同一である。
【００５３】
データの読み出し時は、描画処理部３６が第２データリードイネーブル信号をアサートすると、第２データ保持部４３は描画処理部３６からスタンプ番号ＳｔＮを受信する。そして、スタンプ番号ＳｔＮにより指定されるエントリ内のデータが読み出される。
【００５４】
次にスタンプ保持部４４について説明する。スタンプ保持部４４は、複数のエントリを有する半導体メモリを含む。書き込み制御部４０が信号スタンプデータライトイネーブル信号をアサートすると、スタンプ保持部４４において、スタンプ番号ＳｔＮが示すアドレスにスタンプデータが書き込まれる。スタンプデータは書き込み制御部４０から送られ、座標、ＱＶ、第３データ、及びピクセルバリッド信号を含む。またスタンプ保持部４４は、スレッド生成部４６からのデータ読み出し要求（クアッドマージのため）と、描画処理部３６からのデータ読み出し要求（レジスタリードのため）とを調停して、スタンプデータを外部へ出力する。描画処理部３６からの読み出し要求に対応する際には２個のスタンプのデータが読み出される。以下、それぞれのスタンプのスタンプ番号を旧スタンプ番号ＳｔＮ０、新規スタンプ番号ＳｔＮ１と呼ぶことにする。クアッドマージされる２つスタンプのうち、ＳｔＮ０は古い方のスタンプ、ＳｔＮ１は新しい方のスタンプを意味する。しかし、クアッドマージされていないスレッドの場合、ＳｔＮ１に対応するスタンプデータは任意の値である（通常は、１つ前に生成されたスレッドのＳｔＮ０に対応するデータである）。この場合、読み出されたＳｔＮ１のデータは不要なデータであり、命令制御部３５によって参照されることは無い。
【００５５】
次にオーバーラップ検出部４５について説明する。オーバーラップ検出部４５はＸＹテーブルを備える。図１４はＸＹテーブルの概念図である。図示するようにＸＹテーブルはＭ個（Ｍは２以上の自然数）のエントリを有し、それぞれのエントリにバリッドビットＥｎＶ、ＸＹ座標、及びスタンプ番号ＳｔＮが保持される。
【００５６】
ＸＹテーブルは、全てのスタンプのＸＹ座標を保持する。そして、１つのＸＹ座標につき１つのエントリがアサインされ、有効なエントリに対してはエントリバリッドＥｎＶがセットされる。ＳｔＮフィールドは、各ビットが対応するＸＹ座標と同一のＸＹ座標を有するスタンプのスタンプ番号に対応する。例えばＳｔＮ＝５のスタンプのＸＹ座標が“Ｂ”であったとすると、エントリ１のＸＹ座標フィールドには“Ｂ”がセットされ、且つＳｔＮフィールドの５番目のビットに“１”がセットされる。別の例としては、スタンプ保持部に存在する全１６スタンプのＸＹ座標が全て“Ａ”であったとすると、エントリ０のＸＹ座標フィールドに“Ａ”がセットされ、そのＳｔＮフィールドは全ビットが“１”、すなわちＳｔＮ＝０ｘＦＦＦＦとされる。
【００５７】
オーバーラップ検出部４５は、スレッド生成部４６のマージバッファ内にクアッドが存在し且つ新規スタンプがスレッド生成部４６に入力された際に動作を開始する。スレッド生成部４６の構成は後述する。そして、マージバッファ内のクアッド、すなわち前に入力されたスタンプが含むバリッドなクアッドと新規スタンプとがマージされる。この際、全てのクアッドがマージされなかった場合、すなわちいずれかのクアッドがマージバッファに残った場合には、オーバーラップ検出部４５は前のスタンプ（マージバッファ内に存在していたスタンプ）に対して動作し、ＸＹタグを出力する。他方、全てのクアッドがマージされた場合、すなわちスタンプがマージバッファに残らなかった場合には、オーバーラップ検出部４５は上記動作に加えて新規スタンプに対しても動作し、ＸＹ座標タグのエントリにＳｔＮを登録する。換言すれば、この場合には２つのスタンプを連続して処理する。
【００５８】
図１５はオーバーラップ検出部４５のブロック図である。図示するようにオーバーラップ検出部４５は、Ｍ個のエントリ部６０−０〜６０−（Ｍ−１）、ＸＹテーブル選択部６１、及びエントリ割り当て部６２を備えている。
【００５９】
ＸＹテーブル選択部６１はＸＹテーブルの空きエントリを探す。ＸＹテーブルにおけるＭ個のエントリはエントリ部６０−０〜６０−（Ｍ−１）にそれぞれ対応している。そしてエントリ部６０−０〜６０−（Ｍ−１）は、各々が保持するＸＹ座標と、マージバッファに保持されるスタンプのＸＹ座標とを比較する。
【００６０】
エントリ割り当て部６２は、ＸＹ座標比較結果に基づいてＸＹテーブルのいずれかのエントリをアロケート（allocate）する。マージバッファにクアッドがあり且つ新規スタンプの全てのクアッドがマージされた時に、オーバーラップ検出部４５はＸＹテーブルにおいて新規スタンプに対応するＳｔＮフィールドをセットする。
【００６１】
次に、オーバーラップ検出部４５に含まれる各回路ブロックの構成について以下説明する。図１６はエントリ部６０−０〜６０−（Ｍ−１）のブロック図である。図示するように、エントリ部６０−０〜６０−（Ｍ−１）の各々はＮＡＮＤゲート６４、比較器６５、ＡＮＤゲート６６、６７−０〜６７−（Ｍ−１）、６８−０〜６８−（Ｍ−１）、ＯＲゲート６９、７０−０〜７０−（Ｍ−１）、７１、インバータ７２−０〜７２−（Ｍ−１）、及びデコーダ７３を備えている。
【００６２】
比較器６５は、マージバッファに保持されているＸＹ座標と、当該エントリに保持されるＸＹ座標とを比較する。そして両者が等しければ“１”を、そうでなければ“０”を出力する。ＮＡＮＤゲート６４は、ＱＭステージにおけるＮＡＮＤゲート６４の出力と、ＯＲゲート７１の出力（ＥｎＶ：Ｅｎｔｒｙ Ｖａｌｉｄ）とのＮＡＮＤ演算を行う。
【００６３】
ＡＮＤゲート６６は、比較器６５の出力と、ＮＡＮＤゲート６４の出力とのＡＮＤ演算を行う。そして、ＡＮＤゲート６６におけるＡＮＤ演算結果が、ＸＹ座標が同一か否かを示すＸＹ比較結果信号となる。
【００６４】
ＯＲゲート６９は、ＡＮＤゲート６６の出力とＸＹ不一致信号とのＯＲ演算を行う。ＸＹ不一致信号は、ＸＹ座標が不一致だった場合にアサートされる信号である。
【００６５】
デコーダ７３は、スレッド生成部４６から送られるスタンプ番号ＳｔＮをデコードする。ＡＮＤゲート６７−０〜６７−（Ｍ−１）の各々は、デコーダ７３でデコードして得られたＭビットの信号の各ビットと、ＯＲゲート６９の出力とのＡＮＤ演算を行う。ＯＲゲート６９−０〜６９−（Ｍ−１）の各々は、それぞれＡＮＤゲート６７−０〜６７−（Ｍ−１）の出力と、ＸＹテーブルにおけるＳｔＮフィールドのデータの各ビットとのＯＲ演算を行う。ＡＮＤゲート６８−０〜６８−（Ｍ−１）の各々は、それぞれＯＲゲート７０−０〜７０−（Ｍ−１）の出力と、インバータ７２−０〜７２−Ｆの出力とのＡＮＤ演算を行う。インバータ７２−０〜７２−（Ｍ−１）の各々は、スタンプ保持部４４の各エントリ０〜（Ｍ−１）のデキュー（dequeue）をイネーブルにするためのＭ個のスタンプ保持部デキュー信号をそれぞれ反転させる。ＯＲゲート７１は、フリップフロップでラッチされたＡＮＤゲート６８−０〜６８−（Ｍ−１）の出力のＯＲ演算を行う。
【００６６】
上記構成において、ＯＲゲート７１の演算結果がＸＹテーブルのエントリバリッド、ＡＮＤゲート６８−０〜６８−（Ｍ−１）の出力をラッチするＦ／ＦがＳｔＮフィールド、ＸＹ座標をラッチするＦ／ＦがＸＹフィールドとなる。次に、ＸＹテーブルへのＸＹ座標の登録方法について図１７を用いて説明する。図１７は各種信号のタイミングチャートである。図示するように、時刻ｔ６２、ｔ６４、及びｔ６８に、スタンプ番号ＳｔＮ０＝０、１、２のスタンプがスレッド生成部４６から入力される場合を考える。なお、これらのスタンプはＸＹ座標が同一（“Ａ”）であったとする。
【００６７】
まず時刻ｔ６２においてＳｔＮ０が入力される。そして、マージバッファのスタンプのＸＹ座標と、自らのＸＹフィールドとを比較する。
【００６８】
上記比較の結果、両者は一致しなかったとすると、ＸＹ比較結果信号はネゲートされたままである。そして、ＸＹエントリ割り当て信号がアサートされることによって新規エントリ０がアサインされ、そのエントリにＸＹ座標（“Ａ”）及びＳｔＮ（“０ｘ８０００”）がセットされる。つまり、ＳｔＮのビット０がセットされる。そしてＸＹタグは新たにアサインされた新規エントリのエントリ番号となり、その内容はＸＹ座標＝“Ａ”である。また、ＸＹテーブルにおいて新規に割り当てられたエントリのバリッドビットＥｎＶが“１”にセットされる。従って、次に使用すべきＸＹテーブルエントリが“０”から“１”に変化する。すなわち、以降に入力される、異なるＸＹ座標を有するスタンプは、エントリ１に保持される。
【００６９】
次に時刻ｔ６４で次のＳｔＮ０が入力される。このスタンプは時刻ｔ６２で入力されたスタンプと同一ＸＹ座標であるので比較器６５の出力が反転し、ＸＹ比較結果信号がアサートされる。従って、ＸＹ割り当て信号はアサートされず、新規エントリはアサインされない。そして直前に入力されたＳｔＮ０が登録されているエントリ０に新たなＳｔＮ０（“０ｘＣ０００”）がセットされる。これは、ＳｔＮ０＝１であり、そのＳｔＮ０のビット１がセットされるためである。時刻ｔ６９でＳｔＮ０＝２が入力された場合も同様である。
【００７０】
次にＸＹテーブルからのデータの抹消方法について説明する。スタンプ保持部４４がデキューされた際、スタンプ保持部デキュー信号に対応するＳｔＮフィールドのビットは、そのサイクルの終わりにクリアされる。そして、ＳｔＮフィールドが全てクリアされているエントリのバリッドビットＥｎＶが、その次のサイクルでクリアされる。スタンプ保持部デキュー信号は任意のタイミングでアサートされる。
【００７１】
図１８はＸＹテーブル選択部６１のブロック図である。図示するように、ＸＹテーブル選択部６１は、優先度エンコーダ７３及びマルチプレクサ７４を備えている。優先度エンコーダ７３は、ＸＹテーブルのエントリバリッド（バリッドビット）ＥｎＶをエンコードして、ＸＹテーブル内の空きエントリを探す。そして空きエントリ中において、次に使用すべきエントリを決定して、次に使用すべきＸＹテーブルエントリを出力する。
【００７２】
マルチプレクサ７４は、ＸＹテーブルの各エントリに保持されるＸＹ座標を参照する。そして、スレッド保持部から与えられるプリロード用ＸＹタグに基づいて、プリロード用ＸＹ座標を出力する。
【００７３】
図１９は、エントリ割り当て部６２のブロック図である。図示するように、エントリ割り当て部６２はＯＲゲート７５−０、７５−１、ＮＯＲゲート７６、ＡＮＤゲート７７−０〜７７−（Ｍ−１）、及びデコード回路７８を備えている。エントリ割り当て部６２は、各エントリ部６０−０〜６０−（Ｍ−１）におけるＸＹ座標の比較結果を監視する。そしていずれのエントリ部６０−６〜６０−（Ｍ−１）でもＸＹ座標の比較結果が一致しなかった場合、ＸＹテーブル選択部６１で発見した空きエントリを、書き込み対象エントリとして選択する。
【００７４】
すなわち、ＯＲゲート７５は各エントリにおけるＸＹ比較結果信号のＮＯＲ演算を行う。デコード回路７８は、次に使用すべきＸＹテーブルエントリをデコードする。ＡＮＤゲート７７−０〜７７−（Ｍ−１）は、デコード回路７８で得たデコード結果と、ＮＯＲゲート７５の出力とのＡＮＤ演算を行う。そして、ＡＮＤゲート７７−０〜７７−（Ｍ−１）の出力が、それぞれＸＹエントリ割り当て信号となる。
【００７５】
各エントリにおけるＸＹ比較結果信号の全てが“Ｌｏｗ”（不一致）であると、ＮＯＲゲート７５の出力が“Ｈｉｇｈ”となる。そして、デコード回路７８は次に使用すべきＸＹテーブルエントリに応じて、Ｍビットの出力のいずれかのビットを“Ｈｉｇｈ”にする。従って、ＡＮＤゲート７７−０〜７７−（Ｍ−１）のうち、“Ｈｉｇｈ”とされたビットに対応するもののＸＹエントリ割り当て信号が“Ｈｉｇｈ”となり、エントリ部６０−０〜６０−（Ｍ−１）のうちの該当するものに対してアロケートが要求される。
【００７６】
次にスレッド生成部４６について説明する。スレッド生成部４６はまず、スレッド生成部４６に入力された最新のクアッドバリッドと、その直前に入力されマージバッファに保持されるクアッドバリッドとに基づいて、クアッドマージの可否をクアッド毎に判断する。そしてクアッドマージの可否を、第１乃至第３スレッド情報として生成する。
【００７７】
第１乃至第３スレッド情報について、図２０乃至図２２を用いて説明する。図２０乃至図２２は、クアッドマージを行う際の様子を示す概念図である。
【００７８】
まず第１スレッド情報について図２０を用いて説明する。第１スレッド情報は、マージバッファ内のクアッドを追い出して、追い出したクアッドを新規スレッドに含めるか否かを示している。そして、第１スレッド情報はそれぞれが４ビットの信号を４つ含んでいる。４つの信号はそれぞれ、マージバッファ内の各クアッドに対応しており、各信号の各ビットが新規スレッド内の４つのクアッドのそれぞれに対応している。例えば、マージバッファ内のクアッドＱ０の第１スレッド情報の各ビットは、マージバッファ内のクアッドＱ０を、新規スレッドのクアッドＱ０〜Ｑ３のいずれかとすることを示している。従って、第１スレッド情報＝（１０００）だとすると、マージバッファ内のクアッドＱ０を新規スレッドのクアッドＱ０とすることを意味する。また第１スレッド情報＝（０１００）だとすると、マージバッファ内のクアッドＱ０を新規スレッドのクアッドＱ１とすることを意味する。また、マージバッファ内のクアッドＱ１の第１スレッド情報＝（１０００）は、マージバッファ内のクアッドＱ１を新規スレッドのクアッドＱ１とすることを意味する。
【００７９】
次に第２スレッド情報について図２１を用いて説明する。第２スレッド情報は、最新のクアッドを新規スレッドに含めるか否かを示している。そして、第２スレッド情報はそれぞれが４ビットの信号を４つ含んでいる。４つの信号はそれぞれ、最新の各クアッドＱ０〜Ｑ３に対応しており、各信号の各ビットが新規スレッド内の４つのクアッドのそれぞれに対応している。例えば、最新のクアッドＱ０の第２スレッド情報＝（１０００）だとすると、最新のクアッドＱ０を新規スレッドのクアッドＱ０とすることを意味する。また第２スレッド情報＝（０１００）だとすると、最新のクアッドＱ０を新規スレッドのクアッドＱ１とすることを意味する。また、最新クアッドＱ１の第２スレッド情報＝（１０００）は、最新クアッドＱ１を新規スレッドのクアッドＱ０とすることを意味する。
【００８０】
次に第３スレッド情報について図２２を用いて説明する。第３スレッド情報は、最新のクアッドをマージバッファに保持させるか否かを示している。そして、第３スレッド情報はそれぞれが４ビットの信号を４つ含んでいる。４つの信号はそれぞれ最新のクアッドＱ０〜Ｑ３に対応しており、各信号の各ビットがマージバッファ内の４つのクアッドのそれぞれに対応している。例えばクアッドＱ０に関する第３スレッド情報＝（１０００）だとすると、最新のクアッドＱ０をマージバッファ内のクアッドＱ０とすることを意味する。また第３スレッド情報＝（０１００）だとすると、最新のクアッドＱ０をマージバッファ内のクアッドＱ１とすることを意味する。また、最新のクアッドＱ１に関する第３スレッド情報＝（１０００）は、最新のクアッドＱ１をマージバッファ内のクアッドＱ０とすることを意味する。
【００８１】
またスレッド生成部４６はクアッドマージを行うかどうかの判定を行う。そしてクアッドマージを行う場合にはマージバッファ内のスタンプデータをオーバーラップ検出部４５へ送り、オーバーラップ検出部４５に処理させる。また、マージ判定結果を基に、スレッド保持部４７へ送るデータを生成する。更にスレッドＩＤを生成すると共に、マージバッファのスタンプに対するＸＹタグをオーバーラップ検出部４５から受け取る。更に、スレッド保持部４７へデータを転送する。またマージバッファのスタンプと新規スタンプの全てのクアッドがマージされた際には、新規スタンプデータをオーバーラップ検出部４５に送り、オーバーラップ検出部４５に処理させる。
【００８２】
図２３はスレッド生成部４６のブロック図である。図２３では、第１乃至第３スレッド情報を発生する領域については図示を省略している。図示するようにスレッド生成部４６は、マージ判定部８３、マージバッファ８４、イネーブル信号発生器８５、ＱＶ発生器８６、ディバイドビット（Divide bit）発生器８７、スレッドＩＤ発生器８８、Ｆ／Ｆ８９−１〜８９−６、ＯＲゲート９０、及びＡＮＤゲート９２−０〜９２−３を備えている。
【００８３】
マージ判定部８３は、上記第１乃至第３スレッド情報を生成する。
【００８４】
Ｆ／Ｆ８９−１はスタンプ番号ＳｔＮをラッチする。Ｆ／Ｆ８９−３はスタンプ番号ＳｔＮ、新規タスク信号、タスク同期信号及びＸＹ座標をラッチする。Ｆ／Ｆ８９−５は第１乃至第３スレッド情報をラッチする。
【００８５】
Ｆ／Ｆ８９−２は、Ｆ／Ｆ８９−１でラッチされたデータを再度ラッチする。すなわちＦ／Ｆ８９−１に保持されるスタンプ番号が新規スタンプ番号ＳｔＮ０であり、Ｆ／Ｆ８９−２に保持されるスタンプ番号が旧スタンプ番号ＳｔＮ１である。Ｆ／Ｆ８９−４は、Ｆ／Ｆ８９−３でラッチされたデータを再度ラッチする。Ｆ／Ｆ８９−６は、ＱＶ発生器８６の出力をラッチする。これらのＦ／Ｆ８９−２、８９−４、８９−６を含んでマージバッファ８４が形成される。
【００８６】
イネーブル信号発生器８５は、クアッドマージを行うか否かを判定し、クアッドマージを行う際にクアッドマージイネーブル信号を生成する。クアッドマージが行われる条件は次の通りである。  
・マージバッファ８４のクアッドのＸＹ座標と、これからマージしようとする新規スタンプのＸＹ座標とが同一であること  
・マージバッファ８４のクアッド（前回のマージの残り）のピクセルバリッド（ピクセルバリッド信号）と、これからマージしようとする新規スタンプのピクセルバリッド（ピクセルバリッド信号）との間に重複がないこと  
・新規タスク信号＝０、すなわち当該タスクにおける最初のスタンプでないこと  
ＱＶ発生器８６は、クアッドマージイネーブル信号がアサートされていれば、第１乃至第３スレッド情報に基づいて信号クアッドバリッドＱＶ、スタンプ情報（ＳｔＮｕｍ０〜ＳｔＮｕｍ３）、及びクアッド情報（ＱＮｕｍ０〜ＱＮｕｍ３）を生成する。ＱＶ発生器８６により発生されるクアッドバリッドＱＶは、スレッド保持部４７へ出力されるべき現在のクアッドバリッドである。スタンプ情報ＳｔＮｕｍ０〜ＳｔＮｕｍ３及びクアッド情報（ＱＮｕｍ０〜ＱＮｕｍ３）は、クアッドマージがいかにしてなされたかを示す情報である。これらの情報ＳｔＮｕｍ０〜ＳｔＮｕｍ３、ＱＮｕｍ０〜ＱＮｕｍ３について図２４を参照しつつ説明する。
【００８７】
図示するように、スタンプ情報ＳｔＮｕｍ０〜ＳｔＮｕｍ３は、新規スレッドにおけるクアッドＱ０〜Ｑ３のそれぞれが、マージバッファ８４内のスタンプのクアッドと新規スタンプのクアッドとのいずれであるかを示す。例えばスタンプ情報ＳｔＮｕｍ０〜ＳｔＮｕｍ３は各１ビットの信号であって、“０”であればマージバッファ内のスタンプ、“１”であれば新規スタンプを示す。より具体的には、ＳｔＮｕｍ０＝“０”の場合、新規スレッドのクアッドＱ０はマージバッファ内スタンプのクアッドであり、ＳｔＮｕｍ０＝“１”の場合、新規スレッドのクアッドＱ０は新規スタンプのクアッドであり、ＳｔＮｕｍ１＝“０”の場合、新規スレッドのクアッドＱ１はマージバッファ内スタンプのクアッドであり、ＳｔＮｕｍ１＝“１”の場合、新規スレッドのクアッドＱ１は新規スレッドのクアッドであり、以下ＳｔＮｕｍ２、ＳｔＮｕｍ３の場合も同様である。
【００８８】
クアッド情報ＱＮｕｍ０〜ＱＮｕｍ３は、新規スレッドにおけるクアッドＱ０〜Ｑ３のそれぞれの、マージ前のスタンプ（ＳｔＮｕｍで指定されるスタンプ）内における位置を示している。例えばクアッド情報ＱＮｕｍ０〜ＱＮｕｍ３は２ビットの信号であって、“００”であればクアッドの位置は（ｘ、ｙ＝０、０）、“０１”であれば（ｘ、ｙ＝１、０）、“１０”であれば（ｘ、ｙ＝０、１）、“１１”であれば（ｘ、ｙ＝１、１）である。
【００８９】
従って、ＳｔＮｕｍ０＝“０”、ＱＮｕｍ０＝“００”の場合、新規スレッドのクアッドＱ０は、マージバッファ内のスタンプにおける（ｘ、ｙ＝０、０）の位置のクアッドである。またＳｔＮｕｍ０＝“１”、ＱＮｕｍ０＝“００”の場合、新規スレッドのクアッドＱ０は、新規スタンプにおける（ｘ、ｙ＝０、０）の位置のクアッドである。
【００９０】
なお、クアッドマージイネーブル信号＝０の場合にはクアッドマージは行われない。従って、マージバッファ内のスタンプがそのまま新規スレッドとして出力され、また入力された新規スタンプはマージバッファにラッチされ保存される。
【００９１】
ディバイドビット発生器８７は、第１乃至第３スレッド情報を監視する。そして、クアッドマージにより新規スタンプのクアッドが分割され、一部のクアッドがマージバッファに保持され、他の一部が新規スレッドの一部となる場合に、ディバイドビットＤｉｖｉｄｅをセットする。
【００９２】
スレッドＩＤ発生器８８は、クアッドマージが終了する度にスレッドＩＤ（ＴｄＩＤ）を生成し、生成したスレッドＩＤを新規スレッドに対して付与する。スレッドＩＤ発生器８８は内部にカウンタを有しており、新規スレッドが生成される毎にカウントアップし、そのカウンタ値をスレッドＩＤとして出力する。
【００９３】
なおスタンプ番号ＳｔＮに関して、前述の通りマージバッファ８４内のものがＳｔＮ０となり、新規スタンプのものがＳｔＮ１となる。これは、クアッドマージを行わない場合であっても、一旦はマージバッファ８４に格納されるからである。ＳｔＮ０はオーバーラップ検出部４５に登録される。マージバッファ８４にクアッドがあり、且つ新規スタンプが入力されると、マージバッファ８４のＳｔＮがＳｔＮ０になる。また全てのクアッドがマージされた場合、新規スタンプのＳｔＮがＳｔＮ０となる。
【００９４】
クアッドバリッドＱＶ、ピクセルバリッド信号、スタンプ番号ＳｔＮ、ＸＹ座標、新規タスク信号は、マージバッファ８４に保持される。これらの信号は、新規スタンプがスレッド生成部４６に入力された際にラッチされ、次の新規スタンプが入力されるまで保持される。
【００９５】
スレッドバッファライトイネーブル信号は、スレッド保持部４７への書き込みをイネーブルにする信号である。ピクセルバリッド信号がセットされている際、すなわちマージバッファ８４にデータが存在し且つ次の新規スタンプが入力された際に、スレッドバッファライトイネーブル信号はセットされて、スレッド保持部４７へ書き込まれる。
【００９６】
次に、スレッド保持部４７について説明する。スレッド保持部４７は、図２５に示すような、スレッドに関する情報を保持出来るテーブルを有する。図示するように、テーブルは例えば８つのエントリを備え、スレッドに関する情報を各エントリに保持出来る。使用可能なエントリ数は、最大で例えば８エントリである。各エントリに保持される情報は、ＥｎＶ、Ｅｎｄ、ＥＥｎｄ、ＮｅｗＴ、Ｒｄｙ、Ｒｕｎ、ＰＬＣｎｔ、ＰＬ、ＳｐＩＤ、ＴｄＩＤ、ＰＣ、Ｌｃｋ、ＴｌＣ、ＸＹｔａｇ、ＳｔＮ０、ＳｔＮ１、ＱＶ、ＳｔＮｕｍ０〜ＳｔＮｕｍ３、ＱＮｕｍ０〜ＱＮｕｍ３である。
【００９７】
ＥｎＶは各エントリのバリッドビットである。Ｅｎｄはエンド命令がＦＥステージを通過したことを示す。エンド命令とは、スレッドに対して行われるべき処理に関する命令列の最後の命令である。ＮｅｗＴは、新規なタスクに属する最初のスレッドに対してセットされる。Ｒｄｙはレディビットであり、当該エントリ（スレッド）が実行可能か、すなわち処理を開始して良いか否かを示す。Ｒｕｎはランビットであり、当該エントリが実行中であるか否かを示す。ＰＬＣｎｔはプリロードカウントである。プリロードとは、命令制御部３５において処理を終了したスレッドのデータ領域の、データキャッシュに対するプリフェッチ（prefetch）要求のことである。ＰＬＣｎｔは、プリロード発行前はサイクル数をカウントダウンし、発行後はプリロードの発行順位のデコード値を保持する。ＰＬはプリロードステートを示し、プリロード発行可能か否かを示す。ＳｐＩＤは、現在実行中または次に実行すべきサブパス（Sub-pass）番号である。サブパスについては後に詳細に説明する。ＰＣは実行開始プログラムカウンタである。Ｌｃｋは、スレッドがロックを取っているか否かを示す。ロックについても後述する。ＴｌＣは、データ未着のテクスチャロード命令の個数を示す。Ｔｌｄ命令はテクスチャロード命令のことであり、テクスチャユニット３３へのテクスチャデータのロード命令である。
【００９８】
次にスレッド保持部４７の構成について図２６を用いて説明する。図２６はスレッド保持部４７のブロック図である。図示するように、スレッド保持部４７はスレッドレジスタ群９４、プリロードブロック９５、アップデート部９６、スレッド発行制御部９７、テクスチャロード制御部９８、インターフェース９９、及び比較部１００を備えている。
【００９９】
スレッドレジスタ群９４はＭ個のレジスタ１０１を備えている。そして、レジスタ１０１の各々が、図２５に示したテーブルのエントリ０〜（Ｍ−１）にそれぞれ対応している。図２７はレジスタ１０１のブロック図である。
【０１００】
図示するように、アップデート部９６からデータが送られるもの、すなわちステートがアップデートされるもの（ＥｎＶ、Ｅｎｄ、Ｒｄｙ、Ｒｕｎ、ＰＬＣｎｔ、ＰＬ、ＳｐＩＤ、ＰＣ、Ｌｃｋ、ＴｌＣ）は、毎サイクルそれがＦ／Ｆに書き込まれる。また、ＳｔＮ０、ＳｔＮ１、ＮｅｗＴ、ＸＹ座標ｔａｇ、ＴｄＩＤ、ＱＮｕｍ０〜ＱＮｕｍ３、ＳｔＮｕｍ０〜ＳｔＮｕｍ３、ＱＶ（これらの信号をＸＸＸＸと呼ぶことにする）は、同じものが再度Ｆ／Ｆに書き込まれる。
【０１０１】
他方、スレッドライトイネーブル信号がアサートされ、スレッド保持部に対する書き込みエントリ番号がレジスタ１０１のエントリ番号と一致した場合、当該レジスタ１０１のバリッドビットがアサートされる。また、信号ＸＸＸＸがＦ／Ｆに新たに書き込まれる。更に、ＰＬＣｎｔとＰＣについては、コンフィギュレーションレジスタ４１の値（９’ｈ０００、ＩＮＳＴＢＡＳＥ）がＦ／Ｆに書き込まれる。Ｅｎｄ、Ｒｄｙ、Ｒｕｎ、ＰＬ、ＳｐＩＤ、Ｌｃｋ、ＴｌＣはそれぞれゼロとされる。
【０１０２】
次にプリロードブロック９５について説明する。図２８はプリロードブロック９５のブロック図である。プリロードブロック９５は、データキャッシュプリロードに必要な信号を生成する。
【０１０３】
図２８において、スレッド保持部の各エントリ０〜（Ｍ−１）に相当するレジスタ１０１の各々は、プリロードステートＰＬがＰＬＷＡＴからＰＬＲＥＱに変化すると、プリロード発行信号をアサートする。ＰＬＷＡＴは初期状態であり、スレッド及びプリロード発行前の状態のことである。またＰＬＲＥＱはプリロード発行要求中の状態のことである。
【０１０４】
プリロード発行信号がアサートされると、アービター１０３はこれを受け、エントリ０〜（Ｍ−１）の順序で要求を選択する。ＡＮＤゲート１０４はアービター１０３での選択結果に基づくＭビットの信号を出力する。各ビットはスレッド保持部のエントリ０〜Ｍに対応しており、各エントリに対するアクノリッジ信号となる。例えばアービター１０３がエントリ０を選択すると、ＡＮＤゲート１０４はアクノリッジをエントリ０に返す。
【０１０５】
更にエンコーダ１０５はアクノリッジ信号をエンコードする。そしてエンコード結果がＦ／Ｆで２度ラッチされた後、スレッド保持部のエントリ番号を示すプリロードスレッドエントリ番号として出力される。
【０１０６】
ＯＲゲート１０７はアクノリッジ信号を監視する。そしてＭ個のアクノリッジ信号のいずれかがアサートされると、プリロード要求信号をアサートさせる。
【０１０７】
セレクタ１０６はエンコーダ１０５におけるエンコード結果に応じて、エントリ０〜（Ｍ−１）のいずれかからスタンプ番号、スレッドＩＤ、サブパスＩＤ（ＳｔＮ０、ＴｄＩＤ、ＳｐＩＤ）を読み出して、Ｆ／Ｆにラッチさせる。そして、ＸＹテーブルからＸＹ座標を読み出すためにプリロード用ＸＹタグが出力され、更に、スレッドＩＤ及びサブパスＩＤを示すプリロードスレッドＩＤ及びプリロードサブパスＩＤが出力される。
【０１０８】
次にアップデート部９６について説明する。アップデート部９６はスレッド保持部の各エントリのステータス（ＥｎＶ、Ｅｎｄ、Ｒｄｙ、Ｒｕｎ、ＰＬＣｎｔ、ＰＬ、ＳｐＩＤ、ＰＣ、Ｌｃｋ、ＴｌＣのステート）をアップデートする。アップデート部９６はＭ個のセクション１０２を含んでおり、各セクション１０２がそれぞれエントリ０〜（Ｍ−１）に対応している。各セクション１０２は、ステータスをアップデートするためのアップデートロジックを備えている。以下、アップデートロジックについて説明する。
【０１０９】
＜Ｅｎｄのアップデートロジック＞  
Ｅｎｄビットは、エンド命令に到達したことを示すビットであり、スレッド生成時にクリアされる。アップデートロジックは、エンド命令がアサートされ、且つ実行スレッドエントリ番号が当該エントリのエントリ番号と同一であるとき、Ｅｎｄビットをセットする。Ｅｎｄは、バリッドビットＥｎＶがデキュー条件の揃うまでクリアされないため、その間誤って再びＲｕｎさせないためにセットされる。
【０１１０】
＜ＥｎＶのアップデートロジック＞  
図２９はバリッドビットＥｎＶのアップデートロジックの回路図である。ＥｎＶは、スレッド生成時にセットされる。アップデートロジックにおいて、比較器１０８はＴｌＣ＝＝０の場合に“Ｈｉｇｈ”を出力する。そしてＮＡＮＤゲート１０９が、比較器１０８の出力とＥｎｄとのＮＡＮＤ演算を行う。ＮＡＮＤ演算結果はスレッドデキュー要求信号としてスレッド保持部へ与えられる。Ｅｎｄビットがセットされ、ＴｌＣ＝０となったら、スレッド保持部のデキューブロックに対してデキュー要求信号をアサートする。そして、デキューブロックから与えられるスレッドデキュー許可信号がアサートされると、バリッドビットがクリアされる。
【０１１１】
＜ＰＬのアップデートロジック＞  
図３０はＰＬの各ステートを示している。ＰＬはＰＬＷＡＴ、ＰＬＲＥＱ、ＰＬＤＯＮ、及びＰＬＲＵＮの４つのステートを取ることが出来る。ＰＬＷＡＴは初期状態であり、スレッド発行前でプリロード発行前の状態である。ＰＬＲＥＱは、プリロード発行要求中の状態である。ＰＬＤＯＮは、プリロード発行終了で且つスレッドの発行前の状態である。ＰＬＲＵＮは、スレッド実行中の状態である。
【０１１２】
ＰＬがＰＬＷＡＴにセットされるタイミングは、スレッドがスレッド保持部に保持される時、またはＰＬ＝ＰＬＲＵＮにおいてイールド命令がアサートされた時である。ＰＬ＝ＰＬＷＡＴであるとき、ＰＬＣｎｔ＝０になったらＰＬはＰＬＲＥＱにセットされる。ＰＬ＝ＰＬＲＥＱのとき、当該エントリに対応するプリロード発行信号がアサートされたら、ＰＬはＰＬＤＯＮにセットされる。ＰＬ＝ＰＬＤＯＮであるとき、当該エントリに対応するスレッドが描画処理部３６に発行されたら、ＰＬはＰＬＲＵＮにセットされる。
【０１１３】
＜ＰＬＣｎｔのアップデートロジック＞  
図３１はＰＬＣｎｔの各ステートを示している。イールド命令がアサートされると、ＰＬＣｎｔにはＰＲＥＬＤＴＩＭＥがロードされる。ＰＬ＝ＰＬＷＡＴであるとき、ＰＬＣｎｔはカウントダウンされる。ＰＬＣｎｔ＝０になったサイクルまでＰＬのステートはＰＬＷＡＴに留まるため、ＰＬＣｎｔ＝０においてもさらにカウントダウンされ、最終的に−１（０ｘ１ｆｆ）までカウントダウンされる。このとき、同時にＰＬのステートはＰＬＲＥＱに代わるので−２にはならない。またＰＬＣｎｔ＝−１であるときはすでにＰＬはＰＬＲＥＱのステートに遷移しているので、ＰＬＣｎｔはいずれのステートでも良く、誤動作を抑制出来る。ＰＬ＝ＰＬＲＥＱであるとき、ＰＬＣｎｔにマスターエイジカウンタ（Master Age Counter）のカウンタ初期値ＡｇｅＭｓがセットされる。すなわち、ＰＬＣｎｔは−１になった次のサイクルでＡｇｅＭｓがセットされることになる。上記以外の時、スレッドが発行（自スレッド以外も含む）されると、対応するランセット信号（後述する）がアサートされるので、ＰＬＣｎｔの同じビット位置をクリアし、Ａｇｅを正しく反映させる。
【０１１４】
図３２はＰＬＣｎｔのアップデートロジックの回路図である。図示するように、選択回路１１１はＰＬＣｎｔ、ＰＬＣｎｔをカウントダウンしたもの、ＰＬＣｎｔとエイジレジスタアップデート信号の反転信号とのＡＮＤ演算結果、ＡｇｅＭｓ、“０”、及びＰＲＥＬＤＴＩＭＥのいずれかを選択し、それを新たなＰＬＣｎｔとする。選択回路１１１は、制御回路１１２の制御に基づいて選択動作を行う。制御回路１１２は各種信号に基づいて選択回路１１１の選択動作を制御するが、その具体的な制御方法は図３１を用いて説明したとおりである。エイジレジスタアップデート信号及びＡｇｅＭｓについては後述する。
【０１１５】
＜Ｌｃｋのアップデートロジック＞  
図３３はロックビットＬｃｋのアップデートロジックである。図示するように、比較器１１３は、エントリ番号ＥｎｔＮと新規スレッドエントリ番号とを比較する。新規スレッドエントリ番号とは、新たに生成されてスレッド保持部に書き込まれたスレッドに関する。ＡＮＤゲート１１４は、比較器１１３の出力とバリッドビットＥｎＶとのＡＮＤ演算を行う。ＡＮＤゲート１１５は、ＡＮＤゲート１１４の出力とロック命令とのＡＮＤ演算を行う。ＡＮＤゲート１１６は、ＡＮＤゲート１１４の出力と、ロッククリア命令、エンド命令とのＡＮＤ演算を行う。ＯＲゲート１１７は、ＡＮＤゲート１１５の出力とＬｃｋとのＯＲ演算を行う。ＡＮＤゲート１１８は、ＯＲゲート１１７の出力とＡＮＤゲート１１６の出力とのＡＮＤ演算を行う。そしてＡＮＤゲート１１８の出力が新規なＬｃｋとなる。
【０１１６】
上記構成において、ロック命令がアサートされると、新規スレッドエントリ番号に一致するエントリのＬｃｋビットがセットされる。ロッククリア命令またはエンド命令がアサートされた場合には、実行スレッドエントリ番号が一致するエントリのＬｃｋビットはクリアされる。
【０１１７】
＜ＴｌＣのアップデートロジック＞  
図３４はＴｌＣのアップデートロジックである。図示するように、比較器１１９は新規スレッドエントリ番号と当該エントリのスレッドエントリ番号とを比較する。比較器１２０は、テクスチャロード命令実行中において、テクスチャロードを行う実行スレッドエントリ番号と当該エントリのエントリ番号とを比較する。ＡＮＤゲート１２１は、比較器１１９の出力とテクスチャロード命令とのＡＮＤ演算を行う。ＡＮＤゲート１２２は、比較器１２０の出力とテクスチャロードアクノリッジ信号とのＡＮＤ演算を行う。テクスチャロードアクノリッジ信号は、テクスチャロード命令につき実行が完了したことを示すアクノリッジ信号である。減算器１２３は、ＴｌＣを−１する。加算器１２４は、ＴｌＣを＋１する。選択回路１２５はＡＮＤゲート１２１の出力に基づいて、加算器１２４における加算前後のＴｌＣのいずれかを選択する。選択回路１２６はＡＮＤゲート１２２の出力に基づいて、減算器１２３の出力と選択回路１２５の出力とのいずれかを選択する。そして選択回路１２６で選択された信号が、新たなＴｌＣとなる。
【０１１８】
ＴｌＣのアップデートロジックは、サブパス実行時にはテクスチャロード命令の実行個数をカウントする。テクスチャロード命令の実行時は、テクスチャロード命令がアサートされる。そのとき、新規スレッドエントリ番号と一致するエントリのＴｌＣフィールドを１カウントアップする。テクスチャロード命令のカウントは、サブパスの１回目の実行でカウントして、その後の全てのスレッドに対して同じ値を使うのではなく、実際にそのスレッドが実行した数を動的にカウントする。分岐命令の実効状態によってテクスチャロード命令の実行個数が異なるかもしれないからである。
【０１１９】
テクスチャロードアクノリッジ信号がアサートされ、自分のエントリ番号がテクスチャロードを実行するスレッドエントリ番号に一致したら、ＴｌＣをカウントダウンする。
【０１２０】
＜ＳｐＩＤのアップデートロジック＞  
次にＳｐＩＤのアップデートロジックについて図３５を用いて説明する。図示するようにＳｐＩＤのアップデートロジックは、比較器１２７、ＡＮＤゲート１２８、及び選択回路１２９を備えている。比較器１２７は当該エントリのエントリ番号と新規スレッドエントリ番号とを比較する。ＡＮＤゲート１２８は比較器１２７の出力とイールド命令とのＡＮＤ演算を行う。選択回路１２９は、ＡＮＤゲート１２８の出力に基づいてＳｐＩＤと次のサブパスＩＤのいずれかを選択し、選択した方を新たなＳｐＩＤとする。
【０１２１】
ＳｐＩＤアップデートロジックは、イールド命令がアサートされると、対応するエントリのＳｐＩＤをインクリメントする。エンド命令の場合にはすぐにデキューされるので、インクリメントの必要はない。
【０１２２】
＜ＰＣのアップデートロジック＞  
次にＰＣのアップデートロジックについて図３６を用いて説明する。図示するようにＰＣアップデートロジックは、ＳｐＩＤアップデートロジックにおいて、ＳｐＩＤ及び次のサブパスＩＤを、それぞれＰＣ及び次のＰＣに置き換えたものである。
【０１２３】
ＰＣアップデートロジックは、スレッド生成時にＩＮＳＴＢＡＳＥをＰＣにロードする。そして、イールド命令がアサートされると、新規スレッドエントリ番号と一致するエントリのＰＣに次のＰＣをセットする。すなわちＰＣをインクリメントする。
【０１２４】
＜Ｒｄｙのアップデートロジック＞  
次にレディビットＲｄｙのアップデートロジックについて図３７を用いて説明する。図示するように、検出器１３２はＴｌＣがゼロであるか否かを検出する。検出器１３３はＰＬが１であるか否かを検出する。検出器１３４は、ＴｄＩＤと次のバリッドなスレッドＩＤとが等しいか否かを検出する。ＡＮＤゲート１３５は、Ｒｕｎの反転信号と、ＥｎＶと、検出器１３２の出力とのＡＮＤ演算を行う。ＡＮＤゲート１３６は、スレッド追い越し信号と、同一ＸＹロック信号の反転信号とのＡＮＤ演算を行う。ＡＮＤゲート１３７は、ＡＮＤゲート１３５の出力と、検出器１３３、１３４の出力と、ＡＮＤゲート１３６の出力とのＡＮＤ演算を行う。そしてＡＮＤゲート１３６の出力が新たなＲｄｙとなる。
【０１２５】
なお、スレッド追い越し信号は、エントリ０〜（Ｍ−１）に関する処理が、前のスレッドに関する処理を時間的に追い越していないかどうかを示す。また同一ＸＹロック信号は、当該エントリと同一ＸＹ座標を有する他のエントリが存在し、且つそれがロックをとっていることを示す信号である。ロックとは、同一ＸＹ座標のものについては他のスレッドの発行を禁止する命令である。
【０１２６】
Ｒｄｙアップデートロジックは、スレッドが実行可能になると、Ｒｄｙビットをセットする。スレッドが実行可能な状態とは以下の全てが成立した場合である。  
・ＥｎＶ＝１：有効なエントリである  
・Ｒｕｎ＝０：実行中のエントリではない  
・ＴｌＣ＝０：テクスチャデータのロードが終了している  
・同一ＸＹロック信号＝０：自分のＸＹ座標と同一のＸＹ座標を持つスレッド保持部エントリがロックを取っていない。つまりそのエントリのロックビットＬｃｋがゼロにクリアされている  
・自エントリに対応するスレッド追い越し信号が１である  
・ＰＬ＝１：プリロードを既に開始している  
・自分のスレッドＩＤは、スレッド保持部においてバリッドな次のスレッドＩＤと同一でない。  
スレッドが実行開始され且つランビットＲｕｎが設定されると、レディビットＲｄｙの成立条件が成立しなくなるので、レディビットＲｄｙはクリアされる。  
＜Ｒｕｎのアップデートロジック＞  
次に、ランビットＲｕｎのアップデートロジックについて説明する。エントリの発行（ＷａｋｅＵｐ時）には、ＲｕｎビットとＲｄｙビットの状態が関連する。この様子を示しているのが図３８である。図示するように、エントリが発行可能になるとＲｄｙビットがセットされる（Ｒｄｙ＝１）。次に、Ｒｄｙビットがセットされたエントリのうちいずれかが選択されて発行される際、Ｒｕｎビットがセットされる（Ｒｕｎ＝１）。更に、次のサイクルでＲｄｙビットがクリアされる（Ｒｕｎ＝１、Ｒｄｙ＝０）。そして、選択されたスレッドがエンド命令またはイールド命令を実行するとＲｕｎビットがクリアされ、アイドル状態に戻る（Ｒｕｎ＝０、Ｒｄｙ＝０）。
【０１２７】
図３９はＲｕｎアップデートロジックの回路図である。図示するように、比較器１３８が当該エントリのエントリ番号と新規スレッドエントリ番号とを比較する。ＯＲゲート１３９はイールド命令とエンド命令とのＯＲ演算を行う。ＮＡＮＤゲート１４０は、比較器１３８の出力とＯＲゲート１３９の出力とのＯＲ演算を行う。ＡＮＤゲート１４１は、ＮＡＮＤゲート１４０の出力とＲｕｎとのＡＮＤ演算を行う。ＯＲゲート１４２は、ＡＮＤゲート１４１の出力とランセット信号とのＯＲ演算を行う。そしてＯＲゲート１４２の出力がＲｕｎとなる。
【０１２８】
上記構成において、イールド命令またはエンド命令がアサートされると、実行中のスレッドエントリ番号と同一のエントリのＲｕｎビットがクリアされる。また、スレッド発行制御部９７から与えられるランセット信号がアサートされると、Ｒｕｎビットがセットされる。Ｒｕｎビットがセットされる条件は次の通りである。  
・スレッド保持部内における全エントリのＲｕｎビットがゼロのとき、またはＲｕｎビットがクリアされるとき  
・Ｒｄｙ＝１  
・ＰＬＣｎｔがセットされているビットが最もＬＳＢ（least significant bit）に近いもの。ＬＳＢに近い程プリロードを開始したタイミングが早い。サブパス０のスタンプでプリロードしていないものは、ＭＳＢがセットされているので最も優先度が低い。
【０１２９】
次に図２６におけるスレッド発行制御部９７について説明する。図４０、図４１はスレッド発行制御部９７の回路図である。
【０１３０】
図示するように、スレッド発行制御部９７は、各エントリに対応した８つのＡＮＤゲート１４３−０〜１４３−（Ｍ−１）、１４４−０〜１４４−（Ｍ−１）、ＯＲゲート１４５−０〜１４５−（Ｍ−１）、ＮＯＲゲート１４６−０〜１４６−（Ｍ−１）、及びＲｕｎ検出部１４７を備えている。ＡＮＤゲート１４３−０〜１４３−（Ｍ−１）の各々は、エントリ０〜（Ｍ−１）に保持されるＲｄｙとＰＬＣｎｔとのＡＮＤ演算を行う。なお、エントリ０〜（Ｍ−１）に保持されるＰＬＣｎｔを、それぞれＰＬＣｎｔ０〜ＰＬＣｎｔ（Ｍ−１）と呼ぶことにする。ＯＲゲート１４５−０〜１４５−（Ｍ−１）の各々は、ＡＮＤゲート１４３−０〜１４３−（Ｍ−１）の出力の全ビットのＯＲ演算を行う。ＮＯＲゲート１４６−０〜１４６−（Ｍ−１）の各々は、ＯＲゲート１４５−０〜１４５−（Ｍ−１）の出力と、エントリ０〜（Ｍ−１）に保持されるＲｄｙとのＮＯＲ演算を行う。ＡＮＤゲート１４４−０〜１４４−（Ｍ−１）は、ＮＯＲゲート１４６−０〜１４６−（Ｍ−１）の出力とＲｕｎ検出部１４７の出力とのＡＮＤ演算を行う。そしてＡＮＤゲート１４４−０〜１４４−（Ｍ−１）の出力が、それぞれランセット信号０〜（Ｍ−１）となる。
【０１３１】
Ｒｕｎ検出部１４７は、ＮＯＲゲート１４７−０、１４７−１、ＯＲゲート１４７−２を備えている。ＮＯＲゲート１４７−０は、エントリ０〜（Ｍ−１）に保持されるＲｕｎのＮＯＲ演算を行う。ＮＯＲゲート１４７−１は、イールド命令とエンド命令のＮＯＲ演算を行う。ＯＲゲート１４７−２は、ＮＯＲゲート１４７−０、１４７−１の出力のＯＲ演算を行う。そしてＯＲゲート１４７−２の出力がＲｕｎ検出部１４７の出力となる。
【０１３２】
またスレッド発行制御部９７は、ＡｇｅＭｓと、プリロードブロックから与えられるアクノリッジ信号とのＯＲ演算を行う。そして、そのＯＲ演算結果とＡＮＤゲート１４４−０〜１４４−（Ｍ−１）の出力を反転させた信号とのＡＮＤ演算を行い、演算結果をＡｇｅＭｓとして出力する。
【０１３３】
更に図４１に示すようにスレッド発行制御部９７は、エントリ０〜（Ｍ−１）に保持されるＲｕｎに応じて、スレッド保持部のエントリ０〜（Ｍ−１）に保持されるスタンプの本体データを選択して出力する。スタンプの本体データとは、ＮｅｗＴ、ＳｐＩＤ、ＴｄＩＤ、ＳｔＮ０、ＳｔＮ１、ＱＶ、ＳｔＮｕｍ０〜ＳｔＮｕｍ３、及びＱＮｕｍ０〜ＱＮｕｍ３を含む。
【０１３４】
スレッド保持部４７において、ＰＬＣｎｔを保持するレジスタはプリロードカウント値を保持するレジスタであるが、プリロード後はエイジレジスタ（age register）として機能する。エイジレジスタとしての機能とは、当該エントリに保持されるデータが、スレッド保持部４７内においてどれだけ古いデータであるかを示す機能である。スレッド発行制御部９７は、エイジレジスタを更新するためのエイジレジスタアップデート信号及び初期値ＡｇｅＭｓを生成し、ＰＬＣｎｔアップデートロジックに出力する。
【０１３５】
またスレッド発行制御部９７は発行すべきエントリを探し、そのエントリ内のＲｕｎビットをセットする。更にスレッド発行制御部９７は、Ｒｕｎビットを参照することによりいずれかのエントリを選択する。ここで、プリロード発行時及びスレッド発行時のエイジレジスタについて説明する。図４２はプリロード発行時のエイジレジスタの様子を示す概念図である。図示するようにエイジレジスタはＭ個のエントリを有し、各エントリ内に例えば８ビットのデータを保持できる。またスレッド保持部４７は、既にプリロード発行済みのエントリ番号に対応したビット位置がセットされた（“１”にされた）、８ビット長のマスターエイジレジスタ（master age register）を備える。マスターエイジレジスタは、例えばエントリ番号０、１、２のスレッドが既にプリロードを発行しているとすると、ビット０、１、２がセットされていることになる。
【０１３６】
図４２に示すようにエントリ０〜２がプリロード発行済みの状態で、次にエントリ３がプリロードを発行したと仮定する。すると、マスターエイジレジスタの値が、エイジレジスタのプリロード発行したレジスタにコピーされる。これは、エントリにとっては自分より早いタイミングでプリロードを発行しているエントリ番号に対応するビットがセットされることになる。その後、マスターエイジレジスタの対応するビット（ビット３）がセットされる。既にエントリはプリロードを発行したためである。
【０１３７】
図４３はスレッド発行時のエイジレジスタの様子を示す概念図である。スレッドが発行される際には、Ｒｄｙビットがセットされ且つ最も古いエントリが選択される。
【０１３８】
エイジレジスタの各エントリにおいては、自分より古くからプリロードされているエントリに対応した位置のビットがセットされている。従って、エイジレジスタを参照することで、いずれのエントリのデータがもっと古いのかを知ることが出来る。そして、エイジレジスタ内のビットと、各エントリのＲｄｙビットとのＡＮＤを取る。その後、更に８ビットのリダクションＯＲを取った結果がゼロであり、かつ自分のＲｄｙがセットされているものが「Ｒｄｙがセットされていて最も古い」エントリとなる。すなわち、それが選択すべきエントリとなる。図４３ではエントリ０がそれにあたる。最も古いのはエントリ１であるが、エントリ１はＲｄｙビットがセットされていないため、次に古いエントリ０が選択される。エントリが選択されると、エイジレジスタ内において選択エントリに対応するビット（エントリ０）が全てクリアされて、今後は選択対象とはならない。またマスターエイジレジスタでも同様である。
【０１３９】
次に、スレッド発行制御部９７の各ステージの動作について説明する。スレッド発行制御部９７は、Ｍ個のスレッド保持部エントリのそれぞれに保持されるＰＬＣｎｔとＲｄｙとから、Ｒｄｙであり且つ最も早くプリロードを発行したエントリを選択する。すなわちＮＯＲゲート１４６−０〜１４６−（Ｍ−１）のうち、発行すべきエントリに対応するものの出力がアサートされる。
【０１４０】
そして、Ｍ個のエントリに対応するランセット信号のうち、選択されたエントリに対応するものがアサートされる。また、各エントリに対応するランセット信号が各エントリのアップデートロジックに入力され、これに基づいてＲｕｎビットがセットされる。ランセット信号がアサートされた場合、マスターエイジレジスタの対応するビットがクリアされる。また、Ｒｕｎのエンコード結果に基づき、実行スレッドエントリ番号が生成される。更に、Ｒｕｎビットが参照され、これに基づいていずれかのエントリが選択される。そして、選択されたエントリのデータが描画処理部３６へ出力される。出力される信号は、サブパススタート信号、ＳｐＩＤ、ＴｄＩＤ、実行スレッドエントリ番号、ＰＣ、ＳｔＮ０、ＳｔＮ１、ＱＶ、ＳｔＮｕｍ０〜ＳｔＮｕｍ３、及びＱＮｕｍ０〜ＱＮｕｍ３である。
【０１４１】
次に、スレッド保持部４７の備える比較部１００について説明する。図４４は比較部１００の回路図である。比較部１００は、スレッド保持部のエントリ数と同じＭ個の比較回路１５１−０〜１５１−（Ｍ−１）を備えている。比較回路１５１−０〜１５１−（Ｍ−１）は、スレッド保持部の各エントリのＸＹタグとエントリバリッドビット、及び命令管理部の各エントリのロックビットＳｐｔＬｃｋを参照する。そして比較回路１５１−０〜１５１−（Ｍ−１）は、スレッド保持部４７内のＭエントリに関して同一ＸＹ座標タグを持つ組み合わせがあるかを判定する。
【０１４２】
すなわち、比較回路１５１−０は、スレッド保持部４７内のエントリ０に保持されるＸＹタグが、その他のエントリ１〜（Ｍ−１）に保持されるＸＹタグのいずれかと等しいか否かを検出する。比較回路１５１−１は、エントリ１に保持されるＸＹタグが、その他のエントリ０、２〜（Ｍ−１）に保持されるＸＹ座標タグのいずれかと等しいか否かを検出する。比較回路１５１−２は、エントリ２に保持されるＸＹ座標タグが、その他のエントリ０、１、３〜（Ｍ−１）に保持されるＸＹ座標タグのいずれかと等しいか否かを検出する。以下同様である。
【０１４３】
等しいＸＹタグを有するエントリが存在する場合、その検出結果と、当該エントリに対応する命令管理部のエントリに保持されるロックビットＳｐｔＬｃｋとのＯＲ演算が、同一ＸＹロック信号として出力される。同一ＸＹロック信号は、対応するエントリと同一ＸＹ座標を保持する他のエントリがスレッド保持部内に存在し、且つそのエントリがＬｏｃｋを取っていることを示す。
【０１４４】
図４５は図４４における比較回路の回路図であり、特に比較回路１５１−０について示している。比較回路１５１−０は、検出部１５２−０〜１５２−（Ｍ−２）、ＡＮＤゲート１５３−０〜１５３−（Ｍ−２）、及びＯＲゲート１５４を備えている。検出部１５２−０〜１５２−（Ｍ−２）の各々は、エントリ１〜（Ｍ−１）に保持されるＸＹタグと、エントリ０に保持されるＸＹタグとを比較して同一であるか否かを検出する。ＡＮＤゲート１５３−０〜１５３−（Ｍ−２）の各々は、検出部１５２−０〜１５２−（Ｍ−２）の出力のそれぞれと、エントリ１〜（Ｍ−１）のエントリバリッドＥｎＶのそれぞれと、命令管理部のエントリ１〜（Ｍ−１）に保持されるロックビットＳｐｔＬｃｋのそれぞれとのＡＮＤ演算を行う。ＯＲゲート１５４は、ＡＮＤゲート１５３−１〜１５３−（Ｍ−２）のＯＲ演算を行う。そして、ＯＲゲート１５４の出力が、エントリ０に対応した同一ＸＹロック信号となる。
【０１４５】
上記構成において、エントリ０の保持するＸＹタグと、他のエントリ１〜（Ｍ−１）のいずれかが保持するＸＹタグとが等しく、且つその他エントリのバリッドがセットされ、更にその他エントリがロックを取っていた場合、対応するＡＮＤゲート１５３−０〜１５３−（Ｍ−２）の出力が“Ｈｉｇｈ”となる。よって同一ＸＹロック信号がアサートされる。
【０１４６】
スレッド保持部４７の備えるインターフェース９９は、テクスチャユニット３３から送信されるテクスチャロードのアクノリッジ信号をＦ／Ｆでラッチする。
【０１４７】
次に、図７における命令管理部４８について説明する。命令管理部４８はレディキューテーブル（ready queue table）を備えている。レディキューテーブルは、図４６に示すようなＭ個のエントリを備える。レディキューテーブルの各エントリはスレッド保持部４７の１エントリに対応しており、それぞれＴｄＥｎｔＮｏ、ＳｐＩＤ、ＳｐＲｄｙ、及びＳｐｔＬｃｋを保持する。ＴｄＥｎｔＮｏは対応するスレッド保持部エントリ番号、ＳｐＩＤは次に実行すべきサブパス番号、ＳｐＲｄｙはスレッドを発行して良いかどうかを示すフラグ、ＳｐｔＬｃｋはロックを取っているかどうかを示すフラグである。各情報は、クアッドマージ後にスレッドを生成した順序で保持される。ＳｐＲｄｙは、スレッドがサブパスの単位で前のスレッドを追い越すことなく発行されるようにセットされる。
【０１４８】
サブパスについて図４７を用いて説明する。命令制御部３５は各スレッドに対して、ＩＮＳＴＢＡＳＥにより指定されるアドレスの命令を、エンド命令を検出するまで実行する。この実行される命令列は、図４７に示すようにＸ個の命令列に分割出来、分割されて出来た個々の命令列がサブパス（Sub pass）である。個々のサブパスの最後にはイールド命令Ｙｉｅｌｄが配置され、最終サブパスの最後にはイールド命令の代わりにエンド命令Ｅｎｄが配置されている。
【０１４９】
図４８は、サブパスが実行される様子を時間と共に示した概念図である。図４８においてスレッド５、６、７は同一のピクセルシェーダユニットによって処理される。図示するように、スレッドに対する処理はイールド命令によって一旦休止する。そして、代わりに他のスレッドに対する命令が実行される。休止したスレッドは、後に発行可能となった際に起動される。すなわち、２つのイールド命令間で実行される命令がサブパスである。そしてサブパスの単位でスレッドが実行され、その期間の処理は連続して実行される。
【０１５０】
次に実行を予定するサブパスのサブパス番号が互いに同一である複数のスレッドが存在する場合、ＳｐＲｄｙフラグは最も古いスレッドに対してだけセットされる。そして、ＳｐＲｄｙがセットされたスレッドだけが発行可能である。これにより、新しいスレッドに対する処理が、古いスレッドに対する処理を時間的に追い越してしまうことを防止する。
【０１５１】
新規スレッドが生成された際、レディキューテーブルの空いている最初のエントリにそのスレッド保持部のエントリ番号がセットされ、ＳｐＩＤがゼロにセットされ、バリッドビットＥｎＶがセットされる。
【０１５２】
スレッドが発行された際（サブパスが実行された際）、対応するエントリのＳｐＩＤがインクリメントされ、次回発行されるサブパス番号を示すようにする。スレッドがエンド命令を実行したら、バリッドビットがクリアされ、エントリはデキューされる。
【０１５３】
各エントリは、自分のＳｐＩＤと、自分より１つ古いエントリのＳｐＩＤとを常時比較する。そして、その古いエントリのＳｐＩＤが自分のＳｐＩＤと同一である場合は、自分のＳｐＲｄｙをクリアする。図４６の例であると、エントリ２とエントリ３の関係であり、エントリ３はＳｐＲｄｙをクリアしている。ＳｐＩＤフィールドは、自分より１つ古いエントリと同一であるか小さいかのどちらかの値しか取らない。従って、上記のような処理を行うことにより、同一ＳｐＩＤのうち一番古いスレッドについてのみ、ＳｐＲｄｙビットがセットされることになる。各エントリのＳｐＲｄｙビットは、そのＴｄＥｎｔＮｏ番号の示すスレッド保持部エントリに対して選択されて出力される。
【０１５４】
実行中のスレッドがロック命令を実行した場合、対応するエントリのロックビットがセットされる。またアンロック命令を実行した場合には、ロックビットはクリアされる。
【０１５５】
次に、命令管理部４８の回路構成について説明する。図４９は命令管理部４８の備えるエントリ回路１５９の回路である。この回路は、レディキューテーブルにおける各エントリの実体を為す回路である。
【０１５６】
図示するようにエントリ回路１５９は、ＡＮＤゲート１６０−１〜１６０−８、ＯＲゲート１６１−１〜１６１−３、ＮＡＮＤゲート１６２、比較器１６３−０〜１６３−２、加算器１６４、及び選択回路１６５−０、１６５−１、１６６−０〜１６６−４を備えている。
【０１５７】
ＯＲゲート１６１−１は、エンド命令とイールド命令とのＯＲ演算を行う。比較器１６３−０は、新規スレッドエントリ番号と、自らが保持するスレッドエントリ番号ＴｄＥｎｔＮｏとを比較する。比較器１６３−２は、自らが保持するサブパスＩＤ（ＳｐＩＤ）と、１つ古いエントリが保持するサブパスＩＤ（旧エントリのＳｐＩＤ）とを比較する。ＮＡＮＤゲート１６２は、比較器１６３−２の出力の反転信号と、自らより１つ古いエントリが保持するバリッドビット（旧エントリのＥｎＶ）とのＮＡＮＤ演算を行う。ＡＮＤゲート１６０−８は、比較器１６３−２の出力と旧エントリのバリッドビットとのＡＮＤ演算を行う。ＡＮＤゲート１６０−１は、比較器１６３−０の出力と信号エンド命令とのＡＮＤ演算を行う。ＡＮＤゲート１６０−５は、ＯＲゲート１６１−０の出力と、ＡＮＤゲート１６０−１の出力の反転信号とのＡＮＤ演算を行う。ＡＮＤゲート１６０−２は、ＯＲゲート１６１−１の出力と、比較器１６３−０の出力とのＡＮＤ演算を行う。ＡＮＤゲート１６０−３は、自らより１つ古いエントリが保持するロックビット（旧エントリのＳｐｔＬｃｋ）を反転させたものと、比較器１６３−０の出力とのＡＮＤ演算を行う。ＡＮＤゲート１６０−４は、ロック命令と、ＡＮＤゲート１６０−８の出力とのＡＮＤ演算を行う。ＯＲゲート１６１−２は、ＡＮＤゲート１６１−２の出力とＡＮＤゲート１６０−３の出力とのＯＲ演算を行う。ＯＲゲート１６１−３は、ＡＮＤゲート１６０−４の出力と、自らが保持するロックビットＳｐｔＬｃｋとのＯＲ演算を行う。ＡＮＤゲート１６０−６は、ＯＲゲート１６１−２の出力の反転信号と、ＯＲゲート１６１−３の出力とのＡＮＤ演算を行う。比較器１６３−１は、自らが保持するスレッドエントリ番号ＴｄＥｎｔＮｏと、動作開始スレッドエントリ番号とを比較する。動作開始スレッドエントリ番号は、サブパスの実行を開始したスレッドに関する。
【０１５８】
ＡＮＤゲート１６０−７は、信号サブパススタート信号と、比較器１６３−１の出力とのＡＮＤ演算を行う。選択回路１６５−０は、ＡＮＤゲート１６０−０の出力に基づいて、ＴｄＥｎｔＮｏとスレッドライトエントリ番号とのいずれかを選択する。加算器１６４は、自らが保持するサブパスＩＤ（ＳｐＩＤ）を＋１する。選択回路１６５−１は、ＡＮＤゲート１６０−７の出力に基づいて、加算器１６４の出力、ＳｐＩＤ、または“０”のいずれかを選択する。
【０１５９】
選択回路１６６−０は、シフトイネーブル信号に基づいて、ＡＮＤゲート１６０−５の出力と、自らより１つ新しいエントリのデータ（シフト入力信号）とのいずれかを選択する。そして選択回路１６６−０の出力がバリッドビットとなる。選択回路１６６−１は、シフトイネーブル信号に基づいて、ＡＮＤゲート１６０−６の出力と、自らより１つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路１６６−１の出力がロックビットＳｐｔＬｃｋとなる。選択回路１６６−２は、シフトイネーブル信号に基づいて、選択回路１６５−０の出力と、自らより１つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路１６６−２の出力がＴｄＥｎｔＮｏとなる。選択回路１６６−３は、シフトイネーブル信号に基づいて、選択回路１６５−１の出力と、自らより１つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路１６６−３の出力がＳｐＩＤとなる。選択回路１６６−４は、シフトイネーブル信号に基づいて、ＮＡＮＤゲート１６２の出力と、自らより１つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路１６６−４の出力がＳｐＲｄｙとなる。
【０１６０】
ＡＮＤゲート１６０−５、１６０−６の出力、選択回路１６５−０、１６５−１の出力、及びＮＡＮＤゲート１６２の出力はシフト出力信号となる。そして、自らよりも１つ古いエントリに対応するエントリ回路にシフト入力信号として入力される。
【０１６１】
なお、エンド命令、ロック命令、ロッククリア命令は、描画処理部３６が送られる信号である。またサブパススタート信号はスレッド保持部４７から与えられ、サブパスの実行開始を示す信号である。スレッドライトエントリ番号は、スレッド保持部４７において、書き込みを行うべきエントリの番号を示す信号であり、オーバーラップ検出部４５から与えられる。動作開始スレッドエントリ番号及び新規スレッドエントリ番号はスレッド保持部４７のエントリ番号であり、それぞれスレッド保持部４７及び描画処理部３６から与えられる。
【０１６２】
上記構成において、ＯＥステージでスレッドライトイネーブル信号がアサートされると、書き込みポインタが示すエントリに対して、ＴｄＥｎｔＮｏとしてスレッドライトエントリ番号が書き込まれ、ＳｐＩＤとしてゼロが書き込まれ、バリッドビットＥｎＶとして“１”が書き込まれる。すなわち、選択回路１６５−０はスレッドライトエントリ番号を選択し、選択回路１６５−１は“０”を選択する。なおスレッドライトイネーブル信号はスレッド保持部４７に対するデータの書き込みをイネーブルにする信号であり、スレッド生成部から与えられる。
【０１６３】
また比較器１６３−２は、自らより１つ古いエントリがバリッドであり、且つそのエントリのサブパスＩＤ（旧エントリのサブパスＩＤ）と自らのサブパスＩＤとが等しい場合、ＮＡＮＤゲート１６２の出力が“Ｈｉｇｈ”となる。この場合、ＳｐＩＤ＝１に設定される。その他の場合にはＮＡＮＤゲートの出力は“Ｌｏｗ”となり、ＳｐＩＤ＝０に設定される。
【０１６４】
また、ＳｐＩＤが旧エントリのサブパスＩＤと等しく、且つロック命令がアサートされると、実行中のスレッドエントリ番号と一致するエントリのロックビットＳｐｔＬｃｋがセットされる。逆に、エンド命令、ロッククリア命令がアサートされたらクリアする。また、直前のエントリのロックビットＳｐｔＬｃｋがゼロであって、ＳｐＩＤが自分と同じ場合、自分のビットをクリアにする。
【０１６５】
サブパススタート信号がアサートされると、比較器１６３−１が実行スレッドエントリ番号と自分のＴｄＥｎｔＮｏとを比較する。そして両者が同一なら自分が発行されたと認識して、加算器１６４がＳｐＩＤをインクリメントする。ＳｐＩＤがインクリメントされた後、新しいＳｐＩＤの値によってＳｐＲｄｙビットの再評価が行われ、その値が更新される。
【０１６６】
エンド命令が実行されると、比較器１６３−０が実行スレッドエントリ番号と自分のＴｄＥｎｔＮｏとを比較する。両者が一致すれば、自分のサブパスが終了したと判定され、ＡＮＤゲート１６０−５の出力が“Ｌｏｗ”レベルとなって、エントリバリッドＥｎＶはクリアされる。
【０１６７】
次に、命令管理部の備える読み出し回路１７０について図５０を用いて説明する。図５０は読み出し回路１７０とエントリ回路１５９との接続関係を示すブロック図である。読み出し回路１７０は、命令管理部から、指定されたエントリ内のＳｐＲｄｙビット及びロックビットＳｐｔＬｃｋを選択する。
【０１６８】
図示するように、命令管理部４８は、エントリと同じ数（Ｍ個）の読み出し回路１７０を備えている。各エントリに対応するエントリ間では、シフト入力信号、シフト出力信号と、エントリバリッドＥｎＶ、ＳｐＩＤが縦列接続されている。そして読み出し回路１７０は、８個のエントリ回路１５９からＴｄＥｎｔＮｏ、ＳｐＲｄｙビット、及びロックビットＳｐｔＬｃｋを受け取り、スレッド保持部４７において指定されるエントリに対応したエントリ回路１５９のＳｐＲｄｙビット及びロックビットを選択する。
【０１６９】
図５１は、各読み出し回路１７０の回路図である。図示するように読み出し回路１７０は、ＡＮＤゲート１７１−０〜１７１−（Ｍ−１）、比較器１７２−０〜１７２−（Ｍ−１）、及びＯＲゲート１７３を備えている。ここで、命令管理部のエントリ０〜（Ｍ−１）に保持されるレディビットをそれぞれＳｐＲｄｙ０〜ＳｐＲｄｙ（Ｍ−１）と呼び、ロックビットをＳｐｔＬｃｋ０〜ＳｐｔＬｃｋ（Ｍ−１）、スレッドエントリ番号をＴｄＥｎｔＮｏ０〜ＴｄＥｎｔＮｏ（Ｍ−１）と呼ぶことにする。
【０１７０】
比較器１７２−０〜１７２−７は、ＴｄＥｎｔＮｏ０〜ＴｄＥｎｔＮｏ（Ｍ−１）のそれぞれとエントリ番号ＥｎｔＮとを比較する。そして両者が一致した場合、“Ｈｉｇｈ”レベルを出力する。ＡＮＤゲート１７１−０〜１７１−（Ｍ−１）は、ＳｐＲｄｙ０〜ＳｐＲｄｙ（Ｍ−１）のそれぞれと、比較器１７２−０〜１７２−（Ｍ−１）の出力のそれぞれとのＡＮＤ演算を行う。更に、ＳｐｔＬｃｋ０〜ＳｐｔＬｃｋ（Ｍ−１）のそれぞれと、比較器１７２−０〜１７２−（Ｍ−１）の出力のそれぞれとのＡＮＤ演算を行う。ＯＲゲート１７３は、ＡＮＤゲート１７１−０〜１７１−（Ｍ−１）の出力のＯＲ演算を行う。そして、ＯＲゲート１７３の出力が、選択エントリに保持されるＳｐＲｄｙビット及びＳｐｔＬｃｋビットとなる。
【０１７１】
上記読み出し回路１７０の動作を、例えばエントリ０からデータを読み出す場合を例に挙げて説明する。この場合、比較器１７２−０の出力が“Ｈｉｇｈ”レベルとなり、その他の比較器１７２−１〜１７２−（Ｍ−１）の出力が“Ｌｏｗ”レベルとなる。従って、ＡＮＤゲート１７１−１〜１７１−（Ｍ−１）の出力は強制的に“Ｌｏｗ”レベルとなる。他方、ＡＮＤゲート１７１−０は、エントリ０に保持されるＳｐＲｄｙビット及びロックビットＳｐｔＬｃｋによって変化する。すなわち、エントリ０のＳｐＲｄｙビット及びロックビットＳｐｔＬｃｋが取り出される。
【０１７２】
次に、上記構成のグラフィックプロセッサの動作について、特に命令制御部３５に特に着目して説明する。図５２はグラフィックプロセッサにより図形を描画する際の処理のフローチャートである。
【０１７３】
図形を描画するにあたっては、まずラスタライザ２４に図形情報が入力される（ステップＳ１０）。図形情報は、例えば図形の頂点座標や色情報などである。すると、ラスタライザ２４は描画すべき図形が占める位置に対応するスタンプを生成する（図６参照）。生成されたスタンプデータは、それぞれ予め対応付けられたピクセルシェーダ２５−０〜２５−３のデータ振り分け部３０に送られる（ステップＳ１１）
次に、各ピクセルシェーダ２５−０〜２５−３が受け取ったスタンプデータに基づいて描画処理を行うべく、タスクの実行管理が開始される（ステップＳ１２）。
【０１７４】
＜スタンプデータ受信＞  
まず、データ振り分け部３０が、ピクセルシェーダユニット３４の備える命令制御部３５に対してスタンプデータを送付する（ステップＳ１３）。データ振り分け部３０から命令制御部３５へ８クロックサイクルでスタンプデータが転送される。
【０１７５】
データ振り分け部３０から送付されるスタンプデータは図５３に示すように、スタンプのピクセルバリッド、ＸＹ座標、及び第１データ乃至第３データである。図示するようにデータ振り分け部３０は、１つのスタンプに関するデータを８サイクルに分割して転送する。データはＭＳＢ側から分割されて順に送られる。
【０１７６】
図５４は、データ転送時の各種信号のタイミングチャートである。図中のスタンプデータはピクセルバリッドＰＶ、ＸＹ座標、第１データのことである。図示するように、データはクロックＣＬＫ２に同期して命令制御部３５に送付される。第２データ以外のデータは第１スタート信号に同期して、８サイクルに分割して送付される。第２データは第２スタート信号に同期して８サイクル間で送付される。第２データはそれ以外のデータより規定サイクルΔＴだけ遅れて送付される。
【０１７７】
＜スタンプデータ書き込み＞  
次に、転送されたデータは、第１データ保持部４２、第２データ保持部４３、及びスタンプ保持部４４に書き込まれる（ステップＳ１４）。命令制御部３５は、最大でスタンプ１６個分のスタンプデータを保持できる。そしてスタンプの処理が終了した際には、そのスタンプデータを破棄する。
【０１７８】
第１データは、第１スタート信号がアサートされてから８サイクルの間、第１データ保持部４２へ毎サイクル書き込まれる。第２データは、第２スタート信号がアサートされてから８サイクル間、シフトレジスタ５３−５（図１０参照）にラッチされ、９サイクル目にまとめて第２データ保持部４３に書き込まれる。更に書き込み制御部４０は、第１スタート信号がアサートされてから８サイクル間、受信したＸＹ座標、第３データ、ピクセルバリッドに基づいて、ＸＹ座標、ピクセルバリッド、第３データ、ＱＶを組み立てた後、それをスタンプ保持部４４へ書き込む。
【０１７９】
スタンプデータの書き込みの際には、スタンプに対して割り当てたスタンプ番号ＳｔＮを使用する。スタンプ番号ＳｔＮは、命令制御部３５が内部的に使用するスタンプの識別番号であり、０〜（Ｎ−１）が割り当てられる。データ振り分け部３０からスタンプが転送されると、スタンプ番号のプールから、空いている（未使用の）番号がそのスタンプに割り当てられる。各スタンプは、処理が終了するまでそのスタンプ番号ＳｔＮを使い続ける。スタンプの処理が終了すると、再びその番号は「フリー（free）」となって、スタンプ番号プールに戻される。
【０１８０】
より具体的には、スタンプ番号ＳｔＮは、スタンプ保持部４４の空きエントリのうちで、最も若い数字のエントリ番号が割り当てられる。そしてスタンプ保持部４４内のそのエントリにスタンプデータが書き込まれる。この様子を示しているのが図５５である。図示するように、スタンプ保持部４４はＮ個のエントリを有している。スタンプ保持部は番号の若いエントリから順に使用される。例えばエントリ０〜３までが使用中であったとする（既にデータが書き込まれている）。すると、未使用のエントリ４〜（Ｎ−１）のうちで、最も番号の若いエントリ４が使用される。使用中か否かは、各エントリのバリッドビットＥｎＶを参照することで知ることが出来る。バリッドビットＥｎＶは、当該エントリに保持されるスタンプの処理が終了すると、“０”にクリアされる。エントリ４に書き込まれた当該スタンプに対しては、書き込まれるエントリの番号と同じ“４”がスタンプ番号ＳｔＮとして与えられる。
【０１８１】
図５６は第２データ保持部４３である。図示するように、第２データ保持部４３はＮ個のエントリを有している。第２データ保持部４３の各エントリは、下位ビットから順にピクセル０〜ピクセル（Ｎ−１）に関する第２データを保持する。第２データ保持部４３は、各エントリのエントリ番号がスタンプ番号ＳｔＮに一致するように、第２データを保持する。すなわち、エントリ０〜（Ｎ−１）は、それぞれＳｔＮ＝０〜（Ｎ−１）のスタンプの第２データを保持する。従って、図５５においてエントリ４にスタンプデータが格納されたスタンプの第２データは、第２データ保持部４４のエントリ４に保持される。
【０１８２】
図５７はメモリ５４である。メモリ５４はＮ個のエントリ０〜（Ｎ−１）を有するＦＩＦＯであり、若い番号のエントリから順に使用される。すなわち、メモリ５４のエントリ番号とスタンプ番号とは一致するものではない。例えばメモリ５４のエントリ０〜８が使用中であったとすると、次はエントリ９が使用される。エントリ９をＳｔＮ＝４のスタンプが使用すると、バリッドビットＥｎＶが“０”から“１”にセットされ、スタンプ番号ＳｔＮフィールドに“４”（０１００）がセットされる。また第２データ保持部４３への第２データの書き込みが終了すると、第２データレディビットＲｄｙ２が“０”から“１”にセットされる。更にＳｔＮ＝４のスタンプが、当該タスクに属する最初のスタンプであった場合には、同期ビットＳｙｎｃが“１”にセットされる。最初でない場合は“０”である。
【０１８３】
次に、データ振り分け部３０から転送される複数のスタンプと、タスクとの関係について図５８を用いて説明する。図５８は各種信号のタイミングチャートである。データ振り分け部３０は、外部からタスクの開始信号（タスク実行命令）を受けてタスクの処理を開始する。タスク実行命令がアサートされると、命令制御部３５はタスク実行可能な状態になる。この状態になると、命令制御部３５はピクセルシェーダユニット実行信号をアサートする。ピクセルシェーダユニット実行信号がアサートされることで、タスクが実行される。
【０１８４】
あるタスクで処理されるスタンプは、次のようにして受信されたスタンプである。すなわち、  
・タスクを実行出来る状態において受信したスタンプ、すなわちタスク実行命令がアサートされてから受信したスタンプのうち、タスク同期信号がアサートされるまでのものであり、更に  
・タスクを実行出来る状態より前に受信したスタンプで、前のタスクの終了を示すタスク同期信号がアサートされた後のもの、である。
【０１８５】
従って、データ振り分け部３０からタスク同期信号のアサートを受けると、それ以降のスタンプは次のタスクのものだと判定される。この際のメモリ５４の様子を図５９に示す。例えばエントリ９にタスク１の最初のスタンプが保持され、エントリ１２にタスク２の最初のスタンプが保持されたとする。するとエントリ９、１２にスタンプが保持される際には信号ＮｅｗＴがアサートされるので、これらのエントリの同期ビットＳｙｎｃが“１”となる。従って、エントリ９〜１１がタスク１に属することが分かる。
【０１８６】
＜クアッドマージ＞  
以上のようにしてスタンプデータが各レジスタ及びバッファへ書き込まれた後、ＸＹタグが生成され、クアッドマージが行われる（ステップＳ１５）。クアッドマージが行われる条件は下記の通りである。  
（１）クアッドマージするスタンプは２個以下であること。  
（２）２つのスタンプが時間的に連続していること  
（３）２つのスタンプのＸＹ座標が同じこと  
（４）マージされるスタンプ（古い方のスタンプ）の残ったピクセルとマージする新規スタンプのピクセルバリッドに重複がないこと。  
（５）２つのスタンプが同一タスクに属すること。  
クアッドマージが行われなかった場合は、スタンプがそのままスレッドとなる。
【０１８７】
クアッドマージにあたって、オーバーラップ検出部４５はクアッドマージ動作に必要な情報であるＸＹ座標の同一性を検出する。またスレッド保持部４７に必要な、ＸＹ座標の一致比較を簡略化するためのＸＹ座標のハッシュ（ＸＹタグ）を生成する。そして、内部に有するＸＹテーブルにＸＹ座標値を保持させる。ＸＹタグとは、ＸＹテーブルのエントリ番号であり、例えば３ビットである。ＸＹテーブルの各エントリには各スタンプのＸＹ座標と、そのスタンプ番号ＳｔＮが保持される。ＸＹテーブルのエントリを新規に使用する際は、空いているエントリの内で最もエントリ番号の小さいエントリが選択される。スタンプ処理が終了し、そのＸＹ座標が現在どのスレッドでも使用されていないとき、ＸＹテーブルの対応するエントリは開放される。
【０１８８】
また、オーバーラップ検出部４５のスレッド保持部選択部６３が、新規スレッドを生成される際に使用すべきスレッド保持部エントリを決定する。スレッド保持部選択部６３は、スレッド保持部４７のバリッドビットＥｎＶを参照して空いているエントリを探し、空いている最も小さいエントリ番号を選択する。選択したエントリ番号をスレッドライトエントリ番号として出力する。このエントリが新規スレッドの書き込み先となる。また、エントリフル信号を生成する。すなわち、スレッド保持部４７に空きエントリが無くなればエントリフル信号がアサートされる。
【０１８９】
次に、スレッド生成部４６がクアッドマージを行うか否かを決定する。すなわち、スレッド生成部４６は、如何にして２つのスタンプをマージするかにつき決定し、更に実際にマージ処理を行う。
【０１９０】
クアッドマージにあたって、クアッドマージで残ったスタンプデータは、次の新規スタンプがピクセルシェーダユニットに到達するまでマージバッファ８４に保持される。また、２つのスタンプの全クアッドを新規スレッドに含めることが出来ない場合がある。この際、マージバッファ８４に残されるクアッドは必ず新規スタンプ内のクアッドであり、古いスタンプのクアッドはスレッドとして出力される。マージバッファ８４にクアッドが存在しない場合、新規スタンプの全てのクアッドはマージバッファ８４に残される。この時スレッドは生成されない。クアッドマージは、出来るだけクアッド位置がオリジナルと変わらないようにして行われる。クアッドの位置にオーバーラップがある場合はマージバッファのクアッド位置は変えず、新規スタンプの位置をずらす。それでもマージできない場合はマージバッファのクアッドの方もずらす。
【０１９１】
スレッド生成部４６は、クアッドマージを行った際、マージ後のクアッドバリッドと、どのようにマージされたかの情報であるＳｔＮｕｍ０〜ＳｔＮｕｍ３、ＱＮｕｍ０〜ＱＮｕｍ３を生成する。また、マージされる２つのスタンプのスタンプ番号ＳｔＮ０、ＳｔＮ１を出力する。ＳｔＮ０の方が古いスタンプである。更にスレッド生成部４６は、ＳｔＮ１に相当するスタンプが２スレッドに分割された場合、Ｄｉｖｉｄｅフラグをアサートする。これをスタンプ保持部４４のＳｔＮ１のエントリに書き込む。
【０１９２】
上記の処理を具体的に説明する。スレッド生成部４６内のマージバッファ８４に残っているスタンプと、新たに入力されたスタンプとが、例えば図６０に示すようであったとする。すなわち、マージバッファ８４が保持するスタンプは、クアッドＱ１がインバリッドで、クアッドＱ１〜Ｑ３がバリッドであり、スタンプ番号ＳｔＮは“４”である。また新規に入力されたスタンプは、クアッドＱ０、Ｑ１がバリッドで、クアッドＱ２、Ｑ３がインバリッドであり、スタンプ番号ＳｔＮは“５”である。なお、ＳｔＮ＝４のスタンプのクアッドＱ１〜Ｑ３、及びＳｔＮ＝５のスタンプのクアッドＱ０、Ｑ１を、それぞれクアッド１〜５と呼ぶことにする。
【０１９３】
この時、書き込み制御部４０内のメモリ５４の内容は図６１のようであったとする。すなわち、２つのスタンプがメモリ５４のエントリ９、１０にそれぞれ保持されるとする。すると、エントリ９、１０にそれぞれスタンプ番号“４”、“５”が保持される。また、それぞれのエントリの同期ビットＳｙｎｃは“０”、“１”である。同期ビットＳｙｎｃから、エントリ９、１０に対応する２つのスタンプは同一タスクであることが分かる（２つのエントリの同期ビットＳｙｎｃが“０”、“０”でも同様）。また、２つのスタンプのＸＹ座標は同一であり、その座標値を“Ｃ”と仮定する。
【０１９４】
図６２は、ＳｔＮ＝４のスタンプが入力された際における、オーバーラップ検出部４５の備えるＸＹテーブルである。ＳｔＮ＝４のスタンプが入力された時点で、ＸＹテーブルのエントリ０、１、３、４、６が使用中であり、エントリ２、５、７が空いていたとする。また、使用中のエントリには、ＸＹ座標“Ｃ”は登録されていなかったとする。すると、オーバーラップ検出部４５のエントリ部６０−０〜６０−７において、ＸＹ比較結果信号は全てゼロとなり、新たなエントリが割り当てられることになる。新たなエントリは、最もエントリ番号の小さい空きエントリであるから、ここではエントリ２が割り当てられる。すなわち、エントリ割り当て部６２は、エントリ２に関するＸＹ割り当て信号をアサートする。新たなエントリが割り当てられたことにより、ＸＹ座標テーブル選択部６１は、次に使用すべきＸＹテーブルエントリ信号をアサートする。これにより、ＸＹテーブルのエントリ２のバリッドビットＥｎＶがアサートされ、ＸＹ座標値として“Ｃ”が書き込まれ、スタンプ番号ＳｔＮ＝４が書き込まれる。また、ＳｔＮ＝４のスタンプに対して、ＸＹテーブルのエントリ番号と同一の番号“２”がＸＹタグとして与えられる。
【０１９５】
次にＳｔＮ＝５のスタンプが入力された際のＸＹテーブルについて図６３を用いて説明する。ＳｔＮ＝５のスタンプはＳｔＮ＝４のスタンプと同一ＸＹ座標を有する。従って、エントリ部６０−２において、ＸＹ比較結果信号がアサートされる。また、同一ＸＹ座標であるので新たなエントリは割り当てられないから、エントリ割り当て部６２はＸＹ割り当て信号の全てをゼロとする。この結果、ＸＹテーブルのエントリ２には新たにスタンプ番号ＳｔＮ＝５が書き込まれる。従って、ＳｔＮ＝５のスタンプのＸＹタグも、ＳｔＮ＝４と同じ“２”である。
【０１９６】
次に、オーバーラップ検出部４５のＸＹテーブル選択部６１が、新規スレッドを生成される際に使用すべきスレッド保持部エントリを決定する。例えばスレッド保持部４７は、エントリ０〜３が使用中で、エントリ４〜（Ｎ−１）が未使用であったとする。すると、ＸＹテーブル選択部６１の優先度エンコーダ７３が各エントリのバリッドビットＥｎＶを参照し、最も番号の若い空きエントリ４を選択し、スレッドライトエントリ番号＝“４”を出力する。また、スレッド保持部４７のエントリにはまだ空きがあるので、ＸＹテーブル選択部６１の比較器８１はスレッドフル信号をアサートしない。
【０１９７】
そして、スレッド生成部４６がクアッドマージを決定する。スレッド生成部４６は、マージバッファ内のスタンプデータと新規スタンプデータとの関係から、マージ後のスタンプをどのように構成するかについての情報をテーブル（真理値表）として保持する。そのテーブルの一部を図６４に示す。図中における各数字０〜３はバリッドなクアッドＱ０〜Ｑ３を示しており、横棒（−）はその他のクアッドがインバリッドであることを示す。また、マージ前の欄における“ＭｇＢｕｆ”は、クアッドマージを行う前のマージバッファ内のスタンプデータを示し、“ＮｅｗＳｔ”はクアッドマージを行う前の新規入力スタンプデータを示す。マージ後の欄における「残り」は、クアッドマージ後にマージバッファに残されるスタンプデータを示し。“ＭｇＢｕｆ”及び“ＮｅｗＳｔ”は新規スレッドに含まれるスタンプデータを示す。例えばＭｇＢｕｆ＝（０‐‐‐‐）、ＮｅｗＳｔ＝（０１２３）の場合は次のような意味である。マージバッファ内のスタンプはクアッドＱ０のみがバリッドであり、新規入力スタンプはクアッドＱ０〜Ｑ３の全てがバリッドである。そしてマージした結果発生されるスレッドのクアッドＱ０はマージバッファ内スタンプのクアッドＱ０であり、クアッドＱ１〜Ｑ３はそれぞれ新規入力スタンプのクアッドＱ１〜Ｑ３として形成される。そして新規入力スタンプのクアッドＱ０がマージバッファに残される。
【０１９８】
図６０の場合には、スレッド生成部４６、マージバッファ内のスタンプのクアッドバリッドＱＶ及び新規スタンプのクアッドバリッドＱＶと、真理値表とから図６５に示すようにクアッドマージを行うように決定する。すなわち、新規スレッドのクアッドＱ０〜Ｑ３が、それぞれＳｔＮ＝５のスタンプのクアッド４及びＳｔＮ＝４のスタンプのクアッド１〜３となるようにマージを行う。そして、位置がクアッド１と同じクアッド５をマージバッファ８４に残す。この情報は、第１乃至第３スレッド情報として発生される。
【０１９９】
そしてスレッド生成部４６は、第１乃至第３スレッド情報に基づいてクアッドマージを実行する。そして、ＳｔＮｕｍ０〜ＳｔＮｕｍ３、ＱＮｕｍ０〜ＱＮｕｍ３、新規スレッドのクアッドバリッドＱＶを生成する。また、マージされる２つのスタンプのスタンプ番号ＳｔＮ０、ＳｔＮ１、ＸＹタグが、スレッド生成部４６からスレッド保持部４７へ出力される。そして、これらの情報がスレッド保持部４７のエントリ４に書き込まれる。エントリ４は、オーバーラップ検出部４５のスレッド保持部選択部６３によって選択されたエントリである。この時のスレッド保持部４７の様子を図６６に示す。
【０２００】
図示するように、ＸＹテーブル選択部６１により選択されたエントリ４のバリッドビットＥｎＶがセットされる。更にエントリ４には、ＸＹタグ、ＳｔＮ０、ＳｔＮ１として、それぞれ“２”、“４”、“５”がセットされる。ＳｔＮ０、ＳｔＮ１はそれぞれマージバッファ内のスタンプ及び新規入力スタンプのスタンプ番号である。また、新規スレッドのクアッドバリッドＱＶがエントリ４に書き込まれる。新規スレッドのクアッドバリッドＱＶは４ビットの信号で、それぞれのビットがスレッドのクアッドＱ０〜Ｑ３に対応する。従って、図６５の場合にはスレッドの全てのクアッドがバリッドであるので、ＱＶとして“１１１１”がセットされる。また新規スレッドは、クアッドＱ０だけが新規入力スタンプのクアッドであるので、ＳｔＮｕｍ０〜ＳｔＮｕｍ３はそれぞれ“１”、“０”、“０”、“０”である。更に新規スレッド内の各クアッドの位置は、クアッドマージ前と同じであるので、ＱＮｕｍ０〜ＱＮｕｍ３はそれぞれ“００”、“０１”、“１０”、“１１”である。
【０２０１】
またスレッド生成部４６のディバイドビット発生器８７は、クアッドマージの情報に基づいて、新規入力スタンプ（ＳｔＮ＝５のスタンプ）の少なくとも一部がマージバッファに残されるか否かを検出する。本例であると、新規入力スタンプのクアッド５がマージバッファに残される。従って、ディバイドビットＤｉｖｉｄｅが“１”にセットされる。ディバイドビットＤｉｖｉｄｅは、スタンプ保持部４４においてＳｔＮ＝５のスタンプが保持されるエントリ４に書き込まれる。
【０２０２】
＜実行スレッド、サブパスの実行管理＞  
以上のようにしてクアッドマージが終了すると、次に実行スレッド及びサブパスの実行管理を行う（ステップＳ１６）。画像描画処理はスレッド単位で行われ、命令制御部３５はスレッドの起動、停止を管理する。また、各スレッドはサブパスという実行単位に分割されて実行される。サブパスの実行終了時には、スレッドの動作を停止し、別の実行可能なスレッドを起動することによって、タイムシェアリングにより複数のスレッドを切り替えながら実行することが出来る。またロック／ロッククリア命令によるサブパスの実行可否を判定して、実行可能なスレッドだけを起動する。
【０２０３】
命令制御部３５は、次のようにしてスレッド及びサブパスを管理する。すなわち、各ピクセルシェーダユニット３４では最大で１つのスレッドについて処理出来る。命令制御部３５は、スレッドの処理のためにスレッドを発行する。スレッドが全く発行されていなければ、スレッド保持部４７から発行可能ないずれかのスレッドが１つ選択される。イールド命令を実行した際には、そのスレッドの処理は停止され、その時点で発行可能な他のスレッドが起動される。エンド命令が実行され、且つ未取得のテクスチャロード命令が無いことが確認された場合、スレッド保持部４７のエントリのバリッドビットＥｎＶがクリアされ、スレッドはデキューされる。発行可能なスレッドがスレッド保持部４７に複数ある場合には、古いスレッドから順に発行される。
【０２０４】
スレッドは以下のようにして起動される。スレッドは、他のスレッドが実行されておらず、データキャッシュのプリロード要求が発行済みであり、テクスチャデータのロードが終了しており、同一ＸＹ座標の他スレッドがロックを取っておらず、且つ実行していないスレッドの中で、自分が最もスレッドＩＤが小さい場合に発行される。実行可能なスレッドが複数存在した場合は、最も早い時期にプリロード要求を発行したスレッドが発行される。プリロードとは、タスクを実行するために必要なデータを、ローカルメモリ２６から読み出し、描画処理部３６に転送することである。そして、起動されたスレッドのランビットがセットされる。
【０２０５】
スレッドが起動されると、描画処理部３６でそのスレッドについてのタスクが実行される。スレッドについてタスクが実行されている間、命令制御部３５はそのスレッドのステートを管理する。すなわち、ロック命令が実行された際には、スレッド保持部４７のロックビットＬｃｋをセットする。またロッククリア命令が実行された際には、スレッド保持部４７のロックビットＬｃｋをクリアする。テクスチャロード命令群を実行した際には、未取得のテクスチャロード命令数を＋１する。
【０２０６】
スレッドついてイールド命令が実行された際には、命令制御部３５はイールド命令の、次の命令のプログラムカウンタをスレッド保持部４７に保存する。そして停止したスレッドのサブパス番号を＋１する。更に停止したスレッドのプリロード要求ステートを「未要求」とし、ＰＲＥＬＤＴＩＭＥを内部カウンタにセットする。そして停止したスレッドのランビットＲｕｎをクリアする。
【０２０７】
エンド命令が実行されると、命令制御部３５はスレッドの停止処理を行う。更に次の処理を行う。エンド命令が実行されると、スレッド保持部４７のＥｎｄビットをセットしてスレッドが終了したことを記録する。また実行していた（最大２つの）スタンプに対するスタンプ保持部のディバイドビットＤｉｖｉｄｅを参照し、“１”であれば“０”にセットし、“０”ならそのスタンプの処理は終了したと認識してスタンプ保持部からデキューすると共に、外部に対してスタンプを１つ処理したことを示す信号ＡｃｋＥｍｐｔｙをアサートする。なお、同時に２つのスタンプが終了することがあるので、その場合は２回アサートする。Ｅｎｄビットがセットされており、且つ未取得のテクスチャロード命令が無いとき、スレッド保持部４７の当該エントリを無効にする。
【０２０８】
また命令制御部３５は、ロックの制御を行う。実行可能なスレッドの中には同一ＸＹ座標のスタンプの処理を行っているものがある。そこで命令制御部３５は、ロック／ロッククリア命令に対応して、同一ＸＹを有するスレッドの排他制御を行う。すなわち、ロックを取っているスレッドと同一ＸＹ座標を有するその他のスレッドは発行できなくなる。なお異なるＸＹ座標のスレッド間ではロックは機能しない。
【０２０９】
更に命令制御部３５は、プリロード命令の発行タイミングを制御する。スレッドがサブパスの実行を終了すると、そのスレッドは「休止状態」となる。休止してから指定された時間が経過すると、命令制御部３５はそのスレッドに対するデータ領域のプリフェッチをデータキャッシュに対して要求することが出来る。更にプリフェッチを要求した順番を内部に保持し、その順序が早いものについて、プリロード要求を優先的に起動する。但し、あるタスクに属する最初のスレッドの場合には、スレッドが発行された後、即座にプリロード命令を発行する。
【０２１０】
以上の命令制御部３５の処理について、命令管理部４８とスレッド保持部４７とに着目して、以下具体的に説明する。図６７のように、３つのスレッド１〜３が処理される場合を仮定する。各スレッド１〜３のスレッドＩＤはそれぞれＴｄＩｄ＝１〜３である。そしてスレッド２、３が同一ＸＹ座標である。
【０２１１】
スレッド３についてサブパス３が発行される直前のスレッド保持部４７を図６８に示す。図示するように、スレッド保持部４７のエントリ０〜３に、各スレッド１〜３が登録されている。この時点で、スレッド１〜３のサブパスＩＤはそれぞれ３、３、４である。またスレッド２について、プリロードステートが“１０（ＰＬＤＯＮ）”で、テクスチャロードカウンタＴｌＣがゼロであるので、レディビットＲｄｙが“１”にセットされている。その他のスレッド０、１は、スレッド発行可能な状態にない。
【０２１２】
この時点での命令管理部の備えるレディキューテーブルを図６９に示す。命令管理部４８では、エントリ０〜２にそれぞれスレッドエントリ番号０〜２が保持されている。その他のエントリ３〜（Ｍ−１）は未使用である。従って書き込みポインタＷｒＰｔｒはエントリ３を指している。またエントリ１、２に対応するスレッド２、３は同一ＸＹ座標であり、且つサブパスＩＤが同一である。従って、エントリ２の（スレッド３の）ＳｐＲｄｙビットはゼロであり、サブパスの発行が禁止されている。
【０２１３】
従って、スレッド２が最初に発行されて、サブパス３が実行される。スレッド２についてサブパス３が実行されている間のスレッド保持部４７を図７０に示す。図示するように、この期間にスレッド１のプリロードステートは“１０”に遷移する。すなわち、プリロードの発行を終了させる。また、テクスチャロードが完了して、テクスチャロードカウンタがゼロになる。従って、レディビットＲｄｙが“１”にセットされる。スレッド２に関しては、サブパス３をスタートさせると共に、ランビットＲｕｎが“１”にセットされ、プリロードステートが“１１（ＰＬＲＵＮ）”に遷移し、テクスチャロードカウンタＴｌＣがカウントアップを始める。サブパス３が終了してイールド命令を実行すると、スレッド２に関してレディビットＲｄｙがゼロになり、ランビットＲｕｎもゼロになる。またサブパスＩＤが＋１されて４になり、プログラムカウンタも＋１される。プリロードステートＰＬは“００（ＰＬＷＡＴ）”に遷移する。また、サブパス３の実行中にロック命令が実行され、ロックビットＬｃｋが“１”にセットされたとする。
【０２１４】
イールド命令が実行された後の命令管理部の様子を図７１に示す。図示するように、エントリ１のサブパスＩＤが３から４にセットされ、ロックビットＳｐｔＬｃｋも“１”にセットされる。また、スレッド１の処理がスレッド２よりも進んでいるため、エントリ２のＳｐＲｄｙビットが“０”から“１”に変化する。また、スレッド２とスレッド１のサブパスＩＤが同一であるので、スレッド２（エントリ１）のＳｐＲｄｙビットが“１”から“０”に変化する。
【０２１５】
スレッド２に関するサブパス３の実行が完了すると、次にスレッド１が発行される。これは図７０に示すように、エントリ０のレディビットＲｄｙが“１”であり、エントリ２のレディビットＲｄｙが“０”であるから、更にスレッド２がロックを取っているためスレッド３が発行不可とされているからである。
【０２１６】
従って、スレッド１が最初に発行されて、サブパス４が実行される。スレッド１についてサブパス４が実行されている間のスレッド保持部４７を図７２に示す。図示するように、この期間にスレッド２のプリロードステートは“００”→“０１”→“１０”に遷移する。すなわち、プリロードの発行を終了させる。また、テクスチャロードが完了して、テクスチャロードカウンタがゼロになる。従って、レディビットＲｄｙが“１”にセットされる。スレッド２に関しては、サブパス４をスタートさせると共に、ランビットＲｕｎが“１”にセットされ、プリロードステートが“１１”に遷移し、テクスチャロードカウンタＴｌＣがカウントアップを始める。サブパス４が終了してイールド命令が実行されると、スレッド２関してレディビットＲｄｙがゼロになり、ランビットＲｕｎもゼロになり、プリロードステートＰＬは“００（ＰＬＷＡＴ）”に遷移する。またサブパスＩＤが＋１されて５になり、プログラムカウンタも＋１される。
【０２１７】
イールド命令が実行された後の命令管理部の様子を図７３に示す。図示するように、エントリ０のサブパスＩＤが４から５にセットされる。
【０２１８】
スレッド１に関するサブパス４の実行が完了すると、次にスレッド２が発行される。これは図７２に示すように、エントリ１のレディビットＲｄｙが“１”であり、エントリ２のレディビットＲｄｙが“０”であるからである。これは、エントリ２のスレッド３がエントリ１と同一ＸＹ座標であり、エントリ１がロックをとっているからである。
【０２１９】
従って、スレッド２が発行されて、サブパス４が実行される。スレッド２についてサブパス４が実行されている間のスレッド保持部４７を図７４に示す。図示するように、この期間にスレッド３のプリロードステートは“１０”に遷移する。また、テクスチャロードが完了して、テクスチャロードカウンタがゼロになる。従って、レディビットＲｄｙが“１”にセットされる。スレッド２に関しては、サブパス４をスタートさせると共に、ランビットＲｕｎが“１”にセットされ、プリロードステートが“１１”に遷移し、テクスチャロードカウンタＴｌＣがカウントアップを始める。サブパス４が終了してイールド命令が実行されると、スレッド２に関してレディビットＲｄｙがゼロになり、ランビットＲｕｎもゼロになる。またサブパスＩＤが＋１されて５になり、プログラムカウンタも＋１される。プリロードステートＰＬは“００（ＰＬＷＡＴ）”に遷移する。またサブパス４の実行中にアンロック命令がアサートされて、エントリ１のロックビットＬｃｋがゼロにセットされる。
【０２２０】
イールド命令が実行された後の命令管理部の様子を図７５に示す。図示するように、エントリ１のサブパスＩＤが４から５にセットされ、ロックビットＳｐｔＬｏｃｋがゼロにセットされる。
【０２２１】
スレッド２に関するサブパス４の実行が完了すると、次にスレッド３が発行される。これは図７４に示すように、エントリ３のレディビットＲｄｙが“１”であり、エントリ０のレディビットＲｄｙが“０”であるからである。更に、エントリ２がアンロック命令を実行したためにロックビットＬｃｋが“０”となり、それと同一ＸＹ座標のエントリ３のＳｐＲｄｙが“１”であるためである。
【０２２２】
従って、スレッド３が発行されて、サブパス３が実行される。スレッド３についてサブパス３が実行されている間のスレッド保持部４７を図７６に示す。スレッド２に関しては、ランビットＲｕｎが“１”にセットされ、プリロードステートが“１１”に遷移し、テクスチャロードカウンタＴｌＣがカウントアップを始める。サブパス３が終了してイールド命令が実行されると、スレッド３に関してレディビットＲｄｙがゼロになり、ランビットＲｕｎもゼロになる。またサブパスＩＤが＋１されて４になり、プログラムカウンタも＋１される。プリロードステートＰＬは“００（ＰＬＷＡＴ）”に遷移する。またサブパス３の実行中にロック命令がアサートされて、エントリ２のロックビットＬｃｋが“１”にセットされる。
【０２２３】
イールド命令が実行された後の命令管理部の様子を図７７に示す。図示するように、エントリ２のサブパスＩＤが３から４にセットされ、ロックビットＳｐｔＬｏｃｋが“１”にセットされる。
【０２２４】
以下上記処理を全てのスレッドがエンド命令を実行するまで継続する。エンド命令が実行され、且つテクスチャロードが完了すると、スレッド保持部４７の当該エントリは空きエントリとされる。
【０２２５】
以上の処理に従って、描画処理部３６が描画処理を行い、また必要に応じてテクスチャマッピングを行う（ステップＳ１７）。テクスチャの読み出しに関して以下説明する。描画処理部３６においてテクスチャロード命令Ｔｌｄが発行されると、テクスチャユニット３３に対してテクスチャ取得の要求がなされる。この際命令制御部３５は、対応するスレッドのスレッドＩＤをテクスチャユニット３３に送付する。テクスチャユニット３３はその処理を終えると、取得したテクスチャデータをテクスチャレジスタに書き込むので、描画処理部３６はそのレジスタからテクスチャデータを取得出来る。但し取得できるタイミングは、テクスチャロード命令を発行した次のサブパスである。
【０２２６】
テクスチャユニット３３はテクスチャロード命令を受け取ると、パイプラインでテクスチャの取得を行う。テクスチャロード命令の処理がパイプラインの最後まで到達すると処理が終了し、テクスチャレジスタにデータが格納される。その後、テクスチャユニット３３は命令制御部３５に対してアクノリッジ信号を返す。テクスチャロード命令の個数はテクスチャユニット３３のパイプラインに依存し、例えば最大で６３個である。
【０２２７】
命令制御部３５は、テクスチャロード命令が発行されたとき、その発行数をカウントする。そしてテクスチャロード命令を終了するたびにカウント数をカウントダウンする。すなわちテクスチャユニット３３からアクノリッジ信号が返ってくるたびカウントダウンする。全てのテクスチャロード命令の処理を終了した（カウント数＝０）後に、同一スレッドの次のサブパスの実行が許可される。
【０２２８】
そして、描画処理部３６で描画処理されたスタンプデータは、ローカルメモリ２８−０〜２８−３のいずれかに格納されて、描画処理が完了する。
【０２２９】
上記のように、この発明の第１の実施形態に係るグラフィックプロセッサであると、下記の効果（１）乃至（６）を得ることが出来る。  
（１）入力信号を容易に同期させることが出来る。  
本実施形態に係るグラフィックプロセッサであると、受信したスタンプデータにそれぞれ固有のスタンプ番号ＳｔＮを付与している。そして、スタンプデータを受信した際、そのスタンプ番号ＳｔＮを、書き込み制御部４０のメモリ５４のエントリに格納している。更に、メモリ５４の各エントリには同期ビットＳｙｎｃが設けられ、タスクの最初のスタンプに対して同期ビットＳｙｎｃがセット（“１”）される。従って、各エントリに対応するスタンプとタスクとを容易に同期させることが出来る。すなわち、メモリ５４の同期ビットＳｙｎｃを参照することで、各スタンプがどのタスクに属するかを容易に把握出来る。より具体的には、同期ビットＳｙｎｃがセットされたエントリから、次に同期ビットＳｙｎｃがセットされたエントリの直前のエントリまでが、同一のタスクに属する。よって、新たに同期ビットＳｙｎｃがセットされたエントリ以降は、それ以前のエントリとは異なるタスクに属することが分かる。
【０２３０】
また、Ｗデータと、それ以外のデータとの同期も容易となる。書き込み制御部４０は、第２データを、それ以外のデータより一定サイクルだけ遅れて受信する。そこで、第２データは、第２データ保持部４３においてスタンプ番号ＳｔＮと同一番号のエントリに保持される。例えばＳｔＮ＝４の第２データは、第２データ保持部４３のエントリ４に保持される。従って、第２データがどのスタンプのものであるかを容易に認識できる。また第２データに関しても、メモリ５４の同期ビットＳｙｎｃを参照することで、いずれのタスクに属するのか認識できる。  
以上のように、複数の入力信号とタスクとの同期を容易に取ることが出来るため、グラフィックプロセッサの描画信頼性を向上できる。
【０２３１】
（２）描画処理に関する処理量を削減出来る。  
本実施形態に係るグラフィックプロセッサであると、２つのスタンプのクアッドバリッドを参照して、いずれかのクアッドがインバリッドである場合、これら２つのスタンプをマージしている。従って、インバリッドなクアッドに関する処理を省き、バリッドなクアッドに対してのみ描画処理行うことが出来、処理量を削減できる。その結果、グラフィックプロセッサの不可を軽減すると共に、描画速度を向上できる。
【０２３２】
（３）描画処理を効率化出来る（その１）。  
本実施形態に係るグラフィックプロセッサであると、オーバーラップ検出部４５がＸＹテーブルを備えている。そして、ＸＹテーブルに保持されるＸＹ座標値と、マージバッファ８４に保持されるスタンプのＸＹ座標値とを比較し、一致した場合、当該スタンプをそのエントリに登録している。このようにＸＹテーブルを保持し、更にエントリ番号をＸＹタグとして管理することにより、スレッド発行時の処理を簡略化出来ると共に、描画処理を効率化出来る。
【０２３３】
また、２つのスタンプが完全にマージされ、スタンプがマージバッファ８４に残らなかった場合、２つのスタンプを連続してＸＹテーブルに登録する。この様子を図７８及び図７９を用いて説明する。図７８はクアッドマージの様子を示す概念図であり、図７９はその際のスレッド生成部４６及びオーバーラップ検出部４５の処理の様子を示すフローチャートである。
【０２３４】
図７８に示すように、マージバッファにスタンプ番号ＳｔＮ＝４のスタンプが保持されている状態において、スタンプ番号ＳｔＮ＝５のスタンプが新規入力された場合をステージ１とする。ステージ１では、マージバッファのスタンプはクアッド１のみがバリッドで、新規入力スタンプは全てのクアッド２〜５がバリッドである。従って、これらのスタンプをマージすると、クアッド１、３〜５を含むスレッド（ＴｄＩＤ＝７）が生成される。そして新規入力スタンプのクアッド２がマージバッファに残される。
【０２３５】
次にマージバッファにＳｔＮ＝５のスタンプのクアッド２が保持されている状態において、ＳｔＮ＝６のスタンプが新規入力された場合をステージ２とする。ステージ２では、新規入力スタンプは３つのクアッド６〜８がバリッドである。従ってこれらのスタンプをマージすると、クアッド２、６〜８を含むスレッド（ＴｄＩＤ＝８）が生成される。ステージ２では、２つのスタンプが完全にマージされ、マージバッファにスタンプデータは残されない。
【０２３６】
以上のステージ１、２におけるスレッド生成部４６及びオーバーラップ検出部４５の処理について図７９を用いて説明する。まず第１ステージについて説明する。第１ステージは、Ａステージ、Ｂステージ、Ｃステージの３つの処理ステージを含む。まずＡステージにおいて、スレッド生成部４６がマージ検出を行う（ステップＳ２０）。これにより２つのスタンプをどのようにマージするかが決定される。またスレッド生成部４６はマージバッファのデータをオーバーラップ検出部４５に転送する（ステップＳ３０）。そしてオーバーラップ検出部４５はＸＹ座標の比較を行う（ステップＳ４０）。
【０２３７】
次にＢステージでは、スレッド生成部４６がステップＳ２０の結果に基づいてクアッドマージを行う（ステップＳ３１）。またオーバーラップ検出部４５は、ステップＳ４０の結果に基づいて、ＸＹテーブルのエントリの割り当てを行い、ＸＹタグを生成する。
【０２３８】
次にＣステージでは、スレッド生成部４６がスレッド保持部４７へクアッドマージに関する情報を転送する（ステップＳ３２）。以上でステージ１についての処理が終了する。
【０２３９】
次にステージ２に関する処理について説明する。ステージ２は、Ａ〜Ｃステージだけでなく、更にＤステージを含む。すなわち、ステージ２でもステージ１と同様に、ステップＳ２０、Ｓ３１〜Ｓ３２、Ｓ４０、Ｓ４１の処理を行う。しかしステージ２では２つのスタンプの全クアッドがマージされる。従ってオーバーラップ検出部４５は、Ｃステージにおいて新規入力スタンプに関してもＸＹ座標の比較を行う（ステップＳ４２）。そしてＤステージにおいて、新規入力スタンプに対して、ＸＹテーブルのエントリの割り当てを行う。
【０２４０】
以上のように、全てのクアッドがマージされた場合には、２つのスタンプに関して連続してハッシュ登録することで、描画処理を効率化出来る。
【０２４１】
（４）画像描画の信頼性を向上できる（その１）。  
本実施形態に係るグラフィックプロセッサでは、新規入力スタンプの一部のクアッドがマージバッファに保持された場合、スレッド生成部４６がＤｉｖｉｄｅフラグを立てる。この様子を、図８０を用いて説明する。図８０はクアッドマージの様子を示す概念図である。
【０２４２】
図７８に示すように、マージバッファにスタンプ番号ＳｔＮ＝４のスタンプが保持されている状態において、スタンプ番号ＳｔＮ＝５のスタンプが新規入力された場合をステージ１とする。ステージ１では、マージバッファのスタンプはクアッド１のみがバリッドで、新規入力スタンプは全てのクアッド２〜５がバリッドである。従って、これらのスタンプをマージすると、クアッド１、３〜５を含むスレッド（ＴｄＩＤ＝７）が生成される。そして新規入力スタンプのクアッド２がマージバッファに残される。よって、スレッド生成部４６はディバイドビットを“１”とする。
【０２４３】
次にマージバッファにＳｔＮ＝５のスタンプのクアッド２が保持されている状態において、ＳｔＮ＝６のスタンプが新規入力された場合をステージ２とする。また、ＳｔＮ＝６のスタンプが当該タスクにおける最終スタンプであったとする。ステージ２では、新規入力スタンプは全てのクアッド６〜９がバリッドである。従ってこれらのスタンプをマージすると、クアッド２、７〜９を含むスレッド（ＴｄＩＤ＝８）が生成される。そして新規入力スタンプのクアッド６がマージバッファに残される。よって、スレッド生成部４６はディバイドビットを“１”とする。
【０２４４】
次に続くステージ３では、新規入力スタンプは無いので、マージバッファに残ったクアッド６により、スレッド（ＴｄＩＤ＝９）が生成される。
【０２４５】
上記のように、ディバイドビットが“１”にセットされることにより、マージバッファにスタンプデータが残っているかどうかを容易に認識できる。そのため、特に入力スタンプが最終スタンプの場合でも、マージバッファに残されたスタンプデータを新規スレッドとして生成することが出来、クアッドマージ処理の信頼性を向上できる。
【０２４６】
（５）描画処理を効率化出来る（その２）  
本実施形態に係るグラフィックプロセッサであると、プリロード発行後のスレッド保持部４７のＰＬＣｎｔレジスタはエイジレジスタとして機能する。エイジレジスタにより、プリロード発行要求されたスレッドの順序を把握される。そして、エイジレジスタ内の順序に従ってスレッドが発行される。このように、発行可能なスレッドうち、プリロード発行要求の早いものから順番にスレッドが発行されるので、古いスレッドが停滞することを防止し、描画処理を効率化出来る。
【０２４７】
（６）描画処理を効率化出来る（その３）  
本実施形態に係るグラフィックプロセッサであると、図４７を用いて説明したように、各スレッドに対して実行される命令を複数のサブパスに分割している。そして図４８に示すように、ピクセルシェーダユニットはスレッドＩＤにかかわらず、実行可能なスレッドから順にサブパス毎に処理を行う。サブパスを実行した後にはテクスチャロードが行われるので、そのスレッドに関しては次のサブパスを即座に実行することはできない。しかし、その期間を別のスレッドのサブパスを実行しているので、無駄時間が発生することを抑制し、描画処理の効率を向上できる。
【０２４８】
また、上記のようにサブパス単位でスレッドを発行するために、プリロードステートが各種のステートを持ち、スレッド保持部４７がランビットＲｕｎ及びレディビットＲｄｙを備えている。そして、これらの条件が揃った場合にのみ、スレッドが発行される。また命令管理部４８は、新しいスレッドが、同一ＸＹ座標を有する古いスレッドを追い越さないように、スレッド発行順序を制御している。これにより、画像描画信頼性を向上できる。
【０２４９】
更に命令制御部３５は、ロックビットをセットすることにより、必要に応じて指定するスレッドの発行を強制的に禁止することも出来る。
【０２５０】
また命令制御部３５は、描画処理部３６によりテクスチャロード命令が発行されると、テクスチャユニット３３はテクスチャの取得を開始する。そしてテクスチャユニット３３は、テクスチャの取得を終了すると、命令制御部３５に対してアクノリッジ信号を返す。命令制御部３５は、テクスチャロード命令が発行された際、テクスチャユニット３３に対して対応するスレッドのスレッドＩＤを送付する。従って、テクスチャユニット３３はどのスレッドに関してアクノリッジ信号を返すべきかを把握することが出来る。
【０２５１】
次に、この発明の第２の実施形態に係るグラフィックプロセッサについて説明する。本実施形態は、上記第１の実施形態においてロックの制御に関するものである。従って、グラフィックプロセッサの構成は上記第１の実施形態と同様であるので説明は省略し、第１の実施形態と異なる点についてのみ以下説明する。
【０２５２】
本実施形態に係るグラフィックプロセッサが備える命令制御部３５は、ロック命令を強制的に無効化させる機能を備えている。すなわち、複数のスレッドが同一のサブパスの実行を待っている場合であり、且つ古いスレッドがロックを取っていない場合には、そのサブパスの実行を待っている全てのスレッドのロックが無効化される。一旦無効化されたロックは復活することなく、またＸＹ座標に関係なく無効化される。この様子を図８１に示す。
【０２５３】
図示するように、同一ＸＹ座標のスレッド２、３がサブパスの実行を待っており、次に実行されるサブパスＩＤは共に３である。この状態で、スレッド３がロックを取っていた場合には、そのロックは強制的に解除される。
【０２５４】
本実施形態に係るグラフィックプロセッサであると、上記第１の実施形態で説明した（１）乃至（６）の効果に加えて、下記（７）の効果を得ることが出来る。
【０２５５】
（７）画像描画の信頼性を向上できる（その２）。  
本実施形態に係るグラフィックプロセッサによれば、ロックを強制的に解除する機能を備えている。従って、デッドロックの発生を抑制でき、描画処理の信頼性を向上できる。この点につき図８２を用いて説明する。図８２は図８１と同一の条件で、ロックを無効化する機能を有しない場合について示している。
【０２５６】
命令制御部３５は、同一サブパスの実行を待っている複数のスレッドが存在する場合、古いスレッドだけを実行可能にする。これはスレッドの発行順序を補償するためである。しかし図８２の場合、スレッド３がロックを取っているため、同一ＸＹ座標のスレッド２は実行できない。他方、スレッド３がサブパス４を実行してしまうと、古いスレッド２のサブパス４を追い越すことになるため、スレッド３のサブパス４も実行できない。このように、実行可能なスレッドが無くなる状態（デッドロック）が生じうる。
【０２５７】
しかし本実施形態であると、スレッド３のロックを解除できる。従ってデッドロックの発生を抑制出来る。
【０２５８】
なお、上記第１乃至第２の実施形態に係るグラフィックプロセッサは、例えばゲーム機、ホームサーバー、テレビ、または携帯情報端末などに搭載することが出来る。図８３は上記第１及び第２の実施形態に係るグラフィックプロセッサを備えたデジタルテレビの備えるデジタルボードのブロック図である。デジタルボードは、画像・音声などの通信情報を制御するためのものである。図示するように、デジタルボード１０００は、フロントエンド部１１００、画像描画プロセッサシステム１２００、デジタル入力部１３００、Ａ／Ｄコンバータ１４００、１８００、ゴーストリダクション部１５００、三次元ＹＣ分離部１６００、カラーデコーダ１７００、ＬＡＮ処理ＬＳＩ１９００、ＬＡＮ端子２０００、ブリッジメディアコントローラ２１００、カードスロット２２００、フラッシュメモリ２３００、及び大容量メモリ（例えばＤＲＡＭ）２４００を備えている。フロントエンド部１１００は、デジタルチューナーモジュール１１１０、１１２０、ＯＦＤＭ（Orthogonal Frequency Division Multiplex）復調部１１３０、ＱＰＳＫ（Quadrature Phase Shift Keying）復調部１１４０を備えている。
【０２５９】
画像描画プロセッサシステム１２００は、送受信回路１２１０、ＭＰＥＧ２デコーダ１２２０、グラフィックエンジン１２３０、デジタルフォーマットコンバータ１２４０、及びプロセッサ１２５０を備えている。そして、例えばグラフィックエンジン１２３０及びプロセッサ１２５０が、上記第１乃至第２の実施形態で説明したグラフィックプロセッサに対応する。
【０２６０】
上記構成において、地上デジタル放送波、ＢＳデジタル放送波、及び１１０°ＣＳデジタル放送波は、フロントエンド部１１００で復調される。また地上アナログ放送波及びＤＶＤ／ＶＴＲ信号は、３次元ＹＣ分離部１６００及びカラーデコーダ１７００でデコードされる。これらの信号は、画像描画プロセッサシステム１２００に入力され、送受信回路１２１０で、映像・音声・データに分離される。そして、映像に関しては、ＭＰＥＧ２デコーダ１２２０を介してグラフィックエンジン１２３０に映像情報が入力される。するとグラフィックエンジン１２３０は、上記実施形態で説明したようにして図形を描画する。
【０２６１】
図８４は、上記第１及び第２の実施形態に係るグラフィックプロセッサを備えた録画再生機器のブロック図である。図示するように、録画再生機器３０００はヘッドアンプ３１００、モータードライバ３２００、メモリ３３００、画像情報制御回路３４００、ユーザＩ／Ｆ用ＣＰＵ３５００、フラッシュメモリ３６００、ディスプレイ３７００、ビデオ出力部３８００、及びオーディオ出力部３９００を備えている。
【０２６２】
画像情報制御回路３４００は、メモリインターフェース３４１０、デジタル信号プロセッサ３４２０、プロセッサ３４３０、映像処理用プロセッサ３４４０、及びオーディオ処理用プロセッサ３４５０を備えている。そして、例えば映像処理用プロセッサ３４４０及びデジタル信号プロセッサ３４２０が、上記第１及び第２の実施形態で説明したグラフィックプロセッサに対応する。
【０２６３】
上記構成において、ヘッドアンプ３１００で読み出された映像データが画像情報制御回路３４００に入力される。そして、デジタル信号処理プロセッサ３４２０から映像情報用プロセッサに図形情報が入力される。すると映像情報用プロセッサ３４５０は、上記実施形態で説明したようにして図形を描画する。
【０２６４】
なお、本願発明は上記実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。更に、上記実施形態には種々の段階の発明が含まれており、開示される複数の構成要件における適宜な組み合わせにより種々の発明が抽出されうる。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、発明が解決しようとする課題の欄で述べた課題が解決でき、発明の効果の欄で述べられている効果が得られる場合には、この構成要件が削除された構成が発明として抽出されうる。
【図面の簡単な説明】
【０２６５】
【図１】この発明の第１の実施形態に係るグラフィックプロセッサのブロック図。
【図２】この発明の第１の実施形態に係るグラフィックプロセッサにおけるフレームバッファの概念図。
【図３】この発明の第１の実施形態に係るグラフィックプロセッサにおけるフレームバッファの概念図。
【図４】この発明の第１の実施形態に係るグラフィックプロセッサにおけるフレームバッファの概念図。
【図５】この発明の第１の実施形態に係るグラフィックプロセッサにおけるフレームバッファの概念図。
【図６】この発明の第１の実施形態に係るグラフィックプロセッサにおけるフレームバッファの概念図。
【図７】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令制御部のブロック図。
【図８】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、受信されるスタンプデータ信号のタイミングチャート。
【図９】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、受信されるスタンプデータ信号のタイミングチャート。
【図１０】この発明の第１の実施形態に係るグラフィックプロセッサの備える書き込み制御部のブロック図。
【図１１】この発明の第１の実施形態に係るグラフィックプロセッサの備える書き込み制御部の受信する信号のタイミングチャート。
【図１２】この発明の第１の実施形態に係るグラフィックプロセッサの備える書き込み制御部の有するメモリのメモリ空間の概念図。
【図１３】この発明の第１の実施形態に係るグラフィックプロセッサの行うクアッドマージの概念図。
【図１４】この発明の第１の実施形態に係るグラフィックプロセッサの備えるオーバーラップ検出部の備えるＸＹテーブルの概念図。
【図１５】この発明の第１の実施形態に係るグラフィックプロセッサの備えるオーバーラップ検出部のブロック図。
【図１６】この発明の第１の実施形態に係るグラフィックプロセッサの備えるオーバーラップ検出部の有するエントリ部のブロック図。
【図１７】この発明の第１の実施形態に係るグラフィックプロセッサの備えるオーバーラップ検出部の送受信信号のタイミングチャート。
【図１８】この発明の第１の実施形態に係るグラフィックプロセッサの備えるオーバーラップ検出部の有するＸＹテーブル選択部のブロック図。
【図１９】この発明の第１の実施形態に係るグラフィックプロセッサの備えるオーバーラップ検出部の有するエントリ割り当て部のブロック図。
【図２０】この発明の第１の実施形態に係るグラフィックプロセッサによるクアッドマージの様子を示す概念図。
【図２１】この発明の第１の実施形態に係るグラフィックプロセッサによるクアッドマージの様子を示す概念図。
【図２２】この発明の第１の実施形態に係るグラフィックプロセッサによるクアッドマージの様子を示す概念図。
【図２３】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド生成部のブロック図。
【図２４】この発明の第１の実施形態に係るグラフィックプロセッサによるクアッドマージの様子を示す概念図。
【図２５】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部が有するＸＹテーブルの概念図。
【図２６】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部のブロック図。
【図２７】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するレジスタのブロック図。
【図２８】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するプリロードブロックのブロック図。
【図２９】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するバリッドアップデートロジックのブロック図。
【図３０】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するプリロードステートの状態遷移図。
【図３１】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するプリロードカウンタの状態遷移図。
【図３２】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するプリロードカウンタのアップデートロジックのブロック図。
【図３３】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するロックアップデートロジックのブロック図。
【図３４】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するテクスチャロードカウンタのアップデートロジックのブロック図。
【図３５】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するサブパスＩＤアップデートロジックのブロック図。
【図３６】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するプログラムカウンタアップデートロジックのブロック図。
【図３７】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するレディアップデートロジックのブロック図。
【図３８】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部のウェイクアップ時の状態遷移図。
【図３９】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するランアップデートロジックのブロック図。
【図４０】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するスレッド発行制御部の回路図。
【図４１】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するスレッド発行制御部の回路図。
【図４２】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するエイジレジスタの概念図。
【図４３】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有するエイジレジスタの概念図。
【図４４】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有する比較部の回路図。
【図４５】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の有する比較回路の回路図。
【図４６】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の概念図。
【図４７】この発明の第１の実施形態に係るグラフィックプロセッサにおいて実行される命令列の概念図。
【図４８】この発明の第１の実施形態に係るグラフィックプロセッサにおいて実行されるサブパスの様子を示すタイミングチャート。
【図４９】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の有するエントリ回路の回路図。
【図５０】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の有する読み出し回路の回路図。
【図５１】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の有する読み出し回路の回路図。
【図５２】この発明の第１の実施形態に係るグラフィックプロセッサによる描画処理を示すフローチャート。
【図５３】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、スタンプデータを示す表。
【図５４】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、スタンプデータのタイミングチャート。
【図５５】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスタンプ保持部の概念図。
【図５６】この発明の第１の実施形態に係るグラフィックプロセッサの備える第２データ保持部の概念図。
【図５７】この発明の第１の実施形態に係るグラフィックプロセッサの備える書き込み制御部のメモリの概念図。
【図５８】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、各種信号のタスクとの関係を示すタイミングチャート。
【図５９】この発明の第１の実施形態に係るグラフィックプロセッサの備える書き込み制御部のメモリの概念図。
【図６０】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、新規入力スタンプと、マージバッファ内のスタンプの様子を示す概念図。
【図６１】この発明の第１の実施形態に係るグラフィックプロセッサの備える書き込み制御部のメモリの概念図。
【図６２】この発明の第１の実施形態に係るグラフィックプロセッサの備えるＸＹテーブルの概念図。
【図６３】この発明の第１の実施形態に係るグラフィックプロセッサの備えるＸＹテーブルの概念図。
【図６４】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、クアッドマージを行う際の真理値表。
【図６５】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、新規入力スタンプ、マージバッファ内のスタンプ、及びスレッドの様子を示す概念図。
【図６６】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の概念図。
【図６７】この発明の第１の実施形態に係るグラフィックプロセッサにおいて実行されるサブパスの様子を示すタイミングチャート。
【図６８】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の概念図。
【図６９】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の概念図。
【図７０】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の概念図。
【図７１】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の概念図。
【図７２】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の概念図。
【図７３】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の概念図。
【図７４】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の概念図。
【図７５】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の概念図。
【図７６】この発明の第１の実施形態に係るグラフィックプロセッサの備えるスレッド保持部の概念図。
【図７７】この発明の第１の実施形態に係るグラフィックプロセッサの備える命令管理部の概念図。
【図７８】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、新規入力スタンプ、マージバッファ内のスタンプ、及びスレッドの様子を示す概念図。
【図７９】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、オーバーラップ検出部４５及びスレッド生成部で行われる処理のフローチャート。
【図８０】この発明の第１の実施形態に係るグラフィックプロセッサにおいて、新規入力スタンプ、マージバッファ内のスタンプ、及びスレッドの様子を示す概念図。
【図８１】この発明の第２の実施形態に係るグラフィックプロセッサにおいて実行されるサブパスの様子を示すタイミングチャート。
【図８２】グラフィックプロセッサにおいて実行されるサブパスの様子を示すタイミングチャート。
【図８３】この発明の第１、第２の実施形態に係るグラフィックプロセッサを備えたデジタルテレビの有するデジタルボードのブロック図。
【図８４】この発明の第１、第２の実施形態に係るグラフィックプロセッサを備えた録画再生機器のブロック図。
【符号の説明】
【０２６６】
２３…グラフィックプロセッサ、２４…ラスタライザ、２５−０〜２５−３…ピクセルシェーダ、２６…ローカルメモリ、３０…データ振り分け部、３１…同期回路、３３…テクスチャユニット、３４…ピクセルシェーダユニット、３５…命令制御部、３６…描画処理部、３７…データ制御部、４０…書き込み制御部、４１…コンフィギュレーションレジスタ、４２…第１データ保持部、４３…第２データ保持部、４４…スタンプ保持部、４５…オーバーラップ検出部、４６…スレッド生成部、４７…スレッド保持部、４８…命令管理部、４９…パフォーマンスモニタ、５０…第１ステートマシーン、５１…第２ステートマシーン、５２…クアッドバリッド発生器、５３−０〜５３−４…シフトレジスタ、５４、５７、５８…メモリ、６０−０〜６０−（Ｍ−１）…エントリ部、６１…ＸＹテーブル選択部、６２…エントリ割り当て部、６３…スレッド保持部選択部、８４…マージバッファ、８５…イネーブル信号発生器、８６…ＱＶ発生器、８７…ディバイドビット発生器、８８…スレッドＩＤ発生器、９４…スレッドレジスタ群、９５…プリロードブロック、９６…アップデート部、９７…スレッド発行制御部、１５１−０〜１５１−（Ｍ−１）…比較回路、１５９…エントリ回路、１７０…読み出し回路、１７１…書き込み回路
【図１】
0004718993.tif 000002
【図２】
0004718993.tif 000003
【図３】
0004718993.tif 000004
【図４】
0004718993.tif 000005
【図５】
0004718993.tif 000006
【図６】
0004718993.tif 000007
【図７】
0004718993.tif 000008
【図８】
0004718993.tif 000009
【図９】
0004718993.tif 000010
【図１０】
0004718993.tif 000011
【図１１】
0004718993.tif 000012
【図１２】
0004718993.tif 000013
【図１３】
0004718993.tif 000014
【図１４】
0004718993.tif 000015
【図１５】
0004718993.tif 000016
【図１６】
0004718993.tif 000017
【図１７】
0004718993.tif 000018
【図１８】
0004718993.tif 000019
【図１９】
0004718993.tif 000020
【図２０】
0004718993.tif 000021
【図２１】
0004718993.tif 000022
【図２２】
0004718993.tif 000023
【図２３】
0004718993.tif 000024
【図２４】
0004718993.tif 000025
【図２５】
0004718993.tif 000026
【図２６】
0004718993.tif 000027
【図２７】
0004718993.tif 000028
【図２８】
0004718993.tif 000029
【図２９】
0004718993.tif 000030
【図３０】
0004718993.tif 000031
【図３１】
0004718993.tif 000032
【図３２】
0004718993.tif 000033
【図３３】
0004718993.tif 000034
【図３４】
0004718993.tif 000035
【図３５】
0004718993.tif 000036
【図３６】
0004718993.tif 000037
【図３７】
0004718993.tif 000038
【図３８】
0004718993.tif 000039
【図３９】
0004718993.tif 000040
【図４０】
0004718993.tif 000041
【図４１】
0004718993.tif 000042
【図４２】
0004718993.tif 000043
【図４３】
0004718993.tif 000044
【図４４】
0004718993.tif 000045
【図４５】
0004718993.tif 000046
【図４６】
0004718993.tif 000047
【図４７】
0004718993.tif 000048
【図４８】
0004718993.tif 000049
【図４９】
0004718993.tif 000050
【図５０】
0004718993.tif 000051
【図５１】
0004718993.tif 000052
【図５２】
0004718993.tif 000053
【図５３】
0004718993.tif 000054
【図５４】
0004718993.tif 000055
【図５５】
0004718993.tif 000056
【図５６】
0004718993.tif 000057
【図５７】
0004718993.tif 000058
【図５８】
0004718993.tif 000059
【図５９】
0004718993.tif 000060
【図６０】
0004718993.tif 000061
【図６１】
0004718993.tif 000062
【図６２】
0004718993.tif 000063
【図６３】
0004718993.tif 000064
【図６４】
0004718993.tif 000065
【図６５】
0004718993.tif 000066
【図６６】
0004718993.tif 000067
【図６７】
0004718993.tif 000068
【図６８】
0004718993.tif 000069
【図６９】
0004718993.tif 000070
【図７０】
0004718993.tif 000071
【図７１】
0004718993.tif 000072
【図７２】
0004718993.tif 000073
【図７３】
0004718993.tif 000074
【図７４】
0004718993.tif 000075
【図７５】
0004718993.tif 000076
【図７６】
0004718993.tif 000077
【図７７】
0004718993.tif 000078
【図７８】
0004718993.tif 000079
【図７９】
0004718993.tif 000080
【図８０】
0004718993.tif 000081
【図８１】
0004718993.tif 000082
【図８２】
0004718993.tif 000083
【図８３】
0004718993.tif 000084
【図８４】
0004718993.tif 000085