(58)【調査した分野】(Int.Cl.,DB名)
圧縮テクスチャのランレングス伸張を実行するステップと、ランレングス伸張されたテクスチャを逆空間周波数変換することによりテクスチャを復元し、テクスチャを部分的にキャッシュするテクスチャプールに復元されたテクスチャを格納するステップとをグラフィックスプロセッシングユニットのコンピュートシェーダに実行させ、
前記ランレングス伸張は、コンピュートシェーダの複数のスレッドによって実行され、各スレッドが前記圧縮テクスチャの空間周波数変換ブロック内で相対的に同じ位置の空間周波数変換係数のランレングス伸張を行うことを特徴とするプログラム。
【発明を実施するための形態】
【0013】
(第1の実施の形態)
図1は、第1の実施の形態に係るグラフィックス処理装置の構成図である。グラフィックス処理装置は、メインプロセッサ100、グラフィックスプロセッシングユニット(GPU)200、およびメインメモリ300を含む。
【0014】
メインプロセッサ100は、単一のメインプロセッサであってもよく、複数のプロセッサを含むマルチプロセッサシステムであってもよく、あるいは、複数のプロセッサコアを1個のパッケージに集積したマルチコアプロセッサであってもよい。メインプロセッサ100はバスを介してメインメモリ300に対してデータを読み書きすることができる。
【0015】
GPU200は、グラフィックプロセッサコアを搭載したグラフィックチップであり、バスを介してメインメモリ300に対してデータを読み書きすることができる。
【0016】
メインプロセッサ100とGPU200は、バスで接続されており、メインプロセッサ100とGPU200は互いにバスを介してデータをやりとりすることができる。
【0017】
同図は、グラフィックス処理の中で特にテクスチャ処理に関する構成を図示しており、それ以外の処理に関する構成は省略している。
【0018】
メインメモリ300のメモリ領域はGPU200からアクセスできるようにGPU200が参照するアドレス空間にメモリマッピングされており、GPU200は、メインメモリ300からテクスチャデータを読み取ることができる。テクスチャデータは、PRT(Partially Resident Textures)と呼ばれる方法を用いて、部分的にメインメモリ300にキャッシュされる。
【0019】
メインプロセッサ100は、グラフィックス演算部20およびPRT制御部10を含む。グラフィックス演算部20は、GPU200のグラフィックス処理部50からテクスチャの詳細度を示すLOD(level of detail)値を受け取り、PRT制御部10にLOD値を渡す。PRT制御部10は、グラフィックス処理部50から受け取ったLOD値にもとづいて、今後必要となるであろうミップマップテクスチャを算出し、テクスチャプールであるPRTキャッシュ320への展開を指示したり、使わなくなったページをはがしたりすることでPRTのマッピングを更新する。
【0020】
図2(a)〜
図2(c)は、ミップマップテクスチャを説明する図である。ミップマップテクスチャは、詳細度(LOD)に応じて解像度を異ならせた複数のテクスチャである。
図2(a)のミップマップテクスチャ340は、高解像度のテクスチャである。
図2(b)のミップマップテクスチャ342は、
図2(a)の高解像度のミップマップテクスチャ340の縦、横のサイズをそれぞれ1/2にした、中解像度のテクスチャである。
図2(c)のミップマップテクスチャ344は、
図2(b)の中解像度のミップマップテクスチャ342の縦、横のサイズをそれぞれ1/2にした、低解像度のテクスチャである。
【0021】
図1に戻り、PRT制御部10は、グラフィックス演算部20に指定された詳細度のミップマップテクスチャを読み出すようにGPU200に指示する。より具体的には、PRT制御部10は、GPU200のランレングス伸張部30および逆離散コサイン変換部40を制御し、また、メインメモリ300に格納されたPRTキャッシュ320のスワップイン、スワップアウトを制御する。
【0022】
GPU200は、ランレングス伸張部30、IDCT部40、およびグラフィックス処理部50を含む。
【0023】
ランレングス伸張部30は、PRT制御部10から指定された詳細度に対応する圧縮テクスチャ310をメインメモリ300から読み出し、圧縮テクスチャ310をランレングス伸張し、DCTブロックリングバッファ80に格納する。
【0024】
IDCT部40は、DCTブロックリングバッファ80に格納されたランレングス伸張後のテクスチャのDCTブロックを逆離散コサイン変換し、PRTキャッシュ320に格納する。
【0025】
グラフィックス処理部50は、PRTキャッシュ320から必要なミップマップテクスチャを読み出す。PRTキャッシュ320は、テクスチャを部分的にキャッシュするテクスチャタイルプールであり、必要なテクスチャをスワップインし、不要なものはスワップアウトする。
【0026】
図3は、本実施の形態のPRTの仕組みを説明する図である。
【0027】
仮想メモリ上にはミップマップテクスチャ340、342、344の領域が配置される。テクスチャの領域を一定のサイズのチャンクに分け、ページテーブル330を用いて、必要なテクスチャ領域だけをテクスチャタイルプール360に格納する。ここで、テクスチャは圧縮テクスチャ310としてメインメモリ300に存在しているため、テクスチャタイルプール360にテクスチャ領域をキャッシュする際、圧縮テクスチャ310を伸張する処理が必要になる。PRT制御部10は、グラフィックス処理部50からの要求に従い、ランレングス伸張部30およびIDCT部40を制御して、必要に応じて圧縮テクスチャ310を伸張させる。
【0028】
同図の例では、高解像度のミップマップテクスチャ340のチャンク352、中解像度のミップマップテクスチャ342のチャンク358は、それぞれページテーブル330のページ332、338に対応づけられており、物理メモリがテクスチャタイルプール360からマップされている。
【0029】
他方、高解像度のミップマップテクスチャ340のチャンク354、中解像度のミップマップテクスチャ342のチャンク356は、それぞれページテーブル330のページ334、336に対応づけられているが、いずれも物理メモリがまだテクスチャタイルプール360からマップされていない。この場合、前述のように、PRT制御部10は、グラフィックス処理部50から受け取ったLOD値にもとづいて必要なテクスチャがテクスチャタイルプール360にあるように制御し、テクスチャタイルプール360の物理メモリが割り当てられ、圧縮テクスチャ310から必要なテクスチャデータが伸張されてテクスチャタイルプール360に格納される。一方、グラフィックス処理部50は、メインプロセッサ100を介することなく、自分自身が計算したLOD値を使ってミップマップテクスチャをテクスチャタイルプール360から読み出す。このとき、もし計算したLOD値に対応するミップマップテクスチャがテクスチャタイルプール360に存在しない場合は、グラフィックス処理部50はフォールバックして、要求する詳細度を下げ、解像度の低いミップマップテクスチャをテクスチャタイルプール360から読み出し、描画する。
【0030】
図4(a)〜
図4(e)は、ランレングス圧縮されたテクスチャのデータ量を説明する図である。
図4(a)に示すように、元のテクスチャデータがRGB32ビットフォーマットで、たとえば16Mib(メビバイト)あるとする。
図4(b)は、BC5またはBC7と呼ばれるテクスチャ圧縮方式により圧縮されたテクスチャであり、元のテクスチャデータに比べておよそ1/4の圧縮率であり、品質を比較的良好に保ったまま、4MiBまでデータ量を削減できる。品質が比較的低くなってもよいのであれば、
図4(c)のように、BC1またはDXT1と呼ばれるテクスチャ圧縮方式により圧縮されたテクスチャを利用してもよく、この場合、元のテクスチャデータに比べておよそ1/8の圧縮率であり、2MiBまでデータ量を削減できる。
図4(a)〜
図4(c)はいずれもGPU200が直接扱うことのできるテクスチャフォーマットである。
【0031】
他方、GPU200が直接扱えなくなるが、
図4(d)のようにJPEGにより圧縮されたテクスチャを利用すれば、元のテクスチャデータに比べておよそ1/20の圧縮率が得られ、0.5〜1MiBまでデータ量を削減できる。この場合、GPU200のコンピュートシェーダではJPEG伸張のような複雑なアルゴリズムを実行することは非効率であり、JPEG伸張を行うことのできる専用ハードウェアがなければ、リアルタイムで圧縮テクスチャを伸張してグラフィックス処理に利用することは難しい。
【0032】
それに対して、
図4(e)に示すように、離散コサイン変換(DCT)とランレングス(Run Length)圧縮を行えば、およそ1/10の圧縮率が得られ、1〜2MiBまでデータ量を削減できる。ここまで高圧縮されると、圧縮テクスチャ310はメインメモリ300に常駐させることが可能になる。GPU200は、メインメモリ300から圧縮テクスチャ310を読み出し、コンピュートシェーダによって、リアルタイムでランレングス伸張および逆離散コサイン変換(IDCT)を実行してテクスチャを復元することが可能である。
【0033】
JPEG圧縮されたテクスチャは、GPU200が直接利用することができないため、JPEGデコーダによっていったん復号する必要がある。JPEGのコーデックが搭載されたグラフィックス装置であれば、JPEG圧縮されたテクスチャにも対応可能であるが、一般にはJPEGのコーデックを利用可能ではない。JPEG圧縮は、画像を離散コサイン変換し、量子化した後、ハフマン符号化を行うものである。ハフマン符号化は複雑な圧縮アルゴリズムであるから、仮にGPU200のコンピュートシェーダがJPEG圧縮されたテクスチャのハフマン復号を行ったとすると、計算量が膨大なものになってしまう。
【0034】
それに対して、ランレングス伸張のような単純な計算はGPU200のコンピュートシェーダによって効率的に実行することができる。
図5〜
図8を参照して、GPU200のコンピュートシェーダがランレングス伸張を効率良く実行できることを説明する。
【0035】
図5(a)〜
図5(c)は、本実施の形態のランレングス圧縮および伸張を説明する図である。
図5(a)はオリジナルデータ列、
図5(b)はランレングス圧縮されたデータ列、
図5(c)はランレングス伸張されたデータ列を示す。
【0036】
本実施の形態のランレングス圧縮では、バイト単位で圧縮を行い、16進数で「00」および「ff」以外の入力値をそのまま出力する。
図5(a)の符号410で示す、最初の6バイトの入力値「3f」、「4d」、「e8」、「02」、「a5」、「01」は、「00」でも「ff」でもないため、
図5(b)のように、そのまま6バイトの出力値「3f」、「4d」、「e8」、「02」、「a5」、「01」として符号化される。
【0037】
本実施の形態のランレングス圧縮では、入力値「00」がn個連続して並ぶ場合、2バイトの出力値「ff」、「n−1」として符号化する。たとえば、
図5(a)の符号420で示すように「00」が7個連続して並ぶ場合、
図5(b)の符号422で示すように2バイトの出力値「ff06」として符号化する。
【0038】
本実施の形態のランレングス圧縮は、実値の「ff」が入力された場合、実値の「ff」であることを識別するために2バイトの「ff00」に変換する。
図5(a)の符号430で示す入力値「ff」は、
図5(b)の符号432で示すように2バイトの出力値「ff00」として符号化される。
【0039】
本実施の形態のランレングス伸張は、ランレングス圧縮の逆の変換を行えばよい。
図5(b)の最初の6バイトの入力値「3f」、「4d」、「e8」、「02」、「a5」、「01」は、
図5(c)に示すようにそのまま出力される。
図5(b)の符号422で示す「ff06」に対しては、
図5(c)の符号424で示すように、最初の「ff」を「00」に変換した後、6個の「00」を出力する。
図5(c)の符号432で示す「ff00」に対しては、これは実値の「ff」であることを示しているから、
図5(c)の符号434で示すように、1バイトの「ff」を出力する。
【0040】
図6は、本実施の形態のランレングス伸張の流れを説明するフローチャートである。
【0041】
変数RLは「00」の出力を繰り返す回数(n−1)を示すものであり、初期値としてRL=0であるから(S10のNo)、入力データ列から1バイトの読み出しが行われる(S20)。ステップS20で読み出したデータが「ff」でない場合(S22のYes)、読み出したデータをそのまま出力し(S24)、ステップS10に戻る。ステップS20で読み出したデータが「ff」である場合(S22のNo)、さらに次の1バイトを読み出す(S30)。
【0042】
ステップS30で読み出されたデータが「00」である場合(S32のYes)、その一つ前に読み出された「ff」が実値であることを意味するから、「ff」を出力し(S34)、ステップS10に戻る。
【0043】
ステップS30で読み出されたデータが「00」でない場合(S32のNo)、変数RLに読み出されたデータを代入する(S40)。これによりRLには、「00」の出力を繰り返す回数(n−1)が代入される。その後、最初の「00」を出力し(S42)、ステップS10に戻る。
【0044】
ステップS24およびステップS34からステップS10に戻った場合、変数RL=0であるから(ステップS10のNo)、ステップS20に進み、それ以降のステップを繰り返す。
【0045】
ステップS42からステップS10に戻った場合、変数RL=n−1であるから(ステップS10のYes)、変数RLから1を引き(S12)、「00」を出力し(S14)、ステップS10に戻る。変数RLが0になるまで、ステップS12およびステップS14が繰り返され、「00」が(n−1)回出力される。
【0046】
本実施の形態のテクスチャ圧縮では、画像のブロックに対して離散コサイン変換(DCT)がなされた後、量子化され、ランレングス圧縮される。自然画を離散コサイン変換すると、周波数成分のほとんどが低周波領域に集中し、高周波成分は無視できるほど小さくなる。特に量子化により、高周波成分のDCT係数はほとんどゼロになる。このことから、ランレングス圧縮の入力データはゼロが多数連続することが多くなる。
【0047】
図6のステップS10、S12、S14を分岐A、ステップS20、S22、S24を分岐B、ステップS30、S32、S34を分岐C、ステップS40、S42を分岐Dとすると、離散コサイン変換後のテクスチャデータはゼロが多数連続することが多いため、ランレングス伸張を行うと、分岐Aを通ることがきわめて多くなる。一般的な自然画のテクスチャの場合、およそ8割以上が分岐Aを通ることが実験的に確かめられている。このランレングス伸張の性質によって、GPU200のコンピュートシェーダが効率良くランレングス伸張を行うことができる。なぜなら、GPU200は、SIMD(Single Instruction Multiple Data)アーキテクチャであり、複数のスレッドが異なるデータに対して同じインストラクションを同時に実行するため、分岐条件に偏りがあれば、並列度が高まり、実行効率が上がる。
【0048】
GPU200は、一つのプログラムカウンタ(PC)がインストラクションキャッシュに格納されたインストラクションを参照し、たとえば16個のALU(Arithmetic Logic Unit)が同時にPCが参照するインストラクションを実行する。if−then−elseループの分岐毎に異なる命令を16個のスレッドにセットして同時に実行することになる。16個のスレッドに対して、if分岐では、if条件が成立する場合(True)のピクセルを担当するスレッドを有効にして並列に実行し、else分岐では、else条件が成立する場合(False)のピクセルを担当するスレッドを有効にして並列に実行する。if条件が成立する場合とelse条件が成立する場合がほぼ同数である場合、Trueの場合とFalseの場合で有効化するスレッドの入れ替えを頻繁に行うことになるが、if条件成立が8割、else条件成立が2割のように偏っていれば、Trueの場合に有効化するスレッドの集合を繰り返し使えるため、実行効率が高まる。
図7および
図8を参照してこの点をより詳しく説明する。
【0049】
図7は、比較のため、分岐先に偏りがない場合のスレッドの実行過程を説明する図である。
【0050】
GPU200は複数の計算ユニット(Computing Unit)を含む。GPU200の1つの計算ユニットで同時に実行されるスレッドの数は計算ユニット内の演算器の数によって決まるが、ここではこれを16個とする。1つの計算ユニットに同時に投入可能な最大16スレッドの集まりを「スレッドセット」と呼ぶ。スレッドセットに含まれる各スレッドは、同じシェーダプログラムを実行するが、処理するデータはそれぞれ異なり、プログラム内に分岐がある場合は、それぞれ別の分岐先をもつことがある。1つの計算ユニットはあるサイクルでは、1つのスレッドセット(ここでは最大16スレッド)を並列に実行する。
【0051】
たとえば、各分岐先での必要な命令数が数個であっても、プラグラムカウンタが1個であり、計算ユニット内のすべての演算器は同一の命令を実行するSIMD構造であるため、スレッドマスクによって実行するスレッドを変えながら各分岐の一つ一つの命令を実行することになる。
【0052】
一例として、
図6のフローチャートの分岐Aは3命令、分岐Bは4命令、分岐Cは2命令、分岐Dは5命令で実行されるとする。
図7の例では、スレッドセット450内の16個のスレッドの分岐先が順にA、A、C、A、A、A、C、B、C、A、C、A、C、A、C、Dである場合を説明している。
【0053】
サイクル1において、分岐Aを実行するスレッドのみ(この場合、8個のスレッド)を有効にし、プログラムカウンタを1つずつ進めながら、分岐Aの3命令A−1、A−2、A−3を実行する。
【0054】
サイクル3において、分岐Bを実行するスレッドのみ(この場合、1個のスレッド)を有効にし、プログラムカウンタを1つずつ進めながら、分岐Bの4命令B−1、B−2、B−3、B−4を実行する。
【0055】
サイクル8において、分岐Cを実行するスレッドのみ(この場合、6個のスレッド)を有効にし、プログラムカウンタを1つずつ進めながら、分岐Cの2命令C−1、C−2を実行する。
【0056】
サイクル10において、分岐Dを実行するスレッドのみ(この場合、1個のスレッド)を有効にし、プログラムカウンタを1つずつ進めながら、分岐Dの5命令D−1、D−2、D−3、D−4、D−5を実行する。
【0057】
このように、
図7の例では、スレッドセットに含まれる16個のスレッドが4つの分岐A〜Dのすべての命令を実行するために、14サイクルが必要となる。
【0058】
図8は、分岐先に偏りがある場合のスレッドの実行過程を説明する図である。
図8の例では、スレッドセット452内の16個のスレッドの分岐先が順にA、A、C、A、A、A、C、C、C、A、C、A、C、A、C、Aである場合を説明している。この例では、シェーダプログラム上は分岐先が4種類あるが、分岐条件が成立するピクセルが偏っており、分岐先が分岐Aと分岐Cの2種類しかない。スレッドセットに含まれる16個のスレッドはこの2種類の分岐だけを実行すればよい。
【0059】
サイクル1において、分岐Aを実行するスレッドのみ(この場合、9個のスレッド)を有効にし、プログラムカウンタを1つずつ進めながら、分岐Aの3命令A−1、A−2、A−3を実行する。
【0060】
サイクル4において、分岐Cを実行するスレッドのみ(この場合、7個のスレッド)を有効にし、プログラムカウンタを1つずつ進めながら、分岐Cの2命令C−1、C−2を実行する。
【0061】
このように、
図8の例では、スレッドセットに含まれる16個のスレッドが2つの分岐A、Cのすべての命令を実行すればよく、必要サイクル数は5サイクルに減る。
【0062】
このように入力されるデータの性質によってプログラムの分岐先に偏りが生じる場合は、同じスレッドマスクをそのまま使って繰り返し命令を実行することができ、実行効率が向上する。分岐先にばらつきがあると、分岐毎にスレッドマスクを切り替えることになり、実行効率が低下する。
【0063】
テクスチャを離散コサイン変換した後、ランレングス圧縮することの利点はここになる。自然画由来のDCT係数の特性から、DCT係数行列の左上の低周波成分に0以外の値が集中し、DCT係数行列の右下の高周波成分に0が連続するようになる。したがって、離散コサイン変換後の画像ブロックをジグザグパターンにより1次元配列にすると、どのブロックのDCT係数も最初は非ゼロの値が続き、後半に0が連続するデータ列となる傾向がある。
【0064】
このDCT係数の傾向を踏まえて、スレッドセットの各スレッドには、異なるDCTブロックのDCT係数を処理するようにランレングス圧縮データを割り当て、各スレッドがDCTブロック内で相対的に同じ位置のDCT係数のランレングス伸張を行うようにスレッドセットを構成する。DCT係数の値が「00」か、「ff」か、それ以外かによって、分岐先が分岐A〜Dのいずれかになる。スレッドセットの構成から、DCTブロック内の相対的に同じ位置ではDCT係数の傾向が似るため、スレッドセット内の各スレッドの分岐先は同じものに偏るようになる。これにより、
図7のように分岐先がばらつくのではなく、
図8のように分岐先が偏るようになり、スレッドセットの効率的な実行状態を長く続けることができる。その結果、スレッドセットによってランレングス伸張は効率良く実行される。
【0065】
本実施の形態のグラフィックス処理装置によれば、離散コサイン変換後にランレングス圧縮されたテクスチャを用いるため、テクスチャ容量を大きく削減することができる。GPU200のコンピュートシェーダが圧縮テクスチャをランレングス伸張し、逆離散コサイン変換するため、高速に圧縮テクスチャを伸張してグラフィックス処理に投入することができる。高圧縮されたテクスチャはメモリに常駐させることができるため、大容量のテクスチャをハードディスクなどの記憶装置から読み出す必要がなく、オンメモリでPRTを実行することが可能である。圧縮テクスチャがオンメモリ化されているため、必要に応じて圧縮テクスチャを読み出し、伸張してPRTキャッシュにスワップインする構成にしても、レイテンシは短く、リアルタイムでテクスチャ処理を実行することができる。
【0066】
(第2の実施の形態)
図9は、第2の実施の形態に係るグラフィックス処理装置の構成図である。第2の実施の形態に係るグラフィックス処理装置は、Zlibエンジン60を備える点が第1の実施の形態とは異なる。第1の実施の形態と共通する構成については適宜説明を省略し、主に第1の実施の形態と相違する構成について詳しく説明する。
【0067】
Zlibエンジン60は、Zlib伸張を実行する専用回路である。Zlibとは、Deflateと呼ばれる可逆圧縮アルゴリズムを実装した、データの圧縮・伸張を行うライブラリである。
【0068】
本実施の形態では、圧縮テクスチャ310として、離散コサイン変換され、ランレングス圧縮された後、Zlibにより可逆圧縮されたテクスチャを利用する。圧縮テクスチャ310はメインメモリ300に格納される。
【0069】
Zlibエンジン60は、メインメモリ300に格納された圧縮テクスチャ310をZlib伸張し、ランレングスブロックリングバッファ70に格納する。
【0070】
ランレングス伸張部30は、ランレングスブロックリングバッファ70に格納されたZlib伸張後の圧縮テクスチャをランレングス伸張してDCTブロックリングバッファ80に格納する。それ以降の処理は第1の実施の形態と同じである。
【0071】
図10(a)〜
図10(f)は、Zlib圧縮されたテクスチャのデータ量を説明する図である。
図10(a)〜
図10(c)のGPU200により扱うことのできる圧縮テクスチャは、
図4(a)〜
図4(c)と同じであるから説明を省略する。
【0072】
図10(d)〜
図10(f)は、GPU200が直接扱えない圧縮テクスチャである。
図10(e)の離散コサイン変換およびZlib圧縮されたテクスチャは、
図10(d)のJPEG圧縮されたテクスチャと同様におよそ1/20の圧縮率が得られる。しかしながら、後述するようにDCT係数をそのままZlib圧縮すると、伸張時にZlibエンジン60に通常のハードウェア性能を超える負荷を課すことになり、効率が悪い。そこで、本実施の形態では、
図10(f)に示すように、離散コサイン変換およびランレングス圧縮後にZlib圧縮されたテクスチャを用いる。
【0073】
図11(a)および
図11(b)は、本実施の形態においてテクスチャをランレングス圧縮する利点を説明する図である。
【0074】
図11(a)は、比較のため、ランレングス圧縮していないテクスチャをZlibエンジン60でZlib伸張する場合を示す。圧縮テクスチャの圧縮率が1/20である場合、Zlibエンジン60が50MB/s(メガバイト/秒)の転送速度で圧縮テクスチャの入力を受けた場合、1333MB/sの転送速度でZlib伸張されたテクスチャを出力する必要がある。Zlib伸張されたテクスチャはIDCT部40により逆離散コサイン変換され、1000MB/sの転送速度で復元されたテクスチャが出力される。
【0075】
Zlibエンジン60の通常の入出力比は2〜4倍である。それに対して、ランレングス圧縮していないテクスチャの場合は、約20倍の出力性能を要求されることになるが、Zlibエンジン60の通常のハードウェア制限を超えるため、実装するのは現実的ではない。通常の出力性能のZlibエンジン60を用いると、要求される出力性能が出せないために、Zlibエンジン60の出力がボトルネックとなり、テクスチャの復元にかかる時間が極端に長くなってしまう。
【0076】
図11(b)は、ランレングス圧縮されたテクスチャをZlibエンジン60でZlib伸張する場合を示す。この場合、Zlibエンジン60が50MB/s(メガバイト/秒)の転送速度で圧縮テクスチャの入力を受けた場合、125MB/sの転送速度でZlib伸張されたテクスチャを出力すればよい。なぜなら、その後、ランレングス伸張部30がZlib伸張されたテクスチャをランレングス伸張し、1333Mb/sの転送速度で出力することができるからである。ランレングス伸張されたテクスチャはIDCT部40により逆離散コサイン変換され、1000MB/sの転送速度で復元されたテクスチャが出力される。
【0077】
ランレングス伸張部30とIDCT部40は、ともにGPU200のコンピュートシェーダにより実行されるから、データ転送の帯域幅は十分に大きく、ランレングス伸張部30からIDCT部40のデータの受け渡しは、1333Mb/sの転送速度を実現可能である。この場合、Zlibエンジン60の出力性能は2倍程度で済むから、通常のハードウェア制限の範囲で実装することができる。
【0078】
図12は、本実施の形態のグラフィックス処理装置による圧縮テクスチャの伸張処理の性能を説明する図である。一例として、縦640画素、横640画素の圧縮テクスチャを伸張する場合を説明する。ここではGPU200は一例として18個の計算ユニット(CU)をもつ。Zlibエンジン60は、テクスチャ伸張以外の用途にも用いられるため、ここでは、出力性能が200Mib/sのZlibエンジン60のリソースの一部を用いて、26Mib/sで圧縮テクスチャをZlib伸張する。これには6.2ms(ミリ秒)かかる。その後、1つのCUを用いてランレングス伸張を行うが、これは1.3msかかる。その後、逆離散コサイン変換は18個のCUを用いて行うが、これは0.3msかかる。合計でメインメモリ300上の圧縮テクスチャを伸張するのに8msのレイテンシとなり、リアルタイムで圧縮テクスチャを伸張してグラフィックス処理に投入することができる。
【0079】
仮にランレングス圧縮しないテクスチャを用いると、通常の出力性能のZlibエンジン60では、圧縮テクスチャをZlib伸張するのに約10倍の62msがかかることになり、実用に耐えなくなる。ランレングス圧縮されたテクスチャを利用することで、Zlibエンジン60に与える負荷を軽くし、ランレングス伸張をコンピュートシェーダで高速に行うことで、圧縮テクスチャの伸張処理によるレイテンシを短くすることができる。
【0080】
第2の実施の形態のグラフィックス処理装置によれば、離散コサイン変換およびランレングス圧縮後にZlib圧縮されたテクスチャを用いるため、JPEG圧縮と同様にテクスチャ容量を大きく削減することができる。このように高圧縮されたテクスチャはメモリに常駐させることができ、オンメモリでPRTを実行することが可能である。
【0081】
Zlibデコーダを備えるグラフィックス処理装置において、Zlib圧縮の前にランレングス圧縮されたテクスチャを利用することで、圧縮テクスチャの伸張時にZlibデコーダにかかる負荷を抑えることができる。
【0082】
また、第1の実施の形態と同様、GPU200のコンピュートシェーダが圧縮テクスチャをランレングス伸張し、逆離散コサイン変換するため、高圧縮されたテクスチャをリアルタイムで伸張してグラフィックス処理に投入することができる。
【0083】
以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【0084】
上記の実施の形態では、圧縮テクスチャをメモリに格納したが、圧縮テクスチャをハードディスクや光ディスクなどの記録媒体に格納してもよい。テクスチャは高圧縮されているため、記憶容量を抑えることができ、また、オンメモリの場合のレイテンシにはかなわないが、記録媒体からの読み出しのレイテンシをある程度抑えることもできる。
【0085】
上記の実施の形態では、画像の空間領域を空間周波数領域に変換する空間周波数変換の一例として、離散コサイン変換を用いたが、これ以外の空間周波数変換、たとえば離散フーリエ変換を用いてもよい。
【0086】
上記の実施の形態では、ランレングス圧縮の一例として、「00」が連続した場合に、特定の符号「ff」と「00」が連続した長さの組み合わせで符号化したが、ランレングス圧縮はこれ以外の方法を用いてもよい。たとえば、「00」以外の値が連続した場合に特定の符号と連続した長さで符号化してもよい。
【0087】
上記の実施の形態では、Zlibデコーダがハードウェアとして利用できる場合を説明したが、Zlib以外の圧縮アルゴリズムで圧縮されたデータを伸張するデコーダがハードウェアとして実装されている場合にも、本発明の実施の形態を適用することができる。