(57)【要約】  グラフィックス処理ユニット（ＧＰＵ）は、メモリと、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、ＧＰＵの頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定して、ＧＰＵによって、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングするように構成される少なくとも１つのプロセッサとを備える。
2017504888.tif 000002
【特許請求の範囲】
【請求項１】
グラフィックス処理ユニット（ＧＰＵ）によって実行される方法であって、
前記ＧＰＵによって、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取ることと、
ここにおいて、前記ＧＰＵの頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記ＧＰＵによって、前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することと、
前記ＧＰＵによって、前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングすることと、
を備える、方法。
【請求項２】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項１に記載の方法。
【請求項３】
前記ＧＰＵの入力アセンブラによって、前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定すること、
をさらに備える、請求項１に記載の方法。
【請求項４】
前記ＧＰＵのハルシェーダによって、前記ＧＰＵの入力アセンブラからプリミティブタイプデータを受け取ることと、
前記ハルシェーダによって、前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定することと、
前記ハルシェーダによって、前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することと、
をさらに備える、請求項１に記載の方法。
【請求項５】
前記ＧＰＵのテッセレーションユニットによって、前記ＧＰＵのハルシェーダから、前記１つまたは複数のテッセレーション係数を受け取ることと、
前記テッセレーションユニットによって、前記ハルシェーダから、前記ハルシェーダからの前記テッセレーションドメインタイプを受け取ることと、
前記テッセレーションユニットによって、前記１つまたは複数の受け取ったテッセレーション係数に基づいて、前記テッセレーションドメインをテッセレートすることと、
をさらに備える、請求項４に記載の方法。
【請求項６】
前記ＧＰＵのドメインシェーダによって、前記ＧＰＵのテッセレーションユニットから、複数のドメイン座標を受け取ることと、
前記ドメインシェーダによって、前記ＧＰＵのハルシェーダから、プリミティブタイプデータを受け取ることと、
をさらに備える、請求項１に記載の方法。
【請求項７】
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、請求項１に記載の方法。
【請求項８】
前記ＧＰＵの入力アセンブラによって、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵのハルシェーダ段階ならびに前記ＧＰＵのドメインシェーダ段階のうちの少なくとも１つに出力すること、
をさらに備える、請求項１に記載の方法。
【請求項９】
メモリと、
複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取って、
ここにおいて、前記ＧＰＵの頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定して、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングする
ように構成された少なくとも１つのプロセッサと、
を備える、グラフィックス処理ユニット（ＧＰＵ）。
【請求項１０】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項９に記載のＧＰＵ。
【請求項１１】
前記ＧＰＵが、入力アセンブラをさらに備え、前記入力アセンブラが、
前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定する、
ように構成される、請求項９に記載のＧＰＵ。
【請求項１２】
入力アセンブラと、
テッセレーションユニットと、
ハルシェーダと
をさらに備え、前記ハルシェーダが、
前記ＧＰＵの前記入力アセンブラから、プリミティブタイプデータを受け取って、
前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定して、
前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定する、
ように構成される、請求項９に記載のＧＰＵ。
【請求項１３】
前記テッセレーションユニットが、
前記ハルシェーダから、前記１つまたは複数のテッセレーション係数を受け取って、
前記ハルシェーダから、前記ハルシェーダからの前記テッセレーションドメインタイプを受け取って、
前記１つまたは複数の受け取ったテッセレーション係数に基づいて、前記テッセレーションドメインをテッセレートする、
ように構成される、請求項１２に記載のＧＰＵ。
【請求項１４】
テッセレーションユニットと、
ドメインシェーダと、
をさらに備え、前記ドメインシェーダが、
前記ＧＰＵの前記テッセレーションユニットから、複数のドメイン座標を受け取って、
前記ハルシェーダから、プリミティブタイプデータを受け取る、
ようにさらに構成される、請求項９に記載のＧＰＵ。
【請求項１５】
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、請求項９に記載のＧＰＵ。
【請求項１６】
ハルシェーダ段階と、
ドメインシェーダ段階と、
入力アセンブラ段階と、
をさらに備え、前記入力アセンブラが、
現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵの前記ハルシェーダ段階ならびに前記ドメインシェーダ段階のうちの少なくとも１つに出力する、
ように構成される、請求項９に記載のＧＰＵ。
【請求項１７】
複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取るための手段と、
ここにおいて、頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定するための手段と、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングするための手段と、
を備える、装置。
【請求項１８】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項１７に記載の装置。
【請求項１９】
前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定するための手段、
をさらに備える、請求項１７に記載の装置。
【請求項２０】
プリミティブタイプデータを受け取るための手段と、
テッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定するための手段と、
前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定するための手段と、
をさらに備える、請求項１７に記載の装置。
【請求項２１】
前記１つまたは複数のテッセレーション係数を受け取るための手段と、
前記テッセレーションドメインタイプを受け取るための手段と、
前記１つまたは複数の受け取ったテッセレーション係数に基づいて、前記テッセレーションドメインをテッセレートするための手段と、
をさらに備える、請求項２０に記載の装置。
【請求項２２】
複数のドメイン座標を受け取るための手段と、
プリミティブタイプデータを受け取るための手段と、
をさらに備える、請求項１７に記載の装置。
【請求項２３】
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、請求項１７に記載の装置。
【請求項２４】
現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を出力するための手段、
をさらに備える、請求項１７に記載の装置。
【請求項２５】
実行されたとき、少なくとも１つのプロセッサに、
複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取らせて、
ここにおいて、前記ＧＰＵの頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定させて、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングさせる、
命令を記憶した非一時的コンピュータ可読記憶媒体。
【請求項２６】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２７】
実行されたとき、前記少なくとも１つのプロセッサに、前記ＧＰＵの入力アセンブラによって、前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定させる、
命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２８】
実行されたとき、前記少なくとも１つのプロセッサに、
前記ＧＰＵのハルシェーダによって、前記ＧＰＵの入力アセンブラからプリミティブタイプデータを受け取らせて、
前記ハルシェーダによって、前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定させて、
前記ハルシェーダによって、前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定させる、
命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２９】
実行されたとき、前記少なくとも１つのプロセッサに、
前記ＧＰＵのドメインシェーダによって、前記ＧＰＵのテッセレーションユニットから、複数のドメイン座標を受け取らせて、
前記ドメインシェーダによって、前記ＧＰＵのハルシェーダから、プリミティブタイプデータを受け取らせる、
命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項３０】
実行されたとき、前記少なくとも１つのプロセッサに、
前記ＧＰＵの入力アセンブラによって、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵのハルシェーダ段階ならびに前記ＧＰＵのドメインシェーダ段階のうちの少なくとも１つに出力させる命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示は、グラフィックス処理に関し、より詳細には、パスレンダリングのための技法に関する。
【背景技術】
【０００２】
[0002]パスレンダリングは、その各々が１つまたは複数のパスセグメントを含み得る、（あるいは、本明細書で「パス」と呼ばれる）２次元（２Ｄ）ベクタグラフィックスパス（vector graphics paths）のレンダリングを指す場合がある。パスが２つ以上のパスセグメントを含むとき、個々のパスセグメントは、同じタイプまたは異なるタイプのものであり得る。パスセグメントのタイプは、たとえば、線と、楕円弧と、２次ベジェ曲線と、３次ベジェ曲線とを含み得る。いくつかの例では、パスセグメントタイプは、たとえば、Ｏｐｅｎ  Ｖｅｃｔｏｒ  Ｇｒａｐｈｉｃｓ（ＯｐｅｎＶＧ）ＡＰＩなど、標準ベクタグラフィックスアプリケーションプログラミングインターフェース（ＡＰＩ）に従って定義され得る。
【０００３】
[0003]グラフィックス処理ユニット（ＧＰＵ）は、通常、１つまたは複数の３ＤグラフィックスＡＰＩに対応するように設計された３次元（３Ｄ）グラフィックスパイプラインを実装する。今日使用されている一般的な３ＤグラフィックスＡＰＩは、対応デバイスがパスレンダリングコマンドをサポートすることを必要としないため、多くの場合、現代的なＧＰＵがパスレンダリングコマンド用のハードウェアアクセラレーションを提供することはほとんどない。たとえば、現代的なＧＰＵで実装される典型的な３Ｄグラフィックスパイプラインは、（たとえば、点、線、および三角形など）低次の、湾曲していない３Ｄグラフィックスプリミティブをラスタライズするように設計されるが、（たとえば、楕円弧、およびベジェ曲線など）湾曲したプリミティブを直接的にレンダリングすることができないラスタライザを含み得る。
【発明の概要】
【０００４】
[0004]いくつかの例では、本開示は、３Ｄグラフィックスパイプライン内のハードウェアアクセラレーテッドパスレンダリングの性能を改善するハードウェアを含むグラフィックス処理ユニット（ＧＰＵ）を説明する。他の例では、本開示の技法は、ＧＰＵが複数の異なるパスレンダリングプリミティブタイプを有する頂点バッファを処理するのを可能にするグラフィックスアプリケーションプログラミングインターフェース（ＡＰＩ）機能を実装するためのハードウェアおよび方法を含む。本開示はまた、複数の異なるパスレンダリングプリミティブタイプを単一のバッファ、ならびに、頂点バッファの対応する頂点のプリミティブタイプを示す値を記憶することができる追加のプリミティブタイプバッファ内に記憶することができる頂点バッファをサポートする３Ｄグラフィックスレンダリングパイプラインハードウェアを説明する。単一の頂点バッファ内の異なるタイプのプリミティブをサポートすることによって、本開示の技法、方法、ハードウェア、およびデバイスは、ＧＰＵアクセラレーテッドパスベースレンダリングの性能を改善することができる。
【０００５】
[0005]本開示の１つの例示的な方法（たとえば、ＡＰＩ関数呼出し）は、新しいタイプの描画呼出し（draw call）を含み得る。描画呼出しは、複数の異なるパスレンダリングプリミティブタイプの頂点を含み得る頂点バッファを入力として受け取る。描画呼出しはまた、頂点バッファの頂点に対応するプリミティブタイプを示す別のバッファを入力として受け取ることもできる。ＧＰＵパイプラインは、頂点バッファからの異なるパスレンダリングプリミティブタイプの処理をサポートするための、入力アセンブラ、ハルシェーダ、およびドメインシェーダなど、パイプラインの様々な段階に対する修正を含み得る。
【０００６】
[0006]一例では、本開示は、ＧＰＵによって、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取ることと、ここにおいて、ＧＰＵの頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、ＧＰＵによって、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することと、ＧＰＵによって、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることとを備える、グラフィックス処理ユニット（ＧＰＵ）によって実行される方法を説明する。
【０００７】
[0007]別の例では、本開示は、メモリと、少なくとも１つのプロセッサとを備えるグラフィカル処理ユニット（ＧＰＵ）を説明する。少なくとも１つのプロセッサは、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、ＧＰＵの頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、構成される。少なくとも１つのプロセッサは、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定して、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングするようにさらに構成される。
【０００８】
[0008]別の例では、本開示は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取るための手段、ここにおいて、ＧＰＵの頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、を含むグラフィックス処理ユニット（ＧＰＵ）を説明する。ＧＰＵは、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定するための手段と、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングするための手段とをさらに含む。
【０００９】
[0009]別の例では、本開示は、実行されたとき、少なくとも１つのプロセッサに、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取らせる、ここにおいて、ＧＰＵの頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、命令を記憶した非一時的コンピュータ可読記憶媒体を説明する。非一時的コンピュータ可読記憶媒体は、実行されたとき、少なくとも１つのプロセッサに、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定させて、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングさせる命令をさらに含む。
【００１０】
[0010]本開示の１つまたは複数の例の詳細が、添付の図面および下記の説明に記載される。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１１】
【図１】[0011]本開示のＧＰＵアクセラレーテッドパスレンダリング技法を実装するために使用され得る例示的なコンピューティングデバイスを示すブロック図。
【図２】[0012]図１のコンピューティングデバイスの中央処理装置（ＣＰＵ）、グラフィックス処理ユニット（ＧＰＵ）、およびメモリをより詳細に示すブロック図。
【図３】[0013]本開示のＧＰＵアクセラレーテッドパスレンダリング技法を実行することができる例示的なグラフィックスパイプラインを示す概念図。
【図４】[0014]本開示のＧＰＵアクセラレーテッドパスレンダリング技法によるＧＰＵのバッファを示す概念図。
【図５】[0015]本開示の１つまたは複数の例による、ＧＰＵの段階を介した状態情報のパスを示す概念図。
【図６】[0016]実行されたとき、ＧＰＵに本開示の技法のうちの１つまたは複数を実行させることができるグラフィックスＡＰＩのコードを示す図。
【図７】[0017]本開示によるＧＰＵアクセラレーテッドパスレンダリングを実行するための例示的な技法を示す流れ図。
【発明を実施するための形態】
【００１２】
[0018]本開示は、ＧＰＵアクセラレーテッドパスレンダリングを実行するための技法に関する。パスレンダリングは、その各々が１つまたは複数のパスセグメントを含み得る（あるいは、本明細書で「パス」と呼ばれる）２次元（２Ｄ）ベクタグラフィックスパスのレンダリングを指す場合がある。パスが２つ以上のパスセグメントを含むとき、個々のパスセグメントは、同じタイプまたは異なるタイプのものであり得、「プリミティブタイプ」とも呼ばれる。パスセグメントのプリミティブタイプは、たとえば、線、楕円弧、２次ベジェ曲線、および３次ベジェ曲線などを含み得る。いくつかの例では、パスセグメントタイプは、たとえば、Ｏｐｅｎ  Ｖｅｃｔｏｒ  Ｇｒａｐｈｉｃｓ（ＯｐｅｎＶＧ）ＡＰＩなど、標準ベクタグラフィックスアプリケーションプログラミングインターフェース（ＡＰＩ）に従って定義され得る。
【００１３】
[0019]グラフィックス処理ユニット（ＧＰＵ）は、１つまたは複数の３ＤグラフィックスＡＰＩに対応するように設計された３次元（３Ｄ）グラフィックスパイプラインを実装するように構成され得る。今日使用されている一般的な３ＤグラフィックスＡＰＩは、対応デバイス（たとえば、ＧＰＵ）がパスレンダリングコマンドをサポートすることを必要としないため、多くの場合、現代的なＧＰＵがパスレンダリングコマンド用のハードウェアアクセラレーションを提供することはほとんどない。たとえば、現代的なＧＰＵで実装される典型的な３Ｄグラフィックスパイプラインは、（たとえば、点、線、および三角形など）低次の、湾曲していない３Ｄグラフィックスプリミティブをラスタライズするように設計されるが、（たとえば、楕円弧、およびベジェ曲線など）湾曲したパスレンダリングプリミティブを直接的にレンダリングすることができない場合があるラスタライザを含み得る。
【００１４】
[0020]パスレンダリングに関する一手法は、パスレンダリングコマンドを実行する目的で部分的なＧＰＵハードウェアアクセラレーションを提供するために３Ｄ  ＧＰＵプラインを使用することに関連し得る。この手法は、パスセグメントを、ＧＰＵによってラスタライズされ得る、１つまたは複数の低次の、湾曲していないグラフィックスプリミティブに変換するために、別のプロセッサ（たとえば、中央処理装置（ＣＰＵ））を用いてパスセグメントを前処理することに関連する。グラフィックスプリミティブを指定するために、アプリケーションは、「描画呼出し」と呼ばれるグラフィックスＡＰＩの１つまたは複数の関数を呼び出すことができる。
【００１５】
[0021]描画呼出しは、引数として、頂点バッファを含み得る。頂点バッファは１つまたは複数の頂点を含む。描画呼出し内で指定される頂点バッファの頂点は、一般に、単一のプリミティブタイプに限定され、異なるプリミティブタイプと関連付けられた頂点は、追加の後続の描画呼出し内で指定されなければならない。描画呼出しは、従来は、頂点バッファの頂点が同じプリミティブタイプのものであることを必要とするため、ＧＰＵは頂点の各々がどのプリミティブに属するかをさらに容易に決定することができる。たとえば、ＧＰＵが、各２次ベジェ曲線（「クワッド（quad）」）が３つの頂点を有し、描画呼出しによって指定された特定の頂点バッファの頂点の各々がクワッドに属すると決定した場合、ＧＰＵは、２つおきの頂点が新しいクワッドプリミティブの開始を標示すると推論することができる。
【００１６】
[0022]しかしながら、たとえば、パスレンダリングを実行するとき、レンダリングされることになるプリミティブタイプの各々に対応する異なる描画呼出しを実行することに関連するかなりのオーバーヘッドが存在する。各描画呼出しは、割振りのための処理時間とメモリとを必要とする、別個の頂点バッファの割振りを必要とする。同様にいくつかの例では、ＣＰＵは、頂点バッファにメモリを割り振り、頂点バッファデータをＧＰＵに転送することができる。各ＣＰＵ・ＧＰＵ転送は、複数の異なるパスレンダリングタイプの各々に対応する描画呼出しを実行するとき、パスベースレンダリングを実行する性能を低減し得る大量のレイテンシをもたらし得る。
【００１７】
[0023]いくつかの例では、ＧＰＵは、たとえば、ＭｉｃｒｏｓｏｆｔのＤｉｒｅｃｔＸ  １１  ＡＰＩなど、特定の３ＤグラフィックスＡＰＩによって指定されたグラフィックスアーキテクチャを使用して、パスセグメントをテッセレートおよびレンダリングすることができる。下でより詳細に説明するように、本開示で説明する技法は、パスレンダリングを実行するためのグラフィックスハードウェア、具体的には、入力アセンブラ段階、ハルシェーダ段階、ドメインシェーダ段階、およびジオメトリシェーダ段階に対する可能な修正について説明する。このようにして、本開示で説明する技法は、ＤｉｒｅｃｔＸ  １１アーキテクチャのグラフィックスハードウェアが、複数の異なるプリミティブタイプと関連付けられた頂点を含む頂点バッファを使用して、パスレンダリングを実行するのを可能にする。
【００１８】
[0024]本開示による技法は、ＧＰＵが複数の異なるプリミティブタイプに対応する頂点の頂点バッファを受け取るのを可能にする。グラフィックスレンダリングを実行するアプリケーションを実行するとき、ＣＰＵまたは別の処理ユニットは、頂点データ（すなわち、頂点）を記憶するためのバッファをシステムメモリ内に割り振ることができる。ＣＰＵは、実行アプリケーションの命令に基づいて頂点データを生成し、それらの頂点を頂点バッファに割り振られたメモリ内に記憶することができる。いくつかの頂点がＣＰＵによって頂点バッファに記憶されると、ＣＰＵはシステムメモリ内に記憶された頂点バッファをＧＰＵに転送することができる。ＧＰＵは、次いで、頂点バッファの頂点を受け取り、たとえば、ＧＰＵのメモリ内に記憶する。
【００１９】
[0025]異なるプリミティブタイプに対応する頂点を有する単一の頂点バッファをサポートするために、本開示の技法は新しい描画呼出しを含む。新しい描画呼出しは、呼出しに対する引数として、複数のプリミティブタイプと関連付けられることがきる頂点を有する頂点バッファを含む。新しい描画呼出しはまた、引数として、追加のプリミティブタイプバッファ（「ｐｒｉｍｔｙｐｅバッファ」）を含む。ｐｒｉｍｔｙｐｅバッファの値は、頂点バッファの１つまたは複数の頂点が関連付けられたプリミティブタイプを示す１つまたは複数のプリミティブタイプエントリを備え得る。ｐｒｉｍｔｙｐｅバッファ内に記憶された値に基づいて、ＧＰＵは、頂点バッファの頂点の各々と関連付けられたプリミティブタイプを決定し、各プリミティブと関連付けられた頂点を含む各プリミティブの表現を記憶する。
【００２０】
[0026]本開示の例示的な技法はまた、複数の異なるプリミティブタイプの頂点バッファの頂点をサポートするためのグラフィックスパイプラインに対する修正を含む。本開示の技法は、頂点バッファ値およびｐｒｉｍｔｙｐｅバッファ値を解釈することができる入力アセンブラと、入力アセンブラ段階から受け取られたプリミティブタイプ状態値に部分的に基づいて、複数のプリミティブに関する制御点を生成することができるハルシェーダ段階とを含む。本開示のグラフィックスパイプラインはまた、ハルシェーダによって生成された制御点に基づいてドメイン座標を作り出すテッセレータ段階と、テッセレータによって生成されたドメイン座標および入力アセンブラから受け取られたプリミティブタイプ状態値に基づいて、頂点データを生成するドメインシェーダとを含む。本開示の技法は、入力アセンブラによって生成されたプリミティブ状態に基づいて、３Ｄ頂点座標を出力するように構成されたジオメトリシェーダ段階をさらに含む。
【００２１】
[0027]パスレンダリングは、２つの主な動作、すなわち、（１）パスセグメントのフィル（filling）と、（２）パスセグメントのストローク（stroking）とに分割され得る。いくつかの例では、パスを完全にレンダリングするために、フィルおよびストロークのうちの１つまたはそれらの両方が実行され得る。概念的に、フィル動作は、指定されたフィル色を用いてパスセグメントの内部領域をフィルすることに対応し得る。
【００２２】
[0028]ストローク動作は、概念的に、パスに垂直に保持された直線ペンを使用して、パスセグメントの縁を「拡大すること」に対応し得る。主な動作に加えて、パスレンダリングは、様々なタイプのダッシング、エンドキャップをパスの終端に適用することと、パスの内部パスセグメントの終点同士の間に様々なタイプの接合を適用することと、リテッセレーションを使用してカスプを処理することとに関連する場合もある。
【００２３】
[0029]ＧＰＵは、「テッセレーションユニット」、すなわち、テッセレータとも呼ばれるテッセレーション段階を使用して、プリミティブ、すなわち、パスセグメントをテッセレート（たとえば、分割）することができる。ＧＰＵがパスセグメントをテッセレートした後、ＧＰＵは、テッセレータ段階が決定して、ＧＰＵグラフィックスレンダリングパイプライン内の後続の段階に出力するドメイン座標に基づいて３Ｄ形状を生成するように構成され得る。グラフィックスパイプラインの後続の段階は、テッセレータ段階の出力に基づいて、頂点座標を生成することができる。
【００２４】
[0030]図１は、本開示のＧＰＵアクセラレーテッドパスレンダリング技法を実装するために使用され得る例示的なコンピューティングシステム２を示すブロック図である。コンピューティングデバイス２は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、タブレットコンピューティングデバイス、ビデオゲームプラットフォームもしくはコンソール、（たとえば、モバイル電話、セルラー電話、衛星電話、および／もしくはモバイル電話ハンドセットなど）ワイヤレス通信デバイス、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末（ＰＤＡ）などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および／もしくは表示する任意の他のタイプのデバイスを備えることができる。
【００２５】
[0031]図１の例に示すように、コンピューティングデバイス２は、ユーザインターフェース４と、ＣＰＵ６と、メモリコントローラ８と、メモリ１０と、グラフィックス処理ユニット（ＧＰＵ）１２と、ＧＰＵキャッシュ１４と、ディスプレイインターフェース１６と、ディスプレイ１８と、バス２０とを含む。ユーザインターフェース４、ＣＰＵ６、メモリコントローラ８、ＧＰＵ１２、およびディスプレイインターフェース１６は、バス２０を使用して互いと通信することができる。図１に示す異なる構成要素同士の間のバスおよび通信インターフェースの特定の構成は単なる例示であり、本開示の本技法を実装するために、同じもしくは異なる構成要素を備えたコンピューティングデバイスおよび／または他のグラフィックス処理システムの他の構成が使用され得ることに留意されたい。
【００２６】
[0032]ＣＰＵ６は、コンピューティングデバイス２の動作を制御する汎用プロセッサまたは専用プロセッサを備えることができる。ユーザは、ＣＰＵ６に１つまたは複数のソフトウェアアプリケーションを実行させるための入力をコンピューティングデバイス２に与えることができる。ＣＰＵ６上で実行されるそれらのソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、ユーザインターフェース４を介してコンピューティングデバイス２に結合される、キーボード、マウス、マイクロフォン、タッチパッドまたは別の入力デバイスなど、１つもしくは複数の入力デバイス（図示せず）を介してコンピューティングデバイス２に入力を与えることができる。
【００２７】
[0033]ＣＰＵ６上で実行するソフトウェアアプリケーションは、グラフィックスデータをディスプレイ１８にレンダリングさせるようにＧＰＵ１２に命令する、１つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、たとえば、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ（ＯｐｅｎＧＬ（商標登録））ＡＰＩ、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ  Ｅｍｂｅｄｄｅｄ  Ｓｙｓｔｅｍ（ＯｐｅｎＧＬ  ＥＳ）ＡＰＩ、Ｄｉｒｅｃｔ３Ｄ  ＡＰＩ、ＤｉｒｅｃｔＸ  ＡＰＩ、ＲｅｎｄｅｒＭａｎ  ＡＰＩ、ＷｅｂＧＬ  ＡＰＩ、ＯｐｅｎＶＧ（登録商標）、または任意の他の公的もしくは所有権を主張できる標準グラフィックスＡＰＩなど、グラフィックスアプリケーションプログラミングインターフェース（ＡＰＩ）に準拠し得る。グラフィックスレンダリング命令を処理するために、ＣＰＵ６は、ＧＰＵ１２にグラフィックスデータのレンダリングのうちの一部またはすべてを実行させるようにＧＰＵ１２に命令するための、１つまたは複数のグラフィックスレンダリングコマンドを発行することができる。いくつかの例では、レンダリングされることになるグラフィックスデータは、１つまたは複数の頂点バッファを含み得る。頂点バッファは、たとえば、点、線、三角形、四角形、トライアングルストリップ（triangle strips）、パッチなど、グラフィックスプリミティブのリストを含み得る。さらなる例では、レンダリングされることになる頂点バッファグラフィックスデータは、たとえば、ラインセグメント、楕円弧、二次ベジェ曲線、および三次ベジェ曲線など、１つまたは複数のパスレンダリングプリミティブを含み得る。
【００２８】
[0034]メモリコントローラ８は、メモリ１０との間を行き来するデータの転送を容易にする。たとえば、メモリコントローラ８は、メモリ読取り要求とメモリ書込み要求とをＣＰＵ６および／またはＧＰＵ１２から受け取って、コンピューティングデバイス２内の構成要素にメモリサービスを提供するために、メモリ１０に関するそのような要求にサービス提供することができる。メモリコントローラ８はメモリ１０に通信可能に結合される。メモリコントローラ８は、図１の例示的なコンピューティングデバイス２内で、ＣＰＵ６、ＧＰＵ１２、およびメモリ１０の各々とは別である処理モジュールとして示されているが、他の例では、メモリコントローラ８の機能の一部またはすべては、ＣＰＵ６、ＧＰＵ１２、およびメモリ１０のうちの１つもしくは複数の上で実装され得る。
【００２９】
[0035]メモリ１０は、ＣＰＵ６による実行のためにアクセス可能なプログラムモジュールおよび／もしくは命令、ならびに／またはＣＰＵ６上で実行するプログラムによって使用するためのデータを記憶することができる。たとえば、メモリ１０は、ユーザアプリケーションと、それらのアプリケーションと関連付けられたグラフィックスデータとを記憶することができる。メモリ１０は、コンピューティングデバイス２の他の構成要素によって使用するため、および／または生成されるための情報を記憶することも可能である。たとえば、メモリ１０は、ＧＰＵ１２のデバイスメモリとして機能することができ、ＧＰＵ１２によって演算されことになるデータ、ならびにＧＰＵ１２によって実行される演算の結果生じるデータを記憶することができる。たとえば、メモリ１０は、パスデータ、パスセグメントデータ、表面、テクスチャバッファ、デプスバッファ、ステンシルバッファ、頂点バッファ、フレームバッファなどの任意の組合せを記憶することができる。加えて、メモリ１０は、ＧＰＵ１２によって処理するためのコマンドストリームを記憶することができる。たとえば、メモリ１０は、パスレンダリングコマンド、３Ｄグラフィックスレンダリングコマンド、および／または汎用ＧＰＵ（ＧＰＧＰＵ）コンピューティングコマンドを記憶することができる。メモリ１０は、たとえば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、同期式ダイナミックランダムアクセスメモリ（ＳＤＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体または光記憶媒体など、１つもしくは複数の揮発性または不揮発性のメモリあるいは記憶デバイスを含み得る。
【００３０】
[0036]ＧＰＵ１２は、ＣＰＵ６によってＧＰＵ１２に発行されたコマンドを実行するように構成され得る。ＧＰＵ１２によって実行されるコマンドは、グラフィックスコマンド、本開示の技法による描画呼出し（draw call）コマンド、ＧＰＵ状態プログラミングコマンド、メモリ転送コマンド、汎用コンピューティングコマンド、カーネル実行コマンド、テッセレーションコマンドなどを含み得る。
【００３１】
[0037]いくつかの例では、ＧＰＵ１２は、ディスプレイ１８に１つまたは複数のグラフィックスプリミティブをレンダリングするためのグラフィックス演算を実行するように構成され得る。そのような例では、ＣＰＵ６上で実行するソフトウェアアプリケーションの１つがグラフィックス処理を必要とするとき、ＣＰＵ６は、ディスプレイ１８にレンダリングするためのグラフィックスデータをＧＰＵ１２に提供して、ＧＰＵ１２に対する１つまたは複数のグラフィックスコマンドを発行することができる。グラフィックスコマンドは、たとえば、描画呼出しコマンド、ＧＰＵ状態プログラミングコマンド、条件付きコマンド、メモリ転送コマンド、ブリッティング（blitting）（ブロック転送またはＢＬＴ）コマンド、テッセレーションコマンドなどを含み得る。グラフィカルデータは、頂点データ、テクスチャデータ、表面データなどを含み得る。いくつかの例では、ＣＰＵ６は、コマンドとグラフィックスデータとをＧＰＵ１２によってアクセス可能なメモリ１０に書き込むことによって、コマンドとグラフィックスデータとをＧＰＵ１２に提供することができる。
【００３２】
[0038]本開示の技法によれば、ＣＰＵ６は、描画呼出しを使用してグラフィックスデータをＧＰＵ１２に提供することができる。描画呼出しは、引数として、複数の異なる頂点タイプの頂点を含む頂点バッファまたは頂点バッファに対するポインタを受け取ることができる。描画呼出しはまた、引数として、ｐｒｉｍｔｙｐｅバッファを受け取ることができる。ｐｒｉｍｔｙｐｅバッファの（エントリとも呼ばれる）値は、頂点バッファ内に含まれた１つまたは複数の頂点と関連付けられた対応するプリミティブタイプを示し得る。描画呼出しは、いくつかの例では、引数として、頂点バッファおよびｐｒｉｍｔｙｐｅバッファに対するポインタをやはり受け取ることができる。頂点バッファおよびｐｒｉｍｔｙｐｅバッファはメモリ１０内に記憶される。
【００３３】
[0039]ＣＰＵ６は、メモリ１０の一部を頂点バッファとｐｒｉｍｔｙｐｅバッファとに割り振ることができる。ＣＰＵ６は、頂点バッファに関する頂点データを生成し、たとえば、描画呼出しを介して、バス２０を使用して、メモリの割り振られた部分にそれらの頂点を転送することができる。プログラムがＣＰＵ６に描画呼出しを呼び出させるとき、ＣＰＵ６は、メモリコントローラ８に、バス２０を使用して、頂点バッファデータおよびｐｒｉｍｔｙｐｅバッファデータをＧＰＵ１２に転送させることができる。ＧＰＵ１２は、頂点バッファデータおよびｐｒｉｍｔｙｐｅバッファデータをＣＰＵのメモリ内に記憶することができる。
【００３４】
[0040]ＧＰＵ１２は、グラフィック演算についてＣＰＵ６よりも効率的な処理を行う高並列構造を用いて構築され得る。たとえば、ＧＰＵ１２は、複数の頂点、制御点、画素および／または他のデータに関して並列な形で演算するように構成された複数の処理要素を含み得る。ＧＰＵ１２の高並列性質は、いくつかの例では、ＧＰＵ１２が、ＣＰＵ６を使用して画像をレンダリングするよりもより迅速にグラフィックス画像（たとえば、ＧＵＩおよび２次元（２Ｄ）ならびに／または３次元（３Ｄ）のグラフィックスシーン）をディスプレイ１８上にレンダリングするのを可能にする。加えて、ＧＰＵ１２の高並列性質は、ＧＰＵ１２が、ＣＰＵ６よりもより迅速に、汎用コンピューティングアプリケーションに関して、ある種のタイプのベクトル演算および行列演算を処理するのを可能にし得る。
【００３５】
[0041]下でより詳細に説明する、本開示の技法によれば、ＧＰＵ１２は、異なるプリミティブタイプの頂点を備えた単一の頂点バッファを受け取るように構成され得る。上で説明したように、ＧＰＵ１２は、ＣＰＵ６によって開始されたメモリ転送によって、システムメモリ１０から頂点バッファ４０のうち１つの頂点バッファを受け取ることができる。ＧＰＵ１２はまた、頂点バッファの頂点のプリミティブタイプを示すｐｒｉｍｔｙｐｅバッファを受け取るように構成され得る。本開示による一例として、ＧＰＵ１２は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、ＧＰＵ１２の頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、構成され得る。ＧＰＵ１２は、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定し、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることができる。
【００３６】
[0042]いくつかの例では、ＧＰＵ１２は、コンピューティングデバイス２のマザーボードに統合され得る。他の例では、ＧＰＵ１２は、コンピューティングデバイス２のマザーボードにおけるポートに設置されるグラフィックスカード上に存在し得るか、または場合によっては、コンピューティングデバイス２と相互運用するように構成された周辺デバイス内に組み込まれ得る。さらなる例では、ＧＰＵ１２は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。ＧＰＵ１２は、１つもしくは複数のマイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）、あるいは他の等価な集積論理回路または個別論理回路など、１つもしくは複数のプロセッサを含み得る。
【００３７】
[0043]いくつかの例では、ＧＰＵ１２はＧＰＵキャッシュ１４に直接結合され得る。したがって、ＧＰＵ１２は、必ずしもバス２０を使用せずに、ＧＰＵキャッシュ１４からデータを読み取り、ＧＰＵキャッシュ１４にデータを書き込むことができる。言い換えれば、ＧＰＵ１２は、オフチップメモリの代わりに、ローカルストレージを使用してデータをローカルで処理することができる。これにより、ＧＰＵ１２は、大量のバストラフィックを受けることがある、バス２０を介したデータの読取りおよび書込みの必要がなくなるので、より効率的な方法で動作できるようになる。しかしながら、いくつかの例では、ＧＰＵ１２は、別個のキャッシュを含まず、代わりに、バス２０を介してメモリ１０を利用することができる。ＧＰＵキャッシュ１４は、たとえば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気データ媒体または光学データ媒体など、１つもしくは複数の揮発性または不揮発性のメモリあるいは記憶デバイスを含み得る。
【００３８】
[0044]ＣＰＵ６および／またはＧＰＵ１２は、レンダリングされた画像データをメモリ１０内に割り振られたフレームバッファ内に記憶することができる。レンダリングされた画像データは、レンダリングされることになるパスセグメントに関してレンダリングされたフィル領域とストローク領域とを含み得る。ディスプレイインターフェース１６は、データをフレームバッファから取り出して、レンダリングされた画像データによって表される画像を表示するようにディスプレイ１８を構成することができる。いくつかの例では、ディスプレイインターフェース１６は、フレームバッファから取り出されたデジタル値をディスプレイ１８によって消費され得るアナログ信号に変換するように構成されたデジタルアナログ変換器（ＤＡＣ）を含み得る。他の例では、ディスプレイインターフェース１６は、処理のために、デジタル値をディスプレイ１８に直接的に渡すことができる。
【００３９】
[0045]ディスプレイ１８は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ（ＬＣＤ）、プラズマディスプレイパネル、発光ダイオード（ＬＥＤ）アレイ、陰極線管（ＣＲＴ）ディスプレイ、電子ペーパー、表面伝導型電子放出素子ディスプレイ（ＳＥＤ）、レーザテレビジョンディスプレイ、ナノ結晶ディスプレイまたは別のタイプのディスプレイユニットを含み得る。ディスプレイ１８はコンピューティングデバイス２内に統合され得る。たとえば、ディスプレイ１８は、モバイル電話ハンドセットまたはタブレットコンピュータのスクリーンとすることができる。あるいは、ディスプレイ１８は、ワイヤード通信リンクまたはワイヤレス通信リンクを介してコンピュータデバイス２に結合されるスタンドアロンデバイスとすることができる。たとえば、ディスプレイ１８は、ケーブルリンクまたはワイヤレスリンクを介してパーソナルコンピュータに接続されるコンピュータモニタまたはフラットパネルディスプレイとすることができる。
【００４０】
[0046]バス２０は、第１世代、第２世代、および第３世代のバス構造ならびにバスプロトコルと、共有バス構造およびバスプロトコルと、ポイントツーポイントバス構造およびバスプロトコルと、一方向バス構造およびバスプロトコルと、双方向バス構造およびバスプロトコルとを含めて、バス構造およびバスプロトコルの任意の組合せを使用して実装され得る。バス２０を実装するために使用され得る様々なバス構造およびバスプロトコルの例は、たとえば、ＨｙｐｅｒＴｒａｎｓｐｏｒｔバス、ＩｎｆｉｎｉＢａｎｄバス、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔ（ＡＧＰ）バス、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）バス、ＰＣＩ  Ｅｘｐｒｅｓｓバス、Ａｄｖａｎｃｅｄ  Ｍｉｃｒｏｃｏｎｔｒｏｌｌｅｒ  Ｂｕｓ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＡＭＢＡ）Ａｄｖａｎｃｅｄ  Ｈｉｇｈ−ｐｅｒｆｏｒｍａｎｃｅ  Ｂｕｓ（ＡＨＢ）、ＡＭＢＡ  Ａｄｖａｎｃｅｄ  Ｐｅｒｉｐｈｅｒａｌ  Ｂｕｓ（ＡＰＢ）、およびＡＭＢＡ  Ａｄｖａｎｃｅｄ  ｅＸｅｎｔｉｓｉｂｌｅ  Ｉｎｔｅｒｆａｃｅ（ＡＸＩ）バスを含む。他のタイプのバス構造およびバスプロトコルも使用され得る。
【００４１】
[0047]いくつかの例では、ＧＰＵ１２は、キャップおよび接合および／またはダッシングパターンに関するドメイン座標を決定することができ、プリミティブをサブセグメントに分割することができる。ＧＰＵ１２はまた、ダッシングパターンに基づいて、セグメントを維持すること、またはセグメントを破棄することなど、そのパターンに基づいて、グラフィカル演算を実行することもできる。ドメインシェーダ段階など、後続の段階は、ドメイン座標を入力として受け取ることができ、それらのドメイン座標に基づいて、頂点座標を決定することができる。
【００４２】
[0048]ストローク動作の一環として、およびラインセグメントのストローク領域に空間的に対応する１つまたは複数のプリミティブ（たとえば、三角形プリミティブ）を生成するために、ＧＰＵ１２は、式、たとえば、パラメータ式などによって定義され得るプリミティブを受け取ることができる。ＧＰＵ１２は、テッセレーションユニットを利用して、受け取ったプリミティブを１つまたは複数のラインセグメントに分割することができる。
【００４３】
[0049]本開示で説明するパスレンダリング技法は、たとえば、ＣＰＵ６と、ＧＰＵ１２と、メモリ１０とを含めて、図１に示されるコンピューティングデバイス２の構成要素のうちのいずれかの中で実装され得る。いくつかの例では、パスレンダリング技法のすべてまたは大部分は、ＧＰＵ１２内（たとえば、ＧＰＵ１２のグラフィカルパイプライン内）で実装され得る。追加の例では、ＣＰＵ６は、本開示のパスレンダリング技法を実行するＧＰＵ１２内のパスレンダリングパイプラインを実装するために、グラフィックスパイプラインの状態を構成して、シェーダプログラムをグラフィックスパイプラインと結合させるための技法を実装することができる。さらなる例では、ＣＰＵ６は、レンダリングされることになるパスを示すデータを、１つまたは複数のパスをレンダリングするためにＧＰＵ１２によってアクセスされ得る１つまたは複数のバッファ（たとえば、１つまたは複数の頂点バッファおよびｐｒｉｍｔｙｐｅバッファ）内に配置するように構成され得る。
【００４４】
[0050]図２は、図１のコンピューティングデバイス２のＣＰＵ６、ＧＰＵ１２、およびメモリ１０をさらに詳細に示すブロック図である。図２に示すように、ＣＰＵ６はＧＰＵ１２とメモリ１０とに通信可能に結合され、ＧＰＵ１２はＣＰＵ６とメモリ１０とに通信可能に結合される。いくつかの例では、ＧＰＵ１２は、ＣＰＵ６によってマザーボードに統合され得る。追加の例では、ＧＰＵ１２は、ＣＰＵ６を含むマザーボードのポート内にインストールされたグラフィックスカード上で実装され得る。さらなる例では、ＧＰＵ１２は、ＣＰＵ６と相互作用するように構成された周辺デバイス内に組み込まれることが可能である。追加の例では、ＧＰＵ１２は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。
【００４５】
[0051]ＣＰＵ６は、ソフトウェアアプリケーション２４と、グラフィックスアプリケーション処理インターフェース（ＡＰＩ）２６と、ＧＰＵドライバ２８と、オペレーティングシステム３０とを実行するように構成される。ソフトウェアアプリケーション２４は、グラフィックス画像を表示させる１つもしくは複数の命令および／または非グラフィックスタスク（たとえば、汎用コンピューティングタスク）をＧＰＵ１２上で実行させる１つもしくは複数の命令を含み得る。ソフトウェアアプリケーション２４は、グラフィックスＡＰＩ２６に対する命令を発行することができる。グラフィックスＡＰＩ２６は、ソフトウェアアプリケーション２４から受け取った命令をＧＰＵドライバ２８によって消費され得るフォーマットに変換するランタイムサービスであり得る。ＧＰＵドライバ２８は、グラフィックスＡＰＩ２６を介して、ソフトウェアアプリケーション２４から命令を受け取って、それらの命令にサービス提供するためにＧＰＵ１２の演算を制御する。たとえば、ＧＰＵドライバ２８は、１つまたは複数のコマンド３８を構築して、コマンド３８をメモリ１０内に配置して、コマンド３８を実行するようにＧＰＵ１２に命令することができる。いくつかの例では、ＧＰＵドライバ２８は、コマンド３８をメモリ１０内に配置して、オペレーティングシステム３０、たとえば、１つまたは複数のシステム呼出しを介してＧＰＵ１２と通信することができる。
【００４６】
[0052]ＧＰＵ１２は、コマンドエンジン３２と、１つまたは複数の処理ユニット３４とを含む。いくつかの例では、１つまたは複数の処理ユニット３４は、３Ｄグラフィックスレンダリングパイプライン、たとえば、ＤＸ  １１グラフィックスレンダリングパイプライン（すなわち、ＤＸ  １１グラフィックスＡＰＩに準拠する３Ｄグラフィックスパイプライン）を形成および／または実装することができる。
【００４７】
[0053]コマンドエンジン３２は、（たとえば、メモリ１０を介して）ＣＰＵ６からコマンドを受け取って、ＧＰＵ１２にそれらのコマンドを実行させるように構成される。状態コマンドを受け取ることに応答して、コマンドエンジン３２は、状態コマンドに基づいて、ＧＰＵ１２内の１つもしくは複数の状態レジスタを特定の値に設定するように、および／または状態コマンドに基づいて、固定関数処理ユニット３４のうちの１つもしくは複数を構成するように構成され得る。描画呼出しコマンドを受け取ることに応答して、コマンドエンジン３２は、処理ユニット３４に、レンダリングされることになる頂点バッファ４１の頂点内に含まれ得る、レンダリングされることになるパスのタイプを示すデータ、ならびに、ｐｒｉｍｔｙｐｅバッファ４２の頂点バッファの頂点のプリミティブタイプを示すデータに基づいて、メモリ１０内の頂点によって表された形状をレンダリングさせるように構成され得る。コマンドエンジン３２は、シェーダプログラム結合コマンドを受け取って、それらのシェーダプログラム結合コマンドに基づいて、特定のシェーダプログラムをプログラマブル処理ユニット３４のうちの１つまたは複数にロードすることも可能である。
【００４８】
[0054]処理ユニット３４は、その各々がプログラマブル処理ユニットまたは固定関数処理ユニットであり得る、１つもしくは複数の処理ユニットを含み得る。プログラマブル処理ユニットは、たとえば、ＣＰＵ６からＧＰＵ１２上にダウンロードされた１つまたは複数のシェーダプログラムを実行するように構成されたプログラマブルシェーダユニットを含み得る。いくつかの例では、シェーダプログラムは、たとえば、ＯｐｅｎＧＬ  Ｓｈａｄｉｎｇ  Ｌａｎｇｕａｇｅ（ＧＬＳＬ）、Ｈｉｇｈ  Ｌｅｖｅｌ  Ｓｈａｄｉｎｇ  Ｌａｎｇｕａｇｅ（ＨＬＳＬ）、Ｃ  ｆｏｒ  Ｇｒａｐｈｉｃｓ（Ｃｇ）シェーディング言語など、ハイレベルシェーディング言語で書き込まれたプログラムのコンパイルバージョンであり得る。いくつかの例では、プログラマブルシェーダユニットは、並列して動作するように構成された複数の処理ユニット、たとえば、ＳＩＭＤパイプラインを含み得る。プログラマブルシェーダユニットは、シェーダプログラム命令を記憶するプログラムメモリと、実行状態レジスタ、たとえば、実行されているプログラムメモリ内の現在の命令またはフェッチされることになる次の命令を示すプログラムカウンタレジスタとを有し得る。処理ユニット３４内のプログラマブルシェーダユニットは、たとえば、頂点シェーダユニット、ピクセルシェーダユニット、ジオメトリシェーダユニット、ハルシェーダユニット、ドメインシェーダユニット、コンピュートシェーダユニット、および／またはユニファイドシェーダユニットを含み得る。
【００４９】
[0055]固定関数処理ユニットは、ある種の機能を実行するために配線接続されたハードウェアを含み得る。固定関数ハードウェアは、１つまたは複数の制御信号を介して、たとえば、異なる機能を実行するように構成され得るが、固定関数ハードウェアは、通常、ユーザコンパイルプログラムを受け取ることができるプログラムメモリを含まない。いくつかの例では、処理ユニット３４内の固定関数処理ユニットは、たとえば、デプステスト、シザーテスト、アルファブレンディングなどおよび、ラスタ演算を実行する処理ユニットを含み得る
[0066]メモリ１０は、パスデータ３６と、１つまたは複数のコマンド３８とを記憶することができる。いくつかの例では、パスデータ３６は、複数の頂点（すなわち、制御点）として、メモリ１０内に割り当てられた頂点バッファ４１のうちの１つまたは複数に記憶され得る。パスデータ３６はまた、１つまたは複数のｐｒｉｍｔｙｐｅバッファ４２を備え得る。ｐｒｉｍｔｙｐｅバッファ４２の各々は、頂点バッファ４１のうちの１つの１つまたは複数の頂点に対応するｐｒｉｍｉｔｙｐｅタイプを示すデータを含む。いくつかの例では、パスデータは、パッチリストデータ構造（たとえば、４制御点パッチリスト）内に記憶され得る。コマンド３８は、１つまたは複数のコマンドバッファ（たとえば、リングバッファ）内に記憶され得る。ＣＰＵ６（たとえば、オペレーティングシステム３０を介したＧＰＵドライバ２８）は、ＧＰＵ１２によって消費するために、パスデータ３６とコマンド３８とをメモリ１０内に配置することができる。ＧＰＵ１２（たとえば、コマンドエンジン３２）は、メモリ１０内に記憶されたコマンド３８を検索および実行することができる。
【００５０】
[0057]パスデータ３６が頂点として記憶される例では、頂点バッファ４１の頂点はレンダリングされることになるパスの１つまたは複数のプリミティブを形状的に定義する１つまたは複数の属性を含み得る。たとえば、線の場合、パッチ制御リスト内の頂点は、線の終点に関する座標（たとえば、（ｘ０，ｙ０）および（ｘ１，ｙ１））を示すデータを含み得る。３次ベジェ曲線の場合、パッチ制御リスト内の頂点は、その曲線を定義する４つの制御点の座標（たとえば、（ｘ０，ｙ０）、（ｘ１，ｙ１）、（ｘ２，ｙ２）、（ｘ３，ｙ３））を示すデータを含み得る。２次ベジェ曲線の場合、パッチ制御リスト内の頂点は、４つの制御点の代わりに、３つの制御点に関する座標を示すデータを含み得る。楕円弧の場合、パッチ制御リスト内の頂点は、楕円弧の終点パラメータ表示を示すデータ、または楕円弧の中心パラメータ表示を示すデータを含み得る。
【００５１】
[0058]頂点バッファ４１はまた、頂点バッファ４１のうちのたった１つの中の異なるプリミティブタイプの頂点を含み得る。たとえば、頂点バッファ４１のうちの１つは、ライン（たとえば、（ｘ０，ｙ０）および（ｘ１，ｙ１））と、２次ベジェ曲線を定義する３つの頂点（たとえば、（ｘ２，ｙ２）、（ｘ３，ｙ３）、および（ｘ４，ｙ４））とを含み得る。ラインおよび２次ベジェ曲線の頂点を含む頂点バッファは、したがって、値（（ｘ０，ｙ０）、（ｘ１，ｙ１）、（ｘ２，ｙ２）、（ｘ３，ｙ３）、および（ｘ４，ｙ４））を含み得る。いくつかの事例では、頂点は２つの頂点の間で共有され得る。たとえば、（ｘ１，ｙ１）は、（ｘ０、ｙ０）をやはり含む第１のラインの終点、およびその終点が（ｘ２，ｙ２）である、第２のラインの起点であり得る。
【００５２】
[0059]頂点バッファ４１の各々に関して、ｐｒｉｍｔｙｐｅバッファ４２のうちの１つは、頂点バッファ４１のうちの１つの１つまたは複数の頂点のｐｒｉｍｉｔｙｐｅタイプを示すデータを含む。ｐｒｉｍｔｙｐｅバッファ４２は、一般に、頂点バッファ４１のうちの１つの１つまたは複数の頂点のプリミティブタイプを示す定整数値（たとえば、３２ビットの符号なし整数値）を備え得る。ｐｒｉｍｔｙｐｅバッファ４２の値は、一例として、Ｃプログラミング言語の「列挙」タイプと同様の形で割り当てられ得るかまたは構成され得る。
【００５３】
[0060]複数のパスレンダリングプリミティブタイプ（すなわち、ラインおよびクワッドベジェ曲線）を含む頂点バッファの例では、ｐｒｉｍｔｙｐｅバッファは、頂点バッファの第１の２つの座標対（すなわち、（ｘ０，ｙ０）、および（ｘ１，ｙ１）がラインプリミティブタイプのものであることを示す定数値と、第３の座標対、第４の座標対、および第５の座標対（すなわち、（ｘ２，ｙ２）、（ｘ３，ｙ３）、および（ｘ４，ｙ４））がクワッドベジェ曲線プリミティブタイプのものであることを示す第２の値とを含み得る。したがって、単純な例では、ｐｒｉｍｔｙｐｅバッファは、値（ＬＩＮＥ，ＱＵＡＤ）を含み得、ここで、「ＬＩＮＥ」および「ＱＵＡＤ」は、それぞれ、ラインおよびクワッドベジェ曲線プリミティブタイプに対応する定数である。
【００５４】
[0061]１つまたは複数の頂点のｐｒｉｍｉｔｙｐｅタイプを示す定数値に加えて、ｐｒｉｍｔｙｐｅバッファ４２はまた、プリミティブの開始および／または終端が新しいサブバンドの始端を標示するかどうかを示す定数値、ならびに、（サブパスとも呼ばれる）プリミティブの第１の頂点および最後の頂点が接続されているかどうかを示す定数値とを含み得る。新しいサブパスの開始を示すｐｒｉｍｔｙｐｅバッファ定数値は、「ＯＲ」と示されるオープンリセットである。サブパスの第１の頂点および最後の頂点が接続されていることを示すｐｒｉｍｔｙｐｅ値は、「ＣＲ」と示されるクローズリセットと呼ばれる。いくつかの例では、異なるパスタイプは、ＯｐｅｎＶＧ  ＡＰＩによって定義されたパスタイプのセットに対応し得る。ｐｒｉｍｔｙｐｅ値およびサブパスについては、図４に関して以下でより詳細に説明する。
【００５５】
[0062]コマンド３８は、１つもしくは複数の状態コマンドおよび／または１つもしくは複数の描画呼出しコマンドを備え得る。状態コマンドは、たとえば、描画色、フィル色、ストローク色など、ＧＰＵ１２内の状態変数のうちの１つまたは複数を変更するようにＧＰＵ１２に命令することができる。いくつかの例では、状態コマンドは、パスをレンダリングすることと関連付けられた１つまたは複数の状態変数を設定するように構成されたパスレンダリング状態コマンドを含み得る。たとえば、状態コマンドは、レンダリングされることになるパスがフィルされるか、ストロークされるか、またはそれらの両方かを示すように構成されたペイントモードコマンドを含み得る。別の例として、状態コマンドは、フィル動作のために使用されることになる色を指定するフィル色コマンドおよび／またはストローク動作のために使用されることになる色を指定するストローク色コマンドを含み得る。さらなる例として、状態コマンドは、たとえば、ストローク幅、エンドキャップスタイル（たとえば、突き合せ（butt）、円形、方形）、ライン接合スタイル（たとえば、マイター、ラウンド、ベベル）、マイターリミットなど、ストローク動作に関する１つまたは複数のパラメータを指定することができる。いくつかの例では、１つもしくは複数の状態パラメータを設定するために状態コマンドを使用することに加えて、またはその代わりに、描画呼出しコマンドを使用することによって、あるいはパスデータ３６を含む頂点バッファ内に状態インジケータを配置することによって、状態パラメータのうちの１つもしくは複数が設定され得る。
【００５６】
[0063]描画呼出しコマンドは、メモリ１０内に記憶された（たとえば、頂点バッファ内で定義された）１つまたは複数の頂点のグループによって定義された形状をレンダリングするようにＧＰＵ１２に命令することができる。いくつかの例では、描画呼出しコマンドは、ＧＰＵ１２にメモリ１０の定義されたセクション（たとえば、パスデータ３６の頂点バッファ４１）内に記憶された頂点およびプリミティブのすべてをレンダリングさせることができる。言い換えれば、ＧＰＵ１２が描画呼出しコマンドを受け取ると、メモリ１０の定義されたセクション（たとえば、頂点バッファまたはパスデータ３６）内の頂点によって表された形状およびプリミティブをレンダリングするための制御がＧＰＵ１２に渡される。本開示の技法によれば、ＧＰＵ１２は、引数として、頂点バッファとｐｒｉｍｔｙｐｅバッファとを含む描画呼出しコマンドを受け取ることができる。
【００５７】
[0064]描写呼出しコマンドは、３Ｄ描写呼出しコマンドおよびパスレンダリング描写呼出しコマンドのうちの１つまたは両方を含み得る。３Ｄレンダリング描画呼出しコマンドの場合、頂点バッファ内の１つまたは複数の頂点のグループによって定義された形状は、レンダリングされることになる１つまたは複数の３Ｄグラフィックスプリミティブ（たとえば、点、線、三角形、四角形、トライアングルストリップ、パッチなど）に対応し得、３Ｄレンダリング描画呼出しコマンドは、１つまたは複数の３ＤグラフィックスプリミティブをレンダリングするようにＧＰＵ１２に命令することができる。パスレンダリング描画呼出しコマンドの場合、頂点バッファ内の１つまたは複数の頂点のグループによって定義された形状は、レンダリングされることになる１つまたは複数のパスプリミティブ（たとえば、ラインセグメント、楕円弧、２次ベジェ曲線、および３次ベジェ曲線など）に対応し得、パスレンダリング描画呼出しコマンドは、１つまたは複数のパスプリミティブをレンダリングするようにＧＰＵ１２に命令することができる。
【００５８】
[0065]描画呼出しは、ハルシェーダと、テッセレータと、ドメインシェーダとを含み得る固定関数ユニットおよびプログラマブルユニットを利用する１つまたは複数のテッセレーションコマンドを指定することも可能である。ハルシェーダは、テッセレートされることになるドメインを指定することができる。いくつかの例では、テッセレートされることになるドメインは、等値線ドメイン、三角形（トライ）ドメイン、またはクワッド（四角形）ドメインのうちの１つを備え得る。テッセレータは指定されたドメイン上で動作して、それに基づいてドメインシェーダが頂点座標を決定することができるドメイン座標を出力する。
【００５９】
[0066]いくつかの例では、本開示で説明するパスレンダリング技法は、たとえば、グラフィックスＡＰＩ２６と、ＧＰＵドライバ２８と、コマンドエンジン３２と、処理ユニット３４とを含めて、図２に示す構成要素のうちのいずれかの内で実装され得る。いくつかの例では、パスレンダリング技法のすべてまたは大部分は、処理ユニット３４によって形成されたＧＰＵ１２内のグラフィカルパイプライン内で実装され得る。たとえば、テッセレーションユニットは処理ユニット３４のユニットであり得る。追加の例では、ＣＰＵ６のソフトウェアアプリケーション２４、グラフィックスＡＰＩ２６および／またはＧＰＵドライバ２８は、本開示のパスレンダリング技法を実行するＧＰＵ１２内のパスレンダリングパイプラインを実装するために、グラフィックスパイプラインの状態を構成して、シェーダプログラムをグラフィックスパイプラインと結合させるための技法を実装することができる。さらなる例では、ＣＰＵ６のソフトウェアアプリケーション２４、グラフィックスＡＰＩ２６および／またはＧＰＵドライバ２８は、レンダリングされることになるパスを示すデータを、１つまたは複数のパスをレンダリングするためにＧＰＵ１２によってアクセスされ得る１つまたは複数のバッファ（たとえば、１つまたは複数の頂点バッファおよびｐｒｉｍｔｙｐｅバッファ）内に配置するように構成され得る。
【００６０】
[0067]本開示の技法によれば、ＧＰＵ１２は、異なるプリミティブタイプの頂点を備えた単一の頂点バッファを受け取るように構成され得る。ＧＰＵ１２はまた、頂点バッファの頂点のプリミティブタイプを示すｐｒｉｍｔｙｐｅバッファを受け取るように構成され得る。本開示による一例として、ＧＰＵ１２は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、ＧＰＵ１２の頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、構成され得る。ＧＰＵ１２は、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定し、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることができる。
【００６１】
[0068]図３は、本開示のパスレンダリング技法を実行することができる例示的なグラフィックスパイプライン４０を示す概念図である。いくつかの例では、グラフィックスパイプラインは、Ｍｉｃｒｏｓｏｆｔ（登録商標）ＤｉｒｅｃｔＸ（ＤＸ）１１グラフィックスパイプラインに対応し得る。図３に示すように、グラフィックスパイプライン４０は、リソースブロック４２と、図２の処理ユニット３４を備え得る複数の処理段階とを含む。複数の処理段階（たとえば、処理ユニット３４）は、入力アセンブラ（ＩＡ）４４と、頂点シェーダ（ＶＳ）４６と、ハルシェーダ（ＨＳ）４８と、テッセレータ５０と、ドメインシェーダ（ＤＳ）５２と、ジオメトリシェーダ（ＧＳ）５４と、ラスタライザ５６と、ピクセルシェーダ（ＰＳ）５８と、出力統合器６０とを含む。ハルシェーダ４８、テッセレータ５０、およびドメインシェーダ５２は、グラフィックスパイプライン４０のテッセレーション段階６２を形成し得る。
【００６２】
[0069]リソースブロック４２は、たとえば、１つもしくは複数のテクスチャおよび／または１つもしくは複数のバッファなど、グラフィックスパイプライン４０によって使用される１つもしくは複数のメモリリソースに対応し得る。リソースブロック４２は、グラフィカルパイプライン４０内の処理段階のうちの１つもしくは複数によって処理されることになる入力データおよび／またはグラフィックスパイプライン４０内の処理段階のうちの１つもしくは複数からの出力データを記憶することができる。例として、リソースブロック４２は、本開示で説明するようにパスセグメントに関するフィル領域のラスタライズされたバージョンおよび／またはパスセグメントに関するストローク領域のラスタライズされたバージョンを保持するフレームバッファを記憶することができる。いくつかの例では、リソースブロック４２を形成するメモリリソースは、コンピューティングデバイス２のメモリ１０および／またはＧＰＵキャッシュ１４内に存在し得る。
【００６３】
[0070]図３に示す直角の処理段階は固定関数処理段階を表し、図３に示す丸角の処理段階はプログラマブル処理段階を表す。たとえば、図３に示すように、入力アセンブラ４４、テッセレータ５０、ラスタライザ５６、および出力統合器６０は固定関数処理段階であり得、頂点シェーダ４６、ハルシェーダ４８、ドメインシェーダ５２、ジオメトリシェーダ５４、およびピクセルシェーダ５８はプログラマブル処理段階であり得る。プログラマブル段階の各々は、特定のタイプのシェーダプログラムを実行するように構成され得る。たとえば、頂点シェーダ４６は、頂点シェーダプログラムを実行するように構成され得、ハルシェーダ４８は、ハルシェーダプログラムを実行するように構成され得る、等々である。異なるタイプのシェーダプログラムの各々は、ＧＰＵの共通シェーダユニット上、または１つもしくは複数の特定のタイプのシェーダプログラムを実行するための専用である１つもしくは複数の専用シェーダユニット上のいずれかで実行することができる。
【００６４】
[0071]図３に示すように、入力アセンブラ４４、頂点シェーダ４６、ハルシェーダ４８、ドメインシェーダ５２、ジオメトリシェーダ５４、ピクセルシェーダ５８、および出力マージャ６０はリソースブロック４２に通信可能に結合される。入力アセンブラ４４、頂点シェーダ４６、ハルシェーダ４８、ドメインシェーダ５２、ジオメトリシェーダ５４、ピクセルシェーダ５８、および出力統合器６０はリソースブロック４２から入力データを検索ならびに／または受け取るように構成される。ジオメトリシェーダ５４および出力統合器６０は、出力データをリソースブロック４２に書き込むように構成される。グラフィックスパイプライン４０内の処理段階とリソースブロック４２との間の通信の上述の構成は、グラフィックスパイプライン４０の処理段階とリソースブロック４２との間の通信がどのように構成され得るかの単なる一例である。他の例では、グラフィックスパイプライン４０の処理段階とリソースブロック４２との間により多くのもしくはより少ない一方向および／または双方向の通信チャネルが提供され得る。
【００６５】
[0072]ＤｉｒｅｃｔＸ  １１グラフィックスパイプラインの一般的な動作に関するさらなる情報は、その内容の全体が参照により本明細書に組み込まれている、Ｚｉｎｋら、「Ｐｒａｃｔｉｃａｌ  Ｒｅｎｄｅｒｉｎｇ  ＆  Ｃｏｍｐｕｔａｔｉｏｎ  ｗｉｔｈ  Ｄｉｒｅｃｔ３Ｄ  １１」、ＣＲＣ  Ｐｒｅｓｓ（２０１１年）に見出すことができる。
【００６６】
[0073]上で議論したように、２つのパスレンダリング動作は、（１）パスセグメントのフィル、および（２）パスセグメントのストロークである。グラフィックスレンダリングパイプライン４０（たとえば、Ｄｉｒｅｃｔ  １１グラフィックスパイプライン）を用いてストローク動作を実行するための解決策が次に説明される。
【００６７】
[0074]本開示の技法によれば、ＣＰＵ６は、１つまたは複数のプリミティブを示す頂点を頂点バッファ内に配置することができる。ＣＰＵ６はまた、１つまたは複数のプリミティブタイプ値をｐｒｉｍｔｙｐｅバッファ内に配置することができる。いくつかの例では、頂点バッファは図２に示すパスデータ３６の頂点バッファ４１の１つに対応し得る。頂点バッファ内の頂点に関するプリミティブトポロジは、いくつかの例では、パッチ制御リストであり得る。線の場合、パッチ制御リスト内の頂点は、線の終点に関する座標（たとえば、（ｘ０，ｙ０）および（ｘ１，ｙ１））を示すデータを含み得る。３次ベジェ曲線の場合、パッチ制御リスト内の頂点は、その曲線を定義する４つの制御点の座標（たとえば、（ｘ０，ｙ０）、（ｘ１，ｙ１）、（ｘ２，ｙ２）、（ｘ３，ｙ３））を示すデータを含み得る。２次ベジェ曲線の場合、パッチ制御リスト内の頂点は、４つの制御点の代わりに、曲線を定義する３つの制御点に関する座標を示すデータを含み得る。楕円弧の場合、パッチ制御リスト内の頂点は、楕円弧の終点パラメータ表示を示すデータ、または楕円弧の中心パラメータ表示を示すデータを含み得る。ｐｒｉｍｔｙｐｅバッファは、頂点バッファ内の頂点が異なるタイプのプリミティブと関連付けられるとき、頂点バッファ内の頂点と関連付けられたプリミティブタイプに対応する値を含み得る。いくつかの例では、ＣＰＵ６は、レンダリングされることになるパスのタイプを示すデータをパッチ制御リストの、場合によっては未使用の頂点属性内に配置することも可能である。
【００６８】
[0075]パスストローク動作を実行するために、入力アセンブラ４４は、パスデータ３６をメモリ１０から取得して、頂点バッファ４１およびｐｒｉｍｔｙｐｅバッファ４２によって指定されたパスセグメント（たとえば、パスプリミティブ）をレンダリングするために、そのパスデータをグラフィックパイプライン４０の後続の段階に渡す。たとえば、入力アセンブラ４４は、複数の頂点をメモリ１０内に記憶された頂点バッファ４２から取得し得る。ｐｒｉｍｔｙｐｅバッファ４２のプリミティブデータのエントリに基づいて、入力アセンブラ４４は、頂点バッファ内に記憶された頂点を個々のプリミティブにパースすることができる。入力アセンブラ４４は、各々、個々のプリミティブにプリミティブ識別子（「ｐｒｉｍＩＤ」）を割り当てることができ、その関連するｐｒｉｍＩＤとともに各プリミティブを後の再使用のためにレベル２（「Ｌ２」）キャッシュなどのキャッシュ内に記憶することができる。Ｌ２キャッシュはリソースブロック６４の一部であり得る。いくつかの例では、入力アセンブラ４４は、単調増加減少順でｐｒｉｍＩＤ値を割り当てることができる。
【００６９】
[0076]各プリミティブを記憶することに加えて、入力アセンブラ４４は、プリミティブタイプ状態変数を生成することもできる。「ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅ」、「ｓｖ＿ｐｒｅｖ＿ｐｒｉｍｔｙｐｅ」、および「ｓｖ＿ｎｅｘｔ＿ｐｒｉｍｔｙｐｅ」と示される変数は、現在、レンダリング中であるプリミティブに対する現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプを示す。入力アセンブラ４４は、ドメインシェーダ段階５２と、ジオメトリシェーダ段階と、ハルシェーダ４８とを含む、グラフィックスパイプライン内の後続の段階にプリミティブタイプ状態変数を渡す。
【００７０】
[0077]入力アセンブラ４４が頂点を生成すると、頂点シェーダ４６は生成された頂点を処理する。いくつかの例では、入力アセンブラ４４は、処理されることになる頂点を頂点シェーダ４６に直接的に渡すことができる。追加の例では、入力アセンブラ４４は、たとえば、頂点と関連付けられたｐｒｉｍＩＤに基づいて、リソースブロック６４内の頂点バッファ４１のうちの１つから、処理のために特定の頂点を検索するように頂点シェーダ４６に指示することができる。
【００７１】
[0078]頂点シェーダ４６は、入力アセンブラ４４および／またはリソースブロック４２から受け取った頂点を処理して、頂点シェーダ４６によって処理された各入力頂点に関する出力頂点を生成するように構成される。たとえば、各入力頂点に関して、頂点シェーダ４６は、ＧＰＵ１２のシェーダユニット上で頂点シェーダプログラムのインスタンスを実行することができる。頂点シェーダ４６によって受け取られた入力頂点、および頂点シェーダ４６によって生成された出力頂点は、あるいは、それぞれ、入力制御点および出力制御点と呼ばれる場合がある。
【００７２】
[0079]さらなる例では、頂点シェーダ４６は、対応する入力頂点の入力属性と同一でない出力頂点に関する１つまたは複数の出力属性を生成することができる。たとえば、頂点シェーダ４６は、出力頂点に関する１つまたは複数の属性を生成するために、入力頂点の属性のうちの１つまたは複数に関して実質的な処理を実行することができる。別の例として、頂点シェーダ４６は、出力頂点に関する出力属性のセットを生成するために、入力属性のセットから追加および／または属性を削除することができる。
【００７３】
[0080]テッセレーション段階６２（すなわち、ハルシェーダ４８、テッセレータ５０、およびドメインシェーダ５２）は、入力パスデータによって定義されたパスセグメントを複数のラインセグメントにテッセレートすることができる。いくつかの例では、テッセレーション段階６２は、プリミティブを形成する複数の頂点を、たとえば、頂点シェーダ４６から受け取ることができる。いくつかの例では、４つの頂点はプリミティブを備え得る。テッセレーション段階６２は、受け取ったプリミティブに基づいて、１つまたは複数のドメイン座標を決定することができる。決定されたドメイン座標は、レンダリングされることになるパスの曲率を近似することができる。
【００７４】
[0081]一般に、ハルシェーダ４８は、さらなる処理のために、頂点シェーダ４６から受け取った制御点をドメインシェーダ５２に渡して、ドメインタイプなど、構成データをテッセレータ５０に提供することができる。ハルシェーダ４８は、入力アセンブラ４４によって生成されたプリミティブ段階変数（すなわち、ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅ、ｓｖ＿ｐｒｅｖ＿ｐｒｉｍｔｙｐｅ、およびｓｖ＿ｎｅｘｔ＿ｐｒｉｍｔｙｐｅ）に基づいて、制御点をやはり決定することができる。ハルシェーダ４８はまた、プリミティブ状態変数に基づいて、１つまたは複数のテッセレーション係数を生成し、生成されたテッセレーション係数をテッセレータ５０に渡すこともできる。
【００７５】
[0082]テッセレータ５０は、特定のタイプのパスセグメントまたはプリミティブを表す１つもしくは複数のパラメータ式が評価されるべきドメイン座標を決定することができる。例示のために、テッセレータ５０は１つの固定関数ユニットとして示されている。グラフィックスパイプライン４０の後続の段階は、テッセレータ５０によって決定されたドメイン座標を利用することも可能である。
【００７６】
[0183]ドメインシェーダ５２は、テッセレータ５０によって決定されたドメイン座標値でパラメータ式を評価して、各評価に関する頂点を出力することができる。いくつかの例では、ドメインシェーダ５２によって出力された頂点の各々は、その頂点の位置を示す１つまたは複数の属性を含み得る。追加の例では、ドメインシェーダ５２によって出力された頂点の各々は、その頂点と関連付けられたパスレンダリングプリミティブのタイプを示す１つまたは複数の属性を含み得る。
【００７７】
[0084]より具体的には、ハルシェーダ４８は、頂点シェーダ４６および／またはリソースブロック４２から受け取った制御点を処理することができ、ハルシェーダ４８によって実行されたハルシェーダプログラムの各インスタンスに関する出力制御を生成することができる。たとえば、ハルシェーダ４８によって生成されることになる各出力制御点に関して、頂点シェーダ４６は、ＧＰＵ１２のシェーダユニット上でハルシェーダプログラムのインスタンスを実行することができる。
【００７８】
[0085]さらなる例では、ハルシェーダ４８は、入力制御点のうちのそれぞれ１つの入力属性と同一でない出力制御点に関する１つまたは複数の出力属性を生成することができる。たとえば、ハルシェーダ４８は、出力制御点に関する１つまたは複数の属性を生成するために、入力制御点の属性のうちの１つまたは複数に関して実質的な処理を実行することができる。別の例として、ハルシェーダ４８は、出力頂点に関する出力属性のセットを生成するために、入力属性のセットから属性を追加および／または削除することができる。いくつかの例では、下でさらに詳細に説明するように、ＧＰＵ１２が終点パラメータ表示の形である、楕円弧に関するパスデータを受け取る場合、ハルシェーダ４８は、その楕円弧の終点パラメータ表示をその楕円弧の中心パラメータ表示に変換することができる。
【００７９】
[0086]さらなる例では、ハルシェーダ４８は、特定のレンダリング動作に関して、レンダリングされるべきではないプリミティブを破棄することができる。プリミティブを破棄することは、プリミティブに対応するデータをグラフィックスパイプラインのさらなる段階に渡させず、それによって、そのようなプリミティブをパイプラインの残りによって効果的にレンダリングさせないプロセスを指す場合がある。たとえば、グラフィックスパイプライン４０がフィル動作を実行しているとき、ハルシェーダ４８は、接合プリミティブとキャッププリミティブとを破棄することができる。
【００８０】
[0087]ハルシェーダ４８は、各パスセグメントに関するパッチ定数関数のインスタンスを実行することもできる。パッチ定数関数は、出力値を生成するとき、テッセレータ５０によって使用されることになる構成パラメータを決定して、テッセレータ５０に提供することができる。本開示の技法によれば、パッチ定数関数は、ハルシェーダ４８が入力アセンブラ４４から受け取ることができるプリミティブ状態変数に部分的に依存し得る。たとえば、パッチ定数関数は、ハルシェーダ４８にテッセレーション係数をテッセレータ５０に提供させることができる。テッセレーション係数は、テッセレータ５０が特定のテッセレーションドメインに適用されるテッセレーションの程度（たとえば、ドメインがどの程度微細に再分割されるべきか、および／またはドメインが再分割されるべきより小さなオブジェクトの数）を指定することができる。本開示の技法によれば、ハルシェーダ４８は、テッセレータ５０に提供されるテッセレーション係数を決定するとき、プリミティブ状態変数を考慮に入れることができる。
【００８１】
[0088]別の例として、パッチ定数関数は、ハルシェーダ４８にテッセレーションドメインをテッセレータ５０に提供させることができる。テッセレーションドメインは、テッセレータ５０によって使用されるための複数の座標を生成するために、テッセレータ５０によって使用されるオブジェクトを指す場合がある。概念的に、テッセレーションドメインは、テッセレータ５０によって複数のより小さなオブジェクトに再分割されるオブジェクトに対応し得る。より小さなオブジェクトの頂点の位置座標は、次いで、さらなる処理のために、ドメインシェーダ５２に送られる。いくつかの例では、テッセレーションドメインは、クワッド、トライ、および等値線のうちの１つになるように選択され得る。いくつかの例では、ドメインが再分割される先である、より小さいオブジェクトは、三角形、ラインセグメント、または点に対応し得る。いくつかの例では、ハルシェーダ４８は、等値線テッセレーションドメインを指定して、テッセレータ５０が等値線ドメインをラインセグメントに再分割すべきであることを指定することができる。
【００８２】
[0089]いくつかの例では、テッセレータ５０は、２パステッセレーションを実行するように構成され得る。２パステッセレーションでは、ハルシェーダ４８は、ジオメトリシェーダ５４から、たとえば、（ＧＰＵキャッシュ１４またはメモリ１０内の）ストリームアウト（streamout）バッファから入力を受け取ることができる。いくつかの例では、ジオメトリシェーダ５４からの入力は、プリミティブタイプデータを備え得る。この入力に基づいて、ハルシェーダ４８は、第２のテッセレーションパス内で使用されることになるテッセレーションユニット５０用のテッセレーション係数を生成する。この第２のパスは、第１のパス内で、テッセレータ５０によって生成されたテッセレーション係数を受け取る。
【００８３】
[0090]テッセレータ５０は、テッセレーション段階６２によって処理される各パスセグメントに関する複数の出力値を生成することができる。出力値は、特定のタイプのパスセグメントを表す１つまたは複数のパラメータ式がドメインシェーダ５２によって評価されるべき値を決定することができる。いくつかの例では、テッセレータ５０は、ハルシェーダ４８によってテッセレータ５０に提供された１つもしくは複数のテッセレーション係数および／またはテッセレーションドメインに基づいて、複数の出力値を生成することができる。たとえば、テッセレータ５０は、等値線を複数のラインセグメントに再分割して、正規化された座標系内の複数のラインセグメントの各終点に関する出力値を生成することができる。本開示の技法によれば、テッセレータ５０はまた、プリミティブタイプデータを生成して、そのプリミティブタイプデータをジオメトリシェーダ５４に渡すことができる。
【００８４】
[0091]ドメインシェーダ５２は、ドメイン座標と、１つまたは複数のグラフィカルフィーチャを示す情報とをテッセレータ５０から受け取り、パスセグメントに関する制御点と、テッセレーション係数と、後続のプリミティブに関する開始法線とをハルシェーダ４８から受け取ることができる。ドメインシェーダ５２はまた、入力アセンブラ４４からプリミティブ状態変数を受け取ることができる。これらの入力に基づいて、ドメインシェーダ５２は、出力頂点座標と、それらの座標によって表された頂点に対応する終点法線とを生成する。
【００８５】
[0092]たとえば、テッセレータ５０から受け取られた各出力値に関して、ドメインシェーダ５２は、ＧＰＵ１２のシェーダユニット上でドメインシェーダプログラムのインスタンスを実行することができる。ドメインシェーダプログラムは、ドメインシェーダ５２に、テッセレータ５０から受け取った特定の値に基づいて決定された特定の値で１つまたは複数のパラメータ式を評価させて、それらの評価、ならびに各頂点座標と関連付けられたグラフィカルフィーチャに基づいて、出力頂点に関する座標を生成させることができる。出力頂点座標を生成するために使用されるパラメータ式の係数のうちの１つまたは複数は、ハルシェーダ４８から受け取った制御点のうちの１つまたは複数に基づいて定義され得る。各出力頂点は、複数のテッセレートされたラインセグメントのうちの１つの終点に対応し得る。２つの連続する出力頂点は、単一のテッセレートされたラインセグメントの終点に対応し得る。追加の例では、ドメインシェーダプログラムは、ドメインシェーダ５２に、各出力頂点に関する正規座標を生成するために、テッセレータ５０から受け取った特定の値に基づいて決定された特定の値で、１つまたは複数の追加のパラメータ式を評価させることができる。
【００８６】
[0093]ドメインシェーダ５２は、隣接する頂点の各セットがテッセレートされたラインセグメントを表す、順序付けられた順番で頂点を出力することができる。ラインセグメントは、頂点バッファおよびｐｒｉｍｔｙｐｅバッファ内で定義されたパスセグメントを集合的に近似することができる。たとえば、ドメインシェーダ５２は、以下のラインセグメント｛０，１｝、｛１，２｝、｛２，３｝、｛３，４｝、｛４，５｝を定義する頂点の以下のセット｛０，１，２，３，４，５｝を出力することができる。追加の例では、ドメインシェーダ５２は、前の例で列挙されたのと同じラインセグメントを定義し得る頂点の以下のセット｛０，１，１，２，２，３，３，４，４，５｝を出力することができる。
【００８７】
[0094]いくつかの例では、テッセレータ５０およびドメインシェーダ５２は、以下の技法に従って、パスセグメントを複数のラインセグメントに均一にテッセレートするように構成され得る。具体的には、テッセレータ５０は、パラメータ評価のための座標を出力することができる（たとえば、ｔ＝０／Ｔ、１／Ｔ、２／Ｔ．．．Ｔ／Ｔ、式中、Ｔはテッセレーション係数である）。プリミティブのタイプに応じて、ドメインシェーダ５２は、テッセレータ５０によって出力された値で１つまたは複数のパラメータ式を評価することができる。
【００８８】
[0095]いくつかの例では、線の場合、Ｔは常に１に等しくてよい。そのような例では、ドメインシェーダ５２は、ラインパスセグメントに対応する頂点を生成するために、何らかの評価を実行することを必ずしも必要とするとは限らない場合がある。
【００８９】
[0096]３次ベジェ曲線の場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
【００９０】
【数１】
2017504888.tif 000003
【００９１】
式中、ｔは、テッセレータ５０によって提供された出力値に対応し、Ｖ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力頂点に対応し、Ｃ０、Ｃ１、Ｃ２、Ｃ３は、３次ベジェ曲線に関する制御点に対応する。
【００９２】
[0097]あるいは、３次ベジェ曲線の場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
【００９３】
【数２】
2017504888.tif 000004
【００９４】
【数３】
2017504888.tif 000005
【００９５】
式中、ｔは、テッセレータ５０によって提供された出力値に対応し、ｘ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力頂点のｘ座標に対応し、ｙ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力頂点のｙ座標に対応し、（Ｘ０，Ｙ０）、（Ｘ１，Ｙ１）、（Ｘ２，Ｙ２）、（Ｘ３，Ｙ３）は、３次ベジェ曲線に関する制御点に対応する。
【００９６】
[0098]２次ベジェ曲線の場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
【００９７】
【数４】
2017504888.tif 000006
【００９８】
式中、ｔは、テッセレータ５０によって提供された出力値に対応し、Ｖ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力頂点に対応し、Ｃ０、Ｃ１、Ｃ２は、２次ベジェ曲線に関する制御点に対応する。
【００９９】
[0099]あるいは、２次ベジェ曲線の場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
【０１００】
【数５】
2017504888.tif 000007
【０１０１】
【数６】
2017504888.tif 000008
【０１０２】
式中、ｔは、テッセレータ５０によって提供された出力値に対応し、ｘ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力頂点のｘ座標に対応し、ｙ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力頂点のｙ座標に対応し、（Ｘ０，Ｙ０）、（Ｘ１，Ｙ１）、（Ｘ２，Ｙ２）は、２次ベジェ曲線に関する制御点に対応する。
【０１０３】
[0100]楕円弧パスセグメントの場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線を評価して、出力頂点を生成することができる。
【０１０４】
【数７】
2017504888.tif 000009
【０１０５】
【数８】
2017504888.tif 000010
【０１０６】
式中、パラメータ表示角度ａｎｇｌｅtは、テッセレータ出力ｔから決定され、ｘは、特定のパラメータ表示角度（すなわち、ａｎｇｌｅt）に関して生成された出力頂点のｘ座標に対応し、ｙは、パラメータ表示角度（すなわち、ａｎｇｌｅt）に関して生成された出力頂点のｙ座標に対応し、ｒｈは、非回転楕円の横半径を表し、ｒｖは、非回転楕円の縦半径を表し、ｒｖＣｏｓ、ｒｖＳｉｎ、ｒｈＣｏｓ、およびｒｈＳｉｎは、それぞれ、ｒｖ＊Ｃｏｓ（角度）、ｒｖ＊Ｓｉｎ（角度）、ｒｈ＊Ｃｏｓ（角度）、およびｒｈ＊Ｓｉｎ（角度）を表し、角度は、（ｒｈ，ｒｖ）によるスケーリングに先立って測定されたｘ軸に対する楕円の反時計回り角度を表す。いくつかの例では、ハルシェーダ４８は、ｃｏｓ（角度）とｓｉｎ（角度）とを決定（たとえば、事前計算）し、および／またはｒｖＣｏｓ値と、ｒｖＳｉｎ値と、ｒｈＣｏｓ値と、ｒｈＳｉｎ値とを決定（たとえば、事前計算）して、楕円弧に関する、上で具陳したパラメータ式を評価する際に使用するために、これらの値をドメインシェーダ５２に提供するように構成され得る。
【０１０７】
[0101]楕円弧に関して上で議論したように、パッチ制御リスト内の頂点は、いくつかの例では、楕円弧に関する終点パラメータ表示を示すデータを含み得る。そのような例では、ハルシェーダ４８（たとえば、ＧＰＵ１２のシェーダユニット上で実行するハルシェーダプログラム）は、楕円弧の終点パラメータ表示を示すデータを楕円弧の中心パラメータ表示を示すデータに変換するために使用され得る。
【０１０８】
[0102]楕円弧の終点パラメータ表示を楕円弧の中心パラメータ表示に変換するときに、楕円の正確な中心を見出すための例示的な技法が次に説明される。例示的な技法は、パラメータのセット（ｘ０，ｙ０）、（ｘ１，ｙ１）、ｒｈ、ｒｖ、φ、ｆs、およびｆAによって定義される楕円の終点表現に基づいて、楕円ならびに／または楕円弧の中心点（ｃｘ，ｃｙ）と、初期角度ならびに最終角度θ１およびθ２とを決定することができる。中心点（ｃｘ，ｃｙ）と、半径ｒｈおよびｒｖと、回転角ｒｏｔとを有する楕円は、陰方程式（ｘ’）2＋（ｙ’）2＝１を満たすことができ、式中、ｘ’＝（（ｘ−ｃｘ）*ｃｏｓ（ｒｏｔ）＋（ｙ−ｃｙ）*ｓｉｎ（ｒｏｔ））／ｒｈおよびｙ’＝（−（ｘ−ｃｘ）*ｓｉｎ（ｒｏｔ）＋（ｙ−ｃｙ）*ｃｏｓ（ｒｏｔ））／ｒｖである。（ｘ，ｙ）から（ｘ’、ｙ’）への変換は、所望の楕円を、起点を中心とする単位円にマッピングする。
【０１０９】
[0103]共通半径と、２つの所与の点（ｘ0，ｙ0）および（ｘ1，ｙ1）を通過する回転角とを有する楕円の対の中心点を決定するために、平面はまず、各楕円の式が（ｘ’−ｃｘ’）2＋（ｙ’−ｃｙ’）2＝１になるように、適切にスケーリングおよび回転された座標系に変換される。次いで、その外周が２つの所与の点を通過する２つの単位円の中心（すなわち、（ｃｘ0’，ｃｙ0’）および（ｃｘ1’，ｃｙ1’））が見出され得る。最終的に、元の座標系の解決策を取得するために、中心点は逆変換によって配置される。
【０１１０】
[0104]点（ｘ0，ｙ0）および（ｘ1，ｙ1）を通過する２つの単位円の中心点は
【０１１１】
【数９】
2017504888.tif 000011
【０１１２】
によって与えられ、式中、ｘm＝（ｘ0＋ｘ1）／２，ｙm＝（ｙ0＋ｙ1）／２，Δｘ＝（ｘ0−ｘ1），Δｙ＝（ｙ0−ｙ1）、およびｄ＝√（１／（Δｘ2＋Δｙ2）−１／４）である。ｄが無限または虚である場合、入力点は、それぞれ、一致しているか、または離れすぎているため、解決策は存在しない。角度θ１およびθ２は、円上の終点の傾斜を見出して、逆正接関数を計算することによって見出され得る。
【０１１３】
[0105]以下の疑似コードは、上述の技法に従って、楕円中心を計算するプロセスを示す。元の楕円パラメータの逆変換に続いて、ｆｉｎｄＵｎｉｔＣｉｒｃｌｅｓ関数がｆｉｎｄＥｌｌｉｐｓｅｓによって呼び出される。
【０１１４】
【数１０】
2017504888.tif 000012
【０１１５】
[0106]楕円弧の終点パラメータ表示を楕円弧の中心パラメータ表示に変換することに関するさらなる詳細は、その内容全体が参照により本明細書に組み込まれている、ｈｔｔｐ：／／ｗｗｗ．ｋｈｒｏｎｏｓ．ｏｒｇ／ｒｅｇｉｓｔｒｙ／ｖｇ／ｓｐｅｃｓ／ｏｐｅｎｖｇ−１．１ｐｄｆで入手可能な「ＯｐｅｎＶＧ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ、Ｖｅｒｓｉｏｎ  １．１」、第１８．４項、２００８年１２月３日に見出され得る。
【０１１６】
[0107]ジオメトリシェーダ５４は、テッセレートされたラインセグメントをドメインシェーダ５２から受け取って、それらのテッセレートされたラインセグメントに基づいて、複数の三角形プリミティブを生成することができる。本開示の技法によれば、ジオメトリシェーダ５４はまた、テッセレータ５０から受け取ったプリミティブタイプデータに基づいて、三角形プリミティブを生成することができる。たとえば、テッセレートされたラインセグメントの各々に関して、ジオメトリシェーダ５４は、ＧＰＵ１２のシェーダユニット上でジオメトリシェーダプログラムのインスタンスを実行して、それぞれのテッセレートされたラインセグメントに基づいて、テッセレートされたラインセグメントに関する三角形プリミティブを生成することができる。いくつかの例では、テッセレートされたラインセグメントの各々に関して、ジオメトリシェーダ５４は、それぞれのテッセレートされたラインセグメントに対応する２つの頂点をドメインシェーダ５２から受け取って、三角形プリミティブに対応する３つの頂点のセットを生成することができる。
【０１１７】
[0108]いくつかの例では、三角形プリミティブの頂点のうちの２つは、２つの受け取った頂点と同じ頂点であり得る（たとえば、同じ位置座標を有し得る）。そのような例では、ジオメトリシェーダ５４は、レンダリングされることになるパスセグメントと関連付けられたすべてのテッセレートされたラインセグメントに共通である共通の頂点に基づいて、第３の頂点を生成することができる。共通の頂点は、テッセレートされたラインセグメントの終点のうちの１つに対応してよく、または対応しなくてもよい。いくつかの例では、共通の頂点は、レンダリングされることになるパスセグメントに関する、テッセレートされたラインセグメントに対応する頂点のセット内の第１の頂点に対応し得る。
【０１１８】
[0109]ジオメトリシェーダ５４は、ドメインシェーダ５２によって作り出された、テッセレートされたラインセグメントの各々に関して一回度起動され得る。テッセレートされたラインセグメントの各々に関して、ジオメトリシェーダ５４は、三角形の第１の頂点として共通の制御点を使用し、三角形の第２の頂点および第３の頂点として、それぞれのテッセレートされたラインセグメントの２つの終点を使用して、三角形プリミティブを生成することができる。たとえば、ドメインシェーダ５２が、以下のラインセグメント｛０，１｝、｛１，２｝、｛２，３｝、｛３，４｝、｛４，５｝を定義する、以下の頂点のセット｛０，１，２，３，４，５｝を生成した例が上で提供された。上記の一連のラインセグメントの場合、ジオメトリシェーダ５４は、以下の三角形、｛Ｃ，０，１｝、｛Ｃ，１，２｝、｛Ｃ，２，３｝、｛Ｃ，３，４｝、｛Ｃ，４，５｝、｛Ｃ，４，５｝を生成することができ、式中、Ｃは三角形のすべてに共通する任意の単一の頂点である。
【０１１９】
[0110]いくつかの例では、ジオメトリシェーダ５４は、出力データをリソースブロック４２に「ストリームアウトする」ように構成されることも可能である。グラフィックスパイプライン４０は、いくつかの例では、第２のテッセレーションパスを実行するために、ストリームアウトされたデータをハルシェーダ４８とドメインシェーダ５２とに送信し戻すことができる。
【０１２０】
[0111]ラスタライザ５６は、複数の３Ｄグラフィックスプリミティブ（たとえば、点、線、および三角形）をそれらの３Ｄグラフィックスプリミティブに対応する複数の画素に変換するように構成され得る。たとえば、ラスタライザ５６は、三角形プリミティブに対応する３つの頂点を受け取って、それらの３つの頂点を、その三角形プリミティブによってカバーされたスクリーン画素位置に対応する複数の画素に変換することができる。三角形プリミティブによってカバーされたスクリーン画素位置は、三角形の頂点、三角形の縁、および三角形の内部に対応するスクリーン画素位置を含み得る。
【０１２１】
[0112]ピクセルシェーダ５８は、画素をラスタライザ５６から受け取って、ピクセルシェーダプログラムに従って、受け取った画素に基づいて、影付き画素を生成することができる。たとえば、ラスタライザ５６から受け取った各画素に関して、ピクセルシェーダ５８は、ＧＰＵ１２のシェーダユニット上でピクセルシェーダプログラムのインスタンスを実行することができる。
【０１２２】
[0113]さらなる例では、ピクセルシェーダ５８は、入力画素のうちのそれぞれの１つの入力画素の入力属性と同一でない、出力画素に関する１つまたは複数の出力属性を生成することができる。たとえば、ピクセルシェーダ５８は、出力画素に関する１つまたは複数の属性を生成するために、入力画素の属性のうちの１つまたは複数に関して実質的な処理を実行することができる。別の例として、ピクセルシェーダ５８は、出力画素に関する出力属性のセットを生成するために、入力属性のセットから属性を追加および／または削除することができる。
【０１２３】
[0114]出力統合器６０は、ピクセルシェーダ５８から受け取った画素データをレンダターゲット（たとえば、フレームバッファまたはステンシルバッファ）内に配置することができる。いくつかの例では、出力マージャ６０は、ピクセルシェーダ５８から受け取った画素データをラスタ演算に基づいてレンダターゲット内にすでに記憶されている画素データと併合することができる。
【０１２４】
[0115]ドメインシェーダ５２が頂点に関する位置座標を生成するためのパラメータ式を評価することに加えて、ドメインシェーダ５２は、ストローク動作の間、頂点に関する法線、たとえば、接線を生成することも可能である。法線を生成するために、ドメインシェーダ５２は、テッセレータ５０によって生成された値の各々に関する追加のパラメータ式を評価して、各評価に関して１つまたは複数の法線を出力することができる。場合によっては、法線は、ドメインシェーダ５２によって出力された頂点の属性として出力され得る。たとえば、ストローク動作の場合、ドメインシェーダ５２によって作り出された出力頂点は、頂点の位置を示す１つもしくは複数の属性と、頂点と関連付けられた法線または接線を示す１つもしくは複数の属性とを含み得る。
【０１２５】
[0116]湾曲したパスセグメント（たとえば、ベジェ曲線および楕円弧）に関する法線を生成するために、湾曲したパスセグメントに関する接線公式が使用され得る。一般に、（法線を決定するために使用され得る）曲線および楕円弧に関する接線公式は、曲線および弧に関する頂点を生成することに関して上で説明したパラメータ方式の派生物である。
【０１２６】
[0117]たとえば、３次ベジェ曲線の場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線の出力頂点に関する法線を生成することができる。
【０１２７】
【数１１】
2017504888.tif 000013
【０１２８】
式中、ｔは、テッセレータ５０によって提供された出力値に対応し、Ｎ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力法線に対応し、Ｃ０、Ｃ１、Ｃ２、Ｃ３は、３次ベジェ曲線に関する制御点に対応する。２次ベジェ曲線に関する法線を生成するために、上で提供した２次ベジェ曲線に関するパラメータ式の派生物が同じように使用され得る。
【０１２９】
[0118]あるいは、３次ベジェ曲線の場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線の出力頂点に関する法線を生成することができる。
【０１３０】
【数１２】
2017504888.tif 000014
【０１３１】
【数１３】
2017504888.tif 000015
【０１３２】
式中、ｔは、テッセレータ５０によって提供された出力値に対応し、ｘ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力法線のｘ座標に対応し、ｙ（ｔ）は、特定の出力値（すなわち、ｔ）に関して生成された出力法線のｙ座標に対応し、（Ｘ０，Ｙ０）、（Ｘ１，Ｙ１）、（Ｘ２，Ｙ２）、（Ｘ３，Ｙ３）は、３次ベジェ曲線に関する制御点に対応する。２次ベジェ曲線に関する法線を生成するために、上で提供した２次ベジェ曲線に関するパラメータ式の派生物が同じように使用され得る。
【０１３３】
[0119]楕円弧パスセグメントの場合、ドメインシェーダ５２は、以下のパラメータ式に従って、曲線の出力頂点に関する法線を生成することができる。
【０１３４】
【数１４】
2017504888.tif 000016
【０１３５】
【数１５】
2017504888.tif 000017
【０１３６】
式中、パラメータ表示角度、ａｎｇｌｅtは、テッセレータ出力（すなわち、ｔ）から決定され、Ｔａｎxは、特定のパラメータ表示角度（すなわち、ａｎｇｌｅt）に関して生成された出力法線のｘ座標に対応し、Ｔａｎyは、パラメータ表示角度（すなわち、ａｎｇｌｅt）に関して生成された出力法線のｙ座標に対応し、ｒｈは、非回転楕円の横半径を表し、ｒｖは、非回転楕円の縦半径を表し、ｒｖＣｏｓ、ｒｖＳｉｎ、ｒｈＣｏｓ、およびｒｈＳｉｎは、それぞれ、ｒｖ＊Ｃｏｓ（角度）、ｒｖ＊Ｓｉｎ（角度）、ｒｈ＊Ｃｏｓ（角度）、およびｒｈ＊Ｓｉｎ（角度）を表し、角度は、（ｒｈ，ｒｖ）によるスケーリングに先立って測定されたｘ軸に対する楕円の反時計回り角度を表す。いくつかの例では、ハルシェーダ４８は、ｃｏｓ（角度）とｓｉｎ（角度）とを決定（たとえば、事前計算）し、および／またはｒｖＣｏｓ値と、ｒｖＳｉｎ値と、ｒｈＣｏｓ値と、ｒｈＳｉｎ値とを決定（たとえば、事前計算）して、楕円に関して上で具陳したパラメータ式を評価する際に使用するために、これらの値をドメインシェーダ５２に提供するように構成され得る。
【０１３７】
[0120]接線を見出した後、以下の式に従って、法線ベクトルが見出され得る。
【０１３８】
【数１６】
2017504888.tif 000018
【０１３９】
式中、ｎｏｒｍａｌは、（Ｔａｎx，Ｔａｎy）ベクトルに関する正規化ベクトルに対応し、ｎｏｒｍａｌｉｚｅ（ｘ，ｙ）は、入力ベクトル（ｘ，ｙ）の正規化バージョンを生成する関数である。ベクトル（ｘ，ｙ）の正規化バージョンは、１のベクトル（ｘ，ｙ）および長さ（たとえば、ｎｏｒｍ）と同じ方向を有するベクトルと指す場合がある。
【０１４０】
[0121]楕円弧に関して上で議論したように、パッチ制御リスト内の頂点は、いくつかの例では、終点パラメータ表示を示すデータを含み得る。そのような例では、ハルシェーダ４８は、楕円弧の終点パラメータ表示を示すデータを楕円弧の中心パラメータ表示を示すデータに変換することができる。
【０１４１】
[0122]したがって、本開示の技法によれば、グラフィックスパイプライン４０の１つまたは複数の段階は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る、ここにおいて、ＧＰＵ１２の頂点バッファの複数の頂点の各々が、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、ように構成され得る。グラフィックスパイプライン４０は、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定して、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングするようにさらに構成され得る。
【０１４２】
[0123]図４は、本開示のＧＰＵアクセラレーテッドパスレンダリング技法によるＧＰＵのバッファを示す概念図である。図４の例としては、サンプル頂点バッファ１００、ｐｒｉｍｔｙｐｅバッファ１０２、および対応する出力１０４がある。図４の例では、頂点バッファ１００は、ｖ０〜ｖ７と示される、８つの頂点を含む。頂点ｖ０〜ｖ７の各々は、パスレンダリングプリミティブの頂点を備える。入力アセンブラ４４および、場合によっては、ＧＰＵ１２の他の段階は、ｐｒｉｍｔｙｐｅバッファ１０２の値に基づいて、頂点ｖ０〜ｖ７の各々と関連付けられたプリミティブタイプを決定する。
【０１４３】
[0124]図４の例では、ｐｒｉｍｔｙｐｅバッファ１０２は、オープンリセットを示すＯＲ値１０６で始まる。オープンリセットは、接続されたパスレンダリングプリミティブのセットである新しいサブパスの始端を示す。より具体的には、サブパスの各パスレンダリングプリミティブの最後の頂点は、サブパス内の後続の頂点の第１の頂点と接続される。次のサブバンドがＯＲで始まるか、またはクローズリセット（ＣＲ）で始まるかに応じて、ＧＰＵ１２は、サブパスの第１の頂点をサブパスの最後の頂点と接続することができる。各サブパスの終端、および新しいサブパスの始端はまた、後続のリセット値によって示される。
【０１４４】
[0125]サブパスの始端を示すオープンリセット値またはクローズリセット値に続いて、およびサブパスの終端を示すリセット値の前に、パスレンダリングプリミティブタイプを示す１つまたは複数のｐｒｉｍｔｙｐｅバッファ値がある。各プリミティブタイプ値は、サブパスを作り上げるプリミティブのうちの１つを備えた１つまたは複数の頂点のプリミティブタイプを示す。ＧＰＵ１２の入力アセンブラ４４は、サブパスの各プリミティブを備えた頂点を決定し、リセットされた始端プリミティブの後に、プリミティブタイプ値の各々に基づいてプリミティブを生成し、各生成されたプリミティブの表現をリソースブロック６４内に記憶する。
【０１４５】
[0126]頂点バッファ１００の頂点と関連付けられたサブパスの数を決定するために、入力アセンブラ４４は、任意のオープンリセット値またはクローズリセット値のインデックスを決定するためのｐｒｉｍｔｙｐｅバッファ１０２のプリムタイプ値を走査することができる。図４の例では、入力アセンブラ４４は、ｐｒｉｍｔｙｐｅバッファ１０２が２つのサブパスを含むことを決定する。第１のサブパスの開始はオープンリセット１０６によって示され、第１のサブパスの終端はクローズリセット（ＣＲ）１１２によって示される。ＣＲ１１２は、第２のサブパスの開始をやはり示す。図４の例では、第２の最後のサブパスは、サブパスの終端を示すためのリセットを含まない。最後のサブパスがリセットを含まない場合、入力アセンブラ４４は、最後のサブパスの終了リセットがクローズリセットであると推論する。
【０１４６】
[0127]各サブパスに関して、入力アセンブラ４４はまず開始リセットを読み取る。第１のサブパスの場合、開始リセットはＯＲ１０６である。サブパスの開始リセットを読み取った後、入力アセンブラ４４は、サブパスの終了リセットを含めて、サブパスの終了リセットまで、ｐｒｉｍｔｙｐｅバッファ１０２の各プリミティブタイプ値を読み取る。この例では、第１のサブパスのプリミティブタイプは、ＬＩＮＥプリミティブタイプ１０８と、ＱＵＡＤプリミティブタイプ１１０とを含み、エンドリセットはＣＲ１１２である。入力アセンブラ４４がｐｒｉｍｔｙｐｅバッファ１０２から読み取るこれらのプリミティブタイプに基づいて、入力アセンブラ４４は、ラインプリミティブおよび２次ベジェ曲線プリミティブが第１のサブパスのプリミティブを備えることを決定する。
【０１４７】
[0128]入力アセンブラは、次いで、頂点バッファ１００の頂点を各プリミティブの表現にグループ化する。頂点バッファ１００の頂点をプリミティブにグループ化するために、入力アセンブラ４４は、サブパスの各プリミティブタイプと関連付けられた頂点の数を決定し、各パスレンダリングプリミティブタイプと関連付けられた頂点の数に基づいて、各プリミティブと関連付けられた頂点バッファ１００の頂点をさらに決定する。図４の例では、開始ＯＲ１０６後の第１のプリミティブタイプ値は、ラインパスレンダリングプリミティブタイプに対応するＬＩＮＥプリミティブタイプ値１０８である。定義により、ラインは２つの頂点からなるため、入力アセンブラ４４は、頂点バッファ１００の２つの頂点がラインと関連付けられることを決定する。ラインプリミティブタイプ１０８に基づいて、入力アセンブラ４４は、頂点バッファ１００のそれぞれ第１の２つの頂点１０６および１０８がラインプリミティブと関連付けられることを決定する。
【０１４８】
[0129]入力アセンブラ４４が各プリミティブ、この場合、ラインプリミティブの頂点を決定すると、入力アセンブラ４４は、頂点（この例では、頂点ｖ０およびｖ１）を含むプリミティブの表現をリソースブロック６４内に記憶する。いくつかの例では、入力アセンブラ４４は、ｐｒｉｍＩＤを生成し、そのプリミティブＩＤをプリミティブの表現と関連付ける。入力アセンブラ４４またはＧＰＵ１２の他の段階は、それによってリソースブロック６４からプリミティブデータ（たとえば、プリミティブと関連付けられた頂点）にアクセスするインデックスとしてｐｒｉｍＩＤを利用することができる。
【０１４９】
[0130]入力アセンブラは、次いで、プリミティブタイプと、各サブパスの各プリミティブに関する頂点とを決定するプロセスを継続する。図４の例では、入力アセンブラ４４は、次のプリミティブタイプがサブパスの次のプリミティブタイプ、定義により、３つの点を有する２次曲線であることを示すＱＵＡＤプリミティブタイプであることを読み取る。リセット値がない場合、入力アセンブラ４４は、最後のプリミティブの頂点（この場合、頂点ｖ１）がサブパスの現在のプリミティブの第１の頂点であることを決定する。このようにして、入力アセンブラ４４は、２次曲線が頂点ｖ１、ｖ２、およびｖ３（頂点１２２）と関連付けられることを決定する。入力アセンブラ４４は、２次曲線プリミティブに関するｐｒｉｍＩＤを生成し、そのプリミティブをリソースブロック６４内に記憶する。
【０１５０】
[0131]入力アセンブラは、次いで、第１のサブパスの終端と第２のサブパスの始端とを示すｐｒｉｍｔｙｐｅバッファ１０２の次の値ＣＲ１１２を読み取る。サブパスの終了リセットの値が、サブパスの第１の頂点および最後の頂点が接続されていることを示す場合、入力アセンブラ４４は、サブパスの第１の頂点と最後の頂点とを接続するラインプリミティブに対応する追加のプリミティブデータを生成し、記憶することができる。第１のサブパスの例では、終了リセットＣＲ１１２は、第１のサブパスの第１の頂点とそのサブパスの最後の頂点とが接続されていないことを示す。
【０１５１】
[0132]新しいサブパスの開始をやはり示す終了リセットを読み取った後、入力アセンブラ４４は、次いで、その始端がＣＲ１１２によって示される第２のサブパスのプリミティブの生成に移る。第２のサブパスの開始を示すＣＲ１１２を読み取った後、入力アセンブラ４４は、第２のサブパスの第１のプリミティブが３つの頂点を有する２次曲線であることを示すＱＵＡＤプリミティブタイプ値１１４を読み取る。ＣＲ１１２は新しいサブパスの開始を示すため、入力アセンブラ４４は、第２のサブパスの第１の頂点が前の（第１の）サブパスの最後の頂点の後の頂点、この場合、ｖ４であることを決定する。第２のサブパスの第１のプリミティブが２次曲線であると決定した後、入力アセンブラ４４は、頂点ｖ４、ｖ５、およびｖ６（頂点１２４）がそのプリミティブの一部であることを決定し、２次曲線プリミティブの表現と、その２次プリミティブに関するｐｒｉｍＩＤとを生成し、ｐｒｉｍＩＤとプリミティブ表現とをリソースブロック６４内に記憶する。
【０１５２】
[0133]入力アセンブラは、次いで、ｐｒｉｍｔｙｐｅバッファ１０２の次の値、すなわち、ＬＩＮＥプリミティブタイプ値１１６を読み取る。入力アセンブラは、第２のプリミティブの第２のプリミティブが２つの頂点を有するラインプリミティブであることを決定する。入力アセンブラ４４は、前のプリミティブの最後の頂点、頂点ｖ６、および次の頂点ｖ７（頂点１２６）を読み取る。入力アセンブラ４４は、次いで、そのプリミティブに関するｐｒｉｍＩＤを生成し、頂点ｖ６およびｖ７を含むプリミティブデータの表現、ならびに、ｐｒｉｍＩＤをリソースブロック６４内に記憶する。
【０１５３】
[0134]ｐｒｉｍｔｙｐｅバッファ１０２内にはそれ以上プリミティブタイプ値は存在せず、入力アセンブラ、ｐｒｉｍｔｙｐｅバッファ１０２内に含まれた終了リセット値も存在しないため、入力アセンブラは、第２のサブパスの終了リセットがクローズリセットであり、頂点ｖ７、およびｖ４、すなわち、第２のサブパスの第１の頂点および最後の頂点が接続されていると推論する。入力アセンブラ４４は、ｖ４およびｖ７を接続するラインプリミティブに関するｐｒｉｍＩＤを生成し、次いで、そのラインプリミティブの表現と、そのラインプリミティブと関連付けられたｐｒｉｍＩＤとをリソースブロック６４内に記憶する。
【０１５４】
[0135]図４は、入力アセンブラが、頂点バッファとｐｒｉｍｔｙｐｅバッファとに基づいて、プリミティブデータをどのように生成し得るかのただ１つの例を示す。２つのサブパスだけを有するとして示されているが、任意の数のサブパスが可能であり得る。また、図４は、２つのパスレンダリングプリミティブだけを有するサブパスを示すが、任意の数のパスレンダリングプリミティブがサブパス内に含まれ得る。図４は、単一のｐｒｉｍｔｙｐｅバッファおよび単一の頂点バッファだけを示すが、入力アセンブラ４４は、上で説明したように、プリミティブデータを生成するために、頂点バッファおよびｐｒｉｍｔｙｐｅバッファを多重化することを処理し得る。加えて、ｐｒｉｍｔｙｐｅバッファ１０２はＯＲ値、ＣＲ値、ＬＩＮＥ値、およびＱＵＡＤ値だけを有するとして示されているが、ＡＲＣ（楕円弧）など他の値、および高次曲線プリミティブタイプ値もｐｒｉｍｔｙｐｅバッファ１０２内に含まれ得る。
【０１５５】
[0136]図５は、本開示の１つまたは複数の例による、ＧＰＵの段階を介した状態情報のパスを示す概念図である。図５は、グラフィックスパイプライン４０を介して入力アセンブラ４４によって最初に生成されるプリミティブタイプ状態変数データの様々な断片の通路を示す。図３に示したように、グラフィックスパイプライン４０は、入力アセンブラ４４と、頂点シェーダ４６と、ハルシェーダ４８と、テッセレータ５０と、ドメインシェーダ５２と、ジオメトリシェーダ５４と、リソースブロック６４とを含む。上で説明したように、入力アセンブラ４４は、各パスレンダリングプリミティブの表現を生成し、関連付けられたｐｒｉｍＩＤとともに、各プリミティブをリソースブロック６４内に記憶する。
【０１５６】
[0137]レンダリングされることになる各プリミティブに関して、入力アセンブラ４４は、プリミティブ状態変数ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅ、ｓｖ＿ｐｒｅｖ＿ｐｒｉｍｔｙｐｅ、およびｓｖ＿ｎｅｘｔ＿ｐｒｉｍｔｙｐｅを生成することができる。ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅは、グラフィックスパイプライン４０の段階のうちの１つによって現在処理されている現在のプリミティブのタイプを示す。ｓｖ＿ｐｒｅｖ＿ｐｒｉｍｔｙｐｅおよびｓｖ＿ｎｅｘｔ＿ｐｒｉｍｐｔｙｐｅの値は、前に処理されたプリミティブのプリミティブタイプ、および処理されることになる次のプリミティブをそれぞれ示す。入力アセンブラ４４は、ｐｒｉｍＩＤ値と同様の形で、ｓｖ＿ｐｒｅｖ＿ｐｒｉｍｔｙｐｅ変数、ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅ変数、およびｓｖ＿ｎｅｘｔ＿ｐｒｉｍｔｙｐｅ変数の値を割り当てることができる。
【０１５７】
[0138]本開示の技法によれば、入力アセンブラ４４は、ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅ変数、およびｓｖ＿ｎｅｘｔ＿ｐｒｉｍｔｙｐｅ変数をハルシェーダ段階４８に提供する。ｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅ変数およびｓｖ＿ｎｅｘｔ＿ｐｒｉｍｔｙｐｅ変数と、リソースブロック６４から受け取られた現在のプリミティブに関するデータと、頂点シェーダ４６から受け取られた入力制御点とに基づいて、ハルシェーダ４８は、テッセレーション係数を生成し、テッセレータ５０に出力する。ハルシェーダ４８はまた、出力された制御点、処理されることになる次のプリミティブの開始法線、およびテッセレーション係数を生成し、ドメインシェーダ５２に出力する。
【０１５８】
[0139]テッセレータ５０は、ハルシェーダ４８からテッセレーション係数を受け取り、上で説明したように、ドメイン座標をｕ−ｖ座標ドメイン内に出力する。ストリームアウトが不可能にされる場合、テッセレータ５０は、ｕ−ｖ座標をドメインシェーダ５２に出力する。グラフィックスパイプラインのある段階からグラフィックスパイプラインの初期段階にデータをフィードバックするためにアプリケーションによって使用され得るオプションであるストリームアウトが可能にされる場合、テッセレータ５０は後で使用するためにドメイン座標をリソースブロック６４に出力し戻すことができる。
【０１５９】
[0140]ドメインシェーダ５２は、テッセレータ５０から受け取られたドメイン座標およびテッセレーション係数に基づいて、頂点を生成することができる。加えて、ドメインシェーダ５２は、ハルシェーダ４８から受け取られた可変数の制御点に基づいて、頂点を生成することを受け取ることをサポートし得る。可変数の制御点は、ハルシェーダ４８から受け取られたｓｖ＿ｃｕｒｒ＿ｐｒｉｍｔｙｐｅの値によって示され得る。
【０１６０】
[0141]図６は、実行されたとき、ＧＰＵに本開示の技法のうちの１つまたは複数を実行させることができるグラフィックスＡＰＩのコードを示す図である。図６は、ＤｉｒｅｃｔＸ  １１またはＯｐｅｎＧＬなど、グラフィックスＡＰＩの１７本の（「ライン１〜１７」と呼ばれる）コード例示的なコードを示す。図６のコードが実行されたとき、ライン１〜５（１４０）ＧＰＵ１２は、それぞれ、頂点シェーダ（ライン１）、ハルシェーダ（ライン２）、ドメインシェーダ（ライン３）、ジオメトリシェーダ（ライン４）、およびピクセルシェーダ（ライン５）に関するリソースを開始または割り振ることができる。
【０１６１】
[0142]ライン６〜１２（１２２）のライン６は、実行されたとき、ＧＰＵ１２に、いくつかのパスレンダリングプリミティブを含む定数バッファを割り振らせることができる。ライン７〜１２は、レンダリングされることになるベクタグラフィックスパスレンダリングプリミティブ（vector graphics path-rendering primitives）を接合およびストロークするための様々な接合およびストロークパラメータを定義する。ライン１３〜１７（１２４）は、ストライド（ｓｔｒｉｄｅ）サイズ（ライン１３）およびオフセット（ｏｆｆｓｅｔ）値（ライン１４）を定義し、ストライド（ｓｔｒｉｄｅ）とオフセット（ｏｆｆｓｅｔ）とに基づいて、１つまたは複数のプリミティブを含む頂点バッファを割り振り（ライン１５）、前に割り振られたｐｒｉｍｐｔｙｐｅバッファを指すようにｐｒｉｍｔｙｐｅバッファを設定し（１６）、描画呼出し（ライン１７）を含む。
【０１６２】
[0143]ライン１５で、オフセット（ｏｆｆｓｅｔ）引数は、そこから入力アセンブラ４４が頂点バッファの頂点の読取りを始める開始インデックスを示し、ストライド（ｓｔｒｉｄｅ）引数は、ＧＰＵがそれらの頂点に正確にアクセスすることができるように、頂点バッファの頂点がどのように配置されるべきかを示す定義する。
【０１６３】
[0144]ライン１６で、ＩＡＳｅｔＰｒｉｍＴｙｐｅＢｕｆｆｅｒ呼出しは、前に割り振られているｐｒｉｍＴｙｐｅバッファに対するポインタを第１の引数として解釈する。次の引数は、ｐｒｉｍｔｙｐｅバッファの値のフォーマットを定義する。この例では、このフォーマットは定義された３２ビットの符号なし整数フォーマットである。ライン１７で、ＤｒａｗＰｒｉｍＴｙｐｅ呼出しは、ライン１５および１６の定義された頂点バッファおよびｐｒｉｍｔｙｐｅバッファを利用する描画呼出しである。ＤｒａｗＰｒｉｍＴｙｐｅバッファは、レンダリングされることになるプリミティブの数（この例では、６）をその唯一の引数として解釈する。実行されると、ＤｒａｗＰｒｉｍＴｙｐｅ呼出しは、ＧＰＵ１２に頂点バッファ内に含まれたプリミティブを描画させる。
【０１６４】
[0145]図７は、本開示によるＧＰＵアクセラレーテッドパスレンダリングを実行するための方法を示す流れ図である。図７に示す技法は、例示のために、図１および図２に示したＧＰＵ１２によって、図３および図５に示したグラフィカルパイプライン４０を用いて実行されるとして説明される。他の例では、図７に示す技法は、同じ構成要素または異なる構成要素を同じ構成もしくは異なる構成で有する他のシステム内で実装され得る。
【０１６５】
[0146]図７は、本開示によるＧＰＵアクセラレーテッドパスレンダリングを実行するための例示的な技法を示す流れ図である。単なる例示のために、グラフィックスパイプライン４０の様々な段階が図７に示す技法を実行することができる。図７のプロセスにおいて、ＧＰＵ１２の入力アセンブラ４４は、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取る（１６０）。様々な例では、プリミティブタイプエントリは、ベクタグラフィックスプリミティブタイプデータを備え得る。いくつかの例では、プリミティブタイプエントリは、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含み得る。
【０１６６】
[0147]ＧＰＵの頂点バッファの複数の頂点の各々は、複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられることが可能である。入力アセンブラ４４（または、ハルシェーダ４８、ドメインシェーダ５２など、グラフィックススパイプライン４０の別の段階）は、複数の頂点と、関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することができる（１６２）。ＧＰＵ１２は、次いで、複数の頂点と、プリミティブタイプバッファの関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブをレンダリングすることができる（１６４）。
【０１６７】
[0148]様々な例では、図７の方法において、入力アセンブラ４４は、プリミティブタイプバッファ内のエントリのうちの１つのエントリに基づいて、頂点バッファの複数の頂点の各々に関する関連付けられたプリミティブタイプを決定するように構成され得る。入力アセンブラ４４は、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示をハルシェーダ４８とドメインシェーダ５２とに出力するようにさらに構成され得る。
【０１６８】
[0149]別の例では、ハルシェーダ４８は入力アセンブラ４４からプリミティブタイプデータを受け取ることができる。ハルシェーダ４８は、ＧＰＵのテッセレータ５０に関する１つまたは複数のテッセレーション係数をさらに決定し、受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することができる。
【０１６９】
[0150]テッセレータ５０は、ハルシェーダ４８から１つまたは複数のテッセレーション係数を受け取ることができる。テッセレータ５０はさらに、ハルシェーダ４８から、ハルシェーダ４８からのテッセレーションドメインタイプを受け取り、１つまたは複数の受け取ったテッセレーション係数に基づいて、テッセレーションドメインをテッセレートすることができる。別の例では、ドメインシェーダ５２は、テッセレータ５０から複数のドメイン座標を受け取ることができる。ドメインシェーダ５２はまた、ハルシェーダ４８からプリミティブデータを受け取ることができる。
【０１７０】
[0151]本開示で説明する技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明した技法の様々な態様は、１つもしくは複数のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、あるいは任意の他の等価な集積回路またはディスクリート論理回路を含む、１つもしくは複数のプロセッサ内、ならびにそのような構成要素の任意の組合せ内で実装され得る。「プロセッサ」または「処理回路」という用語は、一般に、単独で、あるいは他の論理回路または、処理を実行する個別ハードウェアなどの他の等価回路との組合せで上記の論理回路のいずれかを指すことがある。
【０１７１】
[0152]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明する様々な動作および機能をサポートするために、同じデバイス内で、または別のデバイス内で実装され得る。さらに、説明したユニット、モジュール、または構成要素のいずれも、個別であるが相互運用可能な論理デバイスとして、一緒に、または別々に実装され得る。モジュールまたはユニットとしての様々な機能の図は、様々な機能的態様を強調するものであり、そのようなモジュールまたはユニットが別々のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを必ずしも暗示するとは限らない。そうではなく、１つもしくは複数のモジュールまたはユニットに関連する機能は、別々のハードウェア構成要素、ファームウェア構成要素、および／またはソフトウェア構成要素によって実行されるか、あるいは共通もしくは別々のハードウェア構成要素内またはソフトウェア構成要素内に組み込まれることがある。
【０１７２】
[0153]また、本開示で説明する技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体中に記憶、実施または符号化され得る。コンピュータ可読媒体中に埋め込まれるか、または符号化される命令は、たとえば、それらの命令が１つまたは複数のプロセッサによって実行されたとき、１つまたは複数のプロセッサに本明細書で説明する技法を実行させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光学媒体、または他の有形のコンピュータ可読記憶媒体を含み得る。
【０１７３】
[0154]コンピュータ可読媒体は、上記に記載した有形記憶媒体などの有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。このようにして、「コンピュータ可読媒体」という句は、概して、（１）非一時的である有形コンピュータ可読記憶媒体、および（２）一時的な信号または搬送波などの非有形コンピュータ可読通信媒体に対応し得る。
【０１７４】
[0155]様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく本開示の構造または技法に変更を行うことができる。
【図１】
2017504888.tif 000019
【図２】
2017504888.tif 000020
【図３】
2017504888.tif 000021
【図４】
2017504888.tif 000022
【図５】
2017504888.tif 000023
【図６】
2017504888.tif 000024
【図７】
2017504888.tif 000025
【手続補正書】
【提出日】平成28年8月30日(2016.8.30)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
グラフィックス処理ユニット（ＧＰＵ）によって実行される方法であって、
前記ＧＰＵによって、引数として、複数の頂点を備えた頂点バッファと複数のプリミティブタイプエントリを備えたプリミティブタイプバッファとを含む描画呼出しコマンドを受け取ることと、ここにおいて、前記複数の頂点の第１の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられ、前記複数の頂点の第２の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられるように、前記頂点バッファの前記複数の頂点の各々の頂点が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられ、ここにおいて、前記第１の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つが、前記第２の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つとは異なる、
前記ＧＰＵによって、前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することと、
前記ＧＰＵによって、前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングすることと、
を備える、方法。
【請求項２】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項１に記載の方法。
【請求項３】
前記ＧＰＵの入力アセンブラによって、前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々の頂点に関する関連付けられたプリミティブタイプを決定すること、
をさらに備える、請求項１に記載の方法。
【請求項４】
前記ＧＰＵのハルシェーダによって、前記ＧＰＵの入力アセンブラからプリミティブタイプデータを受け取ることと、
前記ハルシェーダによって、前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定することと、
前記ハルシェーダによって、前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することと、
をさらに備える、請求項１に記載の方法。
【請求項５】
前記ＧＰＵのテッセレーションユニットによって、前記ＧＰＵのハルシェーダから、前記１つまたは複数のテッセレーション係数を受け取ることと、
前記テッセレーションユニットによって、前記ハルシェーダから、前記ハルシェーダからの前記テッセレーションドメインタイプを受け取ることと、
前記テッセレーションユニットによって、前記１つまたは複数の受け取ったテッセレーション係数に基づいて、テッセレーションドメインをテッセレートすることと、
をさらに備える、請求項４に記載の方法。
【請求項６】
前記ＧＰＵのドメインシェーダによって、前記ＧＰＵのテッセレーションユニットから、複数のドメイン座標を受け取ることと、
前記ドメインシェーダによって、前記ＧＰＵのハルシェーダから、プリミティブタイプデータを受け取ることと、
をさらに備える、請求項１に記載の方法。
【請求項７】
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、請求項１に記載の方法。
【請求項８】
前記ＧＰＵの入力アセンブラによって、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵのハルシェーダ段階ならびに前記ＧＰＵのドメインシェーダ段階のうちの少なくとも１つに出力すること、
をさらに備える、請求項１に記載の方法。
【請求項９】
グラフィックス処理ユニット（ＧＰＵ）であって、
頂点バッファおよびプリミティブタイプバッファを記憶するように構成されたメモリと、
引数として、複数の頂点を備えた前記頂点バッファと複数のプリミティブタイプエントリを備えた前記プリミティブタイプバッファとを含む描画呼出しコマンドを受け取ることと、ここにおいて、前記複数の頂点の第１の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられ、前記複数の頂点の第２の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられるように、前記頂点バッファの前記複数の頂点の各々の頂点が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられ、ここにおいて、前記第１の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つが、前記第２の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つとは異なる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することと、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングすることと、
を行うように構成された少なくとも１つのプロセッサと、
を備える、ＧＰＵ。
【請求項１０】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項９に記載のＧＰＵ。
【請求項１１】
前記ＧＰＵが、入力アセンブラをさらに備え、前記入力アセンブラが、
前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々の頂点に関する関連付けられたプリミティブタイプを決定する、
ように構成される、請求項９に記載のＧＰＵ。
【請求項１２】
入力アセンブラと、
テッセレーションユニットと、
ハルシェーダと
をさらに備え、前記ハルシェーダが、
前記ＧＰＵの前記入力アセンブラから、プリミティブタイプデータを受け取ることと、
前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定することと、
前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することと、
を行うように構成される、請求項９に記載のＧＰＵ。
【請求項１３】
前記テッセレーションユニットが、
ハルシェーダから、前記１つまたは複数のテッセレーション係数を受け取ることと、
前記ハルシェーダから、前記ハルシェーダからの前記テッセレーションドメインタイプを受け取ることと、
前記１つまたは複数の受け取ったテッセレーション係数に基づいて、テッセレーションドメインをテッセレートすることと、
を行うように構成される、請求項１２に記載のＧＰＵ。
【請求項１４】
テッセレーションユニットと、
ドメインシェーダと、
をさらに備え、前記ドメインシェーダが、
前記ＧＰＵの前記テッセレーションユニットから、複数のドメイン座標を受け取ることと、
ハルシェーダから、プリミティブタイプデータを受け取ることと、
を行うようにさらに構成される、請求項９に記載のＧＰＵ。
【請求項１５】
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、請求項９に記載のＧＰＵ。
【請求項１６】
ハルシェーダ段階と、
ドメインシェーダ段階と、
入力アセンブラ段階と、
をさらに備え、入力アセンブラが、
現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵの前記ハルシェーダ段階ならびに前記ドメインシェーダ段階のうちの少なくとも１つに出力する、
ように構成される、請求項９に記載のＧＰＵ。
【請求項１７】
引数として、複数の頂点を備えた頂点バッファと複数のプリミティブタイプエントリを備えたプリミティブタイプバッファとを含む描画呼出しコマンドを受け取るための手段と、ここにおいて、前記複数の頂点の第１の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられ、前記複数の頂点の第２の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられるように、前記頂点バッファの前記複数の頂点の各々の頂点が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられ、ここにおいて、前記第１の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つが、前記第２の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つとは異なる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定するための手段と、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングするための手段と、
を備える、装置。
【請求項１８】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項１７に記載の装置。
【請求項１９】
前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々の頂点に関する関連付けられたプリミティブタイプを決定するための手段、
をさらに備える、請求項１７に記載の装置。
【請求項２０】
プリミティブタイプデータを受け取るための手段と、
テッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定するための手段と、
前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定するための手段と、
をさらに備える、請求項１７に記載の装置。
【請求項２１】
前記１つまたは複数のテッセレーション係数を受け取るための手段と、
前記テッセレーションドメインタイプを受け取るための手段と、
前記１つまたは複数の受け取ったテッセレーション係数に基づいて、テッセレーションドメインをテッセレートするための手段と、
をさらに備える、請求項２０に記載の装置。
【請求項２２】
複数のドメイン座標を受け取るための手段と、
プリミティブタイプデータを受け取るための手段と、
をさらに備える、請求項１７に記載の装置。
【請求項２３】
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、請求項１７に記載の装置。
【請求項２４】
現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を出力するための手段、
をさらに備える、請求項１７に記載の装置。
【請求項２５】
実行されたとき、少なくとも１つのプロセッサに、
引数として、複数の頂点を備えた頂点バッファと複数のプリミティブタイプエントリを備えたプリミティブタイプバッファとを含む描画呼出しコマンドを受け取ることと、ここにおいて、前記複数の頂点の第１の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられ、前記複数の頂点の第２の頂点が前記複数のプリミティブタイプエントリのうちの少なくとも１つと関連付けられるように、前記頂点バッファの前記複数の頂点の各々の頂点が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられ、ここにおいて、前記第１の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つが、前記第２の頂点と関連付けられた前記複数のプリミティブタイプエントリのうちの前記少なくとも１つとは異なる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することと、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングすることと、
を行わせる命令を記憶した非一時的コンピュータ可読記憶媒体。
【請求項２６】
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２７】
実行されたとき、前記少なくとも１つのプロセッサに、
前記少なくとも１つのプロセッサの入力アセンブラによって、前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々の頂点に関する関連付けられたプリミティブタイプを決定させる
命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２８】
実行されたとき、前記少なくとも１つのプロセッサに、
前記少なくとも１つのプロセッサのハルシェーダによって、前記少なくとも１つのプロセッサの入力アセンブラからプリミティブタイプデータを受け取ることと、
前記ハルシェーダによって、前記少なくとも１つのプロセッサのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定することと、
前記ハルシェーダによって、前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することと、
を行わせる命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２９】
実行されたとき、前記少なくとも１つのプロセッサに、
前記少なくとも１つのプロセッサのドメインシェーダによって、前記少なくとも１つのプロセッサのテッセレーションユニットから、複数のドメイン座標を受け取ることと、
前記ドメインシェーダによって、前記少なくとも１つのプロセッサのハルシェーダから、プリミティブタイプデータを受け取ることと、
を行わせる命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【請求項３０】
実行されたとき、前記少なくとも１つのプロセッサに、
前記少なくとも１つのプロセッサの入力アセンブラによって、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記少なくとも１つのプロセッサのハルシェーダ段階ならびに前記少なくとも１つのプロセッサのドメインシェーダ段階のうちの少なくとも１つに出力すること
を行わせる命令をさらに備える、請求項２５に記載の非一時的コンピュータ可読記憶媒体。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１７４
【補正方法】変更
【補正の内容】
【０１７４】
[0155]様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく本開示の構造または技法に変更を行うことができる。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
グラフィックス処理ユニット（ＧＰＵ）によって実行される方法であって、
前記ＧＰＵによって、複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取ることと、
ここにおいて、前記ＧＰＵの頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記ＧＰＵによって、前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定することと、
前記ＧＰＵによって、前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングすることと、を備える、方法。
［Ｃ２］
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、Ｃ１に記載の方法。
［Ｃ３］
前記ＧＰＵの入力アセンブラによって、前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定すること、
をさらに備える、Ｃ１に記載の方法。
［Ｃ４］
前記ＧＰＵのハルシェーダによって、前記ＧＰＵの入力アセンブラからプリミティブタイプデータを受け取ることと、
前記ハルシェーダによって、前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定することと、
前記ハルシェーダによって、前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定することと、
をさらに備える、Ｃ１に記載の方法。
［Ｃ５］
前記ＧＰＵのテッセレーションユニットによって、前記ＧＰＵのハルシェーダから、前記１つまたは複数のテッセレーション係数を受け取ることと、
前記テッセレーションユニットによって、前記ハルシェーダから、前記ハルシェーダからの前記テッセレーションドメインタイプを受け取ることと、
前記テッセレーションユニットによって、前記１つまたは複数の受け取ったテッセレーション係数に基づいて、前記テッセレーションドメインをテッセレートすることと、
をさらに備える、Ｃ４に記載の方法。
［Ｃ６］
前記ＧＰＵのドメインシェーダによって、前記ＧＰＵのテッセレーションユニットから、複数のドメイン座標を受け取ることと、
前記ドメインシェーダによって、前記ＧＰＵのハルシェーダから、プリミティブタイプデータを受け取ることと、
をさらに備える、Ｃ１に記載の方法。
［Ｃ７］
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、Ｃ１に記載の方法。
［Ｃ８］
前記ＧＰＵの入力アセンブラによって、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵのハルシェーダ段階ならびに前記ＧＰＵのドメインシェーダ段階のうちの少なくとも１つに出力すること、
をさらに備える、Ｃ１に記載の方法。
［Ｃ９］
メモリと、
複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取って、
ここにおいて、前記ＧＰＵの頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定して、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングする
ように構成された少なくとも１つのプロセッサと、
を備える、グラフィックス処理ユニット（ＧＰＵ）。
［Ｃ１０］
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、Ｃ９に記載のＧＰＵ。
［Ｃ１１］
前記ＧＰＵが、入力アセンブラをさらに備え、前記入力アセンブラが、
前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定する、ように構成される、Ｃ９に記載のＧＰＵ。
［Ｃ１２］
入力アセンブラと、
テッセレーションユニットと、
ハルシェーダと
をさらに備え、前記ハルシェーダが、
前記ＧＰＵの前記入力アセンブラから、プリミティブタイプデータを受け取って、
前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定して、
前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定する、
ように構成される、Ｃ９に記載のＧＰＵ。
［Ｃ１３］
前記テッセレーションユニットが、
前記ハルシェーダから、前記１つまたは複数のテッセレーション係数を受け取って、
前記ハルシェーダから、前記ハルシェーダからの前記テッセレーションドメインタイプを受け取って、
前記１つまたは複数の受け取ったテッセレーション係数に基づいて、前記テッセレーションドメインをテッセレートする、ように構成される、Ｃ１２に記載のＧＰＵ。
［Ｃ１４］
テッセレーションユニットと、
ドメインシェーダと、をさらに備え、前記ドメインシェーダが、
前記ＧＰＵの前記テッセレーションユニットから、複数のドメイン座標を受け取って、
前記ハルシェーダから、プリミティブタイプデータを受け取る、
ようにさらに構成される、Ｃ９に記載のＧＰＵ。
［Ｃ１５］
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、Ｃ９に記載のＧＰＵ。
［Ｃ１６］
ハルシェーダ段階と、
ドメインシェーダ段階と、
入力アセンブラ段階と、をさらに備え、前記入力アセンブラが、
現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵの前記ハルシェーダ段階ならびに前記ドメインシェーダ段階のうちの少なくとも１つに出力する、ように構成される、Ｃ９に記載のＧＰＵ。
［Ｃ１７］
複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取るための手段と、
ここにおいて、頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定するための手段と、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングするための手段と、
を備える、装置。
［Ｃ１８］
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、Ｃ１７に記載の装置。
［Ｃ１９］
前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定するための手段、
をさらに備える、Ｃ１７に記載の装置。
［Ｃ２０］
プリミティブタイプデータを受け取るための手段と、
テッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定するための手段と、
前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定するための手段と、
をさらに備える、Ｃ１７に記載の装置。
［Ｃ２１］
前記１つまたは複数のテッセレーション係数を受け取るための手段と、
前記テッセレーションドメインタイプを受け取るための手段と、
前記１つまたは複数の受け取ったテッセレーション係数に基づいて、前記テッセレーションドメインをテッセレートするための手段と、
をさらに備える、Ｃ２０に記載の装置。
［Ｃ２２］
複数のドメイン座標を受け取るための手段と、
プリミティブタイプデータを受け取るための手段と、
をさらに備える、Ｃ１７に記載の装置。
［Ｃ２３］
前記プリミティブタイプエントリが、複数のオープンリセット、クローズリセット、ライン、三角形、弧、２次曲線、３次曲線、およびクワッドを含む、Ｃ１７に記載の装置。
［Ｃ２４］
現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を出力するための手段、
をさらに備える、Ｃ１７に記載の装置。
［Ｃ２５］
実行されたとき、少なくとも１つのプロセッサに、
複数のプリミティブタイプエントリを備えたプリミティブタイプバッファを受け取らせて、
ここにおいて、前記ＧＰＵの頂点バッファの複数の頂点の各々が、前記複数のプリミティブタイプエントリのうちの１つまたは複数と関連付けられる、
前記複数の頂点と、前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、プリミティブを決定させて、
前記複数の頂点と、前記プリミティブタイプバッファの前記関連付けられた１つまたは複数のプリミティブタイプエントリとに基づいて、前記プリミティブをレンダリングさせる、命令を記憶した非一時的コンピュータ可読記憶媒体。
［Ｃ２６］
前記プリミティブタイプエントリがベクタグラフィックスプリミティブデータを備える、Ｃ２５に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ２７］
実行されたとき、前記少なくとも１つのプロセッサに、前記ＧＰＵの入力アセンブラによって、前記プリミティブタイプバッファ内の前記エントリのうちの１つのエントリに基づいて、前記頂点バッファの前記複数の頂点の各々に関する関連付けられたプリミティブタイプを決定させる、命令をさらに備える、Ｃ２５に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ２８］
実行されたとき、前記少なくとも１つのプロセッサに、
前記ＧＰＵのハルシェーダによって、前記ＧＰＵの入力アセンブラからプリミティブタイプデータを受け取らせて、
前記ハルシェーダによって、前記ＧＰＵのテッセレーションユニットに関する１つまたは複数のテッセレーション係数を決定させて、
前記ハルシェーダによって、前記受け取ったプリミティブタイプデータに基づいて、テッセレーションドメインタイプを決定させる、命令をさらに備える、Ｃ２５に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ２９］
実行されたとき、前記少なくとも１つのプロセッサに、
前記ＧＰＵのドメインシェーダによって、前記ＧＰＵのテッセレーションユニットから、複数のドメイン座標を受け取らせて、
前記ドメインシェーダによって、前記ＧＰＵのハルシェーダから、プリミティブタイプデータを受け取らせる、命令をさらに備える、Ｃ２５に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ３０］
実行されたとき、前記少なくとも１つのプロセッサに、
前記ＧＰＵの入力アセンブラによって、現在のプリミティブタイプ、前のプリミティブタイプ、および次のプリミティブタイプの表示を前記ＧＰＵのハルシェーダ段階ならびに前記ＧＰＵのドメインシェーダ段階のうちの少なくとも１つに出力させる命令をさらに備える、Ｃ２５に記載の非一時的コンピュータ可読記憶媒体。
【国際調査報告】
2017504888.tif 000026