[0018]本開示は、グラフィックス処理ユニット(GPU)プロセスをスケジュールするためのプリエンプション技法を対象とする。プリエンプションは、プロセッサ(たとえば、GPU)に、コマンドの第2のセットのために、コマンドの第1のセットの実行を停止し、次いで、コマンドの第2のセットの実行を完了した後に、コマンドの第1のセットの実行を完了することを行わせることを指す。たとえば、GPUは、コマンドのより高い優先度のセットのために、コマンドの低優先度セット実行をプリエンプトし得る。
[0019]コマンドの相対的高優先度セットの一例は、グラフィカルユーザインターフェース(GUI)をレンダリングするためのコマンドである。GPUは、ユーザインターフェース(UI)レンダリングのためにますます使用されている。UIコマンドストリームは、一般に、ユーザがUIにおいて期待することになった適切な視覚効果および応答性を達成するために適時にサービスされることから恩恵を受ける。高優先度UIコマンドストリームが、GPU上で実行されるために、ホストCPUによってキューイングされたとき、GPUは、たとえば、非UIグラフィックスコンテキスト、または汎用コンピューティングタスク(すなわち、グラフィックス処理ユニット上での汎用コンピューティング(GPGPU:general-purpose computing on graphics processing unit)タスク)を実施するためにGPUを使用するコンテキストなど、より低い優先度を有する異なるコンテキストに関連する別のキューイングされたコマンドストリームを実行していることがある。より高い優先度のUIコマンドストリームを実行するより前に、より低い優先度のコンテキストが実行を完了するのを待つことは、いくつかの場合には、UIに関する許容できるユーザエクスペリエンスをもたらさないことがある。
[0020]より低い優先度のコマンドまたは低優先度コマンド、およびより高い優先度のコマンドまたは高優先度コマンドは、コマンドの適時の実行の重要性を示すために使用される相対語である。一例として、ユーザエクスペリエンスを妨害しないようにできるだけ速く実行されるべきであるコマンドは、実行がわずかに遅延されたとしても、ユーザエクスペリエンスを大幅に低下させないであろうコマンドと比較して、より高い優先度のものになる。一例として、UIコマンドの実行が遅延された場合、ユーザエクスペリエンスは、ユーザ対話に対する応答が遅延されることになるので、悪影響を及ぼされることになる。バックグラウンドで起こるいくつかの行列演算のためのコマンドの実行が遅延された場合、ユーザエクスペリエンスに対する影響はほとんどないことがある。
[0021]ユーザエクスペリエンスのみに基づく以外に、コマンドを、より高い優先度またはより低い優先度とみなすための他の方法があり得る。本開示は、コマンドのあるセットからコマンドの別のセットに切り替えることの例について説明するために、より高い優先度およびより低い優先度という用語を相対語として使用する。しかしながら、本開示で説明される技法は、必ずしも、コマンドの切替えが、低優先度コマンドから高優先度コマンドに遷移するためにのみ行われる例に限定される必要があるとは限らない。
[0022]コマンドの第1のセットの実行の完了の前に、コマンドの第1のセットを実行することからコマンドの第2のセットに切り替えることは、GPUコンテキスト切替えまたはプリエンプションと呼ばれる。コンテキスト切替えまたはプリエンプションは、仮想化、UI、グラフィックス/計算アプリなどのような様々なGPU作業負荷、ならびに様々なコマンドの適時フォワードプログレスについてのハードウェア加速に有用である。たとえば、レンダリング遅延が望ましくないかまたは許容できないことがある、バーチャルリアリティ(タイムワープ、フレームごとの要件)および自動車使用など、新しい使用事例により、より頻繁なプリエンプションの必要が生じている。
[0023]この問題に対する1つのソリューションは、ホストCPUが、より高い優先度のコマンドストリームを最初に実行することが有益であるかまたは望ましいと決定したときはいつでも、ホストCPUが、任意のポイントにおいてより低い優先度のコマンドストリームの実行をプリエンプトし、より高い優先度のコマンドストリームをサービスすることを可能にすることである。しかしながら、そのようなソリューションは、GPUコマンドストリーム中のそのような任意のポイントにおいて、GPU中でコンテキスト切替えを実施するために必要とされるオーバーヘッド(たとえば、追加の処理時間、追加のメモリ帯域幅使用、および/または追加のメモリ使用量)に関して費用がかかることがある。
[0024]いくつかのGPUは、描画呼出しレベルプリエンプション(たとえば、発行された描画呼出しが完了された後のプリエンプション)を与える。描画呼出しは、レンダリングされるべきである複数のプリミティブを定義し得る。しかしながら、描画呼出しレベルプリエンプションは、(たとえば、1つのビンまたはスクリーンをカバーするための)大型の三角形の場合など、いくつかの場合に不十分であり得る。そのような問題に対処するために、よりきめ細かいプリエンプションが有用であり得る。ブラインドフリーズおよび保存復元(blind freeze and save-restore)(たとえば、すべての機能を停止し、GPUのステージのすべてのすべての状態情報を記憶すること)は、費用がかかり、したがって、効率的なソリューションでないことがある。
[0025]概して、GPU中の頂点シェーダステージは、一般に高速で、頂点の数がジオメトリのサイズにかかわらず同じであるので(たとえば、三角形のサイズにかかわらず、三角形の場合は3つの頂点)、所与のジオメトリについて一定である。GPU中のピクセルシェーダステージは時間がかかり得る(たとえば、作業負荷は、ジオメトリとは無関係に解像度によって変動する)。たとえば、頂点シェーダステージの作業負荷は、異なるサイズの三角形について同じであり得るが、ピクセルシェーダステージの作業負荷は、異なるサイズの三角形について異なり得る。たとえば、長く細い三角形は、長く太い三角形よりも少ないピクセルを有し、したがって、長く太い三角形についての作業負荷は、長く細い三角形についての作業負荷よりも多い。一例として、第1の三角形の頂点についての座標が、(0,0)、(1,15)、および(2,0)であると仮定する。この例では、第1の三角形は、長い(たとえば、長さが15ユニット)が、細い(たとえば、幅が2ユニットのみ)。第2の三角形の頂点についての座標が、(0,0)、(10,15)、および(20,0)であると仮定する。この例では、第2の三角形は、第1の三角形と同じくらい長い(たとえば、長さが15ユニット)が、太い(たとえば、幅が20ユニット)。第1の三角形よりも第2の三角形中に多くのピクセルがあり、したがって、第2の三角形についての作業負荷は、第1の三角形よりも多い。また、解像度は、ピクセルシェーダステージについての作業負荷に影響を及ぼし得る。320×320解像度における長く細い三角形についての作業負荷は、1080pフルHD解像度についてのそれほど著しくないことがある。
[0026]本開示は、ピクセルタイルレベル(グラニュラリティ(granularity))プリエンプションの例について説明する。たとえば、通常動作では、頂点シェーダステージは、(フラグメントシェーダステージとも呼ばれる)ピクセルシェーダステージにデータを受け渡す。しかしながら、GPUがプリエンプションのための命令を受信したとき、GPUは、すべての頂点シェーダステージをフラッシュ(たとえば、完了)するが、代わりに、外部メモリにデータを動的に向け得る。このようにして、いくつかの例では、プリエンプションは、頂点シェーダステージの実行の後であるが、描画呼出しのピクセルシェーダの実行の前に、行われる。また、GPUは、頂点シェーダステージからのデータがオンチッププロセスを介してフラグメントシェーダステージに移るかどうか、または頂点シェーダステージデータが外部メモリにオフチップで転送されるかどうかを動的に決定し得る。プリエンプトされたコンテキストを再開するとき、データは、外部メモリから読み取られ、グラフィックスパイプラインにフィードバックされる。
[0027]本開示で説明される技法では、GPUは、(たとえば、CPUから)描画呼出しを受信したことに応答して、GPUのグラフィックスパイプラインを介して、コマンドの第1のセットを実行する。描画呼出しは、コマンドの第1のセットによってレンダリングされるべきである複数のプリミティブを定義し、グラフィックスパイプラインは、コマンドの第1のセットの実行中に生成されたデータを、GPUのローカルメモリに記憶するように構成される。GPUがコマンドのより高い優先度のセット(たとえば、コマンドの第2のセット)を実行する必要に基づいて、GPUは、コマンドの第1のセットの実行中に、および1つまたは複数のプリミティブのすべてをレンダリングするより前に、(たとえば、CPUから)プリエンプション通知を受信し得、プリエンプション通知を受信したことに応答して、GPUは、コマンドの第1のセットのうちの1つまたは複数のコマンドの実行中に生成された中間データを、GPUの外部にあるメモリに出力するように、GPUのグラフィックスパイプラインステージの相互接続を動的に構成する。GPUは、次いで、コマンドの第2のセット(たとえば、コマンドの第1のセットに対するより高い優先度のコマンド)を実行するために、描画呼出しの複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を完了するより前に、コマンドの第1のセットの実行をプリエンプトし得る。
[0028]図1は、本開示の技法を実装するために使用され得る例示的なコンピューティングデバイス2を示すブロック図である。コンピューティングデバイス2は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームまたはコンソール、ワイヤレス通信デバイス(たとえば、携帯電話、セルラー電話、衛星電話、および/または携帯電話ハンドセットなど)、固定電話、インターネット電話、ポータブルビデオゲームデバイスまたは携帯情報端末(PDA)などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、あるいはグラフィカルデータを処理および/または表示する任意の他のタイプのデバイスを備え得る。
[0029]図1の例に示されているように、コンピューティングデバイス2は、ユーザ入力インターフェース4と、CPU6と、メモリコントローラ8と、システムメモリ10と、グラフィックス処理ユニット(GPU)12と、GPU12のローカルメモリ14と、ディスプレイインターフェース16と、ディスプレイ18と、バス20とを含む。ユーザ入力インターフェース4、CPU6、メモリコントローラ8、GPU12およびディスプレイインターフェース16は、バス20を使用して互いと通信し得る。バス20は、第3世代バス(たとえば、HyperTransportバスまたはInfiniBandバス)、第2世代バス(たとえばアドバンストグラフィックスポートバス、周辺構成要素相互接続(PCI)エクスプレスバス、またはアドバンストエクステンシブルインターフェース(AXI:Advanced eXentisible Interface)バス)、あるいは別のタイプのバスまたはデバイスの相互接続などの様々なバス構造のいずれかであり得る。図1に示されている異なる構成要素間のバスおよび通信インターフェースの特定の構成は例にすぎず、コンピューティングデバイスの他の構成および/あるいは同じまたは異なる構成要素をもつ他のグラフィックス処理システムが、本開示の技法を実装するために使用され得ることに留意されたい。
[0030]CPU6は、コンピューティングデバイス2の動作を制御する汎用プロセッサまたは専用プロセッサを備え得る。ユーザは、CPU6に1つまたは複数のソフトウェアアプリケーションを実行させるためにコンピューティングデバイス2に入力を与え得る。CPU6上で実行するソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、ユーザ入力インターフェース4を介してコンピューティングデバイス2に結合されたキーボード、マウス、マイクロフォン、タッチパッド、または別の入力デバイスなどの1つまたは複数の入力デバイス(図示せず)を介して、コンピューティングデバイス2に入力を与え得る。
[0031]CPU6上で実行するソフトウェアアプリケーションは、ディスプレイ18へのグラフィックスデータのレンダリングを行わせるようにCPU6に命令する1つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、たとえば、オープングラフィックスライブラリ(OpenGL(登録商標):Open Graphics Library)アプリケーションプログラミングインターフェース(API)、オープングラフィックスライブラリ組込みシステムズ(OpenGL ES:Open Graphics Library Embedded Systems)API、Direct3D API、X3D API、RenderMan API、WebGL API、あるいは任意の他の公開またはプロプライエタリ規格グラフィックスAPIなどのグラフィックスAPIに準拠し得る。グラフィックスレンダリング命令を処理するために、CPU6は、GPU12にグラフィックスデータのレンダリングの一部または全部を実施させるために、1つまたは複数のグラフィックスレンダリングコマンドをGPU12に発行し得る。いくつかの例では、レンダリングされるべきグラフィックスデータは、グラフィックスプリミティブのリスト、たとえば、点、線、三角形、四角形、三角形ストリップなどを含み得る。
[0032]メモリコントローラ8は、システムメモリ10に入るおよびそれから出るデータの転送を可能にする。たとえば、メモリコントローラ8は、コンピューティングデバイス2中の構成要素にメモリサービスを提供するために、メモリ読取りおよび書込みコマンドを受信し、メモリ10に関するそのようなコマンドをサービスし得る。メモリコントローラ8はシステムメモリ10に通信可能に結合される。メモリコントローラ8は、CPU6とシステムメモリ10の両方とは別個である処理モジュールであるものとして図1の例示的なコンピューティングデバイス2中に示されているが、他の例では、メモリコントローラ8の機能の一部または全部は、CPU6とシステムメモリ10の一方または両方の上で実装され得る。
[0033]システムメモリ10は、CPU6が実行するためにアクセス可能であるプログラムモジュールおよび/または命令、ならびに/あるいはCPU6上で実行しているプログラムによる使用のためのデータを記憶し得る。たとえば、システムメモリ10は、ユーザアプリケーションと、アプリケーションに関連するグラフィックスデータとを記憶し得る。システムメモリ10は、コンピューティングデバイス2の他の構成要素による使用のための情報、および/または他の構成要素によって生成される情報をさらに記憶し得る。たとえば、システムメモリ10は、GPU12のためのデバイスメモリとして働き得、GPU12によってそれに対して演算されるべきデータ、ならびにGPU12によって実施される演算から生じるデータを記憶し得る。たとえば、システムメモリ10は、テクスチャバッファ、深度バッファ、ステンシルバッファ、頂点バッファ、フレームバッファなどの任意の組合せを記憶し得る。さらに、システムメモリ10は、GPU12による処理のためのコマンドストリームを記憶し得る。システムメモリ10は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、読取り専用メモリ(ROM)、消去可能プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM(登録商標))、フラッシュメモリ、磁気データ媒体または光記憶媒体など、1つまたは複数の揮発性または不揮発性メモリまたはストレージデバイスを含み得る。
[0034]GPU12は、1つまたは複数のグラフィックスプリミティブをディスプレイ18にレンダリングするためにグラフィックス演算を実施するように構成され得る。したがって、CPU6上で実行しているソフトウェアアプリケーションのうちの1つがグラフィックス処理を必要とするとき、CPU6は、ディスプレイ18にレンダリングするためのグラフィックスコマンドおよびグラフィックスデータをGPU12に与え得る。グラフィックスコマンドは、たとえば、描画呼出しなどの描画コマンド、GPU状態プログラミングコマンド、メモリ転送コマンド、汎用コンピューティングコマンド、カーネル実行コマンドなどを含み得る。いくつかの例では、CPU6は、コマンドとグラフィックスデータとを、GPU12によってアクセスされ得るメモリ10に書き込むことによって、コマンドとグラフィックスデータとをGPU12に与え得る。いくつかの例では、GPU12は、CPU6上で実行しているアプリケーションのための汎用コンピューティングを実施するようにさらに構成され得る。
[0035]GPU12は、いくつかの事例では、ベクトル演算の、CPU6よりも効率的な処理を行う高度並列構造を用いて構築され得る。たとえば、GPU12は、複数の頂点またはピクセル上で並列様式で演算するように構成された複数の処理要素を含み得る。GPU12の高度並列性質は、いくつかの事例では、GPU12が、CPU6を使用して直接ディスプレイ18にシーンを描画するよりも速く、グラフィックス画像(たとえば、GUI、ならびに2次元(2D)および/または3次元(3D)グラフィックスシーン)をディスプレイ18上に描画することを可能にし得る。さらに、GPU12の高度並列性質は、GPU12が、CPU6よりも速く、汎用コンピューティングアプリケーションのためのいくつかのタイプのベクトルおよび行列演算を処理することを可能にし得る。
[0036]GPU12は、いくつかの事例では、コンピューティングデバイス2のマザーボードに組み込まれ得る。他の事例では、GPU12は、コンピューティングデバイス2のマザーボード中のポート中に設置されたグラフィックスカード上に存在し得るか、または場合によっては、コンピューティングデバイス2と相互動作するように構成された周辺デバイス内に組み込まれ得る。さらなる事例では、GPU12は、システムオンチップ(SoC)を形成するCPU6と同じマイクロチップ上に配置され得る。GPU12は、1つまたは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、あるいは他の等価な集積またはディスクリート論理回路など、1つまたは複数のプロセッサを含み得る。
[0037]GPU12はGPUローカルメモリ14に直接結合され得る。したがって、GPU12は、必ずしもバス20を使用せずに、GPUローカルメモリ14からデータを読み取り、GPUローカルメモリ14にデータを書き込み得る。言い換えれば、GPU12は、オフチップメモリの代わりに、ローカルストレージを使用してデータをローカルに処理し得る。これは、GPU12が、重いバストラフィックを経験し得る、バス20を介したデータの読取りおよび書込みを行う必要をなくすことによって、GPU12がより効率的な様式で動作することを可能にする。しかしながら、いくつかの事例では、GPU12は、別個のキャッシュを含まないことがあるが、代わりに、バス20を介してシステムメモリ10を利用し得る。GPUローカルメモリ14は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体または光記憶媒体など、1つまたは複数の揮発性または不揮発性メモリあるいはストレージデバイスを含み得る。
[0038]CPU6および/またはGPU12は、レンダリングされた画像データを、システムメモリ10内で割り振られたフレームバッファに記憶し得る。ディスプレイインターフェース16は、フレームバッファからデータを取り出し、レンダリングされた画像データによって表される画像を表示するようにディスプレイ18を構成し得る。一部の例では、ディスプレイインターフェース16は、フレームバッファから取り出されたデジタル値を、ディスプレイ18によって消費可能なアナログ信号に変換するように構成されたデジタルアナログ変換器(DAC)を含み得る。他の例では、ディスプレイインターフェース16は、処理のために、デジタル値をディスプレイ18に直接受け渡し得る。ディスプレイ18は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ(LCD)、プラズマディスプレイパネル、発光ダイオード(LED)アレイ、陰極線管(CRT)ディスプレイ、電子ペーパー、表面伝導電子放出ディスプレイ(SED)、レーザーテレビジョンディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ18は、コンピューティングデバイス2内に組み込まれ得る。たとえば、ディスプレイ18は、携帯電話ハンドセットまたはタブレットコンピュータのスクリーンであり得る。代替的に、ディスプレイ18は、ワイヤードまたはワイヤレス通信リンクを介してコンピューティングデバイス2に結合されたスタンドアロンデバイスであり得る。たとえば、ディスプレイ18は、ケーブルまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
[0039]本開示で説明される技法はプリエンプションに関する。プリエンプションでは、GPU12は、コマンドのあるセットの実行を休止し、コマンドの別のセットを完了まで実行し、次いで、コマンドの元のセットの実行を完了し得る。たとえば、GPU12は、CPU6が、より高い優先度のコマンドの別のセットが実行されるべきであると決定したとき、コマンドのセットを実行していることがある。一例として、GPU12は、CPU6が、ユーザが、タッチスクリーンであり得るディスプレイ18を用いて対話したことに応答して、ユーザインターフェースのためのコマンドが最初に実行すべきであると決定したとき、ビデオゲームのコンテンツを生成するためのコマンドを実行している。この例では、GPU12は、ビデオゲームのためのコマンドの実行を完了することが遅延されるとしても、ユーザインターフェースを生成するためのコマンドを実行することを完了し得る。
[0040]いくつかの場合には、GPU12は、描画呼出しレベルプリエンプションを与えるように構成され得る。たとえば、プリエンプションは、描画呼出し境界においてのみ可能にされ得る。この例では、GPU12が、描画呼出しを実行し始め、次いで、プリエンプトするようにとの命令を受信した場合、GPU12は、描画呼出しの実行の完了(たとえば、ピクセルタイルのレンダリングのためのピクセルシェーダの実行を完了する)まで、プリエンプトすることができない。
[0041]しかしながら、描画呼出し境界においてのみプリエンプションを受けることは、いくつかの場合では望ましくないことがある。たとえば、「プリミティブのグループ」のための描画呼出しを完了することは、(たとえば、頂点シェーダ、ピクセルシェーダ、他のシェーダ、および描画呼出しに応答する固定機能ユニットの機能のすべての実行により)長い時間がかかり、より高い優先度のコマンドの実行を遅延させ得る。より多くの例として、シングルプリミティブレベルプリエンプションも不十分であり得、描画呼出しレベルプリエンプションは、(たとえば、1つのビンまたはスクリーンをカバーするための)大型の三角形の場合、うまく機能しないことがある。描画呼出しは、レンダリングされるべきである複数のプリミティブを定義し得る。
[0042]本開示は、よりきめ細かいプリエンプション(たとえば、描画呼出し境界において行われる必要がないプリエンプション)のための例示的な技法について説明する。例示的な技法は上記の問題に対処し得る。いくつかの場合には、VRのような作業負荷は、タイムワープ(フレームごと)をサポートするための描画呼出し境界よりも細かいグラニュラリティのプリエンプションから恩恵を受け得る。本開示で説明される技法は、そのようなより細かいグラニュラリティのプリエンプションを与え得る。
[0043]いくつかの技法では、GPU12のブラインドフリーズおよび保存復元が、(たとえば、描画呼出し境界の中間についての)よりきめ細かいプリエンプションのために利用され得る。ブラインドフリーズおよび保存復元は、GPU12のすべての状態が、それらのそれぞれの状態において直ちにフリーズされ、次いで、それらの状態を示す情報が、GPU12の後の検索および復元のために記憶されることを意味する。しかしながら、GPU12のブラインドフリーズおよび保存復元は、処理および電力、ならびにGPU12のあまりに多くのリソースを独占することに関して、費用がかかりすぎることがある。
[0044]概して、CPU6は、GPU12にグラフィックスデータを処理させるために描画呼出しを出力し、応答して、GPU12は、描画呼出しに関連するグラフィックスデータを処理する。描画呼出しに関連するグラフィックスデータの量は、可変であり得る(たとえば、数百個のプリミティブ、数千個のプリミティブ)。グラフィックスデータを処理するために、GPU12は、固定機能処理ステージとプログラマブル処理ステージとを含む(図4により詳細に示されている)グラフィックスパイプラインを含み、これらのステージの各々は、GPU12が最終処理されたグラフィックスデータを出力するまで、受信データを処理し、得られた中間データをさらなるための次のステージに出力し、それにより、パイプラインを形成する。
[0045]プログラマブルステージの例は、頂点シェーダと(フラグメントシェーダとも呼ばれる)ピクセルシェーダとを含む。頂点シェーダステージは、一般に、グラフィックスパイプラインについてのスループット制限でなく、ジオメトリについて一定である。ピクセルシェーダステージは、作業負荷が、一般に、ジオメトリとは無関係に解像度によって変動するので、スループット制限であり得る。
[0046]たとえば、頂点シェーダステージは、プリミティブの頂点上で演算を実施する。プリミティブのサイズにかかわらず、頂点シェーダステージの頂点シェーダがその上で演算する設定された数の頂点がある。プリミティブの一例は三角形であり、三角形がどのくらい大きいかにかかわらず、頂点シェーダの3つのインスタンス化が実行する必要があり、各々は三角形の1つの頂点を処理するためのものである。しかしながら、ピクセルシェーダステージにおけるピクセルシェーダのインスタンス化の数は、プリミティブによってカプセル化されるピクセルの数の関数であり得る。たとえば、ピクセルシェーダの1つのインスタンス化は、プリミティブの各ピクセルについて実行する。したがって、処理観点から、頂点シェーダステージのスループットは、決定可能で、比較的一定であり得るが、ピクセルシェーダステージのスループットは、可変であり得、処理より前に必ずしも決定可能であるとは限らないことがある。
[0047]一例では、GPU12は、プリエンプションのためのピクセルタイルレベル(グラニュラリティ)について構成され得る。たとえば、GPU12は、ピクセルの「グループ」をレンダリングした後にプリエンプトする(ただし、描画呼出しに関連するピクセルのすべてを必ずしもプリエンプトするとは限らないことがある)。ピクセルグループの最も小さいグラニュラリティは、通常、GPU12のラスタライザによって作用される「ピクセルタイル」である。図4に示されているラスタライザは、GPU12のグラフィックスパイプラインの固定機能ステージであり得る。この例では、GPU12は、ピクセルタイル(たとえば、描画呼出しに関連するピクセルのうちのいくつかであるが、必ずしも描画呼出しに関連するすべてのピクセルとは限らない)をラスタライズおよびシェーディングした後に、プリエンプトする(たとえば、コマンドの第1のセットのうちのコマンドのすべての実行が完了しなかった場合でも、コマンドの第1のセットを実行することからコマンドの第2のセットに切り替え得る)。ピクセルタイルサイズは、GPU12のベンダー/ファミリー/アーキテクチャに基づいて可変であり得る。
[0048]本開示では、例はグラフィックス処理に関して説明される。しかしながら、本開示で説明される技法は、そのように限定されず、非グラフィックスアプリケーション(たとえば、計算シェーダ)がGPU12上で実行する例に拡張する。描画呼出しおよびピクセルタイルという用語は、グラフィックスアプリケーションにもっぱら限定されると考えられるべきでなく、GPU12が計算シェーダ(たとえば、行列またはベクトル演算などのアプリケーションに関係する非グラフィックス)を実行しているときのための、類似するコマンドおよびデータのグループをカバーすると見なされるべきである。
[0049]上記で説明されたように、本開示で説明される技法は、GPU12が、描画呼出しの完了なしにプリエンプトすることを可能にする。グラフィックスデータを処理するために、GPU12は、頂点シェーダと、ラスタライザと、ピクセルシェーダとを含むグラフィックスパイプラインを実装する。グラフィックスパイプラインは、追加のステージ(たとえば、ドメインステージ、テッセレーション(tessellation)ステージ、およびハルステージ)を含み、頂点シェーダステージ、ラスタライザステージ、およびピクセルシェーダステージは、単に説明の目的で説明される。グラフィックスパイプラインは、2つの例としてのDX11パイプラインまたはOpenGLパイプラインに準拠し得るが、特定のパイプライン規格に必ずしも準拠しなければならないとは限らない。
[0050]描画呼出しを完了するために、GPU12は、グラフィックスパイプライン全体を通してグラフィックスデータを処理する。一例では、グラフィックスパイプラインのあるユニット(たとえば、頂点シェーダ)は、中間データを生成し、中間データをGPU12のローカルメモリ14に記憶し、パイプライン中の次のユニット(たとえば、ラスタライザまたはピクセルシェーダ)は、処理のためにこの中間データを取り出す。別の例では、頂点シェーダは、常に、中間データを外部メモリ(たとえば、システムメモリ10)に出力する。
[0051]本開示で説明される技法では、GPU12が、プリエンプトするようにとの命令を受信した場合、GPU12は、GPU12が、描画呼出しを完了する必要なしにプリエンプトすることができるように、中間データをシステムメモリ10に動的に出力する。システムメモリ10へのこの動的出力は、ホストプロセッサ(たとえば、CPU6)からの命令またはそれの知識なしに行われる。しかしながら、GPU12が、プリエンプトするようにとの命令を受信しない場合、GPU12のグラフィックスパイプラインのステージは、グラフィックスデータをローカルメモリ14に記憶する。
[0052]上記で説明されたように、グラフィックス処理を実施するために、GPU12は、ピクセルタイルと呼ばれるピクセルのグループに対して機能する。描画呼出しは1つまたは複数のプリミティブの処理を含み、各プリミティブは1つまたは複数のピクセルタイルを含み得る。いくつかの技法では、GPU12は、描画呼出しに関連するすべてのプリミティブのすべてのピクセルタイルがレンダリングされるまで、プリエンプトしないことになる。本開示で説明される技法では、GPU12は、レンダリングされる必要があるより多くのピクセルタイルがプリミティブ中にある、またはレンダリングされる必要があるより多くのプリミティブが描画呼出し中にある場合でも、プリミティブのピクセルタイルをレンダリングした後に、プリエンプトし得る。
[0053]したがって、本開示で説明される技法は、描画呼出しが1つまたは複数のプリミティブを含み、各プリミティブが1つまたは複数のピクセルタイルを含むので、描画呼出しプリエンプション(たとえば、描画呼出しの処理の後のプリエンプション)よりも細かいグラニュラリティである、ピクセルタイルレベルプリエンプション(たとえば、ピクセルタイルの処理の後のプリエンプション)を与える。GPU12が、プリエンプションの前に、描画呼出しに関連するすべてのプリミティブのすべてのピクセルタイルを処理することを完了するのを待つことは、ピクセルタイルの実行の完了の直後にプリエンプトすることよりもはるかにより長い時間であり得る。
[0054]本開示で説明される技法では、描画呼出しの1つまたは複数のプリミティブは、プリミティブの第1のセットとプリミティブの第2のセットとを含み、GPU12は、プリミティブの第1のセットのうちの1つまたは複数のプリミティブの1つまたは複数のピクセルを含み、プリミティブの第2のセットのピクセルのいずれをも含まないピクセルタイルを処理した後に、プリエンプトし得る。描画呼出しレベルプリエンプションのみを与える技法では、GPU12は、プリエンプトする前に、プリミティブの第1のセットとプリミティブの第2のセットの両方のすべてのピクセルタイルを処理する必要があることになる。
[0055]プリエンプションを実施し、ピクセルタイルレベルグラニュラリティを与えるために、GPU12は、中間データをシステムメモリ10に動的に出力し得る。中間データのそのような動的出力を実施するために、GPU12は、プリエンプション通知に応答して、GPU12が、頂点シェーダステージによって生成された中間データをシステムメモリ10に出力するようにGPU12のグラフィックスパイプラインを動的に構成するように構成され得る。
[0056]頂点シェーダステージに続くステージの各々は、グラフィックスパイプライン中に現在あるグラフィックスデータの処理を完了し得る。たとえば、グラフィックスパイプラインのラスタライザステージは、ピクセルタイルグラニュラリティに対して機能するので、ピクセルシェーダは、処理されている特定のピクセルタイルのピクセルのための最終グラフィックスデータを出力し得る。その後、グラフィックスパイプラインは、処理されるべきより多くのピクセルタイルおよびプリミティブがある場合でも、描画呼出しに関連するプリミティブのピクセルタイルを処理するためのコマンドの実行を停止し得る。
[0057]GPU12は、次いで、実行のために現在自由に使用されることができるグラフィックスパイプラインを介して、命令の別のセット(たとえば、より高い優先度の命令)を実行し得る。次いで、GPU12が、命令の元のセットの実行を完了すべきであるとき、GPU12は、システムメモリ10から中間データを読み取り、中間データを生成したステージに続くグラフィックスパイプラインステージに中間データを供給する。
[0058]通常動作中に、各ステージは、中間データをGPU12のローカルメモリ14に出力する。本開示で説明される技法では、プリエンプション通知に応答して、GPU12は、グラフィックスパイプラインのステージ(たとえば、ラスタライザステージ)に接続するローカルメモリの出力を切断し、システムメモリ10に中間データを出力するハードウェアストリームアウトユニットに、ローカルメモリの出力を接続し得る。
[0059]本開示で使用される、「切断する」および「接続する」という用語は、中間データが異なる仕方でルーティングされることを可能にするハードウェア構成要素(たとえば、スイッチ)が存在することを伝達するために使用される。本開示で説明される技法を用いて、グラフィックスパイプラインのストリームアウトハードウェアが、プリエンプションを同じく可能にするために再利用され得る。このようにして、計算シェーダなどのようなソフトウェアは、スイッチのようなハードウェアのように異なる仕方で中間データをルーティングするために実行される必要がなく、ストリームアウトユニットは、ストリームアウトハードウェアの通常目的に加えてプリエンプションのためにさらに使用され得る。
[0060]GPU12は、コマンドの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成する。たとえば、GPU12のグラフィックスパイプラインのラスタライザステージは、通常、グラフィックスパイプラインのピクセルシェーダステージに結合される。いくつかの例では、コマンドの実行より前に、グラフィックスパイプラインのステージがどのように相互接続されるかを構成するのではなく、GPU12は、コマンドの実行が開始した後に、グラフィックスパイプラインのステージの相互接続を動的に構成し得る(たとえば、コマンドのちの少なくとも1つのコマンドが実行した後に、GPU12は、ステージの相互接続を動的に構成する)。
[0061]GPU12は、コマンドのセットの実行中に、グラフィックスパイプラインのステージの相互接続の動的構成により、システムメモリ10に、コマンドのうちの1つまたは複数のコマンドの実行中に生成された中間データを出力し得る。いくつかの技法では、GPU12は、中間データをシステムメモリ10に決して出力しない(たとえば、中間データを決してストリームアウトしない)ように構成され得る。いくつかの技法では、GPU12は、中間データをシステムメモリ10に常に出力する(たとえば、中間データを常にストリームアウトする)ように構成され得る。いくつかの例は、中間データの随意のストリーミングアウト(たとえば、中間データをシステムメモリ10に随意に出力すること)を可能にした。しかしながら、随意のストリーミングアウトのそのような例では、GPU12のグラフィックスパイプラインが、中間データを出力すべきであるのか、中間データを出力すべきでないのかは、(たとえば、OpenGLおよびDirect X APIなどに従って)GPU12によるコマンドの実行より前に決定され、CPU6によって設定された。
[0062]本開示で説明される技法では、GPU12が中間データを出力するかどうかは、動的決定であり、プリエンプション命令の受信に応答して行われる。CPU6は、GPU12存在実行の前に、GPU12のグラフィックス処理パイプラインが、中間データをシステムメモリ10に出力すべきであるのか、中間データをシステムメモリ10に出力すべきでないのかをあらかじめ定義する必要がないことがある。そうではなく、GPU12は、中間データをシステムメモリ10に出力しないが、プリエンプション通知に応答して、中間データをシステムメモリ10に出力するようにグラフィックスパイプラインのステージの相互接続を動的に構成する(たとえば、ローカルメモリ14の出力をラスタライザステージから切断し、ローカルメモリ14のその出力をハードウェアストリームアウトユニットに接続する)ように構成され得る。CPU6から見ると、GPU12のグラフィックスパイプラインの変化がない(すなわち、GPU12は、CPU6からの命令なしに、中間データをシステムメモリ10に出力するために、グラフィックスパイプラインのステージの相互接続を動的に構成する(たとえば、あるステージが接続されたものを変更し、そのステージを異なるユニットに接続する))。
[0063]図2は、図1のコンピューティングデバイス2のCPU6と、GPU12と、メモリ10とをさらに詳細に示すブロック図である。図2に示されているように、CPU6はGPU12とメモリ10とに通信可能に結合され、GPU12はCPU6とメモリ10とに通信可能に結合される。GPU12は、いくつかの例では、CPU6とともにマザーボード上に統合され得る。追加の例では、GPU12は、CPU6を含むマザーボードのポート中に設置されたグラフィックスカード上に実装され得る。さらなる例では、GPU12は、CPU6と相互動作するように構成された周辺デバイス内に組み込まれ得る。追加の例では、GPU12は、システムオンチップ(SoC)を形成するCPU6と同じマイクロチップ上に配置され得る。CPU6は、ソフトウェアアプリケーション24A、24Bと、グラフィックスAPI26と、GPUドライバ28と、オペレーティングシステム30とを実行するように構成される。GPU12は、コントローラ32と1つまたは複数の処理ユニット34とを含む。
[0064]ソフトウェアアプリケーション24A、24Bは、各々、グラフィックコンテンツが表示されることを引き起こす1つまたは複数の命令、または非グラフィックスタスク(たとえば、汎用コンピューティングタスク)がGPU12上で実施されることを引き起こす1つまたは複数の命令のうちの少なくとも1つを含み得る。ソフトウェアアプリケーション24A、24Bは、命令をグラフィックスAPI26に発行し得る。グラフィックスAPI26は、ソフトウェアアプリケーション24A、24Bから受信された命令を、GPUドライバ28によって消費可能であるフォーマットに変換するランタイムサービスであり得る。
[0065]GPUドライバ28は、グラフィックスAPI26を介して、ソフトウェアアプリケーション24A、24Bから命令を受信し、命令をサービスするためにGPU12の動作を制御する。たとえば、GPUドライバ28は、1つまたは複数のコマンドストリームを構築し、コマンドストリームをメモリ10に入れ、コマンドストリームを実行するようにGPU12に命令し得る。GPUドライバ28は、コマンドストリームをメモリ10に入れ、オペレーティングシステム30を介して、たとえば、1つまたは複数のシステム呼出しを介してGPU12と通信し得る。
[0066]GPUドライバ28は、別のコマンドストリーム(たとえば、高優先度コマンドストリーム)が、実行の準備ができていることを示すために、プリエンプション通知をGPUコントローラ32に送り得る。いくつかの例では、プリエンプション通知はまた、どのコマンドストリームを、現在実行されているコマンドストリームのプリエンプション時に実行すべきかをGPU12に示し得る。GPUドライバ28は、たとえば、GPUコントローラ32によってポーリングされる1つまたは複数のGPUレジスタに(たとえば、オペレーティングシステム30を介して)1つまたは複数の値を書き込むことによって、プリエンプション通知をGPUコントローラ32に送り得る。1つまたは複数のGPUレジスタは、GPU12中にある1つまたは複数のハードウェアGPUレジスタ、メモリ(たとえば、メモリ10)中にある1つまたは複数のメモリマップGPUレジスタ、あるいはそれらの任意の組合せを含み得る。メモリマップGPUレジスタに値を書き込むとき、CPU6は、GPUコントローラ32によってポーリングされるメモリ10中の1つまたは複数の特定のメモリアドレスに値を書き込み得る。いくつかの例では、GPUドライバ28は、(GPU12における「割込み」を含む)プリエンプション通知をアクティブにするための第1の値を、1つまたは複数のGPUレジスタに書き込み、現在実行されているコマンドストリームのプリエンプション時に実行すべきコマンドストリームのロケーションを識別する第2の値を、1つまたは複数のGPUレジスタに書き込み得る。
[0067]コントローラ32は、コマンドストリームに記憶されたコマンドを取り出し、処理ユニット34のうちの1つまたは複数上での実行のためにコマンドをディスパッチ(dispatch)するように構成される。コントローラ32は、処理ユニット34のすべてまたはサブセット上での実行のために、コマンドストリームからコマンドをディスパッチし得る。いくつかの例では、コントローラ32は、CPU6がプリエンプション通知をGPU12に送ったかどうかを示す1つまたは複数のGPUレジスタをポーリングするように構成され得る。GPUレジスタがメモリマップレジスタである場合、コントローラ32は、CPU6がプリエンプション通知をGPU12に送ったかどうかを示すメモリ10中の1つまたは複数の特定のメモリアドレスをポーリングするように構成され得る。1つまたは複数のGPUレジスタが、CPU6がプリエンプション通知をGPU12に送ったことを示すことに応答して、コントローラ32は、現在実行しているGPUコマンドストリームの実行をプリエンプトし、別のコマンドストリームを実行し始め得る。たとえば、本開示で説明される技法では、コントローラ32は、プリエンプション通知に応答して、GPU12が、1つまたは複数の処理ユニット34のうちの処理ユニットによって生成された中間データを、システムメモリ10に出力するように、処理ユニット34によって形成されるグラフィックスパイプラインを構成し得る。いくつかの場合には、コントローラ32は、プリエンプション時に実行すべきコマンドストリームを識別する、GPU12の1つまたは複数のレジスタに記憶された情報を読み取ることによって、現在実行中のコマンドストリームのプリエンプション時に実行すべきコマンドストリームを決定するように構成され得る。たとえば、CPU6は、より高い優先度のコマンドストリームのメモリロケーションを識別するポインタを1つまたは複数のGPUレジスタに記憶し得る。
[0068]コントローラ32は、GPU12のハードウェアであり得るか、GPU12上で実行するソフトウェアまたはファームウェアであり得るか、あるいはその両方の組合せである。また、コントローラ32が、プリエンプトするようにとの命令が受信されたかどうかをどのように決定するかについての上記の説明は、単に説明の目的で与えられた。CPU6がGPU12にプリエンプトするように命令するための他の方法があり得、本開示で説明される技法は、特定の例に限定されない。
[0069]処理ユニット34は、それらの各々がプログラマブル処理ユニットまたは固定機能処理ユニットであり得る、1つまたは複数の処理ユニットを含み得る。ステージとも呼ばれる、処理ユニット34のうちの処理ユニットは、グラフィックス処理を実施するように構成されたグラフィックスパイプラインをともに形成する。プログラマブル処理ユニットは、たとえば、CPU6からGPU12上にダウンロードされた1つまたは複数のシェーダプログラムを実行するように構成されたプログラマブルシェーダユニットを含み得る。シェーダプログラムは、いくつかの例では、たとえば、OpenGLシェーディング言語(GLSL)、高レベルシェーディング言語(HLSL)、グラフィックスのためのC(Cg)シェーディング言語など、高レベルシェーディング言語で書き込まれたプログラムのコンパイルされたバージョンであり得る。いくつかの例では、プログラマブルシェーダユニットは、並列に動作するように構成された複数の処理ユニット、たとえば、SIMDパイプラインを含み得る。プログラマブルシェーダユニットは、シェーダプログラム命令を記憶するプログラムメモリと、実行状態レジスタ、たとえば、実行されているプログラムメモリ中の現在の命令またはフェッチされるべき次の命令を示すプログラムカウンタレジスタとを有し得る。処理ユニット34中のプログラマブルシェーダユニットは、たとえば、頂点シェーダステージ、ピクセルシェーダステージ、ジオメトリシェーダステージ、ハルシェーダステージ(hull shader stages)、ドメインシェーダステージ、計算シェーダステージ、および/またはユニファイドシェーダステージ(unified shader stages)を含み得る。
[0070]固定機能処理ユニットは、いくつかの機能を実施するために配線接続されたハードウェアを含み得る。固定機能ハードウェアは、1つまたは複数の制御信号を介して、たとえば、異なる機能を実施するように構成可能であり得るが、固定機能ハードウェアは、一般に、ユーザによってコンパイルされたプログラムを受信することが可能であるプログラムメモリを含まない。いくつかの例では、処理ユニット34中の固定機能処理ユニットは、たとえば、深度テスト、シザーテスト(scissors testing)、アルファブレンディングなど、ラスタ動作を実施する、たとえば、処理ユニットを含み得る。
[0071]図2の例示的なグラフィックス処理システムでは、メモリ10は、2つのコマンドストリームを含み、各コマンドストリームは、異なるグラフィックスアプリケーションコンテキスト(すなわち、ソフトウェアアプリケーション24A、24Bのうちの異なるもの)に関連する。たとえば、第1のコマンドストリームは、ソフトウェアアプリケーション24Aのためのグラフィックスアプリケーションコンテキストに関連し、第2のコマンドストリームは、ソフトウェアアプリケーション24Bのためのグラフィックスアプリケーションコンテキストに関連する。説明しやすいように、2つのGPUコマンドストリームが、図2の例示的なグラフィックス処理システムのメモリ10に記憶されるものとして説明される。しかしながら、他の例では、グラフィックス処理システムの同じまたは異なる構成要素中に記憶された同じまたは異なる数のGPUコマンドストリームが、使用され得る。
[0072]上記の例では、GPU12がそれらの間で切り替える2つのストリームは、2つの異なるアプリケーション24A、24Bからのコマンドストリームである。ただし、本開示で説明される例はそのように限定されない。いくつかの例では、GPU12は、必要な場合、同じアプリケーションのコマンドストリーム間で切り替える(たとえば、アプリケーション24Aの高優先度ストリームが、アプリケーション24Aの低優先度ストリームをプリエンプトし得る)。本開示で説明されるコマンドストリームは、異なるアプリケーションのためのものであることに限定されると考えられるべきでなく、同じアプリケーションのためのものであり得る。
[0073]CPU6のGPUドライバ28は、コマンドストリームをメモリ10に書き込むように構成され得、GPU12のコントローラ32は、コマンドストリームの1つまたは複数のコマンドをメモリ10から読み取るように構成され得る。いくつかの例では、コマンドストリームの一方または両方が、メモリ10にリングバッファとして記憶され得る。リングバッファは、CPU6およびGPU12が、データをリングバッファに書き込むことと、データをリングバッファから読み取ることとに関連する同期状態変数を維持する、循環アドレス指定方式を用いたバッファであり得る。たとえば、第1のコマンドストリームがリングバッファである場合、CPU6およびGPU12の各々は、リングバッファ中のそこに書き込まれるべき次のアドレスを示す書込みポインタと、リングバッファ中のそこから読み取られるべき次のアドレスを示す読取りポインタとを記憶し得る。CPU6がリングバッファに新しいコマンドを書き込むとき、CPU6は、CPU6中の書込みポインタを更新し、GPU12に、GPU12中の書込みポインタを更新するように命令し得る。同様に、GPU12がリングバッファから新しいコマンドを読み取るとき、GPU12は、GPU12中の読取りポインタを更新し、CPU6に、CPU6中の読取りポインタを更新するように命令し得る。他の同期機構が可能である。読取りポインタおよび/または書込みポインタが、リングバッファのために割り振られたアドレスの範囲内の最高アドレスに達したとき、読取りポインタおよび/または書込みポインタは、循環アドレス指定方式を実装するために、最低アドレスにラップアラウンドし得る。
[0074]次に、本開示に従って設計された例示的なGPUドライバ28と例示的なGPUコントローラ32との例示的な動作が、図2に関して説明される。この例では、ソフトウェアアプリケーション24Bは、ソフトウェアアプリケーション24Aのスケジューリング優先度よりも高いスケジューリング優先度を有する。特に、この例では、ソフトウェアアプリケーション24Bは、グラフィックコンテンツが表示されることを引き起こし、ユーザインターフェース(UI)の適時の更新を保証するためにGPU12に対する高優先度アクセスを要求する、1つまたは複数の命令を含むUIソフトウェアアプリケーションである。一方、この例では、ソフトウェアアプリケーション24Aは、グラフィックコンテンツが表示されることを引き起こす1つまたは複数の命令、および/または非グラフィックスタスク(たとえば、GPGPUコンピューティングタスク)がGPU12上で実施されることを引き起こす1つまたは複数の命令を含むより低い優先度のアプリケーションである。
[0075]GPUドライバ28は、GPU12によって実施されるべきグラフィックス演算および/または汎用コンピューティング演算を指定する1つまたは複数の命令を、ソフトウェアアプリケーション24Aから受信する。GPUドライバ28は、GPUコントローラ32によってアクセス可能であるメモリ10に、出力コマンドストリームを入れる。GPUドライバ28は、ソフトウェアアプリケーション24Aに対応するコマンドストリームが、処理のために利用可能であることをGPUコントローラ32に通知する。たとえば、GPUドライバ28は、GPUレジスタ(たとえば、GPU12によってポーリングされるGPUハードウェアレジスタおよび/またはGPU12によってポーリングされるGPUメモリマップレジスタ)に、コマンドストリームが実行の準備ができていることを示す1つまたは複数の値を書き込み得る。
[0076]コマンドストリームが実行の準備ができているという通知時に、GPU12のコントローラ32は、リソースが、コマンドストリームを実行し始めるためにGPU12上で現在利用可能であるかどうかを決定し得る。リソースが利用可能である場合、コントローラ32は、コマンドストリーム中のコマンドをディスパッチし始める。一方、GPUドライバ28は、GPU12によって実施されるべき高優先度グラフィックス演算を指定する1つまたは複数の命令を、UIソフトウェアアプリケーション24Bから受信する。GPUドライバ28は、受信された命令によって指定された演算を行うための高優先度コマンドストリームを生成し、得られたコマンドストリームをメモリ10に入れる。
[0077]GPUドライバ28は、高優先度コマンドストリームが処理の準備ができていることと、このコマンドストリームが、GPU12上で実行している他のより低い優先度のコマンドストリームをプリエンプトすべきであることとを示すプリエンプション通知を、コントローラ32に与える。いくつかの例では、GPUドライバ28は、GPU12によってポーリングされるGPUハードウェアレジスタに書き込むことによって、および/またはGPU12によってポーリングされるメモリマップレジスタ(たとえば、メモリ10中の特定のロケーション)に書き込むことによって、プリエンプション通知(たとえば、プリエンプション命令またはコマンド)をGPU12に与え得る。
[0078]いくつかの場合には、GPUドライバ28またはCPU6は、異なるアプリケーション、または同じアプリケーションの異なるコマンドについて、プリエンプションレベルを定義し得る。たとえば、第1のストリームは、第2のストリームよりも高い優先度を有するが、第3のストリームよりも低い優先度を有する。この例では、第2のストリームが実行している場合、GPUドライバ28は、GPU12に、第1のストリームまたは第3のストリームのいずれかで第2のストリームをプリエンプトさせ得る。しかしながら、第1のストリームが実行している場合、第3のストリームのみがプリエンプトし得、どのストリームも第3のストリームをプリエンプトしないことがある。この例は、「n個の」ストリームに拡張され得、ストリームが他のストリームでプリエンプトすることができる、他のファクタがあり得る。
[0079]本開示で説明される技法では、GPU12は、ピクセルタイルレベルプリエンプションをサポートし得る。たとえば、GPU12は、「通常」処理のためにオンチップデータパッシングを使用し、グラフィックスパイプラインのステージが相互接続される仕方を動的に構成することによって、プリエンプションに基づいて、頂点出力をストリームアウトすることを動的に選定し得る。一例として、GPU12は、「プリエンプション」に関するパイプライン中のプリミティブのためのデータストレージのために、メモリ10(たとえば、通信のためにバス20を必要とするメモリ)など、外部メモリを使用し得、ピクセル(タイル)生成を停止し得る。GPU12は、すべての頂点ステージをフラッシュするが、代わりに、それらを外部メモリに動的にダイレクトし得る。コントローラ32、GPU12の何らかの他のハードウェアまたはソフトウェア構成要素、あるいはコントローラ32およびGPU12の他の構成要素が、メモリ10へのこの動的ダイレクションを実施し得る。再開時に、コントローラ32またはGPU12の何らかの他のハードウェアもしくはソフトウェア構成要素、あるいはコントローラ32およびGPU12の他の構成要素は、変換後頂点属性をピクセルパイプラインに供給し得る。
[0080]いくつかの例では、変換後頂点属性はピクセルシェーダステージに供給される。しかしながら、概して、再開時に、コントローラ32またはGPU12の何らかの他のハードウェアもしくはソフトウェア構成要素、あるいはコントローラ32およびGPU12の他の構成要素は、頂点シェーダステージ、ドメインシェーダステージ、ジオメトリシェーダステージ、または他のシェーダステージなど、プリピクセルシェーダステージ出力に、変換後頂点属性を供給し得る。プロセスの再開が起こるステージは、GPU12のステージのうちの1つにあり得、本開示で説明される技法は、プリエンプトされたプロセスの再開が開始する、GPU12の特定のステージに限定されると考えられるべきでない。
[0081]一例として、処理ユニット34によって形成されたグラフィックスパイプラインは、あるユニット(またはステージ)が、次のステージが受信し、さらに処理する中間データを生成するパイプライン様式で、グラフィックス処理を実施し得る。通常動作中に、各ステージは、GPU12のローカルメモリ14(たとえば、キャッシュ、ただし、レジスタまたはバッファなどの他の例もローカルメモリ14として可能である)に、生成された中間データを出力する。次のステージは、次いで、さらなる処理のために中間データをローカルメモリから読み取る。
[0082]しかしながら、CPU6がプリエンプション通知を出力した場合、コントローラ32は、処理ユニット34によって形成されたグラフィックスパイプラインの構成を変更するように構成され得る。一例として、コントローラ32は、中間データをローカルメモリから受信するグラフィックスパイプラインのステージを切断し、中間データをシステムメモリ10に出力するハードウェアストリームアウトユニットに、ローカルメモリの出力を接続し得る。コントローラ32は、プリエンプション通知に応答して中間データを動的にストリームアウト(たとえば、システムメモリ10に出力)するように構成され得る。
[0083]いくつかの例では、処理ユニット34によって形成されるグラフィックスパイプラインは、コマンドの実行より前に、中間データをシステムメモリ10にストリームアウトする、または中間データをシステムメモリ10にストリーミングしない、のいずれかを行うように構成され得る。本開示で説明される技法では、(たとえば、プリエンプション通知に応答して)コマンドの実行中にグラフィックスパイプラインを動的に構成することによって、GPU12は、プリエンプションをより速く実施することが可能であり得る。
[0084]たとえば、GPU12は、中間データ(たとえば、1つまたは複数のプリミティブをレンダリングするプロセス中、生成されたデータ)をシステムメモリ10に出力するように構成され得、これは、中間データがシステムメモリ10に書き込まれた後に、処理ユニット34が、より高い優先度のコマンドを実行する準備ができていることを意味する。処理ユニット34は、より高い優先度のコマンドを実行する前に、描画呼出しのすべてのプリミティブが処理されるまで待つ必要がない。
[0085]上述のように、切断するおよび接続するは、中間データをルーティングするように特別に設計されたハードウェア構成要素があることを意味するために本開示で使用される。たとえば、ストリームアウトユニットは、(たとえば、プログラマブルでない)固定機能をもつハードウェアユニットであり得る。ストリームアウトユニットの固定機能は、中間データをルーティングするためのものであり得、GPU12は、プログラム的に(機能的に)ではなく、物理的にグラフィックスパイプラインを変更するために、ローカルメモリの出力を切断し、ローカルメモリの出力をストリームアウトユニットに接続し得る。いくつかの例では、計算シェーダのようなソフトウェアは、本技法が、高速プリエンプションを可能にするプリエンプション目的のストリームアウト機能を活用するので、中間データをルーティングするために実行される必要がない。
[0086]図3Aは、ディスプレイ18のピクセルを示す概念図である。図3Bは、ディスプレイ18上のピクセルタイル36を示す概念図である。図3Aでは、2つのプリミティブ(たとえば、ディスプレイ18にわたる対角線によって形成された2つの三角形)がある。ピクセルタイル36は、GPU12のラスタライザがそれに作用するピクセルグループの最も小さいグラニュラリティの一例である。図示のように、ピクセルタイル36はディスプレイ18の右上コーナーにあるが、他のロケーションが可能である。また、ピクセルタイル36は、4×3であるとして示されている(たとえば、ピクセルタイル36中に、横に4つのピクセルおよび下に3つのピクセルがある)が、他のサイズが可能であり、概して、GPU12のベンダー、ファミリー、および/またはアーキテクチャに基づく。
[0087]ピクセルタイル36が処理されていると仮定する、本開示で説明される技法では、GPU12は、GPU12がピクセルタイル36を処理した後に、コマンドのより高い優先度のセットで、コマンドのより低い優先度のセットの実行をプリエンプトすることが可能であり得る。たとえば、GPU12がピクセルタイル36のピクセルのピクセル値を生成および記憶し、すべての他の中間データがシステムメモリ10にストリームアウトされた後に、GPU12は、より高い優先度のコマンドを実行することに切り替え得る。
[0088]いくつかの技法では、GPU12は、ピクセルタイル36を含むプリミティブのすべてのピクセルのためのピクセル値が生成されるまでだけでなく、他のプリミティブ(たとえば、ピクセルタイル36を含まないプリミティブ)のすべてのピクセルのためのピクセル値が生成されるまでも、待つ必要があり得た。GPU12は、描画呼出しの完了まで(たとえば、GPU12が描画呼出し境界に達するまで)待つ必要があったであろう。描画呼出し境界は、描画呼出しの終了(たとえば、ピクセル値が、描画呼出しの最後のプリミティブの最後のピクセルについて生成および記憶された後)である。
[0089]ピクセルタイルレベルグラニュラリティのプリエンプションの場合、プリエンプションの遅延が低減される。たとえば、図3Bにおいて、プリミティブの第1のセットは、ピクセルタイル36を含む上部プリミティブを含み、プリミティブの第2のセットは、下部プリミティブを含むと仮定する。この例では、プリエンプトすることは、ピクセルタイル36のピクセルのラスタライゼーションおよびシェーディングの後に(たとえば、GPU12が、ピクセルタイル36のピクセルのためのピクセル値を生成した後に)、および他の後続のタイルのラスタライゼーションおよびシェーディングがない(たとえば、プリエンプションが行われる前に、ピクセルタイル36が処理された後にタイルのラスタライゼーションおよびシェーディングがない)後にプリエンプトすることを含む。たとえば、図3B中の両方のプリミティブは描画呼出しの一部であったことがあるが、プリエンプションは、ピクセルタイル36のためのピクセル値を生成した後に行われ、ここで、ピクセルタイル36は、プリミティブの第1のセット(たとえば、上部プリミティブ)のうちの1つまたは複数のプリミティブの1つまたは複数のピクセルを含み、プリミティブの第2のセット(たとえば、下部プリミティブ)のピクセルのいずれをも含まない。
[0090]図4は、本開示で説明される1つまたは複数の例による、グラフィックス処理パイプラインの一例を実装し得るグラフィックス処理ユニット(GPU)の一例を示すブロック図である。グラフィックス演算を実施するために、GPU12はグラフィックス処理パイプラインを実装し得る。グラフィックス処理パイプラインは、GPU12上で実行しているソフトウェアまたはファームウェアによって定義された機能を実施することと、まさに特定の機能を実施するように配線接続された固定機能ユニットによって機能を実施することとを含む。GPU12上で実行しているソフトウェアまたはファームウェアは、シェーダと呼ばれることがあり、シェーダは、GPU12の1つまたは複数のシェーダコア上で実行し得る。ユーザは、任意の考えられる様式で所望のタスクを実施するようにシェーダを設計することができるので、シェーダはユーザに機能的フレキシビリティを与える。しかしながら、固定機能ユニットは、固定機能ユニットがタスクを実施する様式のために配線接続される。したがって、固定機能ユニットは多くの機能的フレキシビリティを与えないことがある。
[0091]この例では、GPU12は、入力アセンブラステージ38、頂点シェーダステージ40、ラスタライザステージ42、ピクセルシェーダステージ44、および出力マージステージ46のうちの1つまたは複数を含み得る。GPU12は、その順序で頂点シェーダステージに続く、そのようなハルシェーダステージ、テッセレーションステージ、ドメインシェーダステージ、追加ステージを含み得る。GPU12は、GPUがドメインシェーダステージを含む場合、ドメインシェーダステージへの出力、またはGPUがドメインシェーダステージを含まない場合、頂点シェーダステージ40の出力に結合されたジオメトリシェーダステージをも含み得る。ラスタライザステージ42は、図示のように、頂点シェーダステージ40から、あるいは(利用可能なとき)ジオメトリシェーダステージまたは(利用可能なとき)ドメインシェーダステージから、グラフィックスデータを受信し得る。
[0092]グラフィックスパイプラインの他の構成が可能であり、本開示で説明される技法は、図4に示されている特定の例に限定されると考えられるべきでない。たとえば、GPU12は、図示されたものよりも多くのステージを含み得、いくつかの例では、GPU12は、図示されたステージのすべてを必ずしも含むとは限らないことがある。また、ステージの特定の順序付けは、説明の目的で与えられており、限定するものと見なされるべきではない。
[0093]入力アセンブラステージ38は、CPU6によって定義された頂点の頂点ポイントをシステムメモリ10から読み取り、頂点を形成するために制御ポイントをアセンブルし得る。たとえば、入力アセンブラステージ38は、座標と、色値と、他のそのような情報とを読み取り得る。座標、色値、および他のそのような情報は、通常、頂点の属性と呼ばれ得る。頂点の属性に基づいて、入力アセンブラステージ38は、プリミティブの概略的レイアウトを決定し得る。このようにして、入力アセンブラステージ38は、パッチを形成するために制御ポイントをアセンブルし得る。入力アセンブラステージ38は固定機能ユニットであり得る。
[0094]頂点シェーダステージ40は、入力アセンブラステージ38からの頂点を処理し得る。たとえば、頂点シェーダステージ40は、変換(transformations)、スキニング(skinning)、モーフィング(morphing)、および頂点ごとの照明(per-vertex lighting)など、頂点ごとの演算を実施し得る。頂点シェーダステージ40はシェーダであり得る。
[0095]ラスタライザステージ42は、頂点シェーダステージ40からプリミティブを受信し、プリミティブをディスプレイのためのピクセルに変換する。たとえば、プリミティブは、プリミティブの相互接続を示すベクトルとして定義され得、画像がその上で表示されるべきであるディスプレイとは無関係の座標空間において定義され得る。ラスタライザステージ42は、これらのベクトルをディスプレイ座標に変換し、閉塞されたプリミティブ内のポイントを除外することなど、追加の機能を実施する。
[0096]ピクセルシェーダステージ44は、ラスタライザステージ42によって出力されたピクセルを受信し、表示されるべきであるピクセルの各々に色値を割り当てるために後処理を実施する。たとえば、ピクセルシェーダステージ44は、システムメモリ10に記憶された一定値と、システムメモリ10に記憶されたテクスチャデータと、色値など、ピクセルごとの出力を生成するための他のデータとを受信し得る。ピクセルシェーダステージ44はまた、ピクセルの不透明度を示す不透明度値を出力し得る。
[0097]出力マージステージ46は、最終ピクセル処理を実施し得る。たとえば、出力マージステージ46は、ピクセルのいずれかが、表示されることから除外されるべきであるかどうかをさらに決定するために、深度情報を利用し得る。出力マージステージ46はまた、最終ピクセル値を生成するために、ブレンディング演算を実施し得る。出力マージステージ46は、概して、システムメモリ10内にあるが、GPU12内にあり得るフレームバッファに、最終ピクセル値を出力し得る。
[0098]図4に示されている例では、ステージの各々は、GPU12)のローカルメモリ14からデータを受信し、ローカルメモリ14にデータを出力する。ローカルメモリの他の例が、ローカルメモリ14に加えて、またはローカルメモリ14の代わりに存在する。一例として、ステージは、データを汎用レジスタ(GPR)に出力し、データをGPRから受信し得る。ローカルメモリ14とは異なり、GPRの各々は、ステージの各々のためのメモリであるのではなく、特定のステージから受信し、特定のステージに出力するように構成され得る。GPRは、GPU12のローカルメモリの別の例である。
[0099]GPU12のローカルメモリ14は、それぞれのステージによって生成された中間データを受信し、さらなる処理のために次のステージに中間データを出力する。たとえば、入力アセンブラステージ38は、グラフィックスデータをローカルメモリ14から受信し、グラフィックスデータに対してグラフィックス処理を実施し、入力アセンブラステージ38がローカルメモリ14に記憶する第1の中間データを生成する。頂点シェーダステージ40は、この第1の中間データをローカルメモリ14から受信し、この取り出された中間データに対してグラフィックス処理を実施し、第2の中間データを生成する。
[0100]通常動作では(たとえば、プリエンプション通知がないとき)、ラスタライザステージ42は、この第2の中間データをローカルメモリ14から受信し、第2の中間データに対してグラフィックス処理を実施し、ラスタライザステージ42がローカルメモリ14に記憶する第3の中間データを生成する。出力マージステージ46は、第3の中間データをローカルメモリ14から受信し、第3の中間データに対してグラフィックス行列を実施し、出力マージステージ46がシステムメモリ10にあるいは場合によってはローカルメモリ14(またはその両方の組合せ)内に記憶する最終ピクセル値を生成する。
[0101]頂点シェーダステージ40とラスタライザステージ42との間により多くのステージがある例では、これらの中間のステージ(たとえば、ハルシェーダステージ、ドメインシェーダステージ、およびジオメトリシェーダステージのうちの1つまたは複数)のためのローカルメモリ14へのより多くの接続があり得る。頂点シェーダステージ40からラスタライザステージ42までであるが、ラスタライザステージ42を含まない様々なステージは、通常、ジオメトリパイプラインと呼ばれ得る。開示で説明される技法では、プリエンプション通知に応答して、コントローラ32は、ジオメトリパイプライン(たとえば、図4中のこの例における頂点シェーダステージ40)の出力が、システムメモリ10にストリームアウトされる(たとえば、出力される)ように、図示されたパイプラインを構成し得る。
[0102]図示のように、GPU12は、GPU12のハードウェアユニットであるストリームアウトユニット41を含む。ストリームアウトユニット41は、ローカルメモリ14からデータを、より詳細には、ジオメトリパイプラインによって生成されたデータを受信し、そのデータをシステムメモリ10に出力するように構成され得る。ストリームアウトユニット41はまた、逆に、データをシステムメモリ10から受信し、(たとえば、プリエンプションが完了し、元の命令が実行すべきである後に)データをローカルメモリ14に記憶するように構成され得る。したがって、ストリームアウトユニット41は、GPU12が、中間データ(たとえば、ジオメトリパイプラインによって生成されたデータ)をシステムメモリ10に出力するための、およびこの中間データをシステムメモリ10から取り出すための、特殊な仕方を与える。
[0103]いくつかの技法では、ストリームアウトユニット41は、中間データを受信することである特定の目的のために使用される。しかしながら、これらの技法では、ストリームアウトユニット41が中間データをシステムメモリ10に出力したかどうかが、実行より前に決定される必要があり得る。たとえば、ストリームアウトユニット41が中間データを出力すべきである場合、GPU12のグラフィックスパイプラインは第1の構成にあり、ストリームアウトユニット41が中間データを出力すべきでない場合、GPU12のグラフィックスパイプラインは第2の構成である。グラフィックスパイプラインが第1の構成にあるのか、第2の構成にあるのかにかかわらず、GPU12は、コマンドの実行より前に構成を設定する必要があり得る。
[0104]しかしながら、本開示で説明される技法では、コントローラ32は、コマンドの実行中に、コントローラ32が、グラフィックスパイプラインを第1の構成または第2の構成に構成することができるように、グラフィックスパイプラインのステージの相互接続を動的に構成し得る。たとえば、プリエンプション通知に応答して、コントローラ32は、ラスタライザステージ42に接続するローカルメモリ14の出力を切断し、ローカルメモリ14の出力をストリームアウトユニット41に接続し得る。たとえば、GPU12は、描画呼出しを受信したことに応答して、図4に示されているグラフィックスパイプラインを介して、コマンドの第1のセットを実行し得る。描画呼出しは、第1のセットコマンドによってレンダリングされるべきである1つまたは複数のプリミティブを定義する。図示のように、グラフィックスパイプラインは、コマンドの第1のセットの実行中にグラフィックスパイプラインのステージによって生成されたデータを、GPU12のローカルメモリ14に記憶するように構成される。
[0105]コントローラ32は、次いで、コマンドの第1のセットの実行中に、プリエンプション通知を受信し得る。プリエンプション通知を受信したことに応答して、コントローラ32は、コマンドの第1のセットの実行中に、GPU12のグラフィックスパイプラインのステージの相互接続を動的に構成するために、GPU12のローカルメモリ14の出力を、グラフィックスパイプラインのステージ(たとえば、ラスタライザステージ42)から切断し、コマンドの第1のセットのうちの1つまたは複数のコマンドの実行中に生成された中間データ(たとえば、より一般的には、頂点シェーダステージ40またはジオメトリパイプラインによって生成された中間データ)を、GPU12の外部にあるメモリ(たとえば、システムメモリ10)に出力するために、ローカルメモリの出力を、ハードウェアストリームアウトユニット41に接続し得る。GPU12は、グラフィックスパイプラインのステージの相互接続の動的構成により、GPU12の外部にあるメモリ(たとえば、システムメモリ10)に中間データを出力し得る。したがって、コントローラ32は、ピクセルタイルレベルグラニュラリティにおいてプリエンプションを実施するために、計算シェーダのようなソフトウェアに依拠するのではなく、プリエンプションを実施するために、GPU12のハードウェア能力を活用し得る。
[0106]通常動作では、コントローラ32は、ラスタライザステージ42が、ジオメトリパイプライン(たとえば、この例では頂点シェーダステージ40)によって生成された中間データを受信するように、スイッチS2を閉じたまま、およびスイッチS1を開いたままにし得る。たとえば、ラスタライザステージ42は、プリエンプション通知を受信するより前に、ラスタライザステージ42による処理のために、ローカルメモリから中間データを受信し得る。次いで、プリエンプション通知に応答して、コントローラ32は、ジオメトリパイプラインが生成したデータが、ストリームアウトユニット41を介してシステムメモリ10にストリームアウトするように、スイッチS2を開き、スイッチS1を閉じ得る。このようにして、コントローラ32は、グラフィックスパイプラインのステージの相互接続を動的に構成する(たとえば、ジオメトリパイプラインと次のステージとの間の既存の接続が切られ、ジオメトリパイプラインは、現在、異なるステージに出力する)。図4では、コントローラ32は、プリエンプション通知を受信したことに応答してのみ、ストリームアウトユニット41が、シェーダ(たとえば、図4中の頂点シェーダステージ40など、ジオメトリパイプライン中の最後のシェーダ)によって生成された中間データを、GPU12の外部にあるメモリ(たとえば、システムメモリ10)に出力するように、グラフィックスパイプラインを構成し得る。ストリームアウトユニット41は、グラフィックスパイプラインのステージの相互接続の動的構成により、中間データをシステムメモリ10に出力するように構成される。
[0107]コントローラ32は、次いで、1つまたは複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を停止し、コマンドの第2のセットがグラフィックスパイプラインを介して実行することを可能にし得る。このようにして、コントローラ32は、コマンドの第2のセットを実行するために、描画呼出しの1つまたは複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を完了するより前に、コマンドの第1のセットの実行をプリエンプトし得る。コマンドの第2のセットの実行に続いて、コントローラ32は、GPU12にコマンドの第1のセットの実行を再開させ得る。
[0108]本開示では、GPU12は、描画呼出しのすべてのプリミティブがレンダリングされたとき、描画呼出し境界に達する。GPU12は、描画呼出しの1つまたは複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を完了するより前に、プリエンプトすることが可能であるので、GPU12は、描画呼出し境界より前にプリエンプトする。
[0109]いくつかの例では、描画呼出し境界より前にプリエンプトする際に、GPU12は、中間プリミティブをプリエンプトするように構成され得る。説明されたように、GPU12は、プリエンプションのためのピクセルタイルレベルグラニュラリティを与える。たとえば、実行中に、ラスタライザステージ42は、ピクセルタイルの1つまたは複数のピクセルのための中間データを、ローカルメモリ14から取り出す。ピクセルタイルは、プリミティブの1つまたは複数のピクセルを含み、概して、プリミティブよりも小さい。
[0110]コントローラ32がスイッチS2を開いた後、ラスタライザステージ42は、それ以上の中間データを取り出すことができない。したがって、ラスタライザステージ42は、現在のピクセルタイルを処理することを完了し得、ピクセルシェーダステージ44は、現在のピクセルタイルのピクセルを処理し得、出力マージステージ46は、現在のピクセルタイルのピクセルを処理し得る。次いで、これらのステージの各々は、フラッシュされている(すなわち、データを現在処理していない)と見なされ得、コマンドの第2のセット(たとえば、コマンドの第1のセットがそれについてプリエンプトされたより高い優先度のコマンド)に対して動作することが可能である。この例では、プリエンプトすることは、処理される必要があるより多くのタイルが描画呼出しのプリミティブ中にある場合でも、ピクセルタイルをラスタライズおよびシェーディングし(たとえば、ラスタライザステージ42およびピクセルシェーダステージ44がピクセルタイルに対してそれぞれの機能を実施し)、他の後続のピクセルタイルをラスタライズおよびシェーディングしなかった後に、プリエンプトすることを含む。このようにして、GPU12は、プリミティブ中により多くのピクセルタイルがあるとしても、現在のピクセルタイルの処理を完了した後にプリエンプトするための機構を与える(たとえば、プリエンプションのためのピクセルタイルグラニュラリティのための機構を与える)。
[0111]グラフィックスパイプライン中のラスタライザステージ42の前にある構成要素について、これらのステージが、プリエンプション通知を受信した後に生成したデータは、ストリームアウトユニット41を介してシステムメモリ10にストリームアウトする。たとえば、コントローラ32は、頂点シェーダステージ40(およびジオメトリパイプライン中の任意の他のステージ)が、データこれらのステージの処理を完了し、得られた中間データをシステムメモリ10に出力することを可能にし得る。このようにして、コントローラ32は、ジオメトリパイプライン中のステージをフラッシュする。
[0112]ジオメトリパイプラインのステージと、ラスタライザステージ42の後のおよびラスタライザステージ42を含むステージとをフラッシュすることに加えて、コントローラ32は、コマンドの第1のセットのうちのコマンドの実行を停止し得る。たとえば、コントローラ32は、入力アセンブラステージ38が、それ以上のプリミティブをアセンブルするのを停止し、コマンドの第1のセットのうちのコマンドを頂点シェーダステージ40に発行することを停止し得る。今まで出力されなかった描画呼出しの1つまたは複数のプリミティブのための残りのデータがある場合、コントローラ32は、コマンドの第2のセットの実行の完了の後に、コマンドの第1のセットが実行を完了すべきであるときのために、そのデータのためのコンテキスト値をシステムメモリ10に記憶し得る。
[0113]コンテキスト値は、GPU12が、プリエンプションの後にコマンドの実行をどのように再開すべきかを決定するために使用することができる値を指す。コンテキスト値の例は、GPU12がコマンドの第1のセットの実行をプリエンプトしたときにGPU12があった状態と同じ状態にそれ自体を置くためにGPU12が使用することができる、ロケーション情報、属性情報、(たとえば、コマンドプリエンプションがそこで行われた)コマンドストリーム情報、GPUの状態情報(たとえば、フリップフロップの位置)、レジスタ内の値などを含む。本開示では、描画呼出しに応答して、大量のメモリを必要とし得る、プリミティブのすべてのためのコンテキスト値のすべてを記憶するのではなく、GPU12は、(たとえば、出力されなかった中間データをもつプリミティブのみのための)限られた量のコンテキスト値を記憶し得る。
[0114]たとえば、プリエンプション通知に応答して、コントローラ32は、中間データをストリームアウトするために、スイッチS2を開き、スイッチS1を閉じ、すべてのステージが、プリエンプション通知が受信されたときに現在実行されているコマンドの第1のセットのうちのコマンドの実行を完了することを可能にする。コントローラ32は、次いで、コマンドの第2のセットが完了までずっと実行することを可能にする(すなわち、コントローラ32は、コマンドの第2のセットのうちの最後のコマンドが完了することを可能にする)。
[0115]コマンドの第2のセットの実行に続いて、コントローラ32は、ラスタライズおよびピクセルシェーディングするために、システムメモリ10から中間データを取り出すことによって、コマンドの第1のセットの実行を再開する。たとえば、コマンドの第1のセットの実行を完了するために、コントローラ32は、スイッチS1を閉じ、スイッチS2を閉じる。ストリームアウトユニット41は、プリエンプション通知に応答して、システムメモリ10に記憶された中間データをシステムメモリ10から読み込み、ラスタライザステージ42は、次に、この中間データをラスタライズし、ピクセルシェーダステージ44は、ラスタライザステージ42によって生成されたデータにピクセルシェーディングを適用する。さらに、入力アセンブラステージ38は、プリエンプション通知が受信されたときにアセンブルされていなかったことがある記憶されたコンテキスト値に基づいて、描画呼出しのプリミティブをアセンブルする。頂点シェーダステージ40は、次いで、これらのプリミティブを処理し、グラフィックスパイプラインは通常通り機能する(たとえば、コントローラ32は、グラフィックスパイプラインを、中間データがシステムメモリ10に記憶されるのではなくローカルに記憶されるそれの通常状態に構成する)。
[0116]理解をさらに助けるために、以下は、GPU12が、10個のプリミティブをレンダリングするために、描画呼出しをCPU6から受信した場合のための本開示の例示的技法について説明する。この例は、説明の簡単のために与えられており、限定するものと解釈されるべきでない。
[0117]描画呼出しを受信したことに応答して、GPU12は、10個のプリミティブをレンダリングするためのコマンドの第1のセットを実行する。入力アセンブラステージ38はプリミティブをアセンブルし、入力アセンブラステージ38が、プリミティブをアセンブルすることを完了したとき、頂点シェーダステージ40は、プリミティブの頂点を処理するために、頂点シェーダのインスタンス化を実行する。ラスタライザステージ42は、頂点を受信し、ピクセルタイルベースで処理する。
[0118]ラスタライゼーションおよびピクセルシェーディングは、未知数に関する時間を要し得、頂点シェーディングよりも長い時間を要する傾向があるので、いくつかの例では、ラスタライザステージ42が処理しているプリミティブと、頂点シェーダステージ40がそれに対して動作しているプリミティブとの間に数個のプリミティブの差があり得る。たとえば、10個のプリミティブのうち、頂点シェーダステージ40は、ラスタライザステージ42がプリミティブ5のピクセルタイルに対して動作している間に、プリミティブ8を処理していることがある。
[0119]頂点シェーダステージ40がプリミティブ8を処理しており、ラスタライザステージ42が、プリミティブ5の複数のピクセルタイルのうちのピクセルタイルに対して動作している間に、そのコントローラ32がプリエンプション通知を受信したと仮定する。コントローラ32は、次いで、スイッチS2を開き、スイッチS1を閉じる。この場合、プリミティブ1〜4がレンダリングされ、それらのピクセル値はシステムメモリ10に記憶される。頂点シェーダステージ40がプリミティブ5〜8について生成した中間データのすべてが、ストリームアウトユニット41を介してローカルメモリ14からシステムメモリ10にストリームアウトされる。ラスタライザステージ42は、ラスタライザステージ42が、GPU12がプリエンプション通知を受信したときに処理していた、プリミティブ5のピクセルタイルの処理を完了する。ピクセルシェーダステージ44および出力マージステージ46は、プリミティブ5のピクセルタイルに対してそれぞれのプロセスをプリフォームする。コントローラ32は、コマンドの第1のセットのいずれかを、GPU12のグラフィックスパイプラインのステージのいずれかに発行することを停止する。
[0120]プリミティブ9および10について、コントローラ32は、入力アセンブラステージ38が、GPU12が、コマンドの第1のセットがそれらのためにプリエンプトされたコマンドの第2のセットを実行することを完了した後に、これらのプリミティブをアセンブルすることができるように、それらのコンテキスト値を記憶する。コントローラ32はまた、コントローラ32が、GPU12がコマンドの第1のセットのうちの残りのコマンドを実行するとき、ストリームアウトユニット41にプリミティブ5の次のピクセルタイルを取り出させることができるように、ラスタライザステージ42がどのピクセルタイルを処理していたかを示す情報を記憶し得る。
[0121]上記で説明されたように、コントローラ32は、ジオメトリパイプラインによって生成された中間データを外部メモリ(たとえば、システムメモリ10)に選択的に出力するようにGPU12のグラフィックスパイプラインを動的に構成する。以下で説明されるように、いくつかの技法は、コマンドの実行より前に、GPU12が、中間データをシステムメモリ10に出力すべきであったのか、中間データをローカルメモリに記憶されたままにすべきであったのかを設定する。(たとえば、ランタイム中に)ストリームアウトユニット41をローカルメモリ14に動的に接続することによって、コントローラ32は、コマンドの第1のセットの実行中に、本開示で説明される技法を可能にするグラフィックスパイプラインを、ピクセルタイルレベルグラニュラリティをもつ描画呼出し境界間のプリエンプションを実施することを可能にする構成する。
[0122]図5は、グラフィックスパイプラインの別の例を示すブロック図である。図5のグラフィックスパイプラインは、たとえば、DX9/Open GL3.x APIのグラフィックスパイプラインの一例である。たとえば、図5は、入力アセンブリステージ38と、頂点シェーダ(VS)ステージ40と、ピクセルシェーダ(PS)ステージ44とを示す。ラスタライザステージ42のようなラスタライザは、簡単のために示されない。
[0123]入力アセンブリ48は、プリミティブの座標など、グラフィックスデータを受信し、複数のプリミティブ(たとえば、三角形)を構成する。頂点シェーダステージ40は、プリミティブの頂点に対して演算を実施する。頂点シェーダステージ40は、頂点パラメータキャッシュ(VPC)と呼ばれることがある、頂点パラメータメモリ(VPM)中の変換後頂点属性を出力(たとえば、デポジット)し得る。この例では、変換後頂点属性は、頂点シェーダステージ40が生成した中間データである。VPMは、GPUローカルメモリ14の一部(たとえば、GPU12が、アクセスするためにバス20を必要としないGPU12のオンチップメモリ)であり得る。ピクセルシェーダステージ44は、VPMからの変換後頂点属性を処理のために受信する(たとえば、消費する)。
[0124]図6は、グラフィックスパイプラインの別の例を示すブロック図である。図6のグラフィックスパイプラインは、たとえば、DX10/11/Open GL.4.x APIのグラフィックスパイプラインの一例である。図6は、入力アセンブリステージ38と、頂点シェーダステージ40と、ピクセルシェーダステージ44とを示す。図示のように、図6では、頂点シェーダステージ40は、すべての変換後頂点属性を外部メモリ10にストリームアウトし得る。ピクセルシェーダステージ44は、分離され、メモリ10からの変換後頂点属性を消費する(たとえば、処理のために受信する)。
[0125]図5および図6に示されている例では、プリエンプションは、すべての状態変数を記憶し、特定の位置から再開することによって行われ得る。たとえば、図5および図6では、プリエンプションは、描画呼出し境界のみにおいて行われ得る。図5および図6に関して、プリエンプションは、ピクセル/フラグメントシェーダステージが完了していない限り起こることができず、これが、基本的に、描画呼出し境界である。
[0126]本開示で説明される技法では、GPU12は、プリエンプションに基づいて、ジオメトリパイプラインからの生成された中間データをシステムメモリ10に選択的に出力し得る。この意味で、GPU12は、プリエンプションに基づいて、頂点出力ストリームアウト(たとえば、頂点情報が出力される様式)を、「DX9」スタイル(たとえば、図5)と「DX11」スタイル(たとえば、図6)との間で動的に選定し得る。
[0127]プリエンプションのために、GPU12は、グラフィックスパイプライン中のプリミティブのためのデータストレージのためにメモリ10を使用し、ピクセル(たとえば、タイル)生成を停止し、すべての頂点ステージをフラッシュするが、代わりに、それらをメモリ10に動的にダイレクトする。たとえば、それが、ユーザ/APIによるアップフロントの代わりにプリエンプションをサポートするためにGPU12によって動的に決定されることを除いて、DX10のstreamOut特徴(たとえば、ストリームアウトユニット41)と同様のステージ。再開時に、GPU12は、ラスタライザステージ42による処理のために、変換後頂点属性をシステムメモリ10から受信する。
[0128]図7は、データを処理する例示的な方法を示すフローチャートである。図示のように、GPU12は、描画呼出しを受信したことに応答して、GPU12のグラフィックスパイプラインを介して、コマンドの第1のセットを実行する(50)。描画呼出しは、コマンドの第1のセットによってレンダリングされるべきである1つまたは複数のプリミティブを定義し、グラフィックスパイプラインは、コマンドの第1のセットの実行中にグラフィックスパイプラインのステージによって生成されたデータを、GPU12のローカルメモリに記憶するように構成される。GPU12は、コマンドの第1のセットの実行中に、および1つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信する(52)。
[0129]プリエンプション通知を受信したことに応答して、GPU12は、コマンドの第1のセットの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成するために、GPU12のローカルメモリの出力を、グラフィックスパイプラインのステージから切断し、GPU12のローカルメモリの出力を、GPU12のハードウェアストリームアウトユニット41に接続する(54)。GPU12は、コマンドの第1のセットの実行中に、GPU12のグラフィックスパイプラインのステージの相互接続の動的構成により、ストリームアウトユニット41から、GPUの外部にあるメモリに、コマンドの第1のセットのうちの1つまたは複数のコマンドの実行中に生成された中間データを出力する(56)。たとえば、コントローラ32は、コマンドの第1のセットの実行中に、中間データをシステムメモリ10に出力するようにGPU12のグラフィックスパイプラインを動的に構成するために、コマンドの第1のセットのうちの1つまたは複数のコマンドの実行中にジオメトリパイプラインによって生成された中間データをシステムメモリ10に出力するために、ローカルメモリ14の出力をラスタライザステージ42から切断し、ローカルメモリ14の出力をストリームアウトユニット41に接続し得る。
[0130]たとえば、通常動作中に、ステージ(たとえば、ラスタライザステージ42)が、プリエンプション通知を受信するより前に、ステージによる処理のために、ローカルメモリから中間データを受信する。次いで、プリエンプション通知を受信したことに応答してのみ、GPU12は、ストリームアウトユニット41を介して、シェーダ(たとえば、頂点シェーダステージ40)によって生成された中間データを、GPU12の外部にあるメモリに(たとえば、システムメモリ10に)出力する。コントローラ32は、次いで、1つまたは複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を停止する。
[0131]GPU12は、コマンドの第2のセットを実行するために、描画呼出しの1つまたは複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を完了するより前に、コマンドの第1のセットの実行をプリエンプトする(58)。GPU12は、次いで、コマンドの第2のセットを実行する(60)。コマンドの第2のセットの実行に続いて、GPU12は、ラスタライザステージ42によるラスタライズおよびピクセルシェーダステージ44によるピクセルシェーディングのために、一例としてストリームアウトユニット41を介して、GPU12の外部にあるメモリ(たとえば、システムメモリ10)から中間データを取り出すことによって、コマンドの第1のセットの実行を再開する。
[0132]GPU12は、描画呼出しの1つまたは複数のプリミティブをレンダリングするためのコマンドの第1のセットの実行を完了するより前に、コマンドの第1のセットの実行をプリエンプトし得るので、GPU12は、描画呼出し境界に達するより前に、プリエンプトし得る。たとえば、描画呼出しの1つまたは複数のプリミティブが、プリミティブの第1のセットとプリミティブの第2のセットとを含むと仮定する。この例では、プリエンプトすることは、(たとえば、プリエンプションのためのピクセルタイルレベルグラニュラリティを与えるために)ピクセルタイルを、ラスタライザステージ42を用いてラスタライズし、ピクセルシェーダステージ44を用いてピクセルシェーディングし、他の後続のピクセルタイルを、ラスタライザステージ42を用いてラスタライズせず、ピクセルシェーダステージ44を用いてピクセルシェーディングしなかった後に、プリエンプトすることを含む。説明されたように、ラスタライズおよびピクセルシェーディングは、グラフィックスパイプラインの2つのステージ(たとえば、グラフィックスパイプラインの、それぞれ、ラスタライザステージ42およびピクセルシェーダステージ44)によって実施される機能を備える。
[0133]この例では、ピクセルタイルは、プリミティブの第1のセットのうちの1つまたは複数のプリミティブの1つまたは複数のピクセルを含み、プリミティブの第2のセットのピクセルのいずれをも含まない。したがって、プリミティブの第2のセットのうちのプリミティブ、およびプリミティブの第1のセット内のピクセルタイルさえレンダリングされる必要があり得るが、GPU12は、描画呼出し境界を待つ、または莫大な量のコンテキスト値を記憶するのではなく、ピクセルタイルの処理の後に、プリエンプトすることが可能である。
[0134]本開示で説明された技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明された技法の様々な態様は、1つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路、ならびにそのような構成要素の任意の組合せを含む、1つまたは複数のプロセッサ内に実装され得る。「プロセッサ」または「処理回路」という用語は、概して、単独のまたは他の論理回路と組み合わせられた上記の論理回路のいずれか、あるいは処理を実施する個別ハードウェアなど、任意の他の等価な回路を指し得る。
[0135]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明された様々な動作および機能をサポートするために、同じデバイス内にまたは別個のデバイス内に実装され得る。さらに、説明されたユニット、モジュールまたは構成要素のいずれも、一緒に、または個別であるが相互動作可能な論理デバイスとして別々に実装され得る。モジュールまたはユニットとしての異なる特徴の記述は、異なる機能的態様を強調するものであり、そのようなモジュールまたはユニットが、別個のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを必ずしも暗示するとは限らない。そうではなく、1つまたは複数のモジュールまたはユニットに関連する機能は、別個のハードウェア、ファームウェア、および/またはソフトウェア構成要素によって実施されるか、あるいは共通または別個のハードウェアまたはソフトウェア構成要素内に組み込まれ得る。
[0136]本開示で説明された技法はまた、命令を記憶するコンピュータ可読記憶媒体など、コンピュータ可読媒体中に記憶、具現または符号化され得る。コンピュータ可読媒体中に埋め込まれたまたは符号化された命令は、たとえば、命令が1つまたは複数のプロセッサによって実行されたとき、1つまたは複数のプロセッサに本明細書で説明された技法を実施させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電子的に消去可能なプログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD−ROM、フロッピー(登録商標)ディスク、カセット、磁気媒体、光媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
[0137]様々な態様および例が説明された。しかしながら、以下の請求項の範囲から逸脱することなく、本開示の構造または技法に変更が行われ得る。