(57)【特許請求の範囲】
【請求項１】
方法であって、
グラフィックス処理ユニット（ＧＰＵ）を用いて、グラフィックスデータを作成するプロデューサシェーダを実行することと、
前記ＧＰＵを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータを第１のバッファの記憶ロケーションに記憶することと、
前記プロデューサシェーダによる前記グラフィックスデータの作成中に、前記プロデューサシェーダによって作成されている前記グラフィックスデータの量をカウントすることと、
前記グラフィックスデータの前記作成が完了すると、前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータの前記量を示す値を第２のバッファの記憶ロケーションに記憶することと、
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行することとを備える前記方法。
【請求項２】
前記第１のバッファおよび前記第２のバッファが共通のバッファの一部である、請求項１に記載の方法。
【請求項３】
１つまたは複数のコンシューマシェーダを実行することが、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するためにピクセルシェーダを実行することを備える、請求項１に記載の方法。
【請求項４】
前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記方法が、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行することと、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶することと、
前記第２のプロデューサシェーダによる前記第２のグラフィックスデータの作成中に、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの量をカウントすることと、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの前記量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶することとをさらに備える、請求項１に記載の方法。
【請求項５】
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記方法が、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダを実行しないことをさらに備える、請求項４に記載の方法。
【請求項６】
前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行することと、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行することとをさらに備える、請求項５に記載の方法。
【請求項７】
コンパイラを用いて、前記プロデューサシェーダにカウンタを生成させる前記コンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令を含めることをさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントする、請求項１に記載の方法。
【請求項８】
前記グラフィックスデータの前記量をカウントすることが、前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成されたプリミティブの量をカウントすることを備え、
グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、請求項１に記載の方法。
【請求項９】
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、前記１つまたは複数のコンシューマシェーダの何個のインスタンスを実行するかを決定することをさらに備え、
前記１つまたは複数のコンシューマシェーダを実行することが、前記１つまたは複数のコンシューマシェーダの前記決定された数のインスタンスを実行することを備える、請求項１に記載の方法。
【請求項１０】
グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶することであって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、記憶することと、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない前記複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定することとをさらに備える、請求項１に記載の方法。
【請求項１１】
装置であって、
第１のバッファと、
第２のバッファと、
グラフィックス処理ユニット（ＧＰＵ）とを備え、前記ＧＰＵが、
グラフィックスデータを作成するプロデューサシェーダを実行し、
前記プロデューサシェーダによって作成された前記グラフィックスデータを前記第１のバッファの記憶ロケーションに記憶し、
前記プロデューサシェーダによる前記グラフィックスデータの作成中に、前記プロデューサシェーダによって作成されているグラフィックスデータの量をカウントし、
前記グラフィックスデータの前記作成が完了すると、前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータの前記量を示す値を前記第２のバッファの記憶ロケーションに記憶し、および
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、かつ前記プロデューサシェーダが前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行するように構成される、前記装置。
【請求項１２】
前記第１のバッファおよび前記第２のバッファが共通のバッファの一部である、請求項１１に記載の装置。
【請求項１３】
前記ＧＰＵが前記第２のバッファを含む、請求項１１に記載の装置。
【請求項１４】
前記１つまたは複数のコンシューマシェーダを実行するために、前記ＧＰＵが、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するためにピクセルシェーダを実行するように構成される、請求項１１に記載の装置。
【請求項１５】
前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記ＧＰＵが、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行し、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶し、
前記第２のプロデューサシェーダによる前記第２のグラフィックスデータの作成中に、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの量をカウントし、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの前記量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶するようにさらに構成される、請求項１１に記載の装置。
【請求項１６】
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記ＧＰＵが、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダを実行しないようにさらに構成される、請求項１５に記載の装置。
【請求項１７】
前記ＧＰＵが、
前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行し、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行するようにさらに構成される、請求項１６に記載の装置。
【請求項１８】
コンパイラを実行するプロセッサであって、前記プロデューサシェーダをコンパイルして、前記プロデューサシェーダにカウンタを生成させる前記コンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令を含めるように構成されるプロセッサをさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントする、請求項１１に記載の装置。
【請求項１９】
前記グラフィックスデータの前記量をカウントするために、前記プロデューサシェーダが、前記プロデューサシェーダによって作成されたプリミティブの量をカウントし、グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、請求項１１に記載の装置。
【請求項２０】
前記ＧＰＵが、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、前記１つまたは複数のコンシューマシェーダの何個のインスタンスを実行するかを決定するように構成され、前記１つまたは複数のコンシューマシェーダを実行するために、前記ＧＰＵが、前記１つまたは複数のコンシューマシェーダの前記決定された数のインスタンスを実行するように構成される、請求項１１に記載の装置。
【請求項２１】
グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶するように構成される第３のバッファであって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、第３のバッファと、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定するように構成されるコントローラとをさらに備える、請求項１１に記載の装置。
【請求項２２】
メディアプレーヤ、セットトップボックス、ワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、およびタブレットコンピューティングデバイスのうちの少なくとも１つを備える、請求項１１に記載の装置。
【請求項２３】
装置であって、
第１のバッファと、
第２のバッファと、
グラフィックス処理ユニット（ＧＰＵ）とを備え、前記ＧＰＵが、
グラフィックスデータを作成するプロデューサシェーダを実行するための手段と、
前記プロデューサシェーダによって作成された前記グラフィックスデータを前記第１のバッファの記憶ロケーションに記憶するための手段と、
前記プロデューサシェーダによる前記グラフィックスデータの作成中に、前記プロデューサシェーダによって作成されている前記グラフィックスデータの量をカウントするための手段と、
前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、かつ前記グラフィックスデータの前記作成が完了すると、前記プロデューサシェーダによって作成された前記グラフィックスデータの前記量を示す値を前記第２のバッファの記憶ロケーションに記憶するための手段と、および
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、かつ前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行するための手段とを備える、前記装置。
【請求項２４】
１つまたは複数のコンシューマシェーダを実行するための前記手段が、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するためにピクセルシェーダを実行するための手段を備える、請求項２３に記載の装置。
【請求項２５】
前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記ＧＰＵが、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行するための手段と、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶するための手段と、
前記第２のプロデューサシェーダによる前記第２のグラフィックスデータの作成中に、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの量をカウントするための手段と、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの前記量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶するための手段とをさらに備える、請求項２３に記載の装置。
【請求項２６】
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記ＧＰＵが、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダを実行しないための手段をさらに備える、請求項２５に記載の装置。
【請求項２７】
前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行するための手段と、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行するための手段とをさらに備える、請求項２６に記載の装置。
【請求項２８】
前記プロデューサシェーダにカウンタを生成させるコンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令をコンパイルするための手段をさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントする、請求項２３に記載の装置。
【請求項２９】
前記グラフィックスデータの前記量をカウントするための手段は、前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成されたプリミティブの量をカウントするための手段を備え、
グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、請求項２３に記載の装置。
【請求項３０】
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、前記１つまたは複数のコンシューマシェーダの何個のインスタンスを実行するかを決定するための手段をさらに備え、
前記１つまたは複数のコンシューマシェーダを実行するための前記手段が、前記１つまたは複数のコンシューマシェーダの前記決定された数のインスタンスを実行するための手段を備える、請求項２３に記載の装置。
【請求項３１】
グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶するための手段であって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、手段と、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない前記複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定するための手段とをさらに備える、請求項２３に記載の装置。
【請求項３２】
メディアプレーヤ、セットトップボックス、ワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、およびタブレットコンピューティングデバイスのうちの少なくとも１つを備える、請求項２３に記載の装置。
【請求項３３】
非一時的なコンピュータ可読記憶媒体であって、
グラフィックス処理ユニット（ＧＰＵ）に、
グラフィックスデータを作成するプロデューサシェーダを実行させ、
前記プロデューサシェーダによって作成された前記グラフィックスデータを第１のバッファの記憶ロケーションに記憶させ、
前記プロデューサシェーダによる前記グラフィックスデータの作成中に、前記プロデューサシェーダによって作成されているグラフィックスデータの量をカウントさせ、
前記グラフィックスデータの前記作成が完了すると、前記プロデューサシェーダによって作成された前記グラフィックスデータの前記量を示す値を第２のバッファの記憶ロケーションに記憶させ、および
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、かつ前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行させる命令を備える前記非一時的なコンピュータ可読記憶媒体。
【請求項３４】
前記ＧＰＵに前記１つまたは複数のコンシューマシェーダを実行させる前記命令が、前記ＧＰＵに、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するためにピクセルシェーダを実行させる命令を備える、請求項３３に記載の非一時的なコンピュータ可読記憶媒体。
【請求項３５】
前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記命令が、前記ＧＰＵに、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行させ、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶させ、
前記第２のプロデューサシェーダによる前記第２のグラフィックスデータの作成中に、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの量をカウントさせ、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータの前記量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶させる命令をさらに備える、請求項３３に記載の非一時的なコンピュータ可読記憶媒体。
【請求項３６】
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記命令が、前記ＧＰＵに、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行させない命令をさらに備える、請求項３５に記載の非一時的なコンピュータ可読記憶媒体。
【請求項３７】
前記ＧＰＵに、
前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行させ、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行させる命令をさらに備える、請求項３６に記載の非一時的なコンピュータ可読記憶媒体。
【請求項３８】
前記ＧＰＵに、前記グラフィックスデータの前記量をカウントさせる前記命令が、前記ＧＰＵに、前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成されたプリミティブの量をカウントさせる命令を備え、
グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、請求項３３に記載の非一時的なコンピュータ可読記憶媒体。
【請求項３９】
前記ＧＰＵに、
前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値に基づいて、前記１つまたは複数のコンシューマシェーダの何個のインスタンスを実行するかを決定させる命令をさらに備え、
前記１つまたは複数のコンシューマシェーダを実行する前記命令が、前記１つまたは複数のコンシューマシェーダの前記決定された数のインスタンスを実行する命令を備える、請求項３３に記載の非一時的なコンピュータ可読記憶媒体。
【請求項４０】
前記ＧＰＵに、
グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶させ、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない前記複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定させる命令をさらに備える、請求項３３に記載の非一時的なコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、グラフィックスシェーダに関し、より詳細には、グラフィックス処理ユニット（ＧＰＵ）での１つまたは複数のグラフィックスシェーダの実行に関する。
【背景技術】
【０００２】
閲覧可能なコンテンツを生成するデバイスは、一般にグラフィックス処理ユニット（ＧＰＵ）を含む。ＧＰＵは、グラフィックスデータを処理して、ディスプレイ上のピクセルのピクセル値を生成し得る。グラフィックスデータを処理するために、ＧＰＵは、シェーダと呼ばれることが多い、１つまたは複数のシェーダプログラムを実行し得る。シェーダプログラムは、ＧＰＵがシェーダプログラムを実行するときに、シェーダプログラムによって定義された機能をＧＰＵに実行させるソフトウェアプログラムであり得る。たとえば、シェーダプログラムは、ＧＰＵがグラフィックスデータを処理して、ディスプレイ上のピクセルのピクセル値を生成すべきである方法を定義し得る。
【発明の概要】
【０００３】
一般に、本開示は、グラフィックス処理ユニット（ＧＰＵ）上での１つまたは複数のシェーダプログラムの実行を同期化するための技法について説明する。いくつかの例では、１つのシェーダプログラムは、別のシェーダプログラムによって使用または利用されるグラフィックスデータを生成し得る。グラフィックスデータを生成するシェーダプログラムをプロデューサシェーダ（ｐｒｏｄｕｃｅｒ  ｓｈａｄｅｒ）と呼ぶことができ、生成されたグラフィックスデータを使用するシェーダプログラムをコンシューマシェーダ（ｃｏｎｓｕｍｅｒ  ｓｈａｄｅｒ）と呼ぶことができる。本開示で説明する例示的な技法のいくつかは、ＧＰＵに、プロデューサシェーダおよびコンシューマシェーダの実行を同期化させることができ、その結果として、プロデューサシェーダがコンシューマシェーダによって使用されるべきグラフィックスデータを生成するまで、ＧＰＵはコンシューマシェーダを実行しない。
【０００４】
一例では、本開示は、グラフィックス処理ユニット（ＧＰＵ）を用いて、グラフィックスデータを作成するプロデューサシェーダを実行することと、ＧＰＵを用いて、プロデューサシェーダによって作成されたグラフィックスデータを第１のバッファの記憶ロケーションに記憶することとを含む方法について説明する。この方法は、グラフィックスデータの作成が完了すると、ＧＰＵ上で実行されるプロデューサシェーダを用いて、プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶することをさらに含む。
【０００５】
別の例では、本開示は、第１のバッファと、第２のバッファと、グラフィックス処理ユニット（ＧＰＵ）とを含む装置について説明する。ＧＰＵは、グラフィックスデータを作成するプロデューサシェーダを実行し、プロデューサシェーダによって作成されたグラフィックスデータを第１のバッファの記憶ロケーションに記憶するように動作可能である。ＧＰＵはまた、グラフィックスデータの作成が完了すると、ＧＰＵ上で実行されるプロデューサシェーダを用いて、プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶するように動作可能である。
【０００６】
別の例では、本開示は、第１のバッファと、第２のバッファと、グラフィックス処理ユニット（ＧＰＵ）とを含む装置について説明する。ＧＰＵは、グラフィックスデータを作成するプロデューサシェーダを実行するための手段と、プロデューサシェーダによって作成されたグラフィックスデータを第１のバッファの記憶ロケーションに記憶するための手段とを含む。ＧＰＵはまた、グラフィックスデータの作成が完了すると、ＧＰＵ上で実行されるプロデューサシェーダを用いて、プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶するための手段を含む。
【０００７】
別の例では、本開示は、非一時的なコンピュータ可読記憶媒体について説明する。非一時的なコンピュータ可読記憶媒体は、１つまたは複数のプロセッサに、グラフィックス処理ユニット（ＧＰＵ）を用いて、グラフィックスデータを作成するプロデューサシェーダを実行させ、ＧＰＵを用いて、プロデューサシェーダによって作成されたグラフィックスデータを第１のバッファの記憶ロケーションに記憶させる命令を含む。命令はまた、グラフィックスデータの作成が完了すると、ＧＰＵ上で実行されるプロデューサシェーダを用いて、プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶する命令を含む。
【０００８】
１つまたは複数の例の詳細は、添付の図面および以下の説明に記載されている。他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【０００９】
【図１】本開示の１つまたは複数の態様を実施するように動作可能であり得るグラフィックス処理ユニット（ＧＰＵ）の一例を示すブロック図。
【図２】本開示の１つまたは複数の態様を実施するために図１のＧＰＵを組み込むことができるコンピューティングデバイスの一例を示すブロック図。
【図３】図１に示す、本開示の１つまたは複数の態様によるＧＰＵの例示的な動作を示すフローチャート。
【発明を実施するための形態】
【００１０】
一般に、本開示は、グラフィックス処理ユニット（ＧＰＵ）の様々な処理の同期化に関する。本開示の技法は、一般に、メディアプレーヤなどのビデオデバイス、セットトップボックス、携帯電話などのワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ディスプレイデバイス、テレビジョンなどに適用可能である。
【００１１】
グラフィックスデータを処理するために、ＧＰＵは、様々なシェーダプログラムを起動、たとえば、実行する。場合によっては、１つのシェーダプログラムによって作成されたグラフィックスデータは、別のシェーダプログラムによって使用される。たとえば、ジオメトリシェーダは、グラフィックスデータを受け取り、プリミティブの頂点の座標ならびにプリミティブの頂点の色値および他の属性などの、複数のプリミティブに対するグラフィックスデータを作成することができる。ピクセルシェーダは、複数のプリミティブに対するグラフィックスデータを受け取り、シェーディング、イルミネーティング、およびブレンディングなどの、複数のプリミティブに対するグラフィックス処理を実行して、ディスプレイ上で表示するピクセルをレンダリングすることができる。
【００１２】
前出の例では、ジオメトリシェーダを「プロデューサ」シェーダの一例と見なすことができ、ピクセルシェーダを「コンシューマ」シェーダの一例と見なすことができる。いくつかの例では、プロデューサシェーダがグラフィックスデータを作成する前に、コンシューマシェーダがグラフィックスデータを使用しようとしないように、ＧＰＵは、プロデューサシェーダとコンシューマシェーダとを同期化する必要がある場合がある。たとえば、場合によっては、ＧＰＵは、いつプロデューサシェーダを実行するかを前もって知っていてもよいが、プロデューサシェーダがどのくらいのグラフィックスデータを作成するかを前もって知っていなくてもよい。プロデューサシェーダが作成するグラフィックスデータの量は可変であるので、ＧＰＵは、いつプロデューサシェーダがグラフィックスデータの作成を完了するかを前もって知っていなくてもよい。
【００１３】
さらに、いくつかの例では、複数のプロデューサシェーダ、および複数のコンシューマシェーダが存在し得る。これらの例のいくつかでは、グラフィックスデータに基づいて、コンシューマシェーダは、別のプロデューサシェーダがグラフィックスデータの作成を完了するまで、プロデューサシェーダのうちの１つからのグラフィックスデータを使用することができない場合がある。たとえば、ＧＰＵが第１のプロデューサシェーダを実行し、その後に、第２のプロデューサシェーダを実行すると仮定する。各プロデューサシェーダが作成するデータ量の可変性により、第１のプロデューサシェーダがグラフィックスデータの作成を完了する前に第２のプロデューサシェーダがグラフィックスデータの作成を完了する可能性があり得る。しかしながら、プロデューサシェーダの各々によって作成されたグラフィックスデータに基づいて、第２のコンシューマシェーダが第２のプロデューサシェーダからのグラフィックスデータを使用する前に、第１のコンシューマシェーダが第１のプロデューサシェーダからのグラフィックスデータを使用する必要がある場合がある。
【００１４】
いくつかの例では、ＧＰＵを含むデバイスはまた、プロデューサシェーダ記憶バッファと、プロデューサシェーダカウントバッファとを含み得る。プロデューサシェーダ記憶バッファおよびプロデューサシェーダカウントバッファは、同じメモリデバイスまたは異なるメモリデバイス内で形成され得る。
【００１５】
いくつかの例では、プロデューサシェーダ記憶バッファは、複数の記憶ロケーションを含み得る。ＧＰＵは、各記憶ロケーションを１つのプロデューサシェーダに割り当て得る。各プロデューサシェーダは、作成されたそのグラフィックスデータを、プロデューサシェーダ記憶バッファ内のそれに割り当てられた記憶ロケーションに記憶し得る。たとえば、第１のプロデューサシェーダによって作成されたグラフィックスデータを第１の記憶ロケーションに記憶することができ、第２のプロデューサシェーダによって作成されたグラフィックスデータを第２の記憶ロケーションに記憶することができる、などである。この例では、ＧＰＵは、第１の記憶ロケーションを第１のプロデューサシェーダに割り当てることができ、第２の記憶ロケーションを第２のプロデューサシェーダに割り当てることができる、などである（追加のプロデューサシェーダについても同様である）。
【００１６】
記憶ロケーションの各々のサイズ、たとえば、各記憶ロケーションが記憶することができるグラフィックスデータの量は、プロデューサシェーダが作成することができるグラフィックスデータの最大量に基づき得る。たとえば、ＧＰＵは、プロデューサシェーダがどのくらいのグラフィックスデータを作成するかを前もって知らなくてもよいが、ＧＰＵは、プロデューサシェーダが作成するグラフィックスデータの最大量を前もって知っていてもよい。一例として、任意のプロデューサシェーダが作成し得るグラフィックスデータの最大量は、４キロバイト（ＫＢ）である。したがって、この例では、ＧＰＵが実行するプロデューサシェーダごとに、ＧＰＵは、そのプロデューサシェーダにプロデューサシェーダ記憶バッファ内の４ＫＢの記憶ロケーションを割り当てて、そのプロデューサシェーダによって作成されたグラフィックスデータを記憶することができる。
【００１７】
プロデューサシェーダカウントバッファは、複数の記憶ロケーションも含み得る。ＧＰＵは、プロデューサシェーダカウントバッファ内の各記憶ロケーションを各プロデューサシェーダに割り当てることができる。ＧＰＵは、プロデューサシェーダカウントバッファ内の記憶ロケーションと、プロデューサシェーダ記憶バッファ内の記憶ロケーションとを、プロデューサシェーダに割り当てるので、同じプロデューサシェーダに割り当てられるプロデューサシェーダカウントバッファ内の各記憶ロケーションおよびプロデューサシェーダ記憶バッファ内の各記憶ロケーションは、互いに対応するものと見なされ得る。
【００１８】
プロデューサシェーダカウントバッファ内の記憶ロケーションの各々は、プロデューサシェーダ記憶バッファ内のそれに対応する記憶ロケーションに記憶されたグラフィックスデータの量を示す値を記憶し得る。言い換えれば、プロデューサシェーダカウントバッファ内の記憶ロケーションは、プロデューサシェーダカウントバッファ内のその記憶ロケーションに割り当てられたプロデューサシェーダによって作成されたグラフィックスデータの量を示す値を記憶し得る。
【００１９】
一例として、プロデューサシェーダカウントバッファ内の記憶ロケーションは、プロデューサシェーダによって作成されたプリミティブの数を示す値を記憶し得る。たとえば、上記で説明したように、ジオメトリシェーダは、複数のプリミティブに対するグラフィックスデータを作成し得る。この例では、ジオメトリシェーダに割り当てられたプロデューサシェーダカウントバッファ内の記憶ロケーションは、ジオメトリシェーダによって作成されたプリミティブの数を示す値を記憶し得る。したがって、プロデューサシェーダカウントバッファ内の割り当てられた記憶ロケーションに、ジオメトリシェーダによって作成されたプリミティブの数を示す値を記憶することは、ジオメトリシェーダがグラフィックスデータの作成を完了したことを示し得る。
【００２０】
いくつかの例では、各プリミティブに対するジオメトリシェーダによって作成されたグラフィックスデータのバイト数は一定であり得るが、ジオメトリシェーダによって作成されたプリミティブの数は可変であり得る。たとえば、ジオメトリシェーダによって作成された各プリミティブは１００バイトで定義され得るが、ジオメトリシェーダによって作成されたプリミティブの数は可変であり得る。
【００２１】
説明のために、一例として、第１のプロデューサシェーダ、たとえば、第１のジオメトリシェーダが５個のプリミティブのデータを作成し、かつ第２のプロデューサシェーダが１０個のプリミティブのデータを作成すると仮定する。また、各プリミティブが１００バイトで定義されると仮定する。この例では、第１のプロデューサシェーダに割り当てられたプロデューサシェーダカウントバッファ内の記憶ロケーションは５の値を記憶することができ、かつ第２のプロデューサシェーダに割り当てられたプロデューサシェーダカウントバッファ内の記憶ロケーションは１０の値を記憶することができる。また、この例では、第１のプロデューサシェーダに割り当てられたプロデューサシェーダ記憶バッファ内の記憶ロケーションは、５００バイトのグラフィックスデータ、たとえば、５個のプリミティブ＊プリミティブ当たり１００バイトを記憶することができ、かつ第２のプロデューサシェーダに割り当てられたプロデューサシェーダ記憶バッファ内の記憶ロケーションは、１キロバイトのグラフィックスデータ、たとえば、１０個のプリミティブ＊プリミティブ当たり１００バイトを記憶し得る。
【００２２】
例示的な実装形態のいくつかでは、プロデューサシェーダは、各プロデューサシェーダがグラフィックスデータの作成を完了した後、プロデューサシェーダ記憶バッファ内のそれに割り当てられた記憶ロケーションに記憶されたグラフィックスデータの量を示す値を出力することができる。たとえば、プロデューサシェーダがグラフィックスデータを作成しているとき、ＧＰＵは作成されたグラフィックスデータを、そのプロデューサシェーダに割り当てられたプロデューサシェーダ記憶バッファ内の記憶ロケーションに、記憶のために出力することができる。プロデューサシェーダがグラフィックスデータの作成を完了した後、プロデューサシェーダは次いで、そのプロデューサシェーダによって作成されたグラフィックスデータの量を示す値を、そのプロデューサシェーダに割り当てられたプロデューサシェーダカウントバッファの記憶ロケーション内に記憶することができる。
【００２３】
プロデューサシェーダがグラフィックスデータの作成を完了するまで、プロデューサシェーダに、プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を出力させる、少なくとも２つの異なる技法があり得る。一例として、プロデューサシェーダは、プロデューサシェーダが作成したプリミティブの量を示すカウンタ値を維持するように設計され得る。たとえば、プロデューサシェーダのプログラマは、プロデューサシェーダ用のソースコードを書くことができ、そのソースコードの一部は、プロデューサシェーダに、プロデューサシェーダが作成したプリミティブの量を示すカウンタ値を維持させる命令であってもよい。
【００２４】
コンパイラは、カウンタ値に対する命令を含むソースコードをコンパイルして、オブジェクトコードを生成し得る。コンパイルされたオブジェクトコードとして適用されるソースコードの命令は、実行されると、プロデューサシェーダに、プロデューサシェーダが作成する毎回のプリミティブの後でそのカウンタ値を増分させることができる。プロデューサシェーダがグラフィックスデータの作成を完了した後、プロデューサシェーダはカウンタ値を、そのプロデューサシェーダに割り当てられたカウントバッファ内の記憶ロケーションに出力することができる。たとえば、ソースコードは、ＧＰＵによって実行されると、プロデューサシェーダがグラフィックスデータの作成を完了した後に、プロデューサシェーダに、カウンタ値をそのプロデューサシェーダに割り当てられたカウントバッファ内の記憶ロケーションに出力させる命令を含み得る。
【００２５】
別の例として、プロデューサシェーダプログラムが、カウンタに対する命令をソースコード内に含めないことが考えられ得る。たとえば、いくつかのレガシーなプロデューサシェーダプログラムのソースコードは、カウンタ値に対する命令、またはグラフィックスデータの作成の完了後にカウンタ値を出力する命令を含まない場合がある。そのような例では、コンパイラは、コンパイル中に、プロデューサシェーダにカウンタ値を維持させ、プロデューサシェーダがグラフィックスデータの作成を完了した後に、作成されたグラフィックスデータの量を示すカウンタ値を出力させるオブジェクトコード命令を挿入することが可能であるように開発され得る。
【００２６】
たとえば、ＧＰＵ以外のプロセッサ上で実行されるコンパイラは、各プロデューサシェーダのソースコードをコンパイルするように構成することができ、また、ＧＰＵによって実行可能である命令、たとえば、プロデューサシェーダのオブジェクトコードを生成し、ＧＰＵにプロデューサシェーダの機能を実行させるように構成することができる。プロデューサシェーダの命令、たとえば、プロデューサシェーダのオブジェクトコードを生成する際、コンパイラは、実行されると、プロデューサシェーダに、プロデューサシェーダの機能を実行させる命令に加えて、実行されると、プロデューサシェーダに、プロデューサシェーダが作成したプリミティブの量を示すカウンタ値を維持させる命令を含み得る。コンパイラは、プロデューサシェーダがグラフィックスデータの作成を完了した後に、プロデューサシェーダに、プロデューサシェーダに含まれるカウンタ値をそのプロデューサシェーダに割り当てられたカウントバッファ内の記憶ロケーションに出力させる命令もプロデューサシェーダのオブジェクトコード内に含み得る。
【００２７】
このようにして、プロデューサシェーダのソースコードがカウンタ値（たとえば、カウンタ値に対する命令）を含まない例においてさえ、本開示の態様は、コンパイラがカウンタ値を生成するための命令をプロデューサシェーダのオブジェクトコード内に含むことを可能にし得る。たとえば、コンパイラは、プロデューサシェーダのソースコードをコンパイルして、オブジェクトコードを生成し得る。オブジェクトコードを生成するプロセスにおいて、コンパイラはカウンタ値に対する命令をオブジェクトコード内に含み得る。上記のように、カウンタ値は、プロデューサシェーダがグラフィックスデータを作成している間に、プロデューサシェーダによって作成されたグラフィックスデータの量をカウントし得る。
【００２８】
ＧＰＵは、プロデューサシェーダカウントバッファの記憶ロケーションの各々に記憶されたカウント値に基づいて、コンシューマシェーダを実行し得る。いくつかの例では、ＧＰＵは、各カウント値に対して１つのコンシューマシェーダを実行し得る。たとえば、プロデューサシェーダカウントバッファ内の記憶ロケーションが５のカウント値を記憶した場合、ＧＰＵは５つのコンシューマシェーダを実行して、プロデューサシェーダ記憶バッファ内の対応する記憶ロケーションに記憶されたグラフィックスデータを処理し得る。
【００２９】
いくつかの例では、プロデューサシェーダカウントバッファは、順序付きプロデューサシェーダカウントバッファと見なされ得る。たとえば、ＧＰＵは、プロデューサシェーダカウントバッファ内の第１の記憶ロケーションを第１のプロデューサシェーダに割り当てることができ、第１のプロデューサシェーダのグラフィックスデータは、任意の他のプロデューサシェーダからのグラフィックスデータが使用される前に、使用されるべきである。ＧＰＵは、プロデューサシェーダカウントバッファ内の第２の記憶ロケーションを第２のプロデューサシェーダに割り当てることができ、第２のプロデューサシェーダのグラフィックスデータは、第１のプロデューサシェーダの後にかつ他のプロデューサシェーダからのグラフィックスデータが使用される前に、使用されるべきである、などである。
【００３０】
このようにして、ＧＰＵは、グラフィックスデータが使用される準備ができる前にコンシューマシェーダを実行するのではなく、グラフィックスデータが使用される準備ができたときにコンシューマシェーダを実行することが可能であり得る。一例として、説明のために、ＧＰＵが第１のプロデューサシェーダを実行し、その後に、第２のプロデューサシェーダを実行すると仮定する。この例では、第１のプロデューサシェーダは、カウントバッファ内の第１の記憶ロケーションに割り当てられ、第２のプロデューサシェーダは、カウントバッファ内の第２の記憶ロケーションに割り当てられる。さらに、第１のプロデューサシェーダからのグラフィックスデータは、第２のプロデューサシェーダからのグラフィックスデータの前に使用されるべきであると仮定する。
【００３１】
この例では、第２のプロデューサシェーダは、第１のプロデューサシェーダの前に、グラフィックスデータの作成を完了した。したがって、プロデューサシェーダカウントバッファ内の第２の記憶ロケーションは、プロデューサシェーダカウントバッファ内の第１の記憶ロケーションの前に、値を記憶した。ＧＰＵは、たとえば、ＧＰＵが第１のプロデューサシェーダと第２のプロデューサシェーダとを実行した順序に基づいて、第１のプロデューサシェーダによって作成されたグラフィックスデータが、第２のプロデューサシェーダによって作成されたグラフィックスデータの前に使用されるべきであることを知ることができるので、この例では、ＧＰＵは、プロデューサシェーダカウントバッファ内の第１の記憶ロケーションが値を記憶するまで、コンシューマシェーダの実行を保留することができる。上記で説明したように、カウント値、たとえば、作成されたグラフィックスデータの量を示す値をプロデューサシェーダカウントバッファの記憶ロケーション内に記憶することは、その記憶ロケーションに割り当てられたプロデューサシェーダがグラフィックスデータの作成を完了したことを示す。
【００３２】
図１は、本開示の１つまたは複数の態様を実施するように動作可能であり得るグラフィックス処理ユニット（ＧＰＵ）１０の一例を示すブロック図である。ＧＰＵ１０は、グラフィックスパイプラインを実施して、ディスプレイ上のピクセルのピクセル値などのグラフィックスデータを生成し得る。たとえば、ＧＰＵ１０は、Ｋｈｒｏｎｏｓ  Ｇｒｏｕｐによって２００８年４月２４日に発表された、公開されているＯｐｅｎＧＬ  ＥＳ  ２．０仕様に記載されたグラフィックスパイプラインに類似したグラフィックスパイプラインを実施し得る。別の例として、本開示の態様は、グラフィックスパイプラインを定義するＭｉｃｒｏｓｏｆｔ（登録商標）ＤｉｒｅｃｔＸ（ＤＸ）１０および１１アプリケーションプログラミングインターフェース（ＡＰＩ）で実施され得る。グラフィックスパイプラインは、ＧＰＵ１０上で実行されるソフトウェア、ＧＰＵ１０上で実行されるファームウェア、ＧＰＵ１０上に形成された１つまたは複数のハードウェアユニット、またはそれらの組合せとして実施され得る。ＧＰＵ１０は、他のグラフィックスパイプラインも実施することができ、本開示の態様は、ＯｐｅｎＧＬ  ＥＳ  ２．０仕様のグラフィックスパイプライン、またはＤＸ１０および１１  ＡＰＩに限定されるものと見なされるべきではない。
【００３３】
ＧＰＵ１０の例には、限定はしないが、デジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、または他の等価な集積回路もしくはディスクリート論理回路がある。図１に示すように、ＧＰＵ１０は、コントローラ１２と、ジオメトリシェーダカウントバッファ１８と、ジオメトリシェーダバッファ２０と、使用カウントバッファ２２とを含み得る。また、図１に示すように、ＧＰＵ１０は、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４の１つまたは複数のインスタンスを実行し得る。
【００３４】
ＧＰＵ１０は、グラフィックスパイプラインを形成する追加のユニットまたはモジュールを含み得る。ただし、明快のために、そのような追加のユニットまたはモジュールは図１に示されていない。さらに、ジオメトリシェーダカウントバッファ１８、ジオメトリシェーダバッファ２０、および使用カウントバッファ２２は、ＧＰＵ１０の内部にあるものとして示されているが、本開示の態様はそのように限定されない。代替例では、ジオメトリシェーダカウントバッファ１８、ジオメトリシェーダバッファ２０、および使用カウントバッファ２２のうちの１つまたは複数は、ＧＰＵ１０の外部にあってもよい。たとえば、ジオメトリシェーダバッファ２０に記憶されるべきグラフィックスデータの量は、ＧＰＵ１０上で利用可能な記憶スペースの量よりも大きいことが考えられ得る。これらの例では、ジオメトリシェーダバッファ２０は、ＧＰＵ１０の外部にあってもよい。代替として、いくつかの例では、ジオメトリシェーダカウントバッファ１８およびジオメトリシェーダバッファ２０は共通バッファの一部である、たとえば、１つのバッファがジオメトリシェーダカウントバッファ１８とジオメトリシェーダバッファ２０の両方を含むことが考えられ得る。さらに、使用カウントバッファ２２は、以下で説明するように、さらなる同期化支援をコントローラ１２に潜在的に与え得るが、ＧＰＵ１０のすべての例で必要でなくてもよい。
【００３５】
ＧＰＵ１０のコントローラ１２は、ハードウェアユニットまたはＧＰＵ１０上で実行されるソフトウェアユニットであってもよい。説明のために、コントローラ１２については、ハードウェアユニットであるという文脈で説明する。コントローラ１２は、いつＧＰＵ１０が１つまたは複数の頂点シェーダ１４と、ジオメトリシェーダ１６と、ピクセルシェーダ２４とを実行すべきかを決定し得る。コントローラ１２はまた、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４の何個のインスタンシエーションをＧＰＵ１０が実行すべきかを決定し得る。
【００３６】
頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４は、ＧＰＵ１０上で実行されるソフトウェアユニットであってもよい。説明のために、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４は、ＧＰＵ１０内に常駐するものとして示されている。ただし、これは、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４がＧＰＵ１０によって実行されることを説明するためである。頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４に対する命令は、ＧＰＵ１０の外部にある記憶デバイスに記憶され得る。たとえば、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４に対するコンパイルされたオブジェクトコードまたはソースコードは、ＧＰＵ１０の外部にある記憶デバイスに記憶され得る。
【００３７】
本開示で説明するように、頂点シェーダ１４、ジオメトリシェーダ１８、およびピクセルシェーダ２４は一般にＧＰＵ１０によって実行される機能ユニットの形態をとり得ることを理解されたい。そのような機能ユニットは、シェーダの特定の機能的態様を強調するために別々に説明され、必ずしもそのような態様を別々に構造化し、構成し、またはコード化しなければならないことを暗示するとは限らない。したがって、そのような機能的態様を一体にまたは別々に形成し、１つのＧＰＵもしくは複数のＧＰＵ、または複数のＧＰＵコア上で実行してもよく、本明細書はそのような機能的態様の実施に関して限定するものと見なされるべきではない。
【００３８】
いくつかの例では、コントローラ１２は、ディスプレイ上で表示されるべき画像の属性を受け取り得る。たとえば、ＧＰＵ１０の外部にあるプロセッサ（図示せず）は、ディスプレイ上で表示されるべき画像を生成し得る。プロセッサは、画像を１つまたは複数のプリミティブに分割することができ、１つまたは複数のプリミティブは、一例として、三角形などの多角形であってもよい。プロセッサは、多角形の頂点の各々の頂点属性を決定し得る。たとえば、プロセッサは、頂点の各々の頂点座標と、色値、たとえば、赤緑青（ＲＧＢ）色値またはルーマ値およびクロマ値とを決定し得る。プロセッサは、頂点の各々の頂点属性をＧＰＵ１０のコントローラ１２に送信し得る。
【００３９】
コントローラ１２は、たとえば、プロセッサから受け取った属性に基づいて、頂点シェーダ１４の何個のインスタンシエーションがＧＰＵ１０によって実行されるべきかを決定し得る。たとえば、図１に示すように、ＧＰＵ１０は頂点シェーダ１４Ａ〜１４Ｎを実行し得る。頂点シェーダ１４Ａ〜１４Ｎの各々は、グラフィックスデータの異なるセットに対して、同様の機能を実行し得る。たとえば、ＧＰＵ１０の外部にある記憶デバイスは、頂点シェーダに対する命令を記憶し得る。ＧＰＵ１０は、頂点シェーダ１４Ａ〜１４Ｎとして表されている、コントローラ１２によって決定された頂点シェーダの命令の複数のインスタンスを実行し得る。
【００４０】
いくつかの例では、コントローラ１２は、ＧＰＵ１０に、各プリミティブに対して頂点シェーダ１４のうちの１つを実行させることができる。たとえば、コントローラ１２は、ＧＰＵ１０に頂点シェーダ１４Ａを実行させて、第１のプリミティブを処理することができ、ＧＰＵ１０に頂点シェーダ１４Ｂを実行させて、第２のプリミティブを処理することができる、などである。このようにして、ＧＰＵ１０は、頂点シェーダ１４の複数のインスタンスを並列に実行することが可能であり得る。ただし、本開示の態様はそのように限定されない。コントローラ１２は、必ずしも、ＧＰＵ１０に、各プリミティブに対して頂点シェーダ１４のうちの１つを実行させなくてもよい。
【００４１】
頂点シェーダ１４は、実行されると、多角形の頂点の受け取った座標をディスプレイの座標に変換することができ、かつ頂点の光値を決定することができる。たとえば、頂点シェーダ１４は、受け取った多角形を回転させ、スケーリングして、プリミティブを生成することができる。頂点シェーダ１４の出力は、プリミティブの頂点の属性とすることができる。頂点シェーダ１４は、頂点シェーダ１４によって決定された頂点の属性をジオメトリシェーダ１６に送信することができる。
【００４２】
頂点シェーダ１４と同様に、ＧＰＵ１０の外部にある記憶デバイスは、ジオメトリシェーダに対する命令を記憶し得る。コントローラ１２は、たとえば、頂点シェーダ１４によって生成されたプリミティブの数に基づいて、ジオメトリシェーダ１６Ａ〜１６Ｍとして表される、ジオメトリシェーダ１６の何個のインスタンシエーションをＧＰＵ１０が実行すべきかを決定し得る。いくつかの例では、ＧＰＵ１０が実行すべきジオメトリシェーダ１６の数は、ＧＰＵ１０が実行した頂点シェーダ１４の数と同じであってもよい。ただし、本開示の態様はそのように限定されない。ジオメトリシェーダ１６Ａ〜１６Ｍは、異なるデータに対して同様の機能を実行し得る。
【００４３】
ジオメトリシェーダ１６の各々は、頂点シェーダ１４のうちの１つから単一のプリミティブに関する頂点の頂点属性を受け取り得る。いくつかの例では、ジオメトリシェーダ１６は、単一のプリミティブを１つまたは複数のプリミティブにさらに分割し得る。たとえば、ジオメトリシェーダ１６Ａは、単一の三角形の頂点を受け取ることができ、単一の三角形を分割して５つの三角形を作成することができる。ジオメトリシェーダ１６は、ジオメトリシェーダ１６によって作成されたプリミティブの頂点の各々について、属性、たとえば、色と座標とを決定することもできる。頂点およびそれに対応する属性を含む、ジオメトリシェーダ１６によって作成されたプリミティブは、ジオメトリシェーダ１６によって作成されたグラフィックスデータと呼ばれ得る。
【００４４】
いくつかの例では、ジオメトリシェーダ１６の各々が作成し得るプリミティブの数は未知であってもよい。また、いつジオメトリシェーダ１６の各々がプリミティブの作成を終了するかは未知であってもよい。たとえば、コントローラ１２は、ＧＰＵ１０が２つのジオメトリシェーダ１６、たとえば、ジオメトリシェーダ１６Ａとジオメトリシェーダ１６Ｂとを実行すべきであると判定することができ、ＧＰＵ１０にジオメトリシェーダ１６Ａとジオメトリシェーダ１６Ｂとを実行させることができる。この例では、コントローラ１２は、ジオメトリシェーダ１６Ａが何個のプリミティブを作成するか、およびジオメトリシェーダ１６Ｂが何個のプリミティブを作成するかを知らなくてもよい。
【００４５】
コントローラ１２は、ジオメトリシェーダ１６のプログラミングに基づいて、プリミティブを表すために何個のバイトが使用されるかを知っていてもよい。たとえば、ジオメトリシェーダ１６によって生成されたプリミティブの各々を１００バイトで表すことができ、たとえば、１００バイトは、ジオメトリシェーダ１６のうちの１つによって生成されたプリミティブの頂点と属性とを表す。ただし、コントローラ１２は、ジオメトリシェーダ１６が何個のプリミティブを作成し得るかを知らなくてもよいので、コントローラ１２は、ジオメトリシェーダ１６が作成し得るバイト総数を知らなくてもよい。
【００４６】
また、コントローラ１２は、いつジオメトリシェーダ１６の各々がプリミティブの作成を完了するかを知らなくてもよい。たとえば、コントローラ１２は、ＧＰＵ１０に、最初にジオメトリシェーダ１６Ａを実行させ、次いでジオメトリシェーダ１６Ｂを実行させ得る。この例では、ジオメトリシェーダ１６Ａがそのプリミティブの作成を完了する前に、ジオメトリシェーダ１６Ｂがそのプリミティブの作成を完了することが考えられ得る。
【００４７】
これらの不確実性、たとえば、ジオメトリシェーダ１６が作成するグラフィックスデータの量、およびいつジオメトリシェーダ１６がグラフィックスデータの作成を完了するかは、いつ１つまたは複数のピクセルシェーダ２４を実行するかをコントローラ１２が決定するのを困難にする場合がある。ピクセルシェーダ２４は、ジオメトリシェーダ１６によって作成されたグラフィックスデータ、たとえば、プリミティブと対応する属性とを使用し得る。したがって、ジオメトリシェーダ１６のうちの１つまたは複数は「プロデューサ」シェーダの例とすることができ、１つまたは複数のピクセルシェーダ２４は「コンシューマ」シェーダの例とすることができる。
【００４８】
言い換えれば、１つまたは複数のプロデューサシェーダは、１つまたは複数のコンシューマシェーダによって使用されるグラフィックスデータを作成することができる。プロデューサシェーダの１つの非限定的な例はジオメトリシェーダ１６であり、コンシューマシェーダの１つの非限定的な例はピクセルシェーダ２４である。本開示で説明する例は、ジオメトリシェーダ１６をプロデューサシェーダであるものとして、ピクセルシェーダ２４をコンシューマシェーダであるものとして説明しているが、本開示の態様はそのように限定されない。一般に、本開示で説明する例示的な技法は、可変量のグラフィックスデータを作成する任意のシェーダに拡張可能であってもよく、かつ作成された可変量のグラフィックスデータを使用すべきである任意のシェーダに拡張可能であってもよい。本開示で説明する例示的な技法は、プロデューサシェーダおよびコンシューマシェーダの実行の同期化が望ましい場合がある任意のグラフィックスシステムに拡張可能であってもよい。
【００４９】
１つまたは複数のピクセルシェーダ２４の各々によって使用されるべきデータが利用可能になった後に、ＧＰＵ１０が１つまたは複数のピクセルシェーダ２４を実行することが有利であり得る。たとえば、実行されたピクセルシェーダ２４によって使用されるべきグラフィックスデータが利用可能になる前に、コントローラ１２がＧＰＵ１０に１つまたは複数のピクセルシェーダ２４を実行させた場合、使用されるべきグラフィックスデータが利用可能になるまで、これらの実行されたピクセルシェーダ２４は、アイドル状態、たとえば、「ビジーウェイト」状態のままであり得る。「ビジーウェイト」状態では、実行されたピクセルシェーダ２４は、使用されるべきグラフィックスデータを待機しながらループ内に留まり、グラフィックスデータが利用可能になると「ビジーウェイト」状態を出てから、グラフィックスデータを使用する。グラフィックスデータを使用する際に実行されたピクセルシェーダ２４によって使用されることになるレジスタまたは割り当てられたメモリなどの、ＧＰＵ１０のハードウェアユニットは、実行されたピクセルシェーダ２４がグラフィックスデータを使用するのを待機している間は他のタスクに利用できないので、「ビジーウェイト」状態は望ましくない場合がある。
【００５０】
本開示で説明する例示的な技法のいくつかは、１つまたは複数のピクセルシェーダ２４によって使用されるべきグラフィックスデータが利用可能になった後に、ＧＰＵ１０が１つまたは複数のピクセルシェーダ２４を実行するように、コントローラ１２が１つまたは複数のピクセルシェーダ２４の実行を同期化するのを可能にし得る。図１に示すように、ＧＰＵ１０は、ジオメトリシェーダカウントバッファ１８を含み得る。ジオメトリシェーダカウントバッファ１８は、複数の記憶ロケーションを含み得る。たとえば、ジオメトリシェーダカウントバッファ１８は、ＧＰＵ１０のレジスタまたはローカルメモリの一部、たとえば、内部キャッシュであってもよい。いくつかの例では、コントローラ１２およびＧＰＵ１０は、外部システムバスを介したアクセスを必要とすることなく、ジオメトリシェーダカウントバッファ１８のコンテンツに比較的迅速にアクセスすることが可能であってもよい。上記で説明したように、いくつかの例では、ジオメトリシェーダ１６はプロデューサシェーダの例とすることができる。したがって、ジオメトリシェーダカウントバッファ１８は、プロデューサシェーダカウントバッファと呼ばれ得る。
【００５１】
コントローラ１２は、ジオメトリシェーダカウントバッファ１８の複数の記憶ロケーションの各々を、実行されたジオメトリシェーダ１６の各々に割り当てることができる。たとえば、コントローラ１２は、ジオメトリシェーダカウントバッファ１８の第１の記憶ロケーションを実行されたジオメトリシェーダ１６のうちの１つに割り当てることができ、ジオメトリシェーダカウントバッファ１８の第２の記憶ロケーションを実行されたジオメトリシェーダ１６のうちの別の１つに割り当てることができる、などである。実行されたジオメトリシェーダ１６の各々は、それが作成したグラフィックスデータの量を示す値を、ジオメトリシェーダカウントバッファ１８のそれに割り当てられた記憶ロケーションに記憶し得る。一例として、実行されたジオメトリシェーダ１６のうちの１つによって作成されたグラフィックスデータの量を示す値は、ジオメトリシェーダ１６のうちのその１つによって作成されたプリミティブの量の値であってもよい。
【００５２】
いくつかの例では、実行されたジオメトリシェーダ１６の各々は、それがグラフィックスデータの作成を完了した後に、ジオメトリシェーダ１６のうちのその１つによって作成されたグラフィックスデータの量を示す値を記憶することができる。たとえば、図１に示すように、ジオメトリシェーダ１６は、それが作成したグラフィックスデータを、グラフィックスデータが作成されているときに、ジオメトリシェーダバッファ２０に出力することができる。たとえば、ジオメトリシェーダ１６Ａは、３つのプリミティブを作成することができ、ジオメトリシェーダ１６Ａが各プリミティブに対するグラフィックスデータの作成を完了した後に、各プリミティブのグラフィックスデータをジオメトリシェーダバッファ２０に出力することができる。次いで、ジオメトリシェーダ１６Ａは、ジオメトリシェーダ１６Ａが第３のプリミティブに対するグラフィックスデータの作成を完了した後に、（出力データとしての３つのプリミティブを示す）３の値を、ジオメトリシェーダ１６Ａに割り当てられたジオメトリシェーダカウントバッファ１８の記憶ロケーションに記憶することができる。
【００５３】
いくつかの例では、ジオメトリシェーダ１６は、作成されたグラフィックスデータの量をカウントする、たとえば、作成されたプリミティブの数をカウントするように動作可能であり得るので、ジオメトリシェーダ１６に、作成されたグラフィックスデータの量を示す値を記憶するタスクを課すことができる。そうでない場合は、コントローラ１２などの別のユニットが、ジオメトリシェーダ１６によって作成されたプリミティブの量を追跡する必要があり得るが、このことは非効率的である場合があり、処理能力を不必要に使用する場合がある。
【００５４】
また、上記のように、コントローラ１２は、何個のプリミティブをジオメトリシェーダ１６が作成し得るかを知らなくてもよい。したがって、いくつかの例では、ジオメトリシェーダ１６は、いつそれがグラフィックスデータの作成を完了したかを知るので、ジオメトリシェーダ１６は、作成されたグラフィックスデータの量を示す値を記憶するように好適なものとすることができる。
【００５５】
たとえば、この例では、ジオメトリシェーダ１６Ａが第１のプリミティブまたは第２のプリミティブのグラフィックスデータの作成を完了した後に、ジオメトリシェーダ１６が、ジオメトリシェーダ１６によって作成されたグラフィックスデータの量を示す値をまだ記憶していない場合がある。むしろ、ジオメトリシェーダ１６Ａは、それが３つすべてのプリミティブに対するグラフィックスデータの作成を完了するまで待機してから、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータの量を示す値を記憶し得る。したがって、作成されたグラフィックスデータの量を示す値をジオメトリシェーダカウントバッファ１８の記憶ロケーションに記憶することは、ジオメトリシェーダカウントバッファ１８のその記憶ロケーションに割り当てられた、ジオメトリシェーダ１６のうちのジオメトリシェーダが、そのグラフィックスデータの作成を完了したことを示し得る。
【００５６】
グラフィックスデータの作成を完了するまで、実行されたジオメトリシェーダ１６が、作成されたグラフィックスデータの量を示す値を記憶しないことを保証する、少なくとも２つの技法が存在し得る。１つの例示的な技法として、ジオメトリシェーダ１６はカウンタを用いて設計され得る。たとえば、ジオメトリシェーダ１６に対するソースコードを書くプログラマは、カウンタを維持するために、ジオメトリシェーダ１６に対するソースコード内に命令を含めることができる。
【００５７】
コンパイルされたバージョンのソースコードは、ジオメトリシェーダ１６に、各プリミティブを作成した後にそのカウンタ値を増分させて、ジオメトリシェーダ１６によって作成されたグラフィックスデータの量、たとえば、作成されたプリミティブの数を示すことができる。ソースコードは、ジオメトリシェーダ１６がグラフィックスデータの作成を完了した後に、ジオメトリシェーダ１６に、カウンタ値を、ジオメトリシェーダカウントバッファ１８内のそれに割り当てられた記憶ロケーションに出力させる命令を含むこともできる。
【００５８】
ただし、いくつかの例では、ジオメトリシェーダ１６がカウンタを用いて設計されていなかったこと、たとえば、カウンタがジオメトリシェーダ１６のソースコードの一部ではないことが考えられ得る。たとえば、レガシーなジオメトリシェーダ１６に対するソースコードは、カウンタを用いて設計されていない場合がある。これらの事例では、コンパイラがジオメトリシェーダ１６内にカウンタを含むように設計され得る。たとえば、プロセッサ（図示せず）は、ジオメトリシェーダに対するソースコードをコンパイルして、ＧＰＵ１０によって実行可能なオブジェクトコードを生成するコンパイラを実行中であり得る。コンパイルされたジオメトリシェーダのインスタンシエーション（ｉｎｓｔａｎｔｉａｔｉｏｎ）は、ジオメトリシェーダ１６であり得る。コンパイル中に、コンパイラは、実行されたジオメトリシェーダがプリミティブを作成した後に増分するカウンタを維持する命令をジオメトリシェーダ１６のオブジェクトコード内に含み得る。コンパイラはまた、グラフィックスデータの作成が完了した後に、カウンタ値を、ジオメトリシェーダカウントバッファ１８内の割り当てられた記憶ロケーションに記憶する命令をジオメトリシェーダのオブジェクトコード内に含み得る。このようにして、ジオメトリシェーダ１６がカウンタを用いて設計されていなかったときでも、たとえば、カウンタ値がジオメトリシェーダ１６に対するソースコードの一部ではない場合でも、実行されたジオメトリシェーダ１６は、作成されたグラフィックスデータの量を示す値を記憶することが可能であり得る。
【００５９】
上記の例示的な技法のいずれにおいても、コンパイラは、ソースコードをコンパイルして、ＧＰＵ１０によって実行可能な、ジオメトリシェーダ１６に対するオブジェクトコードを生成することができる。第１の例示的な技法では、ジオメトリシェーダ１６に対するソースコードは、カウンタ値を維持する命令をすでに含むことができ、グラフィックスデータの作成の完了時に、ジオメトリシェーダ１６にカウンタ値を出力させる命令を含むこともできる。コンパイラは、カウンタに対するソースコード命令と、グラフィックスデータの作成の完了時に、ジオメトリシェーダ１６にカウンタ値を出力させる命令とをコンパイルして、実行可能なオブジェクトコードを生成することができる。
【００６０】
第２の例示的な技法では、ジオメトリシェーダ１６に対するソースコードは、カウンタ値を維持する命令を含まなくてもよく、グラフィックスデータの作成の完了時に、ジオメトリシェーダ１６にカウンタ値を出力させる命令を含まなくてもよい。この例では、コンパイラは、カウンタに対する、オブジェクトコードへのアドインとしてのオブジェクトコード命令と、グラフィックスデータの作成の完了時に、ジオメトリシェーダ１６にカウンタ値を出力させるオブジェクトコード命令とをプロアクティブに（ｐｒｏａｃｔｉｖｅｌｙ）含むように設計され得る。このようにして、レガシーなジオメトリシェーダ１６の場合でも、コンパイラは、ジオメトリシェーダ１６にカウンタ値を維持させ、グラフィックスデータの作成の完了時に、カウンタ値を出力させる、ＧＰＵ１０によって実行可能なオブジェクトコードを生成することが可能であり得る。
【００６１】
コントローラ１２は、ジオメトリシェーダカウントバッファ１８に記憶された値に基づいて、何個のピクセルシェーダ２４を実行するかを決定することができる。たとえば、頂点シェーダ１４およびジオメトリシェーダ１６と同様に、ＧＰＵ１０の外部にある記憶デバイスは、ピクセルシェーダに対する命令、たとえば、ピクセルシェーダに対するオブジェクトコードまたはソースコードを記憶することができる。コントローラ１２は、ピクセルシェーダ２４Ａ〜２４Ｘとして表される、ピクセルシェーダ２４の１つまたは複数のインスタンスを実行し得る。ピクセルシェーダ２４は、異なるグラフィックスデータに対して同様の機能を実行し得る。ピクセルシェーダ２４は、ジオメトリシェーダ１６によって作成されたプリミティブを受け取り、受け取ったプリミティブに対して、ラスタライジング、シェーディング、ブレンディング、イルミネーティング、および他のグラフィックス関連の機能などの、１つまたは複数の機能を実行し得る。ピクセルシェーダ２４の出力は、ディスプレイに表示されるべきピクセルのピクセル値であり得る。
【００６２】
コントローラ１２は、ジオメトリシェーダカウントバッファ１８に記憶された値に基づいて、ピクセルシェーダ２４の何個のインスタンスを実行するかを決定することができる。一例として、コントローラ１２は、ジオメトリシェーダ１６の各々によって生成された各プリミティブに対して、ピクセルシェーダ２４のうちの１つを実行し得る。たとえば、ジオメトリシェーダカウントバッファ１８の第１の記憶ロケーションが５の値を記憶し、ジオメトリシェーダカウントバッファ１８の第２の記憶ロケーションが６の値を記憶し、ジオメトリシェーダカウントバッファ１８の第３の記憶ロケーションが１０の値を記憶し、ジオメトリシェーダカウントバッファ１８の第４の記憶ロケーションが１の値を記憶したと仮定する。また、ジオメトリシェーダカウントバッファ１８の第１から第４の記憶ロケーションがそれぞれ、ジオメトリシェーダ１６Ａ〜１６Ｄに割り当てられると仮定する。
【００６３】
この例では、コントローラ１２は、それぞれがジオメトリシェーダ１６Ａによって作成された５つのプリミティブのうちの１つのグラフィックスデータを使用する、ピクセルシェーダ２４の５つのインスタンスを実行し得る。次いで、コントローラ１２は、それぞれがジオメトリシェーダ１６Ｂによって作成された６つのプリミティブのうちの１つのグラフィックスデータを使用する、ピクセルシェーダ２４の６つのインスタンスを実行し、次いで、それぞれがジオメトリシェーダ１６Ｃによって作成された１０個のプリミティブのうちの１つのグラフィックスデータを使用する、ピクセルシェーダ２４の１０個のインスタンスを実行し、それに続いて、ジオメトリシェーダ１６Ｄによって作成された１つのプリミティブのグラフィックスデータを使用する、ピクセルシェーダ２４の１つのインスタンスを実行し得る。
【００６４】
コントローラ１２は、必ずしも、ピクセルシェーダ２４の第１のインスタンスの実行が完了するまで待機してから、ピクセルシェーダ２４の次のインスタンスの実行を開始する必要はない。たとえば、前の例では、コントローラ１２は、ピクセルシェーダ２４の第１の５つのインスタンスの実行が完了するまで待機してから、ピクセルシェーダ２４の次の６つのインスタンスの実行を開始しなくてもよい。コントローラ１２は、ピクセルシェーダ２４の第１のインスタンスを実行してもよく、いくつかの例では、ピクセルシェーダ２４の第１のインスタンスが実行中である間に、ピクセルシェーダ２４の次のインスタンスの実行を開始してもよい。言い換えれば、いくつかの例では、ＧＰＵ１０は、ピクセルシェーダ２４の複数のインスタンスを並行して実行し得る。
【００６５】
いくつかの例では、ジオメトリシェーダ１６のうちの１つによって生成されたグラフィックスデータは、ジオメトリシェーダ１６のうちの別の１つからのグラフィックスデータの前に使用される必要があり得る。たとえば、ジオメトリシェーダ１６のうちの２つのジオメトリシェーダは、重複するプリミティブに対するグラフィックスデータを作成する場合がある。この例では、重複されるプリミティブに対するグラフィックスデータは、ピクセルシェーダ２４が、重複するプリミティブの色と重複されるプリミティブの色とを適切にブレンドすることができるように、重複するプリミティブに対するグラフィックスデータの前に使用される必要があり得る。しかしながら、重複されるプリミティブを作成したジオメトリシェーダ１６のうちのジオメトリシェーダが、そのプリミティブの作成を完了する前に、重複するプリミティブを作成したジオメトリシェーダ１６のうちのジオメトリシェーダが、そのプリミティブの作成を完了したことが考えられ得る。
【００６６】
ジオメトリシェーダ１６によって作成されたグラフィックスデータが適切な順序で使用されることを保証するために、ジオメトリシェーダカウントバッファ１８は順序付きカウントバッファとして機能し得る。たとえば、コントローラ１２は、ジオメトリシェーダカウントバッファ１８内の記憶ロケーション、たとえば、第１の記憶ロケーションを、ジオメトリシェーダ１６の第１のジオメトリシェーダに割り当てることができ、第１のジオメトリシェーダのグラフィックスデータは、任意の他のジオメトリシェーダ１６からのグラフィックスデータが使用される前に使用されるべきである。コントローラ１２は、ジオメトリシェーダカウントバッファ１８内の別の記憶ロケーション、たとえば、第２の記憶ロケーションを、ジオメトリシェーダ１６の第２のジオメトリシェーダに割り当てることができ、第２のジオメトリシェーダのグラフィックスデータは、ジオメトリシェーダ１６の第１のジオメトリシェーダの後、かつ任意の他のジオメトリシェーダ１６からのグラフィックスデータが使用される前に使用されるべきである、などである。
【００６７】
順序付きカウントバッファを用いると、コントローラ１２は、コントローラ１２がピクセルシェーダ２４を実行して、使用されるべき順序でグラフィックスデータを使用することを保証することができる。たとえば、コントローラ１２は、ジオメトリシェーダカウントバッファ１８内の記憶ロケーションに記憶された値を監視し得る。コントローラ１２は、グラフィックスデータが最初に使用されるべきであるジオメトリシェーダ１６のうちのジオメトリシェーダに割り当てられた、ジオメトリシェーダカウントバッファ１８内の記憶ロケーションが、作成されたグラフィックスデータを示す値を記憶するまで、１つまたは複数のピクセルシェーダ２４を実行するのを待機し得る。
【００６８】
いくつかの事例では、グラフィックスデータが最初に使用されるべきであるジオメトリシェーダ１６のうちのジオメトリシェーダに割り当てられた、ジオメトリシェーダカウントバッファ１８内の記憶ロケーションが、作成されたグラフィックスデータの量を示す値を記憶する前に、ジオメトリシェーダカウントバッファ１８内の記憶ロケーションが、作成されたグラフィックスデータの量を示す値を記憶することが考えられ得る。これらの事例では、コントローラ１２は、グラフィックスデータが最初に使用されるべきであるジオメトリシェーダ１６のうちのジオメトリシェーダに割り当てられた、ジオメトリシェーダカウントバッファ１８内の記憶ロケーションが、作成されたグラフィックスデータの量を示す値を記憶するまで、１つまたは複数のピクセルシェーダ２４を実行しない場合がある。
【００６９】
例示的な例として、ＧＰＵ１０がジオメトリシェーダ１６Ａと１６Ｂとを実行すると仮定する。また、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータが、ジオメトリシェーダ１６Ｂによって作成されたグラフィックスデータの前に使用されるべきであると仮定する。コントローラ１２は、ジオメトリシェーダカウントバッファ１８内の第１の記憶ロケーションをジオメトリシェーダ１６Ａに割り当てることができ、ジオメトリシェーダカウントバッファ１８内の第２の記憶ロケーションをジオメトリシェーダ１６Ｂに割り当てることができる。
【００７０】
この例示的な例では、ジオメトリシェーダ１６Ｂは、ジオメトリシェーダ１６Ａの前にグラフィックスデータの作成を完了した。したがって、ジオメトリシェーダカウントバッファ１８内の第１の記憶ロケーションが、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータの量を示す値を記憶する前に、ジオメトリシェーダカウントバッファ１８内の第２の記憶ロケーションは、ジオメトリシェーダ１６Ｂによって作成されたグラフィックスデータの量を示す値を記憶することができる。ジオメトリシェーダカウントバッファ１８の第２の記憶ロケーションは値を記憶することができるが、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータが最初に使用されるべきであり、ジオメトリシェーダ１６Ａがグラフィックスデータの作成をまだ完了していないので、コントローラ１２は、１つまたは複数のピクセルシェーダ２４をまだ実行していない場合がある。ジオメトリシェーダカウントバッファ１８内の第１の記憶ロケーションが、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータの量を示す値をこれから記憶しなければならないので、コントローラ１２は、ジオメトリシェーダ１６Ａがグラフィックスデータの作成をまだ完了していないことを知ることができる。上記で説明したように、ジオメトリシェーダカウントバッファ１８内の記憶ロケーションは、それに割り当てられたジオメトリシェーダ１６がグラフィックスデータの作成を完了した後に、値を記憶する。
【００７１】
このようにして、コントローラ１２は、１つまたは複数のピクセルシェーダ２４およびジオメトリシェーダ１６の実行を同期化することができる。たとえば、本開示で説明する例示的な技法のいくつかを利用して、コントローラ１２は、グラフィックスデータが使用のために利用可能であるときに、ＧＰＵ１０が１つまたは複数のピクセルシェーダ２４を実行することを保証し得る。また、本開示で説明する例示的な技法のいくつかを利用して、コントローラ１２は、ピクセルシェーダ２４が、利用可能であるときにグラフィックスデータを使用するだけでなく、グラフィックスデータが使用されるべき順序でグラフィックスデータを使用することも保証し得る。
【００７２】
使用カウントバッファ２２は、１つまたは複数のピクセルシェーダ２４の実行を同期化する際にコントローラ１２をさらに支援し得る。ジオメトリシェーダカウントバッファ１８と同様に、使用カウントバッファ２２は、ＧＰＵ１０のレジスタまたはローカルメモリの一部、たとえば、内部キャッシュであってもよい。使用カウントバッファ２２は、ＧＰＵ１０のすべての例において必要であるとは限らない。
【００７３】
使用カウントバッファ２２は、カウンタ用カウンタ（counter-of-counters）として機能し得る。たとえば、使用カウントバッファ２２は、いくつかの事例では、何個のジオメトリシェーダ１６が、まだ使用されていないグラフィックスデータを作成したかを示す値を記憶することができる。使用カウントバッファ２２の値は、最初はゼロであってもよい。コントローラ１２は、ジオメトリシェーダ１６のうちのジオメトリシェーダが、作成されたグラフィックスデータの量を示す値を、ジオメトリシェーダカウントバッファ１８内のそれに割り当てられた記憶ロケーションに記憶したときに、使用カウントバッファ２２の値を増分することができる。コントローラ１２は、ジオメトリシェーダ１６のうちのジオメトリシェーダによって作成されたグラフィックスデータが使用された後に、使用カウントバッファ２２の値を減分することができる。
【００７４】
いくつかの例では、コントローラ１２は、グラフィックスデータが最初に使用されるべきであるジオメトリシェーダ１６のうちのジオメトリシェーダが、作成されたグラフィックスデータの量を示す値を、ジオメトリシェーダカウントバッファ１８内のそれに割り当てられた記憶ロケーションに記憶した後に、使用カウントバッファ２２の値を増分することができる。たとえば、上記の例示的な例を用いて続けると、ジオメトリシェーダ１６Ｂが、ジオメトリシェーダ１６Ａの前に、値をジオメトリシェーダカウントバッファ１８に記憶する場合、コントローラ１２は、使用カウントバッファ２２の値をまだ増分しなくてもよい。次いで、ジオメトリシェーダ１６Ａが値をジオメトリシェーダカウントバッファ１８に記憶すると、コントローラ１２は、使用カウントバッファ２２の値をゼロから２に増分することができる。
【００７５】
コントローラ１２は、使用カウントバッファ２２に記憶された値を監視して、順序付きジオメトリシェーダカウントバッファ１８のどの記憶ロケーションが、作成されたグラフィックスデータを示す値を記憶するかを判定することができる。たとえば、使用カウントバッファ２２が６の値を記憶した場合、コントローラ１２は、ジオメトリシェーダカウントバッファ１８の最初の６つの記憶ロケーションが値を記憶することを知ることができる。次いで、コントローラ１２は、今度はコントローラ１２が、６つのジオメトリシェーダ１６によって作成されたグラフィックスデータを使用するのに十分なピクセルシェーダ２４の実行を開始すべきであることを知ることができる。
【００７６】
図１に示すように、ジオメトリシェーダ１６は、それが作成したグラフィックスデータをジオメトリシェーダバッファ２０に出力することができる。ジオメトリシェーダ１６をプロデューサシェーダの例とすることができるので、ジオメトリシェーダバッファ２０は、プロデューサシェーダバッファと呼ばれ得る。図１は、ジオメトリシェーダバッファ２０をＧＰＵ１０の一部であるものとして示しているが、本開示の態様はそのように限定されない。いくつかの例では、ジオメトリシェーダバッファ２０が記憶すべきグラフィックスデータの量は、ＧＰＵ１０上で利用可能な記憶スペースの量よりも大きくてもよい。これらの例では、ジオメトリシェーダバッファ２０はＧＰＵ１０の外部にあってもよく、システムバスを用いてＧＰＵ１０がアクセスすることができる記憶デバイスに常駐してもよい。
【００７７】
ジオメトリシェーダバッファ２０は、複数の記憶ロケーションを含み得る。記憶ロケーションの各々は、実行されたジオメトリシェーダ１６の各々によって作成されたグラフィックスデータを記憶し得る。たとえば、コントローラ１２は、ジオメトリシェーダバッファ２０の第１の記憶ロケーションをジオメトリシェーダ１６Ａに割り当てることができ、ジオメトリシェーダバッファ２０の第２の記憶ロケーションをジオメトリシェーダ１６Ｂに割り当てることができる、などである。ジオメトリシェーダ１６の各々は、グラフィックスデータを作成しているときに、それが作成したグラフィックスデータを、ジオメトリシェーダバッファ２０内のそれに割り当てられた記憶ロケーションに出力することができる。
【００７８】
たとえば、ジオメトリシェーダ１６Ａが５つのプリミティブを作成する場合、ジオメトリシェーダ１６Ａは、ジオメトリシェーダ１６Ａが第１のプリミティブに対するグラフィックスデータを作成した後に、第１のプリミティブに対するグラフィックスデータをジオメトリシェーダバッファ２０の第１の記憶ロケーションに出力し、それに続いて、第２のプリミティブに対するグラフィックスデータをジオメトリシェーダバッファ２０の第１の記憶ロケーションに記憶することができる、などである。上記で説明したように、ジオメトリシェーダ１６Ａは、グラフィックスデータを作成しているときに、それが作成したグラフィックスデータをジオメトリシェーダバッファ２０の第１の記憶ロケーションに出力することができるが、ジオメトリシェーダ１６Ａは、ジオメトリシェーダ１６Ａが５つのプリミティブすべてに対するグラフィックスデータの作成を完了するまで、作成されたデータの量を示す値を、ジオメトリシェーダカウントバッファ１８内のそれに割り当てられた記憶ロケーションに出力しない場合がある。
【００７９】
いくつかの例では、コントローラ１２は、ジオメトリシェーダ１６の各々がどのくらいのグラフィックスデータを作成し得るかを知らなくてもよいが、コントローラ１２は、各ジオメトリシェーダ１６が作成し得るグラフィックスデータの最大量を前もって知ることができる。たとえば、ジオメトリシェーダ１６の各々は、ジオメトリシェーダ１６が作成することができるグラフィックスデータの総量においてジオメトリシェーダ１６が限定されるように設計され得る。ジオメトリシェーダバッファ２０の記憶ロケーションのサイズ、たとえば、ジオメトリシェーダバッファ２０の各記憶ロケーションが記憶することができるグラフィックスデータの量は、ジオメトリシェーダ１６の各々が作成することができるグラフィックスデータの最大量と等しくてもよい。
【００８０】
一例として、ジオメトリシェーダ１６の各々が作成することができるグラフィックスデータの最大量は４キロバイト（ＫＢ）とすることができるが、本開示の態様はそのように限定されない。この例では、ジオメトリシェーダバッファ２０の記憶ロケーションのサイズは、４ＫＢとすることができる。
【００８１】
いくつかの例では、ジオメトリシェーダバッファ２０の記憶ロケーションに記憶されたグラフィックスデータは、「疎にポピュレートされ（sparsely populated）」得る。たとえば、いくつかの例では、ジオメトリシェーダの各々によって生成された各プリミティブは、１００バイトで表され得る。ジオメトリシェーダ１６のうちの１つが５つのプリミティブを作成する場合、ジオメトリシェーダ１６のうちのその１つに割り当てられたジオメトリシェーダバッファ２０の記憶ロケーションは、５００バイト、たとえば、５個のプリミティブ＊プリミティブ当たり１００バイトを記憶し得る。したがって、この例では、ジオメトリシェーダ１６のうちの１つは、４ＫＢまで記憶することができるジオメトリシェーダバッファ２０の記憶ロケーションに５００バイトを記憶した。ジオメトリシェーダバッファ２０の記憶ロケーションは、それが記憶することができるデータの総量の８分の１（たとえば、４ＫＢを５００バイトで除算）を記憶するので、ジオメトリシェーダバッファ２０の記憶ロケーション内のデータは、この例では、疎にポピュレートされていると見なされ得る。
【００８２】
ピクセルシェーダ２４の各々は、ジオメトリシェーダバッファ２０の記憶ロケーションに記憶されたグラフィックスデータを使用し得る。たとえば、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータが、ジオメトリシェーダ１６の任意の他の１つからのグラフィックスデータの前に使用されるべきであると仮定する。また、コントローラ１２が、ジオメトリシェーダ１６Ａによって作成されたグラフィックスデータの量を示す値を記憶するために、ジオメトリシェーダカウントバッファ１８の第１の記憶ロケーションを割り当てたと仮定する。この例では、ジオメトリシェーダ１６Ａが作成されたグラフィックスデータの量を示す値をジオメトリシェーダカウントバッファ１８の第１の記憶ロケーションに記憶した後、コントローラ１２は、ＧＰＵ１０に、ジオメトリシェーダ１６Ａに割り当てられたジオメトリシェーダカウントバッファ１８の記憶ロケーションからのグラフィックスデータを使用する１つまたは複数のピクセルシェーダ２４を実行させることができる。
【００８３】
図２は、本開示の１つまたは複数の態様を実施するように動作可能であり得るデバイス２６の一例を示すブロック図である。デバイス２６の例には、限定はしないが、メディアプレーヤなどのビデオデバイス、セットトップボックス、携帯電話などのワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどがある。デバイス２６は、プロセッサ２８と、グラフィックス処理ユニット（ＧＰＵ）１０と、記憶デバイス３２と、トランシーバモジュール３４と、ユーザインターフェース３６と、ディスプレイバッファ３８と、ディスプレイ４０とを含み得る。図２に示すように、デバイス２６のＧＰＵ１０は、図１のＧＰＵ１０と同一または実質的に同様であってもよい。したがって、図２の例では、ＧＰＵ１０の例示的な機能についてさらに論じない。
【００８４】
プロセッサ２８およびＧＰＵ１０は別個のユニットとして示されているが、本開示の態様はそのように限定されない。いくつかの例では、プロセッサ２８およびＧＰＵ１０は、共通の集積回路（ＩＣ）内に形成され得る。プロセッサ２８およびＧＰＵ１０はそれぞれ、単一のプロセッサコアまたは複数のプロセッサコアを含み得る。
【００８５】
デバイス２６は、明快のために図２に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス２６は、デバイス２６がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも図２に示されていないスピーカおよびマイクロフォン、またはデバイス２６がメディアプレーヤである場合にスピーカを含み得る。さらに、デバイス２６に示す様々なモジュールおよびユニットは、デバイス２６のすべての例において必要であるとは限らない。たとえば、ユーザインターフェース３６およびディスプレイ４０は、デバイス２６がデスクトップコンピュータ、または外部ユーザインターフェースまたはディスプレイとインターフェースするように備えられた他のデバイスである例において、デバイス２６の外部にあってもよい。
【００８６】
プロセッサ２８の例には、限定はしないが、ＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、または他の等価な集積回路もしくはディスクリート論理回路がある。記憶デバイス３２は１つまたは複数のコンピュータ可読記憶媒体を備え得る。記憶デバイス３２の例には、限定はしないが、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、ＣＤ−ＲＯＭもしくは他の光ディスクストレージ、磁気ディスクストレージ、もしくは他の磁気記憶デバイス、フラッシュメモリ、または命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータ、プロセッサ、またはＧＰＵによってアクセスされ得る、任意の他の媒体がある。いくつかの例示的な実装形態では、記憶デバイス３２は、本開示においてプロセッサ２８およびＧＰＵ１０に起因する機能をプロセッサ２８および／またはＧＰＵ１０に実行させる命令を含み得る。
【００８７】
記憶デバイス３２は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。ただし、「非一時的」という用語は、記憶デバイス３２が非可動であることを意味するものと解釈されるべきでない。一例として、記憶デバイス３２は、デバイス２６から取り外され、別のデバイスに移され得る。別の例として、記憶デバイス３２と実質的に同様の記憶デバイスが、デバイス２６中に挿入され得る。いくつかの例では、非一時的記憶媒体は、時間経過に伴って変動し得るデータを（たとえば、ＲＡＭに）記憶し得る。
【００８８】
ユーザインターフェース３６の例には、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース３６はまた、タッチスクリーンであり得、ディスプレイ４０の一部として組み込まれ得る。トランシーバモジュール３４は、デバイス２６と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール３４は、ワイヤードまたはワイヤレス通信のための変調器、復調器、増幅器および他のそのような回路を含み得る。
【００８９】
図２に示すように、記憶デバイス３２は、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４に対する命令、たとえば、ソースコードおよび／オブジェクトコードを記憶し得る。図１に示すように、ＧＰＵ１０は、頂点シェーダ１４Ａ〜１４Ｎ、ジオメトリシェーダ１６Ａ〜１６Ｍ、およびピクセルシェーダ２４Ａ〜２４Ｘのインスタンシエーションに対して、頂点シェーダ１４、ジオメトリシェーダ１６、およびピクセルシェーダ２４の命令の複数のインスタンスを実行し得る。
【００９０】
また、いくつかの例では、記憶デバイス３２はジオメトリシェーダバッファ２０を含み得る。上記で説明したように、ジオメトリシェーダバッファ２０は、ジオメトリシェーダ１６Ａ〜１６Ｍのうちの１つまたは複数によって作成されたグラフィックスデータを記憶し得る。いくつかの例では、ジオメトリシェーダバッファ２０に記憶されるべきグラフィックスデータの量が、ＧＰＵ１０上で利用可能な記憶スペースの量よりも大きいことが考えられ得るので、記憶デバイス３２はジオメトリシェーダバッファ２０を含み得る。
【００９１】
記憶デバイス３２は、いくつかの例では、コンパイラ３０に対する命令を記憶し得る。ただし、コンパイラ３０に対する命令を記憶することは、デバイス２６のすべての例において必要であるとは限らない。コンパイラ３０は、いくつかの例示的な実装形態では、実行されると、プロセッサ２８にジオメトリシェーダ１６の命令内にカウンタを含ませる命令を含み得る。たとえば、図２に示すように、プロセッサ２８は、コンパイラ３０の命令を実行して、ジオメトリシェーダ１６をコンパイルし得る、たとえば、ジオメトリシェーダ１６に対するソースコードを受け取り、ジオメトリシェーダ１６に対するオブジェクトコードを生成し得る。次いで、プロセッサ２８は、コンパイルされたジオメトリシェーダ１６を記憶デバイス３２に記憶し得る。ＧＰＵ１０が、ジオメトリシェーダ１６の１つまたは複数のインスタンス、たとえば、ジオメトリシェーダ１６Ａ〜１６Ｍを実行すると、ジオメトリシェーダ１６Ａ〜１６Ｍの各々は、ジオメトリシェーダ１６Ａ〜１６Ｍの各々によって作成されたグラフィックスデータの量を示す、そのそれぞれのカウンタを増分し得る。
【００９２】
ＧＰＵ１０は、１つまたは複数のピクセルシェーダ２４を介して、ディスプレイ４０に表示されるべき画像のピクセル値を出力し得る。いくつかの例では、ＧＰＵ１０はピクセル値をディスプレイ４０に直接出力し得る。いくつかの代替例では、ＧＰＵ１０は画像のピクセル値をディスプレイバッファ３８に出力し得る。ディスプレイバッファ３８は、画像全体がレンダリングされるまで、画像のピクセル値を一時的に記憶し得る。ディスプレイバッファ３８は画像フレームバッファと見なされ得る。ディスプレイバッファ３８は、次いで、ディスプレイ４０上に表示されるべきレンダリングされた画像を送信し得る。ディスプレイ４０は、液晶ディスプレイ（ＬＣＤ）、有機発光ダイオードディスプレイ（ＯＬＥＤ）、陰極線管（ＣＲＴ）ディスプレイ、プラズマディスプレイ、または別のタイプのディスプレイデバイスを備え得る。
【００９３】
図３は、本開示の１つまたは複数の態様によるＧＰＵ１０の例示的な動作を示すフローチャートである。単に説明のために、図１および図２への参照を行う。
【００９４】
ＧＰＵ１０は、グラフィックスデータを作成するプロデューサシェーダを実行し得る（４２）。プロデューサシェーダの例としては、１つまたは複数のジオメトリシェーダ１６がある。上記で説明したように、１つまたは複数のジオメトリシェーダ１４はそれぞれ、１つまたは複数の頂点シェーダから１つのプリミティブを受け取り、その１つのプリミティブを１つまたは複数のプリミティブに分割し得る。プロデューサシェーダによって作成されたグラフィックスデータは、作成された１つまたは複数のプリミティブの頂点の属性、たとえば、作成された１つまたは複数のプリミティブの頂点の色および座標値とすることができる。
【００９５】
ＧＰＵ１０は、作成されたグラフィックスデータを、第１のバッファの記憶ロケーションに記憶し得る（４４）。第１のバッファの記憶ロケーションの一例は、プロデューサシェーダバッファ内の記憶ロケーションとすることができる。プロデューサシェーダバッファの例は、ジオメトリシェーダバッファ２０とすることができる。ジオメトリシェーダバッファ２０が記憶デバイス３２の一部である例では、ＧＰＵ１０はシステムバスを介してジオメトリシェーダバッファ２０にアクセスし得る。
【００９６】
グラフィックスデータの作成が完了すると、プロデューサシェーダは、プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶し得る（４６）。第２のバッファ内の記憶ロケーションの例は、プロデューサシェーダカウントバッファ内の記憶ロケーションとすることができる。プロデューサシェーダカウントバッファの一例は、ジオメトリシェーダカウントバッファ１８とすることができる。プロデューサシェーダによって作成されたグラフィックスデータの量を示す値の一例は、プロデューサシェーダによって作成されたプリミティブの量とすることができる。いくつかの例では、プロデューサシェーダは、いつそれがグラフィックスデータの作成を完了したかを知ることができるので、プロデューサシェーダは、作成されたプリミティブの数を記憶するのに適切であり得る。ただし、コントローラ１２などの他のユニットは、いつプロデューサシェーダがグラフィックスデータの作成を完了したかを知らなくてもよい。
【００９７】
プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を記憶した後、ＧＰＵ１０は１つまたは複数のコンシューマシェーダを実行し得る（４８）。プロデューサシェーダによって作成されたグラフィックスデータの量を示す値を記憶した後に１つまたは複数のコンシューマシェーダを実行することによって、コントローラ１２は、１つまたは複数のコンシューマシェーダによって使用されるべきグラフィックスデータが利用可能になる前に、１つまたは複数のコンシューマシェーダが実行されないことを保証し得る。コンシューマシェーダの例としては、１つまたは複数のピクセルシェーダ２４がある。
【００９８】
１つまたは複数の例では、説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装した場合、機能は、１つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび／またはデータ構造を取り出すために１つまたは複数のコンピュータまたは１つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気記憶デバイス、または命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。本明細書で使用するディスク（disk）およびディスク（disc）は、コンパクトディスク（disc）（ＣＤ）、レーザディスク（disc）、光ディスク（disc）、デジタル多用途ディスク（disc）（ＤＶＤ）、フロッピー（登録商標）ディスク（disk）およびブルーレイ（登録商標）ディスク（disc）を含み、ディスク（disk）は、通常、データを磁気的に再生し、ディスク（disc）は、データをレーザで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含めるべきである。
【００９９】
コードは、１つまたは複数のデジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、または他の等価な集積回路もしくはディスクリート論理回路などの１つまたは複数のプロセッサによって実行され得る。したがって、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明する技法の実装に好適な任意の他の構造のいずれかを指す。また、本技法は、１つまたは複数の回路または論理要素中に十分に実装され得る。
【０１００】
本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）、またはＩＣのセット（すなわち、チップセット）を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を実行するように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要があるとは限らない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび／またはファームウェアとともに、上記で説明した１つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
以下に、本願の出願当初請求項に記載された発明を付記する。
［１］方法であって、
グラフィックス処理ユニット（ＧＰＵ）を用いて、グラフィックスデータを作成するプロデューサシェーダを実行することと、
前記ＧＰＵを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータを第１のバッファの記憶ロケーションに記憶することと、
前記グラフィックスデータの前記作成が完了すると、前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶することと
を備える前記方法。
［２］前記第１のバッファおよび前記第２のバッファが共通のバッファの一部である、［１］に記載の方法。
［３］前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行することをさらに備える、［１］に記載の方法。
［４］前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記方法が、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行することと、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶することと、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成されたグラフィックスデータの量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶することと
をさらに備える、［１］に記載の方法。
［５］前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記方法が、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行しないことをさらに備える、［４］に記載の方法。
［６］前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行することと、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行することと
をさらに備える、［５］に記載の方法。
［７］コンパイラを用いて、前記プロデューサシェーダにカウンタを生成させる前記コンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令を含めることをさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントし、
前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、グラフィックスデータの前記量を示す前記値を記憶することが、前記グラフィックスデータの前記作成が完了すると、前記カウンタの値を記憶することを備える、
［１］に記載の方法。
［８］前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成されたプリミティブの量をカウントすることをさらに備え、
グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、
［１］に記載の方法。
［９］前記プロデューサシェーダが、プリミティブを受け取り、前記プリミティブを分割して１つまたは複数のプリミティブを作成するように動作可能なジオメトリシェーダを備え、前記コンシューマシェーダが、前記ジオメトリシェーダによって作成された前記１つまたは複数のプリミティブのうちの少なくとも１つのプリミティブを受け取るように動作可能なピクセルシェーダを備える、［１］に記載の方法。
［１０］グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶することであって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、記憶することと、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない前記複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定することと
をさらに備える、［１］に記載の方法。
［１１］装置であって、
第１のバッファと、
第２のバッファと、
グラフィックス処理ユニット（ＧＰＵ）と
を備え、前記ＧＰＵが、
グラフィックスデータを作成するプロデューサシェーダを実行し、
前記プロデューサシェーダによって作成された前記グラフィックスデータを前記第１のバッファの記憶ロケーションに記憶し、
前記グラフィックスデータの前記作成が完了すると、前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータの量を示す値を前記第２のバッファの記憶ロケーションに記憶するように動作可能である、前記装置。
［１２］前記第１のバッファおよび前記第２のバッファが共通のバッファの一部である、［１１］に記載の装置。
［１３］前記ＧＰＵが前記第２のバッファを含む、［１１］に記載の装置。
［１４］前記ＧＰＵが、前記プロデューサシェーダが前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行するようにさらに動作可能である、［１１］に記載の装置。
［１５］前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記ＧＰＵが、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行し、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶し、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成されたグラフィックスデータの量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶するようにさらに動作可能である、［１１］に記載の装置。
［１６］前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記ＧＰＵが、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行しないようにさらに動作可能である、［１５］に記載の装置。
［１７］前記ＧＰＵが、
前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行し、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行するようにさらに動作可能である、［１６］に記載の装置。
［１８］コンパイラを実行するプロセッサであって、前記プロデューサシェーダをコンパイルして、前記プロデューサシェーダにカウンタを生成させる前記コンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令を含めるように動作可能なプロセッサをさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントし、
前記プロデューサシェーダが、前記グラフィックスデータの前記作成が完了すると、前記カウンタの値を記憶して、前記プロデューサシェーダによって作成された前記グラフィックスデータの前記量を示す前記値を記憶する、
［１１］に記載の装置。
［１９］前記プロデューサシェーダが、前記プロデューサシェーダによって作成されたプリミティブの量をカウントし、グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、［１１］に記載の装置。
［２０］前記プロデューサシェーダが、プリミティブを受け取り、前記プリミティブを分割して１つまたは複数のプリミティブを作成するように動作可能なジオメトリシェーダを備え、前記コンシューマシェーダが、前記ジオメトリシェーダによって作成された前記１つまたは複数のプリミティブのうちの少なくとも１つのプリミティブを受け取るように動作可能なピクセルシェーダを備える、［１１］に記載の装置。
［２１］グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶するように動作可能な第３のバッファであって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、第３のバッファと、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定するように動作可能なコントローラと
をさらに備える、［１１］に記載の装置。
［２２］メディアプレーヤ、セットトップボックス、ワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、およびタブレットコンピューティングデバイスのうちの少なくとも１つを備える、［１１］に記載の装置。
［２３］装置であって、
第１のバッファと、
第２のバッファと、
グラフィックス処理ユニット（ＧＰＵ）と
を備え、前記ＧＰＵが、
グラフィックスデータを作成するプロデューサシェーダを実行するための手段と、
前記プロデューサシェーダによって作成された前記グラフィックスデータを前記第１のバッファの記憶ロケーションに記憶するための手段と、
前記グラフィックスデータの前記作成が完了すると、前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータの量を示す値を前記第２のバッファの記憶ロケーションに記憶するための手段と
を備える、前記装置。
［２４］前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行するための手段をさらに備える、［２３］に記載の装置。
［２５］前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記ＧＰＵが、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行するための手段と、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶するための手段と、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成されたグラフィックスデータの量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶するための手段と
をさらに備える、［２３］に記載の装置。
［２６］前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記ＧＰＵが、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行しないための手段をさらに備える、［２５］に記載の装置。
［２７］前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行するための手段と、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行するための手段と
をさらに備える、［２６］に記載の装置。
［２８］前記プロデューサシェーダにカウンタを生成させるコンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令を含めるように動作可能なコンパイルするための手段をさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントし、
前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、グラフィックスデータの前記量を示す前記値を記憶するための前記手段が、前記グラフィックスデータの前記作成が完了すると、前記カウンタの値を記憶するための手段を備える、
［２３］に記載の装置。
［２９］前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成されたプリミティブの量をカウントするための手段をさらに備え、
グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、
［２３］に記載の装置。
［３０］前記プロデューサシェーダが、プリミティブを受け取り、前記プリミティブを分割して１つまたは複数のプリミティブを作成するように動作可能なジオメトリシェーダを備え、前記コンシューマシェーダが、前記ジオメトリシェーダによって作成された前記１つまたは複数のプリミティブのうちの少なくとも１つのプリミティブを受け取るように動作可能なピクセルシェーダを備える、［２３］に記載の装置。
［３１］グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶するための手段であって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つである、手段と、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない前記複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定するための手段と
をさらに備える、［２３］に記載の装置。
［３２］メディアプレーヤ、セットトップボックス、ワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、およびタブレットコンピューティングデバイスのうちの少なくとも１つを備える、［２３］に記載の装置。
［３３］非一時的なコンピュータ可読記憶媒体であって、
１つまたは複数のプロセッサに、
グラフィックス処理ユニット（ＧＰＵ）を用いて、グラフィックスデータを作成するプロデューサシェーダを実行させ、
前記ＧＰＵを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータを第１のバッファの記憶ロケーションに記憶させ、
前記グラフィックスデータの前記作成が完了すると、前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成された前記グラフィックスデータの量を示す値を第２のバッファの記憶ロケーションに記憶させる
命令を備える前記非一時的なコンピュータ可読記憶媒体。
［３４］前記プロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記記憶ロケーションに記憶した後に、前記第１のバッファの前記記憶ロケーションに記憶された前記グラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行する命令をさらに備える、［３３］に記載の非一時的なコンピュータ可読記憶媒体。
［３５］前記プロデューサシェーダが第１のプロデューサシェーダを備え、前記グラフィックスデータが第１のグラフィックスデータを備え、前記第２のバッファが第１の記憶ロケーションと第２の記憶ロケーションとを備え、前記値が前記第２のバッファの前記第１の記憶ロケーションに記憶され、前記命令が、
第２のグラフィックスデータを作成する第２のプロデューサシェーダを実行し、
前記第２のプロデューサシェーダによって作成された前記第２のグラフィックスデータを前記第１のバッファの別の異なる記憶ロケーションに記憶し、
前記第２のグラフィックスデータの前記作成が完了すると、前記第２のプロデューサシェーダを用いて、前記第２のプロデューサシェーダによって作成されたグラフィックスデータの量を示す値を前記第２のバッファの前記第２の記憶ロケーションに記憶する
命令をさらに備える、［３３］に記載の非一時的なコンピュータ可読記憶媒体。
［３６］前記第１のプロデューサシェーダが前記第１のグラフィックスデータの前記作成を完了する前に、前記第２のプロデューサシェーダが前記第２のグラフィックスデータの前記作成を完了し、前記命令が、
前記第１のプロデューサシェーダが前記第１のグラフィックスデータの作成を完了するまで、かつ前記第１のプロデューサシェーダが前記第１のプロデューサシェーダによって作成されたグラフィックスデータの前記量を示す前記値を前記第２のバッファの前記第１の記憶ロケーションに記憶するまで、前記第１のバッファの前記別の異なる記憶ロケーションに記憶された前記第２のグラフィックスデータを使用するために１つまたは複数のコンシューマシェーダを実行しない命令をさらに備える、［３５］に記載の非一時的なコンピュータ可読記憶媒体。
［３７］前記第１のバッファの前記記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第１のプロデューサシェーダが記憶した後に、前記第１のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第１のコンシューマシェーダを実行し、
前記第１のコンシューマシェーダの前記実行の後で、前記第１のバッファの前記別の異なる記憶ロケーションに記憶されたグラフィックスデータの前記量を示す前記値を前記第２のプロデューサシェーダが記憶した後に、前記第２のグラフィックスデータを使用するために前記１つまたは複数のコンシューマシェーダのうちの第２のコンシューマシェーダを実行する
命令をさらに備える、［３６］に記載の非一時的なコンピュータ可読記憶媒体。
［３８］コンパイラを用いて、前記プロデューサシェーダにカウンタを生成させる前記コンパイラによって生成された、前記プロデューサシェーダのオブジェクトコードに命令を含める命令をさらに備え、
前記カウンタが前記プロデューサシェーダのソースコードの一部ではなく、
前記カウンタが、前記プロデューサシェーダが前記グラフィックスデータを作成している間に、前記プロデューサシェーダによって作成されたグラフィックスデータの前記量をカウントし、
前記ＧＰＵ上で実行される前記プロデューサシェーダを用いて、グラフィックスデータの前記量を示す前記値を記憶する前記命令が、前記グラフィックスデータの前記作成が完了すると、前記カウンタの値を記憶する命令を備える、
［３３］に記載の非一時的なコンピュータ可読記憶媒体。
［３９］前記プロデューサシェーダを用いて、前記プロデューサシェーダによって作成されたプリミティブの量をカウントする命令をさらに備え、
グラフィックスデータの前記量を示す前記値が、前記グラフィックスデータの前記作成の前記完了のときに、前記プロデューサシェーダによって作成されたプリミティブの前記量を備える、
［３３］に記載の非一時的なコンピュータ可読記憶媒体。
［４０］前記プロデューサシェーダが、プリミティブを受け取り、前記プリミティブを分割して１つまたは複数のプリミティブを作成するように動作可能なジオメトリシェーダを備え、前記コンシューマシェーダが、前記ジオメトリシェーダによって作成された前記１つまたは複数のプリミティブのうちの少なくとも１つのプリミティブを受け取るように動作可能なピクセルシェーダを備える、［３３］に記載の非一時的なコンピュータ可読記憶媒体。
［４１］グラフィックスデータがまだ使用されていない複数のプロデューサシェーダの数を示す値を記憶することであって、前記プロデューサシェーダが前記複数のプロデューサシェーダのうちの１つであることと、
前記第２のバッファのどの記憶ロケーションが作成されたグラフィックスデータを示す値を記憶するかを、グラフィックスデータがまだ使用されていない前記複数のプロデューサシェーダの前記数を示す前記記憶された値に基づいて判定することとを行う
命令をさらに備える、［３３］に記載の非一時的なコンピュータ可読記憶媒体。
【図１】
0005770375.tif 000002
【図２】
0005770375.tif 000003
【図３】
0005770375.tif 000004