(57)【特許請求の範囲】
【請求項１】
グラフィックス処理の方法であって、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用する、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を備える方法。
【請求項２】
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
をさらに備える、請求項１に記載の方法。
【請求項３】
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
をさらに備える、請求項１に記載の方法。
【請求項４】
中央処理ユニット上で実行されるソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
をさらに備える、請求項１に記載の方法。
【請求項５】
前記ソフトウェアは、グラフィックスドライバを含む、請求項４に記載の方法。
【請求項６】
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、請求項１に記載の方法。
【請求項７】
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
をさらに備える、請求項１に記載の方法。
【請求項８】
グラフィックス処理のために構成された装置であって、
１つまたは複数のプロセッサ
を備え、前記１つまたは複数のプロセッサは、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用する、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を行うようにさらに構成される、装置。
【請求項９】
前記１つまたは複数のプロセッサは、
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
を行うようにさらに構成される、請求項８に記載の装置。
【請求項１０】
前記１つまたは複数のプロセッサは、
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
を行うようにさらに構成される、請求項８に記載の装置。
【請求項１１】
前記１つまたは複数のプロセッサは、
中央処理ユニット上で実行されるソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
を行うようにさらに構成される、請求項８に記載の装置。
【請求項１２】
前記ソフトウェアは、グラフィックスドライバを含む、請求項１１に記載の装置。
【請求項１３】
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、請求項８に記載の装置。
【請求項１４】
前記１つまたは複数のプロセッサは、
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
を行うようにさらに構成される、請求項８に記載の装置。
【請求項１５】
グラフィックス処理のために構成された装置であって、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行するための手段と、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用し、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶するための手段と、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶するための手段と、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトするための手段と、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開するための手段と
を備える装置。
【請求項１６】
前記コマンドバッファ中の前記コマンドの完了をトラッキングするための手段
をさらに備える、請求項１５に記載の装置。
【請求項１７】
前記コマンドバッファをメモリに記憶するための手段と、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行するための手段と
をさらに備える、請求項１５に記載の装置。
【請求項１８】
中央処理ユニット上で実行するソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトするための手段
をさらに備える、請求項１５に記載の装置。
【請求項１９】
前記ソフトウェアは、グラフィックスドライバを含む、請求項１８に記載の装置。
【請求項２０】
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、請求項１５に記載の装置。
【請求項２１】
前記コマンドバッファがプリエンプトされる回数をトラッキングするための手段と、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否するための手段と、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可するための手段と
をさらに備える、請求項１５に記載の装置。
【請求項２２】
命令を記憶した非一時的なコンピュータ可読記憶媒体であって、前記命令は、実行されると、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用し、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を、グラフィックス処理のためのデバイスの１つまたは複数のプロセッサに行わせる、非一時的なコンピュータ可読記憶媒体。
【請求項２３】
前記命令は、
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
を前記１つまたは複数のプロセッサにさらに行わせる、請求項２２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２４】
前記命令は、
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
を前記１つまたは複数のプロセッサにさらに行わせる、請求項２２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２５】
前記命令は、
中央処理ユニット上で実行するソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
を前記１つまたは複数のプロセッサにさらに行わせる、請求項２２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２６】
前記ソフトウェアは、グラフィックスドライバを含む、請求項２５に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２７】
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、請求項２２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２８】
前記命令は、
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
を前記１つまたは複数のプロセッサにさらに行わせる、請求項２２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２９】
グラフィックス処理ユニットであって、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用し、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を行うように構成されたグラフィックス処理ユニット。
【請求項３０】
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
を行うようにさらに構成される、請求項２９に記載のグラフィックス処理ユニット。
【請求項３１】
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
を行うようにさらに構成された、請求項２９に記載のグラフィックス処理ユニット。
【請求項３２】
中央処理ユニット上で実行するソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
を行うようにさらに構成された、請求項２９に記載のグラフィックス処理ユニット。
【請求項３３】
前記ソフトウェアは、グラフィックスドライバを含む、請求項３２にグラフィックス処理ユニット。
【請求項３４】
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、請求項２９に記載のグラフィックス処理ユニット。
【請求項３５】
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
を行うようにさらに構成された、請求項２９に記載のグラフィックス処理ユニット。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]  本開示は、グラフィックス処理のための技法に関し、より具体的には、グラフィックス処理における任意の制御ポイントでのプリエンプションのための技法に関する。
【背景技術】
【０００２】
[0002]  グラフィカルユーザインターフェースおよびビデオゲーム用のコンテンツのような、表示用の視覚コンテンツは、グラフィックス処理ユニット（ＧＰＵ）によって生成され得る。ＧＰＵは、２次元または３次元（３Ｄ）オブジェクトを、表示され得る２次元（２Ｄ）画素表現へと変換し得る。３Ｄオブジェクトについての情報を、表示可能なビットマップへと変換することは、画素レンダリングとして知られており、大量のメモリおよび処理電力を必要とする。これまで、３Ｄグラフィックス機能は、強力なワークステーション上でのみ利用可能であった。しかしながら、現在、３Ｄグラフィックスアクセラレータは、パーソナルコンピュータ（ＰＣ）に加え、スマートフォン、タブレットコンピュータ、ポータブルメディアプレーヤ、ポータブルビデオゲーミングコンソール、等のモバイルデバイスにおいてよく見受けられる。典型的に、モバイルデバイスは、計算電力およびメモリ容量が、従来のＰＣと比べて少ない。このように、３Ｄグラフィックスレンダリング技法の増加した複雑性は、モバイルデバイス上にそのような技法を実装する際に問題を提起する。
【０００３】
[0003]  多くのシステムでは、ＧＰＵ処理を必要とするより高い優先度のタスクが実行され得るように、ＧＰＵ上でのコマンドの実行をプリエンプトするための技法が利用される。そのようなプリエンプション技法は一般に、１つのコマンドストリームを通したＧＰＵの進行がトラッキングされるプロセスを含む。このように、ＧＰＵは、より高い優先度のタスクへと移行し、そして、ＧＰＵが停止したポイントの元のタスクに戻り得る。
【発明の概要】
【０００４】
[0004]  一般に、本開示は、グラフィックス処理システムにおける任意の制御ポイントでのプリエンプションのための技法を説明する。具体的には、本開示の技法は、ＧＰＵ上の現在実行中のコマンドバッファが任意のポイントでプリエンプトされること、およびＧＰＵが、より高い優先度のタスクに迅速に移行することを可能にする。より高い優先度のタスクが完了した後、ＧＰＵは、元のコマンドバッファに戻り、最初から開始する。そのような再開（restart）を容易にするために、本開示の技法は、読取修正書込リソースの元の状態が復元され得るように、コマンドバッファ中のコマンドによって使用される任意の読取修正書込メモリリソースをダブルバッファすることを提案する。
【０００５】
[0005]  本開示の一例では、グラフィックス処理の方法は、グラフィックス処理ユニットに対してコマンドバッファ中のコマンドを実行することと、ここで、これらコマンドは、読取修正書込メモリリソース内のデータに作用する（operate on）、読取修正書込メモリリソースの元データを第１のバッファに記憶することと、コマンドバッファ中のコマンドを実行することによって生成される任意の修正済みデータを第２のバッファに記憶することと、コマンドバッファ中のすべてのコマンドを完了する前にコマンドバッファ中のコマンドの実行をプリエンプトすることと、実行をプリエンプトした後に、第１のバッファ中の元データを使用してコマンドバッファの初めからコマンドの実行を再開することとを備える。
【０００６】
[0006]  本開示の技法はまた、装置、グラフィックス処理ユニット、および、プロセッサに本技法を行わせるための命令を格納しているコンピュータ可読記憶媒体の観点から説明される。１つまたは複数の例の詳細は、添付の図面および以下の説明において示される。他の特徴、目的、および利点は、本説明および図面から、および特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【０００７】
【図１】[0007]  図１は、本開示の技法を使用するように構成された例となるコンピューティングデバイスを示すブロック図である。
【図２】[0008]  図２は、例となるグラフィックスレンダリングシステムを示すブロック図である。
【図３】[0009]  図３は、ＧＰＵを使用する例となる汎用コンピューティングシステムを示すブロック図である。
【図４】[0010]  図４は、プリエンプション要求を示す概念的な図である。
【図５】[0011]  図５は、本開示の１つまたは複数の例に係る、プリエンプション要求の処理（handling）を示す概念的な図である。
【図６】[0012]  図６は、本開示の技法に係る、例となる方法を示すフローチャートである。
【発明の詳細な説明】
【０００８】
[0013]  本開示は、グラフィックス処理のための技法に関し、より具体的には、任意の制御ポイントでのプリエンプションのための技法に関する。具体的には、本開示は、コンピューティングシステム内の入力／出力（Ｉ／Ｏ）デバイスのためのプリエンプションメカニズムについての技法に関する。具体的には、本開示は、例えば、グラフィックス処理ユニット（ＧＰＵ）上で実行されるグラフィックス処理のようなグラフィックス処理を停止および再開する（resume）ためにオペレーティングシステムで使用されるプリエンプションメカニズムの観点から説明されるだろう。
【０００９】
[0014]  簡単に言えば、ＧＰＵに対するプリエンプション要求は、ＧＰＵ処理を必要とする別のより高い優先度の動作に有利なように（in favor of）コマンドバッファの現在のグラフィックス処理を停止するよう求める、グラフィックス処理システムの別のエンティティ（例えば、中央処理ユニット（ＣＰＵ）上で実行されるアプリケーション）によって行われる要求である。多くの場合、そのようなプリエンプション要求は、オペレーティングシステムから発生する（originate）だろう。グラフィックス処理のプリエンプションのための従来の技法は、いわゆる「セーフポイント」の使用に頼る。すなわち、ＧＰＵが、現在の処理をプリエンプトするよう求める要求を受けると、ＧＰＵは、特定のポイント（例えば、コマンドバッファ中の特定のポイント）まで処理し続け、そのポイントでの処理の状態についての情報を保存する。そのような情報には、処理が停止したかつ再開されるべきコマンドバッファ中のポイント、ＧＰＵ処理の出力を受ける任意のバッファのコンテンツ、およびコマンド中のそのポイントにおける任意のＧＰＵ処理のために入力データとして使用され得る１つまたは複数のバッファのコンテンツが含まれ得る。
【００１０】
[0015]  そのような状態情報を保存することで、ＧＰＵは、正確な入力および出力データを用いて既知のポイントで処理を再開することができる。しかしながら、プリエンプション要求を受けたときにセーフポイントまで処理することおよび状態情報を保存することは、不確定の時間量がかかる。プリエンプション要求は、ＧＰＵによって実行されるコマンドバッファ中の非同期のポイントで発生し得、そのため、セーフポイントに到達するまでにＧＰＵがどれだけ動作する必要があり得るかを予測することは可能ではないだろう。いくつかの状況では、プリエンプション要求に応答して、ＧＰＵがセーフポイントに到達し、状態情報を保存し、新しいコマンドバッファの処理を開始するための時間は、望ましくないほどに長い可能性がある。いくつかのアプリケーションは、より高い優先度のグラフィックスタスクが迅速に開始され得ない場合、乏しいユーザ経験に帰着し得る。
【００１１】
[0016]  これら欠点に鑑みて、本開示は、任意の制御ポイントでプリエンプション要求を処理するための技法を提示する。具体的には、本開示の技法は、より高い優先度のタスクを実行するよう求めるプリエンプション要求に応答して、コマンドバッファの部分的な処理の結果が却下され得、このコマンドバッファが最初から再実行され得るように、元のタスクのためのコマンドバッファを実行するためにＧＰＵによって使用される読取修正書込リソースをダブルバッファすることを含む。このように、プリエンプション要求は、元のタスクの処理を再開するための安定した状態を依然として維持しつつ、迅速に処理され得る。
【００１２】
[0017]  一例では、グラフィックス処理のためのコマンドストリームは、後続のフレームをレンダリンするために、以前にレンダリンされたフレームバッファのコンテンツを読み取り、次に修正し得る。現在のフレームのレンダリングが、このフレームが完了する前にプリエンプトされる場合、本開示の技法は、初めからコマンドバッファの実行を再開する（すなわち、最初からフレームのレンダリングを開始する）ことを含む。プリエンプション中、コマンドバッファのコンテンツ全体は、後のポイントでの再生のために記憶される。以前のフレームバッファの一部分が、プリエンプションの前に修正されている場合、フレームバッファのそのような部分は、現在処理されるフレームにとって正確な入力ではないだろう。そのため、本開示の技法はまた、コマンドバッファ全体が処理されるまで読取修正書込リソース（例えば、以前のフレームのフレームバッファのコンテンツ）の複写を記憶することを含む。以前のフレームバッファのコンテンツに対する任意の修正は、異なるバッファに記憶される（すなわち、読取修正書込バッファはダブルバッファされる）。
【００１３】
[0018]  図１は、任意の制御ポイントでのプリエンプションのための本開示の技法を実装するために使用され得る例となるコンピューティングデバイス２を例示するブロック図である。コンピューティングデバイス２は、例えば、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームまたはコンソール、例えば、いわゆるスマートフォンを含む、例えば、セルラまたは衛星電話のようなモバイル電話、ランドライン電話、インターネット電話、ポータブルビデオゲームデバイスまたは携帯情報端末（ＰＤＡ）のようなハンドヘルドデバイス、パーソナルミュージックプレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、介在ネットワークデバイス、メインフレームコンピュータ、任意のモバイルデバイス、あるいはグラフィカルデータを処理および／または表示する任意の他のタイプのデバイスを備え得る。
【００１４】
[0019]  図１の例に例示されているように、コンピューティングデバイス２は、ユーザ入力インターフェース４、中央処理ユニット（ＣＰＵ）６、メモリコントローラ８、システムメモリ１０、グラフィックス処理ユニット（ＧＰＵ）１２、グラフィックスメモリ１４、ディスプレイインターフェース１６、ディスプレイ１８、ならびにバス２０および２２を含み得る。いくつかの例では、グラフィックスメモリ１４が、ＧＰＵ１２と「オンチップ」であり得ることに留意されたい。いくつかのケースでは、図１に示されるすべてのハードウェア素子は、オンチップ、例えば、例えば、システムオンチップ（ＳｏＣ）設計であり得る。ユーザ入力インターフェース４、ＣＰＵ６、メモリコントローラ８、ＧＰＵ１２、およびディスプレイインターフェース１６は、バス２０を使用して互いに通信し得る。メモリコントローラ８およびシステムメモリ１０はまた、バス２２を使用して互いと通信し得る。バス２０、２２は、第３世代バス（例えば、HyperTransportバスまたはInfiniBandバス）、第２世代バス（例えば、ＡＧＰ（Advanced Graphics Port）バス、ＰＣＩ（Peripheral Component Interconnect）エクスプレスバス、またはＡＸＩ（Advanced eXentisible Interface）バス）、あるいは別のタイプのバスまたはデバイス接続のような、様々なバス構造のうちの何れかであり得る。図１に示される異なる構成要素間のバスおよび通信インターフェースの特定の構成は単なる例であり、同じまたは異なる構成要素を有する他のグラフィックス処理および／またはシステムコンピューティングデバイスの他の構成が、本開示の技法を実装するために使用され得ることに留意されるべきである。
【００１５】
[0020]  ＣＰＵ６は、コンピューティングデバイス２の動作を制御する汎用プロセッサまたは専用プロセッサを備え得る。ユーザは、１つまたは複数のソフトウェアアプリケーションを実行することをＣＰＵ６に行わせるために、コンピューティングデバイス２への入力を提供し得る。ＣＰＵ６上で実行されるソフトウェアアプリケーションには、例えば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムが含まれ得る。追加的に、ＣＰＵ６は、ＧＰＵ１２の動作を制御するためのＧＰＵドライバ７を実行し得る。ユーザは、キーボード、マウス、マイクロフォン、タッチパッド、または、ユーザ入力インターフェース４を介してコンピューティングデバイス２に結合された別の入力デバイスのような１つまたは複数の入力デバイス（示されない）を介してコンピューティングデバイス２への入力を提供し得る。
【００１６】
[0021]  ＣＰＵ６上で実行されるソフトウェアアプリケーションは、ディスプレイ１８へのグラフィックスデータのレンダリングを引き起こすようＣＰＵ６に命令する１つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、グラフィックスアプリケーションプログラミングインターフェース（ＡＰＩ）に一致し得、これは例えば、ＯｐｅｎＧＬ（登録商標）（Open Graphics Library）ＡＰＩ、ＯｐｅｎＧＬ ＥＳ（Open Graphics Library Embedded Systems）ＡＰＩ、Ｄｉｒｅｃｔ３Ｄ ＡＰＩ、Ｘ３Ｄ ＡＰＩ、ＲｅｎｄｅｒＭａｎ ＡＰＩ、ＷｅｂＧＬ ＡＰＩ、あるいは任意の他の公のまたは専有の標準的なグラフィックスＡＰＩである。グラフィックスレンダリング命令を処理するために、ＣＰＵ６は、グラフィックスデータのレンダリングのうちのいくつかまたはすべてを行うことをＧＰＵ１２に行わせるために、ＧＰＵ１２に１つまたは複数のグラフィックスレンダリングコマンドを発し得る（例えば、ＧＰＵドライバ７を通して）。いくつかの例では、レンダリングされるべきグラフィックスデータは、例えば、点、線、三角形、四角形、トライアングルストリップストリップ（triangle strip）、等のグラフィックスプリミティブのリストを含み得る。
【００１７】
[0022]  メモリコントローラ８は、システムメモリ１０に出入りするデータの移送を容易にする。例えば、メモリコントローラ８は、コンピューティングデバイス２内の構成要素にメモリサービスを提供するために、メモリ読取および書込コマンドを受け、システムメモリ１０に関するそのようなコマンドをサービスし得る。メモリコントローラ８は、メモリバス２２を介してシステムメモリ１０に通信的に結合される。メモリコントローラ８は、図１では、ＣＰＵ６およびシステムメモリ１０の両方とは別個の処理モジュールであると例示されているが、他の例では、メモリコントローラ８の機能性のうちのいくつかまたはすべては、ＣＰＵ６およびシステムメモリ１０の一方または両方に実装され得る。
【００１８】
[0023]  システムメモリ１０は、ＣＰＵ６による実行のためにアクセス可能なプログラムモジュールおよび／または命令、ならびに／あるいは、ＣＰＵ６上で実行されるプログラムにより使用するためのデータを記憶し得る。例えば、システムメモリ１０は、ディスプレイ１８上にグラフィカルユーザインターフェース（ＧＵＩ）を提示するために、ＣＰＵ６によって使用されるウィンドウマネージャアプリケーションを記憶し得る。加えて、システムメモリ１０は、ユーザアプリケーションと、これらアプリケーションに関連付けられたアプリケーションサーフェスデータとを記憶し得る。システムメモリ１０は、追加的に、コンピューティングデバイス２の他の構成要素による使用のためのおよび／またはそれらによって生成される情報を記憶し得る。例えば、システムメモリ１０は、ＧＰＵ１２のためのデバイスメモリとして機能し得、ＧＰＵ１２によって作用されるデータに加え、ＧＰＵ１２によって行われる動作に起因するデータを記憶し得る。例えば、システムメモリ１０は、テクスチャバッファ、深度バッファ、ステンシルバッファ、頂点バッファ、フレームバッファ、等の任意の組み合わせを記憶し得る。システムメモリ１０は、例えば、ランダムアクセスメモリ（ＲＡＭ）、静的メモリ（ＳＲＡＭ）、動的ＲＡＭ（ＤＲＡＭ）、読取専用メモリ（ＲＯＭ）、消去可能なプログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能なプログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体、あるいは光記憶媒体のような、１つまたは複数の揮発性および不揮発性メモリまたは記憶デバイスを含み得る。
【００１９】
[0024]  ＧＰＵ１２は、ディスプレイ１８に１つまたは複数のグラフィックスプリミティブをレンダリングするためにグラフィックス動作を行うように構成され得る。ゆえに、ＣＰＵ６上で実行されるソフトウェアアプリケーションのうちの１つがグラフィックス処理を必要とするとき、ＣＰＵ６は、グラフィックスコマンドおよびグラフィックスデータを、ディスプレイ１８へのレンダリングのためにＧＰＵ１２に提供し得る。グラフィックスデータは、例えば、描画コマンド、状態情報、プリミティブ情報、テクスチャ情報、等を含み得る。ＧＰＵ１２は、いくつかの事例では、複雑なグラフィック関連動作をＣＰＵ６よりも効率的に処理することを提供する高度に並列な構造で築かれ得る。例えば、ＧＰＵ１２は、並列の手法で、複数の頂点または画素に作用するように構成される複数の処理素子を含み得る。ＧＰＵ１２の高度に並列な性質は、いくつかの事例では、ＧＰＵ１２が、グラフィックス画像（例えば、ＧＵＩおよび２次元（２Ｄ）および／または３次元（３Ｄ）グラフィックスシーン）をディスプレイ１８上に、ＣＰＵ１８を用いてこれらのシーンを直接ディスプレイ１８上に描画するよりも迅速に描画することを可能にし得る。
【００２０】
[0025]  他の例では、ＧＰＵ１２は、グラフィックス以外のアプリケーションに関する計算を行うために、汎用の「シェーダプログラム」実行するように構成され得る。ＧＰＵのそのような使用は、汎用ＧＰＵ（ＧＰＧＰＵ）と呼ばれることがある。ＧＰＵ処理素子の高度に並列な性質により、いくつかのタイプの算出は、ＣＰＵよりも効率的にＧＰＵによって行われ得る。
【００２１】
[0026]  ＧＰＵ１２は、いくつかの事例では、コンピューティングデバイス２のマザーボードへと一体化され得る。他の事例では、ＧＰＵ１２は、コンピューティングデバイス２のマザーボードにおけるポートでインストールされるグラフィックスカード上にあり得るか、コンピューティングデバイス２と相互動作するように構成された周辺デバイス内にその他の方法で組み込まれ得る。ＧＰＵ１２は、１つまたは複数のマイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタルシグナルプロセッサ（ＤＳＰ）、あるいは他の等価的な集積回路またはディスクリート論理回路といった１つまたは複数のプロセッサを含み得る。
【００２２】
[0027]  ＧＰＵ１２は、グラフィックスメモリ１４に直接結合され得る。ゆえに、ＧＰＵ１２は、バス２０を使用することなく、グラフィックスメモリ１４からデータを読み取り、それにデータを書き込み得る。換言すると、ＧＰＵ１２は、オフチップメモリの代わりに、ローカル記憶装置を使用してローカルにデータを処理し得る。これにより、ＧＰＵ１２は、重いバストラフィックを経験し得る、ＧＰＵ１２がバス２０を介してデータを読み取るおよび書き込む必要性を除去することによって、より効率的な手法で動作することができる。しかしながら、いくつかの事例では、ＧＰＵ１２は、別個のメモリを含まず、代わりに、バス２０を介してシステムメモリ１０を利用し得る。グラフィックスメモリ１４は、例えば、ランダムアクセスメモリ（ＲＡＭ）、静的メモリ（ＳＲＡＭ）、動的ＲＡＭ（ＤＲＡＭ）、消去可能なプログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能なプログラマブルＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気データ媒体、あるいは光記憶媒体のような、１つまたは複数の揮発性および不揮発性メモリまたは記憶デバイスを含み得る。
【００２３】
[0028]  ＣＰＵ６および／またはＧＰＵ１２は、レンダリングされた画像データをフレームバッファ１５に記憶し得る。フレームバッファ１５は、独立したメモリであり得るか、またはシステムメモリ１０内に配置され得る。ディスプレイインターフェース１６は、フレームバッファ１５からデータを取り出し、レンダリングされた画像データによって表される画像を表示するようにディスプレイ１８を構成し得る。いくつかの例では、ディスプレイインターフェース１６は、フレームバッファから取り出されたデジタル値を、ディスプレイ１８が消費可能なアナログ信号へと変換するように構成されたデジタル／アナログ変換器（ＤＡＣ）を含み得る。他の例では、ディスプレイインターフェース１６は、ディスプレイ１８上でのディスプレイプロセッサによる処理のために、デジタル値をディスプレイ１８に直接パスし得る。ディスプレイ１８は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ（ＬＣＤ）、プラズマディスプレイパネル、オーガニックＬＥＤ（ＯＬＥＤ）ディスプレイのような発光ダイオード（ＬＥＤ）アレイ、ブラウン管（ＣＲＴ）ディスプレイ、電子ペーパ、表面電界ディスプレイ（ＳＥＤ）、レーザテレビジョンディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ１８は、コンピューティングデバイス２内に一体化され得る。例えば、ディスプレイ１８は、モバイル電話のスクリーンであり得る。代替的に、ディスプレイ１８は、ワイヤードまたはワイヤレス通信リンクを介してコンピューティングデバイス２に結合されたスタンドアローンデバイスであり得る。例えば、ディスプレイ１８は、ケーブルまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
【００２４】
[0029]  本開示のプリエンプション技術は、３Ｄレンダリング、２Ｄレンダリング、ＧＰＧＰＵアプリケーション、またはＧＰＵによって行われ得る任意の他の計算を含む、ＧＰＵの任意のアプリケーションに使用され得る。図２および図３は、２つの異なるＧＰＵアプリケーションの典型的なシステムアーキテクチャの２つの例を示す。図２は、２Ｄおよび／または３Ｄグラフィックスレンダリングアプリケーションにおける図１のＣＰＵ６、ＧＰＵ１２、およびシステムメモリ１０の例となる実装を例示するブロック図である。ＣＰＵ６は、少なくとも１つのソフトウェアアプリケーション２４、グラフィックスＡＰＩ２６、およびＧＰＵドライバ７を含み得、それらの各々は、ＣＰＵ６上で実行される１つまたは複数のソフトウェアアプリケーションまたはサービスであり得る。ＧＰＵ１２は、グラフィックス処理コマンドを実行するために共に動作する複数のグラフィックス処理段を含むグラフィックス処理パイプライン３０を含み得る。ＧＰＵ１２は、ビニングレンダリングモードおよびダイレクトレンダリングモードを含む様々なレンダリングモードでグラフィックス処理パイプライン３０を実行するように構成され得る。図２に示されるように、グラフィックス処理パイプライン３０は、コマンドエンジン３２、ジオメトリ処理段３４、ラスタライゼーション段３６、および画素処理パイプライン３８を含み得る。グラフィックス処理パイプライン３０内の構成要素の各々は、固定機能（fixed-function）構成要素、プログラマブル構成要素（例えば、プログラマブルシェーダユニット上で実行されるシェーダプログラムの一部としての）として、または固定機能構成要素とプログラマブル構成要素の組み合わせとして実装され得る。ＣＰＵ６およびＧＰＵ１２に利用可能なメモリは、システムメモリ１０およびフレームバッファ１５を含み得る。フレームバッファ１５は、システムメモリ１０の一部であり得るか、またはシステムメモリ１０とは別個であり得る。フレームバッファ１５は、レンダリングされた画像データを記憶し得る。
【００２５】
[0030]  ソフトウェアアプリケーション２４は、ＧＰＵ１２の機能性を利用する任意のアプリケーションであり得る。例えば、ソフトウェアアプリケーション２４は、ＧＵＩアプリケーション、オペレーティングシステム、ポータブルマッピングアプリケーション、光学および芸術アプリケーションのためのコンピュータ支援型設計プログラム、ビデオゲームアプリケーション、あるいは２Ｄまたは３Ｄグラフィックスを使用する別のタイプのソフトウェアアプリケーションであり得る。
【００２６】
[0031]  ソフトウェアアプリケーション２４は、グラフィカルユーザインターフェース（ＧＵＩ）および／またはグラフィックスシーンをレンダリングするようＧＰＵ１２に命令する１つまたは複数の描画命令を含み得る。例えば、描画命令は、ＧＰＵ１２によってレンダリングされるべき１つまたは複数のグラフィックスプリミティブのセットを定義する命令を含み得る。いくつかの例では、描画命令は、集合的に、ＧＵＩにおいて使用される複数のウィンドウサーフェス（windowing surfaces）のすべてまたは一部を定義し得る。追加の例では、描画命令は、集合的に、アプリケーションによって定義されたモデル空間またはワールド空間内に１つまたは複数のグラフィックスオブジェクトを含むグラフィックスシーンのすべてまたは一部を定義し得る。
【００２７】
[0032]  ソフトウェアアプリケーション２４は、１つまたは複数のグラフィックスプリミティブを、ディスプレイ可能なグラフィックス画像へとレンダリングするための１つまたは複数のコマンドをＧＰＵ１２に発するために、グラフィックスＡＰＩ２６を介して、ＧＰＵドライバ７を起動し得る。例えば、ソフトウェアアプリケーション２４は、ＧＰＵ１２にプリミティブ定義を提供するために、グラフィックスＡＰＩ２６を介して、ＧＰＵドライバ７を起動し得る。いくつかの事例では、プリミティブ定義が、例えば、三角形、四角形、トライアングルファン（triangle fan）、トライアングルストリップ、等の描画プリミティブのリストの形式で、ＧＰＵ１２に提供され得る。プリミティブ定義は、レンダリングされるべきプリミティブに関連付けられた１つまたは複数の頂点を指定する頂点仕様（vertex specification）を含み得る。頂点仕様は、各頂点についての位置座標、および、いくつかの事例では、この頂点に関連付けられた他の属性、例えば、色座標、法線ベクトル、およびテクスチャ座標を含み得る。プリミティブ定義はまた、プリミティブタイプ情報（例えば、三角形、四角形、トライアングルファン、トライアングルストリップ、等）、スケーリング情報、回転情報、等を含み得る。ソフトウェアアプリケーション２４によってＧＰＵドライバ７に発せられる命令に基づいて、ＧＰＵドライバ７は、プリミティブをレンダリングするためにＧＰＵ１２が行う１つまたは複数の動作を指定する１つまたは複数のコマンドを公式化し得る。ＧＰＵ１２がＣＰＵ６からコマンドを受けると、グラフィックス処理パイプライン３０は、このコマンドを復号し、このコマンドにおいて指定された動作を行うようにグラフィックス処理パイプライン３０内の１つまたは複数の処理素子を構成する。指定された動作を行った後、グラフィックス処理パイプライン３０は、レンダリングされたデータを、ディスプレイデバイスに関連付けられたフレームバッファ４０に出力する。グラフィックスパイプライン３０は、ビニングレンダリングモードおよびダイレクトレンダリングモードを含む、複数の異なるレンダリングモードのうちの１つにおいて実行するように構成され得る。ビニングレンダリングモードおよびダイレクトレンダリングモードの動作が以下により詳細に説明されるだろう。
【００２８】
[0033]  ＧＰＵドライバ７は、１つまたは複数のシェーダプログラムをコンパイルするように、および、コンパイルされたシェーダプログラムを、ＧＰＵ１２内に含まれる１つまたは複数のプログラマブルシェーダユニットへとダウンロードするようにさらに構成され得る。シェーダプログラムは、例えば、ＧＬＳＬ（OpenGL Shading Language）、ＨＬＳＬ（High Level Shading Language）、Ｃｇ（C for Graphics）シェーディング言語、等の高レベルのシェーディング言語で書かれ得る。コンパイルされたシェーダプログラムは、ＧＰＵ１２内のプログラマブルシェーダユニットの動作を制御する１つまたは複数の命令を含み得る。例えば、シェーダプログラムは、頂点シェーダプログラムおよび／または画素シェーダプログラムを含み得る。頂点シェーダプログラムは、プログラマブル頂点シェーダユニットまたは統合シェーダユニットの実行を制御し、１つまたは複数の頂点単位の（per-vertex）動作を指定する命令を含み得る。画素シェーダプログラムは、プログラマブル画素シェーダユニットまたは統合シェーダユニットの実行を制御する画素シェーダプログラムを含み、１つまたは複数の画素単位の（per-pixel）動作を指定する命令を含み得る。本開示のいくつかの例となる実施形態にしたがって、画素シェーダプログラムはまた、ソース画素についての対応するデスティネーションアルファ値（destination alpha value）に基づいて、そのソース画素について、テクスチャ値が取り出されることを選択的に引き起こす命令を含み得る。
【００２９】
[0034]  以下でより詳細に説明されるように、グラフィックスドライバ７はまた、ＧＰＵ１２に、別のジョブに有利なようにその現在の処理を停止するよう求めるプリエンプション要求を発するためにソフトウェアアプリケーション２４によって使用され得る。
【００３０】
[0035]  グラフィックス処理パイプライン３０は、グラフィックスドライバ２８を介してＣＰＵ６から１つまたは複数のグラフィックス処理コマンドを受けるように、および、このグラフィックス処理コマンドを実行してディスプレイ可能なグラフィックス画像を生成するように構成され得る。上述したように、グラフィックス処理パイプライン３０は、グラフィックス処理コマンドを実行するために共に動作する複数の段を含む。しかしながら、そのような段が、必ずしも、別個のハードウェアブロックにおいて実装される必要がないことは留意されるべきである。例えば、ジオメトリ処理段３４および画素処理パイプライン３８の一部は、統合シェーダユニットの一部として実装され得る。この場合も同様に、グラフィックスパイプライン３０は、ビニングレンダリングモードおよびダイレクトレンダリングモードを含む、複数の異なるレンダリングモードのうちの１つにおいて実行するように構成され得る。
【００３１】
[0036]  コマンドエンジン３２は、グラフィックス処理コマンドを受け得、そして、このグラフィックス処理コマンドを実行するための様々な動作を行うようにグラフィックス処理パイプライン３０内の残りの処理段を構成し得る。グラフィックス処理コマンドは、例えば、描画コマンドおよびグラフィックス状態コマンドを含み得る。描画コマンドは、１つまたは複数の頂点についての位置座標、および、いくつかの事例では、これら頂点の各々に関連付けられた他の属性値、例えば、色座標、法線ベクトル、テクスチャ座標、およびフォグ座標（fog coordinates）を指定する頂点仕様コマンドを含み得る。グラフィックス状態コマンドは、プリミティブタイプコマンド、変換コマンド、点灯コマンド（lighting command）、等を含み得る。プリミティブタイプコマンドは、レンダリングされるべきプリミティブのタイプ、および／または、プリミティブを形成するために頂点がどのように合成されるのかを指定し得る。変換コマンドは、頂点に対して実行すべき変換のタイプを指定し得る。点灯コマンドは、グラフィックスシーン内での異なる光の配置、タイプ、および／または方向を指定し得る。コマンドエンジン３２は、１つまたは複数の受けたコマンドに関連付けられた頂点および／またはプリミティブに対してジオメトリ処理を行うことをジオメトリ処理段３４に行わせ得る。
【００３２】
[0037]  ジオメトリ処理段３４は、１つまたは複数の頂点に対して頂点単位の動作および／またはプリミティブセットアップ動作を行い、ラスタライゼーション段３６のためのプリミティブデータを生成し得る。各頂点は、属性のセット、例えば、位置座標、色値、法線ベクトル、およびテクスチャ座標、に関連付けられ得る。ジオメトリ処理段３４は、様々な頂点単位の動作にしたがって、これら属性のうちの１つまたは複数を修正する。例えば、ジオメトリ処理段３４は、頂点位置座標に対して１つまたは複数の変換を行い、修正済み頂点位置座標を生成し得る。ジオメトリ処理段３４は、例えば、頂点位置座標に対してモデリング変換、ビューイング変換、投影変換、ＭｏｄｅｌＶｉｅｗ変換、ＭｏｄｅｌＶｉｅｗＰｒｏｊｅｃｔｉｏｎ変換、ビューポート変換、および深度範囲スケーリング変換のうちの１つまたは複数を適用して、修正済み頂点位置座標を生成し得る。いくつかの事例では、頂点位置座標は、モデル空間座標であり得、修正済み頂点位置座標は、スクリーン空間座標であり得る。スクリーン空間座標は、モデリング変換、ビューイング変換、投影変換、ビューポート変換の適用後に取得され得る。いくつかの事例では、ジオメトリ処理段３４はまた、頂点に対して頂点単位の点灯動作を行い、これら頂点についての修正済み色座標を生成し得る。ジオメトリ処理段３４はまた、例えば、正規変換、正規の正規化演算（normal normalization operation）、ビューボリュームクリッピング（view volume clipping）、同種分割（homogenous division）、および／またはバックフェースカリング演算（backface culling operation）を含む他の動作を行い得る。
【００３３】
[0038]  ジオメトリ処理段３４は、ラスタライズされるべきプリミティブを定義する１つまたは複数の修正済み頂点のセットを含むプリミティブデータに加え、プリミティブを形成するために頂点がどのように合成されるのかを指定するデータを生成し得る。修正済み頂点の各々は、例えば、修正済み頂点位置座標と、この頂点に関連付けられた処理された頂点属性値とを含み得る。プリミティブデータは、集合的に、グラフィックス処理パイプライン３０のさらなる段によってラスタライズされるべきプリミティブに対応し得る。概念的に、各頂点は、プリミティブの２つのエッジが交わるプリミティブのコーナに対応し得る。ジオメトリ処理段３４は、プリミティブデータを、さらなる処理のために、ラスタライゼーション段３６に提供し得る。
【００３４】
[0039]  いくつかの例では、ジオメトリ処理段３４のすべてまたは一部は、１つまたは複数のシェーダユニット上で実行される１つまたは複数のシェーダプログラムによって実装され得る。例えば、ジオメトリ処理段３４は、そのような例では、頂点シェーダ、ジオメトリシェーダ、またはそれらの任意の組み合わせによって実装され得る。他の例では、ジオメトリ処理段３４は、固定機能ハードウェア処理パイプラインとして、または、固定機能ハードウェアと、１つまたは複数のシェーダユニット上で実行される１つまたは複数のシェーダプログラムとの組み合わせとして実装され得る。
【００３５】
[0040]  ラスタライゼーション段３６は、ジオメトリ処理段３４から、ラスタライズされるべきプリミティブを表すプリミティブデータを受け、このプリミティブをラスタライズして、ラスタライズされたプリミティブに対応する複数のソース画素を生成するように構成される。いくつかの例では、ラスタライゼーション段３６は、ラスタライズされるべきプリミティブによってどのスクリーン画素ロケーションがカバーされるのかを決定し、このプリミティブによってカバーされると決定された各スクリーン画素ロケーションに対するソース画素を生成し得る。ラスタライゼーション段３６は、例えば、エッジウォーキング技法、評価エッジ式、等のような、当業者に知られている技法を使用することによって、プリミティブによってどのスクリーン画素ロケーションがカバーされるのかを決定し得る。ラスタライゼーション段３６は、結果として生じるソース画素を、さらなる処理のために、画素処理パイプライン３８に提供し得る。
【００３６】
[0041]  ラスタライゼーション段３６によって生成されるソース画素は、例えば、デスティネーション画素のようなスクリーン画素ロケーションに対応し、１つまたは複数の色属性に関連付けられ得る。特定のラスタライズされたプリミティブのために生成されるすべてのソース画素は、ラスタライズされたプリミティブに関連付けられていると考えられ得る。プリミティブによってカバーされるべきであると、ラスタライゼーション段３６によって決定された画素は、概念的に、プリミティブの頂点を表す画素、プリミティブのエッジを表す画素、および、プリミティブの内部を表す画素を含み得る。
【００３７】
[0042]  画素処理パイプライン３８は、ラスタライズされたプリミティブに関連付けられたソース画素を受け、ソース画素に対して１つまたは複数の画素単位の動作を行うように構成される。画素処理パイプライン３８によって行われ得る画素単位の動作は、例えば、アルファテスト、テクスチャマッピング、色計算、画素シェーディング、画素単位の点灯、フォグ処理、ブレンディング、画素オーナーシップテスト、ソースアルファテスト、ステンシルテスト、深度テスト、シザーテスト（scissors test）、および／またはすストリッピング動作を含む。加えて、画素処理パイプライン３８は、１つまたは複数の画素単位の動作を行うために、１つまたは複数の画素シェーダプログラムを実行し得る。画素処理パイプライン３８によって生成される結果として生じるデータは、本明細書では、デスティネーション画素データと呼ばれ、フレームバッファ１５に記憶され得る。デスティネーション画素データは、処理されたソース画素と同じディスプレイロケーションを有するフレームバッファ１５内のデスティネーション画素に関連付けられ得る。デスティネーション画素データは、例えば、色値、デスティネーションアルファ値、深度値、等のデータを含み得る。
【００３８】
[0043]  フレームバッファ１５は、ＧＰＵ１２のためのデスティネーション画素を記憶する。各デスティネーション画素は、一意的なスクリーン画素ロケーションに関連付けられ得る。いくつかの例では、フレームバッファ１５は、デスティネーション画素ごとに色成分およびデスティネーションアルファ値を記憶し得る。例えば、フレームバッファ１５は、画素ごとに赤、緑、青、アルファ（ＲＧＢＡ）成分を記憶し得、ここで、「ＲＧＢ」成分は、色値に対応し、「Ａ」成分は、デスティネーションアルファ値に対応する。フレームバッファ１５およびシステムメモリ１０は別個のメモリユニットであるように例示されているが、他の例では、フレームバッファ１５は、システムメモリ１０の一部であり得る。
【００３９】
[0044]  図３は、ＧＰＧＰＵアプリケーションにおける図１のＣＰＵ６、ＧＰＵ１２、およびシステムメモリ１０の例となる実装を例示するブロック図である。図１のシステムのＧＰＵ１２が、ＧＰＵ上で実行されるためにロードされるソフトウェア、および、ＧＰＵの動作を制御するために使用されるドライバに基づいて、グラフィックス処理タスク、ＧＰＧＰＵタスク、または、ＧＰＵに適した任意の他のタイプのタスクを行うために選択的に駆動され得ることに留意されるべきである。図３の例では、ＣＰＵ６は、少なくとも１つのソフトウェアアプリケーション２５およびＧＰＧＰＵドライバ５０を実行し得、これらの各々は、ＣＰＵ６上で実行される１つまたは複数のソフトウェアアプリケーションまたはサービスであり得る。ＧＰＵ１２は、汎用シェーダ５２を実行するように構成され得る。汎用シェーダ５２は、算出を行うＧＰＵ１２の処理素子の並列性質を利用するＧＰＵ１２上での実行のために適用可能な任意のアプリケーションであり得る。この場合も同様に、ＣＰＵ６およびＧＰＵ１２に利用可能なメモリは、システムメモリ１０を含み得る。ＧＰＵ１２はまた、より速いローカルグラフィックスメモリ１４を利用し得る。
【００４０】
[0045]  ソフトウェアアプリケーション２５は、ＧＰＵ１２の機能性を利用する任意のアプリケーションであり得る。例えば、ソフトウェアアプリケーション２５は、ＧＰＵ２によって複雑な算出がなされることを必要とするアプリケーションであり得る。
【００４１】
[0046]  ソフトウェアアプリケーション２５は、例えば、汎用シェーダ５２を実行するための１つまたは複数のコマンドをＧＰＵ１２に発するために、ＧＰＧＰＵドライバ５０を伴い得る。以下でより詳細に説明されるように、ＧＰＧＰＵドライバ５０は、別のジョブに有利なようにその現在の処理を停止するよう求めるプリエンプション要求をＧＰＵ１２に発するために、ソフトウェアアプリケーション２５によって使用され得る。
【００４２】
[0047]  上述したように、本開示は、グラフィックス処理のための技法に関し、より具体的には、任意の制御ポイントでのプリエンプションのための技法に関する。具体的には、本開示は、コンピューティングシステムにおけるＩ／Ｏデバイスのためのプリエンプションメカニズムの技法に関する。具体的には、本開示は、グラフィックス処理動作、例えば、グラフィックス処理ユニット（ＧＰＵ）上で実行されるグラフィックス処理、を停止および再開するためにオペレーティングシステムで使用されるプリエンプションメカニズムの観点から説明されるだろう。
【００４３】
[0048]  簡単に言えば、ＧＰＵに対するプリエンプション要求は、ＧＰＵ処理を必要とする別のより高い優先度の動作に有利なようにコマンドバッファの現在のグラフィックス処理を停止するよう求める、グラフィックス処理システムの別のエンティティ（例えば、中央処理ユニット（ＣＰＵ）上で実行されるアプリケーション）によって行われる要求である。典型的に、そのようなプリエンプション要求は、オペレーティングシステムから発生するだろう。このように、より高い優先度の動作は、その時点でオペレーティングシステムによってより高い優先度であるとみなされる、ＧＰＵ１２によって実行可能な任意の動作であり得る。
【００４４】
[0049]  図４は、例となるプリエンプション要求を例示するブロック図である。図４に示されるように、ＣＰＵ６は、現在のタスクの実行を停止するよう求めるプリエンプション要求をＧＰＵ１２に発し得る。いくつかの例では、プリエンプション要求は、ＧＰＵドライバ７を通してＧＰＵ１２に通信され得る。図４の例では、ＧＰＵ１２によって実行される現在のタスクは、コマンドバッファ６８中のレンダリングコマンドストリームである。コマンドバッファ６８は、三角形プリミティブＡ、Ｂ、およびＣに対する描画コマンドを描写する（depict）。ＣＰＵ６のプリエンプション要求は、現在のタスクを停止し、代わりに、例えば、二次コマンドバッファ７０中に示されるレンダリングコマンドのような、異なるタスクの処理を始めるようＧＰＵ１２に命令する。この場合も同様に、二次コマンドバッファ７０中のコマンドは、三角形プリミティブの異なるセットのための異なる描画コマンドである（例えば、コマンドバッファ６８を通じて現在レンダリングされていた異なるフレームまたはタイルをレンダリングするために）。プリエンプション要求は、レンダリングコマンドストリームに限られず、しかしながら、任意のタイプのコマンドストリーム（レンダリング、汎用計算、または他のもの）に有利なようにＧＰＵ１２によって現在実行されている何らかのコマンドストリームトをプリエンプトするように作られ得ることは留意されるべきである。
【００４５】
[0050]  グラフィックス処理のプリエンプションのための従来の技法は、いわゆる「セーフポイント」の使用に頼る。すなわち、ＧＰＵが、現在の処理をプリエンプトするよう求める要求を受けると、ＧＰＵは、特定のポイント（例えば、コマンドバッファ中の特定のポイント）まで処理し続け、そのポイントで処理の状態に関する情報を保存する。そのような情報は、処理が停止したおよび再開されるべきコマンドバッファ中のポイント、ＧＰＵ処理の出力を受ける任意のバッファのコンテンツ、コマンドのそのポイントで任意のＧＰＵ処理のために入力データとして使用され得る１つまたは複数のバッファのコンテンツを含み得る。
【００４６】
[0051]  セーフポイントを利用する従来のプリエンプションメカニズムは、ハードウェア実装形態およびソフトウェア実装形態の両方を含む。いくつかのソフトウェアソリューションは、セーフポイントがどこに位置するのかを決定するために、ダイレクトメモリアクセスバッファのサイズを使用する。他のソフトウェアソリューションは、どこにセーフポイントを位置させるかを決定するために、描画境界またはビン境界（すなわち、フレームの特定の領域）を使用する。プリエンプションのための他の技法は、ビニング、三角形、または画素レベルで、粒度の細かいプリエンプションに影響を及ぼすための追加のハードウェアサポートを利用し得る。ソフトウェアだけの技法よりも早く動作することを生成するが、そのようなハードウェア技法は、より高い複雑性を必要とする。
【００４７】
[0052]  いずれのケースにおいても、そのような状態情報を保存することで、ＧＰＵは、正確な入力および出力データを用いて既知のポイントで処理を再開することができる。しかしながら、プリエンプション要求を受けた場合に、セーフポイントまで処理し、状態情報を保存することは、不確定の時間量がかかる。プリエンプション要求は、ＧＰＵによって実行されるコマンドバッファ中の非同期ポイントで発生し得、このように、ＧＰＵがセーフポイントに到達するまでにどれだけ動作する必要があり得るかを予測することは可能ではないだろう。いくつかの状況では、プリエンプション要求に応答して、ＧＰＵがセーフポイントに到達し、状態情報を保存し、新しいコマンドバッファの処理を開始するための時間は、望ましくないほど長い可能性がある。いくつかのアプリケーションは、より高い優先度のグラフィックスタスクが迅速に開始され得ない場合、乏しいユーザ経験に帰着し得る。
【００４８】
[0053]  例えば、ユーザインターフェース（ＵＩ）は、プリエンプション要求に対する応答の長い遅延が望ましくないアプリケーションの例である。一般に、任意のアプリケーション、または、ユーザの注意の焦点となるように構成されたアプリケーションの一部は、別の例の低遅延プリエンプション要求によって利益を得得る（例えば、ビデオ、ポップアップテキスト、またはユーザの焦点の中心であるアプリケーションの任意の他の部分のレンダリングに有利なように背景のレンダリングをプリエンプトすること）。別の例となるアプリケーションは拡張現実アプリケーションであり、ここでは、ユーザの視点の動きに基づいてヘッドアップディスプレイ（ＨＵＤ）を適切に配置された状態に保つことが、他のタスクがＧＰＵによって実行されることよりも重要であり得る。
【００４９】
[0054]  これらの欠点に鑑みて、本開示は、任意の制御ポイントでのプリエンプション要求を処理するための技法を提示する。具体的には、本開示の技法は、より高い優先度のタスクを実行するよう求めるプリエンプション要求に応答して、コマンドバッファの部分的な処理の結果が放棄（throw out）され得、そのコマンドバッファが最初から再実行され得るように、元のタスクのためのコマンドバッファを実行するためにＧＰＵによって使用される読取修正書込リソースをダブルバッファすることを含む。このように、プリエンプション要求は、元のタスクの処理を再開するための安定かつ正常な（fault-free）状態（すなわち、正確な入力データを有する状態）を依然として維持しつつ、迅速に処理され得る。本開示の技法は、単独で、または、既存のセーフポイントプリエンプション技法とともに使用され得る。すなわち、本開示の技法は、状況別にまたはアプリケーション単位で適用され得、すべての他のプリエンプション技法には取って代わる必要はない。
【００５０】
[0055]  図５は、本開示のプリエンプション技法を例示する概念図である。図５に示されるように、ＧＰＵ１２は、コマンドバッファ６８中のコマンドストリームを実行するように構成され得る。この場合も同様に、コマンドバッファ６８は、３Ｄグラフィックス、２Ｄグラフィックス、ＧＰＧＰＵシェーダアプリケーションに対するコマンドを含む任意のタイプのコマンド、またはＧＰＵにおいて実行され得る任意の他のタイプのコマンドを含み得る。図５に示されるように、コマンドバッファ６８は、３Ｄグラフィックスレンダリングコマンド（例えば、三角形描画コマンド）を含む。
【００５１】
[0056]  コマンドバッファ内の任意のポイントにおけるコマンドバッファ６８のプリエンプションを許可するために、任意のデータがＧＰＵ１２によって修正される前に、ＧＰＵ１２によって使用される任意の読取修正書込リソースが複写される。図５に示されるように、フレームバッファ７２は、コマンドバッファ６８中のコマンドストリームを実行するための入力データとして使用され得る読取修正書込リソースである。フレームバッファ７２は、フレームバッファ７２の任意のコンテンツがＧＰＵ１２によって修正される前に、フレームバッファ７２の複写（フレームバッファ複写７４）がメモリ（例えば、第１のバッファ）に記憶されるように、ＧＰＵ１２またはＣＰＵ６によって複写される（すなわち、ダブルバッファされる）。フレームバッファ７２の修正済みコンテンツは、第２のバッファと考えられ得る。本開示の技法は、フレームバッファに限定されず、フレームバッファ、レンダターゲット、非順序アクセスビュー（ＵＡＶ）バッファ、サーフェス、等、を含む任意のタイプの読取修正書込リソースによって利用され得る。
【００５２】
[0057]  フレームバッファのコンテキストでは、第１のバッファ（すなわち、フレームバッファ複写７４）は、以前のフレームバッファ（すなわち、コマンドバッファ中のコマンドが実行される前のフレームバッファのコンテンツ）の複写である。第２のバッファ（すなわち、フレームバッファ７２）は、現在レンダリングされたフレームバッファ（すなわち、現在のフレームバッファ）についての修正済みコンテンツを含む。
【００５３】
[0058]  フレームバッファ７２の元のコンテンツの複写を含む、第１のバッファ（すなわち、フレームバッファ複写７４）ならびに第２のバッファ（フレームバッファ７２の修正済みコンテンツを含む）は、別個のメモリユニット、単一のメモリユニットの別個の部分、または、第１のバッファと第２のバッファとが別々にアドレス可能な空間である任意の他の構成のメモリユニットとして構成され得る。
【００５４】
[0059]  このコンテキストでは、ダブルバッファリングが、ピンポンバッファリングと同じではないことが理解されるべきである。ピンポンバッファリングは、２つのメモリバッファ（１つは読取り用で、１つは書込み用）を使用することを伴い得る。本開示のコンテキストでは、ダブルバッファリングは、読取修正書込リソースの複写を、そのリソースを使用するコマンドストリーム全体が完了したことが確認されるまで記憶すること（または、そのようなリソースの一部の複写を記憶すること）を伴う。
【００５５】
[0060]  本開示の一例では、未決のコマンドバッファ６８（または、ＧＰＵ１２によって現在処理されている任意のコマンドストリーム）は、完了について、ＧＰＵ１２によってトラッキングされる。プリエンプション要求（例えば、ＧＰＵドライバ７のような、ＣＰＵ６上で実行されるアプリケーションからの）が、コマンドバッファ６８中のすべてのコマンドが完了する前のあるポイントで発生する場合、ＧＰＵ１２は、そのポイントまでに作られたフレームバッファ７２中のすべての修正済みコンテンツを破棄する。プリエンプション要求の対象であったタスクを完了した後に、ＧＰＵ１２は、元のコマンドバッファ６８に戻り、コマンドストリームの最初から開始する。従来のシステムでは、コマンドストリームにおいて使用される入力データのうちのいくつかが、コマンドストリームの処理を通して上書きされていたであろうことから（例えば、フレームバッファ７２中の修正済みコンテンツ）、これは可能ではなかっただろう。しかしながら、フレームバッファ７２がダブルバッファされているため、ＧＰＵ１２は、プリエンプションの後にコマンドバッファ６８の実行を再開する（reinitiate）際に、フレームバッファ複写７４を入力として使用し得る。次に、フレームバッファ複写７４は、それ自体がダブルバッファされるだろう。
【００５６】
[0061]  本開示の別の例では、コマンドバッファが連続してプリエンプトされる状況を回避するために、さらなる技法が含まれ得る。本開示の技法は、プリエンプトされたコマンドバッファを最初から再開することを含むため、完了までにより長い時間がかかるいくつかのコマンドバッファが１回または複数回プリエンプトされ得ることは理解され得る。所望よりも長い時間の間コマンドバッファがプリエンプトされる状況を回避するために、本開示は、ＧＰＵ１２、ＧＰＵドライバ７、またはＣＰＵ６上で実行される何らかのアプリケーションのいずれかによって実行され、かつ、特定のコマンドバッファがプリエンプトされた回数をカウントするカウンティングメカニズムを含むことをさらに提案する。プリエンプションの回数が何らかの閾値を上回ると、そのコマンドバッファのこれ以上のプリエンプションは許可されない。閾値は、ＧＰＵ１２によって実行されているアプリケーションのタイプによって変動し得る。一般に、複雑な計算ジョブ（例えば、汎用ＧＰＵアプリケーション）は、他のアプリケーションよりも頻繁にプリエンプトされることを予期し得、プリエンプションの回数が制限されている技法から利益を享受し得る。
【００５７】
[0062]  図６は、本開示の一例に係る、方法を例示するフローチャートである。図６の技法は、ＧＰＵ１２および／またはＣＰＵ６を含む、１つまたは複数のプロセッサによって実行され得る。
【００５８】
[0063]  本開示の一例では、ＧＰＵ１２は、例えば、読取修正書込メモリリソース内のデータに作用するコマンドのような、コマンドバッファ中のコマンドを実行するように構成され得る（６００）。ＧＰＵ１２は、読取修正書込メモリリソースの元データを第１のバッファに記憶し（６０２）、コマンドバッファ中のコマンドを実行することで生成された任意の修正済みデータを第２のバッファに記憶する（６０４）ようにさらに構成され得る。本開示の一例では、読取修正書込メモリリソースは、フレームバッファであり、第１のバッファは、以前のフレームのためのフレームバッファの複写であり、第２のバッファは、現在のフレームバッファである。
【００５９】
[0064]  ＧＰＵ１２は、コマンドバッファ中のすべてのコマンドを完了する前に、コマンドバッファ中のコマンドの実行をプリエンプトする（６０６）ようにさらに構成され得る。本開示の一例では、ＧＰＵ１２は、すべてのコマンドが完了したことを決定するために、コマンドバッファ中のコマンドの完了をトラッキングするようにさらに構成され得る。実行をプリエンプトした後に、ＧＰＵ１２は、第１のバッファ中の元データを使用して、コマンドバッファの初めからコマンドの実行を再開する（６０８）ようにさらに構成され得る。
【００６０】
[0065]  本開示の別の例では、ＧＰＵ１２は、コマンドバッファをメモリに記憶し、コマンドバッファ中のコマンドの実行をプリエンプトすることに応答して二次コマンドバッファ中のコマンドを実行するように構成され得る。本開示の一例では、ＧＰＵ１２は、中央処理ユニット上で実行されるソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、コマンドの実行をプリエンプトするように構成される。一例では、ソフトウェアは、グラフィックスドライバを含む。
【００６１】
[0066]  本開示の別の例では、ＧＰＵ１２は、コマンドバッファがプリエンプトされる回数をトラッキングし、コマンドバッファがプリエンプトされる回数が閾値を上回るケースではプリエンプションを拒否し、コマンドバッファがプリエンプトされる回数が閾値を下回るケースではプリエンプションを許可するように構成され得る。
【００６２】
[0067]  １つまたは複数の例では、上述した機能は、ハードウェア、ソフトウェア、ファームウェア、またはこれらの任意の組み合わせで実装され得る。ソフトウェアで実装される場合、これら機能は、非一時的なコンピュータ可読媒体を備える製品（article of manufacture）上に１つまたは複数の命令またはコードとして記憶され得る。コンピュータ可読媒体は、コンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明された技法の実装のための命令、コード、および／またはデータ構造を取り出すために、１つまたは複数のコンピュータあるいは１つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく例として、このようなコンピュータ可読媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたは他の光ディスク記憶装置、磁気ディスク記憶装置または他の磁気記憶デバイス、フラッシュメモリ、あるいは、データ構造または命令の形式で所望のプログラムコードを記憶または搬送するために使用されることができ、かつコンピュータによってアクセスされることができる任意の他の媒体が含まれ得る。本明細書で使用される場合、ディスク（disk）およびディスク（disc）は、コンパクトディスク（ＣＤ）、レーザーディスク（登録商標）、光ディスク、デジタル多用途ディスク（ＤＶＤ）、フロッピー（登録商標）ディスク、およびブルーレイディスクを含み、ここで、ディスク（disk）は通常、磁気的にデータを再生し、ディスク（disc）は、レーザーを用いて光学的にデータを再生する。上記の組み合わせもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
【００６３】
[0068]  コードは、１つまたは複数のＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、あるいは他の等価的な集積回路またはディスクリート論理回路のような１つまたは複数のプロセッサによって実行され得る。加えて、いくつかの態様では、本明細書で説明された機能性は、専用のハードウェアおよび／またはソフトウェアモジュール内に提供され得る。また、本技法は、１つまたは複数の回路または論理素子で十分に実装され得る。
【００６４】
[0069]  本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）、またはＩＣのセット（例えば、チップセット）を含む、幅広い種類のデバイスまたは装置で実装され得る。様々な構成要素、モジュール、またはユニットは、開示された技法を行うように構成されたデバイスの機能的な態様を強調するために、本開示では説明されているが、必ずしも異なるハードウェアユニットによる実現を必要とはしない。むしろ、上述したように、様々なユニットは、コーデックハードウェアユニットへと組み合わせられるか、あるいは、上述した１つまたは複数のプロセッサを含む、相互動作するハードウェアユニットの集合によって、適切なソフトウェアおよび／またはファームウェアと併せて提供され得る。
【００６５】
[0070]  様々な例が説明されている。これらの例および他の例は、以下の特許請求の範囲の範囲内にある。
以下に本願発明の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
グラフィックス処理の方法であって、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用する、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を備える方法。
［Ｃ２］
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
をさらに備える、Ｃ１に記載の方法。
［Ｃ３］
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
をさらに備える、Ｃ１に記載の方法。
［Ｃ４］
中央処理ユニット上で実行されるソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
をさらに備える、Ｃ１に記載の方法。
［Ｃ５］
前記ソフトウェアは、グラフィックスドライバを含む、Ｃ４に記載の方法。
［Ｃ６］
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、Ｃ１に記載の方法。
［Ｃ７］
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
をさらに備える、Ｃ１に記載の方法。
［Ｃ８］
グラフィックス処理のために構成された装置であって、
１つまたは複数のプロセッサ
を備え、前記１つまたは複数のプロセッサは、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用する、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を行うようにさらに構成される、装置。
［Ｃ９］
前記１つまたは複数のプロセッサは、
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
を行うようにさらに構成される、Ｃ８に記載の装置。
［Ｃ１０］
前記１つまたは複数のプロセッサは、
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
を行うようにさらに構成される、Ｃ８に記載の装置。
［Ｃ１１］
前記１つまたは複数のプロセッサは、
中央処理ユニット上で実行されるソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
を行うようにさらに構成される、Ｃ８に記載の装置。
［Ｃ１２］
前記ソフトウェアは、グラフィックスドライバを含む、Ｃ１１に記載の装置。
［Ｃ１３］
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、Ｃ８に記載の装置。
［Ｃ１４］
前記１つまたは複数のプロセッサは、
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
を行うようにさらに構成される、Ｃ８に記載の装置。
［Ｃ１５］
グラフィックス処理のために構成された装置であって、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行するための手段と、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用し、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶するための手段と、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶するための手段と、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトするための手段と、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開するための手段と
を備える装置。
［Ｃ１６］
前記コマンドバッファ中の前記コマンドの完了をトラッキングするための手段
をさらに備える、Ｃ１５に記載の装置。
［Ｃ１７］
前記コマンドバッファをメモリに記憶するための手段と、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行するための手段と
をさらに備える、Ｃ１５に記載の装置。
［Ｃ１８］
中央処理ユニット上で実行するソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトするための手段
をさらに備える、Ｃ１５に記載の装置。
［Ｃ１９］
前記ソフトウェアは、グラフィックスドライバを含む、Ｃ１８に記載の装置。
［Ｃ２０］
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、Ｃ１５に記載の装置。
［Ｃ２１］
前記コマンドバッファがプリエンプトされる回数をトラッキングするための手段と、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否するための手段と、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可するための手段と
をさらに備える、Ｃ１５に記載の装置。
［Ｃ２２］
命令を記憶したコンピュータ可読記憶媒体であって、前記命令は、実行されると、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用し、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を、グラフィックス処理のためのデバイスの１つまたは複数のプロセッサに行わせる、コンピュータ可読記憶媒体。
［Ｃ２３］
前記命令は、
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
を前記１つまたは複数のプロセッサにさらに行わせる、Ｃ２２に記載のコンピュータ可読記憶媒体。
［Ｃ２４］
前記命令は、
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
を前記１つまたは複数のプロセッサにさらに行わせる、Ｃ２２に記載のコンピュータ可読記憶媒体。
［Ｃ２５］
前記命令は、
中央処理ユニット上で実行するソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
を前記１つまたは複数のプロセッサにさらに行わせる、Ｃ２２に記載のコンピュータ可読記憶媒体。
［Ｃ２６］
前記ソフトウェアは、グラフィックスドライバを含む、Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ２７］
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、Ｃ２２に記載のコンピュータ可読記憶媒体。
［Ｃ２８］
前記命令は、
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
を前記１つまたは複数のプロセッサにさらに行わせる、Ｃ２２に記載のコンピュータ可読記憶媒体。
［Ｃ２９］
グラフィックス処理ユニットであって、
グラフィックス処理ユニットのためにコマンドバッファ中のコマンドを実行することと、ここで、前記コマンドは、読取修正書込メモリリソース中のデータに作用し、
前記読取修正書込メモリリソースの元データを第１のバッファに記憶することと、
前記コマンドバッファ中の前記コマンドを実行することによって生成された任意の修正済みデータを第２のバッファに記憶することと、
前記コマンドバッファ中のすべてのコマンドを完了する前に、前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることと、
実行をプリエンプトした後に、前記第１のバッファ中の前記元データを使用して、前記コマンドバッファの初めから前記コマンドの実行を再開することと
を行うように構成されたグラフィックス処理ユニット。
［Ｃ３０］
前記コマンドバッファ中の前記コマンドの完了をトラッキングすること
を行うようにさらに構成される、Ｃ２９に記載のグラフィックス処理ユニット。
［Ｃ３１］
前記コマンドバッファをメモリに記憶することと、
前記コマンドバッファ中の前記コマンドの実行をプリエンプトすることに応答して、二次コマンドバッファ中のコマンドを実行することと
を行うようにさらに構成された、Ｃ２９に記載のグラフィックス処理ユニット。
［Ｃ３２］
中央処理ユニット上で実行するソフトウェアから受ける、実行をプリエンプトするよう求める要求に応答して、前記コマンドの前記実行をプリエンプトすること
を行うようにさらに構成された、Ｃ２９に記載のグラフィックス処理ユニット。
［Ｃ３３］
前記ソフトウェアは、グラフィックスドライバを含む、Ｃ３２にグラフィックス処理ユニット。
［Ｃ３４］
前記読取修正書込メモリリソースは、フレームバッファであり、前記第１のバッファは、以前のフレームのための前記フレームバッファの複写であり、前記第２のバッファは、現在のフレームバッファである、Ｃ２９に記載のグラフィックス処理ユニット。
［Ｃ３５］
前記コマンドバッファがプリエンプトされる回数をトラッキングすることと、
前記コマンドバッファがプリエンプトされる前記回数が閾値を上回るケースにおいて、プリエンプションを拒否することと、
前記コマンドバッファがプリエンプトされる前記回数が前記閾値を下回るケースにおいて、プリエンプションを許可することと
を行うようにさらに構成された、Ｃ２９に記載のグラフィックス処理ユニット。
【要約】  本開示は、制御処理での任意の制御ポイントでのプリエンプションのための技法および構造を提示する。グラフィックス処理の方法は、コマンドバッファ中のコマンドを実行することと、ここで、コマンドは、読取修正書込メモリリソース中のデータに作用する、第１のバッファが読取修正書込メモリリソースの元データを記憶し、第２のバッファが、コマンドバッファ中のコマンドを実行することによって生成される任意の修正済みデータを記憶するように、読取修正書込メモリリソース中のデータをダブルバッファすることと、コマンドバッファ中のすべてのコマンドを完了する前にコマンドバッファ中のコマンドの実行をプリエンプトするよう求める要求を受けることと、第１のバッファ中の元データを使用してコマンドバッファの初めからコマンドの実行を再開することとを備え得る。
【選択図】  図５【図１】
0006001221.tif 000002
【図２】
0006001221.tif 000003
【図３】
0006001221.tif 000004
【図４】
0006001221.tif 000005
【図５】
0006001221.tif 000006
【図６】
0006001221.tif 000007