概して、本開示は、トランザクションごとに、グラフィックス処理パイプラインのラスタ化段階によって生成されたフラグメントのセットについて、保守的深度処理それとも後期深度処理を実施するか判断するための技法について記載する。GPUは、フラグメントが、最終的にレンダリングされるシーン中のビューから隠蔽されるかどうか判断するために、フラグメントの深度処理を実施し、どの隠蔽され得るフラグメントも、さらなる処理からは省く。このようにして、GPUは、最終的にレンダリングされるシーン中で可視的にならないフラグメントをそれ以上処理しないことによって、性能を向上することができる。
GPUは、フラグメントのセットに対して早期深度試験と後期深度試験の両方を実施することによって、ラスタライザ段階によって生成されたフラグメントのセットについて保守的深度処理を実施し得る。代替として、GPUは、フラグメントのセットに対して後期深度試験のみを実施することによって、フラグメントのセットについて後期深度処理を実施し得る。フラグメントシェーダは、可能性としては、フラグメントの深度値を修正し得るので、GPUは、フラグメントのセットの保守的深度処理と後期深度処理の両方の間に後期深度試験を実施する。
いくつかの事例では、フラグメントシェーダが重い作業負荷を有する場合、GPUは、早期深度試験により、フラグメントをフラグメントシェーダによって処理させないようにし得るためにフラグメントの保守的深度処理を実施することによって、GPUの性能を向上することができる。他の事例では、フラグメントシェーダが軽い作業負荷を有する場合、GPUは、保守的深度処理ではなくフラグメントの後期深度処理を実施し、そうすることによってフラグメントの早期深度試験を省くことによって、GPUの性能を向上することができるが、それは、フラグメントシェーダが、軽い作業負荷により、フラグメントを効率的に処理することが可能だからである。フラグメントシェーダの作業負荷は、クロック周期によって変わり得るので、GPUは、グラフィックス処理パイプラインのラスタ化段階によって生成されたフラグメント向けのトランザクションごとに、保守的深度処理それとも後期深度処理を実施するか決めればよい。
GPUは、ラスタライザによって生成されたフラグメントのセットの各トランザクション用に、そのフラグメントセットについて保守的深度処理それとも後期深度処理を実施するか判断してよく、トランザクションごとに、保守的深度処理または後期深度処理の間を切り替えてよい。いくつかの例では、トランザクションは、単一のクロック周期中に、ラスタライザによって生成されたフラグメントのセットであってよい。他の例では、トランザクションは概して、ラスタライザによって生成されたフラグメントのセットであってよい。単一のトランザクション中のフラグメントのセットは、ラスタライザがソフトウェアアプリケーションによる単一の描画コールを処理する際に生成し得るフラグメントすべてよりも少なくてよい。
GPUは、フラグメントのセットのフラグメントシェーディングを実施するフラグメントシェーダの作業負荷ならびにフラグメントのセットの深度試験を実施する深度試験ハードウェアの利用可能性に基づいて、フラグメントの所与のセットについて保守的深度処理それとも後期深度処理を実施するか判断し得る。GPUの深度テストユニットが深度試験を実施するのに利用可能であるときに保守的深度処理を実施することによって、GPUは、最終的にレンダリングされるシーン中で可視的でないフラグメントを、それらのフラグメントのフラグメントシェーディングを実施するのに先立って破棄することができ、そうすることによって、GPUがフラグメントシェーディングを実施するフラグメントの数を最小限にする。さらに、フラグメントシェーダプログラムが軽い作業負荷を有する場合、フラグメントがフラグメントシェーディングされる前にフラグメントに対して深度テストを実施することを含まない後期深度処理を実施すると判断することによって、GPUは、フラグメントがフラグメントシェーディングされるための待機時間を最小限にすることができる。このようにして、GPUは、フラグメントのセットについて、保守的深度処理それとも後期深度処理が、グラフィックス処理動作を実施する際により優れた性能をもたらすか判断することによって、最終的にレンダリングされるシーン中で可視的になるフラグメントをより素早くレンダリングすることができる。
図1は、本開示の1つまたは複数の態様を実装するように構成され得る例示的なコンピューティングデバイスを示すブロック図である。図1に示すように、デバイス2は、限定はしないが、ビデオデバイス、メディアプレーヤ、セットトップボックス、携帯電話およびいわゆるスマートフォンなどのワイヤレスハンドセット、携帯情報端末(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲームコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどを含むコンピューティングデバイスであり得る。図1の例では、デバイス2は、中央処理ユニット(CPU)6、システムメモリ10、およびGPU12を含み得る。デバイス2は、ディスプレイプロセッサ14、トランシーバモジュール3、ユーザインターフェース4、およびディスプレイ8も含み得る。トランシーバモジュール3およびディスプレイプロセッサ14は、どちらもCPU6および/もしくはGPU12と同じ集積回路(IC)の一部である場合があるか、どちらもCPU6および/もしくはGPU12を含む1つもしくは複数のICの外部にある場合があるか、またはCPU6および/もしくはGPU12を含むICの外部にあるIC内に形成される場合がある。
デバイス2は、明快のために図1には示さない追加のモジュールまたはユニットを含み得る。たとえば、デバイス2は、デバイス2がモバイルワイヤレス電話である例では電話通信をもたらし、デバイス2がメディアプレーヤである場合にはスピーカーをもたらすために、図1には示していない、スピーカーおよびマイクロフォンを含み得る。デバイス2は、ビデオカメラも含み得る。さらに、デバイス2内に示された様々なモジュールおよびユニットは、デバイス2のすべての例において必要とは限らない。たとえば、ユーザインターフェース4およびディスプレイ8は、デバイス2が、デスクトップコンピュータ、または外部のユーザインターフェースもしくはディスプレイとインターフェースするために装備された他のデバイスである例ではデバイス2の外部にある場合がある。
ユーザインターフェース4の例としては、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース4はまた、タッチスクリーンであってもよく、ディスプレイ8の一部として組み込まれてよい。トランシーバモジュール3は、コンピューティングデバイス2と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路構成を含むことができる。トランシーバモジュール3は、変調器、復調器、増幅器、およびワイヤード通信またはワイヤレス通信用の他のそのような回路構成を含み得る。
CPU6は、実行用のコンピュータプログラムの命令を処理するように構成された中央処理ユニット(CPU)などのマイクロプロセッサである場合がある。CPU6は、コンピューティングデバイス2の動作を制御する汎用または専用プロセッサを含むことができる。ユーザは、コンピューティングデバイス2に入力を提供して、1つまたは複数のソフトウェアアプリケーションをCPU6に実行させることができる。CPU6上で実行するソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーションまたは別のプログラムを含み得る。加えて、CPU6は、GPU12の動作を制御するためのGPUドライバ22を実行し得る。ユーザは、ユーザインターフェース4を介してコンピューティングデバイス2に結合された、キーボード、マウス、マイクロフォン、タッチパッド、または別の入力デバイスなど、1つまたは複数の入力デバイス(図示せず)を介して、コンピューティングデバイス2に入力を提供することができる。
CPU6上で実行されるソフトウェアアプリケーションは、ディスプレイ8へのグラフィックスデータのレンダリングを行わせるようCPU6に命令する1つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、たとえば、オープングラフィックスライブラリ(OpenGL(登録商標))API、オープングラフィックスライブラリ組込みシステム(OpenGL ES)API、Direct3D API、X3D API、RenderMan API、WebGL API、または任意の他の公的もしくはプロプライエタリ規格グラフィックスAPIなどのグラフィックスアプリケーションプログラミングインターフェース(API)に準拠し得る。グラフィックスレンダリング命令を処理するために、CPU6は、1つまたは複数のグラフィックスレンダリングコマンドをGPU12に(たとえばGPUドライバ22を介して)発行して、グラフィックスデータのレンダリングのいくらかまたはすべてをGPU12に実施させることができる。いくつかの例では、レンダリングされるべきグラフィックスデータは、グラフィックスプリミティブ、たとえば、点、線、三角形、四角形、三角形ストリップなどのリストを含み得る。
GPU12は、1つまたは複数のグラフィックスプリミティブをディスプレイ8にレンダリングするためのグラフィックス動作を実施するように構成されてよい。したがって、CPU6上で実行するソフトウェアアプリケーションのうちの1つがグラフィックス処理を要求するとき、CPU6は、ディスプレイ8にレンダリングするためにグラフィックスコマンドおよびグラフィックスデータをGPU12に提供し得る。グラフィックスデータは、たとえば、描画コマンド、状態情報、プリミティブ情報、テクスチャ情報などを含み得る。GPU12は、ある事例では、CPU6よりも効率的な、複雑なグラフィック関連動作の処理を実現する高度並列構造で構築され得る。たとえば、GPU12は、複数の頂点またはピクセル上で並列に動作するように構成されたシェーダユニットなどの複数の処理要素を含み得る。GPU12の高度並列の性質は、いくつかの事例では、CPU6を使用してシーンを直接ディスプレイ8に描画するよりも速く、GPU12がグラフィックス画像(たとえば、GUIならびに2次元(2D)および/または3次元(3D)グラフィックスシーン)をディスプレイ8上で描画することを可能にし得る。
GPU12は、いくつかの事例では、コンピューティングデバイス2のマザーボードに統合される場合がある。他の事例では、GPU12は、コンピューティングデバイス2のマザーボード内のポートにインストールされたグラフィックスカード上に存在してもよく、またはさもなければコンピューティングデバイス2と相互動作するように構成された周辺デバイス内に組み込まれてもよい。CPU6およびGPU12は、システムオンチップ(SoC)など、単一パッケージの一部であってもよい。GPU12は、1つまたは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、または他の等価な集積論理回路構成もしくはディスクリート論理回路構成など、1つまたは複数のプロセッサを含み得る。GPU12は、1つまたは複数のプロセッサコアを含む場合もあり、その結果、GPU12は、マルチコアプロセッサと呼ばれる場合がある。
GPU12は、グラフィックスメモリ40に直接結合され得る。したがって、GPU12は、バスを使用することなく、グラフィックスメモリ40に対してデータの読取りおよび書込みができる。言い換えれば、GPU12は、オフチップメモリの代わりにローカルストレージを使用して、データをローカルに処理することができる。そのようなグラフィックスメモリ40は、オンチップメモリと呼ばれる場合がある。このグラフィックスメモリ40は、GPU12が、重いバストラフィックを経る場合があるバスを介してGPU12がデータを読み書きする必要性を除去することによって、より効率的に動作することを可能にする。しかし、いくつかの事例では、GPU12は、別個のメモリを備えなくてもよく、その代わり、バスを介してシステムメモリ10を利用することができる。グラフィックスメモリ40は、1つまたは複数の揮発性または不揮発性メモリまたはストレージデバイス、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能プログラム可能なROM(EPROM)、電気的に消去可能プログラム可能なROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光学ストレージ媒体など、を含むことができる。
いくつかの例では、GPU12は、システムメモリ10内に十分に形成された画像を記憶し得る。ディスプレイプロセッサ14は、画像を表示するためにディスプレイ8のピクセルを照明させる、システムメモリ10からの画像および出力値を取り出す場合がある。ディスプレイ8は、GPU12によって生成された画像コンテンツを表示する、コンピューティングデバイス2のディスプレイであってよい。ディスプレイ8は、液晶ディスプレイ(LCD)、有機発光ダイオードディスプレイ(OLED)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、または別のタイプのディスプレイデバイスである場合がある。
本開示の態様によると、GPU12は、GPU12上で実行するフラグメントシェーダの作業負荷を判断することができる。フラグメントシェーダの作業負荷が、指定された閾値よりも低いと判断したことに応答して、フラグメントシェーダは、フラグメントシェーダが1つまたは複数のフラグメントを処理するのに先立って、GPU12が1つまたは複数のフラグメントの深度試験を実施することなく、1つまたは複数のフラグメントを処理することができる。
図2は、GPU12によって3次元シーンの2次元表現を作成するために実施され得る例示的グラフィックス処理パイプライン24を示すブロック図である。グラフィックス処理パイプライン24は、グラフィックス処理コマンドを実行するために一緒に動作する複数のグラフィックス処理段階を含み得る。図2に示すように、グラフィックス処理パイプライン24は、コマンドエンジン26、頂点シェーダ段階28、テッセレーション段階30、ジオメトリ処理段階32、ラスタ化段階34、およびフラグメントシェーダ段階36を含み得る。グラフィックス処理パイプライン24中の構成要素の各々は、固定機能構成要素、(たとえば、プログラマブルシェーダユニット上で実行するシェーダプログラムの一部としての)プログラマブル構成要素として、または固定機能構成要素とプログラマブル構成要素の組合せとして実装されてよい。
GPU12は、GPUドライバ22を介してCPU6から1つまたは複数のグラフィックス処理コマンドを受信するように、および、グラフィックス処理パイプライン24を介してグラフィックス処理コマンドを実行して、表示可能なグラフィックス画像を生成するように構成され得る。上記で説明したように、グラフィックス処理パイプライン24は、グラフィックス処理コマンドを実行するために一緒に動作する複数の段階を含む。しかしながら、そのような段階は必ずしも別個のハードウェアブロックにおいて実装される必要はないことに留意されたい。たとえば、頂点シェーダ段階28、テッセレーション段階30、ジオメトリ処理段階32、ラスタ化段階34、およびフラグメントシェーダ段階36のいくつかの部分は、統合シェーダユニットの一部として実装され得る。
コマンドエンジン26は、グラフィックス処理コマンドを受信し、グラフィックス処理コマンドを実践するための様々な動作を実施するようにグラフィックス処理パイプライン24内の残りの処理段階を構成してよい。グラフィックス処理コマンドは、たとえば、描画コマンドおよびグラフィックス状態コマンドを含み得る。描画コマンドは、1つまたは複数の頂点の位置座標を指定する頂点仕様コマンドと、ある事例では、たとえば、色座標、法線ベクトル、テクスチャ座標およびかぶり座標など、頂点の各々に関連付けられた他の属性値とを含み得る。グラフィックス状態コマンドは、プリミティブタイプコマンド、変換コマンド、照明コマンドなどを含み得る。プリミティブタイプコマンドは、レンダリングされるべきプリミティブのタイプおよび/またはプリミティブを形成するために頂点がどのように組み合わされるかを指定し得る。変換コマンドは、頂点に対して実施すべき変換のタイプを指定し得る。照明コマンドは、グラフィックスシーン内の異なる照明のタイプ、方向および/または配置を指定し得る。コマンドエンジン26は、ジオメトリ処理段階32に、1つまたは複数の受信されたコマンドに関連付けられた頂点および/またはプリミティブに対してジオメトリ処理を実施させる場合がある。
頂点シェーダ段階28は、受信された頂点データおよび属性を処理することができる。たとえば、頂点シェーダ段階28は、変換、スキニング、頂点置換など、頂点ごとの処理を実施することができ、頂点ごとの物質属性を算出する。いくつかの例では、頂点シェーダ段階28は、テクスチャ座標、頂点色、頂点照明、フォグ因子などを生成し得る。頂点シェーダ段階28は概して、単一の入力頂点を受け取り、単一の、処理された出力頂点を出力する。
テッセレーション段階30は、頂点シェーダ段階28によって出力された頂点を受信するとともに、低詳細細分表面をより高詳細プリミティブにコンバートし、高次表面をレンダリング用に適切な表面(たとえば、三角形)にタイリングする、グラフィックス処理パイプライン24の任意選択の段階のセットであってよい。
ジオメトリ処理段階32は、ラスタ化段階34のためのプリミティブデータを生成するために、頂点シェーダ28またはテッセレーション段階30によって出力された1つまたは複数の頂点に対して、頂点ごとの動作および/またはプリミティブセットアップ動作を実施することができる。各頂点は、たとえば、位置座標、色値、法線ベクトル、およびテクスチャ座標などの属性のセットに関連付けられ得る。ジオメトリ処理段階32は、様々な頂点ごとの動作に従って、これらの属性のうちの1つまたは複数を修正する。たとえば、ジオメトリ処理段階32は、修正された頂点位置座標を生成するために、頂点位置座標に対して1つまたは複数の変換を実施してよい。ジオメトリ処理段階32は、修正された頂点位置座標を生成するために、たとえば、モデリング変換、ビューイング変換、投影変換、モデルビュー(ModelView)変換、モデルビュー投影(ModelViewProjection)変換、ビューポート変換および深度範囲スケーリング変換のうちの1つまたは複数を頂点位置座標に適用してよい。いくつかの事例では、頂点位置座標はモデル空間座標であってよく、修正された頂点位置座標はスクリーン空間座標であってよい。スクリーン空間座標は、モデリング変換、ビューイング変換、投影変換およびビューポート変換の適用の後で取得されてもよい。いくつかの事例では、ジオメトリ処理段階32はまた、頂点の修正された色座標を生成するために、頂点に対して頂点ごとの照明動作を実施してもよい。ジオメトリ処理段階32はまた、たとえば、正規変換、ノーマル正規化動作(normal normalization operations)、ビューボリュームクリッピング、同次除算動作および/またはバックフェースカリング動作を含む他の動作を実施してもよい。
ジオメトリ処理段階32は、ラスタ化されるべきプリミティブを定義する1つまたは複数の修正された頂点のセットを含むプリミティブデータ、ならびにプリミティブを形成するために頂点がどのように組み合わされるかを指定するデータを生じ得る。修正された頂点の各々は、たとえば、修正された頂点位置座標と、頂点に関連付けられた処理された頂点属性値とを含み得る。プリミティブデータはまとめて、グラフィックス処理パイプライン24のさらなる段階によってラスタ化されるべきプリミティブに対応し得る。概念的には、各頂点は、プリミティブの2つの辺がぶつかるプリミティブの角に対応し得る。ジオメトリ処理段階32は、さらなる処理のために、プリミティブデータをラスタ化段階34に与え得る。
いくつかの例では、ジオメトリ処理段階32の全部または一部が、GPU12の1つまたは複数のシェーダプロセッサ上で実行する1つまたは複数のシェーダプログラムによって実装される場合がある。たとえば、ジオメトリ処理段階32は、そのような例では、頂点シェーダ、ジオメトリシェーダまたはそれらの任意の組合せによって実装され得る。他の例では、ジオメトリ処理段階32は、固定機能ハードウェア処理パイプラインとして、または固定機能ハードウェアと1つもしくは複数のシェーダユニット上で実行する1つもしくは複数のシェーダプログラムの組合せとして実装される場合がある。
ラスタ化段階34は、ジオメトリ処理段階32から、ラスタ化されるべきプリミティブを表すプリミティブデータを受信し、プリミティブをラスタ化して、ラスタ化されたプリミティブに対応する複数のソースピクセルを生成するように構成される。いくつかの例では、ラスタ化段階34は、どのスクリーンピクセルロケーションがラスタ化されるべきプリミティブによってカバーされるかを決定し、プリミティブによってカバーされると決定されたスクリーンピクセルロケーションごとにソースピクセルを生成し得る。ラスタ化段階34は、たとえば、エッジウォーキング(edge-walking)技法、エッジ方程式評価(evaluating edge equations)などの、当業者に知られている技法を使用することによって、どのスクリーンピクセルロケーションがプリミティブによってカバーされるかを決定し得る。ラスタ化段階34は、さらなる処理のために、得られたソースピクセルをフラグメントシェーダ段階36に与えてよい。
ラスタ化段階34によって生成されたソースピクセルは、スクリーンピクセルロケーション、たとえば、宛先ピクセルに対応し、1つまたは複数の色属性に関連付けられる場合がある。特定のラスタ化されたプリミティブのために生成されたソースピクセルのすべては、ラスタ化されたプリミティブに関連付けられていると言える。プリミティブによってカバーされるべき、ラスタ化段階34によって決定されたピクセルは、概念的には、プリミティブの頂点を表すピクセル、プリミティブの辺を表すピクセル、およびプリミティブの内部を表すピクセルを含み得る。
フラグメントシェーダ段階36は、ラスタ化されたプリミティブに関連付けられたソースピクセルを受信するように、および、ソースピクセルに対して1つまたは複数のピクセルごとの動作を実施するように構成される。フラグメントシェーダ段階36によって実施され得るピクセルごとの動作は、たとえば、アルファテスト、テクスチャマッピング、色計算、ピクセルシェーディング、ピクセルごとの照明、かぶり処理、ブレンディング、ピクセルオーナーシップテキスト、ソースアルファテスト、ステンシルテスト、深度テスト、シザーテストおよび/またはスティップリング動作を含む。加えて、フラグメントシェーダ段階36は、1つまたは複数のフラグメントごとの動作を実施するための1つまたは複数のピクセルシェーダプログラムを実行してもよい。フラグメントシェーダ段階36によって生じられた、得られたデータは、本明細書では宛先ピクセルデータと呼ばれ、フレームバッファに記憶され得る。宛先ピクセルデータは、処理されたソースピクセルと同じディスプレイロケーションを有する、フレームバッファ内の宛先ピクセルに関連付けられ得る。宛先ピクセルデータは、たとえば、色値、宛先アルファ値、深度値などのデータを含み得る。
本開示のある態様によると、GPU12は、フラグメントシェーダ段階36の機能を実施するための、GPU12上で実行するフラグメントシェーダの作業負荷を判断することができる。フラグメントシェーダの作業負荷が、指定された閾値よりも低いと判断したことに応答して、フラグメントシェーダは、フラグメントシェーダが1つまたは複数のフラグメントを処理するのに先立って、GPU12が1つまたは複数のフラグメントの深度試験を実施することなく、1つまたは複数のフラグメントを処理することができる。
図3は、図1のCPU6、GPU12、およびシステムメモリ10の例示的な実装形態をさらに詳細に示すブロック図である。図3に示すように、CPU6は、各々がCPU6上で実行する1つまたは複数のソフトウェアアプリケーションまたはサービスである場合がある、少なくとも1つのソフトウェアアプリケーション18、グラフィックスAPI20、およびGPUドライバ22を含み得る。
CPU6およびGPU12が利用可能なメモリは、システムメモリ10およびフレームバッファ16を含み得る。フレームバッファ16は、システムメモリ10の一部であってもよく、またはシステムメモリ10とは別であってもよい。フレームバッファ16は、レンダリングされた画像データを記憶し得る。
ソフトウェアアプリケーション18は、GPU12の機能性を利用する任意のアプリケーションであってよい。たとえば、ソフトウェアアプリケーション18は、GUIアプリケーション、オペレーティングシステム、ポータブルマッピングアプリケーション、エンジニアリングもしくは美術アプリケーション用のコンピュータ支援設計プログラム、ビデオゲームアプリケーション、または2Dもしくは3Dグラフィックスを使用する別のタイプのソフトウェアアプリケーションであってよい。
ソフトウェアアプリケーション18は、グラフィカルユーザインターフェース(GUI)および/またはグラフィックスシーンをレンダリングするようにGPU12に命令する1つまたは複数の描画命令を含み得る。たとえば、描画命令は、GPU12によってレンダリングされるべき1つまたは複数のグラフィックスプリミティブのセットを定義する命令を含み得る。いくつかの例では、描画命令は、GUIにおいて使用される複数のウィンドウイング表面の全部または一部をまとめて定義し得る。追加の例では、描画命令は、アプリケーションによって定義されたモデル空間またはワールド空間内に、1つまたは複数のグラフィックスオブジェクトを含むグラフィックスシーンの全部または一部をまとめて定義し得る。
ソフトウェアアプリケーション18は、1つまたは複数のグラフィックスプリミティブを表示可能グラフィックス画像にレンダリングするために、グラフィックスAPI20を介して1つまたは複数のコマンドをGPU12に発行するようにGPUドライバ22を起動し得る。たとえば、ソフトウェアアプリケーション18は、グラフィックスAPI20を介して、プリミティブ定義をGPU12に提供するようにGPUドライバ22を起動し得る。いくつかの事例では、プリミティブ定義は、描画プリミティブ、たとえば、三角形、矩形、三角形ファン、三角形ストリップなどのリストの形でGPU12に与えられる場合がある。プリミティブ定義は、レンダリングされるべきプリミティブに関連付けられた1つまたは複数の頂点を指定する頂点仕様を含み得る。頂点仕様は、頂点ごとの位置座標と、いくつかの事例では、たとえば、色座標、法線ベクトル、およびテクスチャ座標など、頂点に関連付けられた他の属性とを含んでもよい。プリミティブ定義はまた、プリミティブタイプ情報(たとえば、三角形、矩形、三角形ファン、三角形ストリップなど)、スケーリング情報、回転情報などを含んでもよい。ソフトウェアアプリケーション18によってGPUドライバ22に発行された命令に基づいて、GPUドライバ22は、プリミティブをレンダリングするためにGPU12が実施する1つまたは複数の動作を指定する1つまたは複数のコマンドを公式化する場合がある。GPU12がCPU6からコマンドを受信すると、プロセッサクラスタ46は、コマンドを復号するようにグラフィックス処理パイプライン24を実行し、コマンドに指定された動作を実施するようにグラフィックス処理パイプライン24を構成する。たとえば、グラフィックス処理パイプライン24内のコマンドエンジン26は、プリミティブデータを読み取り、データをアセンブルし、グラフィックス処理パイプライン24の他のグラフィックスパイプライン段階が使用するためのプリミティブにする場合がある。指定された動作を実施した後、グラフィックス処理パイプライン24は、レンダリングされたデータをディスプレイデバイスに関連付けられたフレームバッファ16に出力する。
フレームバッファ16は、GPU12のための宛先ピクセルを記憶する。各宛先ピクセルは、一意のスクリーンピクセルロケーションに関連付けられ得る。いくつかの例では、フレームバッファ16は、各宛先ピクセルに関する色成分および宛先アルファ値を記憶し得る。たとえば、フレームバッファ16は、各ピクセルの赤、緑、青、アルファ(RGBA)成分を記憶し得るが、ここにおいて、「RGB」成分は色値に相当し、「A」成分は宛先アルファ値に相当する。フレームバッファ16は、各宛先ピクセルについての深度値を記憶することもできる。フレームバッファ16およびシステムメモリ10は別のメモリユニットであるものとして示されているが、他の例では、フレームバッファ16は、システムメモリ10の一部である場合がある。
プロセッサクラスタ46は、1つもしくは複数のプログラム可能処理ユニット42および/または1つもしくは複数の固定機能処理ユニット44を含み得る。プログラム可能処理ユニット42は、たとえば、CPU6からGPU12上にダウンロードされる1つまたは複数のシェーダプログラムを実行するように構成されるプログラム可能シェーダユニットを含み得る。いくつかの例では、プログラマブルプロセッサユニット42は、「シェーダプロセッサ」または「統合シェーダ」と呼ばれる場合があり、ジオメトリシェーディング動作、頂点シェーディング動作、ピクセルシェーディング動作、またはグラフィックスをレンダリングするための他のシェーディング動作を実施することができる。シェーダユニットは各々、動作をフェッチおよび復号するための1つまたは複数の構成要素、算術計算を実践するための1つまたは複数のALU、1つまたは複数のメモリ、キャッシュ、およびレジスタを含み得る。
シェーダプログラムは、いくつかの例では、たとえば、OpenGL Shading Language(GLSL)、High Level Shading Language(HLSL)、C for Graphics(Cg)シェーディング言語などの高水準シェーディング言語で書かれるプログラムのコンパイルされたバージョンであり得る。いくつかの例では、プログラム可能処理ユニット42は、並列に動作するように構成される複数の処理ユニット、たとえばSIMDパイプラインを含み得る。プログラム可能処理ユニット42は、シェーダプログラム命令および実行状態レジスタ、たとえば、実行されているプログラム命令中の現在の命令またはフェッチされることになる次の命令を示すプログラムカウンタレジスタを記憶するプログラムメモリを有し得る。プロセッサクラスタ46中のプログラム可能処理ユニット42は、たとえば、頂点シェーダユニット、フラグメントシェーダユニット、ジオメトリシェーダユニット、ハルシェーダユニット、ドメインシェーダユニット、計算シェーダユニット、および/または統合シェーダユニットを含み得る。
GPU12は、グラフィックス処理パイプライン24内の頂点シェーダ段階28、テッセレーション段階30、ジオメトリ処理段階32、ラスタ化段階34、およびフラグメントシェーダ段階36のうちの1つまたは複数を実行するコマンドをプログラム可能処理ユニット42に送ることによって、頂点シェーディング、ハルシェーディング、ドメインシェーディング、ジオメトリシェーディング、フラグメントシェーディングなどの様々なシェーディング動作を実施するように、プログラム可能処理ユニット42に指示し得る。いくつかの例では、GPUドライバ22は、CPU6上で実行するコンパイラに、1つまたは複数のシェーダプログラムをコンパイルさせ、コンパイル済みシェーダプログラムをGPU12内に含まれるプログラム可能処理ユニット42にダウンロードさせることができる。シェーダプログラムは、高水準シェーディング言語、たとえば、OpenGL Shading Language(GLSL)、High Level Shading Language(HLSL)、C for Graphics(Cg)シェーディング言語、OpenCL Cカーネルなどで書かれてよい。コンパイルされたシェーダプログラムは、GPU12内のプログラム可能処理ユニット42の動作を制御する1つまたは複数の命令を含み得る。たとえば、シェーダプログラムは、頂点シェーダ段階28の機能を実施するようにプログラム可能処理ユニット42によって実行され得る頂点シェーダプログラム、テッセレーション段階30の機能を実施するようにプログラム可能処理ユニット42によって実行され得るテッセレーションシェーダプログラム、ジオメトリ処理段階32の機能を実施するようにプログラム可能処理ユニット42によって実行され得るジオメトリシェーダプログラム、および/またはフラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42によって実行され得るフラグメントシェーダプログラムを含み得る。頂点シェーダプログラムは、プログラマブル頂点シェーダユニットまたは統合シェーダユニットの実行を制御し、1つまたは複数の頂点ごとの動作を指定する命令を含み得る。
プロセッサクラスタ46は、固定機能処理ユニット44も含み得る。固定機能処理ユニット44は、いくつかの機能を実施するように配線接続されるハードウェアを含み得る。固定機能処理ユニット44は、たとえば1つまたは複数の制御信号を介して、異なる機能を実施するように構成可能であり得るが、固定機能ハードウェアは通常、ユーザによりコンパイルされるプログラムを受け取ることが可能なプログラムメモリを含まない。いくつかの例では、プロセッサクラスタ46中の固定機能処理ユニット44は、たとえば、グラフィックス処理パイプライン24のラスタ化段階34の機能を実施するように、たとえば、深度試験、シザー試験、アルファブレンディングなどのようなラスタ動作を実施する処理ユニットを含み得る。
グラフィックスメモリ40は、GPU12の集積回路に物理的に統合されたオンチップストレージまたはメモリである。グラフィックスメモリ40はオンチップなので、GPU12は、システムバスを介してシステムメモリ10から値を読み取り、またはそこに値を書き込むよりも素早く、グラフィックスメモリ40から値を読み取り、またはそこに値を書き込むことが可能であり得る。グラフィックスメモリ40は、フラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42上で実行するフラグメントシェーダプログラムによる処理のためにフラグメントを記憶し、キューイングするように構成されるシェーダ入力バッファ50を含み得る。
上述したように、プロセッサクラスタ46は、グラフィックス処理パイプライン24の様々な段階の機能を実施することができるプログラム可能処理ユニット42および固定機能処理ユニット44を含む。一例では、プロセッサクラスタ46の固定機能処理ユニット44は、1つまたは複数のプリミティブをピクセルのセットにラスタ化するための、ラスタ化段階34の機能を実施することができる。プログラム可能処理ユニット42は、固定機能処理ユニット44がラスタ化段階34の機能を実施することによってラスタ化されたピクセルのセットを処理するための、フラグメントシェーダ段階36の機能を実施するように、フラグメントシェーダを実行することができる。
深度テストユニット48は、フラグメントの深度値を、そのフラグメントのサンプル位置において、深度バッファ中に記憶された深度値と突き合わせてテストするように構成されるソフトウェアを実行するハードウェアおよび/または処理ユニットを含み得る。深度バッファは、いくつかの例では、フレームバッファ16中に含まれ得る。そのようなテストは、フラグメントが他のフラグメントの後ろに隠蔽されるかどうか、したがって、最終的にレンダリングされるシーン中で可視的でないかどうか判断するのに有用であり得る。深度テストユニット48が深度テストを実施したことに基づいて、フラグメントが、最終的にレンダリングされるシーン中のビューから、別のフラグメントの後ろに隠蔽されると判断した場合、GPU12は、フラグメントを破棄してよく、フラグメントのさらなる処理をやめてよい。
本開示のある態様によると、深度論理ユニット54は、GPU12がグラフィックス処理パイプライン24のラスタ化段階34を実施することによって生成された1つまたは複数のフラグメントについてGPU12が保守的深度試験を実施するか、それとも後期深度試験を実施するか判断するように構成されるソフトウェアを実行するハードウェアおよび/または処理ユニットを含み得る。GPU12は、GPU12が、1つまたは複数のフラグメントのセットを処理するためのフラグメントシェーダ段階36の機能を実施するようにフラグメントシェーダを実行する前(すなわち、早期深度試験を実施させる)と、GPU12が、1つまたは複数のフラグメントのセットを処理するためのフラグメントシェーダ段階36の機能を実施するようにフラグメントシェーダを実行した後(すなわち、後期深度試験を実施させる)の両方において、深度テストユニット48に1つまたは複数のフラグメントのセット用の深度テストを実施させることによって、ラスタ化段階34を実施することから生成された1つまたは複数のフラグメントのセットについて保守的深度試験を実施し得る。言い換えると、保守的深度処理において、GPU12は早期深度テストと後期深度テストの両方を実施し、早期および後期は、フラグメントシェーダがフラグメントのフラグメントシェーディングを実施するときに関係する。保守的深度処理とは対照的に、GPU12は、GPU12が、1つまたは複数のフラグメントのセットを処理するためのフラグメントシェーダ段階36の機能を実施するようにフラグメントシェーダを実行した後(すなわち、後期深度試験を実施させる)でのみ、深度テストユニット48に1つまたは複数のフラグメントのセット用の深度テストを実施させることによって、ラスタ化段階34を実施することから生成された1つまたは複数のフラグメントのセット用の後期深度処理を実施し得る。
さらに、深度論理ユニット54が、深度テストユニット48に、保守的深度処理の一部としてフラグメントのセットの早期深度試験を実施するよう命じた場合、および深度論理ユニット54が、フラグメントのセットのうちの1つまたは複数を、それらの1つまたは複数のフラグメントは最終的にレンダリングされるシーン中のビューから隠蔽されると深度テストユニット48が判断したので破棄した場合、深度テストユニット48が早期深度試験を実施した後で処理のためにフラグメントシェーダに転送される、フラグメントの得られるセットは、深度テストユニット48によって破棄された1つまたは複数のフラグメントを含まない。同様に、深度論理ユニット54が、深度テストユニット48に、保守的深度処理または後期深度処理のいずれかの一部としてフラグメントのセットの後期深度試験を実施するよう命じた場合、および深度テストユニット48が、フラグメントのセットのうちの1つまたは複数を、それらの1つまたは複数のフラグメントは最終的にレンダリングされるシーン中のビューから隠蔽されると深度テストユニット48が判断したので破棄した場合、深度テストユニット48が早期深度試験を実施した後でGPU12がフレームバッファ16中に書き込むフラグメントの得られるセットの値は、深度テストユニット48によって破棄された1つまたは複数のフラグメントを含まない。
深度論理ユニット54は、トランザクションごとにGPU12が保守的深度処理それとも後期深度処理を実施するかの、そのような判断を行うことが可能であり得る。トランザクションは、GPU12がラスタ化段階34の機能を実施することによって所与のクロック周期中に生成された1つまたは複数のフラグメントのセットであってよい。他の例では、トランザクションは、ソフトウェアアプリケーション18による描画コールの結果として生成されたフラグメントの総数よりも少ない1つまたは複数のフラグメントのセットであってよい。したがって、深度論理ユニット54は、GPU12が単一の描画コールを処理する際に保守的深度処理それとも後期深度処理を実施するかに関して、複数の決定を行い得る。いくつかの例では、ラスタ化段階34の機能を実施する、GPU12のラスタライザは、トランザクションごとに、4×4ピクセルタイルなど、1つまたは複数のフラグメントを生成し得る。したがって、所与のクロック周期中にラスタライザによって生成された1つまたは複数のフラグメントの各セットについて、深度論理ユニット54は、GPU12が、1つまたは複数のフラグメントのそのセットについて保守的深度処理それとも後期深度処理を実施するか判断し得る。トランザクションごとに判断を行うことによって、深度論理ユニット54は、1つまたは複数のフラグメントのセットを生成するラスタライザの各別個のトランザクション(たとえば、ラスタ化段階34によって生成された各別個の4×4ピクセルタイル)用にGPU12が保守的深度処理それとも後期深度処理を実施するかの別個の判断を行うことができる。
深度論理ユニット54は、フラグメントシェーダ段階36の機能を実施するように、プログラム可能処理ユニット42上で実行するフラグメントシェーダプログラムの作業負荷に少なくとも部分的に基づいて、1つまたは複数のフラグメントのセットについて保守的深度処理それとも後期深度処理を実施するか判断し得る。深度論理ユニット54が、フラグメントシェーダプログラムが軽負荷であると判断した場合、深度論理ユニット54は、GPU12に、1つまたは複数のフラグメントの後期深度試験を実施することによってのみ、1つまたは複数のフラグメントのセットについて後期深度処理を実施させてよい。一方、深度論理ユニット54が、フラグメントシェーダが重負荷であると判断した場合、深度論理ユニット54は、GPU12に、1つもしくは複数のフラグメント用に保守的深度処理を実施させてよく、またはGPU12に、1つもしくは複数のフラグメントに対して保守的深度処理それとも後期深度処理をあるクロック周期に実施するかの判断を、あるクロック周期の間停止させてよい。
深度論理ユニット54は、フラグメントシェーダプログラムによる処理のためにフラグメントをキューイングするシェーダ入力バッファ50の状況に少なくとも部分的に基づいて、フラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42上で実行するフラグメントシェーダプログラムの作業負荷を判断することができる。深度論理ユニット54は、シェーダ入力バッファ50の容量と比較した、シェーダ入力バッファ50中に記憶されているデータの量に少なくとも部分的に基づいて、フラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42上で実行するフラグメントシェーダプログラムの作業負荷を判断することができる。一例では、深度論理ユニット54は、シェーダ入力バッファ50中に記憶されているデータの量がシェーダ入力バッファ50の容量の半分以下の場合、フラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42上で実行するフラグメントシェーダプログラムが軽負荷であると判断し得る。深度論理ユニット54は、シェーダ入力バッファ50中に記憶されているデータの量がシェーダ入力バッファ50の容量の半分よりも多い場合、フラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42上で実行するフラグメントシェーダプログラムが重負荷であると判断し得る。
他の例では、フラグメントシェーダプログラムは軽負荷であるか、それとも重負荷であるかの間の閾値をなす、シェーダ入力バッファ50中に記憶されているデータの量とシェーダ入力バッファ50の容量との間の比は異なってよい。たとえば、一例では、フラグメントシェーダプログラムは軽負荷であるか、それとも重負荷であるかの間の閾値は3/5であってよく、ここで、シェーダ入力バッファ50中に記憶されているデータの量がシェーダ入力バッファ50の容量の3/5以下の場合、フラグメントシェーダプログラムは軽負荷であることになり得る。他の例では、フラグメントシェーダプログラムは軽負荷であるか、それとも重負荷であるかの間の閾値をなす、シェーダ入力バッファ50中に記憶されているデータの量とシェーダ入力バッファ50の容量との間の比は異なってよく、他のどの適切な閾値であってもよい。
深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値を、ヒステリシスに基づいて動的に判断してもよい。言い換えると、閾値は、シェーダ入力バッファ50の現時点および過去の入力に依存し得る。一例では、深度論理ユニット54が、シェーダ入力バッファ50は30%未満が埋まっていると判断した場合、深度論理ユニットは、フラグメントシェーダプログラムが軽負荷であると判断してよい。一旦、シェーダ入力バッファ50の30%未満しか埋まらなくなると、シェーダ入力バッファ50が、複数のクロック周期を経て、30%未満が埋まっている状態から30%よりも多く埋まっている状態に増大した場合、深度論理ユニット54は、シェーダ入力バッファ50中に記憶されているデータの量がシェーダ入力バッファ50の容量の70%よりも多くなるように増大するまで、フラグメントシェーダプログラムが軽負荷であると判断し続けてよく、70%よりも多くなった時点で、深度論理ユニット54は、フラグメントシェーダプログラムが重負荷であると判断すればよい。一旦、シェーダ入力バッファ50が70%よりも多く埋まると、深度論理ユニット54は、シェーダ入力バッファ50中に記憶されているデータの量がシェーダ入力バッファ50の容量の30%未満に低減されるまで、フラグメントシェーダプログラムが重負荷であると判断し続けてよく、30%未満になった時点で、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であると判断すればよい。このようにして、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値を動的に設定し、変えることができる。
いくつかの例では、シェーダ入力バッファ50は、プログラム可能処理ユニット42のそれぞれの並列シェーダプロセッサ上で実行するフラグメントシェーダプログラムによる処理のためにデータをバッファリングする複数のバッファを備え得る。バッファ中に記憶されているデータの量と、それに対する、複数のバッファのうちの少なくとも1つの、バッファの容量との間の比が閾値を下回る場合、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であると判断し得る。たとえば、バッファのうちの少なくとも1つが半分満杯以下である場合、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であると判断し得る。
他の例では、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値は、シェーダ入力バッファ50の容量を考慮に入れずに、シェーダ入力バッファ50中に記憶されているデータの量に基づき得る。たとえば、シェーダ入力バッファ中に記憶されているデータの量が1つまたは複数のフラグメントを含む場合、深度論理ユニット54は、フラグメントシェーダプログラムが重負荷であると判断し得る。逆に、シェーダ入力バッファが空の場合、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であると判断し得る。
深度論理ユニット54は、GPU12の様々な構成要素の使用率を判断したことに少なくとも部分的に基づいて、フラグメントシェーダプログラムの作業負荷を判断することもできる。深度論理ユニット54は、テクスチャプロセッサ、シェーダプロセッサ、算術論理ユニット(ALU)などのような、プロセッサクラスタ46の構成要素の負荷および/または使用率、ならびにプロセッサクラスタ46の構成要素とキャッシュおよび/またはメモリとの間のメモリ帯域幅のトラフィックを監視し得る。深度論理ユニット54は、プロセッサクラスタ46の負荷および/もしくは使用率ならびにクロック周期ごとのメモリトラフィックに基づいて、またはいくつかのクロック周期にわたる平均負荷および/もしくは使用率に基づいて、フラグメントシェーダプログラムの作業負荷を判断することができる。このようにして、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値を、プロセッサクラスタ46の具体的な負荷および/もしくは使用率または瞬時に測定されたメモリトラフィックの具体的なレベルもしくはいくつかのクロック周期にわたる平均温度として判断することができる。深度論理ユニット54は、プロセッサクラスタ46のプロセッサ負荷を判断するために、プロセッサクラスタ46のハードウェア構成要素の温度を測定することもでき、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値を、瞬時に測定された具体的な温度またはいくつかのクロック周期にわたる平均温度として判断することができる。
図4は、後期深度処理と保守的深度処理との間を動的に切り替えるための例示的プロセスを示すフローチャートである。図4に示すように、GPU12は、フラグメントシェーダ段階36の機能を実施するようにGPU12上で実行するフラグメントシェーダによる処理用に1つまたは複数のフラグメントを生成するためのラスタ化段階34の機能を実施することができる(62)。GPU12が、ラスタ化段階34の機能を実施した結果として、1つまたは複数のフラグメントを出力したことに応答して、深度論理ユニット54は、1つまたは複数のフラグメントについて、保守的深度処理それとも後期深度処理を実施するか判断し得る(64)。
深度論理ユニット54は、そのような判断を、フラグメントシェーダの作業負荷に少なくとも部分的に基づいて行い得る。具体的には、深度論理ユニット54は、フラグメントシェーダの作業負荷が、指定された閾値よりも高いかどうか判断し得る。深度論理ユニット54が、フラグメントシェーダの作業負荷が、指定された閾値よりも高いと判断した場合、深度論理ユニット54は、GPU12に、1つまたは複数のフラグメントについて保守的深度処理を実施させればよい。保守的深度処理を実施することの一部として、深度テストユニット48は、早期深度試験と後期深度試験の両方を実施し得る(66)。深度テストユニット48は、最終的にレンダリングされるシーン中のビューから隠蔽されるべきであると深度テストユニット48が判断するどのフラグメントも破棄してよく、残りの1つまたは複数のフラグメントを、フラグメントシェーダによる処理のために出力すればよい。深度テストユニット48によって実施される早期深度試験は、フラグメントシェーダによって処理されない1つまたは複数のフラグメントを破棄することができるので、深度論理ユニット54は、フラグメントシェーダ段階36における負荷を減少することができ、そうすることによって、フラグメントシェーダによる処理のためにより少ないフラグメントを与え得ることによって、GPUの性能を向上する。
対照的に、深度論理ユニット54が、フラグメントシェーダの作業負荷が、指定された閾値よりも低いと判断した場合、深度論理ユニット54は、深度テストユニット48が1つまたは複数のフラグメントの早期深度試験を実施することなく、フラグメントシェーダによる処理用の入力として1つまたは複数のフラグメントを与えることによって、GPU12に、1つまたは複数のフラグメントについて後期深度処理を実施させればよい。この場合、フラグメントシェーダの比較的低い作業負荷により、フラグメントシェーダは、GPU12の性能を低下させることなく、フラグメントを処理することが可能であり得る。
GPU12は、保守的深度処理のケースでは、深度テストユニット48から出力された残りの1つもしくは複数のフラグメントを、または、後期深度処理のケースでは、ラスタ化段階34の機能を実施するラスタライザハードウェアによって生成された1つもしくは複数のフラグメントを処理するために、フラグメントシェーダ段階36の機能を実施するためのフラグメントシェーダを実行することができる(68)。深度テストユニット48は、フラグメントシェーダによって出力された1つまたは複数のフラグメントの深度試験を実施することができる(70)。深度テストユニット48は、最終的にレンダリングされるシーン中のビューから隠蔽されるべきであると深度テストユニット48が判断するどのフラグメントも破棄してよく、残りの1つまたは複数のフラグメントについての値をフレームバッファ16に書き込んでよい(72)。
本開示のある態様によると、深度論理ユニット54は、1つまたは複数のフラグメントの深度試験を実施するための、深度テストユニット48の利用可能性に少なくとも部分的に基づいて、GPU12のラスタライザによって生成された1つまたは複数のフラグメントについて、保守的深度処理それとも後期深度処理を実施するかをさらに判断することができる。単一の深度テストユニット48が、保守的深度処理のケースでは早期深度試験を、および保守的深度処理と後期深度処理の両方のケースでは後期深度試験を実施する。したがって、フラグメントシェーダ段階36の機能を実施するようにプログラム可能処理ユニット42上で実行するフラグメントシェーダによって出力されたフラグメントならびにラスタ化段階34の機能を実施するラスタライザハードウェアによって生成されたフラグメントは両方とも、所与のクロック周期において、深度テストユニット48が深度試験を実施するための入力として利用可能であり得る。
図5は、深度テストユニット48の作業負荷にさらに少なくとも部分的に基づく、後期深度処理と保守的深度処理との間を動的に切り替えるための例示的プロセスを示すフローチャートである。図5に示すように、GPU12のラスタライザ(たとえば、固定機能処理ユニット44の1つまたは複数のハードウェアユニット)など、GPU12のアップストリームユニットが、入手可能な1つまたは複数のフラグメントを生成し得る(82)。
1つまたは複数のフラグメントがアップストリームユニットから入手可能であることに応答して、深度論理ユニット54は、深度テストユニット48の利用可能性に少なくとも部分的に基づいて、入手可能な1つまたは複数のフラグメントについて、保守的深度処理それとも後期深度処理を実施するか判断し得る。具体的には、深度論理ユニット54は、深度テストユニット48の利用可能性を判断することができ、深度テストユニット48の利用可能性に少なくとも基づいて、1つまたは複数のフラグメントについて保守的深度処理それとも後期深度処理を実施するか判断することができる(84)。上述したように、フラグメントシェーディングに先立つ(保守的深度処理のケース)およびフラグメントシェーディングの後(後期深度処理と保守的深度処理の両方のケース)の両方において、同じ深度テストユニット48が、フラグメントの深度試験を実施するのに使用され得る。したがって、いくつかの事例では、深度テストユニット48は、フラグメントシェーダによって出力される1つまたは複数のフラグメントに対して深度テストを実施するのに忙しい場合があり、アップストリームユニットから入手可能な1つまたは複数のフラグメントに対して深度テストを実施するために利用可能でない場合がある。
深度論理ユニット54は、深度テストユニット48の作業負荷が、アップストリームユニットから入手可能な1つまたは複数のフラグメントに対して深度テストを実施するのに高すぎるかどうかを、フラグメントが、深度論理ユニット54による処理のためにフラグメントシェーダから入手可能かどうかに少なくとも部分的に基づいて判断することができる(84)。深度テストユニット48は、フラグメントシェーダによって出力されるフラグメントの処理を、ラスタライザによって生成された1つまたは複数のフラグメントよりも優先してよい。したがって、フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48によって処理されるのに利用可能な場合、深度テストユニット48は、ラスタライザによって生成された1つまたは複数のフラグメントの深度試験を実施する代わりに、それらのフラグメントの深度試験を実施することができる。一方、フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48によって処理されるのに利用可能でない場合、深度テストユニット48は、ラスタライザによって生成された1つまたは複数のフラグメントに対して深度試験を実施するのに利用可能であり得る。したがって、フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48によって処理されるのに利用可能でない場合、深度論理ユニット54は、ラスタライザによって生成された1つまたは複数のフラグメントに対して保守的深度処理を実施すればよい(86)。言い換えると、深度テストユニット48は、ラスタライザによって生成された1つまたは複数のフラグメントに対して自由に深度試験を実施するので、深度論理ユニット54は、GPU12が、深度テストユニット48に、1つまたは複数のフラグメントがフラグメントシェーダによって処理される(すなわち、早期深度試験)のに先立って1つまたは複数のフラグメントの深度試験を実施するよう命じることによって、1つまたは複数のフラグメントに対して保守的深度処理を実施すると判断することができる。
フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48向けの入力として利用可能な場合、深度テストユニット48は、アップストリームユニットから入手可能な1つまたは複数のフラグメントに対して深度試験を実施する代わりに、フラグメントシェーダから出力されたフラグメントに対して深度試験を実施することができる。したがって、深度論理ユニット54は、現在のクロック周期中は1つまたは複数のフラグメントに対して保守的深度処理を実施しないと判断してよい。そうではなく、フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48がそれらのフラグメントに対して深度処理を実施するのに利用可能であると判断したことに応答して、深度論理ユニット54は、1つまたは複数のフラグメントを処理する性能が、1つまたは複数のフラグメントに対して後期深度処理を実施することによって向上されるかどうか判断するために、フラグメントシェーダの作業負荷を判断すればよい(88)。
具体的には、深度論理ユニット54は、フラグメントシェーダの作業負荷が、指定された閾値よりも低いかどうか判断し得る。フラグメントシェーダの作業負荷が、指定された閾値を下回る場合、深度論理ユニット54は、フラグメントシェーダによる処理に先立って深度テストユニット48が1つまたは複数のフラグメントに対して深度試験を実施することなく、フラグメントシェーダが1つまたは複数のフラグメントを処理することによって、1つまたは複数のフラグメントの処理が改善されると判断してよい。したがって、フラグメントシェーダの作業負荷が、指定された閾値を下回ると深度論理ユニット54が判断したことに応答して、GPU12は、ラスタライザによって生成された1つまたは複数のフラグメントに対して後期深度処理を実施してよく、この処理は、フラグメントシェーダが1つまたは複数のフラグメントを処理するのに先立って、深度テストユニット48が1つまたは複数のフラグメントの深度試験を実施することなく、ラスタライザによって生成された1つまたは複数のフラグメントをグラフィックスシェーダによって処理することを含む。
フラグメントシェーダの作業負荷が、指定された閾値よりも高い場合、深度論理ユニット54は、1つまたは複数のフラグメントの処理が、そのクロック周期中にフラグメントシェーダが1つまたは複数のフラグメントを処理することによって悪影響を受けると判断してよい。この場合、GPU12は、あるクロック周期について1つまたは複数のフラグメントを停止させてよく(90)、深度論理ユニット54が1つまたは複数のフラグメントを処理するのに利用可能かどうか判断し直すことによって、後続クロック周期における保守的深度処理それとも後期深度処理を実施するかを判断し直してよい(84)。
後続周期におけるプロセスは、図6に示すのと同じフローに従い得る。たとえば、後続クロック周期において、深度論理ユニット54が、1つまたは複数のフラグメントの深度試験を実施するのに依然として利用可能でない場合、深度論理ユニット54は、フラグメントシェーダの作業負荷を判断し直せばよい(88)。フラグメントシェーダの作業負荷が、指定された閾値よりも低い場合、深度論理ユニット54は、深度テストユニット48が1つまたは複数のフラグメントの早期深度テストを実施することなく、フラグメントシェーダによって1つまたは複数のフラグメントを処理することを含む、1つまたは複数のフラグメントの後期深度処理を、GPU12に実施させてよい(90)。
図6は、後期深度処理と保守的深度処理との間を動的に切り替えるための、図3のGPU12のハードウェアユニットをさらに詳細に示すブロック図である。図6に示すように、深度論理ユニット54は、マルチプレクサ52が、ラスタライザによって出力されたフラグメントそれともフラグメントシェーダによって出力されたフラグメントを、深度テストユニット48による処理のために転送するかを選択し得る。このようにして、深度論理ユニット54は、保守的深度試験が、ラスタライザによって出力されたフラグメントに対して実施されるかどうか判断する。上述したように、深度論理ユニット54は、フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48による処理のための準備ができているかどうか判断することができ、準備ができている場合、そのフラグメントを、深度テストユニット48によって処理されるために選択してよい。フラグメントシェーダによって出力されたフラグメントが、深度テストユニット48による処理のための準備ができていない場合、深度論理ユニット54は代わりに、ラスタライザによって出力されたフラグメントを、深度テストユニット48による処理のために選択すればよい。
シェーダ入力バッファ50は、プロセッサクラスタ46上で実行するフラグメントシェーダによって処理されるべきフラグメントを記憶することができる。このようにして、シェーダ入力バッファ50は、フラグメントが、フラグメントシェーダによってフラグメントシェーディングされるためのキューとして働く。深度論理ユニット54は、シェーダ入力バッファ50中に記憶されているデータの量、およびより具体的には、シェーダ入力バッファ50の容量と比較した、シェーダ入力バッファ50中に記憶されているデータの量に少なくとも部分的に基づいて、プロセッサクラスタ46上で実行するフラグメントシェーダの作業負荷を判断することができる。シェーダ入力バッファ50の容量の半分以下しか占めないことなどによって、シェーダ入力バッファ50中に記憶されているデータの量が閾値以下の場合、深度論理ユニット54は、フラグメントシェーダが軽負荷であると判断してよく、フラグメントシェーディングを実施するために、現在のクロック周期において、ラスタライザによって出力されたフラグメントを引き受けることが可能であり得る。一方、シェーダ入力バッファ50の容量の半分よりも多く占めることなどによって、シェーダ入力バッファ中に記憶されているデータの量が閾値よりも多い場合、深度論理ユニット54は、フラグメントシェーダが重負荷であると判断してよく、フラグメントシェーディングを実施するために、現在のクロック周期において、ラスタライザによって出力されたフラグメントを引き受けることができない場合がある。一例では、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値は、シェーダ入力バッファ50中に記憶されているデータの量がシェーダ入力バッファ50の容量の半分以下であるかどうかに基づくが、他の例では、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値は、シェーダ入力バッファ50中に記憶されているデータの量とシェーダ入力バッファ50の容量との間の他の任意の比に基づいてもよい。他の例では、フラグメントシェーダプログラムが軽負荷であるか、それとも重負荷であるかの間の閾値は、シェーダ入力バッファ50中に記憶されているデータの量に基づき得る。たとえば、シェーダ入力バッファ中に記憶されているデータの量が、10個またはそれよりも少ないフラグメントを含む場合、深度論理ユニット54は、フラグメントシェーダプログラムが軽負荷であると判断してよい。逆に、シェーダ入力バッファ中に記憶されているデータの量が、10個よりも多いフラグメントを含む場合、深度論理ユニット54は、フラグメントシェーダプログラムが重負荷であると判断してよい。
ラスタライザによって出力されたフラグメントが、深度テストユニット48によって処理される場合、GPU12は、深度テストユニット48による処理から生じるフラグメントをシェーダ入力バッファ50に記憶してよい。深度テストユニット48による処理から生じるそのようなフラグメントは、ラスタライザによって出力されたフラグメントよりも少ないフラグメントを含み得るが、それは、深度テストユニット48が、フラグメントのうちの1つまたは複数を、最終的にレンダリングされるシーン中のビューから隠蔽されるものとして破棄し得るからである。ラスタライザによって出力されたフラグメントが、深度テストユニット48によって処理されない場合、GPU12は、フラグメントシェーダが軽負荷または重負荷であると深度論理ユニット54が判断したかどうかに依存して、ラスタライザによって出力されたフラグメントをシェーダ入力バッファ50に記憶し得る。GPU12は、プロセッサクラスタ46上で実行するフラグメントシェーダによるフラグメントシェーディング用にフラグメントをキューイングするために、フラグメントをシェーダ入力バッファ50に記憶してよい。したがって、フラグメントシェーダが1つまたは複数のフラグメントを処理することは、GPU12が、前記1つまたは複数のフラグメントをシェーダ入力バッファ50に記憶することを含み得る。
図7は、後期深度処理と保守的深度処理との間を動的に切り替えるための例示的プロセスを示すフローチャートである。図7に示すように、プロセスは、GPU12によって、GPU12上で実行するフラグメントシェーダプログラムの作業負荷を判断すること(702)を含み得る。プロセスは、GPU12によって、フラグメントシェーダプログラムの作業負荷を閾値と比較すること(704)をさらに含み得る。プロセスは、フラグメントシェーダプログラムの作業負荷が閾値よりも低いと判断したことに応答して、フラグメントシェーダプログラムによる処理の前に、GPU12によって1つまたは複数のフラグメントの早期深度試験を実施することなく、フラグメントシェーダプログラムによって1つまたは複数のフラグメントを処理すること(706)をさらに含み得る。プロセスは、フラグメントシェーダプログラムによる処理の後、GPU12によって、1つまたは複数の非隠蔽フラグメントを生じるように1つまたは複数のフラグメントの後期深度試験を実施すること(708)をさらに含み得る。プロセスは、GPU12によって、1つまたは複数の非隠蔽フラグメントについてのピクセル値をフレームバッファ16に書き込むこと(710)をさらに含み得る。
いくつかの例では、フラグメントシェーダプログラムの作業負荷を判断することは、GPU12によって、フラグメントシェーダプログラムによって出力された第2の1つまたは複数のフラグメントが、GPU12が第2の1つまたは複数のフラグメントに対して深度試験を実施するための入力として利用可能であると判断したことに応答する。いくつかの例では、プロセスは、GPU12のラスタライザによって生成された1つまたは複数のフラグメントの各トランザクションについて、GPU12のラスタライザによって生成されたそれぞれの1つまたは複数のフラグメントの早期深度試験を実施するかどうかを、GPU12によって判断することをさらに含む。
いくつかの例では、プロセスは、フラグメントシェーダプログラムの作業負荷が閾値よりも高いと判断したことに応答して、後続クロック周期においてフラグメントシェーダプログラムの後続作業負荷を判断し直すこと、およびフラグメントシェーダプログラムの後続作業負荷が閾値よりも低いと判断し直したことに応答して、GPU12によって、1つまたは複数のフラグメントの早期深度試験を実施することなく、フラグメントシェーダプログラムによって、1つまたは複数のフラグメントを処理することをさらに含む。
いくつかの例では、プロセスは、GPU12のラスタライザが、フラグメントシェーダプログラムによって処理されるべき第2の1つまたは複数のフラグメントを出力したことに応答して、フラグメントシェーダプログラムによって出力された第3の1つまたは複数のフラグメントが、GPU12が第3の1つまたは複数のピクセルに対して深度試験を実施するための入力として利用可能であるかどうかに少なくとも部分的に基づいて、後続クロック周期におけるGPU12によって、第2の1つまたは複数のフラグメントの早期深度試験を実施するかどうか判断することをさらに含む。いくつかの例では、プロセスは、第3の1つまたは複数のフラグメントが、GPU12が第3の1つまたは複数のフラグメントに対して深度試験を実施するための入力として利用可能でないと判断したことに応答して、GPU12によって、第2の1つまたは複数のフラグメントに対して深度試験を実施することをさらに含む。いくつかの例では、プロセスは、フラグメントシェーダプログラムによって、第2の1つまたは複数のフラグメントに対して深度試験を実施したことから生じた第4の1つまたは複数のフラグメントを処理することをさらに含む。いくつかの例では、プロセスは、GPU12によって、第4の1つまたは複数のフラグメントの後期深度試験を実施することをさらに含む。
いくつかの例では、フラグメントシェーダプログラムの作業負荷を判断することは、フラグメントシェーダ用に、シェーダ入力バッファ50中に記憶されたデータの量に少なくとも部分的に基づく。いくつかの例では、フラグメントシェーダプログラムの作業負荷が閾値よりも低いと判断することは、シェーダ入力バッファ50中に記憶されているデータの量が、シェーダ入力バッファ50の容量の半分以下であると判断することを含む。
いくつかの例では、プロセスは、GPU12のラスタライザが、後続クロック周期において、フラグメントシェーダプログラムによって処理されるべき第2の1つまたは複数のフラグメントを出力したのに応答して、GPU12によって、後続クロック周期におけるフラグメントシェーダプログラムの作業負荷を判断し直すことをさらに含む。いくつかの例では、プロセスは、後続クロック周期における、フラグメントシェーダプログラムの判断し直された作業負荷が、指定された閾値よりも高いことに応答して、フラグメントシェーダプログラムによる第2の1つまたは複数のフラグメントの処理に先立って、GPU12によって、第2の1つまたは複数のフラグメントの早期深度処理を実施することをさらに含む。
1つまたは複数の例では、説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せにおいて実装され得る。ソフトウェアにおいて実装される場合、機能は、1つもしくは複数の命令もしくはコードとして、コンピュータ可読媒体上に記憶されてもよく、またはコンピュータ可読媒体を介して送信されてもよい。コンピュータ可読媒体は、コンピュータデータ記憶媒体、またはコンピュータプログラムを1つの場所から別の場所に転送することを容易にする任意の媒体を含む通信媒体を含むことができる。データ記憶媒体は、本開示で説明する技法の実装のための命令、コードおよび/またはデータ構造を取り出すために、1つもしくは複数のコンピュータまたは1つもしくは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく例として、そのようなコンピュータ可読媒体は、RAM、ROM、EEPROM、CD-ROMもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気記憶デバイス、または命令もしくはデータ構造の形式の所望のプログラムコードを搬送もしくは記憶するために使用可能であり、コンピュータによってアクセス可能な任意の他の媒体を含み得る。また、任意の接続が、適切にコンピュータ可読媒体と呼ばれる。たとえば、ソフトウェアが、同軸ケーブル、光ファイバケーブル、ツイストペア、デジタル加入者回線(DSL)、または赤外線、無線、およびマイクロ波などのワイヤレス技術を使用して、ウェブサイト、サーバ、または他のリモートソースから送信される場合、同軸ケーブル、光ファイバケーブル、ツイストペア、DSL、または赤外線、無線、およびマイクロ波などのワイヤレス技術は媒体の定義に含まれる。本明細書で使用するディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピーディスク(disk)、およびブルーレイディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、レーザーを用いてデータを光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲に含まれるべきである。
コードは、1つもしくは複数のデジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、または他の均等な集積論理回路もしくはディスクリート論理回路構成などの1つまたは複数のプロセッサによって実行され得る。したがって、本明細書で使用する「プロセッサ」および「処理ユニット」という用語は、前述の構造、または本明細書で説明する技法の実装に適した任意の他の構造のいずれかを指す場合がある。加えて、いくつかの態様では、本明細書で説明した機能性は、符号化および復号のために構成された専用のハードウェアモジュールおよび/またはソフトウェアモジュール内で提供されてもよく、または複合コーデックに組み込まれてもよい。また、技法は、1つまたは複数の回路または論理要素において完全に実装され得る。
本開示の技法は、ワイヤレスハンドセット、集積回路(IC)またはICのセット(すなわち、チップセット)を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を実施するように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットは、必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上記で説明したように、様々なユニットは、コーデックハードウェアユニットにおいて結合されてもよく、または適切なソフトウェアおよび/もしくはファームウェアとともに、上記で説明したような1つもしくは複数のプロセッサを含む相互動作可能なハードウェアユニットの集合によって提供されてもよい。様々な例が説明された。これらおよび他の例は、以下の特許請求の範囲内である。