(57)【要約】プリミティブをカリングするための技術が本明細書で提供される。この技術は、アクセラレーテッド処理デバイスによって実行されるシェーダプログラムの自動生成を含む。ジャストインタイムコンパイラは、グラフィックス処理パイプラインの頂点シェーダステージで使用するために提供された頂点シェーダプログラムに基づいて、シェーダプログラムを自動生成する。自動生成されたシェーダプログラムは、グラフィックス処理パイプラインへの入力として提供された頂点の位置を変換して変換後の入力頂点を生成する、頂点シェーダプログラムからの命令を含む。また、シェーダプログラムは、変換後の入力頂点に基づいてプリミティブをカリングするための命令を含む。ソフトウェアモジュールは、自動生成シェーダプログラムを生成した後に、自動生成シェーダプログラムを、実行するためにグラフィックス処理パイプラインに送信する。自動生成シェーダプログラムは、プリミティブをカリングした後に、カリングされたプリミティブをグラフィックス処理パイプラインの残りの部分に出力する。【選択図】図４
2019526128.tif 000002
【特許請求の範囲】
【請求項１】
アクセラレーテッド処理デバイスのグラフィックス処理パイプラインの頂点シェーダステージに提供されるプリミティブをカリングするためのシェーダプログラムを自動生成する方法であって、
前記グラフィックス処理パイプラインの一部として実行するための頂点シェーダプログラムを受信することと、
前記頂点シェーダプログラムに基づいて変換シェーダプログラムを生成することであって、前記変換シェーダプログラムは、前記頂点シェーダプログラムから導出された頂点位置変換命令を含み、前記頂点位置変換命令は、前記グラフィックス処理パイプライン上で処理するために受信した入力頂点の入力頂点位置を変換して、変換後の出力頂点位置を生成するように構成されている、ことと、
前記変換シェーダプログラムを呼び出し、前記変換後の出力頂点位置に対応するプリミティブをカリングして、カリングされたプリミティブを生成し、前記グラフィックス処理パイプラインの前記頂点シェーダステージによって使用されるために前記カリングされたプリミティブを出力するように構成されたカルシェーダプログラムを生成することと、を含む、
方法。
【請求項２】
バッファから頂点データをフェッチし、フェッチされた頂点データを、前記変換シェーダプログラム及び前記カルシェーダプログラムによって使用されるためにレジスタに配置するように構成された第１フェッチシェーダプログラムを生成することをさらに含む、
請求項１の方法。
【請求項３】
前記カルシェーダプログラムは、前記変換シェーダプログラムを呼び出すように構成された前記第１フェッチシェーダプログラムを呼び出すことによって、前記変換シェーダプログラムを呼び出すように構成されている、
請求項２の方法。
【請求項４】
前記変換シェーダプログラムは、前記第１フェッチシェーダプログラム及び前記カルシェーダプログラムの前に生成され、前記第１フェッチシェーダプログラムは、前記カルシェーダプログラムの前に生成される、
請求項２の方法。
【請求項５】
前記グラフィックス処理パイプライン上で処理するために受信した前記入力頂点に対応する代わりに、前記カリングされたプリミティブに対応するカリングされた頂点データをフェッチし、前記カリングされた頂点データを前記グラフィックス処理パイプラインの前記頂点シェーダステージに提供するように構成された第２フェッチシェーダを生成することをさらに含む、
請求項１の方法。
【請求項６】
前記頂点シェーダプログラムに基づいて前記変換シェーダプログラムを生成することは、前記頂点シェーダプログラムからの変換後の位置出力に寄与しない命令を削除することを含む、
請求項１の方法。
【請求項７】
前記変換後の位置出力に寄与しない命令を削除することは、位置以外の属性出力を出力する出力命令をデッドコードとしてマークし、前記頂点シェーダプログラム上でデッドコード除去を実行することを含む、
請求項６の方法。
【請求項８】
前記カルシェーダプログラムは、バックフェースカリング技術、視錐台カリング技術、スモールプリミティブカリング技術及びオクルージョンカリング技術のうち１つ以上を介して前記プリミティブをカリングするように構成されている、
請求項１の方法。
【請求項９】
前記変換シェーダプログラム及び前記カルシェーダプログラムを、実行するために前記アクセラレーテッド処理デバイスに送信して、レンダリング処理及び出力ディスプレイデバイスへの表示のために、前記グラフィックス処理パイプラインに送信されたプリミティブを処理することをさらに含む、
請求項１の方法。
【請求項１０】
プロセッサによって実行されると、アクセラレーテッド処理デバイスのグラフィックス処理パイプラインの頂点シェーダステージに提供されるプリミティブをカリングするためのシェーダプログラムを自動生成する方法を前記プロセッサに実行させる命令を記憶するコンピュータ可読記憶媒体であって、
前記方法は、
前記グラフィックス処理パイプラインの一部として実行するための頂点シェーダプログラムを受信することと、
前記頂点シェーダプログラムに基づいて変換シェーダプログラムを生成することであって、前記変換シェーダプログラムは、前記頂点シェーダプログラムから導出された頂点位置変換命令を含み、前記頂点位置変換命令は、前記グラフィックス処理パイプライン上で処理するために受信した入力頂点の入力頂点位置を変換して、変換後の出力頂点位置を生成するように構成されている、ことと、
前記変換シェーダプログラムを呼び出し、前記変換後の出力頂点位置に対応するプリミティブをカリングして、カリングされたプリミティブを生成し、前記グラフィックス処理パイプラインの前記頂点シェーダステージによって使用されるために前記カリングされたプリミティブを出力するように構成されたカルシェーダプログラムを生成することと、を含む、
コンピュータ可読記憶媒体。
【請求項１１】
前記方法は、
バッファから頂点データをフェッチし、フェッチされた頂点データを、前記変換シェーダプログラム及び前記カルシェーダプログラムによって使用されるためにレジスタに配置するように構成された第１フェッチシェーダプログラムを生成することをさらに含む、
請求項１０のコンピュータ可読記憶媒体。
【請求項１２】
前記カルシェーダプログラムは、前記変換シェーダプログラムを呼び出すように構成された前記第１フェッチシェーダプログラムを呼び出すことによって、前記変換シェーダプログラムを呼び出すように構成されている、
請求項１１のコンピュータ可読記憶媒体。
【請求項１３】
前記変換シェーダプログラムは、前記第１フェッチシェーダプログラム及び前記カルシェーダプログラムの前に生成され、前記第１フェッチシェーダプログラムは、前記カルシェーダプログラムの前に生成される、
請求項１１のコンピュータ可読記憶媒体。
【請求項１４】
前記方法は、
前記グラフィックス処理パイプライン上で処理するために受信した前記入力頂点に対応する代わりに、前記カリングされたプリミティブに対応するカリングされた頂点データをフェッチし、前記カリングされた頂点データを前記グラフィックス処理パイプラインの前記頂点シェーダステージに提供するように構成された第２フェッチシェーダを生成することをさらに含む、
請求項１０のコンピュータ可読記憶媒体。
【請求項１５】
前記頂点シェーダプログラムに基づいて前記変換シェーダプログラムを生成することは、前記頂点シェーダプログラムからの変換後の位置出力に寄与しない命令を削除することを含む、
請求項１０のコンピュータ可読記憶媒体。
【請求項１６】
前記変換後の位置出力に寄与しない命令を削除することは、位置以外の属性出力を出力する出力命令をデッドコードとしてマークし、前記頂点シェーダプログラム上でデッドコード除去を実行することを含む、
請求項１５のコンピュータ可読記憶媒体。
【請求項１７】
前記カルシェーダプログラムは、バックフェースカリング技術、視錐台カリング技術、スモールプリミティブカリング技術及びオクルージョンカリング技術のうち１つ以上を介して前記プリミティブをカリングするように構成されている、
請求項１０のコンピュータ可読記憶媒体。
【請求項１８】
前記方法は、
前記変換シェーダプログラム及び前記カルシェーダプログラムを、実行するために前記アクセラレーテッド処理デバイスに送信して、レンダリング処理及び出力ディスプレイデバイスへの表示のために、前記グラフィックス処理パイプラインに送信されたプリミティブを処理することをさらに含む、
請求項１０のコンピュータ可読記憶媒体。
【請求項１９】
アクセラレーテッド処理デバイスのグラフィックス処理パイプラインによる処理のために入力プリミティブをカリングする方法であって、
１つ以上の入力プリミティブを受信することと、
カルシェーダプログラムを実行して、前記グラフィックス処理パイプラインの頂点シェーダステージで実行するための頂点シェーダプログラムに基づいて生成された変換シェーダプログラムを呼び出すことと、
前記変換シェーダプログラムを実行して、前記入力プリミティブの位置データを変換して、変換後の位置データを生成することと、
前記カルシェーダプログラムの実行に戻り、前記変換後の位置データに基づいて前記１つ以上の入力プリミティブをカリングして、１つ以上のカリングされたプリミティブを生成することと、
前記１つ以上のカリングされたプリミティブを、処理のために前記グラフィックス処理パイプラインに送信することと、を含む、
方法。
【請求項２０】
第１フェッチシェーダプログラムを実行して、前記入力プリミティブの頂点データをフェッチし、フェッチされた頂点データを、前記変換シェーダプログラムによって使用されるためにレジスタに配置することをさらに含む、
請求項１９の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の相互参照）
本願は、２０１６年７月２７日に出願された米国特許出願第１５／２２１，４３１号の利益を主張しており、その内容は、本明細書に完全に記載されているかのように参照により本明細書に組み込まれている。
【０００２】
開示された実施形態は、概して、グラフィックス処理パイプラインに関し、より具体的には、自動的にコンパイルされたコンピュートシェーダを用いるプリミティブカリングに関する。
【背景技術】
【０００３】
三次元グラフィックス処理パイプラインは、ホスト（コンピューティングシステムの中央処理装置等）からコマンドを受信し、このコマンドを処理して、ディスプレイ装置に表示するためのピクセルを生成する。コマンドは、描かれる幾何学形状等のプリミティブ要素（プリミティブ）を指定することができる。グラフィックス処理パイプラインは、これらのプリミティブ要素を処理して（例えば、頂点シェーダを介して）、変換されたプリミティブ要素を生成し、次に、変換されたプリミティブ要素を処理して（例えば、ピクセルシェーダを介して）、スクリーンに出力するためのピクセルを生成する。グラフィックス処理パイプラインにおける様々なステージにおいて、処理が望まれていない要素（例えば、当該要素が、結果として生じる画像に対して影響を及ぼさないため）を除去するために、カリング処理が行われる場合がある。一例では、ピクセルシェーダによって行われる必要のある作業量を減らすために、プリミティブは、ピクセルシェーダに到達する前にカリングされる。カリング処理を効率的に実行することは、グラフィックス処理パイプラインの動作にとって重要である。
【０００４】
添付の図面と併せて一例として提示される以下の説明から、より詳細な理解が得られるであろう。
【図面の簡単な説明】
【０００５】
【図１】１つ以上の開示された実施形態を実施することができる例示的なデバイスのブロック図である。
【図２】さらなる詳細を示す図１のデバイスのブロック図である。
【図３】図２に示すグラフィックス処理パイプラインのさらなる詳細を示すブロック図である。
【図４】グラフィックスパイプライン前のカリングのために自動生成されたコンピュートシェーダを示すブロック図である。
【図５】グラフィックス処理パイプラインによって処理するためのプリミティブをカリングするために、シェーダプログラムを自動生成する方法のフロー図である。
【図６】グラフィックス処理パイプラインによって処理するためのプリミティブをカリングするために、自動生成されたシェーダプログラムを実行する方法のフロー図である。
【発明を実施するための形態】
【０００６】
本開示は、処理のためにグラフィックス処理パイプラインに提供されるプリミティブをカリングする技術に関する。この技術は、アクセラレーテッド処理デバイス（例えば、グラフィックスカード又は統合グラフィックス回路）によって実行されるシェーダプログラムの自動生成を含む。シェーダプログラムは、アクセラレーテッド処理デバイスによって実行されると、グラフィックス処理パイプラインによって処理されるプリミティブをカリングする。
【０００７】
ホストＣＰＵによって実行されているドライバのジャストインタイムコンパイラ（just-in-time compiler）コンポーネント等のソフトウェアモジュールは、グラフィックス処理パイプラインの頂点シェーダステージで使用するために提供された頂点シェーダプログラムに基づいて、シェーダプログラムを自動生成する。一般に知られているように、グラフィックス処理パイプラインの頂点シェーダステージは、頂点座標を変換し、必要に応じて頂点の他の属性を変更又は生成するための頂点シェーダプログラムの実行を含むことができる。頂点シェーダプログラムは、ホストＣＰＵから受信したプリミティブを処理するために、グラフィックス処理パイプラインへの送信及びグラフィックス処理パイプラインによる実行のためにアプリケーションプログラムによく埋め込まれる。自動生成されたシェーダプログラムは、グラフィックス処理パイプラインへの入力として提供された頂点の位置を変換して、変換された入力頂点を生成する頂点シェーダプログラムからの命令を含む。また、シェーダプログラムは、変換された入力頂点に基づいてプリミティブをカリングするための命令を含む。しかしながら、シェーダプログラムは、入力頂点の位置以外の属性を変換又は生成するための命令を含まない。これは、かかる命令の出力がカリング命令によって使用されないからである。
【０００８】
ソフトウェアモジュールは、自動生成シェーダプログラムを生成した後に、自動生成シェーダプログラムを、実行するためにグラフィックス処理パイプラインに送信する。このようなシェーダプログラムは、グラフィックス処理パイプラインによる処理のためにホストＣＰＵから受信したプリミティブを処理し、これにより、グラフィックスパイプラインに対する一種の「フロントエンドフィルタ」として機能する。自動生成シェーダプログラムは、プリミティブをカリングした後に、カリングされたプリミティブをグラフィックス処理パイプラインの残りの部分に出力する。したがって、グラフィックス処理パイプラインは、シェーダプログラムによってカリングされたプリミティブの処理を回避して、グラフィックス処理パイプラインによって実行される作業量を低減し、グラフィックス処理パイプラインの性能を向上させる。
【０００９】
図１は、本開示の１つ以上の態様が実施される例示的なデバイス１００のブロック図である。デバイス１００には、例えば、コンピュータ、ゲーム機、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話又はタブレットコンピュータ等が含まれる。デバイス１００は、プロセッサ１０２と、メモリ１０４と、ストレージデバイス１０６と、１つ以上入力デバイス１０８と、１つ以上の出力デバイス１１０と、を含む。また、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４をオプションとして含む。デバイス１００は、図１に示されていない追加のコンポーネントを含み得ることが理解されるであろう。
【００１０】
プロセッサ１０２は、中央処理装置（ＣＰＵ）、グラフィックス処理装置（ＧＰＵ）、同じダイ上に配置されたＣＰＵ及びＧＰＵ、又は、１つ以上のプロセッサコアを含み、各プロセッサコアは、ＣＰＵ又はＧＰＵであってもよい。メモリ１０４は、プロセッサ１０２と同じダイ上に配置されてもよいし、プロセッサ１０２とは別に配置されてもよい。メモリ１０４は、揮発性又は不揮発性メモリ（例えば、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックＲＡＭ、キャッシュ等）を含む。
【００１１】
ストレージデバイス１０６は、固定又は取り外し可能なストレージ（例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク若しくはフラッシュドライブ等）を含む。入力デバイス１０８は、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、バイオメトリックスキャナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／若しくは受信用の無線ローカルエリアネットワークカード）を含む。出力デバイス１１０は、ディスプレイ、スピーカ、プリンタ、触覚フィードバックデバイス、１つ以上のライト、アンテナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／若しくは受信用の無線ローカルエリアネットワークカード）を含む。
【００１２】
入力ドライバ１１２は、プロセッサ１０２及び入力デバイス１０８と通信し、プロセッサ１０２が入力デバイス１０８から入力を受信するのを可能にする。出力ドライバ１１４は、プロセッサ１０２及び出力デバイス１１０と通信し、プロセッサ１０２が出力デバイス１１０に出力を送信するのを可能にする。入力ドライバ１１２及び出力ドライバ１１４は、オプションのコンポーネントであり、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４が存在しない場合、同じように動作することに留意されたい。出力ドライバ１１４は、ディスプレイデバイス１１８に接続されたアクセラレーテッド処理デバイス（ＡＰＤ）１１６を含む。ＡＰＤは、プロセッサ１０２から計算コマンド（compute commands）及びグラフィックスレンダリングコマンドを受信し、計算コマンド及びグラフィックスレンダリングコマンドを処理して、表示のためにピクセル出力をディスプレイデバイス１１８に提供するように構成されている。
【００１３】
ＡＰＤ１１６は、単一命令複数データ(ＳＩＭＤ)パラダイムに従って計算を実行するように構成された１つ以上の並行処理ユニットを含む。しかしながら、ＡＰＤ１１６によって実行されるものとして説明した機能は、ＳＩＭＤパラダイムに従ってデータを処理しない処理デバイスによって実行されてもよい。
【００１４】
図２は、ＡＰＤ１１６でのタスク処理の実行に関連するさらなる詳細を示すデバイス１００のブロック図である。プロセッサ１０２は、プロセッサ１０２による実行のための１つ以上の制御論理モジュールをシステムメモリ１０４内に保持している。制御論理モジュールは、オペレーティングシステム１２０と、ドライバ１２２と、アプリケーション１２６と、を含む。制御論議モジュールは、プロセッサ１０２及びＡＰＤ１１６の様々な態様の動作を制御する。例えば、オペレーティングシステム１２０は、ハードウェアと直接通信し、プロセッサ１０２上で実行中の他のソフトウェア用のハードウェアへのインタフェースを提供する。ドライバ１２２は、例えば、ＡＰＤ１１６の様々な機能にアクセスするためにプロセッサ１０２上で実行中のソフトウェア（例えば、アプリケーション１２６）へのアプリケーションプログラミングインタフェース（ＡＰＩ）を提供することによって、ＡＰＤ１１６の動作を制御する。また、ドライバ１２２は、ＡＰＤ１１６の処理コンポーネント（例えば、以下でさらに詳細に説明するＳＩＭＤユニット１３８等）による実行のためにシェーダプログラムをコンパイルするジャストインタイムコンパイラを含む。
【００１５】
ＡＰＤ１１６は、例えばグラフィックス処理及び非グラフィックス処理等のように並行処理に適し得る選択された機能のためのコマンド及びプログラムを実行する。ＡＰＤ１１６は、例えばピクセル演算、幾何学的計算等のグラフィックスパイプライン処理を実行し、プロセッサ１０２から受信したコマンドに基づいて画像をディスプレイデバイス１１８にレンダリングするために使用することができる。また、ＡＰＤ１１６は、プロセッサ１０２から受信したコマンドに基づいて、グラフィックス処理に直接関連しない計算処理動作（例えば、ビデオ、物理的シミュレーション、計算流体力学若しくは他のタスクに関連する動作等）、又は、グラフィックス処理パイプラインの「通常の」情報フローの一部ではない計算処理動作を実行する。
【００１６】
ＡＰＤ１１６は、ＳＩＭＤパラダイムに従って、プロセッサ１０２の要求に応じて並列に動作を実行するように構成された１つ以上のＳＩＭＤユニット１３８を有する計算ユニット１３２（本明細書ではまとめて「プログラマブル処理ユニット２０２」と呼ばれる）を含む。ＳＩＭＤパラダイムは、複数の処理要素が単一のプログラム制御フローユニット及びプログラムカウンタを共有することによって同一のプログラムを実行するが、異なるデータを用いて当該プログラムを実行することができるというものである。一例では、各ＳＩＭＤユニット１３８は、１６個のレーンを含んでおり、各レーンは、ＳＩＭＤユニット１３８内の他のレーンと同時に同じ命令を実行するが、異なるデータを用いて当該命令を実行することができる。全てのレーンが所定の命令を実行するのに必要とされない場合、レーンを予測によってスイッチオフにすることができる。予測を利用して、分岐した制御フローによってプログラムを実行することもできる。より具体的には、制御フローが個々のレーンによって実行された計算に基づく条件分岐又は他の命令を有するプログラムの場合、現在実行されていない制御フローパスに対応するレーンの予測、及び、異なる制御フローパスの連続実行は、任意の制御フローに追従することを可能にする。
【００１７】
計算ユニット１３２における実行の基本単位は、ワークアイテムである。各ワークアイテムは、特定のレーンにおいて並行して実行されるプログラムの単一のインスタンシエイション（instantiation）を表している。ワークアイテムは、単一のＳＩＭＤユニット１３８における「ウェーブフロント（wavefront）」として同時に実行することができる。複数のウェーブフロントが１つの「ワークグループ」に含まれてもよく、このワークグループは、同じプログラムを実行するように指定されたワークアイテムの集合を含む。ワークグループを構成するウェーブフロントの各々を実行することによって、当該ワークグループを実行することができる。ウェーブフロントは、単一のＳＩＭＤユニット１３８において順次実行されてもよいし、異なるＳＩＭＤユニット１３８において部分的に又は完全に並列に実行されてもよい。ウェーブフロントは、単一のＳＩＭＤユニット１３８において同時に実行することができるワークアイテムの最大の集合と考えることができる。したがって、プロセッサ１０２から受信したコマンドが、特定のプログラムを単一のＳＩＭＤユニット１３８において同時に実行することができない程度に並列化することを示す場合、このプログラムは、２つ以上のＳＩＭＤユニット１３８において並行化されるウェーブフロント、又は、同じＳＩＭＤユニット１３８においてシリアル化される（若しくは、必要に応じて並列化及びシリアル化される）ウェーブフロントに分けられる。スケジューラ１３６は、異なる計算ユニット１３２及びＳＩＭＤユニット１３８上で様々なウェーブフロントをスケジュールリングすることに関する動作を実行するように構成されている。
【００１８】
計算ユニット１３２によって提供される並列処理は、例えばピクセル値計算、頂点変換及び他のグラフィックス処理等のグラフィックス関連処理に適している。プロセッサ１０２からグラフィックス処理コマンドを受信するグラフィックス処理パイプライン１３４は、並列に実行するために計算タスクを計算ユニット１３２に提供する。
【００１９】
また、計算ユニット１３２は、グラフィックスに関連しない計算タスク、又は、グラフィックス処理パイプライン１３４の「通常の」動作の一部として実行されない計算タスク（例えば、グラフィックス処理パイプライン１３４の動作のために実行される処理を補足するために実行されるカスタム動作）を実行するために使用される。プロセッサ１０２上で実行中のアプリケーション１２６又は他のソフトウェアは、かかる計算タスクを定義するプログラム（「コンピュートシェーダプログラム」とよく呼ばれる）を、実行のためにＡＰＤ１１６に送信する。
【００２０】
図３は、図２に示すグラフィックス処理パイプライン１３４のさらなる詳細を示すブロック図である。グラフィックス処理パイプライン１３４は、各々が特定の機能を実行するステージを含む。ステージは、グラフィックス処理パイプライン１３４の機能の一部を表している。各ステージは、プログラマブル処理ユニット２０２において実行中のシェーダプログラムとして部分的若しくは完全に実装され、又は、プログラマブル処理ユニット２０２の外部の固定機能の非プログラマブルハードウェアとして部分的若しくは完全に実装される。
【００２１】
入力アセンブラステージ３０２は、ユーザ充填バッファ（例えば、アプリケーション１２６等のようにプロセッサ１０２によって実行されたソフトウェアの要求で充填されたバッファ）からプリミティブデータを読み出し、このデータをパイプラインの残りの部分で使用するためにプリミティブにアセンブルする。入力アセンブラステージ３０２は、ユーザ充填バッファに含まれるプリミティブデータに基づいて、異なるタイプのプリミティブを生成することができる。入力アセンブラステージ３０２は、パイプラインの残りの部分によって使用されるように、アセンブルされたプリミティブをフォーマット化する。
【００２２】
頂点シェーダステージ３０４は、入力アセンブラステージ３０２によってアセンブルされたプリミティブの頂点を処理する。頂点シェーダステージ３０４は、例えば、変換、スキニング、モーフィング及び頂点毎のライティング等のように、様々な頂点毎の処理を実行する。変換処理は、頂点の座標を変換するための様々な処理を含むことができる。このような処理には、モデリング変換、ビューイング変換、投影変換、透視除算（perspective division）及びビューポート変換等のうち１つ以上が含まれてもよい。本明細書では、このような変換は、変換が実行される頂点の座標又は「位置」を変更するものと想定される。座標以外の属性を変更する頂点シェーダステージ３０４の他の処理は、位置以外の属性を変更するものと想定される。
【００２３】
頂点シェーダステージ３０４は、１つ以上の計算ユニット１３２において実行される頂点シェーダプログラムとして部分的又は完全に実装される。頂点シェーダプログラムは、コンピュータプログラマによって事前に書き込まれたプログラムとして、プロセッサ１０２によって提供される。ドライバ１２２は、かかるコンピュータプログラムをコンパイルして、計算ユニット１３２での実行に適したフォーマットを有する頂点シェーダプログラムを生成する。
【００２４】
ハルシェーダステージ３０６、テッセレータステージ３０８及びドメインシェーダステージ３１０は協働して、プリミティブを細分することによって単純なプリミティブをより複雑なプリミティブに変換するテッセレーションを実施する。ハルシェーダステージ３０６は、入力されたプリミティブに基づいて、テッセレーションのためのパッチを生成する。テッセレータステージ３０８は、パッチのためのサンプルのセットを生成する。ドメインシェーダステージ３１０は、パッチのためのサンプルに対応する頂点に関する頂点位置を計算する。ハルシェーダステージ３０６及びドメインシェーダステージ３１０は、プログラマブル処理ユニット２０２において実行されるシェーダプログラムとして実装することができる。
【００２５】
ジオメトリシェーダステージ３１２は、プリミティブ毎に頂点処理を実行する。様々な異なるタイプの処理（例えば、ポイントスプリント拡張、動的パーティクルシステム処理、ｆｕｒ−ｆｉｎの生成、シャドウボリュームの生成、単一パスでのキューブマップへのレンダリング、プリミティブ単位のマテリアルスワッピング、及び、プリミティブ単位のマテリアルセットアップが含まれる）をジオメトリシェーダステージ３１２によって実行することができる。ジオメトリシェーダステージ３１２に関する処理は、プログラマブル処理ユニット２０２において実行されるシェーダプログラムによって実行されてもよい。
【００２６】
ラスタライザステージ３１４は、上流で生成された単純なプリミティブを受け入れてラスタライズする。ラスタライズは、何れのスクリーンピクセル（又は、サブピクセルサンプル）が特定のプリミティブによってカバーされるかを決定することから構成されている。ラスタライズは、固定機能のハードウェアによって実行される。
【００２７】
ピクセルシェーダステージ３１６は、上流で生成されたプリミティブ及びラスタライズの結果に基づいて、スクリーンピクセルに関する出力値を計算する。ピクセルシェーダステージ３１６は、テクスチャメモリからテクスチャを適用してもよい。ピクセルシェーダステージ３１６に関する処理は、プログラマブル処理ユニット２０２上で実行されるシェーダプログラムによって実行される。
【００２８】
出力マージャステージ３１８は、ピクセルシェーダステージ３１６からの出力を受信し、この出力を結合して、ｚテスト及びアルファブレンディング等の処理を行うことによって、スクリーンピクセルに関する最終カラーを決定する。
【００２９】
前処理コンピュートシェーダステージ３３０は、グラフィックス処理パイプライン１３４に接続されている。前処理コンピュートシェーダステージ３３０は、グラフィックス処理パイプライン１３４によって処理される前に、ＡＰＤ１１６の外部から（例えば、プロセッサ１０２から）受信したプリミティブに対して計算作業が行われるのを可能にする。前処理コンピュートシェーダステージ３３０は、例えば、プロセッサ１０２から受信した前処理コンピュートシェーダプログラムを実行する。このような前処理コンピュートシェーダプログラムは、例えばプリミティブや頂点等の指定された入力を受信し、例えば変更されたプリミティブや頂点等の指定された出力を生成する。
【００３０】
前処理コンピュートシェーダステージ３３０の１つの用途は、カリングを実行することである。カリングは、最終的なレンダリング後のシーンに大きな影響を与えない要素を削除する除去することを含む。視錐台（すなわち、レンダリングが行われているビューカメラによって見ることができる空間の３Ｄ部分）以外の要素は、錐台カリングと呼ばれるプロセスにおいて除去される。カメラには見えない要素は、かかる要素の「バックフェース」がカメラに向いているので、「バックフェースカリング」と呼ばれるプロセスにおいて除去される。他の要素によってブロックされ又は「隠蔽」されることにより、レンダリング後のシーンでは見えない要素は、オクルージョンカリングと呼ばれるプロセスにおいて除去される。小さ過ぎてレンダリング後のシーンでは見えない要素（例えば、ピクセルサンプルを「カバー」しない程小さいプリミティブ）は、スモールプリミティブカリングと呼ばれるプロセスにおいて除去される。他のタイプのカリング処理も同様に当該技術分野において知られている。前処理コンピュートシェーダステージ３３０は、処理後のデータがコンピュートシェーダステージ３３０によって処理されると直ぐにグラフィックス処理パイプライン１３４がデータ（例えば、カリング後のプリミティブ）を処理することができるという点において、グラフィックス処理パイプライン１３４の残りの部分に関して「非同期」方式で動作する。
【００３１】
このようなカリング処理は、グラフィックス処理パイプライン１３４のステージによって実行される。１つの技術では、カリングは、頂点シェーダステージ３０４の後に行われる。これは、頂点シェーダステージ３０４の間に得られた変換後の頂点位置が、レンダリング後のシーンにおいて要素が見えるかどうかを判断するのに必要であるためである。しかしながら、このような技術は、グラフィックス処理パイプライン１３４の処理効率を低下させる可能性がある。これは、最終シーンにおいてレンダリングされないプリミティブに関するデータが、グラフィックス処理パイプライン１３４の特定のステージによって処理されるためである。
【００３２】
別の技術では、前処理コンピュートシェーダステージ３３０は、そうでなければグラフィックス処理パイプライン１３４によって実行されるであろう少なくともいくつかのカリング処理を実行する。このような技術の利点は、グラフィックス処理パイプライン１３４を通過し、これにより処理されるプリミティブの数が減少することである。しかしながら、この技術の１つの難点は、カリング処理を実行するのに必要な変換後の頂点の位置を決定するために頂点の変換を計算するための作業が、頂点シェーダステージ３０４まで実行されないことである。
【００３３】
この難点を軽減するために、ドライバ１２２は、プロセッサ１０２によって実行されている他のソフトウェアから受信したシェーダプログラムから、コンパイルされたシェーダプログラム（例えば、頂点シェーダプログラム等）を生成し、他のソフトウェアから受信した頂点シェーダプログラムに基づいて、カリング用のシェーダプログラムを自動生成するように構成されている。一例では、アプリケーション１２６は、グラフィックス処理パイプライン１３４の頂点シェーダステージ３０４が受信した頂点の位置を変換するための命令をとりわけ含む頂点シェーダプログラムを提供する。このような頂点シェーダプログラムは、例えば、頂点ライティング、色、テクスチャ座標、又は、レンダリングスペース内の頂点の位置を定義しない頂点の任意の他の態様等のように、頂点の位置以外の属性を変更又は生成する処理を実行するための命令を定義する。
【００３４】
図４は、グラフィックスパイプライン前のカリングのために自動生成されたコンピュートシェーダを示すブロック図である。ドライバ１２２は、頂点シェーダステージ３０４において実行するためにドライバ１２２に提供される頂点シェーダプログラム４０２に基づいて、カルシェーダプログラム４１０と、変換シェーダプログラム４３０と、オプションでフェッチシェーダプログラム４２０と、を生成する。
【００３５】
カルシェーダプログラム４１０と、オプションのフェッチシェーダプログラム４２０と、変換シェーダプログラム４３０とは、提供された頂点シェーダプログラム４０２の位置変換を実行し、位置変換によって変換された頂点に基づいてプリミティブをカリングするための命令を含む。カルシェーダプログラム４１０は、「メイン」シェーダプログラムとして機能し、フェッチシェーダプログラム４２０又は変換シェーダプログラム４３０を呼び出して、本明細書で示すような付随する機能を実行する。図４のシェーダプログラムは、説明的な用語で機能を説明する擬似コード「命令」で示されている。異なるシェーダプログラムの実装形態は、本明細書で説明する機能を実装するために、機械語命令の様々な組み合わせを使用することができることを理解されたい。
【００３６】
カルシェーダプログラム４１０は、頂点インデックス入力計算命令４１２を含む。頂点インデックス入力計算命令４１２は、フェッチシェーダプログラム４２０及び変換シェーダプログラム４３０によって処理される頂点の数と、ワークアイテム識別子と、ワークグループ識別子と、に基づいて、カルシェーダプログラム４１０によって使用される入力であって、フェッチシェーダプログラム４２０（使用される場合）又は変換シェーダプログラム４３０に渡される入力を計算する。より具体的には、カルシェーダプログラム４１０の複数のインスタンスは、図２に示す超並列アーキテクチャにおいて並行して実行することができるので、各インスタンスは、他のインスタンスの入力リソースと重複しない特定の入力リソース（レジスタ、メモリスペース等）のセットに割り当てられる。ドライバ１２２は、特定のシェーダプログラムによって使用されるリソースを識別するために、頂点インデックス入力計算命令４１２を追加する。頂点インデックス入力計算命令４１２は、フェッチシェーダプログラム４２０（又は、フェッチシェーダプログラム４２０が使用されない場合には変換シェーダプログラム４３０）によって処理される頂点に関する頂点インデックスが含まれる特定の入力リソースのセットを計算的に識別する。このようなリソースの識別は、ワークアイテム識別子及びワークグループ識別子等のように、シェーダプログラムのインスタンスを具体的に識別する値に基づいている。
【００３７】
頂点インデックス入力計算命令４１２の後、カルシェーダプログラム４１０は、フェッチシェーダプログラムが使用される場合にフェッチシェーダプログラム４２０を呼び出す命令、或いは、独立したフェッチシェーダプログラム４２０が存在しない場合に変換シェーダプログラム４３０を直接呼び出す命令を含む。フェッチシェーダは、変換シェーダに入力されるデータを記憶するバッファが動的に再構成され得ることをドライバ１２２が「知っている」場合に有用である。別個のフェッチシェーダを有することは、ドライバ１２２が、このようなバッファの再構成に応じてフェッチシェーダのみを変更し、変換シェーダを変更することを可能にしない。フェッチシェーダプログラム４２０（存在する場合）及び変換シェーダプログラム４３０は、頂点インデックス入力を受信し、頂点インデックスに基づいて頂点データをフェッチし、上述したように対応する頂点シェーダプログラムから導出される位置変換に従って頂点データを変換する。
【００３８】
変換シェーダプログラム４３０及びオプションのフェッチシェーダプログラム４２０の実行後、実行は、フェッチシェーダ呼び出し命令４１４の後の命令に戻る。これらの後続の命令は、プリミティブカリング実行命令４１６である。プリミティブカリング命令４１６は、デバイス１００のメモリ１０４及び／又はストレージ１０６に記憶された事前に定義されたプリミティブカリング命令のセットからドライバ１２２によって挿入されてもよいし、頂点シェーダプログラム４０２を指定したアプリケーション１２６によって指定されてもよい。プリミティブカリング命令４１６は、１つ以上のカリング技術（例えば、本明細書で説明した技術（例えば、バックフェースカリング、錐台カリング、オクルージョンカリング、スモールプリミティブカリング等））を実施する。プリミティブカリングを実行するための命令は周知であり、本明細書では詳細に説明しない。
【００３９】
プリミティブカリング命令４１６の後、カルシェーダプログラム４１０は、リングバッファ書き込み命令４１８を実行する。本明細書で言及するリングバッファは、グラフィックス処理パイプライン１３４による計算のための頂点データ及び頂点インデックスを含むバッファである。図４に示す自動生成シェーダプログラムが存在しない場合、このようなリングバッファは、プロセッサ１０２（又は、他の何らかのエンティティ）によってレンダリングされるように要求された全てのプリミティブを含むことになる。したがって、このようなシナリオでは、グラフィックス処理パイプライン１３４は、例えばかかるプリミティブが最終シーンに寄与しないとしても、当該プリミティブを少なくとも部分的に処理することになる。カリングされた出力（例えば、カリングプロセスをくぐり抜けた頂点データ及び頂点インデックス）のみをリングバッファに書き込むことによって、グラフィックス処理パイプライン１３４は、カルシェーダプログラム４１０によってカリングされると識別されたプリミティブ及び付随する機能の処理を回避する。
【００４０】
次に、フェッチシェーダプログラム４２０及び変換シェーダプログラム４３０についてにより詳細に説明する。フェッチシェーダプログラム４２０を呼び出すと、フェッチシェーダプログラム４２０が実行される。フェッチシェーダプログラム４２０の目的は、頂点インデックスに基づいて頂点データをフェッチし、変換シェーダプログラム４３０による使用のために頂点データをレジスタに入れることである。フェッチシェーダプログラム４２０は、頂点インデックス入力を予想する場所（例えば、どのレジスタ内か）をハードウェアに指示する頂点インデックス入力予想ラベル４２２と、頂点インデックス入力に基づいて頂点データをレジスタにフェッチする、頂点データをレジスタにフェッチする命令４２４と、変換シェーダを呼び出すための命令４２６と、を含む。頂点インデックス入力予想ラベル４２２は、何れのリソースがフェッチシェーダプログラム４２０への入力を記憶するかを単に記述する。このようなリソースは、例えばレジスタを含み、カルシェーダプログラム４１０の頂点インデックス入力計算命令４１２において計算されたものと同じレジスタであってもよい。頂点データをレジスタにフェッチする命令４２４は、頂点インデックス入力予想ラベル４２２によって識別されたレジスタにおいて示される頂点インデックスに基づいて頂点バッファから頂点データを取り出し、取り出した頂点データを、変換シェーダプログラム４３０による処理のためにレジスタに入れる。頂点インデックス入力予想ラベル４２２は、（例えば、命令４２４のオペランドに対する表記として）頂点データをレジスタにフェッチする命令４２４に含まれ得ることに留意されたい。頂点インデックスは、頂点データがフェッチシェーダによって実際にフェッチされる前に頂点データが重複して記憶されるのを避けるために、頂点データを単一のコンパクトなデータ構造（インデックス）によって参照可能にするメカニズムである。フェッチシェーダプログラム４２０は、頂点データをレジスタにフェッチする命令４２４の後に変換シェーダプログラム４３０を呼び出す変換シェーダ呼び出し命令４２６を含む。
【００４１】
変換シェーダプログラム４３０は、頂点データ入力４３２を予想する場所を示すラベルと、変換処理命令４３４と、カルシェーダプログラム４１０の残りの部分によって使用される変換位置をレジスタに入れるための命令と、実行をカルシェーダに戻すための命令４３８と、を含む。フェッチシェーダが使用されない場合、変換シェーダプログラム４３０は、フェッチシェーダプログラム４２０からの頂点インデックス入力予想ラベル４２２と、頂点データをレジスタにフェッチする命令４２４と、を含むことになる。頂点データ入力予想ラベル４３２と、変換処理命令４３４と、変換後の位置をレジスタに入れる命令４３６とは、ドライバ１２２に提供される頂点シェーダプログラム４０２から導出される。
【００４２】
頂点データ入力予想ラベル４３２は、変換シェーダプログラム４３０への入力が、何れの場所（例えば、何れのレジスタ内、メモリ位置等）にあると予想され、変換処理４３４に（例えば、１つ以上の命令に対するオペランド表記として）含まれるかを示す。変換処理４３４は、実行されると、変換処理４３４が導出された頂点シェーダプログラムに従って、変換シェーダプログラム４３０に入力された頂点データの位置を変換する処理である。変換後の位置をレジスタに入れる命令４３６は、カルシェーダプログラム４１０による使用のために、変換処理４３４の結果を特定のレジスタに入れる。カルシェーダに戻す命令４３８は、フェッチシェーダ呼び出し命令４１４（又は、フェッチシェーダプログラムが使用されない場合には変換シェーダ呼び出し命令）の直後の命令において、実行をカルシェーダプログラム４１０に戻す。
【００４３】
ドライバ１２２は、頂点の位置以外の属性のみに寄与する頂点シェーダプログラム４０２の命令を除去することによって、頂点シェーダプログラム４０２に基づいて、変換処理４３４等の変換シェーダプログラム４３０の命令を生成する。ドライバ１２２は、かかる命令を除去するために、デッドコード除去等の技術を使用する。デッドコード除去は、有用な結果をもたらさない命令が除去される技術である。デッドコード除去を実行するための多くの技術が知られており、ドライバ１２２は、本明細書で説明するように頂点シェーダプログラム４０２を分析する際に、かかる技術を使用することができる。
【００４４】
デッドコード除去技術を適用して、変換後の頂点位置に対応しない上述した命令を除去するために、ドライバ１２２は、先ず、頂点シェーダプログラム４０２に対して出力される未変換の頂点位置を定義する全ての命令を探し出し、かかる命令をデッドコードとしてマークする。このような出力命令は、一般的に、既知のフォーマットで頂点シェーダプログラムに含まれている。よって、ドライバ１２２は、このような命令を識別することが可能である。
【００４５】
ドライバ１２２は、このような命令をデッドコードとしてマークした後に、デッドコード除去技術を適用する。上記の出力命令はデッドとしてマークされているので、ドライバ１２２は、上記の出力命令によって出力された結果にのみ寄与する如何なる命令もデッドコードであることを知ることになる。ドライバ１２２は、頂点シェーダプログラム４０２を逆方向に追跡して、デッドコードとして既にマークされている命令にのみ寄与する全ての命令を識別し、新たに見つけられた命令をデッドコードとしてマークする。ドライバ１２２は、デッドコードとしてマークされる全ての命令を見つけた後に、マークが付された命令を除去し、残りの命令を変換シェーダプログラム４３０に含める。残りの命令は、変換処理４３４を構成することになる。ドライバ１２２は、シェーダプログラムが存在する場合、フェッチシェーダプログラム４２０を生成するために同様のデッドコード除去技術を適用して、頂点位置のフェッチに寄与しない命令を除去する。
【００４６】
本明細書に記載されたバッファは何れも、ＡＰＤ１１６内又はシステムメモリ１０４内に配置され及び／又は割り当てられたメモリを含む、任意の適切なメモリ位置に配置される。このようなバッファには、例えば、リングバッファ書き込み命令４１８によって書き込まれるリングバッファ、頂点データ及び頂点インデックスデータが記憶されるリングバッファ、及び、本明細書に記載された他のバッファが含まれる。
【００４７】
頂点シェーダステージ３０４において実行される実際の頂点シェーダプログラム４０２は、削除も置き換えられもせず、そのステージにおいて依然として実行されることに留意されたい。いくつかの代替形態では、頂点シェーダプログラム４０２は、自動生成シェーダプログラムの出力から入力を受信するように、及び／又は、自動生成シェーダプログラムによって生成された変換後の頂点位置を使用する等の本明細書に記載の他の変更に沿って変更される。また、上述した呼び出し命令（例えば、フェッチシェーダ呼び出し命令４１４、変換シェーダ呼び出し命令４２６及びカルシェーダに戻る命令４３８）は、関数呼び出し等に関連するオーバーヘッドを回避するために、プログラムカウンタを直接設定する命令を用いて簡単に実施することができることに留意されたい。
【００４８】
１つの手法において、ドライバ１２２は、効率のために、自動生成シェーダプログラムを特定の順序で生成する。より具体的には、ドライバ１２２は、先ず、変換シェーダプログラム４３０を生成し、次に、存在する場合にはフェッチシェーダプログラム４２０を生成し、次いで、カルシェーダプログラム４１０を生成する。ドライバ１２２が最初に変換シェーダプログラム４３０を生成する理由は、変換シェーダプログラム４３０の実行に何れのリソース（例えば、レジスタ、メモリ等）が必要であるかを決定することが、フェッチシェーダプログラム４２０及びカルシェーダプログラム４１０の実行に何れのリソースが必要とされるかの決定も通知するためである。
【００４９】
例えば、変換シェーダプログラム４３０の頂点データ入力予想ラベル４３２は、頂点データが記憶されている特定のレジスタを指定する。ドライバ１２２は、このラベルを含む変換シェーダプログラム４３０を生成した後に、頂点データをレジスタにフェッチする命令４２４を含むフェッチシェーダプログラムを生成する。ドライバ１２２は、頂点データが変換シェーダプログラム４３０によって使用されることを「知っており」、当該データが入れられると変換シェーダプログラム４３０が予想するレジスタも「知っている」ので、頂点データ入力予想ラベル４３２において指定されるレジスタに頂点データが書き込まれることを指定するために、頂点データをレジスタにフェッチする命令４２４を書き込むことができる。このようにして、頂点データをレジスタにフェッチする命令４２４を書き込むことによって、フェッチシェーダプログラムの出力レジスタと、変換シェーダプログラムの入力レジスタとの間で必要となる可能性がある如何なるタイプのコピーも回避される。同様に、ドライバ１２２は、カルシェーダプログラム４１０の頂点インデックス入力計算命令４１２と同じレジスタを指定するために（すなわち、これらのレジスタ内のデータは、カルシェーダプログラム４１０が頂点インデックスを記憶する時間と、フェッチシェーダプログラム４２０が頂点インデックス入力を読み出すのに要する時間との間で変化しないことを「知っている」）、フェッチシェーダプログラムの頂点インデックス入力予想ラベル４２２を書き込む。
【００５０】
別の最適化において、不要になったレジスタ又は他のリソースは、自動生成シェーダプログラムの総リソースフットプリントを減らすために、他の処理で使用するために「再生利用（reclaimed）」される。例えば、頂点インデックス入力を記憶するレジスタは、頂点データがフェッチされた後では必要ないので、頂点データは、頂点インデックス入力が記憶されていたレジスタのうち少なくとも何れかのレジスタに入れられる。
【００５１】
さらに別の最適化では、ドライバ１２２は、短いデータポインタをサポートするためにシェーダプログラムを生成する。より具体的には、シェーダプログラムは、データポインタを使用して、このようなシェーダプログラムによって使用されるデータを記憶するメモリの一部を参照する。このようなデータポインタは、シェーダプログラムによって使用されるレジスタに記憶される。ドライバ１２２は、データポインタに必要なレジスタスペースの量を減らすために、レジスタがフルアドレスではなくデータポインタのアドレスの最下位ビットのみを記憶するようにサイズ決めされるように、シェーダプログラムを生成する。次に、ドライバ１２２は、データポインタによって参照されるデータがアクセスされる毎に、失われた最上位ビットを満たすようにシェーダプログラムの各命令を生成する。この最適化の目的は、シェーダプログラムの総レジスタフットプリント（例えば、必要なレジスタファイルスペースの総量）を減らし、これにより、他の可能性のある用途のためにレジスタリソースを解放することである。
【００５２】
ドライバ１２２は、図４に示すシェーダプログラムの生成に加えて、グラフィックス処理パイプライン１３４の頂点シェーダステージ３０４において実行される頂点シェーダプログラム４０２のためにフェッチシェーダプログラムを生成することもできる。このフェッチシェーダプログラムは、図４に示すフェッチシェーダプログラム４２０とは別のものである。より具体的には、ドライバ１２２は、カルシェーダプログラム４１０がリングバッファ書き込み命令４１８においてカリングされたプリミティブを出力するリングバッファからのデータをフェッチするフェッチシェーダプログラムを生成する。これにより、頂点シェーダステージ３０４は、カルシェーダプログラム４１０がカリングしていないプリミティブのみを受信して処理することが可能になる。
【００５３】
図４に関して説明したシェーダプログラムを自動生成する際、ドライバ１２２は、アプリケーション１２６（又は、他のソフトウェア）によって指定された異なる頂点シェーダプログラム毎に自動生成シェーダプログラムのセットを生成する。ドライバ１２２は、頂点シェーダステージ３０４において実行するために異なる頂点シェーダプログラムをロードする毎に、前処理コンピュートシェーダステージ３３０において実行するための自動生成シェーダプログラムの対応するセットもロードすることになる。異なる頂点シェーダプログラム毎に自動生成シェーダプログラムのセットを生成することによって、現在実行中の頂点シェーダプログラムに含まれる変換に基づくプリミティブのカリングを可能にする。
【００５４】
ドライバ１２２は、自動生成シェーダプログラムの特定のセットを生成した後、そのセットを以前に自動生成したシェーダプログラムと照合して、重複するシェーダプログラムが存在するかどうかを判別する。重複が存在する場合、ドライバ１２２は一方のコピーのみを記憶する。
【００５５】
図５は、グラフィックス処理パイプラインによって処理するためのプリミティブをカリングするために、シェーダプログラムを自動生成する方法のフロー図である。図１〜図４について示されたシステムに関して説明しているが、技術的に実行可能な順序でこの方法を実行するように構成された如何なるシステムも本発明の範囲内にあることを理解されたい。
【００５６】
図示するように、方法５００はステップ５０２において開始し、ドライバ１２２は、グラフィックス処理パイプライン１３４上で実行するための頂点シェーダプログラムを受信する。頂点シェーダプログラムは、グラフィックス処理パイプライン１３４の頂点シェーダステージ３０４の間で実行するために、システムメモリ１０４に記憶されたアプリケーション１２６に含まれる特定のアプリケーションによって指定される。
【００５７】
ステップ５０４において、ドライバ１２２は、グラフィックス処理パイプラインによる処理のために受信した入力頂点位置を変換して出力頂点位置を生成するように構成された変換シェーダプログラムを生成する。ドライバ１２２は、受信した頂点シェーダプログラムに基づいて変換シェーダプログラムを生成する。例えば、ドライバ１２２は、位置以外の属性の変換のみに関連する命令を削除する。ドライバ１２２は、変換後の頂点位置に関連しない頂点シェーダプログラムの出力をデッドコードとしてマークし、次いで、頂点シェーダプログラムの残りの部分に対してデッドコード除去を実行することによって、かかる命令を削除する。
【００５８】
ステップ５０２において、ドライバ１２２は、フェッチシェーダプログラムも生成する。フェッチシェーダプログラムの目的は、例えばプロセッサ１０２によって頂点データが配置されているバッファから（例えば、実行中のアプリケーション１２６の要求により）頂点データをフェッチし、その頂点データを、アクセラレーテッド処理デバイス１１６の処理ユニット（ＳＩＭＤユニット１３８等）にアクセス可能なレジスタに配置することである。フェッチシェーダプログラムが変換シェーダプログラムとは別のものである可能性があるのは、頂点データが配置されるバッファがメモリ内で場所を変更し、レイアウトを変更する可能性があるためである。よって、ドライバ１２２は、このようなバッファの変更に応じて、実行中（on the fly）にフェッチシェーダプログラム４２０の命令を更新することができる。
【００５９】
ステップ５０６において、ドライバ１２２は、変換シェーダプログラムを呼び出して変換後の出力頂点位置を生成し、変換後の出力頂点位置に基づいて、入力頂点位置に関連するプリミティブをカリングするように構成されたカルシェーダプログラムを生成する。カルシェーダプログラムは、最初に実行するように構成されており、変換シェーダプログラムを呼び出すように構成されている。カルシェーダは、フェッチシェーダプログラムを「介して」変換シェーダプログラムを呼び出すように構成されてもよい。より具体的には、カルシェーダプログラムは、フェッチシェーダプログラムを呼び出す。このフェッチシェーダプログラムは、頂点データを上述したレジスタにフェッチし、その後、変換シェーダプログラムを呼び出すように構成されている。このような状況では、カルシェーダプログラムは、フェッチシェーダプログラムを介して「間接的に」変換シェーダプログラムを呼び出す。
【００６０】
変換シェーダプログラムは、変換後の出力頂点位置を生成した後、カルシェーダプログラムに実行を戻すように構成されているので、カルシェーダプログラムは、変換シェーダプログラムを呼び出した後、変換後の出力頂点位置に基づいてプリミティブをカリングするように構成されている。また、カルシェーダプログラムは、グラフィックス処理パイプライン１３４がレンダリングのためにプリミティブを処理している間に、グラフィックス処理パイプライン１３４の頂点シェーダステージ３０４によって読み出されるようにカリング処理の結果を１つ以上のバッファに書き込むように構成されている。
【００６１】
図６は、グラフィックス処理パイプラインによって処理するためのプリミティブをカリングするために、自動生成シェーダプログラムを実行する方法のフロー図である。図１〜図４について示されたシステムに関して説明しているが、技術的に実行可能な順序でこの方法を実行するように構成された如何なるシステムも本発明の範囲内にあることを理解されたい。
【００６２】
図示するように、方法６００は、ステップ６０２で始まり、アクセラレーテッド処理デバイス１１６は、グラフィックス処理パイプライン１３４による処理のために１つ以上のプリミティブを受信する。１つ以上のプリミティブは、プリミティブを定義する１つ以上の頂点を含んでおり、各頂点は、プリミティブの形状及び位置を定義する位置属性と、ライティング、テクスチャ、色又は他の態様に関連するプリミティブの態様を定義する位置以外の属性と、を含む。
【００６３】
ステップ６０４において、アクセラレーテッド処理デバイス１１６は、受信したプリミティブを処理するためにカルシェーダプログラムを実行する。カルシェーダプログラムは、グラフィックス処理パイプライン１３４の頂点シェーダステージにおいて実行するための頂点シェーダプログラムに基づいて生成された変換シェーダプログラムを呼び出すように構成されている。ステップ６０６において、アクセラレーテッド処理デバイス１１６は、変換シェーダプログラムを実行し、入力プリミティブの位置データを変換して、変換後の位置データを生成する。上述したように、変換シェーダプログラムは、頂点シェーダプログラムに基づいて生成されており、位置データを変換するように構成された頂点シェーダプログラムによって指定された命令を含む。
【００６４】
ステップ６０８において、アクセラレーテッド処理デバイス１１６は、（変換シェーダプログラムによって指示されるように）実行をカルシェーダプログラムに戻し、変換シェーダプログラムによって生成された変換後の位置データに基づいて１つ以上の入力プリミティブをカリングすることによって、１つ以上のカリングされたプリミティブ（もしあれば）を生成する。上述したように、カリングのための命令は当業者によく知られており、このような命令は、バックフェースカリング、オクルージョンカリング、錐台カリング、スモールプリミティブカリング及び／又は他のカリング技術のうち１つ以上を実施する。
【００６５】
ステップ６１０において、アクセラレーテッド処理デバイス１１６は、１つ以上のカリングされたプリミティブを、処理のためにグラフィックス処理パイプライン１３４に送信する。この送信は、１つ以上のカリングされたプリミティブを、グラフィックス処理パイプライン１３４の最初のステージ（例えば、入力アセンブラステージ３０２等）によって読み出されるように指定されたバッファに書き込むことによって達成される。グラフィックス処理パイプライン１３４の頂点シェーダステージ３０４用にカスタマイズされたフェッチシェーダが存在してもよく、当該フェッチシェーダは、カルシェーダプログラムによって入力され読み出されるプリミティブを記憶するバッファではなく、カリングされたプリミティブを記憶するバッファから読み出されるように構成されてもよい。
【００６６】
上記の説明は、グラフィックス処理パイプラインの頂点シェーダステージ３０４において使用するための頂点シェーダプログラムに基づくシェーダプログラムの自動生成を企図していることに留意されたい。しかしながら、いくつかの代替形態では、ドライバ１２２は、グラフィックス処理パイプライン１３４にハードコードされた固定機能の頂点シェーダ処理に基づいて上記のシェーダプログラムを自動生成することができる。これを行うために、ドライバ１２２は、このような固定機能のシェーダの頂点位置を変換する処理のみを選択し、この処理を上述したカルシェーダプログラム、オプションのフェッチシェーダプログラム及び変換シェーダプログラムに含める。
【００６７】
本明細書で説明する技術は、レンダリング用に受信したプリミティブを、レンダリングのためにグラフィックス処理パイプラインに送信する前にカリングすることによって、グラフィックス処理パイプラインの効率を向上させる。さらに、カリング技術は、グラフィックス処理パイプラインの一部として実行される頂点シェーダプログラムに基づいて自動生成された変換シェーダプログラムを利用する。変換シェーダプログラムが頂点シェーダプログラムに基づいていることによって、プログラマによって定義され得るカスタマイズされた頂点位置変換に基づいてカリングを行うことが可能になる。さらに、カルシェーダプログラム及び変換シェーダプログラムが自動生成されるので、プログラマは、プリミティブのカリング処理を明示的に呼び出す必要がなく、このことは、アプリケーション開発プロセスを単純化し、グラフィックス処理パイプラインを利用するソフトウェアの開発に関するコストを低減し、時間を短縮する。
【００６８】
生成されたシェーダプログラムの１つの利点は、各シェーダプログラムが複数の頂点を同時に処理することができる点にある。図２に関して説明したもの等のように高度に並列なアーキテクチャ上で実行される場合、シェーダプログラムの各インスタンス（例えば、各ワークアイテム）は、複数の頂点を処理することができる。
【００６９】
グラフィックス処理パイプライン１３４の頂点シェーダステージ３０４で実行される頂点シェーダプログラムは、本明細書では変更されないものとして説明しているが、１つの代替例では、頂点シェーダステージ３０４は、頂点の変換を再計算する代わりに、コンピュートステージにおいて実行された生成されたシェーダからの変換後の頂点を使用するように変更される。頂点シェーダプログラムは、依然として位置以外の属性に関する変換を計算することになる。ドライバ１２２は、位置の変換のみに寄与する命令を除去するためにデッドコード除去を使用することができ、また、既に変換された頂点位置を単純に通過し、変換後の位置を入力として受信し、変換後の頂点位置を出力として送信するように頂点シェーダプログラムを変更することもできる。
【００７０】
本明細書の開示に基づいて多くの変形が可能であることを理解されたい。機能及び要素は、特定の組み合わせで上記に説明されているが、各機能又は要素は、他の機能や要素なしに単独で使用されてもよいし、他の機能や要素を伴って若しくは伴わずに様々な組み合わせで使用されてもよい。
【００７１】
提供された方法は、汎用コンピュータ、プロセッサ又はプロセッサコアにおいて実施されてもよい。適切なプロセッサには、例として、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、複数のマイクロプロセッサ、ＤＳＰコアに関連する１つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）回路、任意の他のタイプの集積回路（ＩＣ）、及び／又は、ステートマシンが含まれる。このようなプロセッサは、処理されたハードウェア記述言語（ＨＤＬ）命令、及び、ネットリストを含む他の中間データ（このような命令はコンピュータ可読媒体に記憶され得る）をの結果を使用して製造プロセスを構成することによって製造されてもよい。このような処理の結果は、本実施形態の態様を実施するプロセッサを製造するために半導体製造プロセスにおいて使用されるマスクワークであってもよい。
【００７２】
本明細書で提供される方法又はフローチャートは、汎用コンピュータ若しくはプロセッサによる実行のために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア、ファームウェアにおいて実施されてもよい。非一時的なコンピュータ可読記憶媒体の例には、読み出し専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク及びリムーバブルディスク等の磁気媒体、光磁気媒体、光学媒体（ＣＤ−ＲＯＭディスク等）、デジタル多用途ディスク（ＤＶＤ）等が含まれる。
【図１】
2019526128.tif 000003
【図２】
2019526128.tif 000004
【図３】
2019526128.tif 000005
【図４】
2019526128.tif 000006
【図５】
2019526128.tif 000007
【図６】
2019526128.tif 000008
【国際調査報告】
2019526128.tif 000009
2019526128.tif 000010