[0018]本開示は、GPUアクセラレーテッドパスレンダリングを実行するための技法に関する。パスレンダリングは、その各々が1つまたは複数のパスセグメントを含み得る(あるいは、本明細書で「パス」と呼ばれる)2次元(2D)ベクタグラフィックスパスのレンダリングを指す場合がある。パスが2つ以上のパスセグメントを含むとき、個々のパスセグメントは、同じタイプまたは異なるタイプのものであり得、「プリミティブタイプ」とも呼ばれる。パスセグメントのプリミティブタイプは、たとえば、線、楕円弧、2次ベジェ曲線、および3次ベジェ曲線などを含み得る。いくつかの例では、パスセグメントタイプは、たとえば、Open Vector Graphics(OpenVG)APIなど、標準ベクタグラフィックスアプリケーションプログラミングインターフェース(API)に従って定義され得る。
[0019]グラフィックス処理ユニット(GPU)は、1つまたは複数の3DグラフィックスAPIに対応するように設計された3次元(3D)グラフィックスパイプラインを実装するように構成され得る。今日使用されている一般的な3DグラフィックスAPIは、対応デバイス(たとえば、GPU)がパスレンダリングコマンドをサポートすることを必要としないため、多くの場合、現代的なGPUがパスレンダリングコマンド用のハードウェアアクセラレーションを提供することはほとんどない。たとえば、現代的なGPUで実装される典型的な3Dグラフィックスパイプラインは、(たとえば、点、線、および三角形など)低次の、湾曲していない3Dグラフィックスプリミティブをラスタライズするように設計されるが、(たとえば、楕円弧、およびベジェ曲線など)湾曲したパスレンダリングプリミティブを直接的にレンダリングすることができない場合があるラスタライザを含み得る。
[0020]パスレンダリングに関する一手法は、パスレンダリングコマンドを実行する目的で部分的なGPUハードウェアアクセラレーションを提供するために3D GPUプラインを使用することに関連し得る。この手法は、パスセグメントを、GPUによってラスタライズされ得る、1つまたは複数の低次の、湾曲していないグラフィックスプリミティブに変換するために、別のプロセッサ(たとえば、中央処理装置(CPU))を用いてパスセグメントを前処理することに関連する。グラフィックスプリミティブを指定するために、アプリケーションは、「描画呼出し」と呼ばれるグラフィックスAPIの1つまたは複数の関数を呼び出すことができる。
[0021]描画呼出しは、引数として、頂点バッファを含み得る。頂点バッファは1つまたは複数の頂点を含む。描画呼出し内で指定される頂点バッファの頂点は、一般に、単一のプリミティブタイプに限定され、異なるプリミティブタイプと関連付けられた頂点は、追加の後続の描画呼出し内で指定されなければならない。描画呼出しは、従来は、頂点バッファの頂点が同じプリミティブタイプのものであることを必要とするため、GPUは頂点の各々がどのプリミティブに属するかをさらに容易に決定することができる。たとえば、GPUが、各2次ベジェ曲線(「クワッド(quad)」)が3つの頂点を有し、描画呼出しによって指定された特定の頂点バッファの頂点の各々がクワッドに属すると決定した場合、GPUは、2つおきの頂点が新しいクワッドプリミティブの開始を標示すると推論することができる。
[0022]しかしながら、たとえば、パスレンダリングを実行するとき、レンダリングされることになるプリミティブタイプの各々に対応する異なる描画呼出しを実行することに関連するかなりのオーバーヘッドが存在する。各描画呼出しは、割振りのための処理時間とメモリとを必要とする、別個の頂点バッファの割振りを必要とする。同様にいくつかの例では、CPUは、頂点バッファにメモリを割り振り、頂点バッファデータをGPUに転送することができる。各CPU・GPU転送は、複数の異なるパスレンダリングタイプの各々に対応する描画呼出しを実行するとき、パスベースレンダリングを実行する性能を低減し得る大量のレイテンシをもたらし得る。
[0023]いくつかの例では、GPUは、たとえば、MicrosoftのDirectX 11 APIなど、特定の3DグラフィックスAPIによって指定されたグラフィックスアーキテクチャを使用して、パスセグメントをテッセレートおよびレンダリングすることができる。下でより詳細に説明するように、本開示で説明する技法は、パスレンダリングを実行するためのグラフィックスハードウェア、具体的には、入力アセンブラ段階、ハルシェーダ段階、ドメインシェーダ段階、およびジオメトリシェーダ段階に対する可能な修正について説明する。このようにして、本開示で説明する技法は、DirectX 11アーキテクチャのグラフィックスハードウェアが、複数の異なるプリミティブタイプと関連付けられた頂点を含む頂点バッファを使用して、パスレンダリングを実行するのを可能にする。
[0024]本開示による技法は、GPUが複数の異なるプリミティブタイプに対応する頂点の頂点バッファを受け取るのを可能にする。グラフィックスレンダリングを実行するアプリケーションを実行するとき、CPUまたは別の処理ユニットは、頂点データ(すなわち、頂点)を記憶するためのバッファをシステムメモリ内に割り振ることができる。CPUは、実行アプリケーションの命令に基づいて頂点データを生成し、それらの頂点を頂点バッファに割り振られたメモリ内に記憶することができる。いくつかの頂点がCPUによって頂点バッファに記憶されると、CPUはシステムメモリ内に記憶された頂点バッファをGPUに転送することができる。GPUは、次いで、頂点バッファの頂点を受け取り、たとえば、GPUのメモリ内に記憶する。
[0025]異なるプリミティブタイプに対応する頂点を有する単一の頂点バッファをサポートするために、本開示の技法は新しい描画呼出しを含む。新しい描画呼出しは、呼出しに対する引数として、複数のプリミティブタイプと関連付けられることがきる頂点を有する頂点バッファを含む。新しい描画呼出しはまた、引数として、追加のプリミティブタイプバッファ(「primtypeバッファ」)を含む。primtypeバッファの値は、頂点バッファの1つまたは複数の頂点が関連付けられたプリミティブタイプを示す1つまたは複数のプリミティブタイプエントリを備え得る。primtypeバッファ内に記憶された値に基づいて、GPUは、頂点バッファの頂点の各々と関連付けられたプリミティブタイプを決定し、各プリミティブと関連付けられた頂点を含む各プリミティブの表現を記憶する。
[0026]本開示の例示的な技法はまた、複数の異なるプリミティブタイプの頂点バッファの頂点をサポートするためのグラフィックスパイプラインに対する修正を含む。本開示の技法は、頂点バッファ値およびprimtypeバッファ値を解釈することができる入力アセンブラと、入力アセンブラ段階から受け取られたプリミティブタイプ状態値に部分的に基づいて、複数のプリミティブに関する制御点を生成することができるハルシェーダ段階とを含む。本開示のグラフィックスパイプラインはまた、ハルシェーダによって生成された制御点に基づいてドメイン座標を作り出すテッセレータ段階と、テッセレータによって生成されたドメイン座標および入力アセンブラから受け取られたプリミティブタイプ状態値に基づいて、頂点データを生成するドメインシェーダとを含む。本開示の技法は、入力アセンブラによって生成されたプリミティブ状態に基づいて、3D頂点座標を出力するように構成されたジオメトリシェーダ段階をさらに含む。
[0027]パスレンダリングは、2つの主な動作、すなわち、(1)パスセグメントのフィル(filling)と、(2)パスセグメントのストローク(stroking)とに分割され得る。いくつかの例では、パスを完全にレンダリングするために、フィルおよびストロークのうちの1つまたはそれらの両方が実行され得る。概念的に、フィル動作は、指定されたフィル色を用いてパスセグメントの内部領域をフィルすることに対応し得る。
[0028]ストローク動作は、概念的に、パスに垂直に保持された直線ペンを使用して、パスセグメントの縁を「拡大すること」に対応し得る。主な動作に加えて、パスレンダリングは、様々なタイプのダッシング、エンドキャップをパスの終端に適用することと、パスの内部パスセグメントの終点同士の間に様々なタイプの接合を適用することと、リテッセレーションを使用してカスプを処理することとに関連する場合もある。
[0029]GPUは、「テッセレーションユニット」、すなわち、テッセレータとも呼ばれるテッセレーション段階を使用して、プリミティブ、すなわち、パスセグメントをテッセレート(たとえば、分割)することができる。GPUがパスセグメントをテッセレートした後、GPUは、テッセレータ段階が決定して、GPUグラフィックスレンダリングパイプライン内の後続の段階に出力するドメイン座標に基づいて3D形状を生成するように構成され得る。グラフィックスパイプラインの後続の段階は、テッセレータ段階の出力に基づいて、頂点座標を生成することができる。
[0030]図1は、本開示のGPUアクセラレーテッドパスレンダリング技法を実装するために使用され得る例示的なコンピューティングシステム2を示すブロック図である。コンピューティングデバイス2は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、タブレットコンピューティングデバイス、ビデオゲームプラットフォームもしくはコンソール、(たとえば、モバイル電話、セルラー電話、衛星電話、および/もしくはモバイル電話ハンドセットなど)ワイヤレス通信デバイス、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末(PDA)などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および/もしくは表示する任意の他のタイプのデバイスを備えることができる。
[0031]図1の例に示すように、コンピューティングデバイス2は、ユーザインターフェース4と、CPU6と、メモリコントローラ8と、メモリ10と、グラフィックス処理ユニット(GPU)12と、GPUキャッシュ14と、ディスプレイインターフェース16と、ディスプレイ18と、バス20とを含む。ユーザインターフェース4、CPU6、メモリコントローラ8、GPU12、およびディスプレイインターフェース16は、バス20を使用して互いと通信することができる。図1に示す異なる構成要素同士の間のバスおよび通信インターフェースの特定の構成は単なる例示であり、本開示の本技法を実装するために、同じもしくは異なる構成要素を備えたコンピューティングデバイスおよび/または他のグラフィックス処理システムの他の構成が使用され得ることに留意されたい。
[0032]CPU6は、コンピューティングデバイス2の動作を制御する汎用プロセッサまたは専用プロセッサを備えることができる。ユーザは、CPU6に1つまたは複数のソフトウェアアプリケーションを実行させるための入力をコンピューティングデバイス2に与えることができる。CPU6上で実行されるそれらのソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、ユーザインターフェース4を介してコンピューティングデバイス2に結合される、キーボード、マウス、マイクロフォン、タッチパッドまたは別の入力デバイスなど、1つもしくは複数の入力デバイス(図示せず)を介してコンピューティングデバイス2に入力を与えることができる。
[0033]CPU6上で実行するソフトウェアアプリケーションは、グラフィックスデータをディスプレイ18にレンダリングさせるようにGPU12に命令する、1つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、たとえば、Open Graphics Library(OpenGL(商標登録))API、Open Graphics Library Embedded System(OpenGL ES)API、Direct3D API、DirectX API、RenderMan API、WebGL API、OpenVG(登録商標)、または任意の他の公的もしくは所有権を主張できる標準グラフィックスAPIなど、グラフィックスアプリケーションプログラミングインターフェース(API)に準拠し得る。グラフィックスレンダリング命令を処理するために、CPU6は、GPU12にグラフィックスデータのレンダリングのうちの一部またはすべてを実行させるようにGPU12に命令するための、1つまたは複数のグラフィックスレンダリングコマンドを発行することができる。いくつかの例では、レンダリングされることになるグラフィックスデータは、1つまたは複数の頂点バッファを含み得る。頂点バッファは、たとえば、点、線、三角形、四角形、トライアングルストリップ(triangle strips)、パッチなど、グラフィックスプリミティブのリストを含み得る。さらなる例では、レンダリングされることになる頂点バッファグラフィックスデータは、たとえば、ラインセグメント、楕円弧、二次ベジェ曲線、および三次ベジェ曲線など、1つまたは複数のパスレンダリングプリミティブを含み得る。
[0034]メモリコントローラ8は、メモリ10との間を行き来するデータの転送を容易にする。たとえば、メモリコントローラ8は、メモリ読取り要求とメモリ書込み要求とをCPU6および/またはGPU12から受け取って、コンピューティングデバイス2内の構成要素にメモリサービスを提供するために、メモリ10に関するそのような要求にサービス提供することができる。メモリコントローラ8はメモリ10に通信可能に結合される。メモリコントローラ8は、図1の例示的なコンピューティングデバイス2内で、CPU6、GPU12、およびメモリ10の各々とは別である処理モジュールとして示されているが、他の例では、メモリコントローラ8の機能の一部またはすべては、CPU6、GPU12、およびメモリ10のうちの1つもしくは複数の上で実装され得る。
[0035]メモリ10は、CPU6による実行のためにアクセス可能なプログラムモジュールおよび/もしくは命令、ならびに/またはCPU6上で実行するプログラムによって使用するためのデータを記憶することができる。たとえば、メモリ10は、ユーザアプリケーションと、それらのアプリケーションと関連付けられたグラフィックスデータとを記憶することができる。メモリ10は、コンピューティングデバイス2の他の構成要素によって使用するため、および/または生成されるための情報を記憶することも可能である。たとえば、メモリ10は、GPU12のデバイスメモリとして機能することができ、GPU12によって演算されことになるデータ、ならびにGPU12によって実行される演算の結果生じるデータを記憶することができる。たとえば、メモリ10は、パスデータ、パスセグメントデータ、表面、テクスチャバッファ、デプスバッファ、ステンシルバッファ、頂点バッファ、フレームバッファなどの任意の組合せを記憶することができる。加えて、メモリ10は、GPU12によって処理するためのコマンドストリームを記憶することができる。たとえば、メモリ10は、パスレンダリングコマンド、3Dグラフィックスレンダリングコマンド、および/または汎用GPU(GPGPU)コンピューティングコマンドを記憶することができる。メモリ10は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、同期式ダイナミックランダムアクセスメモリ(SDRAM)、読取り専用メモリ(ROM)、消去可能プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM(登録商標))、フラッシュメモリ、磁気データ媒体または光記憶媒体など、1つもしくは複数の揮発性または不揮発性のメモリあるいは記憶デバイスを含み得る。
[0036]GPU12は、CPU6によってGPU12に発行されたコマンドを実行するように構成され得る。GPU12によって実行されるコマンドは、グラフィックスコマンド、本開示の技法による描画呼出し(draw call)コマンド、GPU状態プログラミングコマンド、メモリ転送コマンド、汎用コンピューティングコマンド、カーネル実行コマンド、テッセレーションコマンドなどを含み得る。
[0037]いくつかの例では、GPU12は、ディスプレイ18に1つまたは複数のグラフィックスプリミティブをレンダリングするためのグラフィックス演算を実行するように構成され得る。そのような例では、CPU6上で実行するソフトウェアアプリケーションの1つがグラフィックス処理を必要とするとき、CPU6は、ディスプレイ18にレンダリングするためのグラフィックスデータをGPU12に提供して、GPU12に対する1つまたは複数のグラフィックスコマンドを発行することができる。グラフィックスコマンドは、たとえば、描画呼出しコマンド、GPU状態プログラミングコマンド、条件付きコマンド、メモリ転送コマンド、ブリッティング(blitting)(ブロック転送またはBLT)コマンド、テッセレーションコマンドなどを含み得る。グラフィカルデータは、頂点データ、テクスチャデータ、表面データなどを含み得る。いくつかの例では、CPU6は、コマンドとグラフィックスデータとをGPU12によってアクセス可能なメモリ10に書き込むことによって、コマンドとグラフィックスデータとをGPU12に提供することができる。
[0038]本開示の技法によれば、CPU6は、描画呼出しを使用してグラフィックスデータをGPU12に提供することができる。描画呼出しは、引数として、複数の異なる頂点タイプの頂点を含む頂点バッファまたは頂点バッファに対するポインタを受け取ることができる。描画呼出しはまた、引数として、primtypeバッファを受け取ることができる。primtypeバッファの(エントリとも呼ばれる)値は、頂点バッファ内に含まれた1つまたは複数の頂点と関連付けられた対応するプリミティブタイプを示し得る。描画呼出しは、いくつかの例では、引数として、頂点バッファおよびprimtypeバッファに対するポインタをやはり受け取ることができる。頂点バッファおよびprimtypeバッファはメモリ10内に記憶される。
[0039]CPU6は、メモリ10の一部を頂点バッファとprimtypeバッファとに割り振ることができる。CPU6は、頂点バッファに関する頂点データを生成し、たとえば、描画呼出しを介して、バス20を使用して、メモリの割り振られた部分にそれらの頂点を転送することができる。プログラムがCPU6に描画呼出しを呼び出させるとき、CPU6は、メモリコントローラ8に、バス20を使用して、頂点バッファデータおよびprimtypeバッファデータをGPU12に転送させることができる。GPU12は、頂点バッファデータおよびprimtypeバッファデータをCPUのメモリ内に記憶することができる。
[0040]GPU12は、グラフィック演算についてCPU6よりも効率的な処理を行う高並列構造を用いて構築され得る。たとえば、GPU12は、複数の頂点、制御点、画素および/または他のデータに関して並列な形で演算するように構成された複数の処理要素を含み得る。GPU12の高並列性質は、いくつかの例では、GPU12が、CPU6を使用して画像をレンダリングするよりもより迅速にグラフィックス画像(たとえば、GUIおよび2次元(2D)ならびに/または3次元(3D)のグラフィックスシーン)をディスプレイ18上にレンダリングするのを可能にする。加えて、GPU12の高並列性質は、GPU12が、CPU6よりもより迅速に、汎用コンピューティングアプリケーションに関して、ある種のタイプのベクトル演算および行列演算を処理するのを可能にし得る。
[0041]下でより詳細に説明する、本開示の技法によれば、GPU12は、異なるプリミティブタイプの頂点を備えた単一の頂点バッファを受け取るように構成され得る。上で説明したように、GPU12は、CPU6によって開始されたメモリ転送によって、システムメモリ10から頂点バッファ40のうち1つの頂点バッファを受け取ることができる。GPU12はまた、頂点バッファの頂点のプリミティブタイプを示すprimtypeバッファを受け取るように構成され得る。本開示による一例として、GPU12は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、GPU12の頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの1つまたは複数と関連付けられる、構成され得る。GPU12は、複数の頂点と、関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定し、複数の頂点と、プリミティブタイプバッファの関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることができる。
[0042]いくつかの例では、GPU12は、コンピューティングデバイス2のマザーボードに統合され得る。他の例では、GPU12は、コンピューティングデバイス2のマザーボードにおけるポートに設置されるグラフィックスカード上に存在し得るか、または場合によっては、コンピューティングデバイス2と相互運用するように構成された周辺デバイス内に組み込まれ得る。さらなる例では、GPU12は、システムオンチップ(SoC)を形成するCPU6と同じマイクロチップ上に配置され得る。GPU12は、1つもしくは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、あるいは他の等価な集積論理回路または個別論理回路など、1つもしくは複数のプロセッサを含み得る。
[0043]いくつかの例では、GPU12はGPUキャッシュ14に直接結合され得る。したがって、GPU12は、必ずしもバス20を使用せずに、GPUキャッシュ14からデータを読み取り、GPUキャッシュ14にデータを書き込むことができる。言い換えれば、GPU12は、オフチップメモリの代わりに、ローカルストレージを使用してデータをローカルで処理することができる。これにより、GPU12は、大量のバストラフィックを受けることがある、バス20を介したデータの読取りおよび書込みの必要がなくなるので、より効率的な方法で動作できるようになる。しかしながら、いくつかの例では、GPU12は、別個のキャッシュを含まず、代わりに、バス20を介してメモリ10を利用することができる。GPUキャッシュ14は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能プログラマブルROM(EPROM)、電気消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体または光学データ媒体など、1つもしくは複数の揮発性または不揮発性のメモリあるいは記憶デバイスを含み得る。
[0044]CPU6および/またはGPU12は、レンダリングされた画像データをメモリ10内に割り振られたフレームバッファ内に記憶することができる。レンダリングされた画像データは、レンダリングされることになるパスセグメントに関してレンダリングされたフィル領域とストローク領域とを含み得る。ディスプレイインターフェース16は、データをフレームバッファから取り出して、レンダリングされた画像データによって表される画像を表示するようにディスプレイ18を構成することができる。いくつかの例では、ディスプレイインターフェース16は、フレームバッファから取り出されたデジタル値をディスプレイ18によって消費され得るアナログ信号に変換するように構成されたデジタルアナログ変換器(DAC)を含み得る。他の例では、ディスプレイインターフェース16は、処理のために、デジタル値をディスプレイ18に直接的に渡すことができる。
[0045]ディスプレイ18は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ(LCD)、プラズマディスプレイパネル、発光ダイオード(LED)アレイ、陰極線管(CRT)ディスプレイ、電子ペーパー、表面伝導型電子放出素子ディスプレイ(SED)、レーザテレビジョンディスプレイ、ナノ結晶ディスプレイまたは別のタイプのディスプレイユニットを含み得る。ディスプレイ18はコンピューティングデバイス2内に統合され得る。たとえば、ディスプレイ18は、モバイル電話ハンドセットまたはタブレットコンピュータのスクリーンとすることができる。あるいは、ディスプレイ18は、ワイヤード通信リンクまたはワイヤレス通信リンクを介してコンピュータデバイス2に結合されるスタンドアロンデバイスとすることができる。たとえば、ディスプレイ18は、ケーブルリンクまたはワイヤレスリンクを介してパーソナルコンピュータに接続されるコンピュータモニタまたはフラットパネルディスプレイとすることができる。
[0046]バス20は、第1世代、第2世代、および第3世代のバス構造ならびにバスプロトコルと、共有バス構造およびバスプロトコルと、ポイントツーポイントバス構造およびバスプロトコルと、一方向バス構造およびバスプロトコルと、双方向バス構造およびバスプロトコルとを含めて、バス構造およびバスプロトコルの任意の組合せを使用して実装され得る。バス20を実装するために使用され得る様々なバス構造およびバスプロトコルの例は、たとえば、HyperTransportバス、InfiniBandバス、Advanced Graphics Port(AGP)バス、Peripheral Component Interconnect(PCI)バス、PCI Expressバス、Advanced Microcontroller Bus Architecture(AMBA)Advanced High−performance Bus(AHB)、AMBA Advanced Peripheral Bus(APB)、およびAMBA Advanced eXentisible Interface(AXI)バスを含む。他のタイプのバス構造およびバスプロトコルも使用され得る。
[0047]いくつかの例では、GPU12は、キャップおよび接合および/またはダッシングパターンに関するドメイン座標を決定することができ、プリミティブをサブセグメントに分割することができる。GPU12はまた、ダッシングパターンに基づいて、セグメントを維持すること、またはセグメントを破棄することなど、そのパターンに基づいて、グラフィカル演算を実行することもできる。ドメインシェーダ段階など、後続の段階は、ドメイン座標を入力として受け取ることができ、それらのドメイン座標に基づいて、頂点座標を決定することができる。
[0048]ストローク動作の一環として、およびラインセグメントのストローク領域に空間的に対応する1つまたは複数のプリミティブ(たとえば、三角形プリミティブ)を生成するために、GPU12は、式、たとえば、パラメータ式などによって定義され得るプリミティブを受け取ることができる。GPU12は、テッセレーションユニットを利用して、受け取ったプリミティブを1つまたは複数のラインセグメントに分割することができる。
[0049]本開示で説明するパスレンダリング技法は、たとえば、CPU6と、GPU12と、メモリ10とを含めて、図1に示されるコンピューティングデバイス2の構成要素のうちのいずれかの中で実装され得る。いくつかの例では、パスレンダリング技法のすべてまたは大部分は、GPU12内(たとえば、GPU12のグラフィカルパイプライン内)で実装され得る。追加の例では、CPU6は、本開示のパスレンダリング技法を実行するGPU12内のパスレンダリングパイプラインを実装するために、グラフィックスパイプラインの状態を構成して、シェーダプログラムをグラフィックスパイプラインと結合させるための技法を実装することができる。さらなる例では、CPU6は、レンダリングされることになるパスを示すデータを、1つまたは複数のパスをレンダリングするためにGPU12によってアクセスされ得る1つまたは複数のバッファ(たとえば、1つまたは複数の頂点バッファおよびprimtypeバッファ)内に配置するように構成され得る。
[0050]図2は、図1のコンピューティングデバイス2のCPU6、GPU12、およびメモリ10をさらに詳細に示すブロック図である。図2に示すように、CPU6はGPU12とメモリ10とに通信可能に結合され、GPU12はCPU6とメモリ10とに通信可能に結合される。いくつかの例では、GPU12は、CPU6によってマザーボードに統合され得る。追加の例では、GPU12は、CPU6を含むマザーボードのポート内にインストールされたグラフィックスカード上で実装され得る。さらなる例では、GPU12は、CPU6と相互作用するように構成された周辺デバイス内に組み込まれることが可能である。追加の例では、GPU12は、システムオンチップ(SoC)を形成するCPU6と同じマイクロチップ上に配置され得る。
[0051]CPU6は、ソフトウェアアプリケーション24と、グラフィックスアプリケーション処理インターフェース(API)26と、GPUドライバ28と、オペレーティングシステム30とを実行するように構成される。ソフトウェアアプリケーション24は、グラフィックス画像を表示させる1つもしくは複数の命令および/または非グラフィックスタスク(たとえば、汎用コンピューティングタスク)をGPU12上で実行させる1つもしくは複数の命令を含み得る。ソフトウェアアプリケーション24は、グラフィックスAPI26に対する命令を発行することができる。グラフィックスAPI26は、ソフトウェアアプリケーション24から受け取った命令をGPUドライバ28によって消費され得るフォーマットに変換するランタイムサービスであり得る。GPUドライバ28は、グラフィックスAPI26を介して、ソフトウェアアプリケーション24から命令を受け取って、それらの命令にサービス提供するためにGPU12の演算を制御する。たとえば、GPUドライバ28は、1つまたは複数のコマンド38を構築して、コマンド38をメモリ10内に配置して、コマンド38を実行するようにGPU12に命令することができる。いくつかの例では、GPUドライバ28は、コマンド38をメモリ10内に配置して、オペレーティングシステム30、たとえば、1つまたは複数のシステム呼出しを介してGPU12と通信することができる。
[0052]GPU12は、コマンドエンジン32と、1つまたは複数の処理ユニット34とを含む。いくつかの例では、1つまたは複数の処理ユニット34は、3Dグラフィックスレンダリングパイプライン、たとえば、DX 11グラフィックスレンダリングパイプライン(すなわち、DX 11グラフィックスAPIに準拠する3Dグラフィックスパイプライン)を形成および/または実装することができる。
[0053]コマンドエンジン32は、(たとえば、メモリ10を介して)CPU6からコマンドを受け取って、GPU12にそれらのコマンドを実行させるように構成される。状態コマンドを受け取ることに応答して、コマンドエンジン32は、状態コマンドに基づいて、GPU12内の1つもしくは複数の状態レジスタを特定の値に設定するように、および/または状態コマンドに基づいて、固定関数処理ユニット34のうちの1つもしくは複数を構成するように構成され得る。描画呼出しコマンドを受け取ることに応答して、コマンドエンジン32は、処理ユニット34に、レンダリングされることになる頂点バッファ41の頂点内に含まれ得る、レンダリングされることになるパスのタイプを示すデータ、ならびに、primtypeバッファ42の頂点バッファの頂点のプリミティブタイプを示すデータに基づいて、メモリ10内の頂点によって表された形状をレンダリングさせるように構成され得る。コマンドエンジン32は、シェーダプログラム結合コマンドを受け取って、それらのシェーダプログラム結合コマンドに基づいて、特定のシェーダプログラムをプログラマブル処理ユニット34のうちの1つまたは複数にロードすることも可能である。
[0054]処理ユニット34は、その各々がプログラマブル処理ユニットまたは固定関数処理ユニットであり得る、1つもしくは複数の処理ユニットを含み得る。プログラマブル処理ユニットは、たとえば、CPU6からGPU12上にダウンロードされた1つまたは複数のシェーダプログラムを実行するように構成されたプログラマブルシェーダユニットを含み得る。いくつかの例では、シェーダプログラムは、たとえば、OpenGL Shading Language(GLSL)、High Level Shading Language(HLSL)、C for Graphics(Cg)シェーディング言語など、ハイレベルシェーディング言語で書き込まれたプログラムのコンパイルバージョンであり得る。いくつかの例では、プログラマブルシェーダユニットは、並列して動作するように構成された複数の処理ユニット、たとえば、SIMDパイプラインを含み得る。プログラマブルシェーダユニットは、シェーダプログラム命令を記憶するプログラムメモリと、実行状態レジスタ、たとえば、実行されているプログラムメモリ内の現在の命令またはフェッチされることになる次の命令を示すプログラムカウンタレジスタとを有し得る。処理ユニット34内のプログラマブルシェーダユニットは、たとえば、頂点シェーダユニット、ピクセルシェーダユニット、ジオメトリシェーダユニット、ハルシェーダユニット、ドメインシェーダユニット、コンピュートシェーダユニット、および/またはユニファイドシェーダユニットを含み得る。
[0055]固定関数処理ユニットは、ある種の機能を実行するために配線接続されたハードウェアを含み得る。固定関数ハードウェアは、1つまたは複数の制御信号を介して、たとえば、異なる機能を実行するように構成され得るが、固定関数ハードウェアは、通常、ユーザコンパイルプログラムを受け取ることができるプログラムメモリを含まない。いくつかの例では、処理ユニット34内の固定関数処理ユニットは、たとえば、デプステスト、シザーテスト、アルファブレンディングなどおよび、ラスタ演算を実行する処理ユニットを含み得る
[0066]メモリ10は、パスデータ36と、1つまたは複数のコマンド38とを記憶することができる。いくつかの例では、パスデータ36は、複数の頂点(すなわち、制御点)として、メモリ10内に割り当てられた頂点バッファ41のうちの1つまたは複数に記憶され得る。パスデータ36はまた、1つまたは複数のprimtypeバッファ42を備え得る。primtypeバッファ42の各々は、頂点バッファ41のうちの1つの1つまたは複数の頂点に対応するprimitypeタイプを示すデータを含む。いくつかの例では、パスデータは、パッチリストデータ構造(たとえば、4制御点パッチリスト)内に記憶され得る。コマンド38は、1つまたは複数のコマンドバッファ(たとえば、リングバッファ)内に記憶され得る。CPU6(たとえば、オペレーティングシステム30を介したGPUドライバ28)は、GPU12によって消費するために、パスデータ36とコマンド38とをメモリ10内に配置することができる。GPU12(たとえば、コマンドエンジン32)は、メモリ10内に記憶されたコマンド38を検索および実行することができる。
[0057]パスデータ36が頂点として記憶される例では、頂点バッファ41の頂点はレンダリングされることになるパスの1つまたは複数のプリミティブを形状的に定義する1つまたは複数の属性を含み得る。たとえば、線の場合、パッチ制御リスト内の頂点は、線の終点に関する座標(たとえば、(x0,y0)および(x1,y1))を示すデータを含み得る。3次ベジェ曲線の場合、パッチ制御リスト内の頂点は、その曲線を定義する4つの制御点の座標(たとえば、(x0,y0)、(x1,y1)、(x2,y2)、(x3,y3))を示すデータを含み得る。2次ベジェ曲線の場合、パッチ制御リスト内の頂点は、4つの制御点の代わりに、3つの制御点に関する座標を示すデータを含み得る。楕円弧の場合、パッチ制御リスト内の頂点は、楕円弧の終点パラメータ表示を示すデータ、または楕円弧の中心パラメータ表示を示すデータを含み得る。
[0058]頂点バッファ41はまた、頂点バッファ41のうちのたった1つの中の異なるプリミティブタイプの頂点を含み得る。たとえば、頂点バッファ41のうちの1つは、ライン(たとえば、(x0,y0)および(x1,y1))と、2次ベジェ曲線を定義する3つの頂点(たとえば、(x2,y2)、(x3,y3)、および(x4,y4))とを含み得る。ラインおよび2次ベジェ曲線の頂点を含む頂点バッファは、したがって、値((x0,y0)、(x1,y1)、(x2,y2)、(x3,y3)、および(x4,y4))を含み得る。いくつかの事例では、頂点は2つの頂点の間で共有され得る。たとえば、(x1,y1)は、(x0、y0)をやはり含む第1のラインの終点、およびその終点が(x2,y2)である、第2のラインの起点であり得る。
[0059]頂点バッファ41の各々に関して、primtypeバッファ42のうちの1つは、頂点バッファ41のうちの1つの1つまたは複数の頂点のprimitypeタイプを示すデータを含む。primtypeバッファ42は、一般に、頂点バッファ41のうちの1つの1つまたは複数の頂点のプリミティブタイプを示す定整数値(たとえば、32ビットの符号なし整数値)を備え得る。primtypeバッファ42の値は、一例として、Cプログラミング言語の「列挙」タイプと同様の形で割り当てられ得るかまたは構成され得る。
[0060]複数のパスレンダリングプリミティブタイプ(すなわち、ラインおよびクワッドベジェ曲線)を含む頂点バッファの例では、primtypeバッファは、頂点バッファの第1の2つの座標対(すなわち、(x0,y0)、および(x1,y1)がラインプリミティブタイプのものであることを示す定数値と、第3の座標対、第4の座標対、および第5の座標対(すなわち、(x2,y2)、(x3,y3)、および(x4,y4))がクワッドベジェ曲線プリミティブタイプのものであることを示す第2の値とを含み得る。したがって、単純な例では、primtypeバッファは、値(LINE,QUAD)を含み得、ここで、「LINE」および「QUAD」は、それぞれ、ラインおよびクワッドベジェ曲線プリミティブタイプに対応する定数である。
[0061]1つまたは複数の頂点のprimitypeタイプを示す定数値に加えて、primtypeバッファ42はまた、プリミティブの開始および/または終端が新しいサブバンドの始端を標示するかどうかを示す定数値、ならびに、(サブパスとも呼ばれる)プリミティブの第1の頂点および最後の頂点が接続されているかどうかを示す定数値とを含み得る。新しいサブパスの開始を示すprimtypeバッファ定数値は、「OR」と示されるオープンリセットである。サブパスの第1の頂点および最後の頂点が接続されていることを示すprimtype値は、「CR」と示されるクローズリセットと呼ばれる。いくつかの例では、異なるパスタイプは、OpenVG APIによって定義されたパスタイプのセットに対応し得る。primtype値およびサブパスについては、図4に関して以下でより詳細に説明する。
[0062]コマンド38は、1つもしくは複数の状態コマンドおよび/または1つもしくは複数の描画呼出しコマンドを備え得る。状態コマンドは、たとえば、描画色、フィル色、ストローク色など、GPU12内の状態変数のうちの1つまたは複数を変更するようにGPU12に命令することができる。いくつかの例では、状態コマンドは、パスをレンダリングすることと関連付けられた1つまたは複数の状態変数を設定するように構成されたパスレンダリング状態コマンドを含み得る。たとえば、状態コマンドは、レンダリングされることになるパスがフィルされるか、ストロークされるか、またはそれらの両方かを示すように構成されたペイントモードコマンドを含み得る。別の例として、状態コマンドは、フィル動作のために使用されることになる色を指定するフィル色コマンドおよび/またはストローク動作のために使用されることになる色を指定するストローク色コマンドを含み得る。さらなる例として、状態コマンドは、たとえば、ストローク幅、エンドキャップスタイル(たとえば、突き合せ(butt)、円形、方形)、ライン接合スタイル(たとえば、マイター、ラウンド、ベベル)、マイターリミットなど、ストローク動作に関する1つまたは複数のパラメータを指定することができる。いくつかの例では、1つもしくは複数の状態パラメータを設定するために状態コマンドを使用することに加えて、またはその代わりに、描画呼出しコマンドを使用することによって、あるいはパスデータ36を含む頂点バッファ内に状態インジケータを配置することによって、状態パラメータのうちの1つもしくは複数が設定され得る。
[0063]描画呼出しコマンドは、メモリ10内に記憶された(たとえば、頂点バッファ内で定義された)1つまたは複数の頂点のグループによって定義された形状をレンダリングするようにGPU12に命令することができる。いくつかの例では、描画呼出しコマンドは、GPU12にメモリ10の定義されたセクション(たとえば、パスデータ36の頂点バッファ41)内に記憶された頂点およびプリミティブのすべてをレンダリングさせることができる。言い換えれば、GPU12が描画呼出しコマンドを受け取ると、メモリ10の定義されたセクション(たとえば、頂点バッファまたはパスデータ36)内の頂点によって表された形状およびプリミティブをレンダリングするための制御がGPU12に渡される。本開示の技法によれば、GPU12は、引数として、頂点バッファとprimtypeバッファとを含む描画呼出しコマンドを受け取ることができる。
[0064]描写呼出しコマンドは、3D描写呼出しコマンドおよびパスレンダリング描写呼出しコマンドのうちの1つまたは両方を含み得る。3Dレンダリング描画呼出しコマンドの場合、頂点バッファ内の1つまたは複数の頂点のグループによって定義された形状は、レンダリングされることになる1つまたは複数の3Dグラフィックスプリミティブ(たとえば、点、線、三角形、四角形、トライアングルストリップ、パッチなど)に対応し得、3Dレンダリング描画呼出しコマンドは、1つまたは複数の3DグラフィックスプリミティブをレンダリングするようにGPU12に命令することができる。パスレンダリング描画呼出しコマンドの場合、頂点バッファ内の1つまたは複数の頂点のグループによって定義された形状は、レンダリングされることになる1つまたは複数のパスプリミティブ(たとえば、ラインセグメント、楕円弧、2次ベジェ曲線、および3次ベジェ曲線など)に対応し得、パスレンダリング描画呼出しコマンドは、1つまたは複数のパスプリミティブをレンダリングするようにGPU12に命令することができる。
[0065]描画呼出しは、ハルシェーダと、テッセレータと、ドメインシェーダとを含み得る固定関数ユニットおよびプログラマブルユニットを利用する1つまたは複数のテッセレーションコマンドを指定することも可能である。ハルシェーダは、テッセレートされることになるドメインを指定することができる。いくつかの例では、テッセレートされることになるドメインは、等値線ドメイン、三角形(トライ)ドメイン、またはクワッド(四角形)ドメインのうちの1つを備え得る。テッセレータは指定されたドメイン上で動作して、それに基づいてドメインシェーダが頂点座標を決定することができるドメイン座標を出力する。
[0066]いくつかの例では、本開示で説明するパスレンダリング技法は、たとえば、グラフィックスAPI26と、GPUドライバ28と、コマンドエンジン32と、処理ユニット34とを含めて、図2に示す構成要素のうちのいずれかの内で実装され得る。いくつかの例では、パスレンダリング技法のすべてまたは大部分は、処理ユニット34によって形成されたGPU12内のグラフィカルパイプライン内で実装され得る。たとえば、テッセレーションユニットは処理ユニット34のユニットであり得る。追加の例では、CPU6のソフトウェアアプリケーション24、グラフィックスAPI26および/またはGPUドライバ28は、本開示のパスレンダリング技法を実行するGPU12内のパスレンダリングパイプラインを実装するために、グラフィックスパイプラインの状態を構成して、シェーダプログラムをグラフィックスパイプラインと結合させるための技法を実装することができる。さらなる例では、CPU6のソフトウェアアプリケーション24、グラフィックスAPI26および/またはGPUドライバ28は、レンダリングされることになるパスを示すデータを、1つまたは複数のパスをレンダリングするためにGPU12によってアクセスされ得る1つまたは複数のバッファ(たとえば、1つまたは複数の頂点バッファおよびprimtypeバッファ)内に配置するように構成され得る。
[0067]本開示の技法によれば、GPU12は、異なるプリミティブタイプの頂点を備えた単一の頂点バッファを受け取るように構成され得る。GPU12はまた、頂点バッファの頂点のプリミティブタイプを示すprimtypeバッファを受け取るように構成され得る。本開示による一例として、GPU12は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、GPU12の頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの1つまたは複数と関連付けられる、構成され得る。GPU12は、複数の頂点と、関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定し、複数の頂点と、プリミティブタイプバッファの関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることができる。
[0068]図3は、本開示のパスレンダリング技法を実行することができる例示的なグラフィックスパイプライン40を示す概念図である。いくつかの例では、グラフィックスパイプラインは、Microsoft(登録商標)DirectX(DX)11グラフィックスパイプラインに対応し得る。図3に示すように、グラフィックスパイプライン40は、リソースブロック42と、図2の処理ユニット34を備え得る複数の処理段階とを含む。複数の処理段階(たとえば、処理ユニット34)は、入力アセンブラ(IA)44と、頂点シェーダ(VS)46と、ハルシェーダ(HS)48と、テッセレータ50と、ドメインシェーダ(DS)52と、ジオメトリシェーダ(GS)54と、ラスタライザ56と、ピクセルシェーダ(PS)58と、出力統合器60とを含む。ハルシェーダ48、テッセレータ50、およびドメインシェーダ52は、グラフィックスパイプライン40のテッセレーション段階62を形成し得る。
[0069]リソースブロック42は、たとえば、1つもしくは複数のテクスチャおよび/または1つもしくは複数のバッファなど、グラフィックスパイプライン40によって使用される1つもしくは複数のメモリリソースに対応し得る。リソースブロック42は、グラフィカルパイプライン40内の処理段階のうちの1つもしくは複数によって処理されることになる入力データおよび/またはグラフィックスパイプライン40内の処理段階のうちの1つもしくは複数からの出力データを記憶することができる。例として、リソースブロック42は、本開示で説明するようにパスセグメントに関するフィル領域のラスタライズされたバージョンおよび/またはパスセグメントに関するストローク領域のラスタライズされたバージョンを保持するフレームバッファを記憶することができる。いくつかの例では、リソースブロック42を形成するメモリリソースは、コンピューティングデバイス2のメモリ10および/またはGPUキャッシュ14内に存在し得る。
[0070]図3に示す直角の処理段階は固定関数処理段階を表し、図3に示す丸角の処理段階はプログラマブル処理段階を表す。たとえば、図3に示すように、入力アセンブラ44、テッセレータ50、ラスタライザ56、および出力統合器60は固定関数処理段階であり得、頂点シェーダ46、ハルシェーダ48、ドメインシェーダ52、ジオメトリシェーダ54、およびピクセルシェーダ58はプログラマブル処理段階であり得る。プログラマブル段階の各々は、特定のタイプのシェーダプログラムを実行するように構成され得る。たとえば、頂点シェーダ46は、頂点シェーダプログラムを実行するように構成され得、ハルシェーダ48は、ハルシェーダプログラムを実行するように構成され得る、等々である。異なるタイプのシェーダプログラムの各々は、GPUの共通シェーダユニット上、または1つもしくは複数の特定のタイプのシェーダプログラムを実行するための専用である1つもしくは複数の専用シェーダユニット上のいずれかで実行することができる。
[0071]図3に示すように、入力アセンブラ44、頂点シェーダ46、ハルシェーダ48、ドメインシェーダ52、ジオメトリシェーダ54、ピクセルシェーダ58、および出力マージャ60はリソースブロック42に通信可能に結合される。入力アセンブラ44、頂点シェーダ46、ハルシェーダ48、ドメインシェーダ52、ジオメトリシェーダ54、ピクセルシェーダ58、および出力統合器60はリソースブロック42から入力データを検索ならびに/または受け取るように構成される。ジオメトリシェーダ54および出力統合器60は、出力データをリソースブロック42に書き込むように構成される。グラフィックスパイプライン40内の処理段階とリソースブロック42との間の通信の上述の構成は、グラフィックスパイプライン40の処理段階とリソースブロック42との間の通信がどのように構成され得るかの単なる一例である。他の例では、グラフィックスパイプライン40の処理段階とリソースブロック42との間により多くのもしくはより少ない一方向および/または双方向の通信チャネルが提供され得る。
[0072]DirectX 11グラフィックスパイプラインの一般的な動作に関するさらなる情報は、その内容の全体が参照により本明細書に組み込まれている、Zinkら、「Practical Rendering & Computation with Direct3D 11」、CRC Press(2011年)に見出すことができる。
[0073]上で議論したように、2つのパスレンダリング動作は、(1)パスセグメントのフィル、および(2)パスセグメントのストロークである。グラフィックスレンダリングパイプライン40(たとえば、Direct 11グラフィックスパイプライン)を用いてストローク動作を実行するための解決策が次に説明される。
[0074]本開示の技法によれば、CPU6は、1つまたは複数のプリミティブを示す頂点を頂点バッファ内に配置することができる。CPU6はまた、1つまたは複数のプリミティブタイプ値をprimtypeバッファ内に配置することができる。いくつかの例では、頂点バッファは図2に示すパスデータ36の頂点バッファ41の1つに対応し得る。頂点バッファ内の頂点に関するプリミティブトポロジは、いくつかの例では、パッチ制御リストであり得る。線の場合、パッチ制御リスト内の頂点は、線の終点に関する座標(たとえば、(x0,y0)および(x1,y1))を示すデータを含み得る。3次ベジェ曲線の場合、パッチ制御リスト内の頂点は、その曲線を定義する4つの制御点の座標(たとえば、(x0,y0)、(x1,y1)、(x2,y2)、(x3,y3))を示すデータを含み得る。2次ベジェ曲線の場合、パッチ制御リスト内の頂点は、4つの制御点の代わりに、曲線を定義する3つの制御点に関する座標を示すデータを含み得る。楕円弧の場合、パッチ制御リスト内の頂点は、楕円弧の終点パラメータ表示を示すデータ、または楕円弧の中心パラメータ表示を示すデータを含み得る。primtypeバッファは、頂点バッファ内の頂点が異なるタイプのプリミティブと関連付けられるとき、頂点バッファ内の頂点と関連付けられたプリミティブタイプに対応する値を含み得る。いくつかの例では、CPU6は、レンダリングされることになるパスのタイプを示すデータをパッチ制御リストの、場合によっては未使用の頂点属性内に配置することも可能である。
[0075]パスストローク動作を実行するために、入力アセンブラ44は、パスデータ36をメモリ10から取得して、頂点バッファ41およびprimtypeバッファ42によって指定されたパスセグメント(たとえば、パスプリミティブ)をレンダリングするために、そのパスデータをグラフィックパイプライン40の後続の段階に渡す。たとえば、入力アセンブラ44は、複数の頂点をメモリ10内に記憶された頂点バッファ42から取得し得る。primtypeバッファ42のプリミティブデータのエントリに基づいて、入力アセンブラ44は、頂点バッファ内に記憶された頂点を個々のプリミティブにパースすることができる。入力アセンブラ44は、各々、個々のプリミティブにプリミティブ識別子(「primID」)を割り当てることができ、その関連するprimIDとともに各プリミティブを後の再使用のためにレベル2(「L2」)キャッシュなどのキャッシュ内に記憶することができる。L2キャッシュはリソースブロック64の一部であり得る。いくつかの例では、入力アセンブラ44は、単調増加減少順でprimID値を割り当てることができる。
[0076]各プリミティブを記憶することに加えて、入力アセンブラ44は、プリミティブタイプ状態変数を生成することもできる。「sv_curr_primtype」、「sv_prev_primtype」、および「sv_next_primtype」と示される変数は、現在、レンダリング中であるプリミティブに対する現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプを示す。入力アセンブラ44は、ドメインシェーダ段階52と、ジオメトリシェーダ段階と、ハルシェーダ48とを含む、グラフィックスパイプライン内の後続の段階にプリミティブタイプ状態変数を渡す。
[0077]入力アセンブラ44が頂点を生成すると、頂点シェーダ46は生成された頂点を処理する。いくつかの例では、入力アセンブラ44は、処理されることになる頂点を頂点シェーダ46に直接的に渡すことができる。追加の例では、入力アセンブラ44は、たとえば、頂点と関連付けられたprimIDに基づいて、リソースブロック64内の頂点バッファ41のうちの1つから、処理のために特定の頂点を検索するように頂点シェーダ46に指示することができる。
[0078]頂点シェーダ46は、入力アセンブラ44および/またはリソースブロック42から受け取った頂点を処理して、頂点シェーダ46によって処理された各入力頂点に関する出力頂点を生成するように構成される。たとえば、各入力頂点に関して、頂点シェーダ46は、GPU12のシェーダユニット上で頂点シェーダプログラムのインスタンスを実行することができる。頂点シェーダ46によって受け取られた入力頂点、および頂点シェーダ46によって生成された出力頂点は、あるいは、それぞれ、入力制御点および出力制御点と呼ばれる場合がある。
[0079]さらなる例では、頂点シェーダ46は、対応する入力頂点の入力属性と同一でない出力頂点に関する1つまたは複数の出力属性を生成することができる。たとえば、頂点シェーダ46は、出力頂点に関する1つまたは複数の属性を生成するために、入力頂点の属性のうちの1つまたは複数に関して実質的な処理を実行することができる。別の例として、頂点シェーダ46は、出力頂点に関する出力属性のセットを生成するために、入力属性のセットから追加および/または属性を削除することができる。
[0080]テッセレーション段階62(すなわち、ハルシェーダ48、テッセレータ50、およびドメインシェーダ52)は、入力パスデータによって定義されたパスセグメントを複数のラインセグメントにテッセレートすることができる。いくつかの例では、テッセレーション段階62は、プリミティブを形成する複数の頂点を、たとえば、頂点シェーダ46から受け取ることができる。いくつかの例では、4つの頂点はプリミティブを備え得る。テッセレーション段階62は、受け取ったプリミティブに基づいて、1つまたは複数のドメイン座標を決定することができる。決定されたドメイン座標は、レンダリングされることになるパスの曲率を近似することができる。
[0081]一般に、ハルシェーダ48は、さらなる処理のために、頂点シェーダ46から受け取った制御点をドメインシェーダ52に渡して、ドメインタイプなど、構成データをテッセレータ50に提供することができる。ハルシェーダ48は、入力アセンブラ44によって生成されたプリミティブ段階変数(すなわち、sv_curr_primtype、sv_prev_primtype、およびsv_next_primtype)に基づいて、制御点をやはり決定することができる。ハルシェーダ48はまた、プリミティブ状態変数に基づいて、1つまたは複数のテッセレーション係数を生成し、生成されたテッセレーション係数をテッセレータ50に渡すこともできる。
[0082]テッセレータ50は、特定のタイプのパスセグメントまたはプリミティブを表す1つもしくは複数のパラメータ式が評価されるべきドメイン座標を決定することができる。例示のために、テッセレータ50は1つの固定関数ユニットとして示されている。グラフィックスパイプライン40の後続の段階は、テッセレータ50によって決定されたドメイン座標を利用することも可能である。
[0183]ドメインシェーダ52は、テッセレータ50によって決定されたドメイン座標値でパラメータ式を評価して、各評価に関する頂点を出力することができる。いくつかの例では、ドメインシェーダ52によって出力された頂点の各々は、その頂点の位置を示す1つまたは複数の属性を含み得る。追加の例では、ドメインシェーダ52によって出力された頂点の各々は、その頂点と関連付けられたパスレンダリングプリミティブのタイプを示す1つまたは複数の属性を含み得る。
[0084]より具体的には、ハルシェーダ48は、頂点シェーダ46および/またはリソースブロック42から受け取った制御点を処理することができ、ハルシェーダ48によって実行されたハルシェーダプログラムの各インスタンスに関する出力制御を生成することができる。たとえば、ハルシェーダ48によって生成されることになる各出力制御点に関して、頂点シェーダ46は、GPU12のシェーダユニット上でハルシェーダプログラムのインスタンスを実行することができる。
[0085]さらなる例では、ハルシェーダ48は、入力制御点のうちのそれぞれ1つの入力属性と同一でない出力制御点に関する1つまたは複数の出力属性を生成することができる。たとえば、ハルシェーダ48は、出力制御点に関する1つまたは複数の属性を生成するために、入力制御点の属性のうちの1つまたは複数に関して実質的な処理を実行することができる。別の例として、ハルシェーダ48は、出力頂点に関する出力属性のセットを生成するために、入力属性のセットから属性を追加および/または削除することができる。いくつかの例では、下でさらに詳細に説明するように、GPU12が終点パラメータ表示の形である、楕円弧に関するパスデータを受け取る場合、ハルシェーダ48は、その楕円弧の終点パラメータ表示をその楕円弧の中心パラメータ表示に変換することができる。
[0086]さらなる例では、ハルシェーダ48は、特定のレンダリング動作に関して、レンダリングされるべきではないプリミティブを破棄することができる。プリミティブを破棄することは、プリミティブに対応するデータをグラフィックスパイプラインのさらなる段階に渡させず、それによって、そのようなプリミティブをパイプラインの残りによって効果的にレンダリングさせないプロセスを指す場合がある。たとえば、グラフィックスパイプライン40がフィル動作を実行しているとき、ハルシェーダ48は、接合プリミティブとキャッププリミティブとを破棄することができる。
[0087]ハルシェーダ48は、各パスセグメントに関するパッチ定数関数のインスタンスを実行することもできる。パッチ定数関数は、出力値を生成するとき、テッセレータ50によって使用されることになる構成パラメータを決定して、テッセレータ50に提供することができる。本開示の技法によれば、パッチ定数関数は、ハルシェーダ48が入力アセンブラ44から受け取ることができるプリミティブ状態変数に部分的に依存し得る。たとえば、パッチ定数関数は、ハルシェーダ48にテッセレーション係数をテッセレータ50に提供させることができる。テッセレーション係数は、テッセレータ50が特定のテッセレーションドメインに適用されるテッセレーションの程度(たとえば、ドメインがどの程度微細に再分割されるべきか、および/またはドメインが再分割されるべきより小さなオブジェクトの数)を指定することができる。本開示の技法によれば、ハルシェーダ48は、テッセレータ50に提供されるテッセレーション係数を決定するとき、プリミティブ状態変数を考慮に入れることができる。
[0088]別の例として、パッチ定数関数は、ハルシェーダ48にテッセレーションドメインをテッセレータ50に提供させることができる。テッセレーションドメインは、テッセレータ50によって使用されるための複数の座標を生成するために、テッセレータ50によって使用されるオブジェクトを指す場合がある。概念的に、テッセレーションドメインは、テッセレータ50によって複数のより小さなオブジェクトに再分割されるオブジェクトに対応し得る。より小さなオブジェクトの頂点の位置座標は、次いで、さらなる処理のために、ドメインシェーダ52に送られる。いくつかの例では、テッセレーションドメインは、クワッド、トライ、および等値線のうちの1つになるように選択され得る。いくつかの例では、ドメインが再分割される先である、より小さいオブジェクトは、三角形、ラインセグメント、または点に対応し得る。いくつかの例では、ハルシェーダ48は、等値線テッセレーションドメインを指定して、テッセレータ50が等値線ドメインをラインセグメントに再分割すべきであることを指定することができる。
[0089]いくつかの例では、テッセレータ50は、2パステッセレーションを実行するように構成され得る。2パステッセレーションでは、ハルシェーダ48は、ジオメトリシェーダ54から、たとえば、(GPUキャッシュ14またはメモリ10内の)ストリームアウト(streamout)バッファから入力を受け取ることができる。いくつかの例では、ジオメトリシェーダ54からの入力は、プリミティブタイプデータを備え得る。この入力に基づいて、ハルシェーダ48は、第2のテッセレーションパス内で使用されることになるテッセレーションユニット50用のテッセレーション係数を生成する。この第2のパスは、第1のパス内で、テッセレータ50によって生成されたテッセレーション係数を受け取る。
[0090]テッセレータ50は、テッセレーション段階62によって処理される各パスセグメントに関する複数の出力値を生成することができる。出力値は、特定のタイプのパスセグメントを表す1つまたは複数のパラメータ式がドメインシェーダ52によって評価されるべき値を決定することができる。いくつかの例では、テッセレータ50は、ハルシェーダ48によってテッセレータ50に提供された1つもしくは複数のテッセレーション係数および/またはテッセレーションドメインに基づいて、複数の出力値を生成することができる。たとえば、テッセレータ50は、等値線を複数のラインセグメントに再分割して、正規化された座標系内の複数のラインセグメントの各終点に関する出力値を生成することができる。本開示の技法によれば、テッセレータ50はまた、プリミティブタイプデータを生成して、そのプリミティブタイプデータをジオメトリシェーダ54に渡すことができる。
[0091]ドメインシェーダ52は、ドメイン座標と、1つまたは複数のグラフィカルフィーチャを示す情報とをテッセレータ50から受け取り、パスセグメントに関する制御点と、テッセレーション係数と、後続のプリミティブに関する開始法線とをハルシェーダ48から受け取ることができる。ドメインシェーダ52はまた、入力アセンブラ44からプリミティブ状態変数を受け取ることができる。これらの入力に基づいて、ドメインシェーダ52は、出力頂点座標と、それらの座標によって表された頂点に対応する終点法線とを生成する。
[0092]たとえば、テッセレータ50から受け取られた各出力値に関して、ドメインシェーダ52は、GPU12のシェーダユニット上でドメインシェーダプログラムのインスタンスを実行することができる。ドメインシェーダプログラムは、ドメインシェーダ52に、テッセレータ50から受け取った特定の値に基づいて決定された特定の値で1つまたは複数のパラメータ式を評価させて、それらの評価、ならびに各頂点座標と関連付けられたグラフィカルフィーチャに基づいて、出力頂点に関する座標を生成させることができる。出力頂点座標を生成するために使用されるパラメータ式の係数のうちの1つまたは複数は、ハルシェーダ48から受け取った制御点のうちの1つまたは複数に基づいて定義され得る。各出力頂点は、複数のテッセレートされたラインセグメントのうちの1つの終点に対応し得る。2つの連続する出力頂点は、単一のテッセレートされたラインセグメントの終点に対応し得る。追加の例では、ドメインシェーダプログラムは、ドメインシェーダ52に、各出力頂点に関する正規座標を生成するために、テッセレータ50から受け取った特定の値に基づいて決定された特定の値で、1つまたは複数の追加のパラメータ式を評価させることができる。
[0093]ドメインシェーダ52は、隣接する頂点の各セットがテッセレートされたラインセグメントを表す、順序付けられた順番で頂点を出力することができる。ラインセグメントは、頂点バッファおよびprimtypeバッファ内で定義されたパスセグメントを集合的に近似することができる。たとえば、ドメインシェーダ52は、以下のラインセグメント{0,1}、{1,2}、{2,3}、{3,4}、{4,5}を定義する頂点の以下のセット{0,1,2,3,4,5}を出力することができる。追加の例では、ドメインシェーダ52は、前の例で列挙されたのと同じラインセグメントを定義し得る頂点の以下のセット{0,1,1,2,2,3,3,4,4,5}を出力することができる。
[0094]いくつかの例では、テッセレータ50およびドメインシェーダ52は、以下の技法に従って、パスセグメントを複数のラインセグメントに均一にテッセレートするように構成され得る。具体的には、テッセレータ50は、パラメータ評価のための座標を出力することができる(たとえば、t=0/T、1/T、2/T...T/T、式中、Tはテッセレーション係数である)。プリミティブのタイプに応じて、ドメインシェーダ52は、テッセレータ50によって出力された値で1つまたは複数のパラメータ式を評価することができる。
[0095]いくつかの例では、線の場合、Tは常に1に等しくてよい。そのような例では、ドメインシェーダ52は、ラインパスセグメントに対応する頂点を生成するために、何らかの評価を実行することを必ずしも必要とするとは限らない場合がある。
[0096]3次ベジェ曲線の場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
式中、tは、テッセレータ50によって提供された出力値に対応し、V(t)は、特定の出力値(すなわち、t)に関して生成された出力頂点に対応し、C0、C1、C2、C3は、3次ベジェ曲線に関する制御点に対応する。
[0097]あるいは、3次ベジェ曲線の場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
式中、tは、テッセレータ50によって提供された出力値に対応し、x(t)は、特定の出力値(すなわち、t)に関して生成された出力頂点のx座標に対応し、y(t)は、特定の出力値(すなわち、t)に関して生成された出力頂点のy座標に対応し、(X0,Y0)、(X1,Y1)、(X2,Y2)、(X3,Y3)は、3次ベジェ曲線に関する制御点に対応する。
[0098]2次ベジェ曲線の場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
式中、tは、テッセレータ50によって提供された出力値に対応し、V(t)は、特定の出力値(すなわち、t)に関して生成された出力頂点に対応し、C0、C1、C2は、2次ベジェ曲線に関する制御点に対応する。
[0099]あるいは、2次ベジェ曲線の場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
式中、tは、テッセレータ50によって提供された出力値に対応し、x(t)は、特定の出力値(すなわち、t)に関して生成された出力頂点のx座標に対応し、y(t)は、特定の出力値(すなわち、t)に関して生成された出力頂点のy座標に対応し、(X0,Y0)、(X1,Y1)、(X2,Y2)は、2次ベジェ曲線に関する制御点に対応する。
[0100]楕円弧パスセグメントの場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
式中、パラメータ表示角度angletは、テッセレータ出力tから決定され、xは、特定のパラメータ表示角度(すなわち、anglet)に関して生成された出力頂点のx座標に対応し、yは、パラメータ表示角度(すなわち、anglet)に関して生成された出力頂点のy座標に対応し、rhは、非回転楕円の横半径を表し、rvは、非回転楕円の縦半径を表し、rvCos、rvSin、rhCos、およびrhSinは、それぞれ、rv*Cos(角度)、rv*Sin(角度)、rh*Cos(角度)、およびrh*Sin(角度)を表し、角度は、(rh,rv)によるスケーリングに先立って測定されたx軸に対する楕円の反時計回り角度を表す。いくつかの例では、ハルシェーダ48は、cos(角度)とsin(角度)とを決定(たとえば、事前計算)し、および/またはrvCos値と、rvSin値と、rhCos値と、rhSin値とを決定(たとえば、事前計算)して、楕円弧に関する、上で具陳したパラメータ式を評価する際に使用するために、これらの値をドメインシェーダ52に提供するように構成され得る。
[0101]楕円弧に関して上で議論したように、パッチ制御リスト内の頂点は、いくつかの例では、楕円弧に関する終点パラメータ表示を示すデータを含み得る。そのような例では、ハルシェーダ48(たとえば、GPU12のシェーダユニット上で実行するハルシェーダプログラム)は、楕円弧の終点パラメータ表示を示すデータを楕円弧の中心パラメータ表示を示すデータに変換するために使用され得る。
[0102]楕円弧の終点パラメータ表示を楕円弧の中心パラメータ表示に変換するときに、楕円の正確な中心を見出すための例示的な技法が次に説明される。例示的な技法は、パラメータのセット(x0,y0)、(x1,y1)、rh、rv、φ、fs、およびfAによって定義される楕円の終点表現に基づいて、楕円ならびに/または楕円弧の中心点(cx,cy)と、初期角度ならびに最終角度θ1およびθ2とを決定することができる。中心点(cx,cy)と、半径rhおよびrvと、回転角rotとを有する楕円は、陰方程式(x’)2+(y’)2=1を満たすことができ、式中、x’=((x−cx)*cos(rot)+(y−cy)*sin(rot))/rhおよびy’=(−(x−cx)*sin(rot)+(y−cy)*cos(rot))/rvである。(x,y)から(x’、y’)への変換は、所望の楕円を、起点を中心とする単位円にマッピングする。
[0103]共通半径と、2つの所与の点(x0,y0)および(x1,y1)を通過する回転角とを有する楕円の対の中心点を決定するために、平面はまず、各楕円の式が(x’−cx’)2+(y’−cy’)2=1になるように、適切にスケーリングおよび回転された座標系に変換される。次いで、その外周が2つの所与の点を通過する2つの単位円の中心(すなわち、(cx0’,cy0’)および(cx1’,cy1’))が見出され得る。最終的に、元の座標系の解決策を取得するために、中心点は逆変換によって配置される。
[0104]点(x0,y0)および(x1,y1)を通過する2つの単位円の中心点は
によって与えられ、式中、xm=(x0+x1)/2,ym=(y0+y1)/2,Δx=(x0−x1),Δy=(y0−y1)、およびd=√(1/(Δx2+Δy2)−1/4)である。dが無限または虚である場合、入力点は、それぞれ、一致しているか、または離れすぎているため、解決策は存在しない。角度θ1およびθ2は、円上の終点の傾斜を見出して、逆正接関数を計算することによって見出され得る。
[0105]以下の疑似コードは、上述の技法に従って、楕円中心を計算するプロセスを示す。元の楕円パラメータの逆変換に続いて、findUnitCircles関数がfindEllipsesによって呼び出される。
[0106]楕円弧の終点パラメータ表示を楕円弧の中心パラメータ表示に変換することに関するさらなる詳細は、その内容全体が参照により本明細書に組み込まれている、http://www.khronos.org/registry/vg/specs/openvg−1.1pdfで入手可能な「OpenVG Specification、Version 1.1」、第18.4項、2008年12月3日に見出され得る。
[0107]ジオメトリシェーダ54は、テッセレートされたラインセグメントをドメインシェーダ52から受け取って、それらのテッセレートされたラインセグメントに基づいて、複数の三角形プリミティブを生成することができる。本開示の技法によれば、ジオメトリシェーダ54はまた、テッセレータ50から受け取ったプリミティブタイプデータに基づいて、三角形プリミティブを生成することができる。たとえば、テッセレートされたラインセグメントの各々に関して、ジオメトリシェーダ54は、GPU12のシェーダユニット上でジオメトリシェーダプログラムのインスタンスを実行して、それぞれのテッセレートされたラインセグメントに基づいて、テッセレートされたラインセグメントに関する三角形プリミティブを生成することができる。いくつかの例では、テッセレートされたラインセグメントの各々に関して、ジオメトリシェーダ54は、それぞれのテッセレートされたラインセグメントに対応する2つの頂点をドメインシェーダ52から受け取って、三角形プリミティブに対応する3つの頂点のセットを生成することができる。
[0108]いくつかの例では、三角形プリミティブの頂点のうちの2つは、2つの受け取った頂点と同じ頂点であり得る(たとえば、同じ位置座標を有し得る)。そのような例では、ジオメトリシェーダ54は、レンダリングされることになるパスセグメントと関連付けられたすべてのテッセレートされたラインセグメントに共通である共通の頂点に基づいて、第3の頂点を生成することができる。共通の頂点は、テッセレートされたラインセグメントの終点のうちの1つに対応してよく、または対応しなくてもよい。いくつかの例では、共通の頂点は、レンダリングされることになるパスセグメントに関する、テッセレートされたラインセグメントに対応する頂点のセット内の第1の頂点に対応し得る。
[0109]ジオメトリシェーダ54は、ドメインシェーダ52によって作り出された、テッセレートされたラインセグメントの各々に関して一回度起動され得る。テッセレートされたラインセグメントの各々に関して、ジオメトリシェーダ54は、三角形の第1の頂点として共通の制御点を使用し、三角形の第2の頂点および第3の頂点として、それぞれのテッセレートされたラインセグメントの2つの終点を使用して、三角形プリミティブを生成することができる。たとえば、ドメインシェーダ52が、以下のラインセグメント{0,1}、{1,2}、{2,3}、{3,4}、{4,5}を定義する、以下の頂点のセット{0,1,2,3,4,5}を生成した例が上で提供された。上記の一連のラインセグメントの場合、ジオメトリシェーダ54は、以下の三角形、{C,0,1}、{C,1,2}、{C,2,3}、{C,3,4}、{C,4,5}、{C,4,5}を生成することができ、式中、Cは三角形のすべてに共通する任意の単一の頂点である。
[0110]いくつかの例では、ジオメトリシェーダ54は、出力データをリソースブロック42に「ストリームアウトする」ように構成されることも可能である。グラフィックスパイプライン40は、いくつかの例では、第2のテッセレーションパスを実行するために、ストリームアウトされたデータをハルシェーダ48とドメインシェーダ52とに送信し戻すことができる。
[0111]ラスタライザ56は、複数の3Dグラフィックスプリミティブ(たとえば、点、線、および三角形)をそれらの3Dグラフィックスプリミティブに対応する複数の画素に変換するように構成され得る。たとえば、ラスタライザ56は、三角形プリミティブに対応する3つの頂点を受け取って、それらの3つの頂点を、その三角形プリミティブによってカバーされたスクリーン画素位置に対応する複数の画素に変換することができる。三角形プリミティブによってカバーされたスクリーン画素位置は、三角形の頂点、三角形の縁、および三角形の内部に対応するスクリーン画素位置を含み得る。
[0112]ピクセルシェーダ58は、画素をラスタライザ56から受け取って、ピクセルシェーダプログラムに従って、受け取った画素に基づいて、影付き画素を生成することができる。たとえば、ラスタライザ56から受け取った各画素に関して、ピクセルシェーダ58は、GPU12のシェーダユニット上でピクセルシェーダプログラムのインスタンスを実行することができる。
[0113]さらなる例では、ピクセルシェーダ58は、入力画素のうちのそれぞれの1つの入力画素の入力属性と同一でない、出力画素に関する1つまたは複数の出力属性を生成することができる。たとえば、ピクセルシェーダ58は、出力画素に関する1つまたは複数の属性を生成するために、入力画素の属性のうちの1つまたは複数に関して実質的な処理を実行することができる。別の例として、ピクセルシェーダ58は、出力画素に関する出力属性のセットを生成するために、入力属性のセットから属性を追加および/または削除することができる。
[0114]出力統合器60は、ピクセルシェーダ58から受け取った画素データをレンダターゲット(たとえば、フレームバッファまたはステンシルバッファ)内に配置することができる。いくつかの例では、出力マージャ60は、ピクセルシェーダ58から受け取った画素データをラスタ演算に基づいてレンダターゲット内にすでに記憶されている画素データと併合することができる。
[0115]ドメインシェーダ52が頂点に関する位置座標を生成するためのパラメータ式を評価することに加えて、ドメインシェーダ52は、ストローク動作の間、頂点に関する法線、たとえば、接線を生成することも可能である。法線を生成するために、ドメインシェーダ52は、テッセレータ50によって生成された値の各々に関する追加のパラメータ式を評価して、各評価に関して1つまたは複数の法線を出力することができる。場合によっては、法線は、ドメインシェーダ52によって出力された頂点の属性として出力され得る。たとえば、ストローク動作の場合、ドメインシェーダ52によって作り出された出力頂点は、頂点の位置を示す1つもしくは複数の属性と、頂点と関連付けられた法線または接線を示す1つもしくは複数の属性とを含み得る。
[0116]湾曲したパスセグメント(たとえば、ベジェ曲線および楕円弧)に関する法線を生成するために、湾曲したパスセグメントに関する接線公式が使用され得る。一般に、(法線を決定するために使用され得る)曲線および楕円弧に関する接線公式は、曲線および弧に関する頂点を生成することに関して上で説明したパラメータ方式の派生物である。
[0117]たとえば、3次ベジェ曲線の場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線の出力頂点に関する法線を生成することができる。
式中、tは、テッセレータ50によって提供された出力値に対応し、N(t)は、特定の出力値(すなわち、t)に関して生成された出力法線に対応し、C0、C1、C2、C3は、3次ベジェ曲線に関する制御点に対応する。2次ベジェ曲線に関する法線を生成するために、上で提供した2次ベジェ曲線に関するパラメータ式の派生物が同じように使用され得る。
[0118]あるいは、3次ベジェ曲線の場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線の出力頂点に関する法線を生成することができる。
式中、tは、テッセレータ50によって提供された出力値に対応し、x(t)は、特定の出力値(すなわち、t)に関して生成された出力法線のx座標に対応し、y(t)は、特定の出力値(すなわち、t)に関して生成された出力法線のy座標に対応し、(X0,Y0)、(X1,Y1)、(X2,Y2)、(X3,Y3)は、3次ベジェ曲線に関する制御点に対応する。2次ベジェ曲線に関する法線を生成するために、上で提供した2次ベジェ曲線に関するパラメータ式の派生物が同じように使用され得る。
[0119]楕円弧パスセグメントの場合、ドメインシェーダ52は、以下のパラメータ式に従って、曲線の出力頂点に関する法線を生成することができる。
式中、パラメータ表示角度、angletは、テッセレータ出力(すなわち、t)から決定され、Tanxは、特定のパラメータ表示角度(すなわち、anglet)に関して生成された出力法線のx座標に対応し、Tanyは、パラメータ表示角度(すなわち、anglet)に関して生成された出力法線のy座標に対応し、rhは、非回転楕円の横半径を表し、rvは、非回転楕円の縦半径を表し、rvCos、rvSin、rhCos、およびrhSinは、それぞれ、rv*Cos(角度)、rv*Sin(角度)、rh*Cos(角度)、およびrh*Sin(角度)を表し、角度は、(rh,rv)によるスケーリングに先立って測定されたx軸に対する楕円の反時計回り角度を表す。いくつかの例では、ハルシェーダ48は、cos(角度)とsin(角度)とを決定(たとえば、事前計算)し、および/またはrvCos値と、rvSin値と、rhCos値と、rhSin値とを決定(たとえば、事前計算)して、楕円に関して上で具陳したパラメータ式を評価する際に使用するために、これらの値をドメインシェーダ52に提供するように構成され得る。
[0120]接線を見出した後、以下の式に従って、法線ベクトルが見出され得る。
式中、normalは、(Tanx,Tany)ベクトルに関する正規化ベクトルに対応し、normalize(x,y)は、入力ベクトル(x,y)の正規化バージョンを生成する関数である。ベクトル(x,y)の正規化バージョンは、1のベクトル(x,y)および長さ(たとえば、norm)と同じ方向を有するベクトルと指す場合がある。
[0121]楕円弧に関して上で議論したように、パッチ制御リスト内の頂点は、いくつかの例では、終点パラメータ表示を示すデータを含み得る。そのような例では、ハルシェーダ48は、楕円弧の終点パラメータ表示を示すデータを楕円弧の中心パラメータ表示を示すデータに変換することができる。
[0122]したがって、本開示の技法によれば、グラフィックスパイプライン40の1つまたは複数の段階は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、GPU12の頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの1つまたは複数と関連付けられる、ように構成され得る。グラフィックスパイプライン40は、複数の頂点と、関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定して、複数の頂点と、プリミティブタイプバッファの関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングするようにさらに構成され得る。
[0123]図4は、本開示のGPUアクセラレーテッドパスレンダリング技法によるGPUのバッファを示す概念図である。図4の例としては、サンプル頂点バッファ100、primtypeバッファ102、および対応する出力104がある。図4の例では、頂点バッファ100は、v0〜v7と示される、8つの頂点を含む。頂点v0〜v7の各々は、パスレンダリングプリミティブの頂点を備える。入力アセンブラ44および、場合によっては、GPU12の他の段階は、primtypeバッファ102の値に基づいて、頂点v0〜v7の各々と関連付けられたプリミティブタイプを決定する。
[0124]図4の例では、primtypeバッファ102は、オープンリセットを示すOR値106で始まる。オープンリセットは、接続されたパスレンダリングプリミティブのセットである新しいサブパスの始端を示す。より具体的には、サブパスの各パスレンダリングプリミティブの最後の頂点は、サブパス内の後続の頂点の第1の頂点と接続される。次のサブバンドがORで始まるか、またはクローズリセット(CR)で始まるかに応じて、GPU12は、サブパスの第1の頂点をサブパスの最後の頂点と接続することができる。各サブパスの終端、および新しいサブパスの始端はまた、後続のリセット値によって示される。
[0125]サブパスの始端を示すオープンリセット値またはクローズリセット値に続いて、およびサブパスの終端を示すリセット値の前に、パスレンダリングプリミティブタイプを示す1つまたは複数のprimtypeバッファ値がある。各プリミティブタイプ値は、サブパスを作り上げるプリミティブのうちの1つを備えた1つまたは複数の頂点のプリミティブタイプを示す。GPU12の入力アセンブラ44は、サブパスの各プリミティブを備えた頂点を決定し、リセットされた始端プリミティブの後に、プリミティブタイプ値の各々に基づいてプリミティブを生成し、各生成されたプリミティブの表現をリソースブロック64内に記憶する。
[0126]頂点バッファ100の頂点と関連付けられたサブパスの数を決定するために、入力アセンブラ44は、任意のオープンリセット値またはクローズリセット値のインデックスを決定するためのprimtypeバッファ102のプリムタイプ値を走査することができる。図4の例では、入力アセンブラ44は、primtypeバッファ102が2つのサブパスを含むことを決定する。第1のサブパスの開始はオープンリセット106によって示され、第1のサブパスの終端はクローズリセット(CR)112によって示される。CR112は、第2のサブパスの開始をやはり示す。図4の例では、第2の最後のサブパスは、サブパスの終端を示すためのリセットを含まない。最後のサブパスがリセットを含まない場合、入力アセンブラ44は、最後のサブパスの終了リセットがクローズリセットであると推論する。
[0127]各サブパスに関して、入力アセンブラ44はまず開始リセットを読み取る。第1のサブパスの場合、開始リセットはOR106である。サブパスの開始リセットを読み取った後、入力アセンブラ44は、サブパスの終了リセットを含めて、サブパスの終了リセットまで、primtypeバッファ102の各プリミティブタイプ値を読み取る。この例では、第1のサブパスのプリミティブタイプは、LINEプリミティブタイプ108と、QUADプリミティブタイプ110とを含み、エンドリセットはCR112である。入力アセンブラ44がprimtypeバッファ102から読み取るこれらのプリミティブタイプに基づいて、入力アセンブラ44は、ラインプリミティブおよび2次ベジェ曲線プリミティブが第1のサブパスのプリミティブを備えることを決定する。
[0128]入力アセンブラは、次いで、頂点バッファ100の頂点を各プリミティブの表現にグループ化する。頂点バッファ100の頂点をプリミティブにグループ化するために、入力アセンブラ44は、サブパスの各プリミティブタイプと関連付けられた頂点の数を決定し、各パスレンダリングプリミティブタイプと関連付けられた頂点の数に基づいて、各プリミティブと関連付けられた頂点バッファ100の頂点をさらに決定する。図4の例では、開始OR106後の第1のプリミティブタイプ値は、ラインパスレンダリングプリミティブタイプに対応するLINEプリミティブタイプ値108である。定義により、ラインは2つの頂点からなるため、入力アセンブラ44は、頂点バッファ100の2つの頂点がラインと関連付けられることを決定する。ラインプリミティブタイプ108に基づいて、入力アセンブラ44は、頂点バッファ100のそれぞれ第1の2つの頂点106および108がラインプリミティブと関連付けられることを決定する。
[0129]入力アセンブラ44が各プリミティブ、この場合、ラインプリミティブの頂点を決定すると、入力アセンブラ44は、頂点(この例では、頂点v0およびv1)を含むプリミティブの表現をリソースブロック64内に記憶する。いくつかの例では、入力アセンブラ44は、primIDを生成し、そのプリミティブIDをプリミティブの表現と関連付ける。入力アセンブラ44またはGPU12の他の段階は、それによってリソースブロック64からプリミティブデータ(たとえば、プリミティブと関連付けられた頂点)にアクセスするインデックスとしてprimIDを利用することができる。
[0130]入力アセンブラは、次いで、プリミティブタイプと、各サブパスの各プリミティブに関する頂点とを決定するプロセスを継続する。図4の例では、入力アセンブラ44は、次のプリミティブタイプがサブパスの次のプリミティブタイプ、定義により、3つの点を有する2次曲線であることを示すQUADプリミティブタイプであることを読み取る。リセット値がない場合、入力アセンブラ44は、最後のプリミティブの頂点(この場合、頂点v1)がサブパスの現在のプリミティブの第1の頂点であることを決定する。このようにして、入力アセンブラ44は、2次曲線が頂点v1、v2、およびv3(頂点122)と関連付けられることを決定する。入力アセンブラ44は、2次曲線プリミティブに関するprimIDを生成し、そのプリミティブをリソースブロック64内に記憶する。
[0131]入力アセンブラは、次いで、第1のサブパスの終端と第2のサブパスの始端とを示すprimtypeバッファ102の次の値CR112を読み取る。サブパスの終了リセットの値が、サブパスの第1の頂点および最後の頂点が接続されていることを示す場合、入力アセンブラ44は、サブパスの第1の頂点と最後の頂点とを接続するラインプリミティブに対応する追加のプリミティブデータを生成し、記憶することができる。第1のサブパスの例では、終了リセットCR112は、第1のサブパスの第1の頂点とそのサブパスの最後の頂点とが接続されていないことを示す。
[0132]新しいサブパスの開始をやはり示す終了リセットを読み取った後、入力アセンブラ44は、次いで、その始端がCR112によって示される第2のサブパスのプリミティブの生成に移る。第2のサブパスの開始を示すCR112を読み取った後、入力アセンブラ44は、第2のサブパスの第1のプリミティブが3つの頂点を有する2次曲線であることを示すQUADプリミティブタイプ値114を読み取る。CR112は新しいサブパスの開始を示すため、入力アセンブラ44は、第2のサブパスの第1の頂点が前の(第1の)サブパスの最後の頂点の後の頂点、この場合、v4であることを決定する。第2のサブパスの第1のプリミティブが2次曲線であると決定した後、入力アセンブラ44は、頂点v4、v5、およびv6(頂点124)がそのプリミティブの一部であることを決定し、2次曲線プリミティブの表現と、その2次プリミティブに関するprimIDとを生成し、primIDとプリミティブ表現とをリソースブロック64内に記憶する。
[0133]入力アセンブラは、次いで、primtypeバッファ102の次の値、すなわち、LINEプリミティブタイプ値116を読み取る。入力アセンブラは、第2のプリミティブの第2のプリミティブが2つの頂点を有するラインプリミティブであることを決定する。入力アセンブラ44は、前のプリミティブの最後の頂点、頂点v6、および次の頂点v7(頂点126)を読み取る。入力アセンブラ44は、次いで、そのプリミティブに関するprimIDを生成し、頂点v6およびv7を含むプリミティブデータの表現、ならびに、primIDをリソースブロック64内に記憶する。
[0134]primtypeバッファ102内にはそれ以上プリミティブタイプ値は存在せず、入力アセンブラ、primtypeバッファ102内に含まれた終了リセット値も存在しないため、入力アセンブラは、第2のサブパスの終了リセットがクローズリセットであり、頂点v7、およびv4、すなわち、第2のサブパスの第1の頂点および最後の頂点が接続されていると推論する。入力アセンブラ44は、v4およびv7を接続するラインプリミティブに関するprimIDを生成し、次いで、そのラインプリミティブの表現と、そのラインプリミティブと関連付けられたprimIDとをリソースブロック64内に記憶する。
[0135]図4は、入力アセンブラが、頂点バッファとprimtypeバッファとに基づいて、プリミティブデータをどのように生成し得るかのただ1つの例を示す。2つのサブパスだけを有するとして示されているが、任意の数のサブパスが可能であり得る。また、図4は、2つのパスレンダリングプリミティブだけを有するサブパスを示すが、任意の数のパスレンダリングプリミティブがサブパス内に含まれ得る。図4は、単一のprimtypeバッファおよび単一の頂点バッファだけを示すが、入力アセンブラ44は、上で説明したように、プリミティブデータを生成するために、頂点バッファおよびprimtypeバッファを多重化することを処理し得る。加えて、primtypeバッファ102はOR値、CR値、LINE値、およびQUAD値だけを有するとして示されているが、ARC(楕円弧)など他の値、および高次曲線プリミティブタイプ値もprimtypeバッファ102内に含まれ得る。
[0136]図5は、本開示の1つまたは複数の例による、GPUの段階を介した状態情報のパスを示す概念図である。図5は、グラフィックスパイプライン40を介して入力アセンブラ44によって最初に生成されるプリミティブタイプ状態変数データの様々な断片の通路を示す。図3に示したように、グラフィックスパイプライン40は、入力アセンブラ44と、頂点シェーダ46と、ハルシェーダ48と、テッセレータ50と、ドメインシェーダ52と、ジオメトリシェーダ54と、リソースブロック64とを含む。上で説明したように、入力アセンブラ44は、各パスレンダリングプリミティブの表現を生成し、関連付けられたprimIDとともに、各プリミティブをリソースブロック64内に記憶する。
[0137]レンダリングされることになる各プリミティブに関して、入力アセンブラ44は、プリミティブ状態変数sv_curr_primtype、sv_prev_primtype、およびsv_next_primtypeを生成することができる。sv_curr_primtypeは、グラフィックスパイプライン40の段階のうちの1つによって現在処理されている現在のプリミティブのタイプを示す。sv_prev_primtypeおよびsv_next_primptypeの値は、前に処理されたプリミティブのプリミティブタイプ、および処理されることになる次のプリミティブをそれぞれ示す。入力アセンブラ44は、primID値と同様の形で、sv_prev_primtype変数、sv_curr_primtype変数、およびsv_next_primtype変数の値を割り当てることができる。
[0138]本開示の技法によれば、入力アセンブラ44は、sv_curr_primtype変数、およびsv_next_primtype変数をハルシェーダ段階48に提供する。sv_curr_primtype変数およびsv_next_primtype変数と、リソースブロック64から受け取られた現在のプリミティブに関するデータと、頂点シェーダ46から受け取られた入力制御点とに基づいて、ハルシェーダ48は、テッセレーション係数を生成し、テッセレータ50に出力する。ハルシェーダ48はまた、出力された制御点、処理されることになる次のプリミティブの開始法線、およびテッセレーション係数を生成し、ドメインシェーダ52に出力する。
[0139]テッセレータ50は、ハルシェーダ48からテッセレーション係数を受け取り、上で説明したように、ドメイン座標をu−v座標ドメイン内に出力する。ストリームアウトが不可能にされる場合、テッセレータ50は、u−v座標をドメインシェーダ52に出力する。グラフィックスパイプラインのある段階からグラフィックスパイプラインの初期段階にデータをフィードバックするためにアプリケーションによって使用され得るオプションであるストリームアウトが可能にされる場合、テッセレータ50は後で使用するためにドメイン座標をリソースブロック64に出力し戻すことができる。
[0140]ドメインシェーダ52は、テッセレータ50から受け取られたドメイン座標およびテッセレーション係数に基づいて、頂点を生成することができる。加えて、ドメインシェーダ52は、ハルシェーダ48から受け取られた可変数の制御点に基づいて、頂点を生成することを受け取ることをサポートし得る。可変数の制御点は、ハルシェーダ48から受け取られたsv_curr_primtypeの値によって示され得る。
[0141]図6は、実行されたとき、GPUに本開示の技法のうちの1つまたは複数を実行させることができるグラフィックスAPIのコードを示す図である。図6は、DirectX 11またはOpenGLなど、グラフィックスAPIの17本の(「ライン1〜17」と呼ばれる)コード例示的なコードを示す。図6のコードが実行されたとき、ライン1〜5(140)GPU12は、それぞれ、頂点シェーダ(ライン1)、ハルシェーダ(ライン2)、ドメインシェーダ(ライン3)、ジオメトリシェーダ(ライン4)、およびピクセルシェーダ(ライン5)に関するリソースを開始または割り振ることができる。
[0142]ライン6〜12(122)のライン6は、実行されたとき、GPU12に、いくつかのパスレンダリングプリミティブを含む定数バッファを割り振らせることができる。ライン7〜12は、レンダリングされることになるベクタグラフィックスパスレンダリングプリミティブ(vector graphics path-rendering primitives)を接合およびストロークするための様々な接合およびストロークパラメータを定義する。ライン13〜17(124)は、ストライド(stride)サイズ(ライン13)およびオフセット(offset)値(ライン14)を定義し、ストライド(stride)とオフセット(offset)とに基づいて、1つまたは複数のプリミティブを含む頂点バッファを割り振り(ライン15)、前に割り振られたprimptypeバッファを指すようにprimtypeバッファを設定し(16)、描画呼出し(ライン17)を含む。
[0143]ライン15で、オフセット(offset)引数は、そこから入力アセンブラ44が頂点バッファの頂点の読取りを始める開始インデックスを示し、ストライド(stride)引数は、GPUがそれらの頂点に正確にアクセスすることができるように、頂点バッファの頂点がどのように配置されるべきかを示す定義する。
[0144]ライン16で、IASetPrimTypeBuffer呼出しは、前に割り振られているprimTypeバッファに対するポインタを第1の引数として解釈する。次の引数は、primtypeバッファの値のフォーマットを定義する。この例では、このフォーマットは定義された32ビットの符号なし整数フォーマットである。ライン17で、DrawPrimType呼出しは、ライン15および16の定義された頂点バッファおよびprimtypeバッファを利用する描画呼出しである。DrawPrimTypeバッファは、レンダリングされることになるプリミティブの数(この例では、6)をその唯一の引数として解釈する。実行されると、DrawPrimType呼出しは、GPU12に頂点バッファ内に含まれたプリミティブを描画させる。
[0145]図7は、本開示によるGPUアクセラレーテッドパスレンダリングを実行するための方法を示す流れ図である。図7に示す技法は、例示のために、図1および図2に示したGPU12によって、図3および図5に示したグラフィカルパイプライン40を用いて実行されるとして説明される。他の例では、図7に示す技法は、同じ構成要素または異なる構成要素を同じ構成もしくは異なる構成で有する他のシステム内で実装され得る。
[0146]図7は、本開示によるGPUアクセラレーテッドパスレンダリングを実行するための例示的な技法を示す流れ図である。単なる例示のために、グラフィックスパイプライン40の様々な段階が図7に示す技法を実行することができる。図7のプロセスにおいて、GPU12の入力アセンブラ44は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る(160)。様々な例では、プリミティブタイプエントリは、ベクタグラフィックスプリミティブタイプデータを備え得る。いくつかの例では、プリミティブタイプエントリは、複数のオープンリセット、クローズリセット、ライン、三角形、弧、2次曲線、3次曲線、およびクワッドを含み得る。
[0147]GPUの頂点バッファの複数の頂点の各々は、複数のプリミティブタイプエントリのうちの1つまたは複数と関連付けられることが可能である。入力アセンブラ44(または、ハルシェーダ48、ドメインシェーダ52など、グラフィックススパイプライン40の別の段階)は、複数の頂点と、関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することができる(162)。GPU12は、次いで、複数の頂点と、プリミティブタイプバッファの関連付けられた1つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることができる(164)。
[0148]様々な例では、図7の方法において、入力アセンブラ44は、プリミティブタイプバッファ内のエントリのうちの1つのエントリに基づいて、頂点バッファの複数の頂点の各々に関する関連付けられたプリミティブタイプを決定するように構成され得る。入力アセンブラ44は、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示をハルシェーダ48とドメインシェーダ52とに出力するようにさらに構成され得る。
[0149]別の例では、ハルシェーダ48は入力アセンブラ44からプリミティブタイプデータを受け取ることができる。ハルシェーダ48は、GPUのテッセレータ50に関する1つまたは複数のテッセレーション係数をさらに決定し、受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することができる。
[0150]テッセレータ50は、ハルシェーダ48から1つまたは複数のテッセレーション係数を受け取ることができる。テッセレータ50はさらに、ハルシェーダ48から、ハルシェーダ48からのテッセレーションドメインタイプを受け取り、1つまたは複数の受け取ったテッセレーション係数に基づいて、テッセレーションドメインをテッセレートすることができる。別の例では、ドメインシェーダ52は、テッセレータ50から複数のドメイン座標を受け取ることができる。ドメインシェーダ52はまた、ハルシェーダ48からプリミティブデータを受け取ることができる。
[0151]本開示で説明する技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明した技法の様々な態様は、1つもしくは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、あるいは任意の他の等価な集積回路またはディスクリート論理回路を含む、1つもしくは複数のプロセッサ内、ならびにそのような構成要素の任意の組合せ内で実装され得る。「プロセッサ」または「処理回路」という用語は、一般に、単独で、あるいは他の論理回路または、処理を実行する個別ハードウェアなどの他の等価回路との組合せで上記の論理回路のいずれかを指すことがある。
[0152]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明する様々な動作および機能をサポートするために、同じデバイス内で、または別のデバイス内で実装され得る。さらに、説明したユニット、モジュール、または構成要素のいずれも、個別であるが相互運用可能な論理デバイスとして、一緒に、または別々に実装され得る。モジュールまたはユニットとしての様々な機能の図は、様々な機能的態様を強調するものであり、そのようなモジュールまたはユニットが別々のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを必ずしも暗示するとは限らない。そうではなく、1つもしくは複数のモジュールまたはユニットに関連する機能は、別々のハードウェア構成要素、ファームウェア構成要素、および/またはソフトウェア構成要素によって実行されるか、あるいは共通もしくは別々のハードウェア構成要素内またはソフトウェア構成要素内に組み込まれることがある。
[0153]また、本開示で説明する技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体中に記憶、実施または符号化され得る。コンピュータ可読媒体中に埋め込まれるか、または符号化される命令は、たとえば、それらの命令が1つまたは複数のプロセッサによって実行されたとき、1つまたは複数のプロセッサに本明細書で説明する技法を実行させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD−ROM、フロッピー(登録商標)ディスク、カセット、磁気媒体、光学媒体、または他の有形のコンピュータ可読記憶媒体を含み得る。
[0154]コンピュータ可読媒体は、上記に記載した有形記憶媒体などの有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。このようにして、「コンピュータ可読媒体」という句は、概して、(1)非一時的である有形コンピュータ可読記憶媒体、および(2)一時的な信号または搬送波などの非有形コンピュータ可読通信媒体に対応し得る。
[0155]様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく本開示の構造または技法に変更を行うことができる。