(57)【要約】  グラフィックス処理ユニット（ＧＰＵ）が、描画呼出しを受信したことに応答して、コマンドの第１のセットを実行することと、描画呼出しが、コマンドの第１のセットによってレンダリングされるべきである複数のプリミティブを定義する、コマンドの第１のセットの実行中に、プリエンプション通知を受信することと、コマンドの第２のセットを実行するために、描画呼出しの複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトすることとを行い得る、プリエンプションに関する技法が説明される。【選択図】      図４
2018533137.tif 000002
【特許請求の範囲】
【請求項１】
データを処理する方法であって、前記方法は、
グラフィックス処理ユニット（ＧＰＵ）を用いて、描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
前記ＧＰＵを用いて、コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
前記ＧＰＵを用いて、コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を備える、方法。
【請求項２】
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、プリエンプトすることが、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトすることを備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、請求項１に記載の方法。
【請求項３】
プリエンプトすることが、描画呼出し境界に達するより前にプリエンプトすることを備える、請求項１に記載の方法。
【請求項４】
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断することが、
前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断すること
を備える、請求項１に記載の方法。
【請求項５】
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することと
をさらに備える、請求項１に記載の方法。
【請求項６】
コマンドの前記第２のセットの実行に続いて、ラスタライズおよびピクセルシェーディングするために、前記ＧＰＵの外部にある前記メモリから前記中間データを取り出すことによって、コマンドの前記第１のセットの実行を再開すること
をさらに備える、請求項１に記載の方法。
【請求項７】
前記ステージを用いて、前記プリエンプション通知を受信するより前に、前記ステージによる処理のために、前記ローカルメモリから前記中間データを受信すること
をさらに備える、請求項１に記載の方法。
【請求項８】
データを処理するためのデバイスであって、前記デバイスが、
システムメモリと、
グラフィックス処理ユニット（ＧＰＵ）とを備え、前記ＧＰＵが、ハードウェアストリームアウトプットユニットとローカルメモリとを備え、ここにおいて、前記ＧＰＵは、
描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵの前記ローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵの前記ハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にある前記システムメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を行うように構成された、
デバイス。
【請求項９】
前記グラフィックスパイプラインが、ラスタライザステージとピクセルシェーダステージとを備え、ここにおいて、前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、前記ＧＰＵが、ピクセルタイルを、ラスタライザステージを用いてラスタライズし、ピクセルシェーダステージを用いてピクセルシェーディングし、他の後続のピクセルタイルを、ラスタライザステージを用いてラスタライズせず、ピクセルシェーダステージを用いてピクセルシェーディングしなかった後に、プリエンプトするように構成され、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えない、請求項８に記載のデバイス。
【請求項１０】
前記ＧＰＵが、描画呼出し境界に達するより前にプリエンプトするように構成された、請求項８に記載のデバイス。
【請求項１１】
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断するために、前記ＧＰＵが、前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断するように構成された、請求項８に記載のデバイス。
【請求項１２】
前記ＧＰＵが、
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記システムメモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することと
を行うように構成された、請求項８に記載のデバイス。
【請求項１３】
前記ＧＰＵが、
コマンドの前記第２のセットの実行に続いて、ラスタライズおよびピクセルシェーディングするために、前記ＧＰＵの外部にある前記システムメモリから前記中間データを取り出すことによって、コマンドの前記第１のセットの実行を再開する
ように構成された、請求項８に記載のデバイス。
【請求項１４】
前記ステージが、前記プリエンプション通知を受信するより前に、前記ステージによる処理のために、前記ローカルメモリから前記中間データを受信するように構成された、請求項８に記載のデバイス。
【請求項１５】
前記デバイスがワイヤレス通信デバイスを備える、請求項８に記載のデバイス。
【請求項１６】
実行されたとき、データを処理するためのデバイスのグラフィックス処理ユニット（ＧＰＵ）に、
描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を行わせる命令を記憶したコンピュータ可読記憶媒体。
【請求項１７】
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、前記ＧＰＵに、プリエンプトすることを行わせる前記命令が、前記ＧＰＵに、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトすることを行わせる命令を備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項１８】
前記ＧＰＵに、プリエンプトすることを行わせる前記命令が、前記ＧＰＵに、描画呼出し境界に達するより前にプリエンプトすることを行わせる命令を備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記ＧＰＵに、前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断することを行わせる前記命令が、
前記ＧＰＵに、前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断することを行わせる命令
を備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記ＧＰＵに、
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することと
を行わせる命令をさらに備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項２１】
データを処理するためのデバイスであって、前記デバイスは、
描画呼出しを受信したことに応答して、グラフィックス処理ユニット（ＧＰＵ）のグラフィックスパイプラインを介して、コマンドの第１のセットを実行するための手段と、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信するための手段と、
コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続するための手段と、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力するための手段と、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトするための手段と、
コマンドの前記第２のセットを実行するための手段と
を備える、デバイス。
【請求項２２】
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、プリエンプトするための前記手段が、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトするための手段を備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、請求項２１に記載のデバイス。
【請求項２３】
プリエンプトするための前記手段が、描画呼出し境界に達するより前にプリエンプトするための手段を備える、請求項２１に記載のデバイス。
【請求項２４】
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断するための前記手段が、
前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断するための手段
を備える、請求項２１に記載のデバイス。
【請求項２５】
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力するための手段と、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止するための手段と
をさらに備える、請求項２１に記載のデバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本出願は、その内容全体が参照により本明細書に組み込まれる、２０１５年９月２９日に出願された「GRAPHICS PROCESSING UNIT PREEMPTION」と題する米国仮出願第６２／２３４，３５５号の利益を主張する。
【０００２】
[0002]本開示は、グラフィックス処理システムに関し、より詳細には、プリエンプション（preemption）を利用するグラフィックス処理システムに関する。
【背景技術】
【０００３】
[0003]コンピューティングデバイスは、しばしば、表示のためのグラフィックスデータのレンダリングを加速するために、グラフィックス処理ユニット（ＧＰＵ）を利用する。そのようなコンピューティングデバイスは、たとえば、コンピュータワークステーション、いわゆるスマートフォンなどのモバイルフォン、組込みシステム、パーソナルコンピュータ、タブレットコンピュータ、およびビデオゲームコンソールを含み得る。ＧＰＵは、一般に、グラフィックス処理コマンドを実行するためにともに動作する複数の処理ステージを含むグラフィックス処理パイプラインを実行する。ホスト中央処理ユニット（ＣＰＵ）は、１つまたは複数のグラフィックス処理コマンドをＧＰＵに発行することによって、ＧＰＵの動作を制御し得る。現代のＣＰＵは、一般に、それらの各々が、実行中にＧＰＵを利用する必要があり得る、複数のアプリケーションをコンカレントに実行することが可能である。ホストＣＰＵ上で現在実行している異なるアプリケーション間でのＧＰＵリソースのアービトレーションは、特に、いくつかのアプリケーションがＧＰＵへの高優先度アクセスを必要とし得る場合に、ホストＣＰＵに大きな課題を呈することがある。
【発明の概要】
【０００４】
[0004]本開示は、グラフィックス処理ユニット（ＧＰＵ）ピクセルタイルプリエンプションを対象とする。いくつかの例では、ＧＰＵは、ピクセルの「グループ」をレンダリングした後に、コマンドの第１のセットからコマンドの第２のセットにコンテキスト切替え（たとえば、コマンドの第１のセットをプリエンプト）し得る。たとえば、ＧＰＵは、ピクセルグループをラスタライズおよびシェーディングした後に、プリエンプトし得る。また、いくつかの例では、ＧＰＵは、通常処理を使用して異なるシェーダからのデータを受け渡し得るが、プリエンプションに基づいて、頂点データがどのようにストリームアウトされるかを動的に選択し得る。たとえば、ＧＰＵグラフィックスパイプラインは、データをレンダリングすることの一部として中間データを生成し、この中間データをＧＰＵのローカルメモリに記憶する構成される。しかしながら、コマンドに応答して、ＧＰＵは、中間データをＧＰＵの外部のメモリに出力するように、グラフィックスパイプラインを動的に再構成する。
【０００５】
[0005]一例では、本開示は、データを処理する方法について説明し、本方法は、グラフィックス処理ユニット（ＧＰＵ）を用いて、描画呼出しを受信したことに応答して、ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、描画呼出しが、コマンドの第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブ（primitives）を定義する、ＧＰＵを用いて、コマンドの第１のセットの実行中に、および１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、プリエンプション通知を受信したことに応答して、コマンドの第１のセットの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成するために、ＧＰＵのローカルメモリの出力を、グラフィックスパイプラインのステージから切断し、ＧＰＵのローカルメモリの出力を、ＧＰＵのハードウェアストリームアウトユニットに接続することと、コマンドの第１のセットの実行中に、ＧＰＵのグラフィックスパイプラインのステージの相互接続の動的構成により、ハードウェアストリームアウトユニットから、ＧＰＵの外部にあるメモリに、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、ＧＰＵを用いて、コマンドの第２のセットを実行するために、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトすることと、コマンドの第２のセットを実行することとを備える。
【０００６】
[0006]一例では、本開示は、データを処理するためのデバイスについて説明し、本デバイスは、システムメモリとグラフィックス処理ユニット（ＧＰＵ）とを備える。ハードウェアストリームアウトプットユニットとローカルメモリとを備えるＧＰＵ、ここにおいて、ＧＰＵは、描画呼出しを受信したことに応答して、ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、描画呼出しが、コマンドの第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、コマンドの第１のセットの実行中に、および１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、プリエンプション通知を受信したことに応答して、コマンドの第１のセットの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成するために、ＧＰＵのローカルメモリの出力を、グラフィックスパイプラインのステージから切断し、ＧＰＵのローカルメモリの出力を、ＧＰＵのハードウェアストリームアウトユニットに接続することと、コマンドの第１のセットの実行中に、ＧＰＵのグラフィックスパイプラインのステージの相互接続の動的構成により、ハードウェアストリームアウトユニットから、ＧＰＵの外部にあるシステムメモリに、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、コマンドの第２のセットを実行するために、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトすることと、コマンドの第２のセットを実行することとを行うように構成される。
【０００７】
[0007]一例では、本開示は、実行されたとき、データを処理するためのデバイスのグラフィックス処理ユニット（ＧＰＵ）に、描画呼出しを受信したことに応答して、ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、描画呼出しが、コマンドの第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、コマンドの第１のセットの実行中に、および１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、プリエンプション通知を受信したことに応答して、コマンドの第１のセットの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成するために、ＧＰＵのローカルメモリの出力を、グラフィックスパイプラインのステージから切断し、ＧＰＵのローカルメモリの出力を、ＧＰＵのハードウェアストリームアウトユニットに接続することと、コマンドの第１のセットの実行中に、ＧＰＵのグラフィックスパイプラインのステージの相互接続の動的構成により、ハードウェアストリームアウトユニットから、ＧＰＵの外部にあるメモリに、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、コマンドの第２のセットを実行するために、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトすることと、コマンドの第２のセットを実行することとすることを行わせる命令を記憶したコンピュータ可読記憶媒体について説明する。
【０００８】
[0008]一例では、本開示は、データを処理するためのデバイスについて説明し、本デバイスは、描画呼出しを受信したことに応答して、グラフィックス処理ユニット（ＧＰＵ）のグラフィックスパイプラインを介して、コマンドの第１のセットを実行するための手段と、描画呼出しが、コマンドの第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、コマンドの第１のセットの実行中に、および１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信するための手段と、コマンドの第１のセットの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成するために、ＧＰＵのローカルメモリの出力を、グラフィックスパイプラインのステージから切断し、ＧＰＵのローカルメモリの出力を、ＧＰＵのハードウェアストリームアウトユニットに接続するための手段と、コマンドの第１のセットの実行中に、ＧＰＵのグラフィックスパイプラインのステージの相互接続の動的構成により、ハードウェアストリームアウトユニットから、ＧＰＵの外部にあるメモリに、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力するための手段と、コマンドの第２のセットを実行するために、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトするための手段と、コマンドの第２のセットを実行するための手段とを備える。
【０００９】
[0009]本開示の１つまたは複数の例の詳細が添付の図面および以下の説明に記載されている。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１０】
【図１】[0010]本開示の技法を実装するために使用され得る例示的なコンピューティングデバイスを示すブロック図。
【図２】[0011]図１のコンピューティングデバイスのＣＰＵ、ＧＰＵおよびメモリをさらに詳細に示すブロック図。
【図３Ａ】[0012]ディスプレイのピクセルを示す概念図。
【図３Ｂ】[0013]ピクセルタイルを示す概念図。
【図４】[0014]本開示で説明される１つまたは複数の例による、グラフィックス処理パイプラインの一例を実装し得るグラフィックス処理ユニット（ＧＰＵ）の一例を示すブロック図。
【図５】[0015]グラフィックスパイプラインの別の例を示すブロック図。
【図６】[0016]グラフィックスパイプラインの別の例を示すブロック図。
【図７】[0017]データを処理する例示的な方法を示すフローチャート。
【発明を実施するための形態】
【００１１】
[0018]本開示は、グラフィックス処理ユニット（ＧＰＵ）プロセスをスケジュールするためのプリエンプション技法を対象とする。プリエンプションは、プロセッサ（たとえば、ＧＰＵ）に、コマンドの第２のセットのために、コマンドの第１のセットの実行を停止し、次いで、コマンドの第２のセットの実行を完了した後に、コマンドの第１のセットの実行を完了することを行わせることを指す。たとえば、ＧＰＵは、コマンドのより高い優先度のセットのために、コマンドの低優先度セット実行をプリエンプトし得る。
【００１２】
[0019]コマンドの相対的高優先度セットの一例は、グラフィカルユーザインターフェース（ＧＵＩ）をレンダリングするためのコマンドである。ＧＰＵは、ユーザインターフェース（ＵＩ）レンダリングのためにますます使用されている。ＵＩコマンドストリームは、一般に、ユーザがＵＩにおいて期待することになった適切な視覚効果および応答性を達成するために適時にサービスされることから恩恵を受ける。高優先度ＵＩコマンドストリームが、ＧＰＵ上で実行されるために、ホストＣＰＵによってキューイングされたとき、ＧＰＵは、たとえば、非ＵＩグラフィックスコンテキスト、または汎用コンピューティングタスク（すなわち、グラフィックス処理ユニット上での汎用コンピューティング（ＧＰＧＰＵ：general-purpose computing on graphics processing unit）タスク）を実施するためにＧＰＵを使用するコンテキストなど、より低い優先度を有する異なるコンテキストに関連する別のキューイングされたコマンドストリームを実行していることがある。より高い優先度のＵＩコマンドストリームを実行するより前に、より低い優先度のコンテキストが実行を完了するのを待つことは、いくつかの場合には、ＵＩに関する許容できるユーザエクスペリエンスをもたらさないことがある。
【００１３】
[0020]より低い優先度のコマンドまたは低優先度コマンド、およびより高い優先度のコマンドまたは高優先度コマンドは、コマンドの適時の実行の重要性を示すために使用される相対語である。一例として、ユーザエクスペリエンスを妨害しないようにできるだけ速く実行されるべきであるコマンドは、実行がわずかに遅延されたとしても、ユーザエクスペリエンスを大幅に低下させないであろうコマンドと比較して、より高い優先度のものになる。一例として、ＵＩコマンドの実行が遅延された場合、ユーザエクスペリエンスは、ユーザ対話に対する応答が遅延されることになるので、悪影響を及ぼされることになる。バックグラウンドで起こるいくつかの行列演算のためのコマンドの実行が遅延された場合、ユーザエクスペリエンスに対する影響はほとんどないことがある。
【００１４】
[0021]ユーザエクスペリエンスのみに基づく以外に、コマンドを、より高い優先度またはより低い優先度とみなすための他の方法があり得る。本開示は、コマンドのあるセットからコマンドの別のセットに切り替えることの例について説明するために、より高い優先度およびより低い優先度という用語を相対語として使用する。しかしながら、本開示で説明される技法は、必ずしも、コマンドの切替えが、低優先度コマンドから高優先度コマンドに遷移するためにのみ行われる例に限定される必要があるとは限らない。
【００１５】
[0022]コマンドの第１のセットの実行の完了の前に、コマンドの第１のセットを実行することからコマンドの第２のセットに切り替えることは、ＧＰＵコンテキスト切替えまたはプリエンプションと呼ばれる。コンテキスト切替えまたはプリエンプションは、仮想化、ＵＩ、グラフィックス／計算アプリなどのような様々なＧＰＵ作業負荷、ならびに様々なコマンドの適時フォワードプログレスについてのハードウェア加速に有用である。たとえば、レンダリング遅延が望ましくないかまたは許容できないことがある、バーチャルリアリティ（タイムワープ、フレームごとの要件）および自動車使用など、新しい使用事例により、より頻繁なプリエンプションの必要が生じている。
【００１６】
[0023]この問題に対する１つのソリューションは、ホストＣＰＵが、より高い優先度のコマンドストリームを最初に実行することが有益であるかまたは望ましいと決定したときはいつでも、ホストＣＰＵが、任意のポイントにおいてより低い優先度のコマンドストリームの実行をプリエンプトし、より高い優先度のコマンドストリームをサービスすることを可能にすることである。しかしながら、そのようなソリューションは、ＧＰＵコマンドストリーム中のそのような任意のポイントにおいて、ＧＰＵ中でコンテキスト切替えを実施するために必要とされるオーバーヘッド（たとえば、追加の処理時間、追加のメモリ帯域幅使用、および／または追加のメモリ使用量）に関して費用がかかることがある。
【００１７】
[0024]いくつかのＧＰＵは、描画呼出しレベルプリエンプション（たとえば、発行された描画呼出しが完了された後のプリエンプション）を与える。描画呼出しは、レンダリングされるべきである複数のプリミティブを定義し得る。しかしながら、描画呼出しレベルプリエンプションは、（たとえば、１つのビンまたはスクリーンをカバーするための）大型の三角形の場合など、いくつかの場合に不十分であり得る。そのような問題に対処するために、よりきめ細かいプリエンプションが有用であり得る。ブラインドフリーズおよび保存復元（blind freeze and save-restore）（たとえば、すべての機能を停止し、ＧＰＵのステージのすべてのすべての状態情報を記憶すること）は、費用がかかり、したがって、効率的なソリューションでないことがある。
【００１８】
[0025]概して、ＧＰＵ中の頂点シェーダステージは、一般に高速で、頂点の数がジオメトリのサイズにかかわらず同じであるので（たとえば、三角形のサイズにかかわらず、三角形の場合は３つの頂点）、所与のジオメトリについて一定である。ＧＰＵ中のピクセルシェーダステージは時間がかかり得る（たとえば、作業負荷は、ジオメトリとは無関係に解像度によって変動する）。たとえば、頂点シェーダステージの作業負荷は、異なるサイズの三角形について同じであり得るが、ピクセルシェーダステージの作業負荷は、異なるサイズの三角形について異なり得る。たとえば、長く細い三角形は、長く太い三角形よりも少ないピクセルを有し、したがって、長く太い三角形についての作業負荷は、長く細い三角形についての作業負荷よりも多い。一例として、第１の三角形の頂点についての座標が、（０，０）、（１，１５）、および（２，０）であると仮定する。この例では、第１の三角形は、長い（たとえば、長さが１５ユニット）が、細い（たとえば、幅が２ユニットのみ）。第２の三角形の頂点についての座標が、（０，０）、（１０，１５）、および（２０，０）であると仮定する。この例では、第２の三角形は、第１の三角形と同じくらい長い（たとえば、長さが１５ユニット）が、太い（たとえば、幅が２０ユニット）。第１の三角形よりも第２の三角形中に多くのピクセルがあり、したがって、第２の三角形についての作業負荷は、第１の三角形よりも多い。また、解像度は、ピクセルシェーダステージについての作業負荷に影響を及ぼし得る。３２０×３２０解像度における長く細い三角形についての作業負荷は、１０８０ｐフルＨＤ解像度についてのそれほど著しくないことがある。
【００１９】
[0026]本開示は、ピクセルタイルレベル（グラニュラリティ（granularity））プリエンプションの例について説明する。たとえば、通常動作では、頂点シェーダステージは、（フラグメントシェーダステージとも呼ばれる）ピクセルシェーダステージにデータを受け渡す。しかしながら、ＧＰＵがプリエンプションのための命令を受信したとき、ＧＰＵは、すべての頂点シェーダステージをフラッシュ（たとえば、完了）するが、代わりに、外部メモリにデータを動的に向け得る。このようにして、いくつかの例では、プリエンプションは、頂点シェーダステージの実行の後であるが、描画呼出しのピクセルシェーダの実行の前に、行われる。また、ＧＰＵは、頂点シェーダステージからのデータがオンチッププロセスを介してフラグメントシェーダステージに移るかどうか、または頂点シェーダステージデータが外部メモリにオフチップで転送されるかどうかを動的に決定し得る。プリエンプトされたコンテキストを再開するとき、データは、外部メモリから読み取られ、グラフィックスパイプラインにフィードバックされる。
【００２０】
[0027]本開示で説明される技法では、ＧＰＵは、（たとえば、ＣＰＵから）描画呼出しを受信したことに応答して、ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行する。描画呼出しは、コマンドの第１のセットによってレンダリングされるべきである複数のプリミティブを定義し、グラフィックスパイプラインは、コマンドの第１のセットの実行中に生成されたデータを、ＧＰＵのローカルメモリに記憶するように構成される。ＧＰＵがコマンドのより高い優先度のセット（たとえば、コマンドの第２のセット）を実行する必要に基づいて、ＧＰＵは、コマンドの第１のセットの実行中に、および１つまたは複数のプリミティブのすべてをレンダリングするより前に、（たとえば、ＣＰＵから）プリエンプション通知を受信し得、プリエンプション通知を受信したことに応答して、ＧＰＵは、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを、ＧＰＵの外部にあるメモリに出力するように、ＧＰＵのグラフィックスパイプラインステージの相互接続を動的に構成する。ＧＰＵは、次いで、コマンドの第２のセット（たとえば、コマンドの第１のセットに対するより高い優先度のコマンド）を実行するために、描画呼出しの複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトし得る。
【００２１】
[0028]図１は、本開示の技法を実装するために使用され得る例示的なコンピューティングデバイス２を示すブロック図である。コンピューティングデバイス２は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームまたはコンソール、ワイヤレス通信デバイス（たとえば、携帯電話、セルラー電話、衛星電話、および／または携帯電話ハンドセットなど）、固定電話、インターネット電話、ポータブルビデオゲームデバイスまたは携帯情報端末（ＰＤＡ）などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、あるいはグラフィカルデータを処理および／または表示する任意の他のタイプのデバイスを備え得る。
【００２２】
[0029]図１の例に示されているように、コンピューティングデバイス２は、ユーザ入力インターフェース４と、ＣＰＵ６と、メモリコントローラ８と、システムメモリ１０と、グラフィックス処理ユニット（ＧＰＵ）１２と、ＧＰＵ１２のローカルメモリ１４と、ディスプレイインターフェース１６と、ディスプレイ１８と、バス２０とを含む。ユーザ入力インターフェース４、ＣＰＵ６、メモリコントローラ８、ＧＰＵ１２およびディスプレイインターフェース１６は、バス２０を使用して互いと通信し得る。バス２０は、第３世代バス（たとえば、ＨｙｐｅｒＴｒａｎｓｐｏｒｔバスまたはＩｎｆｉｎｉＢａｎｄバス）、第２世代バス（たとえばアドバンストグラフィックスポートバス、周辺構成要素相互接続（ＰＣＩ）エクスプレスバス、またはアドバンストエクステンシブルインターフェース（ＡＸＩ：Advanced eXentisible Interface）バス）、あるいは別のタイプのバスまたはデバイスの相互接続などの様々なバス構造のいずれかであり得る。図１に示されている異なる構成要素間のバスおよび通信インターフェースの特定の構成は例にすぎず、コンピューティングデバイスの他の構成および／あるいは同じまたは異なる構成要素をもつ他のグラフィックス処理システムが、本開示の技法を実装するために使用され得ることに留意されたい。
【００２３】
[0030]ＣＰＵ６は、コンピューティングデバイス２の動作を制御する汎用プロセッサまたは専用プロセッサを備え得る。ユーザは、ＣＰＵ６に１つまたは複数のソフトウェアアプリケーションを実行させるためにコンピューティングデバイス２に入力を与え得る。ＣＰＵ６上で実行するソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、ユーザ入力インターフェース４を介してコンピューティングデバイス２に結合されたキーボード、マウス、マイクロフォン、タッチパッド、または別の入力デバイスなどの１つまたは複数の入力デバイス（図示せず）を介して、コンピューティングデバイス２に入力を与え得る。
【００２４】
[0031]ＣＰＵ６上で実行するソフトウェアアプリケーションは、ディスプレイ１８へのグラフィックスデータのレンダリングを行わせるようにＣＰＵ６に命令する１つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、たとえば、オープングラフィックスライブラリ（ＯｐｅｎＧＬ（登録商標）：Open Graphics Library）アプリケーションプログラミングインターフェース（ＡＰＩ）、オープングラフィックスライブラリ組込みシステムズ（ＯｐｅｎＧＬ  ＥＳ：Open Graphics Library Embedded Systems）ＡＰＩ、Ｄｉｒｅｃｔ３Ｄ  ＡＰＩ、Ｘ３Ｄ  ＡＰＩ、ＲｅｎｄｅｒＭａｎ  ＡＰＩ、ＷｅｂＧＬ  ＡＰＩ、あるいは任意の他の公開またはプロプライエタリ規格グラフィックスＡＰＩなどのグラフィックスＡＰＩに準拠し得る。グラフィックスレンダリング命令を処理するために、ＣＰＵ６は、ＧＰＵ１２にグラフィックスデータのレンダリングの一部または全部を実施させるために、１つまたは複数のグラフィックスレンダリングコマンドをＧＰＵ１２に発行し得る。いくつかの例では、レンダリングされるべきグラフィックスデータは、グラフィックスプリミティブのリスト、たとえば、点、線、三角形、四角形、三角形ストリップなどを含み得る。
【００２５】
[0032]メモリコントローラ８は、システムメモリ１０に入るおよびそれから出るデータの転送を可能にする。たとえば、メモリコントローラ８は、コンピューティングデバイス２中の構成要素にメモリサービスを提供するために、メモリ読取りおよび書込みコマンドを受信し、メモリ１０に関するそのようなコマンドをサービスし得る。メモリコントローラ８はシステムメモリ１０に通信可能に結合される。メモリコントローラ８は、ＣＰＵ６とシステムメモリ１０の両方とは別個である処理モジュールであるものとして図１の例示的なコンピューティングデバイス２中に示されているが、他の例では、メモリコントローラ８の機能の一部または全部は、ＣＰＵ６とシステムメモリ１０の一方または両方の上で実装され得る。
【００２６】
[0033]システムメモリ１０は、ＣＰＵ６が実行するためにアクセス可能であるプログラムモジュールおよび／または命令、ならびに／あるいはＣＰＵ６上で実行しているプログラムによる使用のためのデータを記憶し得る。たとえば、システムメモリ１０は、ユーザアプリケーションと、アプリケーションに関連するグラフィックスデータとを記憶し得る。システムメモリ１０は、コンピューティングデバイス２の他の構成要素による使用のための情報、および／または他の構成要素によって生成される情報をさらに記憶し得る。たとえば、システムメモリ１０は、ＧＰＵ１２のためのデバイスメモリとして働き得、ＧＰＵ１２によってそれに対して演算されるべきデータ、ならびにＧＰＵ１２によって実施される演算から生じるデータを記憶し得る。たとえば、システムメモリ１０は、テクスチャバッファ、深度バッファ、ステンシルバッファ、頂点バッファ、フレームバッファなどの任意の組合せを記憶し得る。さらに、システムメモリ１０は、ＧＰＵ１２による処理のためのコマンドストリームを記憶し得る。システムメモリ１０は、たとえば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体または光記憶媒体など、１つまたは複数の揮発性または不揮発性メモリまたはストレージデバイスを含み得る。
【００２７】
[0034]ＧＰＵ１２は、１つまたは複数のグラフィックスプリミティブをディスプレイ１８にレンダリングするためにグラフィックス演算を実施するように構成され得る。したがって、ＣＰＵ６上で実行しているソフトウェアアプリケーションのうちの１つがグラフィックス処理を必要とするとき、ＣＰＵ６は、ディスプレイ１８にレンダリングするためのグラフィックスコマンドおよびグラフィックスデータをＧＰＵ１２に与え得る。グラフィックスコマンドは、たとえば、描画呼出しなどの描画コマンド、ＧＰＵ状態プログラミングコマンド、メモリ転送コマンド、汎用コンピューティングコマンド、カーネル実行コマンドなどを含み得る。いくつかの例では、ＣＰＵ６は、コマンドとグラフィックスデータとを、ＧＰＵ１２によってアクセスされ得るメモリ１０に書き込むことによって、コマンドとグラフィックスデータとをＧＰＵ１２に与え得る。いくつかの例では、ＧＰＵ１２は、ＣＰＵ６上で実行しているアプリケーションのための汎用コンピューティングを実施するようにさらに構成され得る。
【００２８】
[0035]ＧＰＵ１２は、いくつかの事例では、ベクトル演算の、ＣＰＵ６よりも効率的な処理を行う高度並列構造を用いて構築され得る。たとえば、ＧＰＵ１２は、複数の頂点またはピクセル上で並列様式で演算するように構成された複数の処理要素を含み得る。ＧＰＵ１２の高度並列性質は、いくつかの事例では、ＧＰＵ１２が、ＣＰＵ６を使用して直接ディスプレイ１８にシーンを描画するよりも速く、グラフィックス画像（たとえば、ＧＵＩ、ならびに２次元（２Ｄ）および／または３次元（３Ｄ）グラフィックスシーン）をディスプレイ１８上に描画することを可能にし得る。さらに、ＧＰＵ１２の高度並列性質は、ＧＰＵ１２が、ＣＰＵ６よりも速く、汎用コンピューティングアプリケーションのためのいくつかのタイプのベクトルおよび行列演算を処理することを可能にし得る。
【００２９】
[0036]ＧＰＵ１２は、いくつかの事例では、コンピューティングデバイス２のマザーボードに組み込まれ得る。他の事例では、ＧＰＵ１２は、コンピューティングデバイス２のマザーボード中のポート中に設置されたグラフィックスカード上に存在し得るか、または場合によっては、コンピューティングデバイス２と相互動作するように構成された周辺デバイス内に組み込まれ得る。さらなる事例では、ＧＰＵ１２は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。ＧＰＵ１２は、１つまたは複数のマイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）、あるいは他の等価な集積またはディスクリート論理回路など、１つまたは複数のプロセッサを含み得る。
【００３０】
[0037]ＧＰＵ１２はＧＰＵローカルメモリ１４に直接結合され得る。したがって、ＧＰＵ１２は、必ずしもバス２０を使用せずに、ＧＰＵローカルメモリ１４からデータを読み取り、ＧＰＵローカルメモリ１４にデータを書き込み得る。言い換えれば、ＧＰＵ１２は、オフチップメモリの代わりに、ローカルストレージを使用してデータをローカルに処理し得る。これは、ＧＰＵ１２が、重いバストラフィックを経験し得る、バス２０を介したデータの読取りおよび書込みを行う必要をなくすことによって、ＧＰＵ１２がより効率的な様式で動作することを可能にする。しかしながら、いくつかの事例では、ＧＰＵ１２は、別個のキャッシュを含まないことがあるが、代わりに、バス２０を介してシステムメモリ１０を利用し得る。ＧＰＵローカルメモリ１４は、たとえば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気データ媒体または光記憶媒体など、１つまたは複数の揮発性または不揮発性メモリあるいはストレージデバイスを含み得る。
【００３１】
[0038]ＣＰＵ６および／またはＧＰＵ１２は、レンダリングされた画像データを、システムメモリ１０内で割り振られたフレームバッファに記憶し得る。ディスプレイインターフェース１６は、フレームバッファからデータを取り出し、レンダリングされた画像データによって表される画像を表示するようにディスプレイ１８を構成し得る。一部の例では、ディスプレイインターフェース１６は、フレームバッファから取り出されたデジタル値を、ディスプレイ１８によって消費可能なアナログ信号に変換するように構成されたデジタルアナログ変換器（ＤＡＣ）を含み得る。他の例では、ディスプレイインターフェース１６は、処理のために、デジタル値をディスプレイ１８に直接受け渡し得る。ディスプレイ１８は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ（ＬＣＤ）、プラズマディスプレイパネル、発光ダイオード（ＬＥＤ）アレイ、陰極線管（ＣＲＴ）ディスプレイ、電子ペーパー、表面伝導電子放出ディスプレイ（ＳＥＤ）、レーザーテレビジョンディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ１８は、コンピューティングデバイス２内に組み込まれ得る。たとえば、ディスプレイ１８は、携帯電話ハンドセットまたはタブレットコンピュータのスクリーンであり得る。代替的に、ディスプレイ１８は、ワイヤードまたはワイヤレス通信リンクを介してコンピューティングデバイス２に結合されたスタンドアロンデバイスであり得る。たとえば、ディスプレイ１８は、ケーブルまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
【００３２】
[0039]本開示で説明される技法はプリエンプションに関する。プリエンプションでは、ＧＰＵ１２は、コマンドのあるセットの実行を休止し、コマンドの別のセットを完了まで実行し、次いで、コマンドの元のセットの実行を完了し得る。たとえば、ＧＰＵ１２は、ＣＰＵ６が、より高い優先度のコマンドの別のセットが実行されるべきであると決定したとき、コマンドのセットを実行していることがある。一例として、ＧＰＵ１２は、ＣＰＵ６が、ユーザが、タッチスクリーンであり得るディスプレイ１８を用いて対話したことに応答して、ユーザインターフェースのためのコマンドが最初に実行すべきであると決定したとき、ビデオゲームのコンテンツを生成するためのコマンドを実行している。この例では、ＧＰＵ１２は、ビデオゲームのためのコマンドの実行を完了することが遅延されるとしても、ユーザインターフェースを生成するためのコマンドを実行することを完了し得る。
【００３３】
[0040]いくつかの場合には、ＧＰＵ１２は、描画呼出しレベルプリエンプションを与えるように構成され得る。たとえば、プリエンプションは、描画呼出し境界においてのみ可能にされ得る。この例では、ＧＰＵ１２が、描画呼出しを実行し始め、次いで、プリエンプトするようにとの命令を受信した場合、ＧＰＵ１２は、描画呼出しの実行の完了（たとえば、ピクセルタイルのレンダリングのためのピクセルシェーダの実行を完了する）まで、プリエンプトすることができない。
【００３４】
[0041]しかしながら、描画呼出し境界においてのみプリエンプションを受けることは、いくつかの場合では望ましくないことがある。たとえば、「プリミティブのグループ」のための描画呼出しを完了することは、（たとえば、頂点シェーダ、ピクセルシェーダ、他のシェーダ、および描画呼出しに応答する固定機能ユニットの機能のすべての実行により）長い時間がかかり、より高い優先度のコマンドの実行を遅延させ得る。より多くの例として、シングルプリミティブレベルプリエンプションも不十分であり得、描画呼出しレベルプリエンプションは、（たとえば、１つのビンまたはスクリーンをカバーするための）大型の三角形の場合、うまく機能しないことがある。描画呼出しは、レンダリングされるべきである複数のプリミティブを定義し得る。
【００３５】
[0042]本開示は、よりきめ細かいプリエンプション（たとえば、描画呼出し境界において行われる必要がないプリエンプション）のための例示的な技法について説明する。例示的な技法は上記の問題に対処し得る。いくつかの場合には、ＶＲのような作業負荷は、タイムワープ（フレームごと）をサポートするための描画呼出し境界よりも細かいグラニュラリティのプリエンプションから恩恵を受け得る。本開示で説明される技法は、そのようなより細かいグラニュラリティのプリエンプションを与え得る。
【００３６】
[0043]いくつかの技法では、ＧＰＵ１２のブラインドフリーズおよび保存復元が、（たとえば、描画呼出し境界の中間についての）よりきめ細かいプリエンプションのために利用され得る。ブラインドフリーズおよび保存復元は、ＧＰＵ１２のすべての状態が、それらのそれぞれの状態において直ちにフリーズされ、次いで、それらの状態を示す情報が、ＧＰＵ１２の後の検索および復元のために記憶されることを意味する。しかしながら、ＧＰＵ１２のブラインドフリーズおよび保存復元は、処理および電力、ならびにＧＰＵ１２のあまりに多くのリソースを独占することに関して、費用がかかりすぎることがある。
【００３７】
[0044]概して、ＣＰＵ６は、ＧＰＵ１２にグラフィックスデータを処理させるために描画呼出しを出力し、応答して、ＧＰＵ１２は、描画呼出しに関連するグラフィックスデータを処理する。描画呼出しに関連するグラフィックスデータの量は、可変であり得る（たとえば、数百個のプリミティブ、数千個のプリミティブ）。グラフィックスデータを処理するために、ＧＰＵ１２は、固定機能処理ステージとプログラマブル処理ステージとを含む（図４により詳細に示されている）グラフィックスパイプラインを含み、これらのステージの各々は、ＧＰＵ１２が最終処理されたグラフィックスデータを出力するまで、受信データを処理し、得られた中間データをさらなるための次のステージに出力し、それにより、パイプラインを形成する。
【００３８】
[0045]プログラマブルステージの例は、頂点シェーダと（フラグメントシェーダとも呼ばれる）ピクセルシェーダとを含む。頂点シェーダステージは、一般に、グラフィックスパイプラインについてのスループット制限でなく、ジオメトリについて一定である。ピクセルシェーダステージは、作業負荷が、一般に、ジオメトリとは無関係に解像度によって変動するので、スループット制限であり得る。
【００３９】
[0046]たとえば、頂点シェーダステージは、プリミティブの頂点上で演算を実施する。プリミティブのサイズにかかわらず、頂点シェーダステージの頂点シェーダがその上で演算する設定された数の頂点がある。プリミティブの一例は三角形であり、三角形がどのくらい大きいかにかかわらず、頂点シェーダの３つのインスタンス化が実行する必要があり、各々は三角形の１つの頂点を処理するためのものである。しかしながら、ピクセルシェーダステージにおけるピクセルシェーダのインスタンス化の数は、プリミティブによってカプセル化されるピクセルの数の関数であり得る。たとえば、ピクセルシェーダの１つのインスタンス化は、プリミティブの各ピクセルについて実行する。したがって、処理観点から、頂点シェーダステージのスループットは、決定可能で、比較的一定であり得るが、ピクセルシェーダステージのスループットは、可変であり得、処理より前に必ずしも決定可能であるとは限らないことがある。
【００４０】
[0047]一例では、ＧＰＵ１２は、プリエンプションのためのピクセルタイルレベル（グラニュラリティ）について構成され得る。たとえば、ＧＰＵ１２は、ピクセルの「グループ」をレンダリングした後にプリエンプトする（ただし、描画呼出しに関連するピクセルのすべてを必ずしもプリエンプトするとは限らないことがある）。ピクセルグループの最も小さいグラニュラリティは、通常、ＧＰＵ１２のラスタライザによって作用される「ピクセルタイル」である。図４に示されているラスタライザは、ＧＰＵ１２のグラフィックスパイプラインの固定機能ステージであり得る。この例では、ＧＰＵ１２は、ピクセルタイル（たとえば、描画呼出しに関連するピクセルのうちのいくつかであるが、必ずしも描画呼出しに関連するすべてのピクセルとは限らない）をラスタライズおよびシェーディングした後に、プリエンプトする（たとえば、コマンドの第１のセットのうちのコマンドのすべての実行が完了しなかった場合でも、コマンドの第１のセットを実行することからコマンドの第２のセットに切り替え得る）。ピクセルタイルサイズは、ＧＰＵ１２のベンダー／ファミリー／アーキテクチャに基づいて可変であり得る。
【００４１】
[0048]本開示では、例はグラフィックス処理に関して説明される。しかしながら、本開示で説明される技法は、そのように限定されず、非グラフィックスアプリケーション（たとえば、計算シェーダ）がＧＰＵ１２上で実行する例に拡張する。描画呼出しおよびピクセルタイルという用語は、グラフィックスアプリケーションにもっぱら限定されると考えられるべきでなく、ＧＰＵ１２が計算シェーダ（たとえば、行列またはベクトル演算などのアプリケーションに関係する非グラフィックス）を実行しているときのための、類似するコマンドおよびデータのグループをカバーすると見なされるべきである。
【００４２】
[0049]上記で説明されたように、本開示で説明される技法は、ＧＰＵ１２が、描画呼出しの完了なしにプリエンプトすることを可能にする。グラフィックスデータを処理するために、ＧＰＵ１２は、頂点シェーダと、ラスタライザと、ピクセルシェーダとを含むグラフィックスパイプラインを実装する。グラフィックスパイプラインは、追加のステージ（たとえば、ドメインステージ、テッセレーション（tessellation）ステージ、およびハルステージ）を含み、頂点シェーダステージ、ラスタライザステージ、およびピクセルシェーダステージは、単に説明の目的で説明される。グラフィックスパイプラインは、２つの例としてのＤＸ１１パイプラインまたはＯｐｅｎＧＬパイプラインに準拠し得るが、特定のパイプライン規格に必ずしも準拠しなければならないとは限らない。
【００４３】
[0050]描画呼出しを完了するために、ＧＰＵ１２は、グラフィックスパイプライン全体を通してグラフィックスデータを処理する。一例では、グラフィックスパイプラインのあるユニット（たとえば、頂点シェーダ）は、中間データを生成し、中間データをＧＰＵ１２のローカルメモリ１４に記憶し、パイプライン中の次のユニット（たとえば、ラスタライザまたはピクセルシェーダ）は、処理のためにこの中間データを取り出す。別の例では、頂点シェーダは、常に、中間データを外部メモリ（たとえば、システムメモリ１０）に出力する。
【００４４】
[0051]本開示で説明される技法では、ＧＰＵ１２が、プリエンプトするようにとの命令を受信した場合、ＧＰＵ１２は、ＧＰＵ１２が、描画呼出しを完了する必要なしにプリエンプトすることができるように、中間データをシステムメモリ１０に動的に出力する。システムメモリ１０へのこの動的出力は、ホストプロセッサ（たとえば、ＣＰＵ６）からの命令またはそれの知識なしに行われる。しかしながら、ＧＰＵ１２が、プリエンプトするようにとの命令を受信しない場合、ＧＰＵ１２のグラフィックスパイプラインのステージは、グラフィックスデータをローカルメモリ１４に記憶する。
【００４５】
[0052]上記で説明されたように、グラフィックス処理を実施するために、ＧＰＵ１２は、ピクセルタイルと呼ばれるピクセルのグループに対して機能する。描画呼出しは１つまたは複数のプリミティブの処理を含み、各プリミティブは１つまたは複数のピクセルタイルを含み得る。いくつかの技法では、ＧＰＵ１２は、描画呼出しに関連するすべてのプリミティブのすべてのピクセルタイルがレンダリングされるまで、プリエンプトしないことになる。本開示で説明される技法では、ＧＰＵ１２は、レンダリングされる必要があるより多くのピクセルタイルがプリミティブ中にある、またはレンダリングされる必要があるより多くのプリミティブが描画呼出し中にある場合でも、プリミティブのピクセルタイルをレンダリングした後に、プリエンプトし得る。
【００４６】
[0053]したがって、本開示で説明される技法は、描画呼出しが１つまたは複数のプリミティブを含み、各プリミティブが１つまたは複数のピクセルタイルを含むので、描画呼出しプリエンプション（たとえば、描画呼出しの処理の後のプリエンプション）よりも細かいグラニュラリティである、ピクセルタイルレベルプリエンプション（たとえば、ピクセルタイルの処理の後のプリエンプション）を与える。ＧＰＵ１２が、プリエンプションの前に、描画呼出しに関連するすべてのプリミティブのすべてのピクセルタイルを処理することを完了するのを待つことは、ピクセルタイルの実行の完了の直後にプリエンプトすることよりもはるかにより長い時間であり得る。
【００４７】
[0054]本開示で説明される技法では、描画呼出しの１つまたは複数のプリミティブは、プリミティブの第１のセットとプリミティブの第２のセットとを含み、ＧＰＵ１２は、プリミティブの第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを含み、プリミティブの第２のセットのピクセルのいずれをも含まないピクセルタイルを処理した後に、プリエンプトし得る。描画呼出しレベルプリエンプションのみを与える技法では、ＧＰＵ１２は、プリエンプトする前に、プリミティブの第１のセットとプリミティブの第２のセットの両方のすべてのピクセルタイルを処理する必要があることになる。
【００４８】
[0055]プリエンプションを実施し、ピクセルタイルレベルグラニュラリティを与えるために、ＧＰＵ１２は、中間データをシステムメモリ１０に動的に出力し得る。中間データのそのような動的出力を実施するために、ＧＰＵ１２は、プリエンプション通知に応答して、ＧＰＵ１２が、頂点シェーダステージによって生成された中間データをシステムメモリ１０に出力するようにＧＰＵ１２のグラフィックスパイプラインを動的に構成するように構成され得る。
【００４９】
[0056]頂点シェーダステージに続くステージの各々は、グラフィックスパイプライン中に現在あるグラフィックスデータの処理を完了し得る。たとえば、グラフィックスパイプラインのラスタライザステージは、ピクセルタイルグラニュラリティに対して機能するので、ピクセルシェーダは、処理されている特定のピクセルタイルのピクセルのための最終グラフィックスデータを出力し得る。その後、グラフィックスパイプラインは、処理されるべきより多くのピクセルタイルおよびプリミティブがある場合でも、描画呼出しに関連するプリミティブのピクセルタイルを処理するためのコマンドの実行を停止し得る。
【００５０】
[0057]ＧＰＵ１２は、次いで、実行のために現在自由に使用されることができるグラフィックスパイプラインを介して、命令の別のセット（たとえば、より高い優先度の命令）を実行し得る。次いで、ＧＰＵ１２が、命令の元のセットの実行を完了すべきであるとき、ＧＰＵ１２は、システムメモリ１０から中間データを読み取り、中間データを生成したステージに続くグラフィックスパイプラインステージに中間データを供給する。
【００５１】
[0058]通常動作中に、各ステージは、中間データをＧＰＵ１２のローカルメモリ１４に出力する。本開示で説明される技法では、プリエンプション通知に応答して、ＧＰＵ１２は、グラフィックスパイプラインのステージ（たとえば、ラスタライザステージ）に接続するローカルメモリの出力を切断し、システムメモリ１０に中間データを出力するハードウェアストリームアウトユニットに、ローカルメモリの出力を接続し得る。
【００５２】
[0059]本開示で使用される、「切断する」および「接続する」という用語は、中間データが異なる仕方でルーティングされることを可能にするハードウェア構成要素（たとえば、スイッチ）が存在することを伝達するために使用される。本開示で説明される技法を用いて、グラフィックスパイプラインのストリームアウトハードウェアが、プリエンプションを同じく可能にするために再利用され得る。このようにして、計算シェーダなどのようなソフトウェアは、スイッチのようなハードウェアのように異なる仕方で中間データをルーティングするために実行される必要がなく、ストリームアウトユニットは、ストリームアウトハードウェアの通常目的に加えてプリエンプションのためにさらに使用され得る。
【００５３】
[0060]ＧＰＵ１２は、コマンドの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成する。たとえば、ＧＰＵ１２のグラフィックスパイプラインのラスタライザステージは、通常、グラフィックスパイプラインのピクセルシェーダステージに結合される。いくつかの例では、コマンドの実行より前に、グラフィックスパイプラインのステージがどのように相互接続されるかを構成するのではなく、ＧＰＵ１２は、コマンドの実行が開始した後に、グラフィックスパイプラインのステージの相互接続を動的に構成し得る（たとえば、コマンドのちの少なくとも１つのコマンドが実行した後に、ＧＰＵ１２は、ステージの相互接続を動的に構成する）。
【００５４】
[0061]ＧＰＵ１２は、コマンドのセットの実行中に、グラフィックスパイプラインのステージの相互接続の動的構成により、システムメモリ１０に、コマンドのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力し得る。いくつかの技法では、ＧＰＵ１２は、中間データをシステムメモリ１０に決して出力しない（たとえば、中間データを決してストリームアウトしない）ように構成され得る。いくつかの技法では、ＧＰＵ１２は、中間データをシステムメモリ１０に常に出力する（たとえば、中間データを常にストリームアウトする）ように構成され得る。いくつかの例は、中間データの随意のストリーミングアウト（たとえば、中間データをシステムメモリ１０に随意に出力すること）を可能にした。しかしながら、随意のストリーミングアウトのそのような例では、ＧＰＵ１２のグラフィックスパイプラインが、中間データを出力すべきであるのか、中間データを出力すべきでないのかは、（たとえば、ＯｐｅｎＧＬおよびＤｉｒｅｃｔ  Ｘ  ＡＰＩなどに従って）ＧＰＵ１２によるコマンドの実行より前に決定され、ＣＰＵ６によって設定された。
【００５５】
[0062]本開示で説明される技法では、ＧＰＵ１２が中間データを出力するかどうかは、動的決定であり、プリエンプション命令の受信に応答して行われる。ＣＰＵ６は、ＧＰＵ１２存在実行の前に、ＧＰＵ１２のグラフィックス処理パイプラインが、中間データをシステムメモリ１０に出力すべきであるのか、中間データをシステムメモリ１０に出力すべきでないのかをあらかじめ定義する必要がないことがある。そうではなく、ＧＰＵ１２は、中間データをシステムメモリ１０に出力しないが、プリエンプション通知に応答して、中間データをシステムメモリ１０に出力するようにグラフィックスパイプラインのステージの相互接続を動的に構成する（たとえば、ローカルメモリ１４の出力をラスタライザステージから切断し、ローカルメモリ１４のその出力をハードウェアストリームアウトユニットに接続する）ように構成され得る。ＣＰＵ６から見ると、ＧＰＵ１２のグラフィックスパイプラインの変化がない（すなわち、ＧＰＵ１２は、ＣＰＵ６からの命令なしに、中間データをシステムメモリ１０に出力するために、グラフィックスパイプラインのステージの相互接続を動的に構成する（たとえば、あるステージが接続されたものを変更し、そのステージを異なるユニットに接続する））。
【００５６】
[0063]図２は、図１のコンピューティングデバイス２のＣＰＵ６と、ＧＰＵ１２と、メモリ１０とをさらに詳細に示すブロック図である。図２に示されているように、ＣＰＵ６はＧＰＵ１２とメモリ１０とに通信可能に結合され、ＧＰＵ１２はＣＰＵ６とメモリ１０とに通信可能に結合される。ＧＰＵ１２は、いくつかの例では、ＣＰＵ６とともにマザーボード上に統合され得る。追加の例では、ＧＰＵ１２は、ＣＰＵ６を含むマザーボードのポート中に設置されたグラフィックスカード上に実装され得る。さらなる例では、ＧＰＵ１２は、ＣＰＵ６と相互動作するように構成された周辺デバイス内に組み込まれ得る。追加の例では、ＧＰＵ１２は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。ＣＰＵ６は、ソフトウェアアプリケーション２４Ａ、２４Ｂと、グラフィックスＡＰＩ２６と、ＧＰＵドライバ２８と、オペレーティングシステム３０とを実行するように構成される。ＧＰＵ１２は、コントローラ３２と１つまたは複数の処理ユニット３４とを含む。
【００５７】
[0064]ソフトウェアアプリケーション２４Ａ、２４Ｂは、各々、グラフィックコンテンツが表示されることを引き起こす１つまたは複数の命令、または非グラフィックスタスク（たとえば、汎用コンピューティングタスク）がＧＰＵ１２上で実施されることを引き起こす１つまたは複数の命令のうちの少なくとも１つを含み得る。ソフトウェアアプリケーション２４Ａ、２４Ｂは、命令をグラフィックスＡＰＩ２６に発行し得る。グラフィックスＡＰＩ２６は、ソフトウェアアプリケーション２４Ａ、２４Ｂから受信された命令を、ＧＰＵドライバ２８によって消費可能であるフォーマットに変換するランタイムサービスであり得る。
【００５８】
[0065]ＧＰＵドライバ２８は、グラフィックスＡＰＩ２６を介して、ソフトウェアアプリケーション２４Ａ、２４Ｂから命令を受信し、命令をサービスするためにＧＰＵ１２の動作を制御する。たとえば、ＧＰＵドライバ２８は、１つまたは複数のコマンドストリームを構築し、コマンドストリームをメモリ１０に入れ、コマンドストリームを実行するようにＧＰＵ１２に命令し得る。ＧＰＵドライバ２８は、コマンドストリームをメモリ１０に入れ、オペレーティングシステム３０を介して、たとえば、１つまたは複数のシステム呼出しを介してＧＰＵ１２と通信し得る。
【００５９】
[0066]ＧＰＵドライバ２８は、別のコマンドストリーム（たとえば、高優先度コマンドストリーム）が、実行の準備ができていることを示すために、プリエンプション通知をＧＰＵコントローラ３２に送り得る。いくつかの例では、プリエンプション通知はまた、どのコマンドストリームを、現在実行されているコマンドストリームのプリエンプション時に実行すべきかをＧＰＵ１２に示し得る。ＧＰＵドライバ２８は、たとえば、ＧＰＵコントローラ３２によってポーリングされる１つまたは複数のＧＰＵレジスタに（たとえば、オペレーティングシステム３０を介して）１つまたは複数の値を書き込むことによって、プリエンプション通知をＧＰＵコントローラ３２に送り得る。１つまたは複数のＧＰＵレジスタは、ＧＰＵ１２中にある１つまたは複数のハードウェアＧＰＵレジスタ、メモリ（たとえば、メモリ１０）中にある１つまたは複数のメモリマップＧＰＵレジスタ、あるいはそれらの任意の組合せを含み得る。メモリマップＧＰＵレジスタに値を書き込むとき、ＣＰＵ６は、ＧＰＵコントローラ３２によってポーリングされるメモリ１０中の１つまたは複数の特定のメモリアドレスに値を書き込み得る。いくつかの例では、ＧＰＵドライバ２８は、（ＧＰＵ１２における「割込み」を含む）プリエンプション通知をアクティブにするための第１の値を、１つまたは複数のＧＰＵレジスタに書き込み、現在実行されているコマンドストリームのプリエンプション時に実行すべきコマンドストリームのロケーションを識別する第２の値を、１つまたは複数のＧＰＵレジスタに書き込み得る。
【００６０】
[0067]コントローラ３２は、コマンドストリームに記憶されたコマンドを取り出し、処理ユニット３４のうちの１つまたは複数上での実行のためにコマンドをディスパッチ（dispatch）するように構成される。コントローラ３２は、処理ユニット３４のすべてまたはサブセット上での実行のために、コマンドストリームからコマンドをディスパッチし得る。いくつかの例では、コントローラ３２は、ＣＰＵ６がプリエンプション通知をＧＰＵ１２に送ったかどうかを示す１つまたは複数のＧＰＵレジスタをポーリングするように構成され得る。ＧＰＵレジスタがメモリマップレジスタである場合、コントローラ３２は、ＣＰＵ６がプリエンプション通知をＧＰＵ１２に送ったかどうかを示すメモリ１０中の１つまたは複数の特定のメモリアドレスをポーリングするように構成され得る。１つまたは複数のＧＰＵレジスタが、ＣＰＵ６がプリエンプション通知をＧＰＵ１２に送ったことを示すことに応答して、コントローラ３２は、現在実行しているＧＰＵコマンドストリームの実行をプリエンプトし、別のコマンドストリームを実行し始め得る。たとえば、本開示で説明される技法では、コントローラ３２は、プリエンプション通知に応答して、ＧＰＵ１２が、１つまたは複数の処理ユニット３４のうちの処理ユニットによって生成された中間データを、システムメモリ１０に出力するように、処理ユニット３４によって形成されるグラフィックスパイプラインを構成し得る。いくつかの場合には、コントローラ３２は、プリエンプション時に実行すべきコマンドストリームを識別する、ＧＰＵ１２の１つまたは複数のレジスタに記憶された情報を読み取ることによって、現在実行中のコマンドストリームのプリエンプション時に実行すべきコマンドストリームを決定するように構成され得る。たとえば、ＣＰＵ６は、より高い優先度のコマンドストリームのメモリロケーションを識別するポインタを１つまたは複数のＧＰＵレジスタに記憶し得る。
【００６１】
[0068]コントローラ３２は、ＧＰＵ１２のハードウェアであり得るか、ＧＰＵ１２上で実行するソフトウェアまたはファームウェアであり得るか、あるいはその両方の組合せである。また、コントローラ３２が、プリエンプトするようにとの命令が受信されたかどうかをどのように決定するかについての上記の説明は、単に説明の目的で与えられた。ＣＰＵ６がＧＰＵ１２にプリエンプトするように命令するための他の方法があり得、本開示で説明される技法は、特定の例に限定されない。
【００６２】
[0069]処理ユニット３４は、それらの各々がプログラマブル処理ユニットまたは固定機能処理ユニットであり得る、１つまたは複数の処理ユニットを含み得る。ステージとも呼ばれる、処理ユニット３４のうちの処理ユニットは、グラフィックス処理を実施するように構成されたグラフィックスパイプラインをともに形成する。プログラマブル処理ユニットは、たとえば、ＣＰＵ６からＧＰＵ１２上にダウンロードされた１つまたは複数のシェーダプログラムを実行するように構成されたプログラマブルシェーダユニットを含み得る。シェーダプログラムは、いくつかの例では、たとえば、ＯｐｅｎＧＬシェーディング言語（ＧＬＳＬ）、高レベルシェーディング言語（ＨＬＳＬ）、グラフィックスのためのＣ（Ｃｇ）シェーディング言語など、高レベルシェーディング言語で書き込まれたプログラムのコンパイルされたバージョンであり得る。いくつかの例では、プログラマブルシェーダユニットは、並列に動作するように構成された複数の処理ユニット、たとえば、ＳＩＭＤパイプラインを含み得る。プログラマブルシェーダユニットは、シェーダプログラム命令を記憶するプログラムメモリと、実行状態レジスタ、たとえば、実行されているプログラムメモリ中の現在の命令またはフェッチされるべき次の命令を示すプログラムカウンタレジスタとを有し得る。処理ユニット３４中のプログラマブルシェーダユニットは、たとえば、頂点シェーダステージ、ピクセルシェーダステージ、ジオメトリシェーダステージ、ハルシェーダステージ（hull shader stages）、ドメインシェーダステージ、計算シェーダステージ、および／またはユニファイドシェーダステージ（unified shader stages）を含み得る。
【００６３】
[0070]固定機能処理ユニットは、いくつかの機能を実施するために配線接続されたハードウェアを含み得る。固定機能ハードウェアは、１つまたは複数の制御信号を介して、たとえば、異なる機能を実施するように構成可能であり得るが、固定機能ハードウェアは、一般に、ユーザによってコンパイルされたプログラムを受信することが可能であるプログラムメモリを含まない。いくつかの例では、処理ユニット３４中の固定機能処理ユニットは、たとえば、深度テスト、シザーテスト（scissors testing）、アルファブレンディングなど、ラスタ動作を実施する、たとえば、処理ユニットを含み得る。
【００６４】
[0071]図２の例示的なグラフィックス処理システムでは、メモリ１０は、２つのコマンドストリームを含み、各コマンドストリームは、異なるグラフィックスアプリケーションコンテキスト（すなわち、ソフトウェアアプリケーション２４Ａ、２４Ｂのうちの異なるもの）に関連する。たとえば、第１のコマンドストリームは、ソフトウェアアプリケーション２４Ａのためのグラフィックスアプリケーションコンテキストに関連し、第２のコマンドストリームは、ソフトウェアアプリケーション２４Ｂのためのグラフィックスアプリケーションコンテキストに関連する。説明しやすいように、２つのＧＰＵコマンドストリームが、図２の例示的なグラフィックス処理システムのメモリ１０に記憶されるものとして説明される。しかしながら、他の例では、グラフィックス処理システムの同じまたは異なる構成要素中に記憶された同じまたは異なる数のＧＰＵコマンドストリームが、使用され得る。
【００６５】
[0072]上記の例では、ＧＰＵ１２がそれらの間で切り替える２つのストリームは、２つの異なるアプリケーション２４Ａ、２４Ｂからのコマンドストリームである。ただし、本開示で説明される例はそのように限定されない。いくつかの例では、ＧＰＵ１２は、必要な場合、同じアプリケーションのコマンドストリーム間で切り替える（たとえば、アプリケーション２４Ａの高優先度ストリームが、アプリケーション２４Ａの低優先度ストリームをプリエンプトし得る）。本開示で説明されるコマンドストリームは、異なるアプリケーションのためのものであることに限定されると考えられるべきでなく、同じアプリケーションのためのものであり得る。
【００６６】
[0073]ＣＰＵ６のＧＰＵドライバ２８は、コマンドストリームをメモリ１０に書き込むように構成され得、ＧＰＵ１２のコントローラ３２は、コマンドストリームの１つまたは複数のコマンドをメモリ１０から読み取るように構成され得る。いくつかの例では、コマンドストリームの一方または両方が、メモリ１０にリングバッファとして記憶され得る。リングバッファは、ＣＰＵ６およびＧＰＵ１２が、データをリングバッファに書き込むことと、データをリングバッファから読み取ることとに関連する同期状態変数を維持する、循環アドレス指定方式を用いたバッファであり得る。たとえば、第１のコマンドストリームがリングバッファである場合、ＣＰＵ６およびＧＰＵ１２の各々は、リングバッファ中のそこに書き込まれるべき次のアドレスを示す書込みポインタと、リングバッファ中のそこから読み取られるべき次のアドレスを示す読取りポインタとを記憶し得る。ＣＰＵ６がリングバッファに新しいコマンドを書き込むとき、ＣＰＵ６は、ＣＰＵ６中の書込みポインタを更新し、ＧＰＵ１２に、ＧＰＵ１２中の書込みポインタを更新するように命令し得る。同様に、ＧＰＵ１２がリングバッファから新しいコマンドを読み取るとき、ＧＰＵ１２は、ＧＰＵ１２中の読取りポインタを更新し、ＣＰＵ６に、ＣＰＵ６中の読取りポインタを更新するように命令し得る。他の同期機構が可能である。読取りポインタおよび／または書込みポインタが、リングバッファのために割り振られたアドレスの範囲内の最高アドレスに達したとき、読取りポインタおよび／または書込みポインタは、循環アドレス指定方式を実装するために、最低アドレスにラップアラウンドし得る。
【００６７】
[0074]次に、本開示に従って設計された例示的なＧＰＵドライバ２８と例示的なＧＰＵコントローラ３２との例示的な動作が、図２に関して説明される。この例では、ソフトウェアアプリケーション２４Ｂは、ソフトウェアアプリケーション２４Ａのスケジューリング優先度よりも高いスケジューリング優先度を有する。特に、この例では、ソフトウェアアプリケーション２４Ｂは、グラフィックコンテンツが表示されることを引き起こし、ユーザインターフェース（ＵＩ）の適時の更新を保証するためにＧＰＵ１２に対する高優先度アクセスを要求する、１つまたは複数の命令を含むＵＩソフトウェアアプリケーションである。一方、この例では、ソフトウェアアプリケーション２４Ａは、グラフィックコンテンツが表示されることを引き起こす１つまたは複数の命令、および／または非グラフィックスタスク（たとえば、ＧＰＧＰＵコンピューティングタスク）がＧＰＵ１２上で実施されることを引き起こす１つまたは複数の命令を含むより低い優先度のアプリケーションである。
【００６８】
[0075]ＧＰＵドライバ２８は、ＧＰＵ１２によって実施されるべきグラフィックス演算および／または汎用コンピューティング演算を指定する１つまたは複数の命令を、ソフトウェアアプリケーション２４Ａから受信する。ＧＰＵドライバ２８は、ＧＰＵコントローラ３２によってアクセス可能であるメモリ１０に、出力コマンドストリームを入れる。ＧＰＵドライバ２８は、ソフトウェアアプリケーション２４Ａに対応するコマンドストリームが、処理のために利用可能であることをＧＰＵコントローラ３２に通知する。たとえば、ＧＰＵドライバ２８は、ＧＰＵレジスタ（たとえば、ＧＰＵ１２によってポーリングされるＧＰＵハードウェアレジスタおよび／またはＧＰＵ１２によってポーリングされるＧＰＵメモリマップレジスタ）に、コマンドストリームが実行の準備ができていることを示す１つまたは複数の値を書き込み得る。
【００６９】
[0076]コマンドストリームが実行の準備ができているという通知時に、ＧＰＵ１２のコントローラ３２は、リソースが、コマンドストリームを実行し始めるためにＧＰＵ１２上で現在利用可能であるかどうかを決定し得る。リソースが利用可能である場合、コントローラ３２は、コマンドストリーム中のコマンドをディスパッチし始める。一方、ＧＰＵドライバ２８は、ＧＰＵ１２によって実施されるべき高優先度グラフィックス演算を指定する１つまたは複数の命令を、ＵＩソフトウェアアプリケーション２４Ｂから受信する。ＧＰＵドライバ２８は、受信された命令によって指定された演算を行うための高優先度コマンドストリームを生成し、得られたコマンドストリームをメモリ１０に入れる。
【００７０】
[0077]ＧＰＵドライバ２８は、高優先度コマンドストリームが処理の準備ができていることと、このコマンドストリームが、ＧＰＵ１２上で実行している他のより低い優先度のコマンドストリームをプリエンプトすべきであることとを示すプリエンプション通知を、コントローラ３２に与える。いくつかの例では、ＧＰＵドライバ２８は、ＧＰＵ１２によってポーリングされるＧＰＵハードウェアレジスタに書き込むことによって、および／またはＧＰＵ１２によってポーリングされるメモリマップレジスタ（たとえば、メモリ１０中の特定のロケーション）に書き込むことによって、プリエンプション通知（たとえば、プリエンプション命令またはコマンド）をＧＰＵ１２に与え得る。
【００７１】
[0078]いくつかの場合には、ＧＰＵドライバ２８またはＣＰＵ６は、異なるアプリケーション、または同じアプリケーションの異なるコマンドについて、プリエンプションレベルを定義し得る。たとえば、第１のストリームは、第２のストリームよりも高い優先度を有するが、第３のストリームよりも低い優先度を有する。この例では、第２のストリームが実行している場合、ＧＰＵドライバ２８は、ＧＰＵ１２に、第１のストリームまたは第３のストリームのいずれかで第２のストリームをプリエンプトさせ得る。しかしながら、第１のストリームが実行している場合、第３のストリームのみがプリエンプトし得、どのストリームも第３のストリームをプリエンプトしないことがある。この例は、「ｎ個の」ストリームに拡張され得、ストリームが他のストリームでプリエンプトすることができる、他のファクタがあり得る。
【００７２】
[0079]本開示で説明される技法では、ＧＰＵ１２は、ピクセルタイルレベルプリエンプションをサポートし得る。たとえば、ＧＰＵ１２は、「通常」処理のためにオンチップデータパッシングを使用し、グラフィックスパイプラインのステージが相互接続される仕方を動的に構成することによって、プリエンプションに基づいて、頂点出力をストリームアウトすることを動的に選定し得る。一例として、ＧＰＵ１２は、「プリエンプション」に関するパイプライン中のプリミティブのためのデータストレージのために、メモリ１０（たとえば、通信のためにバス２０を必要とするメモリ）など、外部メモリを使用し得、ピクセル（タイル）生成を停止し得る。ＧＰＵ１２は、すべての頂点ステージをフラッシュするが、代わりに、それらを外部メモリに動的にダイレクトし得る。コントローラ３２、ＧＰＵ１２の何らかの他のハードウェアまたはソフトウェア構成要素、あるいはコントローラ３２およびＧＰＵ１２の他の構成要素が、メモリ１０へのこの動的ダイレクションを実施し得る。再開時に、コントローラ３２またはＧＰＵ１２の何らかの他のハードウェアもしくはソフトウェア構成要素、あるいはコントローラ３２およびＧＰＵ１２の他の構成要素は、変換後頂点属性をピクセルパイプラインに供給し得る。
【００７３】
[0080]いくつかの例では、変換後頂点属性はピクセルシェーダステージに供給される。しかしながら、概して、再開時に、コントローラ３２またはＧＰＵ１２の何らかの他のハードウェアもしくはソフトウェア構成要素、あるいはコントローラ３２およびＧＰＵ１２の他の構成要素は、頂点シェーダステージ、ドメインシェーダステージ、ジオメトリシェーダステージ、または他のシェーダステージなど、プリピクセルシェーダステージ出力に、変換後頂点属性を供給し得る。プロセスの再開が起こるステージは、ＧＰＵ１２のステージのうちの１つにあり得、本開示で説明される技法は、プリエンプトされたプロセスの再開が開始する、ＧＰＵ１２の特定のステージに限定されると考えられるべきでない。
【００７４】
[0081]一例として、処理ユニット３４によって形成されたグラフィックスパイプラインは、あるユニット（またはステージ）が、次のステージが受信し、さらに処理する中間データを生成するパイプライン様式で、グラフィックス処理を実施し得る。通常動作中に、各ステージは、ＧＰＵ１２のローカルメモリ１４（たとえば、キャッシュ、ただし、レジスタまたはバッファなどの他の例もローカルメモリ１４として可能である）に、生成された中間データを出力する。次のステージは、次いで、さらなる処理のために中間データをローカルメモリから読み取る。
【００７５】
[0082]しかしながら、ＣＰＵ６がプリエンプション通知を出力した場合、コントローラ３２は、処理ユニット３４によって形成されたグラフィックスパイプラインの構成を変更するように構成され得る。一例として、コントローラ３２は、中間データをローカルメモリから受信するグラフィックスパイプラインのステージを切断し、中間データをシステムメモリ１０に出力するハードウェアストリームアウトユニットに、ローカルメモリの出力を接続し得る。コントローラ３２は、プリエンプション通知に応答して中間データを動的にストリームアウト（たとえば、システムメモリ１０に出力）するように構成され得る。
【００７６】
[0083]いくつかの例では、処理ユニット３４によって形成されるグラフィックスパイプラインは、コマンドの実行より前に、中間データをシステムメモリ１０にストリームアウトする、または中間データをシステムメモリ１０にストリーミングしない、のいずれかを行うように構成され得る。本開示で説明される技法では、（たとえば、プリエンプション通知に応答して）コマンドの実行中にグラフィックスパイプラインを動的に構成することによって、ＧＰＵ１２は、プリエンプションをより速く実施することが可能であり得る。
【００７７】
[0084]たとえば、ＧＰＵ１２は、中間データ（たとえば、１つまたは複数のプリミティブをレンダリングするプロセス中、生成されたデータ）をシステムメモリ１０に出力するように構成され得、これは、中間データがシステムメモリ１０に書き込まれた後に、処理ユニット３４が、より高い優先度のコマンドを実行する準備ができていることを意味する。処理ユニット３４は、より高い優先度のコマンドを実行する前に、描画呼出しのすべてのプリミティブが処理されるまで待つ必要がない。
【００７８】
[0085]上述のように、切断するおよび接続するは、中間データをルーティングするように特別に設計されたハードウェア構成要素があることを意味するために本開示で使用される。たとえば、ストリームアウトユニットは、（たとえば、プログラマブルでない）固定機能をもつハードウェアユニットであり得る。ストリームアウトユニットの固定機能は、中間データをルーティングするためのものであり得、ＧＰＵ１２は、プログラム的に（機能的に）ではなく、物理的にグラフィックスパイプラインを変更するために、ローカルメモリの出力を切断し、ローカルメモリの出力をストリームアウトユニットに接続し得る。いくつかの例では、計算シェーダのようなソフトウェアは、本技法が、高速プリエンプションを可能にするプリエンプション目的のストリームアウト機能を活用するので、中間データをルーティングするために実行される必要がない。
【００７９】
[0086]図３Ａは、ディスプレイ１８のピクセルを示す概念図である。図３Ｂは、ディスプレイ１８上のピクセルタイル３６を示す概念図である。図３Ａでは、２つのプリミティブ（たとえば、ディスプレイ１８にわたる対角線によって形成された２つの三角形）がある。ピクセルタイル３６は、ＧＰＵ１２のラスタライザがそれに作用するピクセルグループの最も小さいグラニュラリティの一例である。図示のように、ピクセルタイル３６はディスプレイ１８の右上コーナーにあるが、他のロケーションが可能である。また、ピクセルタイル３６は、４×３であるとして示されている（たとえば、ピクセルタイル３６中に、横に４つのピクセルおよび下に３つのピクセルがある）が、他のサイズが可能であり、概して、ＧＰＵ１２のベンダー、ファミリー、および／またはアーキテクチャに基づく。
【００８０】
[0087]ピクセルタイル３６が処理されていると仮定する、本開示で説明される技法では、ＧＰＵ１２は、ＧＰＵ１２がピクセルタイル３６を処理した後に、コマンドのより高い優先度のセットで、コマンドのより低い優先度のセットの実行をプリエンプトすることが可能であり得る。たとえば、ＧＰＵ１２がピクセルタイル３６のピクセルのピクセル値を生成および記憶し、すべての他の中間データがシステムメモリ１０にストリームアウトされた後に、ＧＰＵ１２は、より高い優先度のコマンドを実行することに切り替え得る。
【００８１】
[0088]いくつかの技法では、ＧＰＵ１２は、ピクセルタイル３６を含むプリミティブのすべてのピクセルのためのピクセル値が生成されるまでだけでなく、他のプリミティブ（たとえば、ピクセルタイル３６を含まないプリミティブ）のすべてのピクセルのためのピクセル値が生成されるまでも、待つ必要があり得た。ＧＰＵ１２は、描画呼出しの完了まで（たとえば、ＧＰＵ１２が描画呼出し境界に達するまで）待つ必要があったであろう。描画呼出し境界は、描画呼出しの終了（たとえば、ピクセル値が、描画呼出しの最後のプリミティブの最後のピクセルについて生成および記憶された後）である。
【００８２】
[0089]ピクセルタイルレベルグラニュラリティのプリエンプションの場合、プリエンプションの遅延が低減される。たとえば、図３Ｂにおいて、プリミティブの第１のセットは、ピクセルタイル３６を含む上部プリミティブを含み、プリミティブの第２のセットは、下部プリミティブを含むと仮定する。この例では、プリエンプトすることは、ピクセルタイル３６のピクセルのラスタライゼーションおよびシェーディングの後に（たとえば、ＧＰＵ１２が、ピクセルタイル３６のピクセルのためのピクセル値を生成した後に）、および他の後続のタイルのラスタライゼーションおよびシェーディングがない（たとえば、プリエンプションが行われる前に、ピクセルタイル３６が処理された後にタイルのラスタライゼーションおよびシェーディングがない）後にプリエンプトすることを含む。たとえば、図３Ｂ中の両方のプリミティブは描画呼出しの一部であったことがあるが、プリエンプションは、ピクセルタイル３６のためのピクセル値を生成した後に行われ、ここで、ピクセルタイル３６は、プリミティブの第１のセット（たとえば、上部プリミティブ）のうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを含み、プリミティブの第２のセット（たとえば、下部プリミティブ）のピクセルのいずれをも含まない。
【００８３】
[0090]図４は、本開示で説明される１つまたは複数の例による、グラフィックス処理パイプラインの一例を実装し得るグラフィックス処理ユニット（ＧＰＵ）の一例を示すブロック図である。グラフィックス演算を実施するために、ＧＰＵ１２はグラフィックス処理パイプラインを実装し得る。グラフィックス処理パイプラインは、ＧＰＵ１２上で実行しているソフトウェアまたはファームウェアによって定義された機能を実施することと、まさに特定の機能を実施するように配線接続された固定機能ユニットによって機能を実施することとを含む。ＧＰＵ１２上で実行しているソフトウェアまたはファームウェアは、シェーダと呼ばれることがあり、シェーダは、ＧＰＵ１２の１つまたは複数のシェーダコア上で実行し得る。ユーザは、任意の考えられる様式で所望のタスクを実施するようにシェーダを設計することができるので、シェーダはユーザに機能的フレキシビリティを与える。しかしながら、固定機能ユニットは、固定機能ユニットがタスクを実施する様式のために配線接続される。したがって、固定機能ユニットは多くの機能的フレキシビリティを与えないことがある。
【００８４】
[0091]この例では、ＧＰＵ１２は、入力アセンブラステージ３８、頂点シェーダステージ４０、ラスタライザステージ４２、ピクセルシェーダステージ４４、および出力マージステージ４６のうちの１つまたは複数を含み得る。ＧＰＵ１２は、その順序で頂点シェーダステージに続く、そのようなハルシェーダステージ、テッセレーションステージ、ドメインシェーダステージ、追加ステージを含み得る。ＧＰＵ１２は、ＧＰＵがドメインシェーダステージを含む場合、ドメインシェーダステージへの出力、またはＧＰＵがドメインシェーダステージを含まない場合、頂点シェーダステージ４０の出力に結合されたジオメトリシェーダステージをも含み得る。ラスタライザステージ４２は、図示のように、頂点シェーダステージ４０から、あるいは（利用可能なとき）ジオメトリシェーダステージまたは（利用可能なとき）ドメインシェーダステージから、グラフィックスデータを受信し得る。
【００８５】
[0092]グラフィックスパイプラインの他の構成が可能であり、本開示で説明される技法は、図４に示されている特定の例に限定されると考えられるべきでない。たとえば、ＧＰＵ１２は、図示されたものよりも多くのステージを含み得、いくつかの例では、ＧＰＵ１２は、図示されたステージのすべてを必ずしも含むとは限らないことがある。また、ステージの特定の順序付けは、説明の目的で与えられており、限定するものと見なされるべきではない。
【００８６】
[0093]入力アセンブラステージ３８は、ＣＰＵ６によって定義された頂点の頂点ポイントをシステムメモリ１０から読み取り、頂点を形成するために制御ポイントをアセンブルし得る。たとえば、入力アセンブラステージ３８は、座標と、色値と、他のそのような情報とを読み取り得る。座標、色値、および他のそのような情報は、通常、頂点の属性と呼ばれ得る。頂点の属性に基づいて、入力アセンブラステージ３８は、プリミティブの概略的レイアウトを決定し得る。このようにして、入力アセンブラステージ３８は、パッチを形成するために制御ポイントをアセンブルし得る。入力アセンブラステージ３８は固定機能ユニットであり得る。
【００８７】
[0094]頂点シェーダステージ４０は、入力アセンブラステージ３８からの頂点を処理し得る。たとえば、頂点シェーダステージ４０は、変換（transformations）、スキニング（skinning）、モーフィング（morphing）、および頂点ごとの照明（per-vertex lighting）など、頂点ごとの演算を実施し得る。頂点シェーダステージ４０はシェーダであり得る。
【００８８】
[0095]ラスタライザステージ４２は、頂点シェーダステージ４０からプリミティブを受信し、プリミティブをディスプレイのためのピクセルに変換する。たとえば、プリミティブは、プリミティブの相互接続を示すベクトルとして定義され得、画像がその上で表示されるべきであるディスプレイとは無関係の座標空間において定義され得る。ラスタライザステージ４２は、これらのベクトルをディスプレイ座標に変換し、閉塞されたプリミティブ内のポイントを除外することなど、追加の機能を実施する。
【００８９】
[0096]ピクセルシェーダステージ４４は、ラスタライザステージ４２によって出力されたピクセルを受信し、表示されるべきであるピクセルの各々に色値を割り当てるために後処理を実施する。たとえば、ピクセルシェーダステージ４４は、システムメモリ１０に記憶された一定値と、システムメモリ１０に記憶されたテクスチャデータと、色値など、ピクセルごとの出力を生成するための他のデータとを受信し得る。ピクセルシェーダステージ４４はまた、ピクセルの不透明度を示す不透明度値を出力し得る。
【００９０】
[0097]出力マージステージ４６は、最終ピクセル処理を実施し得る。たとえば、出力マージステージ４６は、ピクセルのいずれかが、表示されることから除外されるべきであるかどうかをさらに決定するために、深度情報を利用し得る。出力マージステージ４６はまた、最終ピクセル値を生成するために、ブレンディング演算を実施し得る。出力マージステージ４６は、概して、システムメモリ１０内にあるが、ＧＰＵ１２内にあり得るフレームバッファに、最終ピクセル値を出力し得る。
【００９１】
[0098]図４に示されている例では、ステージの各々は、ＧＰＵ１２）のローカルメモリ１４からデータを受信し、ローカルメモリ１４にデータを出力する。ローカルメモリの他の例が、ローカルメモリ１４に加えて、またはローカルメモリ１４の代わりに存在する。一例として、ステージは、データを汎用レジスタ（ＧＰＲ）に出力し、データをＧＰＲから受信し得る。ローカルメモリ１４とは異なり、ＧＰＲの各々は、ステージの各々のためのメモリであるのではなく、特定のステージから受信し、特定のステージに出力するように構成され得る。ＧＰＲは、ＧＰＵ１２のローカルメモリの別の例である。
【００９２】
[0099]ＧＰＵ１２のローカルメモリ１４は、それぞれのステージによって生成された中間データを受信し、さらなる処理のために次のステージに中間データを出力する。たとえば、入力アセンブラステージ３８は、グラフィックスデータをローカルメモリ１４から受信し、グラフィックスデータに対してグラフィックス処理を実施し、入力アセンブラステージ３８がローカルメモリ１４に記憶する第１の中間データを生成する。頂点シェーダステージ４０は、この第１の中間データをローカルメモリ１４から受信し、この取り出された中間データに対してグラフィックス処理を実施し、第２の中間データを生成する。
【００９３】
[0100]通常動作では（たとえば、プリエンプション通知がないとき）、ラスタライザステージ４２は、この第２の中間データをローカルメモリ１４から受信し、第２の中間データに対してグラフィックス処理を実施し、ラスタライザステージ４２がローカルメモリ１４に記憶する第３の中間データを生成する。出力マージステージ４６は、第３の中間データをローカルメモリ１４から受信し、第３の中間データに対してグラフィックス行列を実施し、出力マージステージ４６がシステムメモリ１０にあるいは場合によってはローカルメモリ１４（またはその両方の組合せ）内に記憶する最終ピクセル値を生成する。
【００９４】
[0101]頂点シェーダステージ４０とラスタライザステージ４２との間により多くのステージがある例では、これらの中間のステージ（たとえば、ハルシェーダステージ、ドメインシェーダステージ、およびジオメトリシェーダステージのうちの１つまたは複数）のためのローカルメモリ１４へのより多くの接続があり得る。頂点シェーダステージ４０からラスタライザステージ４２までであるが、ラスタライザステージ４２を含まない様々なステージは、通常、ジオメトリパイプラインと呼ばれ得る。開示で説明される技法では、プリエンプション通知に応答して、コントローラ３２は、ジオメトリパイプライン（たとえば、図４中のこの例における頂点シェーダステージ４０）の出力が、システムメモリ１０にストリームアウトされる（たとえば、出力される）ように、図示されたパイプラインを構成し得る。
【００９５】
[0102]図示のように、ＧＰＵ１２は、ＧＰＵ１２のハードウェアユニットであるストリームアウトユニット４１を含む。ストリームアウトユニット４１は、ローカルメモリ１４からデータを、より詳細には、ジオメトリパイプラインによって生成されたデータを受信し、そのデータをシステムメモリ１０に出力するように構成され得る。ストリームアウトユニット４１はまた、逆に、データをシステムメモリ１０から受信し、（たとえば、プリエンプションが完了し、元の命令が実行すべきである後に）データをローカルメモリ１４に記憶するように構成され得る。したがって、ストリームアウトユニット４１は、ＧＰＵ１２が、中間データ（たとえば、ジオメトリパイプラインによって生成されたデータ）をシステムメモリ１０に出力するための、およびこの中間データをシステムメモリ１０から取り出すための、特殊な仕方を与える。
【００９６】
[0103]いくつかの技法では、ストリームアウトユニット４１は、中間データを受信することである特定の目的のために使用される。しかしながら、これらの技法では、ストリームアウトユニット４１が中間データをシステムメモリ１０に出力したかどうかが、実行より前に決定される必要があり得る。たとえば、ストリームアウトユニット４１が中間データを出力すべきである場合、ＧＰＵ１２のグラフィックスパイプラインは第１の構成にあり、ストリームアウトユニット４１が中間データを出力すべきでない場合、ＧＰＵ１２のグラフィックスパイプラインは第２の構成である。グラフィックスパイプラインが第１の構成にあるのか、第２の構成にあるのかにかかわらず、ＧＰＵ１２は、コマンドの実行より前に構成を設定する必要があり得る。
【００９７】
[0104]しかしながら、本開示で説明される技法では、コントローラ３２は、コマンドの実行中に、コントローラ３２が、グラフィックスパイプラインを第１の構成または第２の構成に構成することができるように、グラフィックスパイプラインのステージの相互接続を動的に構成し得る。たとえば、プリエンプション通知に応答して、コントローラ３２は、ラスタライザステージ４２に接続するローカルメモリ１４の出力を切断し、ローカルメモリ１４の出力をストリームアウトユニット４１に接続し得る。たとえば、ＧＰＵ１２は、描画呼出しを受信したことに応答して、図４に示されているグラフィックスパイプラインを介して、コマンドの第１のセットを実行し得る。描画呼出しは、第１のセットコマンドによってレンダリングされるべきである１つまたは複数のプリミティブを定義する。図示のように、グラフィックスパイプラインは、コマンドの第１のセットの実行中にグラフィックスパイプラインのステージによって生成されたデータを、ＧＰＵ１２のローカルメモリ１４に記憶するように構成される。
【００９８】
[0105]コントローラ３２は、次いで、コマンドの第１のセットの実行中に、プリエンプション通知を受信し得る。プリエンプション通知を受信したことに応答して、コントローラ３２は、コマンドの第１のセットの実行中に、ＧＰＵ１２のグラフィックスパイプラインのステージの相互接続を動的に構成するために、ＧＰＵ１２のローカルメモリ１４の出力を、グラフィックスパイプラインのステージ（たとえば、ラスタライザステージ４２）から切断し、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データ（たとえば、より一般的には、頂点シェーダステージ４０またはジオメトリパイプラインによって生成された中間データ）を、ＧＰＵ１２の外部にあるメモリ（たとえば、システムメモリ１０）に出力するために、ローカルメモリの出力を、ハードウェアストリームアウトユニット４１に接続し得る。ＧＰＵ１２は、グラフィックスパイプラインのステージの相互接続の動的構成により、ＧＰＵ１２の外部にあるメモリ（たとえば、システムメモリ１０）に中間データを出力し得る。したがって、コントローラ３２は、ピクセルタイルレベルグラニュラリティにおいてプリエンプションを実施するために、計算シェーダのようなソフトウェアに依拠するのではなく、プリエンプションを実施するために、ＧＰＵ１２のハードウェア能力を活用し得る。
【００９９】
[0106]通常動作では、コントローラ３２は、ラスタライザステージ４２が、ジオメトリパイプライン（たとえば、この例では頂点シェーダステージ４０）によって生成された中間データを受信するように、スイッチＳ２を閉じたまま、およびスイッチＳ１を開いたままにし得る。たとえば、ラスタライザステージ４２は、プリエンプション通知を受信するより前に、ラスタライザステージ４２による処理のために、ローカルメモリから中間データを受信し得る。次いで、プリエンプション通知に応答して、コントローラ３２は、ジオメトリパイプラインが生成したデータが、ストリームアウトユニット４１を介してシステムメモリ１０にストリームアウトするように、スイッチＳ２を開き、スイッチＳ１を閉じ得る。このようにして、コントローラ３２は、グラフィックスパイプラインのステージの相互接続を動的に構成する（たとえば、ジオメトリパイプラインと次のステージとの間の既存の接続が切られ、ジオメトリパイプラインは、現在、異なるステージに出力する）。図４では、コントローラ３２は、プリエンプション通知を受信したことに応答してのみ、ストリームアウトユニット４１が、シェーダ（たとえば、図４中の頂点シェーダステージ４０など、ジオメトリパイプライン中の最後のシェーダ）によって生成された中間データを、ＧＰＵ１２の外部にあるメモリ（たとえば、システムメモリ１０）に出力するように、グラフィックスパイプラインを構成し得る。ストリームアウトユニット４１は、グラフィックスパイプラインのステージの相互接続の動的構成により、中間データをシステムメモリ１０に出力するように構成される。
【０１００】
[0107]コントローラ３２は、次いで、１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を停止し、コマンドの第２のセットがグラフィックスパイプラインを介して実行することを可能にし得る。このようにして、コントローラ３２は、コマンドの第２のセットを実行するために、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトし得る。コマンドの第２のセットの実行に続いて、コントローラ３２は、ＧＰＵ１２にコマンドの第１のセットの実行を再開させ得る。
【０１０１】
[0108]本開示では、ＧＰＵ１２は、描画呼出しのすべてのプリミティブがレンダリングされたとき、描画呼出し境界に達する。ＧＰＵ１２は、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、プリエンプトすることが可能であるので、ＧＰＵ１２は、描画呼出し境界より前にプリエンプトする。
【０１０２】
[0109]いくつかの例では、描画呼出し境界より前にプリエンプトする際に、ＧＰＵ１２は、中間プリミティブをプリエンプトするように構成され得る。説明されたように、ＧＰＵ１２は、プリエンプションのためのピクセルタイルレベルグラニュラリティを与える。たとえば、実行中に、ラスタライザステージ４２は、ピクセルタイルの１つまたは複数のピクセルのための中間データを、ローカルメモリ１４から取り出す。ピクセルタイルは、プリミティブの１つまたは複数のピクセルを含み、概して、プリミティブよりも小さい。
【０１０３】
[0110]コントローラ３２がスイッチＳ２を開いた後、ラスタライザステージ４２は、それ以上の中間データを取り出すことができない。したがって、ラスタライザステージ４２は、現在のピクセルタイルを処理することを完了し得、ピクセルシェーダステージ４４は、現在のピクセルタイルのピクセルを処理し得、出力マージステージ４６は、現在のピクセルタイルのピクセルを処理し得る。次いで、これらのステージの各々は、フラッシュされている（すなわち、データを現在処理していない）と見なされ得、コマンドの第２のセット（たとえば、コマンドの第１のセットがそれについてプリエンプトされたより高い優先度のコマンド）に対して動作することが可能である。この例では、プリエンプトすることは、処理される必要があるより多くのタイルが描画呼出しのプリミティブ中にある場合でも、ピクセルタイルをラスタライズおよびシェーディングし（たとえば、ラスタライザステージ４２およびピクセルシェーダステージ４４がピクセルタイルに対してそれぞれの機能を実施し）、他の後続のピクセルタイルをラスタライズおよびシェーディングしなかった後に、プリエンプトすることを含む。このようにして、ＧＰＵ１２は、プリミティブ中により多くのピクセルタイルがあるとしても、現在のピクセルタイルの処理を完了した後にプリエンプトするための機構を与える（たとえば、プリエンプションのためのピクセルタイルグラニュラリティのための機構を与える）。
【０１０４】
[0111]グラフィックスパイプライン中のラスタライザステージ４２の前にある構成要素について、これらのステージが、プリエンプション通知を受信した後に生成したデータは、ストリームアウトユニット４１を介してシステムメモリ１０にストリームアウトする。たとえば、コントローラ３２は、頂点シェーダステージ４０（およびジオメトリパイプライン中の任意の他のステージ）が、データこれらのステージの処理を完了し、得られた中間データをシステムメモリ１０に出力することを可能にし得る。このようにして、コントローラ３２は、ジオメトリパイプライン中のステージをフラッシュする。
【０１０５】
[0112]ジオメトリパイプラインのステージと、ラスタライザステージ４２の後のおよびラスタライザステージ４２を含むステージとをフラッシュすることに加えて、コントローラ３２は、コマンドの第１のセットのうちのコマンドの実行を停止し得る。たとえば、コントローラ３２は、入力アセンブラステージ３８が、それ以上のプリミティブをアセンブルするのを停止し、コマンドの第１のセットのうちのコマンドを頂点シェーダステージ４０に発行することを停止し得る。今まで出力されなかった描画呼出しの１つまたは複数のプリミティブのための残りのデータがある場合、コントローラ３２は、コマンドの第２のセットの実行の完了の後に、コマンドの第１のセットが実行を完了すべきであるときのために、そのデータのためのコンテキスト値をシステムメモリ１０に記憶し得る。
【０１０６】
[0113]コンテキスト値は、ＧＰＵ１２が、プリエンプションの後にコマンドの実行をどのように再開すべきかを決定するために使用することができる値を指す。コンテキスト値の例は、ＧＰＵ１２がコマンドの第１のセットの実行をプリエンプトしたときにＧＰＵ１２があった状態と同じ状態にそれ自体を置くためにＧＰＵ１２が使用することができる、ロケーション情報、属性情報、（たとえば、コマンドプリエンプションがそこで行われた）コマンドストリーム情報、ＧＰＵの状態情報（たとえば、フリップフロップの位置）、レジスタ内の値などを含む。本開示では、描画呼出しに応答して、大量のメモリを必要とし得る、プリミティブのすべてのためのコンテキスト値のすべてを記憶するのではなく、ＧＰＵ１２は、（たとえば、出力されなかった中間データをもつプリミティブのみのための）限られた量のコンテキスト値を記憶し得る。
【０１０７】
[0114]たとえば、プリエンプション通知に応答して、コントローラ３２は、中間データをストリームアウトするために、スイッチＳ２を開き、スイッチＳ１を閉じ、すべてのステージが、プリエンプション通知が受信されたときに現在実行されているコマンドの第１のセットのうちのコマンドの実行を完了することを可能にする。コントローラ３２は、次いで、コマンドの第２のセットが完了までずっと実行することを可能にする（すなわち、コントローラ３２は、コマンドの第２のセットのうちの最後のコマンドが完了することを可能にする）。
【０１０８】
[0115]コマンドの第２のセットの実行に続いて、コントローラ３２は、ラスタライズおよびピクセルシェーディングするために、システムメモリ１０から中間データを取り出すことによって、コマンドの第１のセットの実行を再開する。たとえば、コマンドの第１のセットの実行を完了するために、コントローラ３２は、スイッチＳ１を閉じ、スイッチＳ２を閉じる。ストリームアウトユニット４１は、プリエンプション通知に応答して、システムメモリ１０に記憶された中間データをシステムメモリ１０から読み込み、ラスタライザステージ４２は、次に、この中間データをラスタライズし、ピクセルシェーダステージ４４は、ラスタライザステージ４２によって生成されたデータにピクセルシェーディングを適用する。さらに、入力アセンブラステージ３８は、プリエンプション通知が受信されたときにアセンブルされていなかったことがある記憶されたコンテキスト値に基づいて、描画呼出しのプリミティブをアセンブルする。頂点シェーダステージ４０は、次いで、これらのプリミティブを処理し、グラフィックスパイプラインは通常通り機能する（たとえば、コントローラ３２は、グラフィックスパイプラインを、中間データがシステムメモリ１０に記憶されるのではなくローカルに記憶されるそれの通常状態に構成する）。
【０１０９】
[0116]理解をさらに助けるために、以下は、ＧＰＵ１２が、１０個のプリミティブをレンダリングするために、描画呼出しをＣＰＵ６から受信した場合のための本開示の例示的技法について説明する。この例は、説明の簡単のために与えられており、限定するものと解釈されるべきでない。
【０１１０】
[0117]描画呼出しを受信したことに応答して、ＧＰＵ１２は、１０個のプリミティブをレンダリングするためのコマンドの第１のセットを実行する。入力アセンブラステージ３８はプリミティブをアセンブルし、入力アセンブラステージ３８が、プリミティブをアセンブルすることを完了したとき、頂点シェーダステージ４０は、プリミティブの頂点を処理するために、頂点シェーダのインスタンス化を実行する。ラスタライザステージ４２は、頂点を受信し、ピクセルタイルベースで処理する。
【０１１１】
[0118]ラスタライゼーションおよびピクセルシェーディングは、未知数に関する時間を要し得、頂点シェーディングよりも長い時間を要する傾向があるので、いくつかの例では、ラスタライザステージ４２が処理しているプリミティブと、頂点シェーダステージ４０がそれに対して動作しているプリミティブとの間に数個のプリミティブの差があり得る。たとえば、１０個のプリミティブのうち、頂点シェーダステージ４０は、ラスタライザステージ４２がプリミティブ５のピクセルタイルに対して動作している間に、プリミティブ８を処理していることがある。
【０１１２】
[0119]頂点シェーダステージ４０がプリミティブ８を処理しており、ラスタライザステージ４２が、プリミティブ５の複数のピクセルタイルのうちのピクセルタイルに対して動作している間に、そのコントローラ３２がプリエンプション通知を受信したと仮定する。コントローラ３２は、次いで、スイッチＳ２を開き、スイッチＳ１を閉じる。この場合、プリミティブ１〜４がレンダリングされ、それらのピクセル値はシステムメモリ１０に記憶される。頂点シェーダステージ４０がプリミティブ５〜８について生成した中間データのすべてが、ストリームアウトユニット４１を介してローカルメモリ１４からシステムメモリ１０にストリームアウトされる。ラスタライザステージ４２は、ラスタライザステージ４２が、ＧＰＵ１２がプリエンプション通知を受信したときに処理していた、プリミティブ５のピクセルタイルの処理を完了する。ピクセルシェーダステージ４４および出力マージステージ４６は、プリミティブ５のピクセルタイルに対してそれぞれのプロセスをプリフォームする。コントローラ３２は、コマンドの第１のセットのいずれかを、ＧＰＵ１２のグラフィックスパイプラインのステージのいずれかに発行することを停止する。
【０１１３】
[0120]プリミティブ９および１０について、コントローラ３２は、入力アセンブラステージ３８が、ＧＰＵ１２が、コマンドの第１のセットがそれらのためにプリエンプトされたコマンドの第２のセットを実行することを完了した後に、これらのプリミティブをアセンブルすることができるように、それらのコンテキスト値を記憶する。コントローラ３２はまた、コントローラ３２が、ＧＰＵ１２がコマンドの第１のセットのうちの残りのコマンドを実行するとき、ストリームアウトユニット４１にプリミティブ５の次のピクセルタイルを取り出させることができるように、ラスタライザステージ４２がどのピクセルタイルを処理していたかを示す情報を記憶し得る。
【０１１４】
[0121]上記で説明されたように、コントローラ３２は、ジオメトリパイプラインによって生成された中間データを外部メモリ（たとえば、システムメモリ１０）に選択的に出力するようにＧＰＵ１２のグラフィックスパイプラインを動的に構成する。以下で説明されるように、いくつかの技法は、コマンドの実行より前に、ＧＰＵ１２が、中間データをシステムメモリ１０に出力すべきであったのか、中間データをローカルメモリに記憶されたままにすべきであったのかを設定する。（たとえば、ランタイム中に）ストリームアウトユニット４１をローカルメモリ１４に動的に接続することによって、コントローラ３２は、コマンドの第１のセットの実行中に、本開示で説明される技法を可能にするグラフィックスパイプラインを、ピクセルタイルレベルグラニュラリティをもつ描画呼出し境界間のプリエンプションを実施することを可能にする構成する。
【０１１５】
[0122]図５は、グラフィックスパイプラインの別の例を示すブロック図である。図５のグラフィックスパイプラインは、たとえば、ＤＸ９／Ｏｐｅｎ  ＧＬ３．ｘ  ＡＰＩのグラフィックスパイプラインの一例である。たとえば、図５は、入力アセンブリステージ３８と、頂点シェーダ（ＶＳ）ステージ４０と、ピクセルシェーダ（ＰＳ）ステージ４４とを示す。ラスタライザステージ４２のようなラスタライザは、簡単のために示されない。
【０１１６】
[0123]入力アセンブリ４８は、プリミティブの座標など、グラフィックスデータを受信し、複数のプリミティブ（たとえば、三角形）を構成する。頂点シェーダステージ４０は、プリミティブの頂点に対して演算を実施する。頂点シェーダステージ４０は、頂点パラメータキャッシュ（ＶＰＣ）と呼ばれることがある、頂点パラメータメモリ（ＶＰＭ）中の変換後頂点属性を出力（たとえば、デポジット）し得る。この例では、変換後頂点属性は、頂点シェーダステージ４０が生成した中間データである。ＶＰＭは、ＧＰＵローカルメモリ１４の一部（たとえば、ＧＰＵ１２が、アクセスするためにバス２０を必要としないＧＰＵ１２のオンチップメモリ）であり得る。ピクセルシェーダステージ４４は、ＶＰＭからの変換後頂点属性を処理のために受信する（たとえば、消費する）。
【０１１７】
[0124]図６は、グラフィックスパイプラインの別の例を示すブロック図である。図６のグラフィックスパイプラインは、たとえば、ＤＸ１０／１１／Ｏｐｅｎ  ＧＬ．４．ｘ  ＡＰＩのグラフィックスパイプラインの一例である。図６は、入力アセンブリステージ３８と、頂点シェーダステージ４０と、ピクセルシェーダステージ４４とを示す。図示のように、図６では、頂点シェーダステージ４０は、すべての変換後頂点属性を外部メモリ１０にストリームアウトし得る。ピクセルシェーダステージ４４は、分離され、メモリ１０からの変換後頂点属性を消費する（たとえば、処理のために受信する）。
【０１１８】
[0125]図５および図６に示されている例では、プリエンプションは、すべての状態変数を記憶し、特定の位置から再開することによって行われ得る。たとえば、図５および図６では、プリエンプションは、描画呼出し境界のみにおいて行われ得る。図５および図６に関して、プリエンプションは、ピクセル／フラグメントシェーダステージが完了していない限り起こることができず、これが、基本的に、描画呼出し境界である。
【０１１９】
[0126]本開示で説明される技法では、ＧＰＵ１２は、プリエンプションに基づいて、ジオメトリパイプラインからの生成された中間データをシステムメモリ１０に選択的に出力し得る。この意味で、ＧＰＵ１２は、プリエンプションに基づいて、頂点出力ストリームアウト（たとえば、頂点情報が出力される様式）を、「ＤＸ９」スタイル（たとえば、図５）と「ＤＸ１１」スタイル（たとえば、図６）との間で動的に選定し得る。
【０１２０】
[0127]プリエンプションのために、ＧＰＵ１２は、グラフィックスパイプライン中のプリミティブのためのデータストレージのためにメモリ１０を使用し、ピクセル（たとえば、タイル）生成を停止し、すべての頂点ステージをフラッシュするが、代わりに、それらをメモリ１０に動的にダイレクトする。たとえば、それが、ユーザ／ＡＰＩによるアップフロントの代わりにプリエンプションをサポートするためにＧＰＵ１２によって動的に決定されることを除いて、ＤＸ１０のｓｔｒｅａｍＯｕｔ特徴（たとえば、ストリームアウトユニット４１）と同様のステージ。再開時に、ＧＰＵ１２は、ラスタライザステージ４２による処理のために、変換後頂点属性をシステムメモリ１０から受信する。
【０１２１】
[0128]図７は、データを処理する例示的な方法を示すフローチャートである。図示のように、ＧＰＵ１２は、描画呼出しを受信したことに応答して、ＧＰＵ１２のグラフィックスパイプラインを介して、コマンドの第１のセットを実行する（５０）。描画呼出しは、コマンドの第１のセットによってレンダリングされるべきである１つまたは複数のプリミティブを定義し、グラフィックスパイプラインは、コマンドの第１のセットの実行中にグラフィックスパイプラインのステージによって生成されたデータを、ＧＰＵ１２のローカルメモリに記憶するように構成される。ＧＰＵ１２は、コマンドの第１のセットの実行中に、および１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信する（５２）。
【０１２２】
[0129]プリエンプション通知を受信したことに応答して、ＧＰＵ１２は、コマンドの第１のセットの実行中に、グラフィックスパイプラインのステージの相互接続を動的に構成するために、ＧＰＵ１２のローカルメモリの出力を、グラフィックスパイプラインのステージから切断し、ＧＰＵ１２のローカルメモリの出力を、ＧＰＵ１２のハードウェアストリームアウトユニット４１に接続する（５４）。ＧＰＵ１２は、コマンドの第１のセットの実行中に、ＧＰＵ１２のグラフィックスパイプラインのステージの相互接続の動的構成により、ストリームアウトユニット４１から、ＧＰＵの外部にあるメモリに、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力する（５６）。たとえば、コントローラ３２は、コマンドの第１のセットの実行中に、中間データをシステムメモリ１０に出力するようにＧＰＵ１２のグラフィックスパイプラインを動的に構成するために、コマンドの第１のセットのうちの１つまたは複数のコマンドの実行中にジオメトリパイプラインによって生成された中間データをシステムメモリ１０に出力するために、ローカルメモリ１４の出力をラスタライザステージ４２から切断し、ローカルメモリ１４の出力をストリームアウトユニット４１に接続し得る。
【０１２３】
[0130]たとえば、通常動作中に、ステージ（たとえば、ラスタライザステージ４２）が、プリエンプション通知を受信するより前に、ステージによる処理のために、ローカルメモリから中間データを受信する。次いで、プリエンプション通知を受信したことに応答してのみ、ＧＰＵ１２は、ストリームアウトユニット４１を介して、シェーダ（たとえば、頂点シェーダステージ４０）によって生成された中間データを、ＧＰＵ１２の外部にあるメモリに（たとえば、システムメモリ１０に）出力する。コントローラ３２は、次いで、１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を停止する。
【０１２４】
[0131]ＧＰＵ１２は、コマンドの第２のセットを実行するために、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトする（５８）。ＧＰＵ１２は、次いで、コマンドの第２のセットを実行する（６０）。コマンドの第２のセットの実行に続いて、ＧＰＵ１２は、ラスタライザステージ４２によるラスタライズおよびピクセルシェーダステージ４４によるピクセルシェーディングのために、一例としてストリームアウトユニット４１を介して、ＧＰＵ１２の外部にあるメモリ（たとえば、システムメモリ１０）から中間データを取り出すことによって、コマンドの第１のセットの実行を再開する。
【０１２５】
[0132]ＧＰＵ１２は、描画呼出しの１つまたは複数のプリミティブをレンダリングするためのコマンドの第１のセットの実行を完了するより前に、コマンドの第１のセットの実行をプリエンプトし得るので、ＧＰＵ１２は、描画呼出し境界に達するより前に、プリエンプトし得る。たとえば、描画呼出しの１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを含むと仮定する。この例では、プリエンプトすることは、（たとえば、プリエンプションのためのピクセルタイルレベルグラニュラリティを与えるために）ピクセルタイルを、ラスタライザステージ４２を用いてラスタライズし、ピクセルシェーダステージ４４を用いてピクセルシェーディングし、他の後続のピクセルタイルを、ラスタライザステージ４２を用いてラスタライズせず、ピクセルシェーダステージ４４を用いてピクセルシェーディングしなかった後に、プリエンプトすることを含む。説明されたように、ラスタライズおよびピクセルシェーディングは、グラフィックスパイプラインの２つのステージ（たとえば、グラフィックスパイプラインの、それぞれ、ラスタライザステージ４２およびピクセルシェーダステージ４４）によって実施される機能を備える。
【０１２６】
[0133]この例では、ピクセルタイルは、プリミティブの第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを含み、プリミティブの第２のセットのピクセルのいずれをも含まない。したがって、プリミティブの第２のセットのうちのプリミティブ、およびプリミティブの第１のセット内のピクセルタイルさえレンダリングされる必要があり得るが、ＧＰＵ１２は、描画呼出し境界を待つ、または莫大な量のコンテキスト値を記憶するのではなく、ピクセルタイルの処理の後に、プリエンプトすることが可能である。
【０１２７】
[0134]本開示で説明された技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明された技法の様々な態様は、１つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路、ならびにそのような構成要素の任意の組合せを含む、１つまたは複数のプロセッサ内に実装され得る。「プロセッサ」または「処理回路」という用語は、概して、単独のまたは他の論理回路と組み合わせられた上記の論理回路のいずれか、あるいは処理を実施する個別ハードウェアなど、任意の他の等価な回路を指し得る。
【０１２８】
[0135]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明された様々な動作および機能をサポートするために、同じデバイス内にまたは別個のデバイス内に実装され得る。さらに、説明されたユニット、モジュールまたは構成要素のいずれも、一緒に、または個別であるが相互動作可能な論理デバイスとして別々に実装され得る。モジュールまたはユニットとしての異なる特徴の記述は、異なる機能的態様を強調するものであり、そのようなモジュールまたはユニットが、別個のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを必ずしも暗示するとは限らない。そうではなく、１つまたは複数のモジュールまたはユニットに関連する機能は、別個のハードウェア、ファームウェア、および／またはソフトウェア構成要素によって実施されるか、あるいは共通または別個のハードウェアまたはソフトウェア構成要素内に組み込まれ得る。
【０１２９】
[0136]本開示で説明された技法はまた、命令を記憶するコンピュータ可読記憶媒体など、コンピュータ可読媒体中に記憶、具現または符号化され得る。コンピュータ可読媒体中に埋め込まれたまたは符号化された命令は、たとえば、命令が１つまたは複数のプロセッサによって実行されたとき、１つまたは複数のプロセッサに本明細書で説明された技法を実施させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電子的に消去可能なプログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
【０１３０】
[0137]様々な態様および例が説明された。しかしながら、以下の請求項の範囲から逸脱することなく、本開示の構造または技法に変更が行われ得る。
【図１】
2018533137.tif 000003
【図２】
2018533137.tif 000004
【図３Ａ】
2018533137.tif 000005
【図３Ｂ】
2018533137.tif 000006
【図４】
2018533137.tif 000007
【図５】
2018533137.tif 000008
【図６】
2018533137.tif 000009
【図７】
2018533137.tif 000010
【手続補正書】
【提出日】平成30年6月8日(2018.6.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
データを処理する方法であって、前記方法は、
グラフィックス処理ユニット（ＧＰＵ）を用いて、描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
前記ＧＰＵを用いて、コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、少なくとも第１のハードウェアスイッチを用いて、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、少なくとも第２のハードウェアスイッチを用いて、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
前記ＧＰＵを用いて、コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を備える、方法。
【請求項２】
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、プリエンプトすることが、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトすることを備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、請求項１に記載の方法。
【請求項３】
プリエンプトすることが、描画呼出し境界に達するより前にプリエンプトすることを備える、請求項１に記載の方法。
【請求項４】
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断することが、
前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断すること
を備える、請求項１に記載の方法。
【請求項５】
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することと
をさらに備える、請求項１に記載の方法。
【請求項６】
コマンドの前記第２のセットの実行に続いて、ラスタライズおよびピクセルシェーディングするために、前記ＧＰＵの外部にある前記メモリから前記中間データを取り出すことによって、コマンドの前記第１のセットの実行を再開すること
をさらに備える、請求項１に記載の方法。
【請求項７】
前記ステージを用いて、前記プリエンプション通知を受信するより前に、前記ステージによる処理のために、前記ローカルメモリから前記中間データを受信すること
をさらに備える、請求項１に記載の方法。
【請求項８】
データを処理するためのデバイスであって、前記デバイスが、
システムメモリと、
グラフィックス処理ユニット（ＧＰＵ）と
を備え、前記ＧＰＵが、少なくとも第１のハードウェアスイッチと少なくとも第２のハードウェアスイッチとハードウェアストリームアウトプットユニットとローカルメモリとを備え、ここにおいて、前記ＧＰＵは、
描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、少なくとも前記第１のハードウェアスイッチを用いて、前記ＧＰＵの前記ローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、少なくとも前記第２のハードウェアスイッチを用いて、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵの前記ハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にある前記システムメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を行うように構成された、デバイス。
【請求項９】
前記グラフィックスパイプラインが、ラスタライザステージとピクセルシェーダステージとを備え、ここにおいて、前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、前記ＧＰＵが、ピクセルタイルを、前記ラスタライザステージを用いてラスタライズし、前記ピクセルシェーダステージを用いてピクセルシェーディングし、他の後続のピクセルタイルを、前記ラスタライザステージを用いてラスタライズせず、前記ピクセルシェーダステージを用いてピクセルシェーディングしなかった後に、プリエンプトするように構成され、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えない、請求項８に記載のデバイス。
【請求項１０】
前記ＧＰＵが、描画呼出し境界に達するより前にプリエンプトするように構成された、請求項８に記載のデバイス。
【請求項１１】
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断するために、前記ＧＰＵが、前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断するように構成された、請求項８に記載のデバイス。
【請求項１２】
前記ＧＰＵが、
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記システムメモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することと
を行うように構成された、請求項８に記載のデバイス。
【請求項１３】
前記ＧＰＵが、
コマンドの前記第２のセットの実行に続いて、ラスタライズおよびピクセルシェーディングするために、前記ＧＰＵの外部にある前記システムメモリから前記中間データを取り出すことによって、コマンドの前記第１のセットの実行を再開するように構成された、請求項８に記載のデバイス。
【請求項１４】
前記ステージが、前記プリエンプション通知を受信するより前に、前記ステージによる処理のために、前記ローカルメモリから前記中間データを受信するように構成された、請求項８に記載のデバイス。
【請求項１５】
前記デバイスがワイヤレス通信デバイスを備える、請求項８に記載のデバイス。
【請求項１６】
実行されたとき、データを処理するためのデバイスのグラフィックス処理ユニット（ＧＰＵ）に、
描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、少なくとも第１のハードウェアスイッチを用いて、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、少なくとも第２のハードウェアスイッチを用いて、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を行わせる命令を記憶したコンピュータ可読記憶媒体。
【請求項１７】
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、前記ＧＰＵに、プリエンプトすることを行わせる前記命令が、前記ＧＰＵに、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトすることを行わせる命令を備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項１８】
前記ＧＰＵに、プリエンプトすることを行わせる前記命令が、前記ＧＰＵに、描画呼出し境界に達するより前にプリエンプトすることを行わせる命令を備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記ＧＰＵに、前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断することを行わせる前記命令が、
前記ＧＰＵに、前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断することを行わせる命令
を備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記ＧＰＵに、
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することと
を行わせる命令をさらに備える、請求項１６に記載のコンピュータ可読記憶媒体。
【請求項２１】
データを処理するためのデバイスであって、前記デバイスは、
描画呼出しを受信したことに応答して、グラフィックス処理ユニット（ＧＰＵ）のグラフィックスパイプラインを介して、コマンドの第１のセットを実行するための手段と、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信するための手段と、
コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、少なくとも第１のハードウェアスイッチを用いて、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、少なくとも第２のハードウェアスイッチを用いて、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続するための手段と、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力するための手段と、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトするための手段と、
コマンドの前記第２のセットを実行するための手段と
を備える、デバイス。
【請求項２２】
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、プリエンプトするための前記手段が、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトするための手段を備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、請求項２１に記載のデバイス。
【請求項２３】
プリエンプトするための前記手段が、描画呼出し境界に達するより前にプリエンプトするための手段を備える、請求項２１に記載のデバイス。
【請求項２４】
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断するための前記手段が、
前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断するための手段
を備える、請求項２１に記載のデバイス。
【請求項２５】
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力するための手段と、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止するための手段と
をさらに備える、請求項２１に記載のデバイス。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１３０
【補正方法】変更
【補正の内容】
【０１３０】
[0137]様々な態様および例が説明された。しかしながら、以下の請求項の範囲から逸脱することなく、本開示の構造または技法に変更が行われ得る。
以下に本願発明の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
データを処理する方法であって、前記方法は、
グラフィックス処理ユニット（ＧＰＵ）を用いて、描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
前記ＧＰＵを用いて、コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
前記ＧＰＵを用いて、コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することとを備える、方法。
［Ｃ２］
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、プリエンプトすることが、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトすることを備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、Ｃ１に記載の方法。
［Ｃ３］
プリエンプトすることが、描画呼出し境界に達するより前にプリエンプトすることを備える、Ｃ１に記載の方法。
［Ｃ４］
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断することが、
前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断することを備える、Ｃ１に記載の方法。
［Ｃ５］
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することとをさらに備える、Ｃ１に記載の方法。
［Ｃ６］
コマンドの前記第２のセットの実行に続いて、ラスタライズおよびピクセルシェーディングするために、前記ＧＰＵの外部にある前記メモリから前記中間データを取り出すことによって、コマンドの前記第１のセットの実行を再開することをさらに備える、Ｃ１に記載の方法。
［Ｃ７］
前記ステージを用いて、前記プリエンプション通知を受信するより前に、前記ステージによる処理のために、前記ローカルメモリから前記中間データを受信することをさらに備える、Ｃ１に記載の方法。
［Ｃ８］
データを処理するためのデバイスであって、前記デバイスが、
システムメモリと、
グラフィックス処理ユニット（ＧＰＵ）とを備え、前記ＧＰＵが、ハードウェアストリームアウトプットユニットとローカルメモリとを備え、ここにおいて、前記ＧＰＵは、
描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵの前記ローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵの前記ハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にある前記システムメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することと
を行うように構成された、デバイス。
［Ｃ９］
前記グラフィックスパイプラインが、ラスタライザステージとピクセルシェーダステージとを備え、ここにおいて、前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、前記ＧＰＵが、ピクセルタイルを、ラスタライザステージを用いてラスタライズし、ピクセルシェーダステージを用いてピクセルシェーディングし、他の後続のピクセルタイルを、ラスタライザステージを用いてラスタライズせず、ピクセルシェーダステージを用いてピクセルシェーディングしなかった後に、プリエンプトするように構成され、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えない、Ｃ８に記載のデバイス。
［Ｃ１０］
前記ＧＰＵが、描画呼出し境界に達するより前にプリエンプトするように構成された、Ｃ８に記載のデバイス。
［Ｃ１１］
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断するために、前記ＧＰＵが、前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断するように構成された、Ｃ８に記載のデバイス。
［Ｃ１２］
前記ＧＰＵが、
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記システムメモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することとを行うように構成された、Ｃ８に記載のデバイス。
［Ｃ１３］
前記ＧＰＵが、
コマンドの前記第２のセットの実行に続いて、ラスタライズおよびピクセルシェーディングするために、前記ＧＰＵの外部にある前記システムメモリから前記中間データを取り出すことによって、コマンドの前記第１のセットの実行を再開するように構成された、Ｃ８に記載のデバイス。
［Ｃ１４］
前記ステージが、前記プリエンプション通知を受信するより前に、前記ステージによる処理のために、前記ローカルメモリから前記中間データを受信するように構成された、Ｃ８に記載のデバイス。
［Ｃ１５］
前記デバイスがワイヤレス通信デバイスを備える、Ｃ８に記載のデバイス。
［Ｃ１６］
実行されたとき、データを処理するためのデバイスのグラフィックス処理ユニット（ＧＰＵ）に、
描画呼出しを受信したことに応答して、前記ＧＰＵのグラフィックスパイプラインを介して、コマンドの第１のセットを実行することと、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信することと、
前記プリエンプション通知を受信したことに応答して、コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続することと、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力することと、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトすることと、
コマンドの前記第２のセットを実行することとを行わせる命令を記憶したコンピュータ可読記憶媒体。
［Ｃ１７］
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、前記ＧＰＵに、プリエンプトすることを行わせる前記命令が、前記ＧＰＵに、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトすることを行わせる命令を備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、Ｃ１６に記載のコンピュータ可読記憶媒体。
［Ｃ１８］
前記ＧＰＵに、プリエンプトすることを行わせる前記命令が、前記ＧＰＵに、描画呼出し境界に達するより前にプリエンプトすることを行わせる命令を備える、Ｃ１６に記載のコンピュータ可読記憶媒体。
［Ｃ１９］
前記ＧＰＵに、前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断することを行わせる前記命令が、
前記ＧＰＵに、前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断することを行わせる命令を備える、Ｃ１６に記載のコンピュータ可読記憶媒体。
［Ｃ２０］
前記ＧＰＵに、
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力することと、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止することとを行わせる命令をさらに備える、Ｃ１６に記載のコンピュータ可読記憶媒体。
［Ｃ２１］
データを処理するためのデバイスであって、前記デバイスは、
描画呼出しを受信したことに応答して、グラフィックス処理ユニット（ＧＰＵ）のグラフィックスパイプラインを介して、コマンドの第１のセットを実行するための手段と、前記描画呼出しが、コマンドの前記第１のセットの実行によってレンダリングされるべきである１つまたは複数のプリミティブを定義する、
コマンドの前記第１のセットの実行中に、および前記１つまたは複数のプリミティブのすべてをレンダリングするより前に、プリエンプション通知を受信するための手段と、
コマンドの前記第１のセットの実行中に、前記グラフィックスパイプラインのステージの相互接続を動的に構成するために、前記ＧＰＵのローカルメモリの出力を、前記グラフィックスパイプラインのステージから切断し、前記ＧＰＵの前記ローカルメモリの前記出力を、前記ＧＰＵのハードウェアストリームアウトユニットに接続するための手段と、
コマンドの前記第１のセットの実行中に、前記ＧＰＵの前記グラフィックスパイプラインのステージの前記相互接続の前記動的構成により、前記ハードウェアストリームアウトユニットから、前記ＧＰＵの外部にあるメモリに、コマンドの前記第１のセットのうちの１つまたは複数のコマンドの実行中に生成された中間データを出力するための手段と、
コマンドの第２のセットを実行するために、前記描画呼出しの前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの前記実行を完了するより前に、コマンドの前記第１のセットの前記実行をプリエンプトするための手段と、
コマンドの前記第２のセットを実行するための手段とを備える、デバイス。
［Ｃ２２］
前記１つまたは複数のプリミティブが、プリミティブの第１のセットとプリミティブの第２のセットとを備え、ここにおいて、プリエンプトするための前記手段が、ピクセルタイルをラスタライズおよびピクセルシェーディングし、他の後続のピクセルタイルをラスタライズおよびピクセルシェーディングしなかった後に、プリエンプトするための手段を備え、前記ピクセルタイルが、プリミティブの前記第１のセットのうちの１つまたは複数のプリミティブの１つまたは複数のピクセルを備え、プリミティブの前記第２のセットの前記ピクセルのいずれをも備えず、ここにおいて、ラスタライズおよびピクセルシェーディングすることが、前記グラフィックスパイプラインの２つのステージによって実施される機能を備える、Ｃ２１に記載のデバイス。
［Ｃ２３］
プリエンプトするための前記手段が、描画呼出し境界に達するより前にプリエンプトするための手段を備える、Ｃ２１に記載のデバイス。
［Ｃ２４］
前記ＧＰＵの前記ローカルメモリの前記出力を、前記グラフィックスパイプラインの前記ステージから切断するための前記手段が、
前記ＧＰＵの前記ローカルメモリの前記出力を、ラスタライザステージから切断するための手段を備える、Ｃ２１に記載のデバイス。
［Ｃ２５］
前記プリエンプション通知を受信したことに応答してのみ、シェーダによって生成された前記中間データを、前記ＧＰＵの外部にある前記メモリに出力するための手段と、
前記１つまたは複数のプリミティブをレンダリングするためのコマンドの前記第１のセットの実行を停止するための手段とをさらに備える、Ｃ２１に記載のデバイス。
【国際調査報告】
2018533137.tif 000011
2018533137.tif 000012
2018533137.tif 000013