以下、この発明の実施形態を図面を参照して説明する。この説明に際し、全図にわたり、共通する部分には共通する参照符号を付す。
この発明の第1の実施形態に係るグラフィックプロセッサについて、図1を用いて説明する。図1は、本実施形態に係るグラフィックプロセッサのブロック図である。
図示するように、グラフィックプロセッサ23はラスタライザ(rasterizer)24、複数のピクセルシェーダ(pixel shader)25−0〜25−3、及びローカルメモリ26を備えている。なお、本実施形態ではピクセルシェーダ25の数は4個であるがこれは一例に過ぎず、8個、16個、32個等でも良く、その数は限定されるものではない。ラスタライザ24は、入力された図形情報に従ってピクセル(pixel)を生成する。ピクセルとは、所定の図形を描画する際に取り扱われる最小単位の領域のことであり、ピクセルの集合によって図形が描画される。生成されたピクセルはピクセルシェーダ25−0〜25−3へ投入される。
ピクセルシェーダ25−0〜25−3は、ラスタライザ24から投入されたピクセルにつき演算処理を行い、ローカルメモリ(後述する)上に画像データを生成する。ピクセルシェーダ25−0〜25−3の各々は、データ振り分け部30、同期回路31、テクスチャユニット(texture unit)33、及び複数のピクセルシェーダユニット34を備えている。
データ振り分け部30はラスタライザ24からデータを受け取る。そして、受け取ったデータをピクセルシェーダ25−0〜25−3へ割り振る。
同期回路31は、ピクセルシェーダユニット34の動作の同期化を行う。
テクスチャユニット33はテクスチャ処理を行い、ピクセルシェーダユニット34で処理されたピクセルにテクスチャデータを貼り付ける。
ピクセルシェーダユニット34はシェーダエンジン部であり、ピクセルデータに対してシェーダプログラムを実行する。そしてピクセルシェーダユニット34のそれぞれはSIMD(Single Instruction Multiple Data)動作を行って、4個のピクセルを同時に処理する。ピクセルシェーダユニット34はそれぞれ、命令制御部35、描画処理部36、及びデータ制御部37を備えている。
命令制御部35については後に詳細に説明する。描画処理部36はピクセルの演算処理を行う。データ制御部37は、ローカルメモリ26からのデータの読み出しを制御する。
ローカルメモリ26は例えばeDRAM(embedded DRAM)であり、ピクセルシェーダ25−0〜24−3で描画されたピクセルデータを記憶する。
次に、本実施形態に係るグラフィックプロセッサにおける図形描画の概念について説明する。図2は、図形を描画すべき全体の空間を示す概念図である。なお、図2に示す描画領域は、ローカルメモリ内においてピクセルデータを保持するメモリ空間(以下、フレームバッファと呼ぶ)に相当する。
図示するように、フレームバッファは、マトリクス状に配置された((m+1)×(l+1))個のブロックBLK0〜BLKnを含んでいる。図2ではl=29、m=19、n=599の場合について示しているが、この数は一例に過ぎず、限定されるものではない。ピクセルシェーダ25−0〜25−3は、ブロックBLK0〜BLK599順にピクセルを生成する。各ブロックBLK0〜BLK599はそれぞれ、マトリクス状に配置された32個のスタンプ(stamp)を含んで形成されている。図3は、図2に示された各ブロックが複数のスタンプを有する様子を示している。
各スタンプは、同一のピクセルシェーダによって描画される複数のピクセルの集合体である。本実施形態では1個のスタンプは(4×4)=16個のピクセルを含んでいるが、この数は例えば1個、4個、…等でも良く、限定されるものではない。図3において、各スタンプに記載された番号(=0〜31)を以下スタンプID(StID)と呼び、各ピクセルに記載された番号(=0〜15)を以下ピクセルID(PixID)と呼ぶ。また、各スタンプにおける(2×2)個のピクセルの集合をクアッド(quad)と呼ぶことにする。すなわち、1個のスタンプには(2×2)個のクアッドが含まれる。これらの4つのクアッドを、以下クアッドQ0〜Q3と呼ぶことにする。ブロックBLK0〜BLK599の各々には、上記スタンプが(8×4)=32個含まれている。従って、全体として(640×480)個のピクセルによって、図形を描画すべき空間が形成されている。
次に、上記フレームバッファに描画される図形に関して説明する。まず図形を描画するにあたって、ラスタライザ24に図形情報が入力される。図形情報は、例えば図形の頂点座標や色情報などである。ここで、例として三角形を描画する場合について説明する。ラスタライザ24に入力された三角形は、描画空間において図4に示すような位置を占めるとする。すなわち、三角形の3つの頂点座標が、ブロックBLK1におけるStID=7のスタンプ、ブロックBLK40におけるStID=19のスタンプ、及びブロックBLK42におけるStID=0のスタンプに位置すると仮定する。ラスタライザ55は、描画すべき三角形が占める位置に対応するスタンプを生成する。この様子を示しているのが図5である。生成されたスタンプデータは、それぞれ予め対応付けられたピクセルシェーダ25−0〜25−3に送られる。
そしてピクセルシェーダ25−0〜25−3は、入力されたスタンプデータに基づいて、自らの担当するピクセルについて描画処理を行う。その結果、図5に示されるような三角形が、複数のピクセルによって描画される。ピクセルシェーダ25−0〜25−3によって描画されたピクセルデータは、スタンプ単位でローカルメモリに格納される。
図6は、図5におけるブロックBLK1の拡大図である。図示するようにブロックBLK1に関して、ラスタライザ24は8個のスタンプを生成する。それらのスタンプIDはそれぞれStID=7、11〜15、24、26、27である。前述の通り、ラスタライザ24で生成されたスタンプの個々には(4×4)=16個のピクセルが含まれている。しかし、例えスタンプが発行されたとしても、図形によっては全てのピクセルに対して描画処理を行う必要はない。例えば図6において、StID=15のスタンプは三角形の内部にあるので、このスタンプ内に含まれる全てのピクセルに対して描画処理を行う必要がある。しかし、例えばStID=7のスタンプにおいては、PixID=0〜8、12、13、15のピクセルは三角形の外部にあるため描画処理の必要はない。描画処理の必要なピクセルは、PixID=9〜11、14のピクセルのみである。このように、描画処理すべきであることを以下では「バリッド(valid)である」と呼び、描画不要であることを「インバリッド(invalid)である」と呼ぶことにする。
次に、各ピクセルシェーダユニット34に含まれる命令制御部35の構成について、以下詳細に説明する。図7は命令制御部35のブロック図である。図7は命令制御部35のブロック図である。図示するように命令制御部35は、書き込み制御部40、コンフィギュレーションレジスタ(configuration register)41、第1データ保持部42、第2データ保持部43、スタンプ保持部44、オーバーラップ検出部45、スレッド生成部46、スレッド保持部47、及び命令管理部48を備えている。
命令制御部35は、データ振り分け部30から複数のデータを受け取る。そのデータは図形を描画するために必要となる情報に関するデータであり、例えばXY座標、第1乃至第3データ、及びピクセルバリッド信号である。XY座標は当該スタンプのXY座標である。第3データは描画方向やポリゴンの面(face)情報である。第1データは描画すべき図形の有するパラメータの代表値を示す。第2データは図形の奥行き情報を示す。ピクセルバリッド信号は、当該ピクセルがバリッドか否かを示す情報である。これらのデータのことを、以下ではまとめて「スタンプデータ」と呼ぶことがある。
上記スタンプデータはクロック信号CLK2に同期して、命令制御部35へ入力される。そして、第2データ以外のデータは第1スタート信号に応答して命令制御部35へ入力される。図8は各データ信号のタイミングチャートである。
図8に示すように、時刻t1で第1スタート信号がアサートされると、その時刻t1から、命令制御部35は第3データ、第1データ、ピクセルバリッド信号、XY座標を受け取る。これらのスタンプデータは連続した8クロックサイクルに分割されて、命令制御部35に送られる。命令制御部35は、例えば最大16スタンプのデータを保持することが出来る。
第2データは、第1スタート信号ではなく第2スタート信号に応答して、命令制御部35へ入力される。図9はクロックCLK2、第2スタート信号、及び第2データのタイミングチャートである。図示するように、時刻t21において、第2スタート信号がアサートされると共に、第2データが受信される。なお、第2スタート信号は、対応するそれ以外のスタンプデータを転送するための第1スタート信号よりも数サイクルだけ遅れてアサートされる。従って命令制御部35は、第2データを、それ以外のスタンプデータより遅れて受信する。
次に命令制御部35の備える各ブロックについて説明する。命令制御部35は、外部からのチップセレクト、アドレス指定により与えられたデータをコンフィギュレーションレジスタ41に書き込む。コンフィギュレーションレジスタ41は例えば複数のレジスタを含み、それぞれのレジスタに信号INSTBASE、PRELDTIMEを保持する。
INSTBASEは、スタンプ(スレッド)に関して処理を開始すべき最初の命令のアドレスを示す。PRELDTIMEはプリロードタイミングを示す。すなわち、スレッドがイールド命令を実行してからプリロードを要求するまでのクロックサイクル数を指定する。なお、スレッド、スレッドID、クアッドマージ、プリロード、及びイールド命令については後に説明する。プリロードとは下記のことを言う。すなわち、ピクセルシェーダユニット34は内部にキャッシュメモリ(図示せず)を有している。そしてキャッシュメモリに読み出したデータを用いて描画処理を行う。この描画処理のために、実際に処理を行う前に、データをローカルメモリ26から読み出しておくことがある。これがプリロードである。
次に、上記命令制御部35に含まれる書き込み制御部40の構成について図10を用いて説明する。図10は書き込み制御部40のブロック図である。図示するように書き込み制御部40は、第1ステートマシーン50、第2ステートマシーン51、クアッドバリッド(quad valid: QV)発生器52、シフトレジスタ53−0〜53−4、及びメモリ54を備えている。
書き込み制御部40はデータ振り分け部30から送られる第1スタート信号、第2スタート信号、XY座標、ピクセルバリッド信号、第3データ、第2データ、及び第1データをフリップフロップF/Fにラッチする。また、上記データ信号が入力されるのと同時、または入力される以前に、タスク同期信号をF/Fにラッチする。タスク同期信号は同期回路31が発生する。
次に、第1ステートマシーン50が第1スタート信号に基づいて、第1データライトイネーブル信号及びスタンプデータライトイネーブル信号を生成する。第1データライトイネーブル信号は第1データ保持部42に対する書き込み動作をイネーブルにする信号であり、スタンプデータライトイネーブル信号はスタンプ保持部44に対する書き込み動作をイネーブルにする信号である。また、スタンプ保持部44から送られるスタンプ番号StNに基づき、第1データライトアドレス信号が生成される。スタンプ番号StNとは、スタンプに固有に与えられた識別番号のことである。第1データライトアドレス信号は、第1データ保持部42において第1データを書き込むべきアドレスを示す。
また第1ステートマシーン50は、内部にカウンタを有しており、信号第1スタート信号がアサートされるとカウンタを起動する。カウンタは、第1スタート信号がアサートされたサイクルでゼロに初期化され、以後、クロックに同期して順次カウントアップする。そしてカウンタ値が例えば7の時、データライト終了信号をアサートする。データライト終了信号は、データの転送終了を示す信号である。データの転送が終了すると、第1ステートマシーン50は動作を停止する。
第1スタート信号がアサートされてから第1ステートマシーン50が動作停止するまでの8サイクルの期間、第1データは第1データ保持部42に毎サイクル書き込まれる。第1データを第1データ保持部42に書き込む際の動作を図11に示す。図11は各種信号のタイミングチャートである。
図示するように、時刻t0で信号第1スタート信号がアサートされると同時に第1データが入力され、また第1ステートマシーン50のカウンタがカウントを開始する(図11における“カウント数”)。第1データは8サイクルに渡って連続して入力される。第1スタート信号がアサートされた1サイクル後の時刻t2において、第1ステートマシーン50は第1データライトイネーブル信号をアサートして、第1データ保持部42への書き込みを許可する。同時に時刻t2から8サイクルに渡って、第1データ保持部42において第1データを書き込むべきアドレス(第1データライトアドレス信号)を生成する。従って、時刻t2からの8サイクルの期間、第1データが、第1データ保持部42における第1データライトアドレス信号の示すアドレスに順次書き込まれる。そしてカウンタのカウンタ値が7に達すると(時刻t8)、第1ステートマシーン50はデータライト終了信号をアサートして、データの転送を終了する。また、時刻t8の次のサイクルで、スタンプデータライトイネーブル信号がアサートされる。これにより、スタンプ保持部44へのデータの書き込みが許可される。またタスク同期信号がアサートされる。
更に、クアッドバリッド発生器52は、ピクセルバリッド信号を基にしてクアッドバリッドQVを生成する。クアッドバリッドとはクアッドがバリッドであるか否か、すなわちクアッド内に含まれる4個のピクセルのうちいずれか1個でもバリッドであるか否かを示す。
また、シフトレジスタ53−0〜53−2は、それぞれXY座標、第3データ、ピクセルバリッド信号を受信する。シフトレジスタ53−0〜53−4はそれぞれ受信した信号を毎サイクル、受信したビット数だけ左シフトしながら保持する。従って、第1ステートマシーン50のカウンタ値が7に達したとき、換言すればデータライト終了信号がアサートされた時に、当該スタンプにおける全ビットがシフトレジスタ53−0〜53−5内に揃うことになる。そして次のサイクルにて、これらのデータがスタンプ保持部44に書き込まれる。またこの際、スタンプ番号StNがメモリ54に書き込まれ、且つメモリ54において対応するエントリのバリッドビットEnVがセットされる(この点については後述する)。
第1スタート信号がアサートされてから所定のクロックサイクルの後、第2スタート信号がアサートされ、第2データが書き込み制御部40に入力される。第2スタート信号がアサートされることにより、書き込み制御部は第2データの送付が開始されたことを認識し、第2ステートマシーン51は動作を開始する。第2データが送付されている期間、シフトレジスタ53−5は受信した信号を毎サイクル、受信したビット数だけMSB(most significant bit)側へシフトさせつつ保持する。第2ステートマシーン51は、第1ステートマシーン50と同様に内部にカウンタを有している。そして第2スタート信号がアサートされるとカウントを開始する。カウンタ値が7に達すると第2データライト終了信号をアサートして、第2データの転送を終了する。
次にメモリ54について図12を用いて説明する。メモリ54は、例えばFIFO(First In First Out)方式の半導体メモリであり、N個(Nは2以上の自然数であり、8個、16個、またはそれ以上)のエントリを有している。各エントリは、バリッドビットEnV、スタンプ番号StN、第2データレディビットRdy2、及び同期ビットSyncを保持できる。EnVは当該エントリが使用された際に書き込まれる(“1”とされる)。StNはスタンプ番号であり、当該エントリに対応するスタンプに固有に与えられた識別番号のことである。Rdy2は、第2データに関するレディビットであり、当該エントリに対応するスタンプの第2データが第2データ保持部43に書き込み済みか否かを示す。Syncは、タスクと各データとの同期を取るためのビットであり、当該エントリに対応するスタンプがタスク内における最初のスタンプか否かを示す。
スタンプデータライトイネーブル信号(図11参照)がアサートされて、スタンプデータがスタンプ保持部44に書き込まれると、スタンプ保持部44に対応したスタンプ番号StNがメモリ54に書き込まれる。この際、メモリ54において使用されるエントリは、バリッドビットEnVがセットされておらず且つ最も古いエントリである。このエントリは、第1書き込みポインタによって指定される(図10参照)。スタンプ番号StNが書き込まれると、そのエントリのバリッドビットEnVが“1”にセットされる。すなわち使用中となる。そして第1書き込みポインタがインクリメントされる。
次に第2スタート信号がアサートされると、メモリ54のうちでRdy2がセットされていない最も古いエントリのRdy2がセット(“1”)される。このエントリは、第2書き込みポインタによって指定される(図10参照)。また、そのエントリに保持されるスタンプ番号StNが、第2データ保持部43において、当該第2データが書き込まれるエントリのエントリ番号となる。Rdy2がセットされると、第2書き込みポインタがインクリメントされる。
スレッド保持部47がフル(full)ではなく、メモリ54の読み出しポインタの示すエントリのバリッドビットEnVがセットされており、且つ第2データレディビットRdy2もセットされており、そしてスタンプ保持部のリードポートが空いている(読み出し命令が無い)ならば、スタンプ保持部44からQV、及びXY座標が読み出されてスレッド生成部46に送られ、スレッド生成部46でクアッドマージが行われる。読み出しポインタは、メモリ54において、読み出すべきデータが保持されているエントリを指定する。
ここで、クアッドマージについて図13を用いて簡単に説明する。図13はクアッドマージの概念図である。クアッドマージとは、同一XY座標の連続する2つのスタンプを1つのスタンプにマージすることである。クアッドマージを行うことで、2つのスタンプのうちバリッドなクアッドを1つのスタンプに合成出来、一度に処理出来る。従って、描画処理すべきデータ量を圧縮出来る。
図13に示すように、1つのスタンプに含まれる4つのクアッドをそれぞれクアッドQ0〜Q3と呼ぶことにする。まず始めにクアッドQ0、Q2がバリッドで且つクアッドQ1、Q3がインバリッドなスタンプ1が命令制御部に入力され、引き続きクアッドQ1、Q2がバリッドで且つクアッドQ0、Q3がインバリッドなスタンプ2が入力された場合を考える。この場合、2つのスタンプ1、2をマージすることにより、スタンプ1のクアッドQ0、Q2と、スタンプ2のクアッドQ1、Q2とを含む新規なスタンプを生成する。この新規なスタンプを、クアッドマージ前のスタンプと区別するために以後スレッド(thread)と呼ぶことにする。
書き込み制御部40の説明に戻る。書き込み制御部40は、同期回路31の発生するタスク同期信号をラッチする。タスク同期信号がアサートされると、メモリ54のうちでバリッドビットEnVがセットされておらず、且つそれらのうちで最も先頭(バリッドビットがセットされた最後のスタンプに対応するエントリの次)のエントリの同期ビットSyncをセットする。図11は、タスク同期信号が最も早いタイミングでアサートされた場合を示しており、前のタスクの最後のスタンプをメモリ54に書き込むタイミング(スタンプデータライトイネーブル信号がアサートされるタイミング)の次のサイクルで同期ビットSyncがセットされる。メモリ54の第1、第2書き込みポインタは、ちょうど同期ビットSyncを書き込むべき位置を指している。同期ビットSyncの書き込みでは第1、第2書き込みポインタはインクリメントされない。よって、次のタスクの最初のスタンプは、同期ビットSyncがセットされたエントリに書き込まれる。
リセット直後(例えば電源投入直後など)は、読み出しポインタはゼロに初期化され、エントリ0の同期ビットSyncが1にされる。タスクの処理開始を示すタスク実行命令がアサートされると、読み出しポインタが示すエントリの同期ビットSyncがクリアされる。よって、読み出しポインタが示すエントリの同期ビットSyncがクリアされていれば、当該エントリに対応するスタンプは既に開始されたタスクに属するものである。従って、この場合にはクアッドマージの為にスタンプ保持部からのデータ読み出しが要求される。逆に読み出しポインが示すエントリの同期ビットSyncが1であれば、そのエントリのスタンプは次のタスクのものであり、且つそのタスクに対するタスク実行命令がアサートされていないことを意味する。
また書き込み制御部は、タスクの最初のスタンプであることを意味する新規タスク信号を生成する。これは、タスク実行命令がアサートされて、最初のスタンプがメモリ54からスレッド生成部46に出力される際にアサートされる。
次に第1データ保持部42について説明する。第1データ保持部42は、複数のエントリを有する半導体メモリである。第1データライトイネーブル信号がアサートされると、第1データ保持部42におけるエントリのうち、第1データライトアドレス信号の示すエントリに第1データが書き込まれる。これら3つの信号は書き込み制御部40から送られる。
また、第1データリードイネーブル信号がアサートされると、第1データ保持部42は描画処理部36から第1データリードアドレス信号を受信する。第1データリードアドレス信号は、読み出すべきスタンプのアドレスを示す。そして、第1データ保持部42におけるエントリのうち、第1データリードアドレス信号により示されるエントリから、第1データが読み出される。
次に第2データ保持部43について説明する。第2データ保持部43は、複数のエントリを有する半導体メモリである。書き込み時において、データ振り分け部30から1サイクルあたり例えば64ビットの第2データが送付されてくる。そして、書き込み制御部40が第2データを複数サイクル保持して第2データを組み立てた後、書き込み制御部40が第2データライト終了信号をアサートする。これにより、第2データ保持部43において、第2スタンプ番号StNWが示すアドレスに第2データが書き込まれる。なお、第2スタンプ番号StNWは、第2データ保持部43において、当該スタンプに対して付与されたスタンプ番号StNと同一である。
データの読み出し時は、描画処理部36が第2データリードイネーブル信号をアサートすると、第2データ保持部43は描画処理部36からスタンプ番号StNを受信する。そして、スタンプ番号StNにより指定されるエントリ内のデータが読み出される。
次にスタンプ保持部44について説明する。スタンプ保持部44は、複数のエントリを有する半導体メモリを含む。書き込み制御部40が信号スタンプデータライトイネーブル信号をアサートすると、スタンプ保持部44において、スタンプ番号StNが示すアドレスにスタンプデータが書き込まれる。スタンプデータは書き込み制御部40から送られ、座標、QV、第3データ、及びピクセルバリッド信号を含む。またスタンプ保持部44は、スレッド生成部46からのデータ読み出し要求(クアッドマージのため)と、描画処理部36からのデータ読み出し要求(レジスタリードのため)とを調停して、スタンプデータを外部へ出力する。描画処理部36からの読み出し要求に対応する際には2個のスタンプのデータが読み出される。以下、それぞれのスタンプのスタンプ番号を旧スタンプ番号StN0、新規スタンプ番号StN1と呼ぶことにする。クアッドマージされる2つスタンプのうち、StN0は古い方のスタンプ、StN1は新しい方のスタンプを意味する。しかし、クアッドマージされていないスレッドの場合、StN1に対応するスタンプデータは任意の値である(通常は、1つ前に生成されたスレッドのStN0に対応するデータである)。この場合、読み出されたStN1のデータは不要なデータであり、命令制御部35によって参照されることは無い。
次にオーバーラップ検出部45について説明する。オーバーラップ検出部45はXYテーブルを備える。図14はXYテーブルの概念図である。図示するようにXYテーブルはM個(Mは2以上の自然数)のエントリを有し、それぞれのエントリにバリッドビットEnV、XY座標、及びスタンプ番号StNが保持される。
XYテーブルは、全てのスタンプのXY座標を保持する。そして、1つのXY座標につき1つのエントリがアサインされ、有効なエントリに対してはエントリバリッドEnVがセットされる。StNフィールドは、各ビットが対応するXY座標と同一のXY座標を有するスタンプのスタンプ番号に対応する。例えばStN=5のスタンプのXY座標が“B”であったとすると、エントリ1のXY座標フィールドには“B”がセットされ、且つStNフィールドの5番目のビットに“1”がセットされる。別の例としては、スタンプ保持部に存在する全16スタンプのXY座標が全て“A”であったとすると、エントリ0のXY座標フィールドに“A”がセットされ、そのStNフィールドは全ビットが“1”、すなわちStN=0xFFFFとされる。
オーバーラップ検出部45は、スレッド生成部46のマージバッファ内にクアッドが存在し且つ新規スタンプがスレッド生成部46に入力された際に動作を開始する。スレッド生成部46の構成は後述する。そして、マージバッファ内のクアッド、すなわち前に入力されたスタンプが含むバリッドなクアッドと新規スタンプとがマージされる。この際、全てのクアッドがマージされなかった場合、すなわちいずれかのクアッドがマージバッファに残った場合には、オーバーラップ検出部45は前のスタンプ(マージバッファ内に存在していたスタンプ)に対して動作し、XYタグを出力する。他方、全てのクアッドがマージされた場合、すなわちスタンプがマージバッファに残らなかった場合には、オーバーラップ検出部45は上記動作に加えて新規スタンプに対しても動作し、XY座標タグのエントリにStNを登録する。換言すれば、この場合には2つのスタンプを連続して処理する。
図15はオーバーラップ検出部45のブロック図である。図示するようにオーバーラップ検出部45は、M個のエントリ部60−0〜60−(M−1)、XYテーブル選択部61、及びエントリ割り当て部62を備えている。
XYテーブル選択部61はXYテーブルの空きエントリを探す。XYテーブルにおけるM個のエントリはエントリ部60−0〜60−(M−1)にそれぞれ対応している。そしてエントリ部60−0〜60−(M−1)は、各々が保持するXY座標と、マージバッファに保持されるスタンプのXY座標とを比較する。
エントリ割り当て部62は、XY座標比較結果に基づいてXYテーブルのいずれかのエントリをアロケート(allocate)する。マージバッファにクアッドがあり且つ新規スタンプの全てのクアッドがマージされた時に、オーバーラップ検出部45はXYテーブルにおいて新規スタンプに対応するStNフィールドをセットする。
次に、オーバーラップ検出部45に含まれる各回路ブロックの構成について以下説明する。図16はエントリ部60−0〜60−(M−1)のブロック図である。図示するように、エントリ部60−0〜60−(M−1)の各々はNANDゲート64、比較器65、ANDゲート66、67−0〜67−(M−1)、68−0〜68−(M−1)、ORゲート69、70−0〜70−(M−1)、71、インバータ72−0〜72−(M−1)、及びデコーダ73を備えている。
比較器65は、マージバッファに保持されているXY座標と、当該エントリに保持されるXY座標とを比較する。そして両者が等しければ“1”を、そうでなければ“0”を出力する。NANDゲート64は、QMステージにおけるNANDゲート64の出力と、ORゲート71の出力(EnV:Entry Valid)とのNAND演算を行う。
ANDゲート66は、比較器65の出力と、NANDゲート64の出力とのAND演算を行う。そして、ANDゲート66におけるAND演算結果が、XY座標が同一か否かを示すXY比較結果信号となる。
ORゲート69は、ANDゲート66の出力とXY不一致信号とのOR演算を行う。XY不一致信号は、XY座標が不一致だった場合にアサートされる信号である。
デコーダ73は、スレッド生成部46から送られるスタンプ番号StNをデコードする。ANDゲート67−0〜67−(M−1)の各々は、デコーダ73でデコードして得られたMビットの信号の各ビットと、ORゲート69の出力とのAND演算を行う。ORゲート69−0〜69−(M−1)の各々は、それぞれANDゲート67−0〜67−(M−1)の出力と、XYテーブルにおけるStNフィールドのデータの各ビットとのOR演算を行う。ANDゲート68−0〜68−(M−1)の各々は、それぞれORゲート70−0〜70−(M−1)の出力と、インバータ72−0〜72−Fの出力とのAND演算を行う。インバータ72−0〜72−(M−1)の各々は、スタンプ保持部44の各エントリ0〜(M−1)のデキュー(dequeue)をイネーブルにするためのM個のスタンプ保持部デキュー信号をそれぞれ反転させる。ORゲート71は、フリップフロップでラッチされたANDゲート68−0〜68−(M−1)の出力のOR演算を行う。
上記構成において、ORゲート71の演算結果がXYテーブルのエントリバリッド、ANDゲート68−0〜68−(M−1)の出力をラッチするF/FがStNフィールド、XY座標をラッチするF/FがXYフィールドとなる。次に、XYテーブルへのXY座標の登録方法について図17を用いて説明する。図17は各種信号のタイミングチャートである。図示するように、時刻t62、t64、及びt68に、スタンプ番号StN0=0、1、2のスタンプがスレッド生成部46から入力される場合を考える。なお、これらのスタンプはXY座標が同一(“A”)であったとする。
まず時刻t62においてStN0が入力される。そして、マージバッファのスタンプのXY座標と、自らのXYフィールドとを比較する。
上記比較の結果、両者は一致しなかったとすると、XY比較結果信号はネゲートされたままである。そして、XYエントリ割り当て信号がアサートされることによって新規エントリ0がアサインされ、そのエントリにXY座標(“A”)及びStN(“0x8000”)がセットされる。つまり、StNのビット0がセットされる。そしてXYタグは新たにアサインされた新規エントリのエントリ番号となり、その内容はXY座標=“A”である。また、XYテーブルにおいて新規に割り当てられたエントリのバリッドビットEnVが“1”にセットされる。従って、次に使用すべきXYテーブルエントリが“0”から“1”に変化する。すなわち、以降に入力される、異なるXY座標を有するスタンプは、エントリ1に保持される。
次に時刻t64で次のStN0が入力される。このスタンプは時刻t62で入力されたスタンプと同一XY座標であるので比較器65の出力が反転し、XY比較結果信号がアサートされる。従って、XY割り当て信号はアサートされず、新規エントリはアサインされない。そして直前に入力されたStN0が登録されているエントリ0に新たなStN0(“0xC000”)がセットされる。これは、StN0=1であり、そのStN0のビット1がセットされるためである。時刻t69でStN0=2が入力された場合も同様である。
次にXYテーブルからのデータの抹消方法について説明する。スタンプ保持部44がデキューされた際、スタンプ保持部デキュー信号に対応するStNフィールドのビットは、そのサイクルの終わりにクリアされる。そして、StNフィールドが全てクリアされているエントリのバリッドビットEnVが、その次のサイクルでクリアされる。スタンプ保持部デキュー信号は任意のタイミングでアサートされる。
図18はXYテーブル選択部61のブロック図である。図示するように、XYテーブル選択部61は、優先度エンコーダ73及びマルチプレクサ74を備えている。優先度エンコーダ73は、XYテーブルのエントリバリッド(バリッドビット)EnVをエンコードして、XYテーブル内の空きエントリを探す。そして空きエントリ中において、次に使用すべきエントリを決定して、次に使用すべきXYテーブルエントリを出力する。
マルチプレクサ74は、XYテーブルの各エントリに保持されるXY座標を参照する。そして、スレッド保持部から与えられるプリロード用XYタグに基づいて、プリロード用XY座標を出力する。
図19は、エントリ割り当て部62のブロック図である。図示するように、エントリ割り当て部62はORゲート75−0、75−1、NORゲート76、ANDゲート77−0〜77−(M−1)、及びデコード回路78を備えている。エントリ割り当て部62は、各エントリ部60−0〜60−(M−1)におけるXY座標の比較結果を監視する。そしていずれのエントリ部60−6〜60−(M−1)でもXY座標の比較結果が一致しなかった場合、XYテーブル選択部61で発見した空きエントリを、書き込み対象エントリとして選択する。
すなわち、ORゲート75は各エントリにおけるXY比較結果信号のNOR演算を行う。デコード回路78は、次に使用すべきXYテーブルエントリをデコードする。ANDゲート77−0〜77−(M−1)は、デコード回路78で得たデコード結果と、NORゲート75の出力とのAND演算を行う。そして、ANDゲート77−0〜77−(M−1)の出力が、それぞれXYエントリ割り当て信号となる。
各エントリにおけるXY比較結果信号の全てが“Low”(不一致)であると、NORゲート75の出力が“High”となる。そして、デコード回路78は次に使用すべきXYテーブルエントリに応じて、Mビットの出力のいずれかのビットを“High”にする。従って、ANDゲート77−0〜77−(M−1)のうち、“High”とされたビットに対応するもののXYエントリ割り当て信号が“High”となり、エントリ部60−0〜60−(M−1)のうちの該当するものに対してアロケートが要求される。
次にスレッド生成部46について説明する。スレッド生成部46はまず、スレッド生成部46に入力された最新のクアッドバリッドと、その直前に入力されマージバッファに保持されるクアッドバリッドとに基づいて、クアッドマージの可否をクアッド毎に判断する。そしてクアッドマージの可否を、第1乃至第3スレッド情報として生成する。
第1乃至第3スレッド情報について、図20乃至図22を用いて説明する。図20乃至図22は、クアッドマージを行う際の様子を示す概念図である。
まず第1スレッド情報について図20を用いて説明する。第1スレッド情報は、マージバッファ内のクアッドを追い出して、追い出したクアッドを新規スレッドに含めるか否かを示している。そして、第1スレッド情報はそれぞれが4ビットの信号を4つ含んでいる。4つの信号はそれぞれ、マージバッファ内の各クアッドに対応しており、各信号の各ビットが新規スレッド内の4つのクアッドのそれぞれに対応している。例えば、マージバッファ内のクアッドQ0の第1スレッド情報の各ビットは、マージバッファ内のクアッドQ0を、新規スレッドのクアッドQ0〜Q3のいずれかとすることを示している。従って、第1スレッド情報=(1000)だとすると、マージバッファ内のクアッドQ0を新規スレッドのクアッドQ0とすることを意味する。また第1スレッド情報=(0100)だとすると、マージバッファ内のクアッドQ0を新規スレッドのクアッドQ1とすることを意味する。また、マージバッファ内のクアッドQ1の第1スレッド情報=(1000)は、マージバッファ内のクアッドQ1を新規スレッドのクアッドQ1とすることを意味する。
次に第2スレッド情報について図21を用いて説明する。第2スレッド情報は、最新のクアッドを新規スレッドに含めるか否かを示している。そして、第2スレッド情報はそれぞれが4ビットの信号を4つ含んでいる。4つの信号はそれぞれ、最新の各クアッドQ0〜Q3に対応しており、各信号の各ビットが新規スレッド内の4つのクアッドのそれぞれに対応している。例えば、最新のクアッドQ0の第2スレッド情報=(1000)だとすると、最新のクアッドQ0を新規スレッドのクアッドQ0とすることを意味する。また第2スレッド情報=(0100)だとすると、最新のクアッドQ0を新規スレッドのクアッドQ1とすることを意味する。また、最新クアッドQ1の第2スレッド情報=(1000)は、最新クアッドQ1を新規スレッドのクアッドQ0とすることを意味する。
次に第3スレッド情報について図22を用いて説明する。第3スレッド情報は、最新のクアッドをマージバッファに保持させるか否かを示している。そして、第3スレッド情報はそれぞれが4ビットの信号を4つ含んでいる。4つの信号はそれぞれ最新のクアッドQ0〜Q3に対応しており、各信号の各ビットがマージバッファ内の4つのクアッドのそれぞれに対応している。例えばクアッドQ0に関する第3スレッド情報=(1000)だとすると、最新のクアッドQ0をマージバッファ内のクアッドQ0とすることを意味する。また第3スレッド情報=(0100)だとすると、最新のクアッドQ0をマージバッファ内のクアッドQ1とすることを意味する。また、最新のクアッドQ1に関する第3スレッド情報=(1000)は、最新のクアッドQ1をマージバッファ内のクアッドQ0とすることを意味する。
またスレッド生成部46はクアッドマージを行うかどうかの判定を行う。そしてクアッドマージを行う場合にはマージバッファ内のスタンプデータをオーバーラップ検出部45へ送り、オーバーラップ検出部45に処理させる。また、マージ判定結果を基に、スレッド保持部47へ送るデータを生成する。更にスレッドIDを生成すると共に、マージバッファのスタンプに対するXYタグをオーバーラップ検出部45から受け取る。更に、スレッド保持部47へデータを転送する。またマージバッファのスタンプと新規スタンプの全てのクアッドがマージされた際には、新規スタンプデータをオーバーラップ検出部45に送り、オーバーラップ検出部45に処理させる。
図23はスレッド生成部46のブロック図である。図23では、第1乃至第3スレッド情報を発生する領域については図示を省略している。図示するようにスレッド生成部46は、マージ判定部83、マージバッファ84、イネーブル信号発生器85、QV発生器86、ディバイドビット(Divide bit)発生器87、スレッドID発生器88、F/F89−1〜89−6、ORゲート90、及びANDゲート92−0〜92−3を備えている。
マージ判定部83は、上記第1乃至第3スレッド情報を生成する。
F/F89−1はスタンプ番号StNをラッチする。F/F89−3はスタンプ番号StN、新規タスク信号、タスク同期信号及びXY座標をラッチする。F/F89−5は第1乃至第3スレッド情報をラッチする。
F/F89−2は、F/F89−1でラッチされたデータを再度ラッチする。すなわちF/F89−1に保持されるスタンプ番号が新規スタンプ番号StN0であり、F/F89−2に保持されるスタンプ番号が旧スタンプ番号StN1である。F/F89−4は、F/F89−3でラッチされたデータを再度ラッチする。F/F89−6は、QV発生器86の出力をラッチする。これらのF/F89−2、89−4、89−6を含んでマージバッファ84が形成される。
イネーブル信号発生器85は、クアッドマージを行うか否かを判定し、クアッドマージを行う際にクアッドマージイネーブル信号を生成する。クアッドマージが行われる条件は次の通りである。
・マージバッファ84のクアッドのXY座標と、これからマージしようとする新規スタンプのXY座標とが同一であること
・マージバッファ84のクアッド(前回のマージの残り)のピクセルバリッド(ピクセルバリッド信号)と、これからマージしようとする新規スタンプのピクセルバリッド(ピクセルバリッド信号)との間に重複がないこと
・新規タスク信号=0、すなわち当該タスクにおける最初のスタンプでないこと
QV発生器86は、クアッドマージイネーブル信号がアサートされていれば、第1乃至第3スレッド情報に基づいて信号クアッドバリッドQV、スタンプ情報(StNum0〜StNum3)、及びクアッド情報(QNum0〜QNum3)を生成する。QV発生器86により発生されるクアッドバリッドQVは、スレッド保持部47へ出力されるべき現在のクアッドバリッドである。スタンプ情報StNum0〜StNum3及びクアッド情報(QNum0〜QNum3)は、クアッドマージがいかにしてなされたかを示す情報である。これらの情報StNum0〜StNum3、QNum0〜QNum3について図24を参照しつつ説明する。
図示するように、スタンプ情報StNum0〜StNum3は、新規スレッドにおけるクアッドQ0〜Q3のそれぞれが、マージバッファ84内のスタンプのクアッドと新規スタンプのクアッドとのいずれであるかを示す。例えばスタンプ情報StNum0〜StNum3は各1ビットの信号であって、“0”であればマージバッファ内のスタンプ、“1”であれば新規スタンプを示す。より具体的には、StNum0=“0”の場合、新規スレッドのクアッドQ0はマージバッファ内スタンプのクアッドであり、StNum0=“1”の場合、新規スレッドのクアッドQ0は新規スタンプのクアッドであり、StNum1=“0”の場合、新規スレッドのクアッドQ1はマージバッファ内スタンプのクアッドであり、StNum1=“1”の場合、新規スレッドのクアッドQ1は新規スレッドのクアッドであり、以下StNum2、StNum3の場合も同様である。
クアッド情報QNum0〜QNum3は、新規スレッドにおけるクアッドQ0〜Q3のそれぞれの、マージ前のスタンプ(StNumで指定されるスタンプ)内における位置を示している。例えばクアッド情報QNum0〜QNum3は2ビットの信号であって、“00”であればクアッドの位置は(x、y=0、0)、“01”であれば(x、y=1、0)、“10”であれば(x、y=0、1)、“11”であれば(x、y=1、1)である。
従って、StNum0=“0”、QNum0=“00”の場合、新規スレッドのクアッドQ0は、マージバッファ内のスタンプにおける(x、y=0、0)の位置のクアッドである。またStNum0=“1”、QNum0=“00”の場合、新規スレッドのクアッドQ0は、新規スタンプにおける(x、y=0、0)の位置のクアッドである。
なお、クアッドマージイネーブル信号=0の場合にはクアッドマージは行われない。従って、マージバッファ内のスタンプがそのまま新規スレッドとして出力され、また入力された新規スタンプはマージバッファにラッチされ保存される。
ディバイドビット発生器87は、第1乃至第3スレッド情報を監視する。そして、クアッドマージにより新規スタンプのクアッドが分割され、一部のクアッドがマージバッファに保持され、他の一部が新規スレッドの一部となる場合に、ディバイドビットDivideをセットする。
スレッドID発生器88は、クアッドマージが終了する度にスレッドID(TdID)を生成し、生成したスレッドIDを新規スレッドに対して付与する。スレッドID発生器88は内部にカウンタを有しており、新規スレッドが生成される毎にカウントアップし、そのカウンタ値をスレッドIDとして出力する。
なおスタンプ番号StNに関して、前述の通りマージバッファ84内のものがStN0となり、新規スタンプのものがStN1となる。これは、クアッドマージを行わない場合であっても、一旦はマージバッファ84に格納されるからである。StN0はオーバーラップ検出部45に登録される。マージバッファ84にクアッドがあり、且つ新規スタンプが入力されると、マージバッファ84のStNがStN0になる。また全てのクアッドがマージされた場合、新規スタンプのStNがStN0となる。
クアッドバリッドQV、ピクセルバリッド信号、スタンプ番号StN、XY座標、新規タスク信号は、マージバッファ84に保持される。これらの信号は、新規スタンプがスレッド生成部46に入力された際にラッチされ、次の新規スタンプが入力されるまで保持される。
スレッドバッファライトイネーブル信号は、スレッド保持部47への書き込みをイネーブルにする信号である。ピクセルバリッド信号がセットされている際、すなわちマージバッファ84にデータが存在し且つ次の新規スタンプが入力された際に、スレッドバッファライトイネーブル信号はセットされて、スレッド保持部47へ書き込まれる。
次に、スレッド保持部47について説明する。スレッド保持部47は、図25に示すような、スレッドに関する情報を保持出来るテーブルを有する。図示するように、テーブルは例えば8つのエントリを備え、スレッドに関する情報を各エントリに保持出来る。使用可能なエントリ数は、最大で例えば8エントリである。各エントリに保持される情報は、EnV、End、EEnd、NewT、Rdy、Run、PLCnt、PL、SpID、TdID、PC、Lck、TlC、XYtag、StN0、StN1、QV、StNum0〜StNum3、QNum0〜QNum3である。
EnVは各エントリのバリッドビットである。Endはエンド命令がFEステージを通過したことを示す。エンド命令とは、スレッドに対して行われるべき処理に関する命令列の最後の命令である。NewTは、新規なタスクに属する最初のスレッドに対してセットされる。Rdyはレディビットであり、当該エントリ(スレッド)が実行可能か、すなわち処理を開始して良いか否かを示す。Runはランビットであり、当該エントリが実行中であるか否かを示す。PLCntはプリロードカウントである。プリロードとは、命令制御部35において処理を終了したスレッドのデータ領域の、データキャッシュに対するプリフェッチ(prefetch)要求のことである。PLCntは、プリロード発行前はサイクル数をカウントダウンし、発行後はプリロードの発行順位のデコード値を保持する。PLはプリロードステートを示し、プリロード発行可能か否かを示す。SpIDは、現在実行中または次に実行すべきサブパス(Sub-pass)番号である。サブパスについては後に詳細に説明する。PCは実行開始プログラムカウンタである。Lckは、スレッドがロックを取っているか否かを示す。ロックについても後述する。TlCは、データ未着のテクスチャロード命令の個数を示す。Tld命令はテクスチャロード命令のことであり、テクスチャユニット33へのテクスチャデータのロード命令である。
次にスレッド保持部47の構成について図26を用いて説明する。図26はスレッド保持部47のブロック図である。図示するように、スレッド保持部47はスレッドレジスタ群94、プリロードブロック95、アップデート部96、スレッド発行制御部97、テクスチャロード制御部98、インターフェース99、及び比較部100を備えている。
スレッドレジスタ群94はM個のレジスタ101を備えている。そして、レジスタ101の各々が、図25に示したテーブルのエントリ0〜(M−1)にそれぞれ対応している。図27はレジスタ101のブロック図である。
図示するように、アップデート部96からデータが送られるもの、すなわちステートがアップデートされるもの(EnV、End、Rdy、Run、PLCnt、PL、SpID、PC、Lck、TlC)は、毎サイクルそれがF/Fに書き込まれる。また、StN0、StN1、NewT、XY座標tag、TdID、QNum0〜QNum3、StNum0〜StNum3、QV(これらの信号をXXXXと呼ぶことにする)は、同じものが再度F/Fに書き込まれる。
他方、スレッドライトイネーブル信号がアサートされ、スレッド保持部に対する書き込みエントリ番号がレジスタ101のエントリ番号と一致した場合、当該レジスタ101のバリッドビットがアサートされる。また、信号XXXXがF/Fに新たに書き込まれる。更に、PLCntとPCについては、コンフィギュレーションレジスタ41の値(9’h000、INSTBASE)がF/Fに書き込まれる。End、Rdy、Run、PL、SpID、Lck、TlCはそれぞれゼロとされる。
次にプリロードブロック95について説明する。図28はプリロードブロック95のブロック図である。プリロードブロック95は、データキャッシュプリロードに必要な信号を生成する。
図28において、スレッド保持部の各エントリ0〜(M−1)に相当するレジスタ101の各々は、プリロードステートPLがPLWATからPLREQに変化すると、プリロード発行信号をアサートする。PLWATは初期状態であり、スレッド及びプリロード発行前の状態のことである。またPLREQはプリロード発行要求中の状態のことである。
プリロード発行信号がアサートされると、アービター103はこれを受け、エントリ0〜(M−1)の順序で要求を選択する。ANDゲート104はアービター103での選択結果に基づくMビットの信号を出力する。各ビットはスレッド保持部のエントリ0〜Mに対応しており、各エントリに対するアクノリッジ信号となる。例えばアービター103がエントリ0を選択すると、ANDゲート104はアクノリッジをエントリ0に返す。
更にエンコーダ105はアクノリッジ信号をエンコードする。そしてエンコード結果がF/Fで2度ラッチされた後、スレッド保持部のエントリ番号を示すプリロードスレッドエントリ番号として出力される。
ORゲート107はアクノリッジ信号を監視する。そしてM個のアクノリッジ信号のいずれかがアサートされると、プリロード要求信号をアサートさせる。
セレクタ106はエンコーダ105におけるエンコード結果に応じて、エントリ0〜(M−1)のいずれかからスタンプ番号、スレッドID、サブパスID(StN0、TdID、SpID)を読み出して、F/Fにラッチさせる。そして、XYテーブルからXY座標を読み出すためにプリロード用XYタグが出力され、更に、スレッドID及びサブパスIDを示すプリロードスレッドID及びプリロードサブパスIDが出力される。
次にアップデート部96について説明する。アップデート部96はスレッド保持部の各エントリのステータス(EnV、End、Rdy、Run、PLCnt、PL、SpID、PC、Lck、TlCのステート)をアップデートする。アップデート部96はM個のセクション102を含んでおり、各セクション102がそれぞれエントリ0〜(M−1)に対応している。各セクション102は、ステータスをアップデートするためのアップデートロジックを備えている。以下、アップデートロジックについて説明する。
<Endのアップデートロジック>
Endビットは、エンド命令に到達したことを示すビットであり、スレッド生成時にクリアされる。アップデートロジックは、エンド命令がアサートされ、且つ実行スレッドエントリ番号が当該エントリのエントリ番号と同一であるとき、Endビットをセットする。Endは、バリッドビットEnVがデキュー条件の揃うまでクリアされないため、その間誤って再びRunさせないためにセットされる。
<EnVのアップデートロジック>
図29はバリッドビットEnVのアップデートロジックの回路図である。EnVは、スレッド生成時にセットされる。アップデートロジックにおいて、比較器108はTlC==0の場合に“High”を出力する。そしてNANDゲート109が、比較器108の出力とEndとのNAND演算を行う。NAND演算結果はスレッドデキュー要求信号としてスレッド保持部へ与えられる。Endビットがセットされ、TlC=0となったら、スレッド保持部のデキューブロックに対してデキュー要求信号をアサートする。そして、デキューブロックから与えられるスレッドデキュー許可信号がアサートされると、バリッドビットがクリアされる。
<PLのアップデートロジック>
図30はPLの各ステートを示している。PLはPLWAT、PLREQ、PLDON、及びPLRUNの4つのステートを取ることが出来る。PLWATは初期状態であり、スレッド発行前でプリロード発行前の状態である。PLREQは、プリロード発行要求中の状態である。PLDONは、プリロード発行終了で且つスレッドの発行前の状態である。PLRUNは、スレッド実行中の状態である。
PLがPLWATにセットされるタイミングは、スレッドがスレッド保持部に保持される時、またはPL=PLRUNにおいてイールド命令がアサートされた時である。PL=PLWATであるとき、PLCnt=0になったらPLはPLREQにセットされる。PL=PLREQのとき、当該エントリに対応するプリロード発行信号がアサートされたら、PLはPLDONにセットされる。PL=PLDONであるとき、当該エントリに対応するスレッドが描画処理部36に発行されたら、PLはPLRUNにセットされる。
<PLCntのアップデートロジック>
図31はPLCntの各ステートを示している。イールド命令がアサートされると、PLCntにはPRELDTIMEがロードされる。PL=PLWATであるとき、PLCntはカウントダウンされる。PLCnt=0になったサイクルまでPLのステートはPLWATに留まるため、PLCnt=0においてもさらにカウントダウンされ、最終的に−1(0x1ff)までカウントダウンされる。このとき、同時にPLのステートはPLREQに代わるので−2にはならない。またPLCnt=−1であるときはすでにPLはPLREQのステートに遷移しているので、PLCntはいずれのステートでも良く、誤動作を抑制出来る。PL=PLREQであるとき、PLCntにマスターエイジカウンタ(Master Age Counter)のカウンタ初期値AgeMsがセットされる。すなわち、PLCntは−1になった次のサイクルでAgeMsがセットされることになる。上記以外の時、スレッドが発行(自スレッド以外も含む)されると、対応するランセット信号(後述する)がアサートされるので、PLCntの同じビット位置をクリアし、Ageを正しく反映させる。
図32はPLCntのアップデートロジックの回路図である。図示するように、選択回路111はPLCnt、PLCntをカウントダウンしたもの、PLCntとエイジレジスタアップデート信号の反転信号とのAND演算結果、AgeMs、“0”、及びPRELDTIMEのいずれかを選択し、それを新たなPLCntとする。選択回路111は、制御回路112の制御に基づいて選択動作を行う。制御回路112は各種信号に基づいて選択回路111の選択動作を制御するが、その具体的な制御方法は図31を用いて説明したとおりである。エイジレジスタアップデート信号及びAgeMsについては後述する。
<Lckのアップデートロジック>
図33はロックビットLckのアップデートロジックである。図示するように、比較器113は、エントリ番号EntNと新規スレッドエントリ番号とを比較する。新規スレッドエントリ番号とは、新たに生成されてスレッド保持部に書き込まれたスレッドに関する。ANDゲート114は、比較器113の出力とバリッドビットEnVとのAND演算を行う。ANDゲート115は、ANDゲート114の出力とロック命令とのAND演算を行う。ANDゲート116は、ANDゲート114の出力と、ロッククリア命令、エンド命令とのAND演算を行う。ORゲート117は、ANDゲート115の出力とLckとのOR演算を行う。ANDゲート118は、ORゲート117の出力とANDゲート116の出力とのAND演算を行う。そしてANDゲート118の出力が新規なLckとなる。
上記構成において、ロック命令がアサートされると、新規スレッドエントリ番号に一致するエントリのLckビットがセットされる。ロッククリア命令またはエンド命令がアサートされた場合には、実行スレッドエントリ番号が一致するエントリのLckビットはクリアされる。
<TlCのアップデートロジック>
図34はTlCのアップデートロジックである。図示するように、比較器119は新規スレッドエントリ番号と当該エントリのスレッドエントリ番号とを比較する。比較器120は、テクスチャロード命令実行中において、テクスチャロードを行う実行スレッドエントリ番号と当該エントリのエントリ番号とを比較する。ANDゲート121は、比較器119の出力とテクスチャロード命令とのAND演算を行う。ANDゲート122は、比較器120の出力とテクスチャロードアクノリッジ信号とのAND演算を行う。テクスチャロードアクノリッジ信号は、テクスチャロード命令につき実行が完了したことを示すアクノリッジ信号である。減算器123は、TlCを−1する。加算器124は、TlCを+1する。選択回路125はANDゲート121の出力に基づいて、加算器124における加算前後のTlCのいずれかを選択する。選択回路126はANDゲート122の出力に基づいて、減算器123の出力と選択回路125の出力とのいずれかを選択する。そして選択回路126で選択された信号が、新たなTlCとなる。
TlCのアップデートロジックは、サブパス実行時にはテクスチャロード命令の実行個数をカウントする。テクスチャロード命令の実行時は、テクスチャロード命令がアサートされる。そのとき、新規スレッドエントリ番号と一致するエントリのTlCフィールドを1カウントアップする。テクスチャロード命令のカウントは、サブパスの1回目の実行でカウントして、その後の全てのスレッドに対して同じ値を使うのではなく、実際にそのスレッドが実行した数を動的にカウントする。分岐命令の実効状態によってテクスチャロード命令の実行個数が異なるかもしれないからである。
テクスチャロードアクノリッジ信号がアサートされ、自分のエントリ番号がテクスチャロードを実行するスレッドエントリ番号に一致したら、TlCをカウントダウンする。
<SpIDのアップデートロジック>
次にSpIDのアップデートロジックについて図35を用いて説明する。図示するようにSpIDのアップデートロジックは、比較器127、ANDゲート128、及び選択回路129を備えている。比較器127は当該エントリのエントリ番号と新規スレッドエントリ番号とを比較する。ANDゲート128は比較器127の出力とイールド命令とのAND演算を行う。選択回路129は、ANDゲート128の出力に基づいてSpIDと次のサブパスIDのいずれかを選択し、選択した方を新たなSpIDとする。
SpIDアップデートロジックは、イールド命令がアサートされると、対応するエントリのSpIDをインクリメントする。エンド命令の場合にはすぐにデキューされるので、インクリメントの必要はない。
<PCのアップデートロジック>
次にPCのアップデートロジックについて図36を用いて説明する。図示するようにPCアップデートロジックは、SpIDアップデートロジックにおいて、SpID及び次のサブパスIDを、それぞれPC及び次のPCに置き換えたものである。
PCアップデートロジックは、スレッド生成時にINSTBASEをPCにロードする。そして、イールド命令がアサートされると、新規スレッドエントリ番号と一致するエントリのPCに次のPCをセットする。すなわちPCをインクリメントする。
<Rdyのアップデートロジック>
次にレディビットRdyのアップデートロジックについて図37を用いて説明する。図示するように、検出器132はTlCがゼロであるか否かを検出する。検出器133はPLが1であるか否かを検出する。検出器134は、TdIDと次のバリッドなスレッドIDとが等しいか否かを検出する。ANDゲート135は、Runの反転信号と、EnVと、検出器132の出力とのAND演算を行う。ANDゲート136は、スレッド追い越し信号と、同一XYロック信号の反転信号とのAND演算を行う。ANDゲート137は、ANDゲート135の出力と、検出器133、134の出力と、ANDゲート136の出力とのAND演算を行う。そしてANDゲート136の出力が新たなRdyとなる。
なお、スレッド追い越し信号は、エントリ0〜(M−1)に関する処理が、前のスレッドに関する処理を時間的に追い越していないかどうかを示す。また同一XYロック信号は、当該エントリと同一XY座標を有する他のエントリが存在し、且つそれがロックをとっていることを示す信号である。ロックとは、同一XY座標のものについては他のスレッドの発行を禁止する命令である。
Rdyアップデートロジックは、スレッドが実行可能になると、Rdyビットをセットする。スレッドが実行可能な状態とは以下の全てが成立した場合である。
・EnV=1:有効なエントリである
・Run=0:実行中のエントリではない
・TlC=0:テクスチャデータのロードが終了している
・同一XYロック信号=0:自分のXY座標と同一のXY座標を持つスレッド保持部エントリがロックを取っていない。つまりそのエントリのロックビットLckがゼロにクリアされている
・自エントリに対応するスレッド追い越し信号が1である
・PL=1:プリロードを既に開始している
・自分のスレッドIDは、スレッド保持部においてバリッドな次のスレッドIDと同一でない。
スレッドが実行開始され且つランビットRunが設定されると、レディビットRdyの成立条件が成立しなくなるので、レディビットRdyはクリアされる。
<Runのアップデートロジック>
次に、ランビットRunのアップデートロジックについて説明する。エントリの発行(WakeUp時)には、RunビットとRdyビットの状態が関連する。この様子を示しているのが図38である。図示するように、エントリが発行可能になるとRdyビットがセットされる(Rdy=1)。次に、Rdyビットがセットされたエントリのうちいずれかが選択されて発行される際、Runビットがセットされる(Run=1)。更に、次のサイクルでRdyビットがクリアされる(Run=1、Rdy=0)。そして、選択されたスレッドがエンド命令またはイールド命令を実行するとRunビットがクリアされ、アイドル状態に戻る(Run=0、Rdy=0)。
図39はRunアップデートロジックの回路図である。図示するように、比較器138が当該エントリのエントリ番号と新規スレッドエントリ番号とを比較する。ORゲート139はイールド命令とエンド命令とのOR演算を行う。NANDゲート140は、比較器138の出力とORゲート139の出力とのOR演算を行う。ANDゲート141は、NANDゲート140の出力とRunとのAND演算を行う。ORゲート142は、ANDゲート141の出力とランセット信号とのOR演算を行う。そしてORゲート142の出力がRunとなる。
上記構成において、イールド命令またはエンド命令がアサートされると、実行中のスレッドエントリ番号と同一のエントリのRunビットがクリアされる。また、スレッド発行制御部97から与えられるランセット信号がアサートされると、Runビットがセットされる。Runビットがセットされる条件は次の通りである。
・スレッド保持部内における全エントリのRunビットがゼロのとき、またはRunビットがクリアされるとき
・Rdy=1
・PLCntがセットされているビットが最もLSB(least significant bit)に近いもの。LSBに近い程プリロードを開始したタイミングが早い。サブパス0のスタンプでプリロードしていないものは、MSBがセットされているので最も優先度が低い。
次に図26におけるスレッド発行制御部97について説明する。図40、図41はスレッド発行制御部97の回路図である。
図示するように、スレッド発行制御部97は、各エントリに対応した8つのANDゲート143−0〜143−(M−1)、144−0〜144−(M−1)、ORゲート145−0〜145−(M−1)、NORゲート146−0〜146−(M−1)、及びRun検出部147を備えている。ANDゲート143−0〜143−(M−1)の各々は、エントリ0〜(M−1)に保持されるRdyとPLCntとのAND演算を行う。なお、エントリ0〜(M−1)に保持されるPLCntを、それぞれPLCnt0〜PLCnt(M−1)と呼ぶことにする。ORゲート145−0〜145−(M−1)の各々は、ANDゲート143−0〜143−(M−1)の出力の全ビットのOR演算を行う。NORゲート146−0〜146−(M−1)の各々は、ORゲート145−0〜145−(M−1)の出力と、エントリ0〜(M−1)に保持されるRdyとのNOR演算を行う。ANDゲート144−0〜144−(M−1)は、NORゲート146−0〜146−(M−1)の出力とRun検出部147の出力とのAND演算を行う。そしてANDゲート144−0〜144−(M−1)の出力が、それぞれランセット信号0〜(M−1)となる。
Run検出部147は、NORゲート147−0、147−1、ORゲート147−2を備えている。NORゲート147−0は、エントリ0〜(M−1)に保持されるRunのNOR演算を行う。NORゲート147−1は、イールド命令とエンド命令のNOR演算を行う。ORゲート147−2は、NORゲート147−0、147−1の出力のOR演算を行う。そしてORゲート147−2の出力がRun検出部147の出力となる。
またスレッド発行制御部97は、AgeMsと、プリロードブロックから与えられるアクノリッジ信号とのOR演算を行う。そして、そのOR演算結果とANDゲート144−0〜144−(M−1)の出力を反転させた信号とのAND演算を行い、演算結果をAgeMsとして出力する。
更に図41に示すようにスレッド発行制御部97は、エントリ0〜(M−1)に保持されるRunに応じて、スレッド保持部のエントリ0〜(M−1)に保持されるスタンプの本体データを選択して出力する。スタンプの本体データとは、NewT、SpID、TdID、StN0、StN1、QV、StNum0〜StNum3、及びQNum0〜QNum3を含む。
スレッド保持部47において、PLCntを保持するレジスタはプリロードカウント値を保持するレジスタであるが、プリロード後はエイジレジスタ(age register)として機能する。エイジレジスタとしての機能とは、当該エントリに保持されるデータが、スレッド保持部47内においてどれだけ古いデータであるかを示す機能である。スレッド発行制御部97は、エイジレジスタを更新するためのエイジレジスタアップデート信号及び初期値AgeMsを生成し、PLCntアップデートロジックに出力する。
またスレッド発行制御部97は発行すべきエントリを探し、そのエントリ内のRunビットをセットする。更にスレッド発行制御部97は、Runビットを参照することによりいずれかのエントリを選択する。ここで、プリロード発行時及びスレッド発行時のエイジレジスタについて説明する。図42はプリロード発行時のエイジレジスタの様子を示す概念図である。図示するようにエイジレジスタはM個のエントリを有し、各エントリ内に例えば8ビットのデータを保持できる。またスレッド保持部47は、既にプリロード発行済みのエントリ番号に対応したビット位置がセットされた(“1”にされた)、8ビット長のマスターエイジレジスタ(master age register)を備える。マスターエイジレジスタは、例えばエントリ番号0、1、2のスレッドが既にプリロードを発行しているとすると、ビット0、1、2がセットされていることになる。
図42に示すようにエントリ0〜2がプリロード発行済みの状態で、次にエントリ3がプリロードを発行したと仮定する。すると、マスターエイジレジスタの値が、エイジレジスタのプリロード発行したレジスタにコピーされる。これは、エントリにとっては自分より早いタイミングでプリロードを発行しているエントリ番号に対応するビットがセットされることになる。その後、マスターエイジレジスタの対応するビット(ビット3)がセットされる。既にエントリはプリロードを発行したためである。
図43はスレッド発行時のエイジレジスタの様子を示す概念図である。スレッドが発行される際には、Rdyビットがセットされ且つ最も古いエントリが選択される。
エイジレジスタの各エントリにおいては、自分より古くからプリロードされているエントリに対応した位置のビットがセットされている。従って、エイジレジスタを参照することで、いずれのエントリのデータがもっと古いのかを知ることが出来る。そして、エイジレジスタ内のビットと、各エントリのRdyビットとのANDを取る。その後、更に8ビットのリダクションORを取った結果がゼロであり、かつ自分のRdyがセットされているものが「Rdyがセットされていて最も古い」エントリとなる。すなわち、それが選択すべきエントリとなる。図43ではエントリ0がそれにあたる。最も古いのはエントリ1であるが、エントリ1はRdyビットがセットされていないため、次に古いエントリ0が選択される。エントリが選択されると、エイジレジスタ内において選択エントリに対応するビット(エントリ0)が全てクリアされて、今後は選択対象とはならない。またマスターエイジレジスタでも同様である。
次に、スレッド発行制御部97の各ステージの動作について説明する。スレッド発行制御部97は、M個のスレッド保持部エントリのそれぞれに保持されるPLCntとRdyとから、Rdyであり且つ最も早くプリロードを発行したエントリを選択する。すなわちNORゲート146−0〜146−(M−1)のうち、発行すべきエントリに対応するものの出力がアサートされる。
そして、M個のエントリに対応するランセット信号のうち、選択されたエントリに対応するものがアサートされる。また、各エントリに対応するランセット信号が各エントリのアップデートロジックに入力され、これに基づいてRunビットがセットされる。ランセット信号がアサートされた場合、マスターエイジレジスタの対応するビットがクリアされる。また、Runのエンコード結果に基づき、実行スレッドエントリ番号が生成される。更に、Runビットが参照され、これに基づいていずれかのエントリが選択される。そして、選択されたエントリのデータが描画処理部36へ出力される。出力される信号は、サブパススタート信号、SpID、TdID、実行スレッドエントリ番号、PC、StN0、StN1、QV、StNum0〜StNum3、及びQNum0〜QNum3である。
次に、スレッド保持部47の備える比較部100について説明する。図44は比較部100の回路図である。比較部100は、スレッド保持部のエントリ数と同じM個の比較回路151−0〜151−(M−1)を備えている。比較回路151−0〜151−(M−1)は、スレッド保持部の各エントリのXYタグとエントリバリッドビット、及び命令管理部の各エントリのロックビットSptLckを参照する。そして比較回路151−0〜151−(M−1)は、スレッド保持部47内のMエントリに関して同一XY座標タグを持つ組み合わせがあるかを判定する。
すなわち、比較回路151−0は、スレッド保持部47内のエントリ0に保持されるXYタグが、その他のエントリ1〜(M−1)に保持されるXYタグのいずれかと等しいか否かを検出する。比較回路151−1は、エントリ1に保持されるXYタグが、その他のエントリ0、2〜(M−1)に保持されるXY座標タグのいずれかと等しいか否かを検出する。比較回路151−2は、エントリ2に保持されるXY座標タグが、その他のエントリ0、1、3〜(M−1)に保持されるXY座標タグのいずれかと等しいか否かを検出する。以下同様である。
等しいXYタグを有するエントリが存在する場合、その検出結果と、当該エントリに対応する命令管理部のエントリに保持されるロックビットSptLckとのOR演算が、同一XYロック信号として出力される。同一XYロック信号は、対応するエントリと同一XY座標を保持する他のエントリがスレッド保持部内に存在し、且つそのエントリがLockを取っていることを示す。
図45は図44における比較回路の回路図であり、特に比較回路151−0について示している。比較回路151−0は、検出部152−0〜152−(M−2)、ANDゲート153−0〜153−(M−2)、及びORゲート154を備えている。検出部152−0〜152−(M−2)の各々は、エントリ1〜(M−1)に保持されるXYタグと、エントリ0に保持されるXYタグとを比較して同一であるか否かを検出する。ANDゲート153−0〜153−(M−2)の各々は、検出部152−0〜152−(M−2)の出力のそれぞれと、エントリ1〜(M−1)のエントリバリッドEnVのそれぞれと、命令管理部のエントリ1〜(M−1)に保持されるロックビットSptLckのそれぞれとのAND演算を行う。ORゲート154は、ANDゲート153−1〜153−(M−2)のOR演算を行う。そして、ORゲート154の出力が、エントリ0に対応した同一XYロック信号となる。
上記構成において、エントリ0の保持するXYタグと、他のエントリ1〜(M−1)のいずれかが保持するXYタグとが等しく、且つその他エントリのバリッドがセットされ、更にその他エントリがロックを取っていた場合、対応するANDゲート153−0〜153−(M−2)の出力が“High”となる。よって同一XYロック信号がアサートされる。
スレッド保持部47の備えるインターフェース99は、テクスチャユニット33から送信されるテクスチャロードのアクノリッジ信号をF/Fでラッチする。
次に、図7における命令管理部48について説明する。命令管理部48はレディキューテーブル(ready queue table)を備えている。レディキューテーブルは、図46に示すようなM個のエントリを備える。レディキューテーブルの各エントリはスレッド保持部47の1エントリに対応しており、それぞれTdEntNo、SpID、SpRdy、及びSptLckを保持する。TdEntNoは対応するスレッド保持部エントリ番号、SpIDは次に実行すべきサブパス番号、SpRdyはスレッドを発行して良いかどうかを示すフラグ、SptLckはロックを取っているかどうかを示すフラグである。各情報は、クアッドマージ後にスレッドを生成した順序で保持される。SpRdyは、スレッドがサブパスの単位で前のスレッドを追い越すことなく発行されるようにセットされる。
サブパスについて図47を用いて説明する。命令制御部35は各スレッドに対して、INSTBASEにより指定されるアドレスの命令を、エンド命令を検出するまで実行する。この実行される命令列は、図47に示すようにX個の命令列に分割出来、分割されて出来た個々の命令列がサブパス(Sub pass)である。個々のサブパスの最後にはイールド命令Yieldが配置され、最終サブパスの最後にはイールド命令の代わりにエンド命令Endが配置されている。
図48は、サブパスが実行される様子を時間と共に示した概念図である。図48においてスレッド5、6、7は同一のピクセルシェーダユニットによって処理される。図示するように、スレッドに対する処理はイールド命令によって一旦休止する。そして、代わりに他のスレッドに対する命令が実行される。休止したスレッドは、後に発行可能となった際に起動される。すなわち、2つのイールド命令間で実行される命令がサブパスである。そしてサブパスの単位でスレッドが実行され、その期間の処理は連続して実行される。
次に実行を予定するサブパスのサブパス番号が互いに同一である複数のスレッドが存在する場合、SpRdyフラグは最も古いスレッドに対してだけセットされる。そして、SpRdyがセットされたスレッドだけが発行可能である。これにより、新しいスレッドに対する処理が、古いスレッドに対する処理を時間的に追い越してしまうことを防止する。
新規スレッドが生成された際、レディキューテーブルの空いている最初のエントリにそのスレッド保持部のエントリ番号がセットされ、SpIDがゼロにセットされ、バリッドビットEnVがセットされる。
スレッドが発行された際(サブパスが実行された際)、対応するエントリのSpIDがインクリメントされ、次回発行されるサブパス番号を示すようにする。スレッドがエンド命令を実行したら、バリッドビットがクリアされ、エントリはデキューされる。
各エントリは、自分のSpIDと、自分より1つ古いエントリのSpIDとを常時比較する。そして、その古いエントリのSpIDが自分のSpIDと同一である場合は、自分のSpRdyをクリアする。図46の例であると、エントリ2とエントリ3の関係であり、エントリ3はSpRdyをクリアしている。SpIDフィールドは、自分より1つ古いエントリと同一であるか小さいかのどちらかの値しか取らない。従って、上記のような処理を行うことにより、同一SpIDのうち一番古いスレッドについてのみ、SpRdyビットがセットされることになる。各エントリのSpRdyビットは、そのTdEntNo番号の示すスレッド保持部エントリに対して選択されて出力される。
実行中のスレッドがロック命令を実行した場合、対応するエントリのロックビットがセットされる。またアンロック命令を実行した場合には、ロックビットはクリアされる。
次に、命令管理部48の回路構成について説明する。図49は命令管理部48の備えるエントリ回路159の回路である。この回路は、レディキューテーブルにおける各エントリの実体を為す回路である。
図示するようにエントリ回路159は、ANDゲート160−1〜160−8、ORゲート161−1〜161−3、NANDゲート162、比較器163−0〜163−2、加算器164、及び選択回路165−0、165−1、166−0〜166−4を備えている。
ORゲート161−1は、エンド命令とイールド命令とのOR演算を行う。比較器163−0は、新規スレッドエントリ番号と、自らが保持するスレッドエントリ番号TdEntNoとを比較する。比較器163−2は、自らが保持するサブパスID(SpID)と、1つ古いエントリが保持するサブパスID(旧エントリのSpID)とを比較する。NANDゲート162は、比較器163−2の出力の反転信号と、自らより1つ古いエントリが保持するバリッドビット(旧エントリのEnV)とのNAND演算を行う。ANDゲート160−8は、比較器163−2の出力と旧エントリのバリッドビットとのAND演算を行う。ANDゲート160−1は、比較器163−0の出力と信号エンド命令とのAND演算を行う。ANDゲート160−5は、ORゲート161−0の出力と、ANDゲート160−1の出力の反転信号とのAND演算を行う。ANDゲート160−2は、ORゲート161−1の出力と、比較器163−0の出力とのAND演算を行う。ANDゲート160−3は、自らより1つ古いエントリが保持するロックビット(旧エントリのSptLck)を反転させたものと、比較器163−0の出力とのAND演算を行う。ANDゲート160−4は、ロック命令と、ANDゲート160−8の出力とのAND演算を行う。ORゲート161−2は、ANDゲート161−2の出力とANDゲート160−3の出力とのOR演算を行う。ORゲート161−3は、ANDゲート160−4の出力と、自らが保持するロックビットSptLckとのOR演算を行う。ANDゲート160−6は、ORゲート161−2の出力の反転信号と、ORゲート161−3の出力とのAND演算を行う。比較器163−1は、自らが保持するスレッドエントリ番号TdEntNoと、動作開始スレッドエントリ番号とを比較する。動作開始スレッドエントリ番号は、サブパスの実行を開始したスレッドに関する。
ANDゲート160−7は、信号サブパススタート信号と、比較器163−1の出力とのAND演算を行う。選択回路165−0は、ANDゲート160−0の出力に基づいて、TdEntNoとスレッドライトエントリ番号とのいずれかを選択する。加算器164は、自らが保持するサブパスID(SpID)を+1する。選択回路165−1は、ANDゲート160−7の出力に基づいて、加算器164の出力、SpID、または“0”のいずれかを選択する。
選択回路166−0は、シフトイネーブル信号に基づいて、ANDゲート160−5の出力と、自らより1つ新しいエントリのデータ(シフト入力信号)とのいずれかを選択する。そして選択回路166−0の出力がバリッドビットとなる。選択回路166−1は、シフトイネーブル信号に基づいて、ANDゲート160−6の出力と、自らより1つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路166−1の出力がロックビットSptLckとなる。選択回路166−2は、シフトイネーブル信号に基づいて、選択回路165−0の出力と、自らより1つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路166−2の出力がTdEntNoとなる。選択回路166−3は、シフトイネーブル信号に基づいて、選択回路165−1の出力と、自らより1つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路166−3の出力がSpIDとなる。選択回路166−4は、シフトイネーブル信号に基づいて、NANDゲート162の出力と、自らより1つ新しいエントリのシフト入力信号とのいずれかを選択する。そして選択回路166−4の出力がSpRdyとなる。
ANDゲート160−5、160−6の出力、選択回路165−0、165−1の出力、及びNANDゲート162の出力はシフト出力信号となる。そして、自らよりも1つ古いエントリに対応するエントリ回路にシフト入力信号として入力される。
なお、エンド命令、ロック命令、ロッククリア命令は、描画処理部36が送られる信号である。またサブパススタート信号はスレッド保持部47から与えられ、サブパスの実行開始を示す信号である。スレッドライトエントリ番号は、スレッド保持部47において、書き込みを行うべきエントリの番号を示す信号であり、オーバーラップ検出部45から与えられる。動作開始スレッドエントリ番号及び新規スレッドエントリ番号はスレッド保持部47のエントリ番号であり、それぞれスレッド保持部47及び描画処理部36から与えられる。
上記構成において、OEステージでスレッドライトイネーブル信号がアサートされると、書き込みポインタが示すエントリに対して、TdEntNoとしてスレッドライトエントリ番号が書き込まれ、SpIDとしてゼロが書き込まれ、バリッドビットEnVとして“1”が書き込まれる。すなわち、選択回路165−0はスレッドライトエントリ番号を選択し、選択回路165−1は“0”を選択する。なおスレッドライトイネーブル信号はスレッド保持部47に対するデータの書き込みをイネーブルにする信号であり、スレッド生成部から与えられる。
また比較器163−2は、自らより1つ古いエントリがバリッドであり、且つそのエントリのサブパスID(旧エントリのサブパスID)と自らのサブパスIDとが等しい場合、NANDゲート162の出力が“High”となる。この場合、SpID=1に設定される。その他の場合にはNANDゲートの出力は“Low”となり、SpID=0に設定される。
また、SpIDが旧エントリのサブパスIDと等しく、且つロック命令がアサートされると、実行中のスレッドエントリ番号と一致するエントリのロックビットSptLckがセットされる。逆に、エンド命令、ロッククリア命令がアサートされたらクリアする。また、直前のエントリのロックビットSptLckがゼロであって、SpIDが自分と同じ場合、自分のビットをクリアにする。
サブパススタート信号がアサートされると、比較器163−1が実行スレッドエントリ番号と自分のTdEntNoとを比較する。そして両者が同一なら自分が発行されたと認識して、加算器164がSpIDをインクリメントする。SpIDがインクリメントされた後、新しいSpIDの値によってSpRdyビットの再評価が行われ、その値が更新される。
エンド命令が実行されると、比較器163−0が実行スレッドエントリ番号と自分のTdEntNoとを比較する。両者が一致すれば、自分のサブパスが終了したと判定され、ANDゲート160−5の出力が“Low”レベルとなって、エントリバリッドEnVはクリアされる。
次に、命令管理部の備える読み出し回路170について図50を用いて説明する。図50は読み出し回路170とエントリ回路159との接続関係を示すブロック図である。読み出し回路170は、命令管理部から、指定されたエントリ内のSpRdyビット及びロックビットSptLckを選択する。
図示するように、命令管理部48は、エントリと同じ数(M個)の読み出し回路170を備えている。各エントリに対応するエントリ間では、シフト入力信号、シフト出力信号と、エントリバリッドEnV、SpIDが縦列接続されている。そして読み出し回路170は、8個のエントリ回路159からTdEntNo、SpRdyビット、及びロックビットSptLckを受け取り、スレッド保持部47において指定されるエントリに対応したエントリ回路159のSpRdyビット及びロックビットを選択する。
図51は、各読み出し回路170の回路図である。図示するように読み出し回路170は、ANDゲート171−0〜171−(M−1)、比較器172−0〜172−(M−1)、及びORゲート173を備えている。ここで、命令管理部のエントリ0〜(M−1)に保持されるレディビットをそれぞれSpRdy0〜SpRdy(M−1)と呼び、ロックビットをSptLck0〜SptLck(M−1)、スレッドエントリ番号をTdEntNo0〜TdEntNo(M−1)と呼ぶことにする。
比較器172−0〜172−7は、TdEntNo0〜TdEntNo(M−1)のそれぞれとエントリ番号EntNとを比較する。そして両者が一致した場合、“High”レベルを出力する。ANDゲート171−0〜171−(M−1)は、SpRdy0〜SpRdy(M−1)のそれぞれと、比較器172−0〜172−(M−1)の出力のそれぞれとのAND演算を行う。更に、SptLck0〜SptLck(M−1)のそれぞれと、比較器172−0〜172−(M−1)の出力のそれぞれとのAND演算を行う。ORゲート173は、ANDゲート171−0〜171−(M−1)の出力のOR演算を行う。そして、ORゲート173の出力が、選択エントリに保持されるSpRdyビット及びSptLckビットとなる。
上記読み出し回路170の動作を、例えばエントリ0からデータを読み出す場合を例に挙げて説明する。この場合、比較器172−0の出力が“High”レベルとなり、その他の比較器172−1〜172−(M−1)の出力が“Low”レベルとなる。従って、ANDゲート171−1〜171−(M−1)の出力は強制的に“Low”レベルとなる。他方、ANDゲート171−0は、エントリ0に保持されるSpRdyビット及びロックビットSptLckによって変化する。すなわち、エントリ0のSpRdyビット及びロックビットSptLckが取り出される。
次に、上記構成のグラフィックプロセッサの動作について、特に命令制御部35に特に着目して説明する。図52はグラフィックプロセッサにより図形を描画する際の処理のフローチャートである。
図形を描画するにあたっては、まずラスタライザ24に図形情報が入力される(ステップS10)。図形情報は、例えば図形の頂点座標や色情報などである。すると、ラスタライザ24は描画すべき図形が占める位置に対応するスタンプを生成する(図6参照)。生成されたスタンプデータは、それぞれ予め対応付けられたピクセルシェーダ25−0〜25−3のデータ振り分け部30に送られる(ステップS11)
次に、各ピクセルシェーダ25−0〜25−3が受け取ったスタンプデータに基づいて描画処理を行うべく、タスクの実行管理が開始される(ステップS12)。
<スタンプデータ受信>
まず、データ振り分け部30が、ピクセルシェーダユニット34の備える命令制御部35に対してスタンプデータを送付する(ステップS13)。データ振り分け部30から命令制御部35へ8クロックサイクルでスタンプデータが転送される。
データ振り分け部30から送付されるスタンプデータは図53に示すように、スタンプのピクセルバリッド、XY座標、及び第1データ乃至第3データである。図示するようにデータ振り分け部30は、1つのスタンプに関するデータを8サイクルに分割して転送する。データはMSB側から分割されて順に送られる。
図54は、データ転送時の各種信号のタイミングチャートである。図中のスタンプデータはピクセルバリッドPV、XY座標、第1データのことである。図示するように、データはクロックCLK2に同期して命令制御部35に送付される。第2データ以外のデータは第1スタート信号に同期して、8サイクルに分割して送付される。第2データは第2スタート信号に同期して8サイクル間で送付される。第2データはそれ以外のデータより規定サイクルΔTだけ遅れて送付される。
<スタンプデータ書き込み>
次に、転送されたデータは、第1データ保持部42、第2データ保持部43、及びスタンプ保持部44に書き込まれる(ステップS14)。命令制御部35は、最大でスタンプ16個分のスタンプデータを保持できる。そしてスタンプの処理が終了した際には、そのスタンプデータを破棄する。
第1データは、第1スタート信号がアサートされてから8サイクルの間、第1データ保持部42へ毎サイクル書き込まれる。第2データは、第2スタート信号がアサートされてから8サイクル間、シフトレジスタ53−5(図10参照)にラッチされ、9サイクル目にまとめて第2データ保持部43に書き込まれる。更に書き込み制御部40は、第1スタート信号がアサートされてから8サイクル間、受信したXY座標、第3データ、ピクセルバリッドに基づいて、XY座標、ピクセルバリッド、第3データ、QVを組み立てた後、それをスタンプ保持部44へ書き込む。
スタンプデータの書き込みの際には、スタンプに対して割り当てたスタンプ番号StNを使用する。スタンプ番号StNは、命令制御部35が内部的に使用するスタンプの識別番号であり、0〜(N−1)が割り当てられる。データ振り分け部30からスタンプが転送されると、スタンプ番号のプールから、空いている(未使用の)番号がそのスタンプに割り当てられる。各スタンプは、処理が終了するまでそのスタンプ番号StNを使い続ける。スタンプの処理が終了すると、再びその番号は「フリー(free)」となって、スタンプ番号プールに戻される。
より具体的には、スタンプ番号StNは、スタンプ保持部44の空きエントリのうちで、最も若い数字のエントリ番号が割り当てられる。そしてスタンプ保持部44内のそのエントリにスタンプデータが書き込まれる。この様子を示しているのが図55である。図示するように、スタンプ保持部44はN個のエントリを有している。スタンプ保持部は番号の若いエントリから順に使用される。例えばエントリ0〜3までが使用中であったとする(既にデータが書き込まれている)。すると、未使用のエントリ4〜(N−1)のうちで、最も番号の若いエントリ4が使用される。使用中か否かは、各エントリのバリッドビットEnVを参照することで知ることが出来る。バリッドビットEnVは、当該エントリに保持されるスタンプの処理が終了すると、“0”にクリアされる。エントリ4に書き込まれた当該スタンプに対しては、書き込まれるエントリの番号と同じ“4”がスタンプ番号StNとして与えられる。
図56は第2データ保持部43である。図示するように、第2データ保持部43はN個のエントリを有している。第2データ保持部43の各エントリは、下位ビットから順にピクセル0〜ピクセル(N−1)に関する第2データを保持する。第2データ保持部43は、各エントリのエントリ番号がスタンプ番号StNに一致するように、第2データを保持する。すなわち、エントリ0〜(N−1)は、それぞれStN=0〜(N−1)のスタンプの第2データを保持する。従って、図55においてエントリ4にスタンプデータが格納されたスタンプの第2データは、第2データ保持部44のエントリ4に保持される。
図57はメモリ54である。メモリ54はN個のエントリ0〜(N−1)を有するFIFOであり、若い番号のエントリから順に使用される。すなわち、メモリ54のエントリ番号とスタンプ番号とは一致するものではない。例えばメモリ54のエントリ0〜8が使用中であったとすると、次はエントリ9が使用される。エントリ9をStN=4のスタンプが使用すると、バリッドビットEnVが“0”から“1”にセットされ、スタンプ番号StNフィールドに“4”(0100)がセットされる。また第2データ保持部43への第2データの書き込みが終了すると、第2データレディビットRdy2が“0”から“1”にセットされる。更にStN=4のスタンプが、当該タスクに属する最初のスタンプであった場合には、同期ビットSyncが“1”にセットされる。最初でない場合は“0”である。
次に、データ振り分け部30から転送される複数のスタンプと、タスクとの関係について図58を用いて説明する。図58は各種信号のタイミングチャートである。データ振り分け部30は、外部からタスクの開始信号(タスク実行命令)を受けてタスクの処理を開始する。タスク実行命令がアサートされると、命令制御部35はタスク実行可能な状態になる。この状態になると、命令制御部35はピクセルシェーダユニット実行信号をアサートする。ピクセルシェーダユニット実行信号がアサートされることで、タスクが実行される。
あるタスクで処理されるスタンプは、次のようにして受信されたスタンプである。すなわち、
・タスクを実行出来る状態において受信したスタンプ、すなわちタスク実行命令がアサートされてから受信したスタンプのうち、タスク同期信号がアサートされるまでのものであり、更に
・タスクを実行出来る状態より前に受信したスタンプで、前のタスクの終了を示すタスク同期信号がアサートされた後のもの、である。
従って、データ振り分け部30からタスク同期信号のアサートを受けると、それ以降のスタンプは次のタスクのものだと判定される。この際のメモリ54の様子を図59に示す。例えばエントリ9にタスク1の最初のスタンプが保持され、エントリ12にタスク2の最初のスタンプが保持されたとする。するとエントリ9、12にスタンプが保持される際には信号NewTがアサートされるので、これらのエントリの同期ビットSyncが“1”となる。従って、エントリ9〜11がタスク1に属することが分かる。
<クアッドマージ>
以上のようにしてスタンプデータが各レジスタ及びバッファへ書き込まれた後、XYタグが生成され、クアッドマージが行われる(ステップS15)。クアッドマージが行われる条件は下記の通りである。
(1)クアッドマージするスタンプは2個以下であること。
(2)2つのスタンプが時間的に連続していること
(3)2つのスタンプのXY座標が同じこと
(4)マージされるスタンプ(古い方のスタンプ)の残ったピクセルとマージする新規スタンプのピクセルバリッドに重複がないこと。
(5)2つのスタンプが同一タスクに属すること。
クアッドマージが行われなかった場合は、スタンプがそのままスレッドとなる。
クアッドマージにあたって、オーバーラップ検出部45はクアッドマージ動作に必要な情報であるXY座標の同一性を検出する。またスレッド保持部47に必要な、XY座標の一致比較を簡略化するためのXY座標のハッシュ(XYタグ)を生成する。そして、内部に有するXYテーブルにXY座標値を保持させる。XYタグとは、XYテーブルのエントリ番号であり、例えば3ビットである。XYテーブルの各エントリには各スタンプのXY座標と、そのスタンプ番号StNが保持される。XYテーブルのエントリを新規に使用する際は、空いているエントリの内で最もエントリ番号の小さいエントリが選択される。スタンプ処理が終了し、そのXY座標が現在どのスレッドでも使用されていないとき、XYテーブルの対応するエントリは開放される。
また、オーバーラップ検出部45のスレッド保持部選択部63が、新規スレッドを生成される際に使用すべきスレッド保持部エントリを決定する。スレッド保持部選択部63は、スレッド保持部47のバリッドビットEnVを参照して空いているエントリを探し、空いている最も小さいエントリ番号を選択する。選択したエントリ番号をスレッドライトエントリ番号として出力する。このエントリが新規スレッドの書き込み先となる。また、エントリフル信号を生成する。すなわち、スレッド保持部47に空きエントリが無くなればエントリフル信号がアサートされる。
次に、スレッド生成部46がクアッドマージを行うか否かを決定する。すなわち、スレッド生成部46は、如何にして2つのスタンプをマージするかにつき決定し、更に実際にマージ処理を行う。
クアッドマージにあたって、クアッドマージで残ったスタンプデータは、次の新規スタンプがピクセルシェーダユニットに到達するまでマージバッファ84に保持される。また、2つのスタンプの全クアッドを新規スレッドに含めることが出来ない場合がある。この際、マージバッファ84に残されるクアッドは必ず新規スタンプ内のクアッドであり、古いスタンプのクアッドはスレッドとして出力される。マージバッファ84にクアッドが存在しない場合、新規スタンプの全てのクアッドはマージバッファ84に残される。この時スレッドは生成されない。クアッドマージは、出来るだけクアッド位置がオリジナルと変わらないようにして行われる。クアッドの位置にオーバーラップがある場合はマージバッファのクアッド位置は変えず、新規スタンプの位置をずらす。それでもマージできない場合はマージバッファのクアッドの方もずらす。
スレッド生成部46は、クアッドマージを行った際、マージ後のクアッドバリッドと、どのようにマージされたかの情報であるStNum0〜StNum3、QNum0〜QNum3を生成する。また、マージされる2つのスタンプのスタンプ番号StN0、StN1を出力する。StN0の方が古いスタンプである。更にスレッド生成部46は、StN1に相当するスタンプが2スレッドに分割された場合、Divideフラグをアサートする。これをスタンプ保持部44のStN1のエントリに書き込む。
上記の処理を具体的に説明する。スレッド生成部46内のマージバッファ84に残っているスタンプと、新たに入力されたスタンプとが、例えば図60に示すようであったとする。すなわち、マージバッファ84が保持するスタンプは、クアッドQ1がインバリッドで、クアッドQ1〜Q3がバリッドであり、スタンプ番号StNは“4”である。また新規に入力されたスタンプは、クアッドQ0、Q1がバリッドで、クアッドQ2、Q3がインバリッドであり、スタンプ番号StNは“5”である。なお、StN=4のスタンプのクアッドQ1〜Q3、及びStN=5のスタンプのクアッドQ0、Q1を、それぞれクアッド1〜5と呼ぶことにする。
この時、書き込み制御部40内のメモリ54の内容は図61のようであったとする。すなわち、2つのスタンプがメモリ54のエントリ9、10にそれぞれ保持されるとする。すると、エントリ9、10にそれぞれスタンプ番号“4”、“5”が保持される。また、それぞれのエントリの同期ビットSyncは“0”、“1”である。同期ビットSyncから、エントリ9、10に対応する2つのスタンプは同一タスクであることが分かる(2つのエントリの同期ビットSyncが“0”、“0”でも同様)。また、2つのスタンプのXY座標は同一であり、その座標値を“C”と仮定する。
図62は、StN=4のスタンプが入力された際における、オーバーラップ検出部45の備えるXYテーブルである。StN=4のスタンプが入力された時点で、XYテーブルのエントリ0、1、3、4、6が使用中であり、エントリ2、5、7が空いていたとする。また、使用中のエントリには、XY座標“C”は登録されていなかったとする。すると、オーバーラップ検出部45のエントリ部60−0〜60−7において、XY比較結果信号は全てゼロとなり、新たなエントリが割り当てられることになる。新たなエントリは、最もエントリ番号の小さい空きエントリであるから、ここではエントリ2が割り当てられる。すなわち、エントリ割り当て部62は、エントリ2に関するXY割り当て信号をアサートする。新たなエントリが割り当てられたことにより、XY座標テーブル選択部61は、次に使用すべきXYテーブルエントリ信号をアサートする。これにより、XYテーブルのエントリ2のバリッドビットEnVがアサートされ、XY座標値として“C”が書き込まれ、スタンプ番号StN=4が書き込まれる。また、StN=4のスタンプに対して、XYテーブルのエントリ番号と同一の番号“2”がXYタグとして与えられる。
次にStN=5のスタンプが入力された際のXYテーブルについて図63を用いて説明する。StN=5のスタンプはStN=4のスタンプと同一XY座標を有する。従って、エントリ部60−2において、XY比較結果信号がアサートされる。また、同一XY座標であるので新たなエントリは割り当てられないから、エントリ割り当て部62はXY割り当て信号の全てをゼロとする。この結果、XYテーブルのエントリ2には新たにスタンプ番号StN=5が書き込まれる。従って、StN=5のスタンプのXYタグも、StN=4と同じ“2”である。
次に、オーバーラップ検出部45のXYテーブル選択部61が、新規スレッドを生成される際に使用すべきスレッド保持部エントリを決定する。例えばスレッド保持部47は、エントリ0〜3が使用中で、エントリ4〜(N−1)が未使用であったとする。すると、XYテーブル選択部61の優先度エンコーダ73が各エントリのバリッドビットEnVを参照し、最も番号の若い空きエントリ4を選択し、スレッドライトエントリ番号=“4”を出力する。また、スレッド保持部47のエントリにはまだ空きがあるので、XYテーブル選択部61の比較器81はスレッドフル信号をアサートしない。
そして、スレッド生成部46がクアッドマージを決定する。スレッド生成部46は、マージバッファ内のスタンプデータと新規スタンプデータとの関係から、マージ後のスタンプをどのように構成するかについての情報をテーブル(真理値表)として保持する。そのテーブルの一部を図64に示す。図中における各数字0〜3はバリッドなクアッドQ0〜Q3を示しており、横棒(−)はその他のクアッドがインバリッドであることを示す。また、マージ前の欄における“MgBuf”は、クアッドマージを行う前のマージバッファ内のスタンプデータを示し、“NewSt”はクアッドマージを行う前の新規入力スタンプデータを示す。マージ後の欄における「残り」は、クアッドマージ後にマージバッファに残されるスタンプデータを示し。“MgBuf”及び“NewSt”は新規スレッドに含まれるスタンプデータを示す。例えばMgBuf=(0‐‐‐‐)、NewSt=(0123)の場合は次のような意味である。マージバッファ内のスタンプはクアッドQ0のみがバリッドであり、新規入力スタンプはクアッドQ0〜Q3の全てがバリッドである。そしてマージした結果発生されるスレッドのクアッドQ0はマージバッファ内スタンプのクアッドQ0であり、クアッドQ1〜Q3はそれぞれ新規入力スタンプのクアッドQ1〜Q3として形成される。そして新規入力スタンプのクアッドQ0がマージバッファに残される。
図60の場合には、スレッド生成部46、マージバッファ内のスタンプのクアッドバリッドQV及び新規スタンプのクアッドバリッドQVと、真理値表とから図65に示すようにクアッドマージを行うように決定する。すなわち、新規スレッドのクアッドQ0〜Q3が、それぞれStN=5のスタンプのクアッド4及びStN=4のスタンプのクアッド1〜3となるようにマージを行う。そして、位置がクアッド1と同じクアッド5をマージバッファ84に残す。この情報は、第1乃至第3スレッド情報として発生される。
そしてスレッド生成部46は、第1乃至第3スレッド情報に基づいてクアッドマージを実行する。そして、StNum0〜StNum3、QNum0〜QNum3、新規スレッドのクアッドバリッドQVを生成する。また、マージされる2つのスタンプのスタンプ番号StN0、StN1、XYタグが、スレッド生成部46からスレッド保持部47へ出力される。そして、これらの情報がスレッド保持部47のエントリ4に書き込まれる。エントリ4は、オーバーラップ検出部45のスレッド保持部選択部63によって選択されたエントリである。この時のスレッド保持部47の様子を図66に示す。
図示するように、XYテーブル選択部61により選択されたエントリ4のバリッドビットEnVがセットされる。更にエントリ4には、XYタグ、StN0、StN1として、それぞれ“2”、“4”、“5”がセットされる。StN0、StN1はそれぞれマージバッファ内のスタンプ及び新規入力スタンプのスタンプ番号である。また、新規スレッドのクアッドバリッドQVがエントリ4に書き込まれる。新規スレッドのクアッドバリッドQVは4ビットの信号で、それぞれのビットがスレッドのクアッドQ0〜Q3に対応する。従って、図65の場合にはスレッドの全てのクアッドがバリッドであるので、QVとして“1111”がセットされる。また新規スレッドは、クアッドQ0だけが新規入力スタンプのクアッドであるので、StNum0〜StNum3はそれぞれ“1”、“0”、“0”、“0”である。更に新規スレッド内の各クアッドの位置は、クアッドマージ前と同じであるので、QNum0〜QNum3はそれぞれ“00”、“01”、“10”、“11”である。
またスレッド生成部46のディバイドビット発生器87は、クアッドマージの情報に基づいて、新規入力スタンプ(StN=5のスタンプ)の少なくとも一部がマージバッファに残されるか否かを検出する。本例であると、新規入力スタンプのクアッド5がマージバッファに残される。従って、ディバイドビットDivideが“1”にセットされる。ディバイドビットDivideは、スタンプ保持部44においてStN=5のスタンプが保持されるエントリ4に書き込まれる。
<実行スレッド、サブパスの実行管理>
以上のようにしてクアッドマージが終了すると、次に実行スレッド及びサブパスの実行管理を行う(ステップS16)。画像描画処理はスレッド単位で行われ、命令制御部35はスレッドの起動、停止を管理する。また、各スレッドはサブパスという実行単位に分割されて実行される。サブパスの実行終了時には、スレッドの動作を停止し、別の実行可能なスレッドを起動することによって、タイムシェアリングにより複数のスレッドを切り替えながら実行することが出来る。またロック/ロッククリア命令によるサブパスの実行可否を判定して、実行可能なスレッドだけを起動する。
命令制御部35は、次のようにしてスレッド及びサブパスを管理する。すなわち、各ピクセルシェーダユニット34では最大で1つのスレッドについて処理出来る。命令制御部35は、スレッドの処理のためにスレッドを発行する。スレッドが全く発行されていなければ、スレッド保持部47から発行可能ないずれかのスレッドが1つ選択される。イールド命令を実行した際には、そのスレッドの処理は停止され、その時点で発行可能な他のスレッドが起動される。エンド命令が実行され、且つ未取得のテクスチャロード命令が無いことが確認された場合、スレッド保持部47のエントリのバリッドビットEnVがクリアされ、スレッドはデキューされる。発行可能なスレッドがスレッド保持部47に複数ある場合には、古いスレッドから順に発行される。
スレッドは以下のようにして起動される。スレッドは、他のスレッドが実行されておらず、データキャッシュのプリロード要求が発行済みであり、テクスチャデータのロードが終了しており、同一XY座標の他スレッドがロックを取っておらず、且つ実行していないスレッドの中で、自分が最もスレッドIDが小さい場合に発行される。実行可能なスレッドが複数存在した場合は、最も早い時期にプリロード要求を発行したスレッドが発行される。プリロードとは、タスクを実行するために必要なデータを、ローカルメモリ26から読み出し、描画処理部36に転送することである。そして、起動されたスレッドのランビットがセットされる。
スレッドが起動されると、描画処理部36でそのスレッドについてのタスクが実行される。スレッドについてタスクが実行されている間、命令制御部35はそのスレッドのステートを管理する。すなわち、ロック命令が実行された際には、スレッド保持部47のロックビットLckをセットする。またロッククリア命令が実行された際には、スレッド保持部47のロックビットLckをクリアする。テクスチャロード命令群を実行した際には、未取得のテクスチャロード命令数を+1する。
スレッドついてイールド命令が実行された際には、命令制御部35はイールド命令の、次の命令のプログラムカウンタをスレッド保持部47に保存する。そして停止したスレッドのサブパス番号を+1する。更に停止したスレッドのプリロード要求ステートを「未要求」とし、PRELDTIMEを内部カウンタにセットする。そして停止したスレッドのランビットRunをクリアする。
エンド命令が実行されると、命令制御部35はスレッドの停止処理を行う。更に次の処理を行う。エンド命令が実行されると、スレッド保持部47のEndビットをセットしてスレッドが終了したことを記録する。また実行していた(最大2つの)スタンプに対するスタンプ保持部のディバイドビットDivideを参照し、“1”であれば“0”にセットし、“0”ならそのスタンプの処理は終了したと認識してスタンプ保持部からデキューすると共に、外部に対してスタンプを1つ処理したことを示す信号AckEmptyをアサートする。なお、同時に2つのスタンプが終了することがあるので、その場合は2回アサートする。Endビットがセットされており、且つ未取得のテクスチャロード命令が無いとき、スレッド保持部47の当該エントリを無効にする。
また命令制御部35は、ロックの制御を行う。実行可能なスレッドの中には同一XY座標のスタンプの処理を行っているものがある。そこで命令制御部35は、ロック/ロッククリア命令に対応して、同一XYを有するスレッドの排他制御を行う。すなわち、ロックを取っているスレッドと同一XY座標を有するその他のスレッドは発行できなくなる。なお異なるXY座標のスレッド間ではロックは機能しない。
更に命令制御部35は、プリロード命令の発行タイミングを制御する。スレッドがサブパスの実行を終了すると、そのスレッドは「休止状態」となる。休止してから指定された時間が経過すると、命令制御部35はそのスレッドに対するデータ領域のプリフェッチをデータキャッシュに対して要求することが出来る。更にプリフェッチを要求した順番を内部に保持し、その順序が早いものについて、プリロード要求を優先的に起動する。但し、あるタスクに属する最初のスレッドの場合には、スレッドが発行された後、即座にプリロード命令を発行する。
以上の命令制御部35の処理について、命令管理部48とスレッド保持部47とに着目して、以下具体的に説明する。図67のように、3つのスレッド1〜3が処理される場合を仮定する。各スレッド1〜3のスレッドIDはそれぞれTdId=1〜3である。そしてスレッド2、3が同一XY座標である。
スレッド3についてサブパス3が発行される直前のスレッド保持部47を図68に示す。図示するように、スレッド保持部47のエントリ0〜3に、各スレッド1〜3が登録されている。この時点で、スレッド1〜3のサブパスIDはそれぞれ3、3、4である。またスレッド2について、プリロードステートが“10(PLDON)”で、テクスチャロードカウンタTlCがゼロであるので、レディビットRdyが“1”にセットされている。その他のスレッド0、1は、スレッド発行可能な状態にない。
この時点での命令管理部の備えるレディキューテーブルを図69に示す。命令管理部48では、エントリ0〜2にそれぞれスレッドエントリ番号0〜2が保持されている。その他のエントリ3〜(M−1)は未使用である。従って書き込みポインタWrPtrはエントリ3を指している。またエントリ1、2に対応するスレッド2、3は同一XY座標であり、且つサブパスIDが同一である。従って、エントリ2の(スレッド3の)SpRdyビットはゼロであり、サブパスの発行が禁止されている。
従って、スレッド2が最初に発行されて、サブパス3が実行される。スレッド2についてサブパス3が実行されている間のスレッド保持部47を図70に示す。図示するように、この期間にスレッド1のプリロードステートは“10”に遷移する。すなわち、プリロードの発行を終了させる。また、テクスチャロードが完了して、テクスチャロードカウンタがゼロになる。従って、レディビットRdyが“1”にセットされる。スレッド2に関しては、サブパス3をスタートさせると共に、ランビットRunが“1”にセットされ、プリロードステートが“11(PLRUN)”に遷移し、テクスチャロードカウンタTlCがカウントアップを始める。サブパス3が終了してイールド命令を実行すると、スレッド2に関してレディビットRdyがゼロになり、ランビットRunもゼロになる。またサブパスIDが+1されて4になり、プログラムカウンタも+1される。プリロードステートPLは“00(PLWAT)”に遷移する。また、サブパス3の実行中にロック命令が実行され、ロックビットLckが“1”にセットされたとする。
イールド命令が実行された後の命令管理部の様子を図71に示す。図示するように、エントリ1のサブパスIDが3から4にセットされ、ロックビットSptLckも“1”にセットされる。また、スレッド1の処理がスレッド2よりも進んでいるため、エントリ2のSpRdyビットが“0”から“1”に変化する。また、スレッド2とスレッド1のサブパスIDが同一であるので、スレッド2(エントリ1)のSpRdyビットが“1”から“0”に変化する。
スレッド2に関するサブパス3の実行が完了すると、次にスレッド1が発行される。これは図70に示すように、エントリ0のレディビットRdyが“1”であり、エントリ2のレディビットRdyが“0”であるから、更にスレッド2がロックを取っているためスレッド3が発行不可とされているからである。
従って、スレッド1が最初に発行されて、サブパス4が実行される。スレッド1についてサブパス4が実行されている間のスレッド保持部47を図72に示す。図示するように、この期間にスレッド2のプリロードステートは“00”→“01”→“10”に遷移する。すなわち、プリロードの発行を終了させる。また、テクスチャロードが完了して、テクスチャロードカウンタがゼロになる。従って、レディビットRdyが“1”にセットされる。スレッド2に関しては、サブパス4をスタートさせると共に、ランビットRunが“1”にセットされ、プリロードステートが“11”に遷移し、テクスチャロードカウンタTlCがカウントアップを始める。サブパス4が終了してイールド命令が実行されると、スレッド2関してレディビットRdyがゼロになり、ランビットRunもゼロになり、プリロードステートPLは“00(PLWAT)”に遷移する。またサブパスIDが+1されて5になり、プログラムカウンタも+1される。
イールド命令が実行された後の命令管理部の様子を図73に示す。図示するように、エントリ0のサブパスIDが4から5にセットされる。
スレッド1に関するサブパス4の実行が完了すると、次にスレッド2が発行される。これは図72に示すように、エントリ1のレディビットRdyが“1”であり、エントリ2のレディビットRdyが“0”であるからである。これは、エントリ2のスレッド3がエントリ1と同一XY座標であり、エントリ1がロックをとっているからである。
従って、スレッド2が発行されて、サブパス4が実行される。スレッド2についてサブパス4が実行されている間のスレッド保持部47を図74に示す。図示するように、この期間にスレッド3のプリロードステートは“10”に遷移する。また、テクスチャロードが完了して、テクスチャロードカウンタがゼロになる。従って、レディビットRdyが“1”にセットされる。スレッド2に関しては、サブパス4をスタートさせると共に、ランビットRunが“1”にセットされ、プリロードステートが“11”に遷移し、テクスチャロードカウンタTlCがカウントアップを始める。サブパス4が終了してイールド命令が実行されると、スレッド2に関してレディビットRdyがゼロになり、ランビットRunもゼロになる。またサブパスIDが+1されて5になり、プログラムカウンタも+1される。プリロードステートPLは“00(PLWAT)”に遷移する。またサブパス4の実行中にアンロック命令がアサートされて、エントリ1のロックビットLckがゼロにセットされる。
イールド命令が実行された後の命令管理部の様子を図75に示す。図示するように、エントリ1のサブパスIDが4から5にセットされ、ロックビットSptLockがゼロにセットされる。
スレッド2に関するサブパス4の実行が完了すると、次にスレッド3が発行される。これは図74に示すように、エントリ3のレディビットRdyが“1”であり、エントリ0のレディビットRdyが“0”であるからである。更に、エントリ2がアンロック命令を実行したためにロックビットLckが“0”となり、それと同一XY座標のエントリ3のSpRdyが“1”であるためである。
従って、スレッド3が発行されて、サブパス3が実行される。スレッド3についてサブパス3が実行されている間のスレッド保持部47を図76に示す。スレッド2に関しては、ランビットRunが“1”にセットされ、プリロードステートが“11”に遷移し、テクスチャロードカウンタTlCがカウントアップを始める。サブパス3が終了してイールド命令が実行されると、スレッド3に関してレディビットRdyがゼロになり、ランビットRunもゼロになる。またサブパスIDが+1されて4になり、プログラムカウンタも+1される。プリロードステートPLは“00(PLWAT)”に遷移する。またサブパス3の実行中にロック命令がアサートされて、エントリ2のロックビットLckが“1”にセットされる。
イールド命令が実行された後の命令管理部の様子を図77に示す。図示するように、エントリ2のサブパスIDが3から4にセットされ、ロックビットSptLockが“1”にセットされる。
以下上記処理を全てのスレッドがエンド命令を実行するまで継続する。エンド命令が実行され、且つテクスチャロードが完了すると、スレッド保持部47の当該エントリは空きエントリとされる。
以上の処理に従って、描画処理部36が描画処理を行い、また必要に応じてテクスチャマッピングを行う(ステップS17)。テクスチャの読み出しに関して以下説明する。描画処理部36においてテクスチャロード命令Tldが発行されると、テクスチャユニット33に対してテクスチャ取得の要求がなされる。この際命令制御部35は、対応するスレッドのスレッドIDをテクスチャユニット33に送付する。テクスチャユニット33はその処理を終えると、取得したテクスチャデータをテクスチャレジスタに書き込むので、描画処理部36はそのレジスタからテクスチャデータを取得出来る。但し取得できるタイミングは、テクスチャロード命令を発行した次のサブパスである。
テクスチャユニット33はテクスチャロード命令を受け取ると、パイプラインでテクスチャの取得を行う。テクスチャロード命令の処理がパイプラインの最後まで到達すると処理が終了し、テクスチャレジスタにデータが格納される。その後、テクスチャユニット33は命令制御部35に対してアクノリッジ信号を返す。テクスチャロード命令の個数はテクスチャユニット33のパイプラインに依存し、例えば最大で63個である。
命令制御部35は、テクスチャロード命令が発行されたとき、その発行数をカウントする。そしてテクスチャロード命令を終了するたびにカウント数をカウントダウンする。すなわちテクスチャユニット33からアクノリッジ信号が返ってくるたびカウントダウンする。全てのテクスチャロード命令の処理を終了した(カウント数=0)後に、同一スレッドの次のサブパスの実行が許可される。
そして、描画処理部36で描画処理されたスタンプデータは、ローカルメモリ28−0〜28−3のいずれかに格納されて、描画処理が完了する。
上記のように、この発明の第1の実施形態に係るグラフィックプロセッサであると、下記の効果(1)乃至(6)を得ることが出来る。
(1)入力信号を容易に同期させることが出来る。
本実施形態に係るグラフィックプロセッサであると、受信したスタンプデータにそれぞれ固有のスタンプ番号StNを付与している。そして、スタンプデータを受信した際、そのスタンプ番号StNを、書き込み制御部40のメモリ54のエントリに格納している。更に、メモリ54の各エントリには同期ビットSyncが設けられ、タスクの最初のスタンプに対して同期ビットSyncがセット(“1”)される。従って、各エントリに対応するスタンプとタスクとを容易に同期させることが出来る。すなわち、メモリ54の同期ビットSyncを参照することで、各スタンプがどのタスクに属するかを容易に把握出来る。より具体的には、同期ビットSyncがセットされたエントリから、次に同期ビットSyncがセットされたエントリの直前のエントリまでが、同一のタスクに属する。よって、新たに同期ビットSyncがセットされたエントリ以降は、それ以前のエントリとは異なるタスクに属することが分かる。
また、Wデータと、それ以外のデータとの同期も容易となる。書き込み制御部40は、第2データを、それ以外のデータより一定サイクルだけ遅れて受信する。そこで、第2データは、第2データ保持部43においてスタンプ番号StNと同一番号のエントリに保持される。例えばStN=4の第2データは、第2データ保持部43のエントリ4に保持される。従って、第2データがどのスタンプのものであるかを容易に認識できる。また第2データに関しても、メモリ54の同期ビットSyncを参照することで、いずれのタスクに属するのか認識できる。
以上のように、複数の入力信号とタスクとの同期を容易に取ることが出来るため、グラフィックプロセッサの描画信頼性を向上できる。
(2)描画処理に関する処理量を削減出来る。
本実施形態に係るグラフィックプロセッサであると、2つのスタンプのクアッドバリッドを参照して、いずれかのクアッドがインバリッドである場合、これら2つのスタンプをマージしている。従って、インバリッドなクアッドに関する処理を省き、バリッドなクアッドに対してのみ描画処理行うことが出来、処理量を削減できる。その結果、グラフィックプロセッサの不可を軽減すると共に、描画速度を向上できる。
(3)描画処理を効率化出来る(その1)。
本実施形態に係るグラフィックプロセッサであると、オーバーラップ検出部45がXYテーブルを備えている。そして、XYテーブルに保持されるXY座標値と、マージバッファ84に保持されるスタンプのXY座標値とを比較し、一致した場合、当該スタンプをそのエントリに登録している。このようにXYテーブルを保持し、更にエントリ番号をXYタグとして管理することにより、スレッド発行時の処理を簡略化出来ると共に、描画処理を効率化出来る。
また、2つのスタンプが完全にマージされ、スタンプがマージバッファ84に残らなかった場合、2つのスタンプを連続してXYテーブルに登録する。この様子を図78及び図79を用いて説明する。図78はクアッドマージの様子を示す概念図であり、図79はその際のスレッド生成部46及びオーバーラップ検出部45の処理の様子を示すフローチャートである。
図78に示すように、マージバッファにスタンプ番号StN=4のスタンプが保持されている状態において、スタンプ番号StN=5のスタンプが新規入力された場合をステージ1とする。ステージ1では、マージバッファのスタンプはクアッド1のみがバリッドで、新規入力スタンプは全てのクアッド2〜5がバリッドである。従って、これらのスタンプをマージすると、クアッド1、3〜5を含むスレッド(TdID=7)が生成される。そして新規入力スタンプのクアッド2がマージバッファに残される。
次にマージバッファにStN=5のスタンプのクアッド2が保持されている状態において、StN=6のスタンプが新規入力された場合をステージ2とする。ステージ2では、新規入力スタンプは3つのクアッド6〜8がバリッドである。従ってこれらのスタンプをマージすると、クアッド2、6〜8を含むスレッド(TdID=8)が生成される。ステージ2では、2つのスタンプが完全にマージされ、マージバッファにスタンプデータは残されない。
以上のステージ1、2におけるスレッド生成部46及びオーバーラップ検出部45の処理について図79を用いて説明する。まず第1ステージについて説明する。第1ステージは、Aステージ、Bステージ、Cステージの3つの処理ステージを含む。まずAステージにおいて、スレッド生成部46がマージ検出を行う(ステップS20)。これにより2つのスタンプをどのようにマージするかが決定される。またスレッド生成部46はマージバッファのデータをオーバーラップ検出部45に転送する(ステップS30)。そしてオーバーラップ検出部45はXY座標の比較を行う(ステップS40)。
次にBステージでは、スレッド生成部46がステップS20の結果に基づいてクアッドマージを行う(ステップS31)。またオーバーラップ検出部45は、ステップS40の結果に基づいて、XYテーブルのエントリの割り当てを行い、XYタグを生成する。
次にCステージでは、スレッド生成部46がスレッド保持部47へクアッドマージに関する情報を転送する(ステップS32)。以上でステージ1についての処理が終了する。
次にステージ2に関する処理について説明する。ステージ2は、A〜Cステージだけでなく、更にDステージを含む。すなわち、ステージ2でもステージ1と同様に、ステップS20、S31〜S32、S40、S41の処理を行う。しかしステージ2では2つのスタンプの全クアッドがマージされる。従ってオーバーラップ検出部45は、Cステージにおいて新規入力スタンプに関してもXY座標の比較を行う(ステップS42)。そしてDステージにおいて、新規入力スタンプに対して、XYテーブルのエントリの割り当てを行う。
以上のように、全てのクアッドがマージされた場合には、2つのスタンプに関して連続してハッシュ登録することで、描画処理を効率化出来る。
(4)画像描画の信頼性を向上できる(その1)。
本実施形態に係るグラフィックプロセッサでは、新規入力スタンプの一部のクアッドがマージバッファに保持された場合、スレッド生成部46がDivideフラグを立てる。この様子を、図80を用いて説明する。図80はクアッドマージの様子を示す概念図である。
図78に示すように、マージバッファにスタンプ番号StN=4のスタンプが保持されている状態において、スタンプ番号StN=5のスタンプが新規入力された場合をステージ1とする。ステージ1では、マージバッファのスタンプはクアッド1のみがバリッドで、新規入力スタンプは全てのクアッド2〜5がバリッドである。従って、これらのスタンプをマージすると、クアッド1、3〜5を含むスレッド(TdID=7)が生成される。そして新規入力スタンプのクアッド2がマージバッファに残される。よって、スレッド生成部46はディバイドビットを“1”とする。
次にマージバッファにStN=5のスタンプのクアッド2が保持されている状態において、StN=6のスタンプが新規入力された場合をステージ2とする。また、StN=6のスタンプが当該タスクにおける最終スタンプであったとする。ステージ2では、新規入力スタンプは全てのクアッド6〜9がバリッドである。従ってこれらのスタンプをマージすると、クアッド2、7〜9を含むスレッド(TdID=8)が生成される。そして新規入力スタンプのクアッド6がマージバッファに残される。よって、スレッド生成部46はディバイドビットを“1”とする。
次に続くステージ3では、新規入力スタンプは無いので、マージバッファに残ったクアッド6により、スレッド(TdID=9)が生成される。
上記のように、ディバイドビットが“1”にセットされることにより、マージバッファにスタンプデータが残っているかどうかを容易に認識できる。そのため、特に入力スタンプが最終スタンプの場合でも、マージバッファに残されたスタンプデータを新規スレッドとして生成することが出来、クアッドマージ処理の信頼性を向上できる。
(5)描画処理を効率化出来る(その2)
本実施形態に係るグラフィックプロセッサであると、プリロード発行後のスレッド保持部47のPLCntレジスタはエイジレジスタとして機能する。エイジレジスタにより、プリロード発行要求されたスレッドの順序を把握される。そして、エイジレジスタ内の順序に従ってスレッドが発行される。このように、発行可能なスレッドうち、プリロード発行要求の早いものから順番にスレッドが発行されるので、古いスレッドが停滞することを防止し、描画処理を効率化出来る。
(6)描画処理を効率化出来る(その3)
本実施形態に係るグラフィックプロセッサであると、図47を用いて説明したように、各スレッドに対して実行される命令を複数のサブパスに分割している。そして図48に示すように、ピクセルシェーダユニットはスレッドIDにかかわらず、実行可能なスレッドから順にサブパス毎に処理を行う。サブパスを実行した後にはテクスチャロードが行われるので、そのスレッドに関しては次のサブパスを即座に実行することはできない。しかし、その期間を別のスレッドのサブパスを実行しているので、無駄時間が発生することを抑制し、描画処理の効率を向上できる。
また、上記のようにサブパス単位でスレッドを発行するために、プリロードステートが各種のステートを持ち、スレッド保持部47がランビットRun及びレディビットRdyを備えている。そして、これらの条件が揃った場合にのみ、スレッドが発行される。また命令管理部48は、新しいスレッドが、同一XY座標を有する古いスレッドを追い越さないように、スレッド発行順序を制御している。これにより、画像描画信頼性を向上できる。
更に命令制御部35は、ロックビットをセットすることにより、必要に応じて指定するスレッドの発行を強制的に禁止することも出来る。
また命令制御部35は、描画処理部36によりテクスチャロード命令が発行されると、テクスチャユニット33はテクスチャの取得を開始する。そしてテクスチャユニット33は、テクスチャの取得を終了すると、命令制御部35に対してアクノリッジ信号を返す。命令制御部35は、テクスチャロード命令が発行された際、テクスチャユニット33に対して対応するスレッドのスレッドIDを送付する。従って、テクスチャユニット33はどのスレッドに関してアクノリッジ信号を返すべきかを把握することが出来る。
次に、この発明の第2の実施形態に係るグラフィックプロセッサについて説明する。本実施形態は、上記第1の実施形態においてロックの制御に関するものである。従って、グラフィックプロセッサの構成は上記第1の実施形態と同様であるので説明は省略し、第1の実施形態と異なる点についてのみ以下説明する。
本実施形態に係るグラフィックプロセッサが備える命令制御部35は、ロック命令を強制的に無効化させる機能を備えている。すなわち、複数のスレッドが同一のサブパスの実行を待っている場合であり、且つ古いスレッドがロックを取っていない場合には、そのサブパスの実行を待っている全てのスレッドのロックが無効化される。一旦無効化されたロックは復活することなく、またXY座標に関係なく無効化される。この様子を図81に示す。
図示するように、同一XY座標のスレッド2、3がサブパスの実行を待っており、次に実行されるサブパスIDは共に3である。この状態で、スレッド3がロックを取っていた場合には、そのロックは強制的に解除される。
本実施形態に係るグラフィックプロセッサであると、上記第1の実施形態で説明した(1)乃至(6)の効果に加えて、下記(7)の効果を得ることが出来る。
(7)画像描画の信頼性を向上できる(その2)。
本実施形態に係るグラフィックプロセッサによれば、ロックを強制的に解除する機能を備えている。従って、デッドロックの発生を抑制でき、描画処理の信頼性を向上できる。この点につき図82を用いて説明する。図82は図81と同一の条件で、ロックを無効化する機能を有しない場合について示している。
命令制御部35は、同一サブパスの実行を待っている複数のスレッドが存在する場合、古いスレッドだけを実行可能にする。これはスレッドの発行順序を補償するためである。しかし図82の場合、スレッド3がロックを取っているため、同一XY座標のスレッド2は実行できない。他方、スレッド3がサブパス4を実行してしまうと、古いスレッド2のサブパス4を追い越すことになるため、スレッド3のサブパス4も実行できない。このように、実行可能なスレッドが無くなる状態(デッドロック)が生じうる。
しかし本実施形態であると、スレッド3のロックを解除できる。従ってデッドロックの発生を抑制出来る。
なお、上記第1乃至第2の実施形態に係るグラフィックプロセッサは、例えばゲーム機、ホームサーバー、テレビ、または携帯情報端末などに搭載することが出来る。図83は上記第1及び第2の実施形態に係るグラフィックプロセッサを備えたデジタルテレビの備えるデジタルボードのブロック図である。デジタルボードは、画像・音声などの通信情報を制御するためのものである。図示するように、デジタルボード1000は、フロントエンド部1100、画像描画プロセッサシステム1200、デジタル入力部1300、A/Dコンバータ1400、1800、ゴーストリダクション部1500、三次元YC分離部1600、カラーデコーダ1700、LAN処理LSI1900、LAN端子2000、ブリッジメディアコントローラ2100、カードスロット2200、フラッシュメモリ2300、及び大容量メモリ(例えばDRAM)2400を備えている。フロントエンド部1100は、デジタルチューナーモジュール1110、1120、OFDM(Orthogonal Frequency Division Multiplex)復調部1130、QPSK(Quadrature Phase Shift Keying)復調部1140を備えている。
画像描画プロセッサシステム1200は、送受信回路1210、MPEG2デコーダ1220、グラフィックエンジン1230、デジタルフォーマットコンバータ1240、及びプロセッサ1250を備えている。そして、例えばグラフィックエンジン1230及びプロセッサ1250が、上記第1乃至第2の実施形態で説明したグラフィックプロセッサに対応する。
上記構成において、地上デジタル放送波、BSデジタル放送波、及び110°CSデジタル放送波は、フロントエンド部1100で復調される。また地上アナログ放送波及びDVD/VTR信号は、3次元YC分離部1600及びカラーデコーダ1700でデコードされる。これらの信号は、画像描画プロセッサシステム1200に入力され、送受信回路1210で、映像・音声・データに分離される。そして、映像に関しては、MPEG2デコーダ1220を介してグラフィックエンジン1230に映像情報が入力される。するとグラフィックエンジン1230は、上記実施形態で説明したようにして図形を描画する。
図84は、上記第1及び第2の実施形態に係るグラフィックプロセッサを備えた録画再生機器のブロック図である。図示するように、録画再生機器3000はヘッドアンプ3100、モータードライバ3200、メモリ3300、画像情報制御回路3400、ユーザI/F用CPU3500、フラッシュメモリ3600、ディスプレイ3700、ビデオ出力部3800、及びオーディオ出力部3900を備えている。
画像情報制御回路3400は、メモリインターフェース3410、デジタル信号プロセッサ3420、プロセッサ3430、映像処理用プロセッサ3440、及びオーディオ処理用プロセッサ3450を備えている。そして、例えば映像処理用プロセッサ3440及びデジタル信号プロセッサ3420が、上記第1及び第2の実施形態で説明したグラフィックプロセッサに対応する。
上記構成において、ヘッドアンプ3100で読み出された映像データが画像情報制御回路3400に入力される。そして、デジタル信号処理プロセッサ3420から映像情報用プロセッサに図形情報が入力される。すると映像情報用プロセッサ3450は、上記実施形態で説明したようにして図形を描画する。
なお、本願発明は上記実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。更に、上記実施形態には種々の段階の発明が含まれており、開示される複数の構成要件における適宜な組み合わせにより種々の発明が抽出されうる。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、発明が解決しようとする課題の欄で述べた課題が解決でき、発明の効果の欄で述べられている効果が得られる場合には、この構成要件が削除された構成が発明として抽出されうる。
23…グラフィックプロセッサ、24…ラスタライザ、25−0〜25−3…ピクセルシェーダ、26…ローカルメモリ、30…データ振り分け部、31…同期回路、33…テクスチャユニット、34…ピクセルシェーダユニット、35…命令制御部、36…描画処理部、37…データ制御部、40…書き込み制御部、41…コンフィギュレーションレジスタ、42…第1データ保持部、43…第2データ保持部、44…スタンプ保持部、45…オーバーラップ検出部、46…スレッド生成部、47…スレッド保持部、48…命令管理部、49…パフォーマンスモニタ、50…第1ステートマシーン、51…第2ステートマシーン、52…クアッドバリッド発生器、53−0〜53−4…シフトレジスタ、54、57、58…メモリ、60−0〜60−(M−1)…エントリ部、61…XYテーブル選択部、62…エントリ割り当て部、63…スレッド保持部選択部、84…マージバッファ、85…イネーブル信号発生器、86…QV発生器、87…ディバイドビット発生器、88…スレッドID発生器、94…スレッドレジスタ群、95…プリロードブロック、96…アップデート部、97…スレッド発行制御部、151−0〜151−(M−1)…比較回路、159…エントリ回路、170…読み出し回路、171…書き込み回路