(57)【要約】  グラフィックス処理システムにおいてクエリを実行するためのシステム、方法、および装置が開示される。これらのシステム、方法、および装置は、開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、ランニングカウンタは、ディスクリート・グラフィカル・エンティティをカウントし、終了値を決定するために、クエリの終了時にランニングカウンタを読み取ることと、および結果を決定するために終了値から開始値を差し引くことと、を行うように構成され得る。
2016520909.tif 000002
【特許請求の範囲】
【請求項１】
グラフィックス処理システムにおいてクエリを実行する方法であって、前記方法は、
開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
を備える、方法。
【請求項２】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項１に記載の方法。
【請求項３】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項１に記載の方法。
【請求項４】
前記開始値は第１のメモリロケーションに記憶され、前記終了値は第２のメモリロケーションに記憶され、前記結果は第３のメモリロケーションに記憶される、請求項１に記載の方法。
【請求項５】
前記開始値は第１のメモリロケーションに記憶され、前記終了値は第２のメモリロケーションに記憶され、および前記結果は前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きされる、請求項１に記載の方法。
【請求項６】
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
によって、前記第２のクエリをネスティングすることをさらに備える、請求項１に記載の方法。
【請求項７】
第３のネスティングされたクエリを実行することをさらに備える、請求項６に記載の方法。
【請求項８】
前記クエリは、オクルージョンクエリを備える、請求項１に記載の方法。
【請求項９】
前記クエリは、タイムスタンプクエリを備える、請求項１に記載の方法。
【請求項１０】
前記クエリは、パイプラインステータスクエリを備える、請求項１に記載の方法。
【請求項１１】
開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
を行うように構成された１つ又は複数のプロセッサを備える、ビデオデータをコード化するための装置。
【請求項１２】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項１１に記載の装置。
【請求項１３】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項１１に記載の装置。
【請求項１４】
前記１つまたは複数のプロセッサは、前記開始値を第１のメモリロケーションに記憶し、前記終了値を第２のメモリロケーションに記憶し、および前記結果を第３のメモリロケーションに記憶するようにさらに構成される、請求項１１に記載の装置。
【請求項１５】
前記１つまたは複数のプロセッサは、前記開始値を第１のメモリロケーションに記憶し、前記終了値を第２のメモリロケーションに記憶し、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きするようにさらに構成される、請求項１１に記載の装置。
【請求項１６】
前記１つ又は複数のプロセッサは、
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
を行うようにさらに構成される、請求項１１に記載の装置。
【請求項１７】
前記１つ又は複数のプロセッサは、第３のネスティングされたクエリを実行するようにさらに構成される、請求項１６に記載の装置。
【請求項１８】
前記クエリは、オクルージョンクエリを備える、請求項１１に記載の装置。
【請求項１９】
前記クエリは、タイムスタンプクエリを備える、請求項１１に記載の装置。
【請求項２０】
前記クエリは、パイプラインステータスクエリを備える、請求項１１に記載の装置。
【請求項２１】
開始値を決定するために、クエリの開始時にランニングカウンタを読み取るための手段と、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取るための手段と、
結果を決定するために、前記終了値から前記開始値を差し引くための手段と、
を備える、ビデオデータをコード化するための装置。
【請求項２２】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項２１に記載の装置。
【請求項２３】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項２１に記載の装置。
【請求項２４】
前記開始値を第１のメモリロケーションに記憶するための手段と、前記終了値を第２のメモリロケーションに記憶するための手段と、および前記結果を第３のメモリロケーションに記憶するための手段と、をさらに備える、請求項２１に記載の装置。
【請求項２５】
前記開始値を第１のメモリロケーションに記憶するための手段と、前記終了値を第２のメモリロケーションに記憶するための手段と、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きするための手段と、をさらに備える、請求項２１に記載の装置。
【請求項２６】
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取るための手段と、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取るための手段と、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くための手段と、
によって、前記第２のクエリをネスティングすることをさらに備える、請求項２１に記載の装置。
【請求項２７】
命令を記憶したコンピュータ可読記憶媒体であって、実行されると、デバイスの１つ又は複数のプロセッサに、
開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
を行わせる、コンピュータ可読記憶媒体。
【請求項２８】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項２９】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３０】
前記命令は、実行されると、前記デバイスの前記１つ又は複数のプロセッサに、前記開始値を第１のメモリロケーションに記憶することと、前記終了値を第２のメモリロケーションに記憶することと、および前記結果を第３のメモリロケーションに記憶することと、を行わせる、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３１】
前記命令は、実行されると、前記デバイスの前記１つ又は複数のプロセッサに、前記開始値を第１のメモリロケーションに記憶することと、前記終了値を第２のメモリロケーションに記憶することと、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きすることと、を行わせる請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３２】
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
によって、前記第２のクエリをネスティングするための命令をさらに備える、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３３】
前記クエリは、オクルージョンクエリを備える、請求項２７に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本願は、２０１３年４月２９日に出願された米国仮出願６１／８１７，１５４の利益を主張し、その全体の内容が参照によりここに組み込まれる。
【０００２】
[0002]本開示は、グラフィックス処理システムに関し、さらに具体的には、タイルベースレンダラ（tile based renderers）に関するクエリ処理に関する。
【背景技術】
【０００３】
[0003]コンピューティングデバイスは、多くの場合、ディスプレイのためのグラフィックスデータのレンダリングを促進するために、グラフィックス処理ユニット（ＧＰＵ）を利用する。こういったコンピューティングデバイスは、例えば、コンピュータワークステーション、モバイルフォン（例えば、いわゆるスマートフォン）、埋め込み式システム、パーソナルコンピュータ、タブレットコンピュータ、およびビデオゲームコンソールを含み得る。レンダリングとは、一般的に、１つまたは複数の３Ｄグラフィックスオブジェクトを含み得る３次元（３Ｄ）グラフィックスシーンを２次元（２Ｄ）のラスタライズされた（rasterized）画像データに変換するプロセスを指す。グラフィックスシーンは、所定の時間内に各フレームが特定のインスタンスにおいてグラフィックスシーンを描写する１つまたは複数のフレームのシーケンスとしてレンダリングされ得る。
【０００４】
[0004]ＧＰＵは、３Ｄグラフィックスシーンのレンダリングのために、少なくとも部分的にハードウェアの加速をもたらすために、３Ｄレンダリングパイプラインを含み得る。シーン内の３Ｄグラフィックスオブジェクトは、グラフィックスアプリケーションによって１つまたは複数の３Ｄグラフィックスプリミティブ（例えば、点、線、三角形、パッチ、など）に細分化され得、ＧＰＵは、シーンの３Ｄグラフィックスプリミティブをレンダリングされるべき各フレームに関する２Ｄのラスタライズされた画像データに変換し得る。したがって、ＧＰＵレンダリングの特定のコンテキストにおいて、レンダリングとは、グラフィックスシーン内の３Ｄオブジェクトに対応する３Ｄグラフィックスプリミティブを２Ｄのラスタライズされた画像データに変換するプロセスを指し得る。
【０００５】
[0005]特定のフレームに関する３Ｄグラフィックスプリミティブをレンダリングするために、ホスト中央処理装置（ＣＰＵ）で実行するグラフィックスアプリケーションは、レンダリングされるべきプリミティブに対応する幾何学データをＧＰＵがアクセス可能なメモリ内に配置し（place）、１つまたは複数のＧＰＵの状態設定コマンド(GPU state set-up commands)をコマンドストリーム内に配置し、および１つまたは複数のドローコール（draw calls）を幾何学データに基づいて、ＧＰＵにプリミティブをレンダリングさせるコマンドストリーム内に配置し得る。ＧＰＵは、コマンドストリーム内に配置された順序で、コマンドストリームに含まれるコマンドを処理し得、それによってシーンをレンダリングする。
【０００６】
[0006]タイルベースレンダリングによって、クエリの結果が、ＧＰＵによってタイル基準毎に出力され、その後ＣＰＵによって蓄積される。クエリの結果は、例えば、オクルージョンクエリ、タイムスタンプクエリ、パイプラインステータスクエリ（パイプラインの状態）などからの結果を含み得る。オクルージョンクエリ（an occlusion query）は、レンダリングされるべきオブジェクトが、グラフィカルシーン（またはタイル）において、他のオブジェクトによってオクルードされるか否かを決定するグラフィックス処理におけるクエリである。したがって、こうしたクエリに起因するクエリの結果は、レンダリングされるべきオブジェクトが、グラフィカルシーン（またはタイル）において、他のオブジェクトによってオクルードされるか否かの指示を与えるデータである。
【０００７】
[0007]いくつかの例において、タイムスタンプは、特定のイベントがいつ発生するのかを特定する特性または符号化された情報のシーケンスである。タイムスタンプは、例えば、イベントが発生した日付と時間を提供し得る。タイムスタンプは、わずか秒単位まで正確であり得る。タイムスタンプクエリは、例えば、こういったクエリの開始から終了までのタイムスタンプを比較することによって、グラフィカルシーン内の特定のイベントのタイミングをチェックするために用いられ得る。したがって、こういったクエリに起因するクエリの結果は、こういったクエリの開始から終了までのタイムスタンプの差であり得る。
【０００８】
[0008]パイプラインステータスクエリまたはパイプラインの状態クエリは、グラフィックスパイプラインの様々な統計情報およびステータス情報をチェックするために使用され得る。したがって、こういったクエリに起因するクエリの結果は、グラフィックスパイプラインの様々な統計情報およびステータス情報に関連するデータであり得る。
【０００９】
[0009]このタイル毎の中間結果を記憶するのに必要なメモリ量は、タイルの数の増加と共に直線的に増加する。さらに、クエリの結果が要求されると、ＣＰＵまたは他のプロセッサは、その結果を最後の値に達するまでｎ個のメモリロケーションに蓄積することが必要とされ得、そこで、「ｎ」は、シーンをレンダリングするために使用されるタイルの数である。タイルの数の増加は、蓄積を行うためにＣＰＵによって費やされる時間量をも増大させる。こういったクエリを実行するためのより多くのメモリと時間効率の良い方法が有益であり得る。
【図面の簡単な説明】
【００１０】
【図１】[0010]図１は、本開示の技術を実施するために使用され得るコンピューティングデバイスの例を示すブロック図である。
【図２】[0011]図２は、図１に示されたコンピューティングデバイスのＣＰＵ、ＧＰＵ、およびメモリをさらに詳細に示すブロック図である。
【図３】[0012]図３は、タイルベースレンダリングを示す概念図である。
【図４】[0013]図４は、オクルージョンクエリの例を示す概念図である。
【図５】[0014]図５は、メモリマップの例を示す概念図である。
【図６】[0015]図６は、本開示にしたがったメモリマップの例を示す概念図である。
【図７】[0016]図７は、本開示の技術にしたがったオクルージョンクエリの例を示す概念図である。
【図８】[0017]図８は、本開示の１つ又は複数の態様を実施する方法例を示すフロー図である。
【詳細な説明】
【００１１】
[0018]本開示は、グラフィックス処理システムに関し、さらに具体的には、タイルベースレンダラに関するクエリ処理に関する。タイルベースレンダリングは、レンダリングされるべきフレームまたは他の領域が複数のタイル（例えば、長方形または正方形の領域）に分割され、および各タイルが別個にレンダリングされることによる処理技術である。タイルベースレンダリングは、シーンにおいてローカル空間コヒーレンスを利用するか、後にグラフィックスパイプラインにおいて有限のハードウェアレンダリングリソース（例えば、高速グラフィックスメモリ）の使用を容易にするか、またはその両方に用いられ得る。一般的に、タイルベースレンダリングにおいて、例えばコンピュータグラフィックスデバイスのようなデバイス、装置またはシステムは、フレームを、例えば正規グリッド（a regular grid）に分割し得る。グリッドは複数のタイルを形成し、それらはフレームまたは他の領域の一部である。各タイルは、他のタイルと同じレンダリングコマンドストリームを使用してレンダリングされ得る。
【００１２】
[0019]いくつかの例において、ビニング（binning）またはタイルベースレンダリングは、３Ｄシーンを「タイル」または「ビン」と呼ばれるより小さい部分にレンダリングするための方法を提供し得る。上述したとおり、タイルベースレンダリングは、シーンにおいてローカル空間コヒーレンスを利用するか、後にグラフィックスパイプラインにおいて有限のハードウェアレンダリングリソースの使用を容易にするか、またはその両方に用いられ得る。一般的に、タイルベースレンダリングにおいて、例えばコンピュータグラフィックスデバイスのようなデバイス、装置またはシステムは、フレームを、例えば正規グリッドに分割し得る。グリッドは複数のタイル形成し、それらはフレームまたは他の領域の一部である。一例において、各タイルまたはビンは、同じレンダリングコマンドストリームを用いてレンダリングされ得る。
【００１３】
[0020]例示の目的のために、オクルージョンクエリが論じられるが、本開示のこれらの技術は、他のタイプのクエリにも同様に適用され得ることが理解されるだろう。上述したとおり、いくつかの例において、オクルージョンクエリは、レンダリングされるべきオブジェクトがグラフィカルシーン（またはタイル）において、他のオブジェクトによってオクルードされるか否かを決定するグラフィックス処理におけるクエリである。例えば、ＧＰＵからの異なるタイプの情報をクエリするように設計された様々なタイプのクエリが可能である。例は、オクルージョンクエリ、タイムスタンプクエリ、パイプラインステータスクエリ（パイプラインの状態）などを含む。いくつかの例において、タイムスタンプは、特定のイベントがいつ発生するのかを特定する特性または符号化された情報のシーケンスである。タイムスタンプは、例えば、イベントが発生した日付と時間を提供し得る。タイムスタンプは、わずか秒単位まで正確であり得る。タイムスタンプクエリは、例えば、こういったクエリの開始から終了までのタイムスタンプを比較することによって、グラフィカルシーン内の特定のイベントのタイミングをチェックするために用いられ得る。パイプラインステータスクエリまたはパイプラインの状態クエリは、グラフィックスパイプラインの様々な統計情報およびステータス情報をチェックするために使用され得る。本開示の技術は、タイムスタンプクエリ、パイプラインステータスクエリ（パイプラインの状態）、および他のタイプのクエリにも適用され得る。
【００１４】
[0021]上述したとおり、グラフィックス処理システムは、例えば、レンダリングされるべきオブジェクトがグラフィカルシーン（またはタイル）内の他のオブジェクトによってオクルードされるか否かを決定するために、オクルージョンクエリを使用し得る。換言すると、グラフィックス処理システムは、レンダリングされるべきオブジェクトが、グラフィカルシーン（またはタイル）において、目に見えないように他のオブジェクトによってブロックされているか、またはレンダリングされるべきオブジェクトが、グラフィカルシーン（またはタイル）において、目に見えるように他のオブジェクトによってブロックされていないかを決定するためにオクルージョンクエリを使用し得る。いくつかの例において、オブジェクトは、ブロックされていいても良いし、部分的にブロックされていても良いし、または目に見えても良い。グラフィックスプロセッサは、より効率的にレンダリングを行うためにこの情報を使用し得る。例えば、オクルードされた、すなわち見えないようにブロックされたオブジェクトをレンダリングしないことによって、処理リソースが保持され得、より効率的にタイルのレンダリングを行う。オクルードされていないオブジェクトはレンダリングされ得る。いくつかの例において、部分的にオクルードされているオブジェクトはレンダリングされ得る。他の例において、部分的にオクルードされているオブジェクトはレンダリングされ得ない。部分的にオクルードされているオブジェクトは、部分的にレンダリングされるか、またはより小さいオブジェクトにされ（broken into）、再度検査され得る。しかし、いくつかの点で、処理リソースを使用するという観点から、さらにオクルージョンクエリを実行してより多くの処理リソースを費やすよりもむしろ、オブジェクトまたはオブジェクトの目に見える部分を単にレンダリングするほうが一般的により有益であることが理解されるであろう。オクルードされたオブジェクトのレンダリングは、例えば、どれくらいのオブジェクトがオクルードされるかに依存し得る。
【００１５】
[0022]グラフィックス処理は、表示またはレンダリングされるべきフレームのような出力を表すプリミティブ（多角形、例えば三角形）のセットを定義することによって実行され得る。レンダリング出力の各プリミティブは通常、頂点のセットとして定義および表され、各頂点は、頂点に関するデータ値のセットと関連付けられる。
【００１６】
[0023]出力に関するプリミティブは次に、レンダリングされた出力を生成するためにさらに処理され得る複数のディスクリート・グラフィカル・エンティティを生成するためにラスタライズされ得る。これらのディスクリート・グラフィカル・エンティティはピクセルであっても良い。しかし、ディスクリート・グラフィカル・エンティティは、レンダリング出力における単一ピクセルに常に正確に対応しているわけではない。これは、例えばダウンスケーリングが原因である。
【００１７】
[0024]オクルージョンクエリは典型的に、既定のオブジェクトまたは目に見えるオブジェクトに関するディスクリート・グラフィカル・エンティティ、例えばピクセル、サンプルなどの数をカウントし、オブジェクトまたはディスクリート・グラフィカル・エンティティから形成されたオブジェクトが目に見えるか、オブジェクトの一部またはオブジェクトが目に見えるか、またはその両方かを決定するためにそのカウントを用いる。種々のメカニズムが、ピクセルまたはサンプルのようなグラフィカルエンティティがいくつラスタライズされたかを決定することを可能にする。
【００１８】
[0025]典型的なオクルージョンクエリシーケンスは、（１）オクルージョンクエリの開始、（２）１つまたは複数のオブジェクトの描画、（３）オクルージョンクエリの終了、および（４）いくつのサンプルがレンダリングされたかの結果の取得、を含み得る。オクルージョンクエリのようなクエリにおけるタイル毎の中間結果を記憶するのに必要なメモリ量は、タイルの数の増加と共に直線的に増加し得る。例えば最後のクエリの結果が要求されるとき、タイルの数の増加は、蓄積を行うためにＣＰＵによって費やされる時間量をも増大させる。一例において、こういったクエリを実行するのによりメモリ効率の良い方法は、クエリの開始時に開始値を決定するためにランニングカウンタを読み取り得、そこにおいて、ランニングカウンタは、レンダリングされるサンプルをカウントし、クエリの終了時に終了値を決定するためにランニングカウンタを読み取り、結果を決定するために終了値から開始値を差し引き、および同じ開始カウンタと終了カウンタのメモリロケーションを再利用してビン／タイル毎にこの動作を実行する。これらの例は、タイルベースレンダラに関するオクルージョンクエリ処理に関してここで論じられる。しかし、他の例において、例えばタイムスタンプクエリ、パイプラインステータスクエリ（パイプラインの状態）および他のタイプのクエリのような他のタイプのクエリがこれらの技術を用いて処理され得ることが理解される。
【００１９】
[0026]図１は、本開示のクエリ処理技術を実施するために使用され得るコンピューティングデバイス２の例を示すブロック図である。コンピューティングデバイス２は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームまたはコンソール、無線通信デバイス（例えば、モバイル電話、セルラー電話、衛星電話、および／またはモバイル電話ハンドセットなどのような）、有線電話、インターネット電話、携帯ビデオゲームデバイスまたは個人情報端末（ＰＤＡ）といったハンドヘルドデバイス、パーソナル音楽プレイヤ、映像プレイヤ、表示デバイス、テレビジョン、テレビジョン・セットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および／または表示する任意の他のタイプのデバイスを備え得る。
【００２０】
[0027]いくつかの例において、例えば、コンピューティングデバイス２がパーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームまたはコンソールを備える場合、例えば、コンピューティングデバイスは、例えば、映像ディスプレイ上に表示するための映像データを処理するときに、タイルベースレンダラに関するクエリ処理を行い得る。
【００２１】
[0028]コンピューティングデバイス２が無線通信デバイスまたは他の同様のデバイスである場合、コンピューティングデバイス２は、音声通信データ、映像データ、テキストメッセージ、データファイル、およびデータのビットストリームとして送信または受信され得るデータの他の形式のようなデータの１つまたは複数のビットストリームをコード化し得る。ビットストリームは、時系列またはビットのシーケンスであり得る。同様に、バイトストリームとは、例えば一連のバイトであり得、それぞれが例えば８ビットである。ここで用いられたように、ビットストリームは、バイトストリームを含み得る。例えば、バイトストリームは、ビットストリームの特別なケースと見なされ得る。（バイトストリームはビットストリームであり、そこで、データのビットは、いわゆるバイトと呼ばれる単位にグループ分けされる。）
【００２２】
[0029]コンピューティングデバイス２は、例えば、映像データのビットストリームを受信し、例えば、映像ディスプレイ上でレンダリングするために、例えばそのようなビットストリームを処理する場合、タイルベースレンダラに関するクエリ処理を行い得る。
【００２３】
[0030]図１の例に示されたとおり、コンピューティングデバイス２は、ユーザインターフェース４、中央処理装置（ＣＰＵ）６、メモリコントローラ８、メモリ１０、グラフィックス処理ユニット（ＧＰＵ）１２、ディスプレイインターフェース１４、ディスプレイ１６、およびバス１８を含む。ユーザインターフェース４、ＣＰＵ６、メモリコントローラ８、ＧＰＵ１２、およびディスプレイインターフェース１４は、バス１８を使用して相互に通信を行い得る。図１に示された異なる構成要素の間のバスと通信インターフェースの特定の構成は、単なる例であり、同じまたは異なる構成要素を有するコンピューティングデバイスおよび／または他のグラフィックス処理システムの他の構成が本開示の技術を実施するために用いられ得ることが留意されるべきである。
【００２４】
[0031]いくつかの例において、コンピューティングデバイス２におけるプロセッサ、例えば、ＣＰＵ６、ＧＰＵ１２、または他の処理回路は、コンピューティングデバイス２上のグラフィックス処理の一部としてクエリを実行し得る。例えば、プロセッサは、開始値を決定するために、クエリの開始時にランニングカウンタを読み取り得る。ランニングカウンタは、ピクセル、サンプル、多角形などのディスクリート・グラフィカル・エンティティをカウントし得る。プロセッサは、終了値を決定するために、クエリの終了時にランニングカウンタを読み取り得る。プロセッサはまた、結果を決定するために、終了値から開始値を差し引き得る。
【００２５】
[0032]ＣＰＵ６は、コンピューティングデバイス２の動作を制御する汎用目的プロセッサまたは特別目的プロセッサを備え得る。ユーザは、ＣＰＵ６に１つまたは複数のソフトウェアアプリケーションを実行させるためにコンピューティングデバイス２に入力を提供し得る。ＣＰＵ６で実行するソフトウェアアプリケーションは、例えば、グラフィックスアプリケーション、ワードプロセッサアプリケーション、Ｅメールアプリケーション、スプレッドシートアプリケーション、メディアプレイヤアプリケーション、ビデオゲームアプリケーション、グラフィカル・ユーザ・インターフェースアプリケーション、オペレーティングシステム、または任意の他のタイプのプログラムを含み得る。ユーザは、１つまたは複数の入力デバイス（不図示）、例えばキーボード、マウス、マイクロフォン、タッチ・パッドまたはユーザインターフェース４を介してコンピューティングデバイス２に結合される別の入力デバイスを介して、コンピューティングデバイス２に入力を提供し得る。
【００２６】
[0033]ＣＰＵ６で実行するソフトウェアアプリケーションは、ディスプレイ１６上に表示するためにグラフィックスデータをフレームバッファにレンダリングするようＧＰＵ１２に指示する１つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例において、グラフィックスレンダリング命令は、例えば、オープン・グラフィクス・ライブラリ（ＯｐｅｎＧＬ（登録商標））ＡＰＩ、オープン・グラフィクス・ライブラリ組み込みシステム（ＯｐｅｎＧＬ  ＥＳ）ＡＰＩ、Ｄｉｒｅｃｔ３Ｄ  ＡＰＩ、Ｘ３Ｄ  ＡＰＩ、ＲｅｎｄｅｒＭａｎ  ＡＰＩ、ＷｅｂＧＬ  ＡＰＩまたは任意の他の公にまたは専有的に定めた標準グラフィックスＡＰＩのようなグラフィックス・アプリケーション・プログラミング・インターフェース（ＡＰＩ）に準拠し得る。グラフィックスレンダリング命令を処理するために、ＣＰＵ６は、ＧＰＵ１２にグラフィックスデータのレンダリングのうちのいくつかまたは全てを実行させるために、ＧＰＵ１２に１つまたは複数のグラフィックスレンダリングコマンドを発行し得る。いくつかの例において、レンダリングされるべきグラフィックスデータは、例えば、点、線、三角形、四辺形、トライアングルストリップなどのグラフィックスプリミティブから成るリストを含み得る。
【００２７】
[0034]いくつかの例において、ＣＰＵ６は、開始値を決定するためにクエリの開始時にディスクリート・グラフィカル・エンティティをカウントし得るランニングカウンタをＣＰＵ６に読み取らせるソフトウェアを実行し得る。ＣＰＵ６は、終了値を決定するためにクエリの終了時にランニングカウンタを読み取り、および結果を決定するために終了値から開始値を差し引き得る。いくつかの例において、ディスクリート・グラフィカル・エンティティはピクセルであり得る。いくつかの他の例において、ディスクリート・グラフィカル・エンティティは多角形であり得る。
【００２８】
[0035]メモリコントローラ８は、メモリ１０へ入出力されるデータの転送を容易にする。例えば、メモリコントローラ８は、メモリの読み取りおよび書き込みコマンドを受信し、およびコンピューティングデバイス２内の構成要素のためにメモリサービスを提供するために、メモリ１０に対してこういったコマンドをサービスし得る。メモリコントローラ８はメモリ１０に通信可能に結合される。メモリコントローラ８は、図１のコンピューティングデバイス２の例において、ＣＰＵ６とメモリ１０の両方とは切り離された処理モジュールとして示されているが、他の例において、メモリコントローラ８の機能のいくつかまたは全ては、ＣＰＵ６とメモリ１０のうちの一方または両方で実施され得る。
【００２９】
[0036]メモリ１０は、ＣＰＵ６による実行のためにアクセス可能なプログラムモジュールおよび／または命令、および／またはＣＰＵ６で実行するプログラムによって使用するためのデータを記憶し得る。例えば、メモリ１０は、ＣＰＵ６で実行するアプリケーションに関連付けられるプログラムコードとグラフィックスデータを記憶し得る。メモリ１０は、コンピューティングデバイス２の他の構成要素によって使用および／または生成された情報をさらに記憶し得る。例えば、メモリ１０は、ＧＰＵ１２のためのデバイスメモリとして機能し得、およびＧＰＵ１２によって実行された動作の結果生じたデータと同じくＧＰＵ１２によって操作されるべきデータを記憶し得る。例えば、メモリ１０は、テクスチャバッファ、深さバッファ、ステンシルバッファ、頂点バッファ、フレームバッファ、レンダリングターゲット、などの任意の組合せを記憶し得る。さらに、メモリ１０は、ＧＰＵ１２による処理のためにコマンドストリームを記憶し得る。メモリ１０は、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、読取専用メモリ（ＲＯＭ）、消去可能なプログラム可能なＲＯＭ（ＥＰＲＯＭ）、電気的に消去可能なプログラム可能なＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体、または光学ストレージ媒体のような１つまたは複数の揮発性または不揮発性メモリまたはストレージデバイスを含み得る。
【００３０】
[0037]ＧＰＵ１２は、ＣＰＵ６によってＧＰＵ１２に発行されるコマンドを実行するように構成され得る。ＧＰＵ１２によって実行されるコマンドは、グラフィックスコマンド、ドローコールコマンド、ＧＰＵ１２の状態プログラミングコマンド(state programming commands)、タイムスタンプリクエスト、メモリ転送コマンド、汎用目的コンピューティングコマンド、カーネル実行コマンド、などを含み得る。
【００３１】
[0038]いくつかの例において、ＧＰＵ１２は、１つまたは複数のグラフィックスプリミティブをディスプレイ１６にレンダリングするために、グラフィックスオペレーションを実行するように構成され得る。こういった例において、ＣＰＵ６で実行するソフトウェアアプリケーションのうちの１つがグラフィックス処理を要求する場合、ＣＰＵ６は、ディスプレイ１６にレンダリングするためにＧＰＵ１２にグラフィックスデータを提供し、およびＧＰＵ１２に１つまたは複数のグラフィックスコマンドを発行し得る。グラフィックスコマンドは、例えば、ドローコールコマンド、ＧＰＵ１２の状態プログラミングコマンド、メモリ転送コマンド、ブリッティング(blitting)コマンド、などを含み得る。グラフィックスデータは、頂点バッファ、テクスチャデータ、表面データ、などを含み得る。いくつかの例において、ＣＰＵ６は、コマンドとグラフィックスデータをメモリ１０に書き込むことによって、ＧＰＵ１２にコマンドおよびグラフィックスデータを提供し得、それらは、ＧＰＵ１２によってアクセスされ得る。
【００３２】
[0039]いくつかの例において、ＣＰＵ６ではなくＧＰＵ１２が、開始値を決定するためにクエリの開始時にディスクリート・グラフィカル・エンティティをカウントし得るランニングカウンタをＧＰＵ１２に読み取らせるソフトウェアを実行し得る。ＧＰＵ１２は、終了値を決定するためにクエリの終了時にランニングカウンタを読み取り、結果を決定するために終了値から開始値を差し引き得る。別の例において、クエリの結果は、ＧＰＵ１２によってタイル毎に出力され、のちにＣＰＵ６によって蓄積され得る。
【００３３】
[0040]さらなる例において、ＧＰＵ１２は、ＣＰＵ６で実行するアプリケーションのための汎用目的の計算を行うように構成され得る。こういった例において、ＣＰＵ６で実行するソフトウェアアプリケーションのうちの１つは、ＧＰＵ１２にコンピュータによるタスクをオフロードすることを決定する時、ＣＰＵ６は、ＧＰＵ１２に汎用目的の計算データを提供し、ＧＰＵ１２に１つまたは複数の汎用目的の計算コマンドを発行し得る。汎用目的の計算コマンドは、例えば、カーネル実行コマンド、メモリ転送コマンドなどを含み得る。いくつかの例において、ＣＰＵ６は、メモリ１０にコマンドとグラフィックスデータを書き込むことによって、ＧＰＵ１２にコマンドと汎用目的の計算データを提供し得、それらはＧＰＵ１２によってアクセスされ得る。
【００３４】
[0041]ＧＰＵ１２は、いくつかの例において、ＣＰＵ６より効率の良いベクトルオペレーションの処理を提供する高並列（highly-parallel）構造で構築され得る。例えば、ＧＰＵ１２は、並行方向に（in a parallel manner）、複数の頂点、制御点、ピクセル、および／または他のデータで動作するように構成された複数の処理要素を含み得る。ＧＰＵ１２の高並列特性は、いくつかの例において、ＧＰＵ１２に、ＣＰＵ６を用いて画像をレンダリングよりずっと早くディスプレイ１６上にグラフィックス画像（例えば、ＧＵＩおよび２次元（２Ｄ）および／または３次元（３Ｄ）グラフィックスシーン）をレンダリングすることを可能にし得る。さらに、ＧＰＵ１２の高並列特性は、ＧＰＵ１２にＣＰＵ６よりもずっと高速に、汎用目的コンピューティングアプリケーションのための特定のタイプのベクトルおよびマトリックスオペレーションを処理することを可能にし得る。
【００３５】
[0042]ＧＰＵ１２は、いくつかの例において、コンピューティングデバイス２のマザーボードに統合され得る。他の例において、ＧＰＵ１２は、コンピューティングデバイス２のマザーボード内のポートにインストールされたグラフィックスカード上に存在するか、さもなければ、コンピューティングデバイス２と相互に動作されるように構成された周辺機器内に組み込まれ得る。さらなる例において、ＧＰＵ１２は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され（be located）得る。ＧＰＵ１２は、１つまたは複数のマイクロプロセッサ、アプリケーション特定用途向け集積回路（ＡＳＩＣ）、フィールド・プログラム可能な・ゲート・アレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）、または他の等価の集積またはディスクリート論理回路のような１つまたは複数のプロセッサを含み得る。
【００３６】
[0043]いくつかの例において、ＧＰＵ１２は、メモリ１０の全てまたは一部にキャッシングサービスを提供し得るＧＰＵキャッシュを含み得る。こういった例において、ＧＰＵ１２は、オフチップメモリの代わりに、ローカルストレージを用いて、データをローカルに処理するためにキャッシュを使用し得る。これによって、それぞれ読み取りおよび書き込みコマンドの間にひどいバストラフィックを経験し得るバス１８を介して、ＧＰＵ１２がメモリ１０にアクセスする必要性を減らすことによって、より効率的な方法で動作することをＧＰＵ１２に可能にし得る。しかし、いくつかの例において、ＧＰＵ１２は別個のキャッシュを含み得ないが、代わりにバス１８を経由するメモリ１０を利用する。ＧＰＵキャッシュは、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）などの１つまたは複数の揮発性または不揮発性メモリまたはストレージデバイスを含み得る。
【００３７】
[0044]ＣＰＵ６、ＧＰＵ１２、またはその両方は、メモリ１０内に配置されたフレームバッファにラスタライズされた画像データを記憶し得る。ディスプレイインターフェース１４は、フレームバッファからデータを検出し、およびラスタライズされた画像データによって表された画像を表示するために、ディスプレイ１６を構成し得る。いくつかの例において、ディスプレイインターフェース１４は、フレームバッファから検出されたデジタル値をディスプレイ１６によって消費可能なアナログ信号に変換するように構成されたデジタル／アナログコンバータ（ＤＡＣ）を含み得る。他の例において、ディスプレイインターフェース１４は、ディスプレイ１６に処理を行うためのデジタル値を直接渡し得る。
【００３８】
[0045]ディスプレイ１６は、モニタ、テレビジョン、プロジェクションデバイス、液晶ディスプレイ（ＬＣＤ）、プラズマ・ディスプレイ・パネル、発光ダイオード（ＬＥＤ）アレイ、カソードレイチューブ（ＣＲＴ）ディスプレイ、電子ペーパー、表面伝導電子放出ディスプレイ（ＳＥＤ）、レーザー・テレビジョン・ディスプレイ、ナノクリスタルディスプレイまたは別のタイプのディスプレイユニットを含み得る。ディスプレイ１６は、コンピューティングデバイス２内に統合され得る。例えば、ディスプレイ１６は、モバイル電話ハンドセットまたはタブレットコンピュータのスクリーンであり得る。あるいは、ディスプレイ１６は、有線または無線通信リンクを介してコンピューティングデバイス２に結合されたスタンドアローンデバイスであり得る。例えば、ディスプレイ１６は、ケーブルまたは無線リンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
【００３９】
[0046]バス１８は、第１、第２、および第３のジェネレーションバス構造とプロトコル、共有されるバス構造とプロトコル、ポイント・ツー・ポイントバス構造とプロトコル、単一方向バス構造とプロトコル、および双方向バス構造とプロトコルを含むバス構造とバスプロトコルの任意の組合せを用いて実施され得る。バス１８を実施するために用いられ得る異なるバス構造およびプロトコルの例は、例えば、ハイパートランスポートバス、ＩｎｆｉｎｉＢａｎｄバス、アドバンストグラフィックスポートバス、周辺構成要素相互接続（ＰＣＩ）バス、ＰＣＩエクスプレスバス、アドバンスト・マイクロコントローラ・バス・アーキテクチャ（ＡＭＢＡ）アドバンスト・ハイパフォーマンスバス（ＡＨＢ）、ＡＭＢＡアドバンスト周辺バス（ＡＰＢ）、およびＡＭＢＡアドバンストｅＸｅｎｔｉｓｉｂｌｅインターフェース（ＡＸＩ）バスを含む。他のタイプのバス構造およびプロトコルも同様に用いられ得る。
【００４０】
[0047]本開示で説明される技術は、いくつかの例において、例えば、ＣＰＵ６、ＧＰＵ１２、およびシステムメモリ１０を含む図１に示されたコンピューティングデバイス２における構成要素のいずれかにおいて実施され得る。いくつかの例において、本開示のオクルージョンクエリ技術は、ＧＰＵ１２とメモリ１０を用いて実施され得る。いくつかの例において、本開示の技術は、ＧＰＵ１２において完全に実施され得る。いくつかの例において、本開示で説明される技術は、開始値を決定するためのクエリの開始時と終了値を決定するためのクエリの終了時にランニングカウンタを読み取るために、これらの構成要素の組合せを用いて実施され得る。これらの構成要素のうちの１つ又は複数は、結果を決定するために、終了値から開始値を差し引くために用いられ得る。
【００４１】
[0048]図２は、図１におけるコンピューティングデバイス２のＣＰＵ６、ＧＰＵ１２、およびメモリ１０をさらに詳しく示すブロック図である。本開示で説明される技術は、いくつかの例において、図２に示される構成要素のいずれかにおいて実施され得る。図２に示されるように、ＣＰＵ６は、ＧＰＵ１２とメモリ１０に通信可能に結合され、ＧＰＵ１２は、ＣＰＵ６とメモリ１０に通信可能に結合される。ＧＰＵ１２は、いくつかの例において、ＣＰＵ６と共にマザーボード上に統合され得る。さらなる例において、ＧＰＵ１２は、ＣＰＵ６を含むマザーボードのポートにインストールされるグラフィックスカード上に実装され得る。さらなる例において、ＧＰＵ１２は、ＣＰＵ６と相互に動作されるように構成された周辺機器内に統合され得る。さらなる例において、ＧＰＵ１２は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。
【００４２】
[0049]ＣＰＵ６は、ソフトウェアアプリケーション２４、グラフィックスＡＰＩ２６、ＧＰＵドライバ２８、およびオペレーティングシステム３０のうちのいずれかを実行するように構成された１つまたは複数のプロセッサ（例えば、マイクロプロセッサ）を含み得る。いくつかの例において、ＣＰＵ６は、ＣＰＵ６の１つまたは複数のプロセッサに本開示で説明された任意の技術ののうちの全てまたは一部を行わせる命令を実行するように構成され得る。
【００４３】
[0050]ＧＰＵ１２は、コマンドエンジン３２、１つまたは複数の処理ユニット３４、およびタイルベースレンダリングバッファ３６を含む。１つまたは複数の処理ユニット３４は、３Ｄグラフィックスレンダリングパイプラインを形成するように構成され得る。いくつかの例において、処理ユニット３４のうちの１つまたは複数は、オンチップ、モザイク化により可能になった（tessellation-enabled）グラフィックスレンダリングパイプラインを実装し得る。コマンドエンジン３２と処理ユニット３４は、こういった構成要素に属する機能を実行するように構成された専用のハードウェアユニット、ファームウェア、ソフトウェア、およびプロセッサの任意の組合せを含み得る。いくつかの例において、ＧＰＵ１２は、ＧＰＵ１２の１つまたは複数のプロセッサに、本開示で説明される任意の技術のうちの全てまたは一部を行わせる命令を実行するように構成され得る。
【００４４】
[0051]メモリ１０は、１つまたは複数のコマンド３８、プリミティブデータ４０、およびタイムスタンプデータ４２を記憶し得る。いくつかの例において、メモリ１０はまた、実行されると、１つまたは複数のプロセッサに本開示で説明される任意の技術のうちの全てまたは一部を行わせる命令を記憶し得る。
【００４５】
[0052]図２はまた、ディスクリート・グラフィカル・エンティティをカウントし得るカウンタ４４の例を示す。ＧＰＵ１２またはＣＰＵ６のようなプロセッサは、開始値を決定するためのクエリの開始時と終了値を決定するためのクエリの終了時にカウンタ４４を読み取ることと、および結果を決定するために終了値から開始値を差し引くことをプロセッサに行わせるソフトウェアを実行し得る。様々な例において、ＧＰＵ１２またはＣＰＵ６は、カウンタ４４から読み取られた値を記憶するためにメモリ１０を使用し得る。他の例において、ＧＰＵ１２またはＣＰＵ６内のレジスタまたは他のメモリ（不図示）が使用され得る。例えば、カウンタ４４は、メモリまたは他のストレージを含み得る。
【００４６】
[0053]例示された図２の例において、カウンタ４４はバス１８に接続され、それによって、例えば、ＣＰＵ６とＧＰＵ１２によってアクセスされ得る。他の例において、カウンタ４４は、メモリ１０の一部であり得るか、またはＣＰＵ６またはＧＰＵ１２に実装され得る。一般的に、全てのクエリタイプに関するクエリのカウンタは、ハードウェアによって保持される。したがって、一般的に、メモリにカウンタ値を書き込むようにＧＰＵ１２に命令することが必要であり、その後ＣＰＵ６はメモリにアクセスできる。いくつかの例において、ソフトウェアクエリカウンタは使用されない。こういった例において、全てのクエリタイプに関するカウンタ値はハードウェアで保持され得、ハードウェアコマンドは、それらのカウンタ値がメモリに書き込まれるように使用され得る。しかし、他の例は、ソフトウェアカウンタまたはハードウェアカウンタとソフトウェアカウンタの組合せのように、異なるカウンタ構成を使用し得る。
【００４７】
[0054]他の処理リソース（不図示）は、開始値を決定するためのクエリの開始時と終了値を決定するためのクエリの終了時にカウンタ４４を読み取ることと、結果を決定するために終了値から開始値を差し引くことによって本開示の技術を実施するために使用され得ることが理解されるであろう。
【００４８】
[0055]ここに記載された技術が、図２のシステムを使用してどのように実施され得るかの１つの特定の例において、ＧＰＵ１２は、開始値を決定するためのクエリの開始時にカウンタ４４を読み取ることをＧＰＵ１２に行わせるソフトウェアを実行し得る。この開始値はメモリ１０に記憶され得る。ＧＰＵ１２は次に、終了値を決定するためのクエリの終了時にカウンタ４４を読み取り得る。この終了値は、結果を決定するためにメモリに記憶された開始値から差し引かれ得る。終了値が読み取られた後、終了値は、ＧＰＵ１２またはメモリ１０内のレジスタに記憶され得る。開始値はメモリ１０から読み取られ、次にレジスタに記憶された終了値から差し引かれ得る。
【００４９】
[0056]いくつかの例において、クエリのカウンタは、ＧＰＵによって保持され得る。ＧＰＵによって実行された命令は、これらのカウンタ値がＣＰＵ６によって次にアクセスされ得るメモリ１０にこういったカウンタ値を書き込み得る。ここに記載された技術が、図２のシステムを使用してどのように実施され得るかの別の特定の例において、ＣＰＵ６は、開始値を決定するためのクエリの開始時にカウンタ４４を読み取ることをＣＰＵ６に行わせるソフトウェアを実行し得る。この開始値はメモリ１０に記憶され得る。ＣＰＵ６は、終了値を決定するためのクエリの終了時にカウンタ４４を読み取り得る。この終了値は、結果を決定するために、メモリに記憶された開始値から差し引かれ得る。終了値が読み取られた後、終了値は、ＣＰＵ６またはメモリ１０内のレジスタに記憶され得るが、一般的にはＣＰＵ６内のレジスタが使用される。開始値はメモリ１０から読み取られ、次にレジスタに記憶された終了値から差し引かれ得る。
【００５０】
[0057]例示された図２の例において、プロセッサ（例えば、ＣＰＵ６またはＧＰＵ１２）、メモリ１０、およびカウンタ４４はそれぞれ、バス１８に取り付けられた別個の論理ブロックである。他の例（不図示）において、プロセッサ、メモリ、およびカウンタの機能のうちの１つまたは複数は、単一機能ブロックを用いて実行され得る。例えば、プロセッサは、開始値を決定するためのクエリの開始時にカウンタを読み取ることと、単一機能ブロック内のメモリに開始値を記憶することと、終了値を決定するためのクエリの終了時にカウンタ４４を読み取ることと、結果を決定するために終了値から開始値を差し引くこととを、バス１８に取り付けられ得る単一機能ブロックに命令する。次に、終了値は、プロセッサに返される唯一のものであり得る。他の例において、プロセッサは、機能ブロックにクエリの開始および終了を示し得、および機能ブロックは結果を返し得る。
【００５１】
[0058]図２に示された装置は、ここに記載されたシステムおよび方法にしたがって様々なクエリを実行し得る。例えば、図７および図５−６のメモリマップを参照してさらに詳細に例示されたように、図２の装置はクエリＡＢＣとクエリＢＣの２つのクエリを実行し得、１つがもう１つにネスト化される（nested）。こういったクエリにおいて、最初に３つのメモリロケーションがクエリＡＢＣに関してゼロにリセットされ得る。
【００５２】
[0059]ソフトウェアアプリケーション２４は、１つまたは複数の３Ｄグラフィックスシーンおよび／または３Ｄグラフィックスオブジェクトをディスプレイ上に表示されるべき画像にレンダリングするためにＧＰＵ１２を使用するグラフィックスアプリケーションであり得る。ソフトウェアアプリケーション２４は、３ＤグラフィックスプリミティブのセットをラスタライズおよびレンダリングすることをＧＰＵ１２に行わせる命令を含み得る。ソフトウェアアプリケーション２４は、グラフィックスＡＰＩ２６を介してＧＰＵドライバ２８に命令を発行し得る。グラフィックスＡＰＩ２６は、ＧＰＵドライバ２８によって消費可能なフォーマットにソフトウェアアプリケーション２４から受信された命令を翻訳するランタイムサービスであり得る。
【００５３】
[0060]ＧＰＵドライバ２８は、グラフィックスＡＰＩ２６を介してソフトウェアアプリケーション２４からの命令を受信し、命令をサービスするためにＧＰＵ１２の動作を制御する。例えば、ＧＰＵドライバ２８は、１つまたは複数のコマンド３８を定式化し、コマンド３８をメモリ１０に配置し、およびコマンド３８を実行するようにＧＰＵ１２に指示し得る。いくつかの例において、ＧＰＵドライバ２８は、コマンド３８をメモリ１０に配置し、およびオペレーティングシステム３０、例えば１つまたは複数のシステムコールを介して、ＧＰＵ１２と通信を行い得る。
【００５４】
[0061]オペレーティングシステム３０は、ソフトウェアアプリケーション２４、グラフィックスＡＰＩ２６、およびＧＰＵドライバ２８が実行するソフトウェアプラットフォームを提供し得る。オペレーティングシステム３０は、ＣＰＵ６、メモリ１０およびＧＰＵ１２の間でデータを通信および転送するハードウェアの詳細を管理し得る。
【００５５】
[0062]コマンド３８は、１つまたは複数の状態コマンド、１つまたは複数のドローコールコマンド、および／または１つまたは複数のタイムスタンプリクエストを含み得る。状態コマンドは、ＧＰＵ１２において、例えば、プリミティブタイプなどの状態変数のうちの１つ又は複数を変更するようにＧＰＵ１２に指示し得る。ドローコールコマンドは、メモリ１０に記憶された１つまたは複数の頂点（例えば、頂点バッファにおいて定義される）から成るグループによって定義された図形（geometry）をレンダリングするようにＧＰＵ１２に指示し得る。１つまたは複数の頂点から成るグループによって定義された図形は、いくつかの例において、レンダリングされるべき複数のプリミティブ（例えば、プリミティブデータ４０）に対応し得る。一般的に、ドローコールコマンドは、メモリ１０の定義されたセクション（例えば、バッファ）に記憶された全ての頂点をレンダリングするためにＧＰＵ１２を起動し得る。換言すると、ＧＰＵ１２がドローコールコマンドを受信すると、メモリ１０の定義されたセクション（例えば、バッファ）内の頂点によって表された図形およびプリミティブをレンダリングするために制御がＧＰＵ１２に移行する。
【００５６】
[0063]処理ユニット３４は１つまたは複数の処理ユニットを含み得、それらの各々は、プログラム可能な処理ユニットまたは固定された機能処理ユニットであり得る。プログラム可能な処理ユニットは、ＣＰＵ６からＧＰＵ１２上にダウンロードされた１つまたは複数のシェイダープログラムを実行するように構成された例えば、プログラム可能なシェイダーユニットを含み得る。いくつかの例において、シェイダープログラムは、例えば、ＯｐｅｎＧＬシェーディング言語（ＧＬＳＬ）、ハイレベルなシェーディング言語（ＨＬＳＬ）、グラフィックスに関するＣ（Ｃｇ）シェーディング言語などのハイレベルなシェーディング言語で書き込まれたコンパイル型のプログラムであり得る。
【００５７】
[0064]いくつかの例において、プログラム可能なシェイダーユニットは、例えば、単一命令複数データ（ＳＩＭＤ）パイプラインを並行して動作するように構成された複数の処理ユニットを含み得る。プログラム可能なシェイダーユニットは、シェイダープログラム命令を記憶するプログラムメモリと、実行状態レジスタ、例えば、実行されているプログラムメモリ内の現在の命令またはフェッチされるべき次の命令を示すプログラムカウンタレジスタを有し得る。処理ユニット３４内のプログラム可能なシェイダーユニットは、例えば、頂点シェイダーユニット、ピクセルシェイダーユニット、ジオメトリシェイダーユニット、ハルシェイダーユニット（hull shader units）、ドメインシェイダーユニット、コンピュートシェイダーユニット、および／または統合されたシェイダーユニットを含み得る。
【００５８】
[0065]固定された機能処理ユニットは、特定の機能を実行するために配線接続されたハードウェアを含み得る。固定された機能ハードウェアは、例えば、異なる機能を実行するために１つまたは複数の制御信号を介して構成可能であり得るが、固定された機能ハードウェアは典型的に、ユーザによってコンパイルされたプログラムを受信できるプログラムメモリを含まない。いくつかの例において、処理ユニット３４内の固定された機能処理ユニットは、例えば、深さテスト、シザーズテスト（scissors testing）、アルファブレンディングなどのラスタオペレーションを実行する処理ユニットを含み得る。
【００５９】
[0066]タイルベースレンダリングバッファ３６は、レンダリングターゲットのサブ領域（例えば、タイルまたはビン）に関するラスタライズされたデータを記憶するように構成され得る。タイルベースレンダリングバッファ３６は、レンダリングパスの実行中、実際のレンダリングターゲットの特定のサブ領域に関する一時レンダリングターゲットとして動作し得る。タイルベースレンダリングバッファ３６は、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）などの１つまたは複数の揮発性または不揮発性メモリまたはストレージデバイスを含み得る。いくつかの例において、タイルベースレンダリングバッファ３６は、オンチップバッファであり得る。オンチップバッファとは、ＧＰＵ１２が形成、配置、および／または配列されたマイクロチップ、集積回路、および／またはダイと同じマイクロチップ、集積回路、および／またはダイ上に形成、配置、および／または配列されたバッファを指し得る。
【００６０】
[0067]いくつかの例において、処理ユニット３４は、第１の通信インターフェースを介してタイルベースレンダリングバッファ３６にアクセスし、および第１の通信インターフェースとは異なる第２の通信インターフェースを介してレンダリングターゲット（例えば、メモリ１０に記憶されたフレームバッファ）にアクセスし得る。こういった例において、第１の通信インターフェースは、いくつかの例において、第２の通信インターフェースより高い帯域幅を有し得る。第２の通信インターフェースは、いくつかの例において、図１におけるバス１８と図１におけるコントローラ８とメモリ１０の間の接続に対応し得る。タイルベースレンダリングバッファがオンチップタイルベースレンダリングバッファである場合、第１の通信インターフェースは、ＧＰＵ１２の内部に存在する通信インターフェースであり得る。
【００６１】
[0068]ここで用いられたように、帯域幅は、通信インターフェースが例えば、メモリ構成要素とＧＰＵ１２の２つの構成要素の間でデータを転送できるレートを指し得る。帯域幅に関する単位は、いくつかの例において、例えば、時間の単位毎のビット数として、例えば毎秒ギガビット（Ｇｂ／ｓ）として与えられ得る。マルチビットのバス幅を有するバスが通信インターフェースの一部として使用される場合、帯域幅は、いくつかの例において、データが単一のビットラインに沿って転送されるレートによって乗じられたバスの幅の積に等しい可能性がある。例えば、バスが１６ビット幅であり、バスの各ビットラインが２Ｇｂ／ｓのレートでデータを転送することができる場合、バスの帯域幅は３２Ｇｂ／ｓに等しくても良い。マルチバスが２つの構成要素の間に通信インターフェースを形成する場合、通信インターフェースの帯域幅は、マルチバスの各々の帯域幅の機能、例えば個々のバスの各々の最小帯域幅の機能であり得る。
【００６２】
[0069]タイルベースレンダリングバッファ３６がＧＰＵ１２と同じチップ上に実装される場合、ＧＰＵ１２は、システムとメモリバス（例えば、図１におけるバス１８と図１におけるメモリコントローラ８とメモリ１０の間の接続）を介して必ずしもタイルベースレンダリングバッファ３６にアクセスする必要はないが、むしろＧＰＵ１２と同じチップ上に実装される内部通信インターフェース（例えば、バス）を介してタイルベースレンダリングバッファ３６にアクセスし得る。例えばインターフェースはオンチップであるので、インターフェースは、システムとメモリバスより高い帯域幅で動作可能であり得る。上述した技術は、メモリ１０にアクセスするために用いられる通信インターフェースの帯域幅を超えるタイルベースレンダリングバッファ３６のための通信インターフェースを実現する１つの方法であるが、他の技術も可能であり、本開示の範囲内である。
【００６３】
[0070]タイルベースレンダリングバッファ３６の容量は、いくつかの例において、特定のタイプのコンピューティングデバイス、例えば、モバイルデバイスで使用可能なメモリによって限定され得る。レンダリングバッファ３６は高速グラフィックスメモリであり得る。さらに、タイルベースレンダリングバッファ３６がＧＰＵ１２と同じチップ上に実装される場合、同じチップ上にタイルベースレンダリングバッファ３６を実施するのに使用可能な領域の量は、チップ上で実施される他の機能に起因して限定され得る。いくつかの例において、タイルベースレンダリングバッファ３６は、タイルベースレンダリングバッファ３６の容量をさらに限定するレンダリングターゲットのビット密度より低いビット密度を有し得る。これらおよび／または他の要素のため、タイルベースレンダリングバッファ３６の容量は、いくつかの場合において、レンダリングターゲットのサイズより小さくても良い。その結果、タイルベースレンダリングバッファ３６の容量は、こういった例において、グラフィックス画像と関連する複数のデスティネーション・ピクセルの全てに関するピクセルデータを記憶するのに必要な最小容量より少なくても良い。メモリ構成要素の容量は、メモリ構成要素に記憶されることができる最大データ量（例えば、最大ビット数）を指し得る。レンダリングターゲットのサイズは、レンダリングターゲットに割り当てられたメモリの範囲に記憶されたデータ量（例えば、ビット数）を指し得る。ビット密度は、領域の特定量に記憶される得るビット数を指し得る。
【００６４】
[0071]上述したとおり、タイルベースレンダリングを実行する場合、ＧＰＵ１２は、レンダリングパスの独立した反復の間、レンダリングターゲットの各サブ領域をレンダリングし得る。例えば、レンダリングターゲットの特定のサブ領域（例えば、グラフィックス画像のデスティネーション・ピクセルの特定のサブセット）に関する単一のレンダリングパス反復の一部として、ＧＰＵ１２は、レンダリングターゲットの特定のサブ領域に対してプリミティブの全てまたはサブセットをレンダリングし得る。上述したとおり、レンダリングバッファ３６は高速グラフィックスメモリであり得る。タイルベースレンダリングバッファ３６の容量は、レンダリングターゲットのサブ領域のサイズより大きく、あるいは等しくなるように構成され得る。したがって、レンダリングターゲットは、高速グラフィックスメモリのサイズであり得る（またはより小さい）。したがって、単一のレンダリングパス反復の間、レンダリングターゲットのサブ領域の各１つと関連する全てのデスティネーションピクセルデータは、必ずしもメモリ１０内のフレームバッファにアクセスする必要なくタイルベースレンダリングバッファ３６において使用可能であり得る。その結果、単一のレンダリングパス反復の間、ＧＰＵ１２は、比較的低い帯域幅通信インターフェースを介してメモリ１０からこういったデータを読み込まなくてはならないというよりはむしろ、比較的高い帯域幅通信インターフェースを介してタイルベースレンダリングバッファ３６からデスティネーションピクセルデータを読み取ることができる。
【００６５】
[0072]タイルベースレンダリングを実行しないいくつかのグラフィックスシステムは、ハードウェアベースのオンチップキャッシュを用いることによって、フレームバッファの一部をキャッシング（caching）可能であり得るが、こういったキャッシュは、既定のピクセルに関するデスティネーション・ピクセル値が必要な時に使用可能であることを保証しない。これは、複数のデスティネーション・ピクセルがハードウェアベースキャッシュ内の同じアドレスにマッピングし得るためである。タイルベースレンダリングがこの場合に用いられない場合、ハードウェアベースキャッシュの現在の状態は、必ずしも現在処理されるプリミティブと関連付けられるデスティネーション・ピクセル値を含み得ないが、グラフィックス画像の他の領域内の予め処理されたプリミティブと関連するデスティネーション・ピクセル値を含む。
【００６６】
[0073]複数のデスティネーション・ピクセルが同じキャッシュロケーションにマップするハードウェアベースキャッシュとは対照的に、既定のレンダリングパス反復のためにタイルベースレンダリングバッファ３６に記憶されたデスティネーション・ピクセルは、いくつかの例において、一義的にアドレス指定可能であり得る。換言すると、既定のレンダリングパス反復のために、一対一のマッピングは、タイルベースレンダリングバッファ３６内でアドレス指定可能なストレージスロットと該レンダリングパス反復に使用されるデスティネーション・ピクセルの間で定義され得る。その結果、タイルベースレンダリングを実行する場合、既定のタイルベースレンダリングパスに関する全てのデスティネーションアルファ値は、いくつかの例において、比較的低い帯域幅通信インターフェースを介してタイルベースレンダリングバッファ３６から入手可能であり得る。さらに、ハードウェアベースキャッシュシステムとは異なり、タイルベースレンダリングバッファ３６内の一義的にアドレス指定可能なデータが原因で、キャッシュミスが生じることはないため、キャッシュミスの際に帯域幅のエクスペンシブなフレームバッファアクセスを用いる（resort to）必要性を軽減する。
【００６７】
[0074]デスティネーション・ピクセルは、特定のピクセルロケーションに関するレンダリングターゲット（例えば、フレームバッファか、あるいは対応するタイルベースレンダリングバッファ）に記憶されたピクセルデータを指し得る。対照的に、ソースピクセルは、処理ユニット３４内のラスタライゼーション処理ユニットによって生成されたピクセルデータを指し、いまだレンダリングターゲットに記憶および／または統合されていないピクセルデータを指し得る。デスティネーション・ピクセルは、異なるプリミティブと関連する複数のソースピクセルからの複合ピクセルデータを含み得る。
【００６８】
[0075]タイルベースレンダリングを実行するために、ソフトウェアアプリケーション２４は、いくつかの例において、レンダリングされるべき１つまたは複数の３Ｄグラフィックスプリミティブのセットを幾何学的観点から定義するプリミティブデータ４０をメモリ１０に配置し、グラフィックスＡＰＩ２６を介してＧＰＵドライバ２８に１つまたは複数のドローコールコマンドを発行し得る。ドローコールコマンドは、プリミティブデータ４０によって定義されたプリミティブが、ラスタライズされおよびＧＰＵ１２によってレンダリングターゲット（例えば、メモリ１０に記憶されたフレームバッファ）にレンダリングされるようでき得る。
【００６９】
[0076]いくつかの例において、ドローコールコマンドを発行する前に、ソフトウェアアプリケーション２４は、特定のタイプのプリミティブをレンダリングするようにＧＰＵ１２を構成し得る。例えば、ソフトウェアアプリケーション２４は、ドローコール中にレンダリングするべき特定のタイプのプリミティブを特定するＧＰＵ１２に状態コマンドを発行し得る。さらなる例において、ドローコールコマンドを発行する前に、ソフトウェアアプリケーション２４は、プリミティブをレンダリングするための１つ又は複数のモザイク技術を使用するようにＧＰＵ１２を構成し得る。例えば、ソフトウェアアプリケーション２４は、ドローコール命令の間に、モザイク技術を実施する１つまたは複数のシェイダープログラムにＧＰＵ１２の１つまたは複数のシェイダーユニット（例えば、ハルシェイダーユニットおよび／またはドメインシェイダーユニット）で実行させ得る。
【００７０】
[0077]プリミティブデータ４０は、レンダリングされるべき１つまたは複数のプリミティブを示すデータを含み得る。いくつかの場合において、プリミティブデータ４０は、幾何学的観点からレンダリングされるべきプリミティブを定義し得る。プリミティブを幾何学的観点から定義することは、頂点（または制御点）のセットと対応する頂点属性によってプリミティブを定義することを指し得る。いくつかの例において、プリミティブデータ４０は、複数の頂点、頂点リスト、および／または頂点バッファの形をとり得る。さらなる例において、プリミティブデータ４０は、インデックスバッファと組み合わせた頂点バッファの形をとり得る。こういった例において、頂点バッファは、頂点を定義し得、およびインデックスバッファは、どの頂点が各々のプリミティブを定義するために使用されるかを特定し得る。
【００７１】
[0078]プリミティブデータ４０に含まれる各々の頂点は、例えば、位置座標、標準座標、テクスチャ座標などの１つまたは複数の属性を含み得る。頂点は、概念上、幾何学的プリミティブ（例えば、点、線、三角形など）の頂点および／または高次プリミティブ（例えば、ベジェ表面のような高次表面の制御点）に対応し得る。いくつかの場合において、各々の頂点は、１つまたは複数の頂点から成るグループにグループ分けされ得、これら頂点から成る複数のグループの各々は、単一プリミティブに対応し得る。
【００７２】
[0079]幾何学的観点から定義されたプリミティブの形状は、いくつかの例において、必ずしもプリミティブデータ４０に含まれない付加的なデータによって定義され得る。付加的なデータは、１つまたは複数の既定のプリミティブタイプ、１つまたは複数の数学関数および／または１つまたは複数のモザイク技術からなるセットから特定のプリミティブタイプのうちの１つまたは複数を含み得る。
【００７３】
[0080]いくつかの例において、特定のプリミティブタイプは、ＧＰＵ１２にレンダリング状態変数として記憶され得、およびソフトウェアアプリケーション２４によって構成可能であり得る。特定のプリミティブタイプは、いくつかの場合において、結果としてレンダリングされたプリミティブ（例えば、点、線、三角形など）の形状および／またはプリミティブデータ４０（例えば、トライアングルストリップ、トライアングルファンなど）に含まれる頂点の接続性を定義し得る。いくつかの例において、異なるプリミティブタイプは、処理ユニット３４によって実装されるグラフィックスパイプラインが処理することが可能であるプリミティブトポロジのセットに対応し得る。さらなる例において、異なるプリミティブタイプは、グラフィックスＡＰＩ２６によって定義されるプリミティブトポロジのセットに対応し得、およびソフトウェアアプリケーション２４による使用のために使用可能である。
【００７４】
[0081]１つまたは複数の数学関数および／または１つまたは複数のモザイク技術は、ＧＰＵ１２の１つまたは複数のシェイダーユニット（例えば、ハルシェイダーユニットおよび／またはドメインシェイダーユニット）で実行するように構成された１つまたは複数のシェイダープログラムにおいて特定され得る。数学関数は、曲線および／または曲面を有するプリミティブを定義するために用いられ得る。１つまたは複数のモザイク技術は、入力プリミティブの形状および／または曲率を近似させる複数のモザイクのプリミティブによってプリミティブを定義するために用いられ得る。
【００７５】
[0082]ソフトウェアアプリケーション２４からのドローコールコマンドを受信することに応じて、ＧＰＵドライバ２８は、ＧＰＵ１２にレンダリングされるべき複数のプリミティブ（例えば、プリミティブデータ４０）に基づいてタイルベースレンダリングを実行させ得る。例えば、ＧＰＵドライバ２８は、ＧＰＵ１２に複数のレンダリングパス反復を含むビニングパスとレンダリングパスを行わせ得る。ビニングパスの間に、ＧＰＵ１２は、複数のサブ領域、例えば、レンダリングターゲットのビンまたはタイルのどちらに各々のプリミティブが画像データ（例えば、ピクセルデータ）を付与する（contributes）かを決定し、およびレンダリングターゲットの複数のサブ領域のどちらに各々のプリミティブが画像データ（例えば、ピクセルデータ）を付与するかを示すビニングデータ（例えば、ビンまたはタイルからのデータ）を生成し得る。ビニングデータが生成されると、ＧＰＵ１２は、プリミティブの複合、ラスタライズされたバージョンを生成するために、ビニングデータとプリミティブデータ４０に基づく複数のレンダリングパス反復を含むレンダリングパスを実行し得る。
【００７６】
[0083]いくつかの例において、ビニングパスを実行するために、ＧＰＵ１２内のラスタライザが、ラスタライズされるべきプリミティブで低解像度のｚバッファリングおよび／またはバックフェースカリング（back-face culling）を実行するように構成され得る。こういった例において、ビニングデータは、ｚバッファリングおよび／またはバックフェースカリングの後、目に見えるプリミティブに基づいて生成され得る。
【００７７】
[0084]いくつかの場合において、レンダリングされたプリミティブは、複数のピクセルとして記憶され得る。各々のピクセルは、レンダリングターゲットの１つまたは複数の空間ロケーションと関連付けられ得、および各ピクセルの色を示す１つまたは複数の属性を含み得る。いくつかの場合において、各々のピクセルは、ピクセルの透明性を示す１つまたは複数の属性をさらに含み得る。いくつかの例において、ピクセルデータは、各ピクセルに関する赤、緑、青、およびアルファ（ＲＧＢＡ）の属性を含み得、そこで、「ＲＧＢ」構成要素は、色値に対応しおよび「Ａ」構成要素はアルファ値に対応し得る。
【００７８】
[0085]本開示で説明される技術は、例えば、ソフトウェアアプリケーション２４、グラフィックスＡＰＩ２６、ＧＰＵドライバ２８、コマンドエンジン３２、および処理ユニット３４を含む図２に示された構成要素のいずれかにおいて実施され得る。例えば、ＧＰＵドライバ２８、コマンドエンジン３２、および／または処理ユニット３４が構成され得る。
【００７９】
[0086]他の例において、ＣＰＵ６ではなくＧＰＵ１２が、開始値を決定するためにクエリの開始時にディスクリート・グラフィカル・エンティティをカウントし得るランニングカウンタを読み取ることをＧＰＵ１２に行わせるソフトウェアを実行し得る。ＧＰＵ１２は、終了値を決定するためにクエリの終了時にランニングカウンタを読み取り、および結果を決定するために終了値から開始値を差し引き得る。
【００８０】
[0087]いくつかの例において、開始値は、第１のメモリロケーション、例えば、メモリ１０に記憶され得る。終了値は第２のメモリロケーション、例えば、メモリ１０に記憶され得る。結果は、第３のメモリロケーション、例えば、メモリ１０に記憶され得る。
【００８１】
[0088]別の例において、開始値は、第１のメモリロケーション、例えば、メモリ１０に記憶され得る。終了値は、第２のメモリロケーション、例えば、メモリ１０に記憶され得る。結果は第１または第２のメモリロケーションのうちの１つを上書きし得る。
【００８２】
[0089]いくつかの例は、第２のクエリをネスティングすることをさらに含む。ネスティングは、第２の開始値を決定するために第２のクエリの開始時にランニングカウンタを読み取り、第２の終了値を決定するために第２のクエリの終了時にランニングカウンタを読み取り、および結果を決定するために第２の終了値から第２の開始値を差し引くことによって行われ得る。
【００８３】
[0090]図３は、タイルベースレンダリングを示す概念図である。上述したとおり、ビニングまたはタイルベースレンダリングは、３Ｄシーンを「タイル」または「ビン」と呼ばれるより小さい部分にレンダリングするための方法を提供し得る。上述したとおり、タイルベースレンダリングは、シーンにおけるローカル空間コヒーレンスを利用するか、後にグラフィックスパイプラインにおいて有限ハードウェアレンダリングリソースの使用を容易にするか、あるいはその両方を行うために用いられ得る。一般的に、タイルベースレンダリングにおいて、コンピュータグラフィックスデバイスのようなデバイス、装置またはシステムは、フレームを例えば、正規グリッドに分割し得る。グリッドは複数のタイルを形成し、それらはフレームまたは他の領域の一部である。一例において、各タイルまたはビンは、同じレンダリングコマンドストリームを用いてレンダリングされ得る。
【００８４】
[0091]図３のタイルベースレンダリングの例において、多角形、例えば、三角形、ＴｒｉＡ、ＴｒｉＢおよびＴｒｉＣを描くためのレンダリングコマンドは、４回、例えば、全てのタイルにつき一度実施され得る。オクルージョンクエリのカウンタのようなハードウェアカウンタを使用する一例において、オクルージョンクエリのカウンタをリセット、開始、終了するためのハードウェアコマンドは、ネスティングが使用されない場合のみ各タイルのために実行され得る。いくつかの例においてソフトウェアカウンタが使用される場合、ソフトウェアコマンドはこれらのオペレーションを行い得る。いくつかの例において、本開示の技術にしたがって、ネスティングされたオクルージョンクエリは、それを許可され得、例えば、タイル毎のカウンタのハードウェアリセットは、これが、１つまたは複数の他のクエリをカウントする最中にカウンタをリセットすることによって、ネスティングされたクエリまたは複数のクエリに影響を与えてしまう可能性があるため、許可され得ない。例えば、第１のクエリが開始され、クエリに使用されるカウンタがクエリの開始時にリセットされたと仮定する。さらに、第２のクエリが第１のクエリの終了前に開始されたと仮定する。第２のクエリは、第１のクエリがまだ実行されている間に開始されたため、ネスティングされたクエリであるはずであると言われる。単一カウンタが両方のクエリに使用される、およびカウンタが第２のクエリの開始時にリセットされる場合、第１のクエリの終了時にカウンタから読み取られた値は正しくない可能性がある。例えば、読み取られた値は概ね小さすぎる可能性がある。
【００８５】
[0092]いくつかの例において、これらの技術を実装するシステム、方法、およびデバイスは、各タイルに関する開始および終了カウンタ値を記憶する必要があり得る。これらの値は、メモリ、レジスタ、またはいくつかの他のストレージに記憶され得る。例えば、開始値は、メモリ１０、レジスタ、またはいくつかの他のメモリまたはストレージロケーションに記憶され得る。終了値も同様に、メモリ１０、レジスタ、またはいくつかの他のメモリまたはストレージロケーションに記憶され得る。別の例において、開始値は、第１のメモリロケーション、例えば、メモリ１０に記憶され得る。終了値は、第２のメモリロケーション、例えば、メモリ１０に記憶され得る。結果は、第３のメモリロケーション、例えば、メモリ１０に記憶され得る。別の例において、開始値は、第１のメモリロケーション、例えば、メモリ１０に記憶され得る。終了値は、第２のメモリロケーション、例えば、メモリ１０に記憶され得る。結果は第１または第２のメモリロケーションのうちの１つを上書きし得る。さらに別の例において、開始値は、第１のメモリロケーション、例えば、メモリ１０に記憶され得る。終了値は、レジスタに記憶され得る。結果は第１のメモリロケーションに記憶され得る。
【００８６】
[0093]タイルベースレンダリングは、いくつかの例において、レンダリングターゲットを複数のサブ領域（例えば、ビンまたはタイル）に細分化することおよびレンダリングターゲットのサブ領域のそれぞれにつき別個のレンダリングパス反復を含むレンダリングパスを実行することを含み得る。レンダリングパスの間に処理される必要のあるプリミティブの数を減らすために、ビニングパスは、いくつかの例において、レンダリングパスより前に実行され得る。ビニングパスは、レンダリングターゲットの複数のサブ領域のいずれに対してレンダリングされるべき各々のプリミティブがピクセルデータを付与するかを示すビニングデータを生成するために用いられ得る。ビニングデータは、特定のレンダリングパス反復の間にアクティブであるサブ領域に付与するプリミティブを選択的にレンダリングするために、レンダリングパス反復の間に用いられ得、それによってレンダリングパスの間に処理される必要のあるプリミティブの数を少なくする。
【００８７】
[0094]レンダリングとは、グラフィックスシーンにおける３Ｄオブジェクトに対応する３Ｄグラフィックスプリミティブをラスタライズされた２Ｄ画像データに変換するプロセスを指し得る。レンダリングは典型的に、レンダリングターゲット（例えば、フレームバッファ）に関して行われ、それは、シーンにおける各グラフィックスプリミティブがレンダリングされるのにしたがって通常更新される。そのため、レンダリングターゲットは、グラフィックスシーンに関する最後にラスタライズされた２Ｄ画像データを記憶するだけではなく、レンダリングターゲットは、グラフィックスシーンがレンダリングされるのにつれて中間のデータも同様に記憶し得る。レンダリングターゲットに記憶されたラスタライズされた２Ｄ画像データは、各々のピクセルが、色データ、透明性データ、および／または深さデータを含む複数のピクセルを含み得る。各新しいプリミティブがレンダリングターゲットにレンダリングされるのにつれて、新しいプリミティブのラスタライズされた２Ｄ画像データは、予めレンダリングされたプリミティブのためのレンダリングターゲットに既に記憶された既存の中間のデータと統合される。
【００８８】
[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]種々の態様および具体例が説明されてきた。しかし、下記の請求項の範囲から逸脱しないのであれば、本開示の構造または技術に対して変更が可能である。
【図１】
2016520909.tif 000003
【図２】
2016520909.tif 000004
【図３】
2016520909.tif 000005
【図４】
2016520909.tif 000006
【図５】
2016520909.tif 000007
【図６】
2016520909.tif 000008
【図７】
2016520909.tif 000009
【図８】
2016520909.tif 000010
【手続補正書】
【提出日】平成28年1月26日(2016.1.26)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
グラフィックス処理システムにおいてクエリを実行する方法であって、前記方法は、
１つまたは複数のタイルベースレンダリングクエリを発行することと、ここにおいて、前記１つまたは複数のタイルベースレンダリングクエリは第１のタイルベースレンダリングクエリを含み、
蓄積の最終結果のメモリロケーションを各クエリに割り当てることと、および
各タイルについて、
開始値を決定するために、前記第１のタイルベースレンダリングクエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記第１のタイルベースレンダリングクエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
前記第１のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えることと、
を備える、方法。
【請求項２】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項１に記載の方法。
【請求項３】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項１に記載の方法。
【請求項４】
前記開始値は第１のメモリロケーションに記憶され、前記終了値は第２のメモリロケーションに記憶され、前記アキュムレータの値は各タイルベースレンダリングクエリに関する第３のメモリロケーションに記憶される、請求項１に記載の方法。
【請求項５】
前記開始値は第１のメモリロケーションに記憶され、前記終了値は第２のメモリロケーションに記憶され、および前記アキュムレータの値は前記第１のタイルベースレンダリングクエリに割り当てられた前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きされる、請求項１に記載の方法。
【請求項６】
前記１つまたは複数のタイルベースクエリは第２のタイルベースクエリを含み、前記方法は、
各タイルについて、
開始値を決定するために、前記第２のタイルベースレンダリングクエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記第２のタイルベースレンダリングクエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
前記第２のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えることと、
をさらに備える、請求項１に記載の方法。
【請求項７】
第３のネスティングされたクエリを実行することをさらに備える、請求項６に記載の方法。
【請求項８】
前記クエリは、オクルージョンクエリを備える、請求項１に記載の方法。
【請求項９】
前記クエリは、タイムスタンプクエリを備える、請求項１に記載の方法。
【請求項１０】
前記クエリは、パイプラインステータスクエリを備える、請求項１に記載の方法。
【請求項１１】
グラフィックス処理システムにおいてクエリを実行するための装置であって、
前記装置は、
グラフィックスデータを記憶するように構成されたメモリと、
前記メモリと通信状態にあるグラフィックス処理ユニット(ＧＰＵ）と、前記ＧＰＵは、
１つまたは複数のタイルベースレンダリングクエリを発行することと、ここにおいて、前記１つまたは複数のタイルベースレンダリングクエリは第１のタイルベースレンダリングクエリを含み、
前記メモリ内で、蓄積の最終結果のメモリロケーションを各クエリに割り当てることと、および
各タイルについて、
開始値を決定するために、前記第１のタイルベースレンダリングクエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記第１のタイルベースレンダリングクエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
前記第１のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えることと、
を備える、装置。
【請求項１２】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項１１に記載の装置。
【請求項１３】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項１１に記載の装置。
【請求項１４】
前記ＧＰＵは、前記開始値を第１のメモリロケーションに記憶し、前記終了値を第２のメモリロケーションに記憶し、および前記アキュムレータの値を第３のメモリロケーションに記憶するようにさらに構成される、請求項１１に記載の装置。
【請求項１５】
前記ＧＰＵは、前記開始値を第１のメモリロケーションに記憶し、前記終了値を第２のメモリロケーションに記憶し、および前記アキュムレータの値を前記第１のタイルベースレンダリングクエリに割り当てられた前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに書き込むようにさらに構成される、請求項１１に記載の装置。
【請求項１６】
前記１つまたは複数のタイルベースクエリは第２のタイルベースクエリを含み、ここにおいて、前記ＧＰＵは、
各タイルについて、
第２の開始値を決定するために、前記第２のタイルベースクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のタイルベースクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
前記第２のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記第２の結果を加えることと、
を行うようにさらに構成される、請求項１１に記載の装置。
【請求項１７】
前記ＧＰＵは、第３のネスティングされたクエリを実行するようにさらに構成される、請求項１６に記載の装置。
【請求項１８】
前記クエリは、オクルージョンクエリを備える、請求項１１に記載の装置。
【請求項１９】
前記クエリは、タイムスタンプクエリを備える、請求項１１に記載の装置。
【請求項２０】
前記クエリは、パイプラインステータスクエリを備える、請求項１１に記載の装置。
【請求項２１】
グラフィックス処理システムにおいてクエリを実行するための装置であって、
前記装置は、
１つまたは複数のタイルベースレンダリングクエリを発行するための手段と、ここにおいて、前記１つまたは複数のタイルベースレンダリングクエリは第１のタイルベースレンダリングクエリを含み、
蓄積の最終結果のメモリロケーションを各クエリに割り当てるための手段と、
各タイルについて、開始値を決定するために、前記第１のタイルベースレンダリングクエリの開始時にランニングカウンタを読み取るための手段と、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
各タイルについて、終了値を決定するために、前記第１のタイルベースレンダリングクエリの終了時に前記ランニングカウンタを読み取るための手段と、
各タイルについて、結果を決定するために、前記終了値から前記開始値を差し引くための手段と、
各タイルについて、前記第１のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えるための手段と、
を備える、装置。
【請求項２２】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項２１に記載の装置。
【請求項２３】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項２１に記載の装置。
【請求項２４】
前記開始値を第１のメモリロケーションに記憶するための手段と、前記終了値を第２のメモリロケーションに記憶するための手段と、および前記アキュムレータの値を第３のメモリロケーションに記憶するための手段と、をさらに備える、請求項２１に記載の装置。
【請求項２５】
前記開始値を第１のメモリロケーションに記憶するための手段と、前記終了値を第２のメモリロケーションに記憶するための手段と、および前記アキュムレータの値を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きするための手段と、をさらに備える、請求項２１に記載の装置。
【請求項２６】
各タイルについて、第２の開始値を決定するために、第２のタイルベースクエリの開始時に前記ランニングカウンタを読み取るための手段と、
各タイルについて、第２の終了値を決定するために、前記第２のタイルベースクエリの終了時に前記ランニングカウンタを読み取るための手段と、
各タイルについて、第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くための手段と、
各タイルについて、前記第２のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えるための手段と、
によって、前記第２のクエリをネスティングすることをさらに備える、請求項２１に記載の装置。
【請求項２７】
命令を記憶したコンピュータ可読記憶媒体であって、実行されると、デバイスの１つ又は複数のプロセッサに、
１つまたは複数のタイルベースレンダリングクエリを発行することと、ここにおいて、前記１つまたは複数のタイルベースレンダリングクエリは第１のタイルベースレンダリングクエリを含み、
蓄積の最終結果のメモリロケーションを各クエリに割り当てることと、および
各タイルについて、
開始値を決定するために、前記第１のタイルベースレンダリングクエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記第１のタイルベースレンダリングクエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
前記第１のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えることと、
を行わせる、コンピュータ可読記憶媒体。
【請求項２８】
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項２９】
前記ディスクリート・グラフィカル・エンティティは多角形を備える、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３０】
前記命令は、実行されると、前記デバイスの前記１つ又は複数のプロセッサに、前記開始値を第１のメモリロケーションに記憶することと、前記終了値を第２のメモリロケーションに記憶することと、および前記結果を第３のメモリロケーションに記憶することと、を行わせる、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３１】
前記命令は、実行されると、前記デバイスの前記１つ又は複数のプロセッサに、前記開始値を第１のメモリロケーションに記憶することと、前記終了値を第２のメモリロケーションに記憶することと、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きすることと、を行わせる請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３２】
前記１つまたは複数のタイルベースクエリは第２のタイルベースクエリを含み、前記媒体は、
各タイルについて、開始値を決定するために、前記第２のタイルベースレンダリングクエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
各タイルについて、終了値を決定するために、前記第２のタイルベースレンダリングクエリの終了時に前記ランニングカウンタを読み取ることと、
各タイルについて、結果を決定するために、前記終了値から前記開始値を差し引くことと、
各タイルについて、前記第２のタイルベースレンダリングクエリに割り当てられた前記蓄積の最終結果のメモリロケーションに記憶されたアキュムレータの値に前記結果を加えることと、
を行うための命令をさらに備える、請求項２７に記載のコンピュータ可読記憶媒体。
【請求項３３】
前記クエリは、オクルージョンクエリを備える、請求項２７に記載のコンピュータ可読記憶媒体。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１２９
【補正方法】変更
【補正の内容】
【０１２９】
[0136]種々の態様および具体例が説明されてきた。しかし、下記の請求項の範囲から逸脱しないのであれば、本開示の構造または技術に対して変更が可能である。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[Ｃ１]
グラフィックス処理システムにおいてクエリを実行する方法であって、前記方法は、
開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
を備える、方法。
[Ｃ２]
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、Ｃ１に記載の方法。
[Ｃ３]
前記ディスクリート・グラフィカル・エンティティは多角形を備える、Ｃ１に記載の方法。
[Ｃ４]
前記開始値は第１のメモリロケーションに記憶され、前記終了値は第２のメモリロケーションに記憶され、前記結果は第３のメモリロケーションに記憶される、Ｃ１に記載の方法。
[Ｃ５]
前記開始値は第１のメモリロケーションに記憶され、前記終了値は第２のメモリロケーションに記憶され、および前記結果は前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きされる、Ｃ１に記載の方法。
[Ｃ６]
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
によって、前記第２のクエリをネスティングすることをさらに備える、Ｃ１に記載の方法。
[Ｃ７]
第３のネスティングされたクエリを実行することをさらに備える、Ｃ６に記載の方法。
[Ｃ８]
前記クエリは、オクルージョンクエリを備える、Ｃ１に記載の方法。
[Ｃ９]
前記クエリは、タイムスタンプクエリを備える、Ｃ１に記載の方法。
[Ｃ１０]
前記クエリは、パイプラインステータスクエリを備える、Ｃ１に記載の方法。
[Ｃ１１]
開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
を行うように構成された１つ又は複数のプロセッサを備える、ビデオデータをコード化するための装置。
[Ｃ１２]
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、Ｃ１１に記載の装置。
[Ｃ１３]
前記ディスクリート・グラフィカル・エンティティは多角形を備える、Ｃ１１に記載の装置。
[Ｃ１４]
前記１つまたは複数のプロセッサは、前記開始値を第１のメモリロケーションに記憶し、前記終了値を第２のメモリロケーションに記憶し、および前記結果を第３のメモリロケーションに記憶するようにさらに構成される、Ｃ１１に記載の装置。
[Ｃ１５]
前記１つまたは複数のプロセッサは、前記開始値を第１のメモリロケーションに記憶し、前記終了値を第２のメモリロケーションに記憶し、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きするようにさらに構成される、Ｃ１１に記載の装置。
[Ｃ１６]
前記１つ又は複数のプロセッサは、
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
を行うようにさらに構成される、Ｃ１１に記載の装置。
[Ｃ１７]
前記１つ又は複数のプロセッサは、第３のネスティングされたクエリを実行するようにさらに構成される、Ｃ１６に記載の装置。
[Ｃ１８]
前記クエリは、オクルージョンクエリを備える、Ｃ１１に記載の装置。
[Ｃ１９]
前記クエリは、タイムスタンプクエリを備える、Ｃ１１に記載の装置。
[Ｃ２０]
前記クエリは、パイプラインステータスクエリを備える、Ｃ１１に記載の装置。
[Ｃ２１]
開始値を決定するために、クエリの開始時にランニングカウンタを読み取るための手段と、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取るための手段と、
結果を決定するために、前記終了値から前記開始値を差し引くための手段と、
を備える、ビデオデータをコード化するための装置。
[Ｃ２２]
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、Ｃ２１に記載の装置。
[Ｃ２３]
前記ディスクリート・グラフィカル・エンティティは多角形を備える、Ｃ２１に記載の装置。
[Ｃ２４]
前記開始値を第１のメモリロケーションに記憶するための手段と、前記終了値を第２のメモリロケーションに記憶するための手段と、および前記結果を第３のメモリロケーションに記憶するための手段と、をさらに備える、Ｃ２１に記載の装置。
[Ｃ２５]
前記開始値を第１のメモリロケーションに記憶するための手段と、前記終了値を第２のメモリロケーションに記憶するための手段と、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きするための手段と、をさらに備える、Ｃ２１に記載の装置。
[Ｃ２６]
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取るための手段と、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取るための手段と、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くための手段と、
によって、前記第２のクエリをネスティングすることをさらに備える、Ｃ２１に記載の装置。
[Ｃ２７]
命令を記憶したコンピュータ可読記憶媒体であって、実行されると、デバイスの１つ又は複数のプロセッサに、
開始値を決定するために、クエリの開始時にランニングカウンタを読み取ることと、ここにおいて、前記ランニングカウンタはディスクリート・グラフィカル・エンティティをカウントし、
終了値を決定するために、前記クエリの終了時に前記ランニングカウンタを読み取ることと、
結果を決定するために、前記終了値から前記開始値を差し引くことと、
を行わせる、コンピュータ可読記憶媒体。
[Ｃ２８]
前記ディスクリート・グラフィカル・エンティティはピクセルを備える、Ｃ２７に記載のコンピュータ可読記憶媒体。
[Ｃ２９]
前記ディスクリート・グラフィカル・エンティティは多角形を備える、Ｃ２７に記載のコンピュータ可読記憶媒体。
[Ｃ３０]
前記命令は、実行されると、前記デバイスの前記１つ又は複数のプロセッサに、前記開始値を第１のメモリロケーションに記憶することと、前記終了値を第２のメモリロケーションに記憶することと、および前記結果を第３のメモリロケーションに記憶することと、を行わせる、Ｃ２７に記載のコンピュータ可読記憶媒体。
[Ｃ３１]
前記命令は、実行されると、前記デバイスの前記１つ又は複数のプロセッサに、前記開始値を第１のメモリロケーションに記憶することと、前記終了値を第２のメモリロケーションに記憶することと、および前記結果を前記第１のメモリロケーションまたは前記第２のメモリロケーションのうちの１つに上書きすることと、を行わせるＣ２７に記載のコンピュータ可読記憶媒体。
[Ｃ３２]
第２の開始値を決定するために、第２のクエリの開始時に前記ランニングカウンタを読み取ることと、
第２の終了値を決定するために、前記第２のクエリの終了時に前記ランニングカウンタを読み取ることと、
第２の結果を決定するために、前記第２の終了値から前記第２の開始値を差し引くことと、
によって、前記第２のクエリをネスティングするための命令をさらに備える、Ｃ２７に記載のコンピュータ可読記憶媒体。
[Ｃ３３]
前記クエリは、オクルージョンクエリを備える、Ｃ２７に記載のコンピュータ可読記憶媒体。
【国際調査報告】
2016520909.tif 000011
2016520909.tif 000012