(57)【特許請求の範囲】
【請求項１】
グラフィックスプロセッサにより、第1のシェーダプログラム実行モードで動作すると判定するステップと、
前記第1のシェーダプログラム実行モードで動作すると判定したことに応答して、マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスが、前記マージ型頂点/ジオメトリシェーダプログラムによって受信される第1の複数のプリミティブごとに第1の複数の出力頂点が生成されるように、頂点シェーダ処理およびジオメトリシェーダ処理を実行する前記マージ型頂点/ジオメトリシェーダプログラムの第1の複数のインスタンスを、前記グラフィックスプロセッサのシェーダユニットにより実行するステップと、
グラフィックスプロセッサにより、第2のシェーダプログラム実行モードで動作すると判定するステップと、
前記第2のシェーダプログラム実行モードで動作すると判定したことに応答して、前記マージ型頂点/ジオメトリシェーダプログラムの第2の複数のインスタンスの各々が1つの出力頂点を出力するように、前記グラフィックスプロセッサの前記シェーダユニットにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第2の複数のインスタンスを実行して、第2の複数のプリミティブごとに第2の複数の出力頂点を生成するステップと、
を含む方法。
【請求項２】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを前記グラフィックスプロセッサの前記シェーダユニットにより実行するステップはさらに、
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々が複数の入力頂点の各々を受信し、前記複数の入力頂点の前記各々の受信に応答して複数の出力頂点を生成するように、前記シェーダユニットにより実行するステップ
を含む、請求項1に記載の方法。
【請求項３】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを前記グラフィックスプロセッサの前記シェーダユニットにより実行するステップは、
前記シェーダユニットにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々がM個の出力頂点を生成するように実行するステップであって、Mが2以上の整数である、ステップ
を含む、請求項1に記載の方法。
【請求項４】
Mは、前記マージ型頂点/ジオメトリシェーダプログラムによって実装される前記ジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しく、前記最大出力頂点カウント値が、前記ジオメトリシェーダプログラムによって処理される各プリミティブに対して前記ジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示す、請求項3に記載の方法。
【請求項５】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々は、前記マージ型頂点/ジオメトリシェーダプログラムの前記それぞれのインスタンスに割り当てられるプリミティブに対する前記ジオメトリシェーダ処理を実行するように構成可能であり、
複数のプリミティブの各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられる、請求項3に記載の方法。
【請求項６】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々は、前記マージ型頂点/ジオメトリシェーダプログラムの前記それぞれのインスタンスに割り当てられる頂点に対する前記頂点シェーダ処理を実行するようにさらに構成可能であり、
複数の頂点の各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ、
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスのうちの少なくとも1つは、前記複数の頂点のうちの1つに対する前記頂点シェーダ処理および前記複数のプリミティブのうちの1つに対する前記ジオメトリシェーダ処理を実行するように構成される、請求項5に記載の方法。
【請求項７】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々は、前記マージ型頂点/ジオメトリシェーダプログラムの前記それぞれのインスタンスに割り当てられる頂点に対する前記頂点シェーダ処理を実行するようにさらに構成可能であり、前記シェーダユニットにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを実行するステップは、
前記マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンスにより、複数の頂点のうちの1つに対する前記頂点シェーダ処理を実行して、頂点シェーディング済み頂点を生成するステップと、
前記マージ型頂点/ジオメトリシェーダプログラムの第2のインスタンスにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1のインスタンスによって生成された前記頂点シェーディング済み頂点に基づいて、前記複数のプリミティブのうちの第1のプリミティブに対する前記ジオメトリシェーダ処理を実行して、前記第1のプリミティブに対応する1つまたは複数のジオメトリシェーディング済み頂点を生成するステップと、
前記マージ型頂点/ジオメトリシェーダプログラムの第3のインスタンスにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1のインスタンスによって生成された前記頂点シェーディング済み頂点に基づいて、前記複数のプリミティブのうちの第2のプリミティブに対する前記ジオメトリシェーダ処理を実行して、前記第2のプリミティブに対応する1つまたは複数のジオメトリシェーディング済み頂点を生成するステップと
をさらに含む、請求項5に記載の方法。
【請求項８】
前記第1の複数の出力頂点はM個の出力頂点を含み、前記マージ型頂点/ジオメトリシェーダプログラムの前記第2の複数のインスタンスは、前記マージ型頂点/ジオメトリシェーダプログラムのN個のインスタンスを含み、前記第2の複数の出力頂点はN個の出力頂点を含み、Mが2以上の整数であり、Nが2以上の整数であり、MがN以下である、請求項1に記載の方法。
【請求項９】
Mは、前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダ段階によって処理される前記プリミティブの各々に対して生成される頂点の数に等しく、
Nは、前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しく、前記最大出力頂点カウント値が、前記ジオメトリシェーダプログラムによって処理される前記プリミティブの各々に対して前記ジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示す、請求項8に記載の方法。
【請求項１０】
前記第1のシェーダプログラム実行モードで動作するとき、複数の頂点の各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ、
前記第2のシェーダプログラム実行モードで動作するとき、前記複数の頂点の各々は、処理のためにK個のマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ、Kが、前記それぞれの頂点を含むプリミティブの数に等しい整数である、請求項8に記載の方法。
【請求項１１】
前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムに関連する出力頂点を記憶するために必要な記憶空間の総量を示す情報に基づいて、前記マージ型頂点/ジオメトリシェーダプログラムを実行するために使用する被選択シェーダプログラム実行モードとして、前記第1のシェーダプログラム実行モードおよび前記第2のシェーダプログラム実行モードのうちの1つを選択するステップと、
前記シェーダユニットに、前記被選択シェーダプログラム実行モードに基づいて前記マージ型頂点/ジオメトリシェーダプログラムを実行させるステップと
をさらに含む、請求項8に記載の方法。
【請求項１２】
前記第1のシェーダプログラム実行モードおよび前記第2のシェーダプログラム実行モードのうちの前記1つを選択するステップは、
記憶空間の前記総量を示す前記情報がしきい値よりも大きいかどうかを判断するステップと、
記憶空間の前記総量を示す前記情報が前記しきい値よりも大きいとの判断に応答して、前記被選択シェーダプログラム実行モードとして前記第2のシェーダプログラム実行モードを選択するステップと、
記憶空間の前記総量を示す前記情報が前記しきい値以下であるとの判断に応答して、前記被選択シェーダプログラム実行モードとして前記第1のシェーダプログラム実行モードを選択するステップと
を含む、請求項11に記載の方法。
【請求項１３】
第1のシェーダプログラム実行モードで動作すると判定し、
前記第1のシェーダプログラム実行モードで動作すると判定したことに応答して、マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスが、前記マージ型頂点/ジオメトリシェーダプログラムによって受信される第1の複数のプリミティブごとに第1の複数の出力頂点が生成されるように、頂点シェーダ処理およびジオメトリシェーダ処理を実行する前記マージ型頂点/ジオメトリシェーダプログラムの第1の複数のインスタンスを実行し、
第2のシェーダプログラム実行モードで動作すると判定し、
前記第2のシェーダプログラム実行モードで動作すると判定したことに応答して、前記マージ型頂点/ジオメトリシェーダプログラムの第2の複数のインスタンスの各々が1つの出力頂点を出力するように、前記マージ型頂点/ジオメトリシェーダプログラムの前記第2の複数のインスタンスを実行して、第2の複数のプリミティブごとに第2の複数の出力頂点を生成する
ように構成されたシェーダユニットを備えるグラフィックス処理装置(GPU)を含むデバイス。
【請求項１４】
前記マージ型頂点/ジオメトリシェーダユニットは、
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々が複数の入力頂点の各々を受信し、前記複数の入力頂点の前記各々の受信に応答して前記複数の出力頂点を生成するように実行する
ようにさらに構成される、請求項13に記載のデバイス。
【請求項１５】
前記マージ型頂点/ジオメトリシェーダプログラムは、前記頂点シェーダ処理および前記ジオメトリシェーダ処理を実行するようにさらに構成可能であり、
前記シェーダユニットは、
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスを、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々がM個の出力頂点を生成するように実行することであって、Mが2以上の整数である、実行することを行うようにさらに構成される、請求項13に記載のデバイス。
【請求項１６】
Mは、前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しく、前記最大出力頂点カウント値が、前記ジオメトリシェーダプログラムによって処理される各プリミティブに対して前記ジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示す、請求項15に記載のデバイス。
【請求項１７】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々は、前記マージ型頂点/ジオメトリシェーダプログラムの前記それぞれのインスタンスに割り当てられるプリミティブに対する前記ジオメトリシェーダ処理を実行するように構成可能であり、
複数のプリミティブの各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられる、請求項15に記載のデバイス。
【請求項１８】
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスの各々は、前記第1の複数のマージ型頂点/ジオメトリシェーダプログラムの前記それぞれのインスタンスに割り当てられる頂点に対する前記頂点シェーダ処理を実行するようにさらに構成可能であり、
複数の頂点の各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ、
前記マージ型頂点/ジオメトリシェーダプログラムの前記第1の複数のインスタンスのうちの少なくとも1つは、前記複数の頂点のうちの1つに対する前記頂点シェーダ処理および前記複数のプリミティブのうちの1つに対する前記ジオメトリシェーダ処理を実行するように構成される、請求項17に記載のデバイス。
【請求項１９】
前記マージ型頂点/ジオメトリシェーダプログラムの前記インスタンスの各々は、前記マージ型頂点/ジオメトリシェーダプログラムの前記それぞれのインスタンスに割り当てられる頂点に対する前記頂点シェーダ処理を実行するようにさらに構成可能であり、前記シェーダユニットは、
前記マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンスにより、複数の頂点のうちの1つに対する前記頂点シェーダ処理を実行して、頂点シェーディング済み頂点を生成することと、
前記マージ型頂点/ジオメトリシェーダプログラムの第2のインスタンスにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1のインスタンスによって生成された前記頂点シェーディング済み頂点に基づいて、前記複数のプリミティブのうちの第1のプリミティブに対する前記ジオメトリシェーダ処理を実行して、前記第1のプリミティブに対応する1つまたは複数のジオメトリシェーディング済み頂点を生成することと、
前記マージ型頂点/ジオメトリシェーダプログラムの第3のインスタンスにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第1のインスタンスによって生成された前記頂点シェーディング済み頂点に基づいて、前記複数のプリミティブのうちの第2のプリミティブに対する前記ジオメトリシェーダ処理を実行して、前記第2のプリミティブに対応する1つまたは複数のジオメトリシェーディング済み頂点を生成することと
を行うようにさらに構成される、請求項17に記載のデバイス。
【請求項２０】
前記第1の複数の出力頂点はM個の出力頂点を含み、前記マージ型頂点/ジオメトリシェーダプログラムの前記第2の複数のインスタンスは、前記マージ型頂点/ジオメトリシェーダプログラムのN個のインスタンスを含み、前記第2の複数の出力頂点はN個の出力頂点を含み、Mが2以上の整数であり、Nが2以上の整数であり、MがN以下である、請求項13に記載のデバイス。
【請求項２１】
Mは、前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダ段階によって処理される前記プリミティブの各々に対して生成される頂点の数に等しく、
Nは、前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しく、前記最大出力頂点カウント値が、前記ジオメトリシェーダプログラムによって処理される前記プリミティブの各々に対して前記ジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示す、請求項20に記載のデバイス。
【請求項２２】
前記第1のシェーダプログラム実行モードで動作するとき、複数の頂点の各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ、
前記第2のシェーダプログラム実行モードで動作するとき、前記複数の頂点の各々は、処理のためにK個のマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ、Kが、前記それぞれの頂点を含むプリミティブの数に等しい整数である、請求項20に記載のデバイス。
【請求項２３】
1つまたは複数のプロセッサを備え、前記1つまたは複数のプロセッサは、
前記マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムに関連する出力頂点を記憶するために必要な記憶空間の総量を示す情報に基づいて、前記マージ型頂点/ジオメトリシェーダプログラムを実行するために使用する被選択シェーダプログラム実行モードとして、前記第1のシェーダプログラム実行モードおよび前記第2のシェーダプログラム実行モードのうちの1つを選択することと、
前記シェーダユニットに、前記被選択シェーダプログラム実行モードに基づいて前記マージ型頂点/ジオメトリシェーダプログラムを実行させることと
を行うように構成される、請求項20に記載のデバイス。
【請求項２４】
前記1つまたは複数のプロセッサは、
記憶空間の前記総量を示す前記情報がしきい値よりも大きいかどうかを判断することと、
記憶空間の前記総量を示す前記情報が前記しきい値よりも大きいとの判断に応答して、前記被選択シェーダプログラム実行モードとして前記第2のシェーダプログラム実行モードを選択することと、
記憶空間の前記総量を示す前記情報が前記しきい値以下であるとの判断に応答して、前記被選択シェーダプログラム実行モードとして前記第1のシェーダプログラム実行モードを選択することと
を行うようにさらに構成される、請求項23に記載のデバイス。
【請求項２５】
ワイヤレス通信デバイスを含む、請求項13に記載のデバイス。
【請求項２６】
モバイルフォンハンドセットを含む、請求項13に記載のデバイス。
【請求項２７】
シェーダユニットを備えるグラフィックスプロセッサと、
第1のシェーダプログラム実行モードで動作すると判定するための手段と、
前記第1のシェーダプログラム実行モードで動作すると判定したことに応答して、マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスが、前記マージ型頂点/ジオメトリシェーダプログラムによって受信される第1の複数のプリミティブごとに第1の複数の出力頂点が生成されるように、頂点シェーダ処理およびジオメトリシェーダ処理を実行する前記マージ型頂点/ジオメトリシェーダプログラムの第1の複数のインスタンスを実行するための手段と、
第2のシェーダプログラム実行モードで動作すると判定するための手段と、
前記第2のシェーダプログラム実行モードで動作すると判定したことに応答して、前記マージ型頂点/ジオメトリシェーダプログラムの第2の複数のインスタンスの各々が1つの出力頂点を出力するように、前記マージ型頂点/ジオメトリシェーダプログラムの前記第2の複数のインスタンスを実行して、第2の複数のプリミティブごとに第2の複数の出力頂点を生成するための手段と、
を含む装置。
【請求項２８】
1つまたは複数のプロセッサによって実行されると、前記1つまたは複数のプロセッサに、
グラフィックスプロセッサにより、第1のシェーダプログラム実行モードで動作すると判定させ、
前記第1のシェーダプログラム実行モードで動作すると判定したことに応答して、マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスが、前記マージ型頂点/ジオメトリシェーダプログラムによって受信される第1の複数のプリミティブごとに第1の複数の出力頂点が生成されるように、頂点シェーダ処理およびジオメトリシェーダ処理を実行する前記マージ型頂点/ジオメトリシェーダプログラムの第1の複数のインスタンスを、前記グラフィックスプロセッサのシェーダユニットにより実行させ、
グラフィックスプロセッサにより、第2のシェーダプログラム実行モードで動作すると判定させ、
前記第2のシェーダプログラム実行モードで動作すると判定したことに応答して、前記マージ型頂点/ジオメトリシェーダプログラムの第2の複数のインスタンスの各々が1つの出力頂点を出力するように、前記グラフィックスプロセッサの前記シェーダユニットにより、前記マージ型頂点/ジオメトリシェーダプログラムの前記第2の複数のインスタンスを実行して、第2の複数のプリミティブごとに第2の複数の出力頂点を生成させる、
命令を記憶したコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、グラフィックス処理システムに関し、より詳細には、グラフィックス処理システムにおけるシェーダプログラムを実行することに関する。
【背景技術】
【０００２】
コンピューティングデバイスは多くの場合、表示のためのグラフィックスデータのレンダリングを加速させるためにグラフィックス処理装置(GPU)を利用する。そのようなコンピューティングデバイスとしては、たとえば、コンピュータワークステーション、モバイルフォン(たとえば、いわゆるスマートフォン)、埋込みシステム、パーソナルコンピュータ、タブレットコンピュータ、およびビデオゲームコンソールがあり得る。GPUは通常、グラフィックス処理コマンドを実行するために一緒に動作する複数の処理段階を含むグラフィックス処理パイプラインを実装する。従来は、GPUは固定機能グラフィックス処理パイプラインを含んでおり、パイプラインにおける各処理段階が固定機能ハードウェア(たとえば、ある特殊機能セットを実行するようにハードワイヤードされ、ユーザがダウンロード可能なプログラムを実行することが可能ではないハードウェア)により実装された。
【０００３】
より最近では、グラフィックス処理パイプラインは、パイプラインにおける1つまたは複数の処理段階がプログラム可能処理段階であり、1つまたは複数のプログラム可能シェーダユニットにより実装されるプログラム可能アーキテクチャに移行している。プログラム可能シェーダユニットの各々は、シェーダプログラムを実行するように構成され得る。ユーザアプリケーションは、プログラム可能グラフィックスパイプラインにおいてプログラム可能処理段階によって実行されるべきシェーダプログラムを指定し、それによって、現代のGPUの使用における高度の柔軟性をもたらすことができる。
【０００４】
グラフィックス処理技術が発展するにつれて、グラフィックス処理パイプラインは、より高度になっており、ますます多くの異なるタイプのプログラム可能処理段階が、主要なグラフィックスアプリケーションプログラミングインターフェース(API)によって指定される標準的なグラフィックス処理パイプラインに追加されている。GPUにおける限られたリソースによりこれらの異なるタイプのプログラム可能処理段階を実装することは、相当な困難を伴い得る。
【発明の概要】
【課題を解決するための手段】
【０００５】
本開示は、グラフィックス処理装置(GPU)におけるシェーダプログラムを実行するための技法について説明する。シェーダプログラムは、GPUにロードされ、GPUによって、GPUに含まれる1つまたは複数のシェーダユニットを用いて実行されるプログラムを指し得る。GPUは、シェーダプログラムの複数のインスタンスを実行することができ、その場合にシェーダプログラムのインスタンスの各々が、異なるデータ項目に対して同じプログラム命令を実行する。例示的なデータ項目は、頂点、プリミティブ、およびピクセルを含み得る。頂点を処理するシェーダプログラムは、通常、シェーダプログラムによって受信される入力頂点の各々に対する単一の出力頂点を生成するように構成される。しかしながら、本開示の技法は、いくつかの例では、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行することができる。
【０００６】
頂点シェーダ処理を実行し、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、入力頂点の特定のセットを処理するために必要とされるスレッドの数を、各入力頂点に対する単一の出力頂点を生成するだけであるシェーダプログラムが使用されるときに必要とされるスレッドの数と比較して減らすことができる。頂点を処理するために使用されるスレッドの数を減らすことは、GPUによって使用される処理リソースを減らすこと、および/またはGPUによって消費される電力を減らすことができる。その上、頂点シェーダ処理を実行するシェーダプログラムが各入力頂点に対する複数の出力頂点を生成することを可能にすることは、GPUのプログラミングの柔軟性を改善することができる。このようにして、プログラム可能頂点処理を実行するGPUのパフォーマンス、電力消費、および/またはプログラミングの柔軟性が改善され得る。
【０００７】
一例では、本開示は、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを、グラフィックスプロセッサのシェーダユニットにより実行するステップを含む方法について説明する。
【０００８】
別の例では、本開示は、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行するように構成されたシェーダユニットを備えるグラフィックス処理装置(GPU)を含むデバイスについて説明する。
【０００９】
別の例では、本開示は、シェーダユニットを備えるグラフィックスプロセッサを含む装置について説明する。本装置はさらに、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを、グラフィックスプロセッサのシェーダユニットにより実行するための手段を含む。
【００１０】
別の例では、本開示は、1つまたは複数のプロセッサによって実行されると、1つまたは複数のプロセッサに、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムをグラフィックスプロセッサのシェーダユニットにより実行させる命令を記憶している非一時的コンピュータ可読記憶媒体について説明する。
【００１１】
本開示の1つまたは複数の例の詳細が、添付の図面および以下の説明に記載される。本開示の他の特徴、目的、および利点は、説明および図面から、ならびに特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【００１２】
【図１】本開示のシェーダプログラム実行技法を使用することによって実装され得る例示的なグラフィックスパイプラインを示す概念図である。
【図２】本開示のシェーダプログラム実行技法を実装するために使用され得る例示的なGPUのブロック図である。
【図３】図2のGPUにおいて使用され得る例示的なシェーダユニットを示すブロック図である。
【図４】本開示の例示的なシェーダプログラム実行技法を使用して処理され得る例示的な三角形ストリップを示す概念図である。
【図５】本開示による図4に示す三角形ストリップを処理するためのマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスを実行するために使用され得る例示的なスレッド構成を示す概念図である。
【図６】本開示によるマージ型頂点/ジオメトリシェーダプログラムを実行することに関連する例示的な処理フローを示す概念図である。
【図７】本開示によるマージ型頂点/ジオメトリシェーダプログラムを実行することに関連する擬似コードを示す図である。
【図８】本開示のシェーダプログラム実行技法を実装するために使用され得る例示的なコンピューティングデバイスを示すブロック図である。
【図９】本開示によるシェーダプログラムを実行するための例示的な技法を示す流れ図である。
【図１０】本開示による反復型モードおよび非反復型モードに従ってマージ型頂点/ジオメトリシェーダプログラムを実行するための例示的な技法を示す流れ図である。
【図１１】本開示によるマージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードおよび非反復型モードのうちの1つを選択するための例示的な技法を示す流れ図である。
【発明を実施するための形態】
【００１３】
本開示は、グラフィックス処理装置(GPU)におけるシェーダプログラムを実行するための技法について説明する。シェーダプログラムは、GPUにロードされ、GPUによって、GPUに含まれる1つまたは複数のシェーダユニットを用いて実行されるプログラムを指し得る。GPUは、シェーダプログラムの複数のインスタンスを実行することができ、その場合にシェーダプログラムのインスタンスの各々が、異なるデータ項目に対して同じプログラム命令を実行する。例示的なデータ項目は、頂点、プリミティブ、およびピクセルを含み得る。頂点を処理するシェーダプログラムは、通常、シェーダプログラムによって受信される入力頂点の各々に対する単一の出力頂点を生成するように構成される。しかしながら、本開示の技法は、いくつかの例では、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行することができる。
【００１４】
頂点シェーダ処理を実行し、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、入力頂点の特定のセットを処理するために必要とされるスレッドの数を、各入力頂点に対する単一の出力頂点を生成するだけであるシェーダプログラムが使用されるときに必要とされるスレッドの数と比較して減らすことができる。頂点を処理するために使用されるスレッドの数を減らすことは、GPUによって使用される処理リソースを減らすこと、および/またはGPUによって消費される電力を減らすことができる。このようにして、プログラム可能頂点処理を実行するGPUのパフォーマンスおよび/または電力消費が改善され得る。
【００１５】
その上、頂点シェーダ処理を実行するシェーダプログラムが各入力頂点に対する複数の出力頂点を生成することを可能にすることは、GPUのプログラミングの柔軟性を改善することができる。通常、頂点シェーダプログラミングモデルは、頂点シェーダプログラムが各入力頂点に対して1回呼び出されるべきであること、および頂点シェーダプログラムが頂点シェーダプログラムの各呼出しに対して単一の出力頂点を生成すべきであることを指定する。本開示の技法は、頂点シェーダプログラムの各呼出しに対して複数の出力頂点が生成されることを可能にする頂点シェーダプログラミングモデルを実装するために使用され得る。このようにして、GPUによって実行されるプログラム可能頂点処理の柔軟性が改善され得る。
【００１６】
いくつかの例では、頂点シェーダ処理を実行し、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムは、マージ型頂点/ジオメトリシェーダプログラムであり得る。マージ型頂点/ジオメトリシェーダプログラムは、頂点に対する頂点シェーダ処理およびプリミティブに対するジオメトリシェーダ処理を実行するように構成可能であるシェーダプログラムを指し得る。ジオメトリシェーダプログラムは通常、入力プリミティブを受信し、入力プリミティブの受信に応答して0個またはより多くの出力プリミティブを出力するように構成される。ジオメトリシェーダプログラムによって生成される出力プリミティブの各々は、2つ以上の頂点を含み得るので、マージ型頂点/ジオメトリシェーダプログラムが各入力頂点に対する単一の出力頂点のみを生成する場合、プリミティブに対するジオメトリシェーダ処理を実行するために、プリミティブの各々に対してマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスが実行される必要があり得る。しかしながら、本開示の技法による、マージ型頂点/ジオメトリシェーダプログラムによって受信された各頂点に対する複数の出力頂点を生成するこのシェーダプログラムを実行することは、いくつかの例では、プリミティブごとにマージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスにより、プリミティブの各々に対するジオメトリシェーダ処理が実行されることを可能にし得る。
【００１７】
プリミティブごとにマージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスによりジオメトリシェーダ処理が実行されることを可能にすることは、プリミティブの特定のセットを処理するために必要とされるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの数を、各プリミティブに対してマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスが実行されることを必要とする技法と比較して減らすことができる。プリミティブを処理するために使用されるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの数を減らすことは、GPUによって使用される処理リソースを減らすこと、GPUによって実行されるリソース割振りの数を減らすこと、および/またはGPUによって消費される電力を減らすことができる。このようにして、マージ型頂点/ジオメトリシェーダプログラムによりプログラム可能頂点シェーディングおよびプログラム可能ジオメトリシェーディングを実行するGPUのパフォーマンスおよび/または電力消費が改善され得る。
【００１８】
いくつかの例では、シェーダプログラムを実行するための技法は、非反復型実行モードを使用してマージ型頂点/ジオメトリシェーダプログラムを実行することを含み得る。非反復型実行モードを使用してマージ型頂点/ジオメトリシェーダプログラムを実行することは、複数のプリミティブの各々をジオメトリシェーダ処理のためにマージ型頂点/ジオメトリシェーダプログラムのそれぞれのインスタンスに割り当てることと、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々にM個の頂点を出力させることとを伴うことができ、Mが、マージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムによって各プリミティブに対して生成される頂点の数に対応する。本開示によるマージ型頂点/ジオメトリシェーダプログラムによって受信された各入力頂点に対する複数の出力頂点を生成するこのシェーダプログラムは、非反復型実行モードに従ってマージ型頂点/ジオメトリシェーダプログラムを実行するときに使用され得る。
【００１９】
対照的に、マージ型頂点/ジオメトリシェーダプログラムを実行するための反復型実行モードは、処理されるべきプリミティブの各々をマージ型頂点/ジオメトリシェーダプログラムのN個のインスタンスに割り当てることと、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々に単一の頂点を出力させることとを伴い得る。いくつかの例では、Nは、マージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しくなり得る。
【００２０】
マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、ジオメトリシェーダ処理を実行するためにプリミティブごとにマージ型頂点/ジオメトリシェーダプログラムの1つのインスタンスを使用し得る一方、マージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードは、ジオメトリシェーダ処理を実行するためにプリミティブごとにマージ型頂点/ジオメトリシェーダプログラムのN個のインスタンスを使用し得る。したがって、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードを使用することは、プリミティブの特定のセットを処理するために必要とされるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの数を、反復型モードと比較して減らすことができる。上記ですでに説明したように、プリミティブを処理するために使用されるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの数を減らすことは、GPUによって使用される処理リソースを減らすこと、GPUによって実行されるリソース割振りの数を減らすこと、および/またはGPUによって消費される電力を減らすことができる。このようにして、マージ型頂点/ジオメトリシェーダプログラムによりプログラム可能頂点シェーディングおよびプログラム可能ジオメトリシェーディングを実行するGPUのパフォーマンスおよび/または電力消費が改善され得る。
【００２１】
さらなる例では、GPUにおけるシェーダプログラムを実行するための技法は、シェーダユニットが、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードとマージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードとの間で切り替えることを可能にするための技法を含み得る。シェーダユニットが、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で切り替えることを可能にすることは、たとえば、パフォーマンス要件、電力消費要件などのような特定の処理要件に適合する特定の実行モードを選択するために、グラフィックスプロセッサのユーザに、追加の制御および/または柔軟性をもたらすことができる。
【００２２】
追加の例では、シェーダプログラムを実行するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で選択し、シェーダユニットに、被選択シェーダプログラム実行モードに従ってマージ型頂点/ジオメトリシェーダプログラムを実行させるための技法を含み得る。いくつかの例では、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムの1回のアプリケーションプログラミングインターフェース(API)呼出しに関連する出力頂点を記憶するために必要な記憶空間の総量に基づいて、かつ/またはマージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムによって実行された頂点増幅の量に基づいて、非反復型モードと反復型モードとの間で選択することができる。
【００２３】
一般に、シェーダユニットにおける出力頂点を記憶するための記憶空間(たとえば、汎用レジスタ(GPR))の量は、限定的であり得る。マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々によって複数の頂点が生成されることを可能にするので、非反復型モードの場合に出力頂点を記憶するために必要とされる記憶空間の量は、反復型モードの場合に必要とされる量よりも大きくなり得る。シェーダユニットに含まれる記憶空間の量が、並列に実行されるべきであるマージ型頂点/ジオメトリシェーダプログラムのインスタンス化の所与のセットに対する出力頂点を記憶するのに十分ではない場合、外部メモリアクセスが実行される必要があり得、これは、シェーダユニットのパフォーマンスを著しく低下させ得る。
【００２４】
上記で説明したように、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、マージ型頂点/ジオメトリシェーダプログラムのインスタンス化の所与のセットを並列に実行するためのパフォーマンスの向上および/または電力消費の低減をもたらすことができる。しかしながら、マージ型頂点/ジオメトリシェーダプログラムのインスタンス化のセットを実行することに関連する出力頂点記憶空間必要量が、シェーダユニットにおける利用可能な出力頂点記憶空間の量よりも大きい場合、外部メモリアクセスによって生じるパフォーマンスの低下が、ジオメトリシェーダ処理を反復しないことによって達成されるパフォーマンスおよび/または電力の改善を上回り得る。
【００２５】
したがって、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、出力頂点を記憶するための記憶空間必要量が比較的小さい場合(たとえば、出力頂点記憶空間必要量が、シェーダユニットに含まれる出力頂点記憶空間の量以下である場合)に、パフォーマンスの向上および/または電力消費の低減をもたらすことができる。一方、マージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードは、出力頂点を記憶するための記憶空間必要量が比較的高い場合(たとえば、出力頂点記憶空間必要量が、シェーダユニットに含まれる出力頂点記憶空間の量よりも大きい場合)に、パフォーマンスの向上をもたらすことができる。
【００２６】
ジオメトリシェーダプログラムの1回のAPI呼出しに関連する出力頂点を記憶するために必要な記憶空間の総量に基づいて、かつ/またはジオメトリシェーダによって実行された頂点増幅の量に基づいて非反復型モードと反復型モードとの間で選択することは、グラフィックスシステムが、出力頂点を記憶するために必要とされる記憶空間の量が比較的小さいときにマージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードを使用し、出力頂点を記憶するために必要とされる空間の量が比較的大きいときにマージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードを使用することを可能にし得る。このようにして、非反復型モードを使用することの恩恵が、比較的小さい出力頂点記憶必要量を伴うシェーダプログラムの場合に得られる一方で、シェーダユニットの記憶空間が、シェーダプログラムに関連する出力頂点を記憶するのに十分ではない場合に、外部メモリアクセスに関連するパフォーマンスの欠点を回避することができる。
【００２７】
さらなる例では、シェーダプログラムを実行するための技法は、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードを生成するための技法を含むことができ、コンパイル済みコードが、シェーダユニットにマージ型頂点/ジオメトリシェーダプログラムを、シェーダプログラムの実行に使用されるべきモードを示す情報に基づいて非反復型モードまたは反復型モードに従って選択的に実行させる命令を含む。いずれかのモードを選択的に実行することが可能である命令を、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードに配置することは、シェーダユニットに新しいシェーダプログラムを再ロードする必要なしに、シェーダユニットの処理モードが変更されることを可能にし得る。その上、いずれかのモードを選択的に実行することが可能である命令を、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードに配置することは、マージ型頂点/ジオメトリシェーダプログラムのコンパイルを簡素化することもできる。
【００２８】
図1は、本開示のシェーダプログラム実行技法を使用することによって実装され得る例示的なグラフィックスパイプライン10を示す概念図である。いくつかの例では、グラフィックスパイプライン10は、Microsoft(登録商標) DirectX(DX)10グラフィックスパイプラインに対応し得る。さらなる例では、グラフィックスパイプライン10は、テッセレーションが無効化されたMicrosoft(登録商標) DX11グラフィックスパイプラインに対応し得る。
【００２９】
グラフィックスパイプライン10は、1つまたは複数のグラフィックスプリミティブをレンダーターゲットにレンダリングするように構成される。グラフィックスパイプライン10は、リソースブロック12と、入力アセンブラ14と、頂点シェーダ16と、ジオメトリシェーダ18と、ラスタライザ20と、ピクセルシェーダ22と、出力マージャ24とを含む。
【００３０】
リソースブロック12は、たとえば、1つもしくは複数のテクスチャおよび/または1つもしくは複数のバッファ(たとえば、頂点バッファ、フレームバッファなど)のような、グラフィックスパイプライン10におけるパイプライン段階によって使用される1つまたは複数のメモリリソースに対応し得る。直角の隅を有する図1に示す処理段階は、固定機能処理段階を表し、丸い隅を有する図1に示す処理段階は、プログラム可能処理段階を表す。たとえば、図1に示すように、入力アセンブラ14、ラスタライザ20、および出力マージャ24は固定機能処理段階であり、頂点シェーダ16、ジオメトリシェーダ18、およびピクセルシェーダ22はプログラム可能処理段階である。
【００３１】
プログラム可能処理段階は、グラフィックスパイプライン10を実装するGPUを使用するホストデバイスによって定義され、ホストデバイスによってコンパイルされ、かつ/またはホストデバイスによってGPUにロードされるプログラム(たとえば、シェーダプログラム)を実行するように構成される処理段階を指し得る。場合によっては、プログラムは、ホストデバイス上で実行されるユーザレベルグラフィックスアプリケーションによって定義され、ホストデバイス上で実行されるGPUドライバによってGPUにロードされ得る。固定機能処理段階は、ホストデバイスからプログラムを受信し実行するように構成されていないハードウェアを含むことができる。固定機能処理段階に含まれるハードウェアは、いくつかの機能を実行するようにハードワイヤードされ得る。固定機能処理段階に含まれるハードウェアは構成可能であり得るが、ハードウェアの構成可能性は、プログラム(たとえば、シェーダプログラム)に基づくのではなく、1つまたは複数の制御信号に基づく。
【００３２】
グラフィックスパイプライン10に示すプログラム可能段階の各々は、特定のタイプのシェーダプログラムを実行するように構成され得る。たとえば、頂点シェーダ16は、頂点シェーダプログラムを実行するように構成され得、ジオメトリシェーダ18は、ジオメトリシェーダプログラムを実行するように構成され得、ピクセルシェーダ22は、ピクセルシェーダプログラムを実行するように構成され得る。
【００３３】
グラフィックスパイプライン10を実装するGPUは、異なるタイプのシェーダプログラムを実行するように構成される1つまたは複数のシェーダユニットを含み得る。異なるタイプのシェーダプログラムの各々は、グラフィックスパイプライン10を実装するGPUの共通シェーダユニット上、および/またはもっぱら1つもしくは複数の特定のタイプのシェーダプログラムを実行する1つもしくは複数の専用シェーダユニット上で実行され得る。
【００３４】
いくつかの例では、頂点シェーダプログラムおよびジオメトリシェーダプログラムは、マージ型頂点/ジオメトリシェーダプログラムにマージされ得、グラフィックスパイプライン10を実装するGPUにおけるシェーダユニットは、本開示でさらに詳細に後述するようにマージ型頂点/ジオメトリシェーダプログラムを実行し得る。そのような例では、シェーダユニットは、いくつかの例では、マージ型頂点/ジオメトリシェーダプログラムがシェーダユニット上で実行されていない時間に、別個のプログラムとしてピクセルシェーダプログラムを実行するようにさらに構成され得る。
【００３５】
次に、グラフィックスパイプライン10の全般的動作について説明する。グラフィックスパイプライン10は、ドローコールコマンドとレンダリングされるべき1つまたは複数のプリミティブを示すデータとの受信に応答して、プリミティブのセットをレンダリングし始める。レンダリングされるべきプリミティブを示すデータは、たとえば、1つもしくは複数の頂点バッファ、1つもしくは複数のインデックスバッファ、および/またはレンダリングされるべきプリミティブのタイプを示す1つもしくは複数の状態構成を含むことができる。頂点バッファおよび/またはインデックスバッファは、いくつかの例では、リソースブロック12に記憶され得る。
【００３６】
入力アセンブラ14は、1つまたは複数の頂点をリソースブロック12から取り出し、頂点に基づくジオメトリ(たとえば、プリミティブ)を形成し、さらなる処理のために頂点シェーダ16に頂点を出すことができる。入力アセンブラ14はまた、頂点の各々に関する1つまたは複数のシステム生成値を生成し、システム生成値を頂点シェーダ16および/またはジオメトリシェーダ18に供給することができる。たとえば、入力アセンブラ14は、特定のドローコールにおける頂点の各々を一意に識別する頂点識別値を生成し、頂点識別値を頂点シェーダ16および/またはジオメトリシェーダ18に供給することができる。別の例として、入力アセンブラ14は、特定のドローコールにおけるプリミティブの各々を一意に識別するプリミティブ識別値を生成し、プリミティブ識別値をジオメトリシェーダ18に供給することができる。
【００３７】
頂点シェーダ16は、入力アセンブラ14から受信された頂点に基づいて、かつ頂点シェーダプログラムに基づいて出力頂点を生成することができる。プログラミングの観点から、出力頂点を生成するために、頂点シェーダ16は、入力アセンブラ14から受信される頂点の各々に対して、頂点シェーダプログラムのそれぞれのインスタンスを実行することができる。いくつかの例では、頂点シェーダプログラムは、出力頂点を生成するために入力頂点に対する頂点ごとの処理を実行することができる。頂点ごとの処理は、処理される頂点の各々に対して独立して実行される処理を指し得る。頂点ごとの処理は、たとえば、頂点変換(vertex transformation)を実行すること、ライティング演算(lighting operation)を実行すること、フォグ演算を実行すること、頂点シェーディングを実行すること、などを含み得る。
【００３８】
ジオメトリシェーダ18は、ジオメトリシェーダ18によって受信される入力プリミティブに基づいて、かつジオメトリシェーダプログラムに基づいて出力プリミティブを生成することができる。ジオメトリシェーダ18によって受信される入力プリミティブは、頂点シェーダ16によって生成される出力頂点に基づいて形成され得る。プログラミングの観点から、出力プリミティブを生成するために、ジオメトリシェーダ18は、ジオメトリシェーダ18によって受信されるプリミティブの各々に対して、ジオメトリシェーダプログラムのそれぞれのインスタンスを実行することができる。いくつかの例では、ジオメトリシェーダプログラムは、出力プリミティブを生成するために入力プリミティブに対するプリミティブごとの処理を実行することができる。プリミティブごとの処理は、処理されるプリミティブの各々に対して独立して実行される処理を指し得る。プリミティブごとの処理は、たとえば、頂点を追加または削除すること、各入力プリミティブに対してジオメトリシェーダ18によって出力されるプリミティブの数を追加または削除すること、などを含み得る。
【００３９】
ラスタライザ20は、ジオメトリシェーダ18から受信されたプリミティブに基づいてソースピクセルを生成することができる。たとえば、ジオメトリシェーダ18から受信されたプリミティブの各々に対して、ラスタライザ20はプリミティブをラスタライズして、プリミティブに対応する複数のソースピクセルを生成することができる。プリミティブをラスタライズすることは、たとえば、プリミティブに対する走査変換を実行して、どのピクセルがプリミティブに対応するかを判断すること、および/またはプリミティブに対応するピクセルの属性を、プリミティブの頂点の属性に基づいて補間することを伴い得る。
【００４０】
ピクセルシェーダ22は、ラスタライザ20から受信された入力ソースピクセルに基づいて、かつピクセルシェーダプログラムに基づいて出力ソースピクセルを生成することができる。プログラミングの観点から、出力ソースピクセルを生成するために、ピクセルシェーダ22は、ラスタライザ20から受信されるピクセルの各々に対して、ピクセルシェーダプログラムのそれぞれのインスタンスを実行することができる。いくつかの例では、ピクセルシェーダプログラムは、入力ソースピクセルに対するピクセルごとの処理を実行して、出力ソースピクセルを生成することができる。ピクセルごとの処理は、処理されるピクセルの各々に対して独立して実行される処理を指し得る。ピクセルごとの処理は、たとえば、ピクセルシェーディングを実行すること、テクスチャマッピングを実行すること、などを含むことができる。
【００４１】
出力マージャ24は、ピクセルシェーダ22から受信されたソースピクセルに基づいて宛先ピクセルを生成することができる。いくつかの例では、出力マージャ24は、ピクセルシェーダ22から受信されたソースピクセルの各々を、レンダーターゲットに記憶された対応する宛先ピクセルとマージして、対応する宛先ピクセルの更新バージョンを生成することができる。宛先ピクセルがソースピクセルのピクセルロケーションと同じピクセルロケーションをレンダーターゲット中に有する場合、宛先ピクセルはソースピクセルに対応し得る。ソースピクセルを宛先ピクセルとマージするために、出力マージャ24は、マージされるべきソースピクセルおよび宛先ピクセルに対して、混合演算、合成演算、およびラスタ演算のうちの1つまたは複数を実行することができる。
【００４２】
得られた宛先ピクセルは、レンダーターゲットに記憶され、レンダーターゲットは、いくつかの例ではフレームバッファであり得る。レンダーターゲットは、リソースブロック12の一部を形成し得る。レンダーターゲットに記憶されたデータは、グラフィックスパイプライン10によって受信されたプリミティブのラスタライズされた合成バージョンに対応し得る。
【００４３】
上記で説明したように、プログラミングの観点から(たとえば、APIの観点から)、頂点シェーダプログラムは、グラフィックスパイプラインによって各到来頂点に対して1回呼び出されるのが一般的であり、各呼出しに対して1つの出力頂点を生成するように構成される。ピクセルシェーダプログラムは、各到来ピクセルに対して1回呼び出されるのが一般的であり、各呼出しに対して1つの出力ピクセルを生成するように構成される。ジオメトリシェーダプログラムは、各到来プリミティブ(たとえば、点、線、三角形)に対して1回呼び出されるのが一般的であり、各呼出しに対して0個、1つ、2つ、またはより多くの出力プリミティブを生成するように構成される。
【００４４】
グラフィックスパイプライン10のプログラム可能シェーダ段階は通常、1つまたは複数のシェーダユニットを有するGPU上に実装される。シェーダユニットの各々は、特定のシェーダプログラムのための複数のスレッドを並列に実行する複数の処理要素(たとえば、算術論理ユニット(ALU))を含むことができる。場合によっては、シェーダユニットは、シェーダユニットにおける処理要素の各々がシェーダプログラムの同じ命令を異なるデータに対して同時に実行する単一命令多重データ(SIMD)シェーダユニットであり得る。
【００４５】
しばしば、シェーダユニットの同じセットは、グラフィックスパイプライン10に含まれる複数の異なるタイプのシェーダ段階を実装することができる。ジオメトリシェーダの開発前には、グラフィックスレンダリングパイプラインにおける唯一のプログラム可能処理段階は通常、頂点シェーダおよびピクセルシェーダであった。頂点シェーダおよびピクセルシェーダは、各シェーダ呼出しに対して単一の入力頂点またはピクセルが受信され、各シェーダ呼出しに対して単一の出力頂点またはピクセルが出力される単入力/単出力プログラミングインターフェースの下で動作する。頂点シェーダとピクセルシェーダの両方のための単入力/単出力プログラミングインターフェースは、共通単入力/単出力ハードウェアインターフェースを有する共通ハードウェアシェーダユニット上で両方のタイプのシェーダが実行されることを可能にする。
【００４６】
しかしながら、シェーダユニットのための単入力/単出力ハードウェアインターフェースの1つの欠点は、そのようなインターフェースが、頂点シェーダプログラムが呼出しごとに複数の頂点を生成することを可能にしないことである。これは、グラフィックスレンダリングAPIのために実装され得る頂点シェーダプログラミングモデルの柔軟性を限定する。
【００４７】
シェーダユニットのための単入力/単出力ハードウェアインターフェースの別の欠点は、ジオメトリシェーダがそのようなインターフェースに適合しないことである。より具体的には、ジオメトリシェーダは、ジオメトリシェーダによって受信された各入力プリミティブに対する(指定された制限内の)任意の数のプリミティブを出力するように構成され、プリミティブの各々は、任意の数の頂点を含み得る。したがって、ジオメトリシェーダは、単入力/単出力プログラミングインターフェースに適合しない。これは、単入力/単出力ハードウェアインターフェースを実装する共通ハードウェアシェーダユニット上で頂点シェーダおよび/またはピクセルシェーダとともにジオメトリシェーダを実行することを難しくする。
【００４８】
単入力/単出力ハードウェアインターフェースに適合しないジオメトリシェーダプログラミングインターフェースの問題に対処する1つの解決策は、頂点シェーダプログラムおよびジオメトリシェーダプログラムを単一のマージ型頂点/ジオメトリシェーダプログラムにマージし、マージ型頂点/ジオメトリシェーダプログラムを共通シェーダスレッドの一部として実行することである。マージ型頂点/ジオメトリシェーダプログラムは、頂点シェーダプログラムによって指定される頂点シェーダ関数と、後続する、ジオメトリシェーダプログラムによって指定されるジオメトリシェーダ関数とを含み得る。マージ型頂点/ジオメトリシェーダプログラムは、頂点シェーダ関数によって生成された出力データ項目およびジオメトリシェーダ関数によって受信された入力データ項目を適切に管理するために、頂点シェーダ関数とジオメトリシェーダ関数との間に挿入されるパッチコードをさらに含み得る。
【００４９】
上述の例における単入力/単出力プログラミングインターフェースをマージ型頂点/ジオメトリシェーダプログラムが実装することを可能にするために、マージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスが、ジオメトリシェーダ処理が実行されるべきであるプリミティブの各々に対してインスタンス化され得、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々は、単一の頂点を受信し、単一の頂点を出力するように構成され得る。マージ型頂点/ジオメトリシェーダの複数のインスタンスによって生成された出力頂点のセットは全体的に、マージ型頂点/ジオメトリシェーダプログラムによって実装されたジオメトリシェーダ段階の1回のAPIインスタンス化によって生成された出力プリミティブの頂点に対応し得る。
【００５０】
たとえば、グラフィックス処理パイプラインによって処理される入力プリミティブの各々に対して、マージ型頂点/ジオメトリシェーダプログラムは、N回インスタンス化され得、Nが、マージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムによって指定されたプリミティブごとの出力頂点の最大数に等しい。ジオメトリシェーダプログラムによって指定された出力頂点のうちの異なる1つは、異なるインスタンス化の各々によって放出され得、それにより全体的に、マージ型頂点/ジオメトリシェーダプログラムのN回のインスタンス化が、マージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムによって定義された出力頂点のすべてを出力する。この例におけるマージ型頂点/ジオメトリシェーダプログラムのインスタンス化の各々は、単一の入力頂点を受信し、単一の出力頂点を出力するので、マージ型頂点/ジオメトリシェーダは、単入力/単出力ハードウェアインターフェースを実装するシェーダユニット上で実行され得る。
【００５１】
グラフィックスAPI(たとえば、DX10およびDX11など)は、各到来プリミティブに対して1回実行される段階としてジオメトリシェーダ段階を定義する。しかしながら、上述したマージ型頂点/ジオメトリシェーダプログラム実行技法の場合、マージ型頂点/ジオメトリシェーダプログラムのN個の異なるインスタンスが各到来プリミティブに対して実行され得る。言い換えれば、ジオメトリシェーダ処理は事実上、ジオメトリシェーダの各API呼出しに対してN回反復される。したがって、マージ型頂点/ジオメトリシェーダを実行するための上述の技法は、マージ型頂点/ジオメトリシェーダを実行するための反復型モードと呼ばれ得る。
【００５２】
マージ型頂点/ジオメトリシェーダを実行するための反復型モードの1つの欠点は、ジオメトリシェーダ処理によって実行される計算が、マージ型頂点/ジオメトリシェーダプログラムの各インスタンス化に対して繰り返され得ることである。たとえば、場合によっては、マージ型頂点/ジオメトリシェーダプログラムのためのジオメトリシェーダ処理は、出力頂点を特定の順序で計算させるプログラム制御ループを含むことがあり、マージ型頂点/ジオメトリシェーダプログラムのためのジオメトリシェーダ処理は、いくつかの例では、滝機構(waterfall mechanism)を使用して動作することがある。滝機構が使用されるとき、マージ型頂点/ジオメトリシェーダプログラムの所与のインスタンス化に関して、ジオメトリシェーダ関数のためのプログラム制御ループが、出力頂点の各々に対して、特定のインスタンス化によって放出されるべきである特定の頂点が計算されるまで実行され得る。特定のインスタンス化によって放出されるべきである頂点が計算された後、ジオメトリシェーダ処理のための制御フローは、制御ループの実行を停止することができる。
【００５３】
言い換えれば、滝機構が使用されるとき、マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンスが、ジオメトリシェーダ関数のためのプログラム制御ループを1回実行し、制御ループの単一の繰返しに対応する頂点を出力することができ、マージ型頂点/ジオメトリシェーダプログラムの第2のインスタンスが、ジオメトリシェーダ関数のためのプログラム制御ループを2回実行し、制御ループの第2の繰返しに対応する頂点を出力することができ、マージ型頂点/ジオメトリシェーダプログラムの第3のインスタンスが、ジオメトリシェーダ関数のためのプログラム制御ループを3回実行し、制御ループの第3の繰返しに対応する頂点を出力することができ、以下同様である。
【００５４】
滝機構を使用することは、マージ型頂点/ジオメトリシェーダの複数のインスタンスが各プリミティブに対してインスタンス化されるときに発生する繰返し型計算の一部を減らすことができるが、そのような機構は依然として、繰返し型計算を生じさせる。たとえば、ジオメトリシェーダ関数によって計算されるべき第1の頂点はN回計算されることになり、第2の頂点はN-1回計算されることになり、以下同様である。そのような繰返し型頂点計算は、シェーダユニットの効率性を低下させること、および/またはシェーダユニットの電力消費を増大させることがある。
【００５５】
マージ型頂点/ジオメトリシェーダを実行するための反復型モードの別の欠点は、ジオメトリシェーダの各呼出しに対してリソース(たとえば、汎用レジスタ(GPR))が割り振られる必要があり、繰返し型リソース割振りが生じることである。繰返し型リソース割振りも、シェーダユニットの効率性を低下させること、および/またはシェーダユニットの電力消費を増大させることがある。
【００５６】
マージ型頂点/ジオメトリシェーダを実行するための反復型モードのさらなる欠点は、そのようなモードが、頂点シェーダの処理必要量を減らすために複数のプリミティブによって共有される頂点を再使用することが可能ではないことである。頂点再使用を可能にしないことは、電力消費を増大させること、および/またはメモリ帯域幅使用を増大させることがある。
【００５７】
本開示のいくつかの態様によれば、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行するための技法が説明される。シェーダプログラムに含まれるプログラム命令に基づいて、複数の出力頂点が生成され得る。頂点シェーダ処理を実行し、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、たとえば、ジオメトリシェーダの各API呼出しに対する複数の実行スレッドにわたるジオメトリシェーダ処理の反復を必要とせずに、マージ型頂点/ジオメトリシェーダプログラムによりジオメトリシェーダ処理が実行されることを可能にし得る。
【００５８】
たとえば、マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスが、反復型モードに関して上述したように、N個の頂点/ジオメトリシェーダインスタンスの代わりに、ジオメトリシェーダの各API呼出しに対するジオメトリシェーダ処理を実行するために呼び出され得る。マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスは、N個の頂点を放出することができ、Nが、マージ型頂点/ジオメトリシェーダプログラムに対応するジオメトリシェーダプログラムによって定義された出力頂点の数である。マージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスによって生成されたN個の出力頂点は全体的に、マージ型頂点/ジオメトリシェーダプログラムによって実装されたジオメトリシェーダ段階の1回のAPIインスタンス化によって生成された出力プリミティブの頂点に対応し得る。このようにして、複数の実行スレッドにわたるジオメトリシェーダ処理の反復を必要とせずに、シェーダユニットによってマージ型頂点/ジオメトリシェーダが実行され得る。ジオメトリシェーダの各API呼出しに対するジオメトリシェーダ処理を実行するために単一の頂点/ジオメトリシェーダインスタンスが呼び出され得るので、マージ型頂点/ジオメトリシェーダを実行するこのモードは、マージ型頂点/ジオメトリシェーダを実行するための非反復型モードと呼ばれ得る。
【００５９】
ジオメトリシェーダ処理の反復を必要とせずにシェーダユニットによってマージ型頂点/ジオメトリシェーダが実行されることを可能にすることは、ジオメトリシェーダのAPI呼出しごとに必要とされるALU計算の数を減らすこと、ジオメトリシェーダのAPI呼出しごとにGPUによって消費されるリソースの数を減らすこと、および/またはジオメトリシェーダの各API呼出しに対して発生する必要があるリソース割振りの数を減らすことができる。このようにして、GPUのパフォーマンスが改善され得、かつ/またはGPUの電力消費が減り得る。
【００６０】
加えて、ジオメトリシェーダ関数の反復を必要とせずにシェーダユニットによってマージ型頂点/ジオメトリシェーダが実行されることを可能にすることは、1つまたは複数の頂点を共有するプリミティブ間で頂点再使用が生じることを可能にし得る。共有される頂点が再使用されることを可能にすることは、メモリ帯域幅を節約すること、および/または電力消費を減らすことができる。
【００６１】
その上、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、グラフィックスAPIにおいて使用される頂点シェーダプログラミングモデルの柔軟性を高めることができる。通常、頂点シェーダプログラミングモデルは、頂点シェーダプログラムが各入力頂点に対して1回呼び出されるべきであること、および頂点シェーダプログラムが頂点シェーダプログラムの各呼出しに対して単一の出力頂点を生成すべきであることを指定する。しかしながら、頂点シェーダ処理を実行し、各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行することは、頂点シェーダプログラムの各呼出しに対して複数の出力頂点が生成されることを可能にする頂点シェーダプログラミングモデルを実装するために使用され得る。このようにして、GPUによって実行されるプログラム可能頂点処理の柔軟性が改善され得る。
【００６２】
図2は、本開示のシェーダプログラム実行技法を実装するために使用され得る例示的なグラフィックス処理装置(GPU)30のブロック図である。GPU30は、ホストデバイス(たとえば、ホスト中央処理装置(CPU))から受信されたグラフィックスコマンド、状態情報、およびシェーダプログラムに基づいてグラフィックス処理を実行するように構成される。GPU30は、グラフィックスプロセッサの一例であり、代替的にグラフィックスプロセッサと呼ばれることがある。GPU30は、コマンドエンジン32および処理ユニット34を含む。
【００６３】
いくつかの例では、処理ユニット34のうちの1つまたは複数は、3次元(3D)グラフィックスレンダリングパイプラインを形成するように構成可能であり得る。たとえば、処理ユニット34のうちの1つまたは複数は、図1に示すグラフィックスパイプライン10を実装するように構成可能であり得る。
【００６４】
コマンドエンジン32および処理ユニット34は、専用ハードウェアユニット、ファームウェア、ソフトウェア、シェーダユニット、プロセッサ、およびそのような構成要素に帰せられる機能を実行するように構成される処理要素の任意の組合せを含むことができる。いくつかの例では、GPU30は、GPU30の1つまたは複数のプロセッサに、本開示で説明する技法のうちのいずれかの全部または一部を実行させる命令を実行するように構成され得る。
【００６５】
コマンドエンジン32は、ホストデバイスからコマンドおよびグラフィックスデータを受信し、コマンドに基づいてGPU30の状態を管理し、処理ユニット34の動作を、コマンドに基づいてグラフィックスデータをレンダリングするように制御することができる。たとえば、ドローコールコマンドの受信に応答して、コマンドエンジン32は、処理ユニット34の動作を、処理ユニット34がグラフィックスレンダリングパイプライン(たとえば、図1に示すグラフィックスパイプライン10)を実装し、グラフィックスデータをグラフィックスレンダリングパイプラインを介してレンダーターゲットにレンダリングさせるように、制御することができる。別の例として、コマンドエンジン32は、ホストデバイスから1つまたは複数のシェーダプログラムを受信し、GPU30にシェーダプログラムをロードするようにGPU30に命令する1つまたは複数のコマンドを受信し、シェーダプログラムをロードさせ、かつ/またはGPU30における1つもしくは複数のシェーダユニットに関連する命令キャッシュに記憶させることができる。
【００６６】
処理ユニット34の各々は、プログラム可能処理ユニットまたは固定機能処理ユニットであり得る。プログラム可能処理ユニットは、GPU30を使用するホストデバイスによって定義され、ホストデバイスによってコンパイルされ、かつ/またはホストデバイスによってGPU30にロードされるプログラム(たとえば、シェーダプログラム)を実行するように構成される処理ユニットを指し得る。固定機能処理ユニットは、ホストデバイスからプログラムを受信し実行するように構成されていないハードウェアを含むことができる。固定機能処理段階に含まれるハードウェアは構成可能であり得るが、ハードウェアの構成可能性は、プログラム(たとえば、シェーダプログラム)に基づくのではなく、1つまたは複数の制御信号に基づく。
【００６７】
図2に示すように、処理ユニット34は、スレッドスケジューラ36およびシェーダユニット38を含む。いくつかの例では、スレッドスケジューラ36は、固定機能処理ユニットであり得る。図2には特に示されていないが、処理ユニット34は、グラフィックスレンダリングパイプラインの全部または部分を実装するために使用され得る他の固定機能処理ユニットおよび/またはプログラム可能処理ユニットを含むことができる。たとえば、処理ユニット34は、図1のグラフィックスパイプライン10における入力アセンブラ14、ラスタライザ20、および出力マージャ24を実装するように構成される固定機能処理ユニットを含むことができる。
【００６８】
シェーダユニット38の各々は、プログラム可能処理ユニットであり得る。いくつかの例では、シェーダユニット38は、グラフィックスレンダリングパイプラインのシェーダ段階のうちの1つまたは複数を実装することができる。たとえば、シェーダユニット38は、図1に示すグラフィックスパイプライン10の頂点シェーダ16、ジオメトリシェーダ18、および/またはピクセルシェーダ22を実装することができる。いくつかの例では、シェーダユニット38の全部またはサブセットは、グラフィックスレンダリングパイプラインによって実装される特定のタイプのシェーダプログラムのみを実行するように構成される専用シェーダユニットであり得る。さらなる例では、シェーダユニット38の全部またはサブセットは、グラフィックスレンダリングパイプラインによって実装されるタイプのシェーダプログラムの全部またはサブセットを実行するように構成される一般的なシェーダユニット(たとえば、統合型シェーダユニット)であり得る。
【００６９】
スレッドスケジューラ36は、シェーダユニット38上でシェーダプログラムスレッドがどのように実行されるかを制御するように構成される。シェーダユニット38の各々は、ホストデバイスからGPU30にロードされるシェーダプログラムを実行するように構成され得る。シェーダプログラムは、GPU30のプログラム可能処理段階によって実行されるプログラムを指し得る。場合によっては、シェーダプログラムは、ホストデバイス上で実行されるユーザレベルグラフィックスアプリケーションによって定義され、ホストデバイスによってGPU30にロードされ得る。さらなる場合、シェーダプログラムは、たとえば、High Level Shading Language(HLSL)、OpenGL Shading Language(GLSL)、C for Graphics(Cg)シェーディング言語などのような高水準シェーディング言語で書かれるソースコードシェーダプログラムのコンパイル済みバージョンであり得る。
【００７０】
スレッドスケジューラ36は、1つまたは複数のシェーダプログラムによって処理されるべき1つまたは複数のデータ項目を示す情報を受信し、データ項目を処理するためのスレッド構成を決定し、シェーダユニット38に、スレッド構成に基づいてデータ項目を処理するための1つまたは複数のスレッドを実行させることができる。データ項目は、たとえば、シェーダプログラム(たとえば、頂点シェーダプログラム)によって処理されるべき1つもしくは複数の頂点、シェーダプログラム(たとえば、ジオメトリシェーダプログラム)によって処理されるべき1つもしくは複数のプリミティブ、ならびに/またはシェーダプログラム(たとえば、マージ型頂点/ジオメトリシェーダプログラム)によって処理されるべき1つもしくは複数の頂点および1つもしくは複数のプリミティブを含むことができる。
【００７１】
スレッドは、シェーダユニット38のうちの1つによって実行される(たとえば、シェーダユニットに含まれる複数の処理要素のうちの1つによって実行される)シェーダプログラムのインスタンスを指し得る。特定のシェーダプログラムのインスタンスの各々は、潜在的に異なるデータ項目に対して同じ命令を実行することができる。たとえば、頂点シェーダプログラムのインスタンスの各々は、複数の頂点の各々に対して同じ命令を実行することができる。別の例として、ジオメトリシェーダプログラムのインスタンスの各々は、複数のプリミティブの各々に対して同じ命令を実行することができる。さらなる例として、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々は、複数の頂点の各々および複数のプリミティブの各々の一方または両方に対して同じ命令を実行することができる。場合によっては、マージ型頂点/ジオメトリシェーダプログラムのインスタンスのサブセットによって実行される個々の頂点および/またはプリミティブは、同じであり得る。
【００７２】
スレッド構成は、特定のシェーダプログラムによって処理されるべきデータ項目を、シェーダユニット38のうちの1つまたは複数によって実行されるべきであるシェーダプログラムのそれぞれのスレッド(たとえば、インスタンス)に割り当てる情報を含むことができる。たとえば、頂点シェーダプログラムの場合、スレッド構成は、シェーダユニット38のうちの1つまたは複数によって実行されるべきであるスレッドの各々に複数の頂点の各々を割り当てる情報を含むことができる。別の例として、ジオメトリシェーダプログラムの場合、スレッド構成は、シェーダユニット38のうちの1つまたは複数によって実行されるべきであるスレッドの各々に複数のプリミティブの各々を割り当てる情報を含むことができる。さらなる例として、マージ型頂点/ジオメトリシェーダプログラムの場合、スレッド構成は、シェーダユニット38のうちの1つまたは複数によって実行されるべきであるスレッドの各々に複数の頂点の各々および/または複数のプリミティブの各々を割り当てる情報を含むことができる。マージ型頂点/ジオメトリシェーダプログラムは、たとえば、頂点とプリミティブの両方に、頂点のみに、またはプリミティブのみに割り当てられ得る。
【００７３】
シェーダユニット38のうちの1つにスレッド構成に基づいてスレッドを実行させるために、スレッドスケジューラ36は、スレッド構成を示す情報をシェーダユニットに提供することができる。スレッド構成を示す情報は、特定のシェーダプログラムによって処理されるべきデータ項目の、シェーダユニットによって実行されるべきであるシェーダプログラムのそれぞれのスレッドへの割当てを示す情報を含むことができる。データ項目は、頂点、プリミティブ、および/またはピクセルを含み得る。
【００７４】
シェーダユニット38の各々は、1つまたは複数のデータ項目を処理するためのスレッド構成を示す情報を受信し、スレッドスケジューラ36から受信されたスレッド構成を示す情報に基づいて、データ項目に対してシェーダプログラムの複数のインスタンスを実行するように構成され得る。いくつかの例では、シェーダユニット38の各々は、それぞれのシェーダユニットによって実行されるべきシェーダプログラムに基づいて、かつ/またはスレッド構成に基づいて、それぞれのシェーダユニットにおけるレジスタを割り振るようにさらに構成され得る。
【００７５】
ウェーブは、シェーダユニット38のうちの1つに提出される、シェーダユニットによって並列に実行されるべきスレッドのグループを指し得る。言い換えれば、ウェーブに含まれるスレッドは、シェーダユニット上で同時に実行され得る。ウェーブにおけるスレッドの各々は、同じシェーダプログラムの複数のインスタンスの各々に対応し得る。いくつかの例では、ウェーブにおけるスレッドの各々は、ファイバーと呼ばれ得る。ウェーブのサイズは、ウェーブに含まれるファイバーの数を指し得る。
【００７６】
シェーダユニット38のうちの1つが複数の単一命令多重データ(SIMD)処理要素を含む例では、シェーダユニットは、ウェーブにおけるファイバーの各々が複数のSIMD処理要素の各々の上で実行されるように、ウェーブを実行することができる。そのような例では、シェーダユニットにおけるSIMD処理要素の数は、シェーダユニットによって実行されるウェーブのサイズ(すなわち、ウェーブにおけるファイバーの数)以上であり得る。
【００７７】
いくつかの例では、シェーダプログラムによりデータ項目の特定のセットを処理するためのスレッド構成を決定するために、スレッドスケジューラ36は、データ項目のセットを処理するためのウェーブ構成を決定し得る。ウェーブ構成は、特定のシェーダプログラムによって処理されるべきデータ項目を、シェーダユニット38のうちの1つの上で並列に実行されるべきスレッドのウェーブに含まれるそれぞれのスレッドに割り当てる情報を含むことができる。そのような例では、スレッドスケジューラ36によってシェーダユニットに提供されるスレッド構成を示すデータは、データ項目のセットを処理するためのウェーブ構成を示すデータを含み得る。
【００７８】
いくつかの例では、スレッドスケジューラ36および/またはシェーダユニット38は、本開示で説明する技法のうちの一部または全部を実行するように構成され得る。たとえば、スレッドスケジューラ36は、本開示の技法に従ってスレッド構成および/またはウェーブ構成を決定するように構成され得る。別の例として、シェーダユニット38の各々は、本開示の技法に従ってそれぞれのシェーダユニットに提出される1つまたは複数のスレッドおよび/またはウェーブを実行するように構成され得る。スレッドスケジューラ36およびシェーダユニット38がどのように動作するかに関するさらなる詳細は、後で本開示において、図3に関してシェーダユニット38のうちの例示的な1つについて説明した後に説明する。
【００７９】
図3は、図2のGPUにおいて使用され得る例示的なシェーダユニット40を示すブロック図である。いくつかの例では、シェーダユニット40は、図2に示すシェーダユニット38のうちの1つに対応し得る。シェーダユニット40は、スレッド構成を示す情報に基づいて、1つまたは複数の異なるタイプのシェーダプログラムを実行するように構成される。シェーダユニット40は、制御ユニット42と、命令ストア44と、処理要素46A〜46H(総称して「処理要素46」)と、レジスタ48と、ローカルメモリ50とを含む。
【００８０】
制御ユニット42は、データ項目を処理するためのスレッド構成を示す情報を受信し、シェーダプログラムに基づいて、かつスレッド構成を示す情報に基づいて、処理要素46上で1つまたは複数のスレッドを実行させることができる。シェーダプログラムは、命令ストア44に記憶され得る。データ項目は、たとえば、レジスタ48、ローカルメモリ50、および/または外部メモリに記憶され得る。いくつかの例では、制御ユニット42は、シェーダユニット40によって実行されるべきシェーダプログラムに基づいて、かつ/またはスレッド構成に基づいて、レジスタ48を処理要素46A〜46Hに割り振るようにさらに構成され得る。
【００８１】
命令ストア44は、シェーダユニット40によって実行されるべきである1つまたは複数のシェーダプログラム(たとえば、シェーダプログラム命令)の全部または一部を記憶するように構成される。命令ストア44は、たとえば、揮発性メモリ、不揮発性メモリ、キャッシュ、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)などを含む、任意のタイプのストレージユニットであり得る。命令ストア44がキャッシュであるとき、命令ストア44は、シェーダユニット40の外部のメモリに記憶される1つまたは複数のシェーダプログラムをキャッシュし得る。命令ストア44はシェーダユニット40の内部にあるものとして示されているが、他の例では、命令ストア44はシェーダユニット40の外部にあり得る。
【００８２】
処理要素46は、シェーダプログラムのスレッドを実行するように構成される。処理要素46の各々は、異なるスレッドを実行し得る。スレッドは、スレッドに特有であるデータ項目に対して実行されるシェーダプログラムのインスタンスを指すことがある。したがって、処理要素46の各々は、潜在的に異なるデータ項目に対してシェーダプログラムのインスタンスを実行すると言われることがある。共通の時点に処理要素46A〜46H上で並列に実行中であるスレッドの集合は、スレッドのウェーブと呼ばれることがある。
【００８３】
図3の例示的なシェーダユニット40では、処理要素46は、単一命令多重データ(SIMD)処理要素であり得る。SIMD処理要素は、アクティブ化されるとき、異なるデータに対して同時に同じ命令を実行するように構成される処理要素を指す。これは、処理要素46が異なるデータ項目に対して並列にシェーダプログラムの複数のスレッドを実行することを可能にし得る。場合によっては、処理要素46の各々は、命令ストア44に含まれる命令を指す共通プログラムカウンタに基づいて、シェーダプログラムの命令を実行し得る。
【００８４】
処理要素46のうちの1つまたは複数が非アクティブ化される場合、そのような処理要素46は、所与の命令サイクルの間にプログラム命令を実行しない。場合によっては、制御ユニット42は、分岐条件がいくつかのスレッドについて満たされ、他のスレッドについて満たされない場合の条件付き分岐命令を実施するために、処理要素46のうちの1つまたは複数を非アクティブ化し得る。
【００８５】
いくつかの例では、処理要素46の各々は、算術論理ユニット(ALU)を含み、および/またはALUに対応し得る。さらなる例では、処理要素46の各々は、ALU機能を実施し得る。ALU機能は、加算、減算、乗算などを含み得る。追加の例では、処理要素46の各々は、スカラーALUまたはベクトルALUであり得る。スカラーALUはスカラーデータ項目を操作し得、ベクトルALUはベクトルデータ項目を操作し得る。スカラーデータ項目は、スカラーのための単一の成分に対応する単一の値を含み得る。ベクトルデータ項目は、ベクトルの複数の成分に対応する複数の値を含み得る。処理要素46がスカラーALUである例では、ベクトルデータ項目がシェーダユニット40によって処理される場合、ベクトルの成分の各々は、いくつかの例では、処理要素46のサブセットによって並列に処理され得る。たとえば、処理要素46A、46B、46C、および46Dは、並列に4成分ベクトルを処理し得る。
【００８６】
処理要素46の各々は、命令ストア44から命令を読み取り、かつ/またはレジスタ48、ローカルメモリ50、および外部メモリのうちの1つもしくは複数からデータ項目を読み取り得る。処理要素46の各々は、レジスタ48、ローカルメモリ50、および外部メモリのうちの1つまたは複数に出力データを書き込み得る。
【００８７】
レジスタ48は、様々な処理要素46に動的に割り振られ得る。場合によっては、レジスタ48の一部または全部は、シェーダユニット40上で実行される様々なスレッドのための入力レジスタおよび/または出力レジスタとして働き得る。入力レジスタは、シェーダプログラムのための入力データ項目(たとえば、入力頂点、入力プリミティブ)を記憶するレジスタを指すことがあり、出力レジスタは、シェーダプログラムのための出力データ項目(たとえば、出力頂点、出力プリミティブ)を記憶するレジスタを指すことがある。
【００８８】
ローカルメモリ50は、たとえば、揮発性メモリ、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)などを含む、任意のタイプのメモリであり得る。いくつかの例では、ローカルメモリ50のためのアドレス空間は、シェーダユニット40に含まれる処理要素46にとってローカルであり得る。言い換えれば、GPU30の他のシェーダユニットおよび/または他の部分は、ローカルメモリ50に直接アクセス可能ではないことがある。同様に、ホストデバイスは、ローカルメモリ50に直接アクセス可能ではないことがある。いくつかの例では、ローカルメモリ50は、シェーダユニット40および/またはGPU30と同じチップ上で実装され得る。
【００８９】
次に、スレッドスケジューラ36およびシェーダユニット40の全般的動作について説明する。GPU30(たとえば、コマンドエンジン32)は、シェーダプログラムを命令ストア44に、または命令ストア44がアクセス可能なメモリ空間にロードする。スレッドスケジューラ36は、シェーダプログラムにより処理する1つまたは複数のデータ項目を示す情報を受信し、データ項目に対してシェーダプログラムを実行するためのスレッド構成を決定し、スレッド構成を示す情報をシェーダユニット40に提供する。スレッド構成は、データ項目の各々の、シェーダユニット40によって実行されるべきシェーダプログラムの1つまたは複数のインスタンスへの割当てを指定し得る。シェーダプログラムのインスタンスの各々は、シェーダプログラムのそれぞれのインスタンスに割り当てられるデータ項目に対してシェーダ処理を実行する(たとえば、シェーダプログラムの命令を実行する)ように構成され得る。
【００９０】
制御ユニット42は、スレッド構成を示す情報を受信し、処理要素46A〜46Hに、スレッド構成に基づいてシェーダプログラムの1つまたは複数のインスタンスを実行させる。処理要素46A〜46Hに、スレッド構成に基づいてシェーダプログラムの1つまたは複数のインスタンスを実行させるために、制御ユニット42は、処理要素46A〜46Hの入力レジスタに、シェーダプログラムインスタンスを実行する前に実行されるべきスレッドに関連する入力データ項目(たとえば、入力頂点)をロードすることができる。たとえば、1つまたは複数の入力レジスタが処理要素46A〜46Hの各々に割り振られることがあり、実行されるべきシェーダプログラムのインスタンスの各々に関して、制御ユニット42は、それぞれのシェーダインスタンスに対応する入力レジスタに、それぞれのシェーダインスタンスによって実行されるべき入力データ項目をロードすることができる。このようにして、シェーダプログラムの複数のインスタンスがシェーダユニット40によって実行され得る。
【００９１】
本開示によれば、シェーダユニット40は、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行するように構成され得る。たとえば、シェーダユニット40はシェーダプログラムの複数のインスタンスを、シェーダプログラムのインスタンスの各々が複数の入力頂点の各々を受信し、複数の入力頂点の各々の受信に応答して複数の出力頂点を生成するように実行することができる。シェーダプログラムのインスタンスの各々は、処理要素46A〜46Hの各々によって実行され得る。
【００９２】
シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、いくつかの例では、入力頂点の特定のセットに対してシェーダプログラムを実行するために使用される処理要素46A〜46Hの数を減らすことを可能にし得る。シェーダプログラムを実行するために使用される処理要素46A〜46Hの数を減らすことは、GPU30によって使用される処理リソースを減らすこと、および/またはGPU30によって消費される電力を減らすことができる。このようにして、GPU30のパフォーマンスおよび/または電力消費が改善され得る。
【００９３】
その上、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、さらなる例では、頂点シェーダプログラムの各呼出しに対して複数の出力頂点が生成されることを可能にする頂点シェーダプログラミングモデルを実装するために使用される。通常、頂点シェーダプログラミングモデルは、頂点シェーダプログラムが各入力頂点に対して1回呼び出されるべきであること、および頂点シェーダプログラムが頂点シェーダプログラムの各呼出しに対して単一の出力頂点を生成すべきであることを指定する。頂点シェーダプログラムの各呼出しに対して複数の出力頂点が生成されることを可能にする頂点シェーダプログラミングモデルを実装することは、グラフィックスプログラマーによって使用され得る頂点シェーダプログラミングの柔軟性を高め得る。
【００９４】
さらに、シェーダプログラムによって受信される入力頂点の各々に対する複数の出力頂点を生成するシェーダプログラムを実行することは、さらなる例では、プリミティブごとにマージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスにより、プリミティブの各々に対するジオメトリシェーダ処理が実行されることを可能にし得る。プリミティブごとにマージ型頂点/ジオメトリシェーダプログラムの単一のインスタンスによりジオメトリシェーダ処理が実行されることを可能にすることは、プリミティブの特定のセットを処理するために必要とされるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの数を、各プリミティブに対してマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスが実行されることを必要とする技法と比較して減らすことができる。プリミティブを処理するために使用されるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの数を減らすことは、GPU30によって使用される処理リソースを減らすこと、GPU30によって実行されるリソース割振りの数を減らすこと、および/またはGPU30によって消費される電力を減らすことができる。このようにして、マージ型頂点/ジオメトリシェーダプログラムによりプログラム可能頂点シェーディングおよびプログラム可能ジオメトリシェーディングを実行するGPU30のパフォーマンスおよび/または電力消費が改善され得る。
【００９５】
図4は、本開示の例示的なシェーダプログラム実行技法を使用して処理され得る例示的な三角形ストリップを示す概念図である。図4に示すように、例示的な三角形ストリップは、8個の頂点(v0、v1、v2、v3、v4、v5、v6、v7)および6個のプリミティブ(p0、p1、p2、p3、p4、p5)を含む。図4の三角形ストリップにおけるプリミティブのいくつかは、頂点を共有する。言い換えれば、同じ頂点が、2つ以上のプリミティブの一部を形成し得る。
【００９６】
図5は、本開示による図4に示す三角形ストリップを処理するためのマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスを実行するために使用され得る例示的なスレッド構成52、54を示す概念図である。スレッド構成52は、反復型シェーダプログラム実行モードに従ってマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスを実行するために使用され得るスレッド構成の一例である。スレッド構成54は、非反復型シェーダプログラム実行モードに従ってマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスを実行するために使用され得るスレッド構成の一例である。
【００９７】
スレッド構成52は、ウェーブ構成56、58、60を含む。スレッド構成54は、ウェーブ構成62を含む。ウェーブ構成56、58、60、62の各々は、シェーダユニット40(たとえば、シェーダユニット40の処理要素46A〜46H)によって並列に処理されるマージ型頂点/ジオメトリシェーダプログラムのインスタンスのウェーブに対応し得る。ウェーブ構成56、58、60、62の各々は、それぞれのウェーブに含まれるマージ型頂点/ジオメトリシェーダプログラムのインスタンスへのデータ項目の割当てを示し得る。単一のウェーブにおけるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々は、シェーダユニット40における処理要素46A〜46Hの個々の上で実行され得る。マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々は、代替的にスレッドおよび/またはファイバーと呼ばれることがある。
【００９８】
図5に示すように、ウェーブ構成56、58、60、62の各々の第1の行はファイバー識別情報(ファイバーID)を指定し、ウェーブ構成56、58、60、62の各々の第2の行は頂点識別情報(頂点ID)を指定し、ウェーブ構成56、58、60、62の各々の第3の行はプリミティブ識別情報(プリミティブID)を指定する。単一のウェーブにおけるマージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々は、一意のそれぞれのファイバーID値に対応し得る。頂点ID値の各々は、図4の三角形ストリップにおける同様の番号の頂点に対応する。同様に、プリミティブID値の各々は、図4の三角形ストリップにおける同様の番号のプリミティブに対応する。
【００９９】
ウェーブ構成56、58、60、62の列の各々は、特定のファイバーへの頂点およびプリミティブの一方または両方の割当てを表す。たとえば、ウェーブ構成56の第1の列は、ファイバー0への頂点v0およびプリミティブp0の割当てを表し、ウェーブ構成56の第6の列は、ファイバー5への頂点v3およびプリミティブp1の割当てを表す。
【０１００】
いかなる値も含まないウェーブ構成56、58、60、62におけるボックスは、その特定のタイプのデータ項目がファイバーに割り当てられないことを示す。たとえば、ウェーブ構成56の第8の列は、ファイバー7へのプリミティブp1の割当てと、ファイバー7への頂点の割当てなしとを表し、ウェーブ構成62の第8の列は、ファイバー7への頂点v7の割当てと、ファイバー7へのプリミティブの割当てなしとを表す。
【０１０１】
頂点およびプリミティブがファイバーに割り当てられるとき、ファイバーは、ファイバーに割り当てられた頂点に対する頂点シェーダ処理、およびファイバーに割り当てられたプリミティブに対するジオメトリシェーダ処理を実行することができる。たとえば、ウェーブ構成56におけるファイバー0は、頂点v0に対する頂点シェーダ処理およびプリミティブp0に対するジオメトリシェーダ処理を実行することができる。
【０１０２】
プリミティブがファイバーに割り当てられ、頂点がファイバーに割り当てられないとき、ファイバーは、プリミティブに対するジオメトリシェーダ処理を実行することができ、必ずしも頂点シェーダ処理を実行しなくてもよい。たとえば、ウェーブ構成56におけるファイバー7は、頂点シェーダ処理を実行しなくてよく、プリミティブp1に対するジオメトリシェーダ処理を実行することができる。
【０１０３】
プリミティブがファイバーに割り当てられ、頂点がファイバーに割り当てられないとき、ファイバーは、プリミティブに対するジオメトリシェーダ処理を実行することができ、必ずしも頂点シェーダ処理を実行しなくてもよい。たとえば、ウェーブ構成56におけるファイバー7は、頂点シェーダ処理を実行しなくてよく、プリミティブp1に対するジオメトリシェーダ処理を実行することができる。
【０１０４】
頂点がファイバーに割り当てられ、プリミティブがファイバーに割り当てられないとき、ファイバーは、頂点に対する頂点シェーダ処理を実行することができ、必ずしもジオメトリシェーダ処理を実行しなくてもよい。たとえば、ウェーブ構成62におけるファイバー7は、頂点v7に対する頂点シェーダ処理を実行することができ、ジオメトリシェーダ処理を実行しなくてよい。
【０１０５】
反復型シェーダプログラム実行モード(すなわち、ウェーブ構成56、58、60)の場合、ファイバーの各々が単一の頂点を受信し、単一の頂点を出力する。したがって、複数のファイバーが、プリミティブの各々に対してジオメトリシェーダ処理を実行する。図5の具体例では、4つのファイバー(すなわち、マージ型頂点/ジオメトリシェーダの4つのインスタンス)が各プリミティブに対して実行される。
【０１０６】
この例は、4つのファイバーの代わりに、3つのファイバー(すなわち、ジオメトリシェーダ段階における出力プリミティブの各々に含まれる頂点の数)を使用した可能性があることに留意されたい。しかしながら、ジオメトリシェーダプログラムは、出力頂点のうちの1つが使用されなくても、この例では4となるように最大出力頂点カウントを定義した。いくつかの例では、ジオメトリシェーダは、1個から1024個の間の頂点となるように最大出力頂点カウントを定義し得る。最大出力頂点カウントは、必ずしも入力プリミティブタイプの頂点の数に等しくなくてもよい。
【０１０７】
非反復型モード(すなわち、ウェーブ構成62)の場合、ファイバーの各々が単一の頂点を受信し、複数の頂点を出力し得る。したがって、プリミティブの各々に関して、プリミティブに対するジオメトリシェーダ処理を実行するために単一のファイバーが使用される。図5の例では、各ファイバー(たとえば、マージ型頂点/ジオメトリシェーダプログラムのインスタンス)は、3つの頂点を出力し得る。ファイバーの各々によって出力された3つの頂点の各セットは、図4に示す三角形プリミティブのうちの1つに対応し得る。
【０１０８】
図5に示すように、反復型モード(すなわち、ウェーブ構成56、58、60)の場合、プリミティブの各々に対するジオメトリシェーダ処理の繰返し型実行は、繰返し型ALU演算および繰返し型リソース割振りを発生させる。これは、GPU30のパフォーマンスを低下させること、および/またはGPU30の電力消費を増大させることがある。その上、ジオメトリシェーダ処理の繰返し型実行は、プリミティブごとに複数のファイバー/処理要素を消費し、これは、GPU30のパフォーマンスをさらに低下させ得る。さらに、反復型モードでは頂点が再使用されず、これは、GPU30が頂点再使用による電力、パフォーマンス、およびメモリ帯域幅の改善を活用することを妨げる。
【０１０９】
対照的に、非反復型モード(すなわち、ウェーブ構成62)は、ジオメトリシェーダによって処理されるプリミティブの各々に対するジオメトリシェーダ関数の単一のインスタンスを実行し、これは、プリミティブごとに実行されるALU演算の数を減らすこと、プリミティブごとに実行されるリソース割振りの数を減らすこと、および/またはプリミティブごとに消費されるファイバー/処理要素の数を減らすことができる。プリミティブごとのALU演算、プリミティブごとのリソース割振り、および/またはプリミティブごとに消費されるファイバー/処理要素を減らすことは、GPUのパフォーマンスを改善すること、および/またはGPUの電力消費を減らすことができる。その上、非反復型モードでは頂点再使用が生じ、それによって、プリミティブごとに実行される頂点処理の量を減らし得る。頂点処理の量を減らすことは、グラフィックス処理システムにおけるパフォーマンスを改善すること、電力を節約すること、および/またはメモリ帯域幅を減らすことができる。
【０１１０】
非反復型モードは、ジオメトリシェーダ処理のパフォーマンスおよび電力消費を改善することに関して、かつ頂点再使用が生じることを可能にすることに関して、いくつかの利点を提供することができるが、非反復型モードには不利な点があり得る。たとえば、各ファイバーが複数の頂点を出力することができるので、頂点/ジオメトリシェーダファイバーの単一のウェーブに対する出力頂点を記憶するために必要とされるオンチップ記憶空間(たとえば、シェーダユニット40のレジスタ48)の総量は、特にジオメトリシェーダが比較的大量の頂点増幅を実行する場合に、大きいことがある。頂点を記憶するためにオフチップメモリが使用され得るが、そのようなメモリの使用は、シェーダユニット40のパフォーマンスを著しく低下させ得る。
【０１１１】
図5の例では、各ファイバーは、最大4つの頂点を出力することが可能であり、その結果、ウェーブごとに32個の頂点に対してオンチップ記憶空間が割り振られる必要が生じ得る。対照的に、反復型モードは、ファイバーごとに単一の頂点を出力する。したがって、単一のウェーブに関して、記憶空間は、この例では8個の頂点に限定され得る。
【０１１２】
一般に、シェーダユニット40における出力頂点を記憶するための記憶空間(たとえば、レジスタ48)の量は、限定的であり得る。マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、ファイバーの各々によって複数の頂点が生成されることを可能にするので、非反復型モードの場合に出力頂点を記憶するために必要とされる記憶空間の量は、反復型モードの場合に必要とされる量よりも大きくなり得る。シェーダユニット40に含まれる記憶空間の量が、ウェーブにおけるファイバーの所与のセットに対する出力頂点を記憶するのに十分ではない場合、外部メモリアクセスが実行される必要があり得、これは、シェーダユニット40のパフォーマンスを著しく低下させ得る。
【０１１３】
上記で説明したように、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、ウェーブにおけるファイバーの所与のセットを実行するためのパフォーマンスの向上および/または電力消費の低減をもたらすことができる。しかしながら、ウェーブにおけるファイバーを実行することに関連する出力頂点記憶空間必要量が、シェーダユニット40における利用可能な出力頂点記憶空間の量よりも大きい場合、外部メモリアクセスによって生じるパフォーマンスの低下が、ジオメトリシェーダ処理を反復しないことによって達成されるパフォーマンスおよび/または電力の改善を上回り得る。
【０１１４】
したがって、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードは、出力頂点を記憶するための記憶空間必要量が比較的小さい場合(たとえば、出力頂点記憶空間必要量が、シェーダユニット40に含まれる出力頂点記憶空間の量以下である場合)に、パフォーマンスの向上および/または電力消費の低減をもたらすことができる。一方、マージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードは、出力頂点を記憶するための記憶空間必要量が比較的高い場合(たとえば、出力頂点記憶空間必要量が、シェーダユニット40に含まれる出力頂点記憶空間の量よりも大きい場合)に、パフォーマンスの向上をもたらすことができる。
【０１１５】
本開示によれば、シェーダユニット40は、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードとマージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードとの間で選択的に切り替えるように構成され得る。シェーダユニット40が、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で切り替えることを可能にすることは、たとえば、パフォーマンス要件、電力消費要件などのような特定の処理要件に適合する特定の実行モードを選択するために、GPU30のユーザに追加の制御および/または柔軟性をもたらすことができる。
【０１１６】
いくつかの例では、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で切り替えるために、シェーダユニット40は、マージ型頂点/ジオメトリシェーダプログラムを実行するために使用されるべきシェーダプログラム実行モードを示す情報を受信するように構成され得る。シェーダプログラムを実行するために使用されるべきシェーダプログラム実行モードを示す情報は、たとえば、マージ型頂点/ジオメトリシェーダプログラムを実行するために非反復型モードが使用されるべきであるかどうかを示す情報、および/またはマージ型頂点/ジオメトリシェーダプログラムを実行するために反復型モードが使用されるべきであるかどうかを示す情報を含むことができる。マージ型頂点/ジオメトリシェーダプログラムを実行するために使用されるべきシェーダプログラム実行モードを示す情報の受信に応答して、シェーダユニット40(たとえば、制御ユニット42)は、シェーダプログラム実行モードに基づいてマージ型頂点/ジオメトリシェーダプログラムを実行するように、シェーダプログラム実行モードに基づいてシェーダユニット40における1つまたは複数の構成要素を構成することができる。
【０１１７】
さらなる例では、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で切り替えるために、スレッドスケジューラ36は、被選択シェーダプログラム実行モード(たとえば、非反復型モードまたは反復型モード)に基づいてスレッド構成を決定および/または生成するように構成され得る。たとえば、スレッドスケジューラ36は、複数のプリミティブおよび複数の頂点の各々をそれぞれのファイバーに割り当て、割当てに基づいてスレッド構成を生成することができる。スレッドスケジューラ36は、シェーダユニット38にスレッド構成に基づいてマージ型頂点/ジオメトリシェーダプログラムを実行させるために、シェーダユニット38にスレッド構成を提出することができる。
【０１１８】
追加の例では、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で切り替えるために、マージ型頂点/シェーダプログラムは、被選択シェーダプログラム実行モード(たとえば、反復型モード対非反復型モード)に基づいて様々な動作を選択的に実行するコードを含み得る。たとえば、シェーダコードは選択的に、マージ型頂点/ジオメトリシェーダのインスタンスに、非反復型モードの場合に1つの頂点、反復型モードの場合に複数の頂点を放出させることができる。別の例として、シェーダコードは選択的に、マージ型頂点/ジオメトリシェーダのインスタンスに、被選択シェーダプログラム実行モードに応じて異なる技法に従って頂点シェーディング済み頂点を記憶し、かつ/または取り出すためのローカルメモリロケーションを計算させることができる。
【０１１９】
たとえば、非反復型モードが選択された場合、スレッドスケジューラ36は、複数のプリミティブの各々がジオメトリシェーダ処理のために(プリミティブごとに)N個のファイバーに割り当てられるように、スレッド構成を生成することができる。一方、反復型モードが選択された場合、スレッドスケジューラ36は、複数のプリミティブの各々がジオメトリシェーダ処理のために(プリミティブごとに)1つのファイバーに割り当てられるように、スレッド構成を生成することができる。
【０１２０】
いくつかの例では、Nは2以上の整数であり得る。さらなる例では、Nは、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しくなり得る。最大出力頂点カウント値は、ジオメトリシェーダプログラムによって処理される各プリミティブに対してジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示し得る。
【０１２１】
さらなる例として、非反復型モードが選択された場合、スレッドスケジューラ36は、ファイバーの各々が(ファイバーごとに)1つの出力頂点を放出および/または出力するように、スレッド構成を生成することができる。一方、反復型モードが選択された場合、スレッドスケジューラ36は、ファイバーの各々が(ファイバーごとに)M個の出力頂点を放出および/または出力するように、スレッド構成を生成することができる。
【０１２２】
いくつかの例では、Mは2以上の整数であり得る。さらなる例では、Mは、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダ段階によって処理されるプリミティブの各々に対して生成される頂点の数に等しくなり得る。追加の例では、MはN以下であり得る。
【０１２３】
さらなる例として、非反復型モードが選択された場合、スレッドスケジューラ36は、複数の頂点の各々が頂点シェーダ処理のために1つのファイバー(たとえば、ウェーブごとに1つのファイバー)に割り当てられるように、スレッド構成を生成することができる。一方、反復型モードが選択された場合、スレッドスケジューラ36は、複数の頂点の各々が頂点シェーダ処理のためにK個のファイバーに割り当てられるように、スレッド構成を生成することができ、Kが、それぞれの頂点を含むプリミティブの数に等しい整数である。
【０１２４】
言い換えれば、非反復型モードが選択された場合、スレッドスケジューラ36は、頂点再使用を可能にするようにスレッド構成を生成することができ、反復型モードが選択された場合、スレッドスケジューラ36は、頂点再使用を可能にしないようにスレッド構成を生成することができる。頂点再使用は、異なるプリミティブに対するジオメトリシェーダ処理を実行するシェーダプログラムのインスタンスが、頂点シェーダ処理を実行するシェーダプログラムの単一のインスタンスによって生成される頂点シェーディング済み頂点を使用することを可能にする処理技法を指し得る。
【０１２５】
たとえば、頂点再使用は、第1のファイバーが、複数の頂点のうちの1つに対する頂点シェーダ処理を実行して頂点シェーディング済み頂点を生成し、第2のファイバーが、第1のファイバーによって生成された頂点シェーディング済み頂点に基づいて、第1のプリミティブに対するジオメトリシェーダ処理を実行し、第3のファイバーが、第1のファイバーによって生成された頂点シェーディング済み頂点に基づいて、第2のプリミティブに対するジオメトリシェーダ処理を実行するときに生じ得る。図4に示すように、頂点v1は、プリミティブp0およびp1に含まれ、図5に示すように、ファイバー0および1に対するジオメトリシェーダ処理は、ファイバー1によって生成される頂点シェーディング済み頂点v1を共有することができる。
【０１２６】
本開示のいくつかの態様によれば、シェーダプログラムを実行するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で選択し、シェーダユニット40に、被選択シェーダプログラム実行モードに従ってマージ型頂点/ジオメトリシェーダプログラムを実行させるための技法を含み得る。いくつかの例では、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムの1回または複数回のAPI呼出しに関連する出力頂点を記憶するために必要な記憶空間の総量を示す情報に基づいて、非反復型モードと反復モード型との間で選択することができる。マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードがジオメトリシェーダプログラムに基づいて生成される場合、マージ型頂点/ジオメトリシェーダプログラムによってジオメトリシェーダプログラムが実装され得る。
【０１２７】
そのような例では、出力頂点を記憶するために必要な記憶空間の総量が比較的小さい(たとえば、しきい値以下である)場合、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための被選択シェーダプログラム実行モードとして非反復型モードを選択することができる。これは、グラフィックス処理システムが、頂点シェーディング済み頂点のためのオフチップメモリアクセスを必要とせずに、非反復型モードのパフォーマンスの向上およびまたは電力消費の低減の恩恵を得ることを可能にし得る。一方、出力頂点を記憶するために必要な記憶空間の総量が比較的大きい(たとえば、しきい値よりも大きい)場合、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための被選択シェーダプログラム実行モードとして反復型モードを選択することができる。これは、グラフィックス処理システムが、そのようなケースで非反復型モードが使用された場合に必要とされ得るオフチップメモリアクセスを回避し、オフチップメモリアクセスに関連するパフォーマンスの欠点を回避することを可能にし得る。
【０１２８】
いくつかの例では、出力頂点を記憶するために必要な記憶空間の総量は、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しによって生成される出力頂点の総数および出力頂点の各々を記憶するために必要な記憶空間の総量に基づいて決定され得る。たとえば、出力頂点を記憶するために必要な記憶空間の総量は、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しによって生成される頂点の総量と出力頂点の各々を記憶するために必要な記憶空間の総量との積に等しくなり得る。場合によっては、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しによって生成される頂点の総量は、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しによって生成される出力プリミティブのセットに含まれる頂点の総数に対応し得る。
【０１２９】
さらなる例では、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しに関連する出力頂点を記憶するために必要な記憶空間の総量に基づいて非反復型モードと反復型モードとの間で選択するために、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムの1つの実行ウェーブに対する出力頂点を記憶するために必要な記憶空間の総量を決定することができる。マージ型頂点/ジオメトリシェーダプログラムの1つの実行ウェーブは、シェーダユニット40によって並列に実行されるマージ型頂点/ジオメトリシェーダプログラムのL個のインスタンスに対応することができ、Lが、並列にシェーダプログラムを実行するシェーダユニット40における処理要素の数に等しい。
【０１３０】
いくつかの例では、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しに対する出力頂点を記憶するために必要な記憶空間の総量を示す情報は、マージ型頂点/ジオメトリシェーダプログラムの1つの実行ウェーブに対する出力頂点を記憶するために必要な記憶空間の総量に対応し得る。マージ型頂点/ジオメトリシェーダプログラムの1つの実行ウェーブは、シェーダユニット40によって並列に実行されるマージ型頂点/ジオメトリシェーダプログラムのL個のインスタンスに対応することができ、Lが、並列にシェーダプログラムを実行するシェーダユニット40における処理要素の数に等しい。
【０１３１】
そのような例では、出力頂点を記憶するために必要な記憶空間の総量がしきい値以下である場合、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための被選択シェーダプログラム実行モードとして非反復型モードを選択することができる。一方、出力頂点を記憶するために必要な記憶空間の総量がしきい値よりも大きい場合、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための被選択シェーダプログラム実行モードとして反復型モードを選択することができる。場合によっては、そのような例におけるしきい値は、マージ型頂点/ジオメトリシェーダプログラムの1つの実行ウェーブに関連する出力頂点を記憶するためにシェーダユニット40において利用可能な記憶空間(たとえば、レジスタ48)の総量に対応し得る。
【０１３２】
追加の例では、ジオメトリシェーダプログラムの1回または複数回のAPI呼出しに関連する出力頂点を記憶するために必要な記憶空間の総量を示す情報は、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムのAPI呼出しによって実行される頂点増幅の量に対応し得る。頂点増幅の量は、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムの1回のAPI呼出しに関連する入力頂点に対する出力頂点の比率を指し得る。
【０１３３】
そのような例では、頂点増幅の量がしきい値以下である場合、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための被選択シェーダプログラム実行モードとして非反復型モードを選択することができる。一方、頂点増幅の量がしきい値よりも大きい場合、非反復型モードと反復型モードとの間で選択するための技法は、マージ型頂点/ジオメトリシェーダプログラムを実行するための被選択シェーダプログラム実行モードとして反復型モードを選択することができる。
【０１３４】
いくつかの例では、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で選択するための上述の技法のうちの1つまたは複数は、GPU30の外部にあるホストデバイス(たとえば、ホスト中央処理装置(CPU))によって実装され得る。たとえば、非反復型モードと反復型モードとの間で選択するための技法のうちの1つまたは複数は、ホストデバイス上で実行されるグラフィックスドライバによって実装されること、および/またはホストデバイス上で実行されるコンパイラによって実装されることがある。さらなる例では、非反復型モードと反復型モードとの間で選択するための技法のうちの1つまたは複数は、GPU30によって実装され得る。たとえば、1つまたは複数の固定機能処理ユニットおよび/またはプログラム可能処理ユニットは、上述の選択技法のうちの1つまたは複数を実装し得る。
【０１３５】
選択技法がホストデバイスによって実装される例では。本開示の技法は、被選択シェーダプログラム実行モードを示す情報をGPU30に提供することができる。たとえば、GPU30は、被選択シェーダプログラム実行モードを示す情報(たとえば、1つもしくは複数のビットおよび/または1つもしくは複数の値)を記憶するために使用される1つまたは複数のレジスタを含むことができ、ホストデバイス(たとえば、CPU)は、被選択シェーダプログラム実行モードを示す1つまたは複数の値をレジスタに書き込むことによって、被選択シェーダプログラム実行モードを示す情報をGPU30に提供することができる。
【０１３６】
図6は、本開示によるマージ型頂点/ジオメトリシェーダプログラムを実行することに関連する例示的な処理フローを示す概念図である。図7は、本開示によるマージ型頂点/ジオメトリシェーダプログラムを実行することに関連する擬似コードを示す。一般に、図6に示す動作のフローは、図7に示す命令に対応し得る。
【０１３７】
図6に示す例では、シェーダユニット40は、頂点属性、vertex_id、instance_id、primitive_id、miscのようなシステム値を、一連のレジスタR0、R1、およびR2に書き込む(70)。いくつかの例では、レジスタは、シェーダユニット40のレジスタ48に対応し得る。通常、システム値は、GPU30の別途割り振られていないメモリに記憶され得る。所定のロケーションにおいて一連のレジスタにシステム生成値を記憶することによって、シェーダユニット40は、頂点シェーダ処理段階およびジオメトリシェーダ処理段階の各々においてシステム生成値にアクセスすることができる。したがって、ユーザ指定のジオメトリシェーダプログラムは、システム生成値がどこに記憶されているかを判断するために、ユーザ指定の頂点シェーダプログラムに基づいてコンパイルされる必要はない。そうではなく、GPU30は、システム生成値にアクセスするために、頂点シェーダ処理およびジオメトリシェーダ処理の各々を実行するときに、所定のメモリロケーションにアクセスすることができる。
【０１３８】
シェーダユニット40は、頂点シェーディング動作を実行する(72)。頂点シェーディング動作の後、シェーダユニット40は、汎用レジスタ(GPR)(たとえば、レジスタ48)の内容(たとえば、頂点シェーダ処理からの出力頂点)をローカルメモリ50に書き込む(74)。シェーダユニット40は、ジオメトリシェーダテクスチャおよび定数オフセット(76)とジオメトリシェーダプログラムカウンタ(78)とに切り替える。
【０１３９】
シェーダユニット40は、ローカルメモリ50の内容(たとえば、マージ型頂点/ジオメトリシェーダプログラムの1つまたは複数のインスタンスの頂点シェーダ処理によって生成された頂点シェーディング済み頂点)を読み取り、ジオメトリシェーディング動作を実行する(80)。非反復型モードに従って動作するとき、ファイバー(たとえば、マージ型頂点/ジオメトリシェーダプログラムのインスタンス)に含まれる各放出に関して、シェーダユニット40は、頂点属性を頂点パラメータキャッシュ(VPC)に出力し、stream_idおよび任意のカット指示(cut indication)を出力することができる。反復型モードに従って動作するとき、シェーダユニット40は、頂点属性を頂点パラメータキャッシュ(VPC)に出力するほか、ジオメトリシェーディング済み頂点の位置の指示、stream_id、任意のカット指示、および任意の解釈された値を位置キャッシュに出力することができる。
【０１４０】
図7を参照すると、マージ型頂点/ジオメトリシェーダプログラムは、頂点シェーダ処理コード82、ジオメトリシェーダ処理コード84、およびパッチコード86を含むことができる。(たとえば、ホストCPU上で実行される)コンパイラは、グラフィックスアプリケーションによって指定される頂点シェーダプログラムおよびジオメトリシェーダプログラムに基づいて、マージ型頂点/ジオメトリシェーダプログラムを生成することができる。いくつかの例では、頂点シェーダプログラムおよびジオメトリシェーダプログラムは、マージ型頂点/ジオメトリシェーダプログラムを生成する前に独立してコンパイルされ得、コンパイラは、コンパイル済みジオメトリシェーダ処理コード84をコンパイル済み頂点シェーダ処理コード82に付加して、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードを生成することができる。
【０１４１】
図7に示すように、コンパイラは、頂点シェーダ処理コード82とジオメトリシェーダ処理コード84との間にパッチコード86を挿入することができる。パッチコード86は、シェーダユニット40に、頂点シェーダ処理コード82によって生成された出力頂点をシェーダユニット40のレジスタ48に記憶させ、シェーダユニット40を頂点シェーダ処理モードからジオメトリシェーダ処理モードに切り替えることに関連する動作を実行させることができる。シェーダユニット40を頂点シェーダ処理モードからジオメトリシェーダ処理モードに切り替えることに関連する動作は、CHMSK動作およびCHSH動作を含むことができる。CHMSK動作は、シェーダユニット40におけるリソースポインタをジオメトリシェーダリソースオフセットに切り替えることができる。CHSH動作は、シェーダユニット40におけるプログラムカウンタを、ジオメトリシェーダ処理コード84に関連するプログラムカウンタ値に切り替えることができる。
【０１４２】
本開示の追加の態様によれば、コンパイラは、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードを、マージ型頂点/ジオメトリシェーダプログラムの実行に使用されるべきモードを示す情報に基づいて非反復型モードまたは反復型モードに従ってマージ型頂点/ジオメトリシェーダプログラムをシェーダユニット40に選択的に実行させる命令をコンパイル済みコードが含むように、生成することができる。たとえば、図7に示すように、コンパイラは、マージ型頂点/ジオメトリシェーダのためのコンパイル済みコードを、コンパイル済みコードがコードセグメント88、90、および92を含むように、生成することができる。コードセグメント88、90、92の各々は、被選択シェーダプログラム実行モード(たとえば、反復型モード対非反復型モード)に従ってシェーダユニット40を動作させるために、被選択シェーダプログラム実行モードに基づいて様々な動作を選択的に実行することができる。
【０１４３】
コードセグメント88は、被選択シェーダプログラム実行モードに基づいて第1のローカルメモリアドレス計算式および第2のローカルメモリアドレス計算式のうちの1つをシェーダユニット40に選択的に使用させる命令を含むことができる。選択されたローカルメモリアドレス計算式は、マージ型頂点/ジオメトリシェーダプログラムによって実行された頂点シェーダ処理の出力(たとえば、頂点シェーディング済み頂点)を、ローカルメモリ50におけるどのロケーションに記憶すべきかを決定するために使用され得る。たとえば、シェーダプログラム実行モードとして非反復型モードが選択された場合、コンパイル済みコードは、シェーダユニット40に、現在実行されているファイバーに関するファイバー識別値(すなわち、fiber_id_vertex)および出力頂点のサイズ(すなわち、VERT_SIZE)に基づいてローカルメモリアドレスを計算する第1のローカルメモリアドレス計算式を使用させることができる。一方、シェーダプログラム実行モードとして反復型モードが選択された場合、コンパイル済みコードは、シェーダユニット40に、現在実行されているファイバーに割り当てられたプリミティブのプリミティブ識別値(すなわち、rel_primID)、プリミティブのサイズ(すなわち、PRIM_SIZE)、現在実行されているファイバーに割り当てられた頂点の頂点識別値(すなわち、rel_vertex)、および出力頂点のサイズ(すなわち、VERT_SIZE)に基づいてローカルメモリアドレスを計算する第2のローカルメモリアドレス計算式を使用させることができる。
【０１４４】
コードセグメント90は、被選択シェーダプログラム実行モードに基づいて第1のローカルメモリアドレス計算式および第2のローカルメモリアドレス計算式のうちの1つをシェーダユニット40に選択的に使用させる命令を含むことができる。選択されたローカルメモリアドレス計算式は、マージ型頂点/ジオメトリシェーダプログラムによって実行されたジオメトリシェーダ処理に関連する入力頂点(たとえば、頂点シェーディング済み頂点)を、ローカルメモリ50におけるどのロケーションからロードすべきかを決定するために使用され得る。たとえば、シェーダプログラム実行モードとして非反復型モードが選択された場合、コンパイル済みコードは、シェーダユニット40に、ロードされるべき頂点に関連する頂点識別値(すなわち、vertex_id)およびロードされるべき頂点のサイズ(すなわち、VERT_SIZE)に基づいてローカルメモリアドレスを計算する第1のローカルメモリアドレス計算式を使用させることができる。一方、シェーダプログラム実行モードとして反復型モードが選択された場合、コンパイル済みコードは、シェーダユニット40に、現在実行されているファイバーに割り当てられたプリミティブ(すなわち、rel_primID)、プリミティブのサイズ(すなわち、PRIM_SIZE)、ロードされるべき頂点に関連する頂点識別値(すなわち、rel_vertex)、および頂点のサイズ(すなわち、VERT_SIZE)に基づいてローカルメモリアドレスを計算する第2のローカルメモリアドレス計算式を使用させることができる。
【０１４５】
コードセグメント92は、被選択シェーダプログラム実行モードに基づいて1つの頂点または複数の頂点をシェーダユニット40に出力させる命令を含むことができる。たとえば、シェーダプログラム実行モードとして非反復型モードが選択された場合、コンパイル済みコードは、シェーダユニット40に、マージ型頂点/ジオメトリシェーダプログラムの各インスタンスに対して複数の頂点を放出させることができる。一方、シェーダプログラム実行モードとして反復型モードが選択された場合、コンパイル済みコードは、シェーダユニット40に、マージ型頂点/ジオメトリシェーダプログラムの各インスタンスに対して単一の頂点を放出させることができる。放出される単一の頂点は、Gsoutcount==GsoutvertIDの場合の頂点に対応し得る。
【０１４６】
図7に示すように、コードセグメント88および90は、「misc->reuse」パラメータを受信することができ、このパラメータは、シェーダプログラムの実行に使用されるべきモードを示す情報に対応し得る。同様に、コードセグメント92は、「optimized_mode」パラメータを受信することができ、このパラメータは、マージ型頂点/ジオメトリシェーダプログラムの実行に使用されるべきモードを示す情報に対応し得る。いくつかの例では、「misc->reuse」パラメータはGPU30によって生成され得、「optimized_mode」パラメータはGPUドライバによって生成され、GPU30に提供され得る。いくつかの例では、「misc->reuse」パラメータおよび「optimized_mode」パラメータは、マージ型頂点/ジオメトリシェーダプログラムの実行に使用されるべきモードを示す単一のパラメータとして実装されること、および/または単一のパラメータによって生成されることがある。
【０１４７】
いずれかのモードを選択的に実行することが可能である命令を、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードに配置することは、シェーダユニットに新しいシェーダプログラムを再ロードする必要なしに、シェーダユニット40の処理モードが変更されることを可能にし得る。その上、いずれかのモードを選択的に実行することが可能である命令を、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードに配置することは、マージ型頂点/ジオメトリシェーダプログラムのコンパイルを簡素化することもできる。
【０１４８】
図8は、本開示のシェーダプログラム実行技法を実装するために使用され得る例示的なコンピューティングデバイス100を示すブロック図である。コンピューティングデバイス100は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームもしくはコンソール、ワイヤレス通信デバイス(たとえば、モバイル電話、セルラー電話、衛星電話、および/もしくはモバイルフォンハンドセットなど)、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末(PDA)などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、または、グラフィカルデータを処理および/もしくは表示する任意の他のタイプのデバイスを備え得る。
【０１４９】
図8の例に示すように、コンピューティングデバイス100は、ユーザインターフェース102と、CPU104と、メモリコントローラ106と、メモリ108と、GPU30と、ディスプレイインターフェース110と、ディスプレイ112と、バス114とを含む。ユーザインターフェース102、CPU104、メモリコントローラ106、GPU30およびディスプレイインターフェース110は、バス114を使用して互いに通信してもよい。いくつかの例では、GPU30は、図2に示すGPU30に対応することができる。図8に示す異なる構成要素間のバスおよび通信インターフェースの特定の構成は例にすぎず、同じまたは異なる構成要素を有するコンピューティングデバイスおよび/または他のグラフィックス処理システムの他の構成が本開示の技法を実装するために使用されてもよいことに留意されたい。
【０１５０】
CPU104は、コンピューティングデバイス100の動作を制御する汎用または専用プロセッサを備えてもよい。ユーザは、CPU104に1つまたは複数のソフトウェアアプリケーションを実行させるために、入力をコンピューティングデバイス100に与える場合がある。CPU104上で実行されるソフトウェアアプリケーションは、たとえば、グラフィックスアプリケーション、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、オペレーティングシステム、または任意の他のタイプのプログラムを含んでもよい。ユーザは、ユーザインターフェース102を介してコンピューティングデバイス100に結合されたキーボード、マウス、マイクロフォン、タッチパッドまたは別の入力デバイスなどの1つまたは複数の入力デバイス(図示せず)を介して、入力をコンピューティングデバイス100に与える場合がある。
【０１５１】
CPU104上で実行されるソフトウェアアプリケーションは、ディスプレイ112上での表示のためにフレームバッファにグラフィックスデータをレンダリングするようにGPU30に命令する1つまたは複数のグラフィックスレンダリング命令を含んでもよい。いくつかの例では、グラフィックスレンダリング命令は、グラフィックスアプリケーションプログラミングインターフェース(API)、たとえば、Open Graphics Library(OpenGL(登録商標)) API、Open Graphics Library Embedded Systems(OpenGL ES) API、Direct3D API、X3D API、RenderMan API、WebGL API、または任意の他の公的規格もしくはプロプライエタリ規格のグラフィックスAPIなどに準拠し得る。グラフィックスレンダリング命令を処理するために、CPU104は、GPU30にグラフィックスデータのレンダリングの一部または全部を実行させるために、1つまたは複数のグラフィックスレンダリングコマンドをGPU30に発行する場合がある。いくつかの例では、レンダリングされるべきグラフィックスデータは、グラフィックスプリミティブ、たとえば、点、線、三角形、四角形、三角形ストリップなどのリストを含んでもよい。
【０１５２】
図8に示すように、CPU104は、GPUドライバ116およびコンパイラ118を含む。GPUドライバ116は、ソフトウェアアプリケーション(たとえば、グラフィックスアプリケーション)から命令を受信し、GPU30の動作を、命令を処理するように制御することができる。たとえば、GPUドライバ116は、1つまたは複数のコマンドを策定し、コマンドをメモリ108に配置し、GPU30にコマンドを実行するように命令し得る。
【０１５３】
コンパイラ118は、1つまたは複数の異なるタイプのシェーダプログラムのためのソースコードを受信し、シェーダプログラムのためのコンパイル済みソースコードを生成することができる。たとえば、コンパイラ118は、頂点シェーダプログラムのためのソースコードおよびジオメトリシェーダプログラムのためのソースコードを受信し、頂点シェーダプログラムのためのソースコードに基づいて頂点シェーダプログラムのためのコンパイル済みコードを生成し、ジオメトリシェーダプログラムのためのソースコードに基づいてジオメトリシェーダプログラムのためのコンパイル済みコードを生成することができる。コンパイラ118はまた、頂点シェーダプログラムおよびジオメトリシェーダプログラムのためのコンパイル済みコードに基づいてマージ型頂点/ジオメトリシェーダプログラムを生成することができる。GPUドライバ116は、コンパイル済みシェーダプログラムのうちの1つまたは複数を、GPU30のシェーダユニット40によって実行するためにGPU30(たとえば、シェーダユニット40の命令ストア44)にロードすることができる。
【０１５４】
メモリコントローラ106は、メモリ108に入るデータおよびメモリ108から出るデータの転送を容易にする。たとえば、メモリコントローラ106は、メモリ読取りおよび書込みコマンドを受信し、コンピューティングデバイス100内の構成要素のためのメモリサービスを提供するために、そのようなコマンドをメモリ108に対して処理し得る。メモリコントローラ106は、メモリ108に通信可能に結合される。メモリコントローラ106は、CPU104とメモリ108の両方とは別個である処理モジュールであるとして、図8の例示的なコンピューティングデバイス100内に示されているが、他の例では、メモリコントローラ106の機能の一部または全部は、CPU104およびメモリ108の一方または両方上で実装され得る。
【０１５５】
メモリ108は、CPU104によって実行するためにアクセス可能であるプログラムモジュールおよび/もしくは命令、ならびに/または、CPU104上で実行されるプログラムによって使用するためのデータを記憶し得る。たとえば、メモリ108は、CPU104上で実行されるアプリケーションに関連するプログラムコードおよびグラフィックスデータを記憶し得る。メモリ108は、加えて、コンピューティングデバイス100の他の構成要素によって使用するための、かつ/またはそれらによって生成される情報を記憶し得る。たとえば、メモリ108は、GPU30のためのデバイスメモリとして働き得、GPU30によって操作されるべきデータ、ならびにGPU30によって実行された動作から得られたデータを記憶し得る。たとえば、メモリ108は、テクスチャバッファ、深度バッファ、ステンシルバッファ、頂点バッファ、フレームバッファ、レンダーターゲットなどの任意の組合せを記憶してもよい。加えて、メモリ108は、GPU30によって処理するためのコマンドストリームを記憶し得る。メモリ108は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、読取り専用メモリ(ROM)、消去可能プログラマブルROM(EPROM)、電気消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光学記憶媒体など、1つまたは複数の揮発性または不揮発性のメモリまたはストレージデバイスを含み得る。
【０１５６】
GPU30は、CPU104によってGPU30に発行されるコマンドを実行するように構成され得る。GPU30によって実行されるコマンドは、グラフィックスコマンド、ドローコールコマンド、GPU状態プログラミングコマンド、タイムスタンプ要求、メモリ転送コマンド、汎用コンピューティングコマンド、カーネル実行コマンドなどを含み得る。
【０１５７】
いくつかの例では、GPU30は、1つまたは複数のグラフィックスプリミティブをディスプレイ112にレンダリングするためのグラフィックス演算を実行するように構成されてもよい。そのような例では、CPU104上で実行されるソフトウェアアプリケーションのうちの1つがグラフィックス処理を必要とするとき、CPU104は、グラフィックスデータをGPU30に提供し、1つまたは複数のグラフィックスコマンドをGPU30に発行し得る。グラフィックスコマンドは、たとえば、ドローコールコマンド、GPU状態プログラミングコマンド、メモリ転送コマンド、ブリッティング(blitting)コマンドなどを含み得る。グラフィックスデータは、頂点バッファ、テクスチャデータ、表面データなどを含み得る。いくつかの例では、CPU104は、GPU30によってアクセスされ得るメモリ108にコマンドとグラフィックスデータとを書き込むことによって、そのコマンドとグラフィックスデータとをGPU30に提供し得る。
【０１５８】
さらなる例では、GPU30は、CPU104上で実行されるアプリケーションのための汎用コンピューティングを実行するように構成され得る。そのような例では、CPU104上で実行されるソフトウェアアプリケーションのうちの1つが、計算タスクをGPU30にオフロードすることを決定したとき、CPU104は、汎用コンピューティングデータをGPU30に提供し、1つまたは複数の汎用コンピューティングコマンドをGPU30に発行し得る。汎用コンピューティングコマンドは、たとえば、カーネル実行コマンド、メモリ転送コマンドなどを含み得る。いくつかの例では、CPU104は、GPU30によってアクセスされ得るメモリ108にコマンドと汎用コンピューティングデータとを書き込むことによって、そのコマンドとデータとをGPU30に提供し得る。
【０１５９】
GPU30は、いくつかの事例では、CPU104よりも効率的なベクトル演算処理を提供する高度並列構造を用いて構築され得る。たとえば、GPU30は、複数の頂点、制御点、ピクセル、および/または他のデータを並列の方法で操作するように構成される、複数の処理要素を含み得る。GPU30の高度並列の性質は、いくつかの事例では、GPU30が、CPU104を使用して画像をレンダリングするよりも速く、グラフィックス画像(たとえば、GUIならびに2次元(2D)および/または3次元(3D)グラフィックスシーン)をディスプレイ112上にレンダリングすることを可能にし得る。さらに、GPU30の高度並列の性質は、GPU30が、CPU104よりも速く、汎用コンピューティングアプリケーションのためのいくつかのタイプのベクトル演算および行列演算を処理することを可能にし得る。
【０１６０】
GPU30は、いくつかの事例では、コンピューティングデバイス100のマザーボードに統合され得る。他の事例では、GPU30は、コンピューティングデバイス100のマザーボード内のポートにインストールされるグラフィックスカード上に存在し得、またはさもなければコンピューティングデバイス100と相互動作するように構成された周辺デバイス内に組み込まれ得る。さらなる事例では、GPU30は、システムオンチップ(SoC)を形成するCPU104と同じマイクロチップ上にあり得る。GPU30は、1つまたは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、または他の等価な集積論理回路もしくはディスクリート論理回路などの1つまたは複数のプロセッサを含んでもよい。
【０１６１】
いくつかの例では、GPU30は、メモリ108の全部または一部分のためのキャッシングサービスを提供し得る、GPUキャッシュを含み得る。そのような例では、GPU30は、キャッシュを使用して、オフチップメモリの代わりにローカルストレージを使用して、データをローカルで処理し得る。これは、各読取りおよび書込みコマンド中に、重いバストラフィックを経験し得るバス114を介して、GPU30がメモリ108にアクセスする必要を低減することによって、GPU30がより効率的な方法で動作することを可能にする。しかしながら、いくつかの例では、GPU30は、別個のキャッシュを含まないことがあり、代わりにバス114を介してメモリ108を利用し得る。GPUキャッシュは、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)など、1つまたは複数の揮発性または不揮発性のメモリまたはストレージデバイスを含み得る。
【０１６２】
CPU104および/またはGPU30は、メモリ108内に割り振られるフレームバッファ内にラスタライズされた画像データを記憶し得る。ディスプレイインターフェース110は、フレームバッファからデータを取り出し、ディスプレイ112を、ラスタライズされた画像データによって表現された画像を表示するように構成し得る。いくつかの例では、ディスプレイインターフェース110は、フレームバッファから取り出されたデジタル値を、ディスプレイ112によって消費可能なアナログ信号に変換するように構成されるデジタルアナログコンバータ(DAC)を含み得る。他の例では、ディスプレイインターフェース110は、処理のためにディスプレイ112にデジタル値を直接渡し得る。
【０１６３】
ディスプレイ112は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ(LCD)、プラズマディスプレイパネル、発光ダイオード(LED)アレイ、陰極線管(CRT)ディスプレイ、電子ペーパー、表面伝導電子放出ディスプレイ(SED)、レーザーテレビジョンディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ112は、コンピューティングデバイス100内に統合され得る。たとえば、ディスプレイ112は、モバイル電話ハンドセットまたはタブレットコンピュータの画面であり得る。代替的に、ディスプレイ112は、ワイヤードまたはワイヤレス通信リンクを介してコンピューティングデバイス100に結合されたスタンドアロンデバイスであり得る。たとえば、ディスプレイ112は、ケーブルまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
【０１６４】
バス114は、第1、第2、および第3世代バス構造およびプロトコル、共有バス構造およびプロトコル、ポイントツーポイントバス構造およびプロトコル、単方向バス構造およびプロトコル、ならびに双方向バス構造およびプロトコルを含む、任意の組合せのバス構造およびバスプロトコルを使用して実装され得る。バス114を実装するために使用され得る異なるバス構造およびプロトコルの例には、たとえば、HyperTransportバス、InfiniBandバス、Advanced Graphics Portバス、Peripheral Component Interconnect(PCI)バス、PCI Expressバス、Advanced Microcontroller Bus Architecture(AMBA) Advanced High-performance Bus(AHB)、AMBA Advanced Peripheral Bus(APB)、およびAMBA Advanced eXentisible Interface(AXI)バスが含まれる。他のタイプのバス構造およびプロトコルもまた使用され得る。
【０１６５】
本開示によれば、コンピューティングデバイス100(たとえば、CPU104および/またはGPU30)は、本開示で説明するシェーダプログラム実行技法のうちのいずれかを実行するように構成され得る。たとえば、GPU30(たとえば、GPU30のシェーダユニット40)は、本開示で説明する技法のうちの1つまたは複数に従って、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行するように構成され得る。別の例として、GPU30は、本開示で説明するように反復型実行モードおよび非反復型実行モードの一方または両方に従ってマージ型頂点/ジオメトリシェーダプログラムを実行するように構成され得る。さらなる例として、GPU30は、本開示で説明する技法のうちの1つまたは複数に従って、マージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードを使用することと非反復型モードを使用することとの間で選択的に切り替えるように構成され得る。
【０１６６】
追加の例では、CPU104、コンパイラ118、および/またはGPU30は、本開示で説明する技法のうちの1つまたは複数に従って、マージ型頂点/ジオメトリシェーダプログラムを実行するための非反復型モードと反復型モードとの間で選択し、GPU30におけるシェーダユニットに、被選択シェーダプログラム実行モードに従ってマージ型頂点/ジオメトリシェーダプログラムを実行させるように構成され得る。さらなる例では、CPU104、コンパイラ118、および/またはGPU30は、本開示で説明する技法のうちの1つまたは複数に従って、マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードを生成するように構成され得る。たとえば、CPU104、コンパイラ118、および/またはGPU30は、シェーダユニットにマージ型頂点/ジオメトリシェーダプログラムを、シェーダプログラムの実行に使用されるべきモードを示す情報に基づいて非反復型モードまたは反復型モードに従って選択的に実行させる命令をコンパイル済みコードが含むように、コンパイル済みコードを生成することができる。
【０１６７】
図9は、本開示によるシェーダプログラムを実行するための例示的な技法を示す流れ図である。CPU104(たとえば、GPUドライバ116)は、GPU30にシェーダプログラムをロードすることができる(140)。シェーダプログラムは、頂点シェーダ処理を実行することができ、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成することができる。GPU30(たとえば、シェーダユニット40)は、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムを実行することができる(142)。
【０１６８】
いくつかの例では、GPU30(たとえば、シェーダユニット40)はシェーダプログラムの複数のインスタンスを、シェーダプログラムのインスタンスの各々が複数の入力頂点の各々を受信し、複数の入力頂点の各々の受信に応答して複数の出力頂点を生成するように実行することができる。場合によっては、GPU30(たとえば、シェーダユニット40)は、シェーダプログラムの複数のインスタンスを並列に、かつ/または実行ウェーブの一部として実行することができる。いくつかの例では、インスタンスを並列に実行することは、インスタンスの各々が、異なるデータ項目に対して同時にシェーダユニットにおける複数の処理要素の各々の上で実行されるように、インスタンスを実行することを含み得る。
【０１６９】
さらなる例では、頂点シェーダ処理を実行し、シェーダプログラムによって受信される各入力頂点に対する複数の出力頂点を生成するシェーダプログラムは、マージ型頂点/ジオメトリシェーダプログラムであり得る。マージ型頂点/ジオメトリシェーダプログラムは、頂点シェーダ処理およびジオメトリシェーダ処理を実行するように構成可能であり得る。頂点シェーダ処理は頂点シェーダプログラムによって指定され得、ジオメトリシェーダ処理はジオメトリシェーダプログラムによって指定され得る。
【０１７０】
いくつかの例では、GPU30(たとえば、シェーダユニット40)はマージ型頂点/ジオメトリシェーダプログラムの複数のインスタンスを、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々がM個の出力頂点を生成するように実行することができ、Mが2以上の整数である。いくつかの例では、Mは、マージ型/頂点ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しくなり得る。最大出力頂点カウント値は、ジオメトリシェーダプログラムによって処理される各プリミティブに対してジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示し得る。マージ型頂点/ジオメトリシェーダプログラムのためのコンパイル済みコードがジオメトリシェーダプログラムに基づいて生成される場合、マージ型頂点/ジオメトリシェーダプログラムによってジオメトリシェーダプログラムが実装され得る。
【０１７１】
さらなる例では、マージ型頂点/シェーダプログラムのインスタンスの各々は、マージ型頂点/シェーダプログラムのそれぞれのインスタンスに割り当てられるプリミティブに対するジオメトリシェーダ処理を実行するように構成可能であり得る。そのような例では、複数のプリミティブの各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンス(たとえば、プリミティブごとに1つのマージ型頂点/ジオメトリシェーダインスタンスおよび/またはウェーブごとに1つのマージ型頂点/ジオメトリシェーダインスタンス)に割り当てられ得る。
【０１７２】
いくつかの例では、マージ型頂点/シェーダプログラムのインスタンスの各々は、マージ型頂点/シェーダプログラムのそれぞれのインスタンスに割り当てられるプリミティブに対するジオメトリシェーダ処理を実行し、マージ型頂点/シェーダプログラムのそれぞれのインスタンスに割り当てられる頂点に対する頂点シェーダ処理を実行するように構成可能であり得る。そのような例では、複数のプリミティブの各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンス(たとえば、プリミティブごとに1つのマージ型頂点/ジオメトリシェーダインスタンスおよび/またはウェーブごとに1つのマージ型頂点/ジオメトリシェーダインスタンス)に割り当てられ得、複数の頂点の各々は、処理のために1つのマージ型頂点/ジオメトリシェーダインスタンス(たとえば、頂点ごとに1つのマージ型頂点/ジオメトリシェーダインスタンスおよび/またはウェーブごとに1つのマージ型頂点/ジオメトリシェーダインスタンス)に割り当てられ得る。場合によっては、マージ型頂点/ジオメトリシェーダプログラムのインスタンスのうちの少なくとも1つは、複数の頂点のうちの1つに対する頂点シェーダ処理および複数のプリミティブのうちの1つに対するジオメトリシェーダ処理を実行するように構成され得る。
【０１７３】
いくつかの例では、シェーダユニット40は、プリミティブの間で共有される頂点が再使用されることを可能にし得る。たとえば、シェーダユニット40は、マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンス、第2のインスタンス、および第3のインスタンスを実行することができる。マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンスは、複数の頂点のうちの1つに対する頂点シェーダ処理を実行して、頂点シェーディング済み頂点を生成することができる。マージ型頂点/ジオメトリシェーダプログラムの第2のインスタンスは、マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンスによって生成された頂点シェーディング済み頂点に基づいて、複数のプリミティブのうちの第1のプリミティブに対するジオメトリシェーダ処理を実行して、第1のプリミティブに対応する1つまたは複数のジオメトリシェーディング済み頂点を生成することができる。マージ型頂点/ジオメトリシェーダプログラムの第3のインスタンスは、マージ型頂点/ジオメトリシェーダプログラムの第1のインスタンスによって生成された頂点シェーディング済み頂点に基づいて、複数のプリミティブのうちの第2のプリミティブに対するジオメトリシェーダ処理を実行して、第2のプリミティブに対応する1つまたは複数のジオメトリシェーディング済み頂点を生成することができる。
【０１７４】
図10は、本開示による反復型モードおよび非反復型モードに従ってマージ型頂点/ジオメトリシェーダプログラムを実行するための例示的な技法を示す流れ図である。一般に、GPU30(たとえば、シェーダユニット38のうちの1つまたは複数)は、非反復型シェーダプログラム実行モードで動作するように構成可能で、反復型シェーダプログラム実行モードで動作するように構成可能であり得る。
【０１７５】
GPU30は、マージ型頂点/ジオメトリシェーダプログラムを実行するために使用されるべき被選択シェーダプログラム実行モードを示す情報を受信する(144)。GPU30は、被選択シェーダプログラム実行モードを示す情報が、マージ型頂点/ジオメトリシェーダプログラムを実行するために反復型モードが使用されるべきであることを示すかどうかを判断する(146)。
【０１７６】
被選択シェーダプログラム実行モードを示す情報が、マージ型頂点/ジオメトリシェーダプログラムを実行するために反復型モードが使用されるべきではないことを示す場合、GPU30は、非反復型モードで動作することができる。非反復型モードで動作するとき、シェーダユニット40は、複数のプリミティブの各々がジオメトリシェーダ処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ(148)、複数の頂点の各々が処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ(150)、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々がM個の出力頂点を出力する(152)スレッド構成に基づいて動作することができる。いくつかの例では、スレッドスケジューラ36は、複数のプリミティブの各々をジオメトリシェーダ処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当て(148)、複数の頂点の各々を処理のために1つのマージ型頂点/ジオメトリシェーダインスタンスに割り当てる(150)ことができる。
【０１７７】
いくつかの例では、Mは2以上の整数であり得る。さらなる例では、Mは、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダ段階によって処理されるプリミティブの各々に対して生成される頂点の数に等しくなり得る。
【０１７８】
被選択シェーダプログラム実行モードを示す情報が、マージ型頂点/ジオメトリシェーダプログラムを実行するために反復型モードが使用されるべきであることを示す場合、GPU30は、反復型モードで動作することができる。反復型モードで動作するとき、シェーダユニット40は、複数のプリミティブの各々がジオメトリシェーダ処理のためにN個のマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ(154)、複数の頂点の各々が処理のためにK個のマージ型頂点/ジオメトリシェーダインスタンスに割り当てられ(156)、マージ型頂点/ジオメトリシェーダプログラムのインスタンスの各々が1つの出力頂点を出力する(158)スレッド構成に基づいて動作することができる。いくつかの例では、スレッドスケジューラ36は、複数のプリミティブの各々をジオメトリシェーダ処理のためにN個のマージ型頂点/ジオメトリシェーダインスタンスに割り当て(154)、複数の頂点の各々を処理のためにK個のマージ型頂点/ジオメトリシェーダインスタンスに割り当てる(156)ことができる。
【０１７９】
いくつかの例では、Nは2以上の整数であり得る。さらなる例では、Nは、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムによって指定される最大出力頂点カウント値に等しくなり得る。最大出力頂点カウント値は、ジオメトリシェーダプログラムによって処理される各プリミティブに対してジオメトリシェーダプログラムによって生成されるべきである出力頂点の最大数を示し得る。追加の例では、MはN以下であり得る。いくつかの例では、Kは、それぞれの頂点を含むプリミティブの数に等しい整数であり得る。
【０１８０】
図11は、本開示によるマージ型頂点/ジオメトリシェーダプログラムを実行するための反復型モードおよび非反復型モードのうちの1つを選択するための例示的な技法を示す流れ図である。CPU104および/またはGPUドライバ116は、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムに関連する出力頂点を記憶するために必要な記憶空間の総量を示す情報を決定する(160)。CPU104および/またはGPUドライバ116は、記憶空間の総量を示す情報がしきい値よりも大きいかどうかを判断する(162)。
【０１８１】
CPU104および/またはGPUドライバ116は、記憶空間の総量を示す情報がしきい値以下であるとの判断に応答して、被選択シェーダプログラム実行モードとして非反復型シェーダプログラム実行モードを選択する(164)。CPU104および/またはGPUドライバ116は、記憶空間の総量を示す情報がしきい値よりも大きいとの判断に応答して、被選択シェーダプログラム実行モードとして反復型シェーダプログラム実行モードを選択する(166)。
【０１８２】
一般に、CPU104および/またはGPUドライバ116は、マージ型頂点/ジオメトリシェーダプログラムによって実装されるジオメトリシェーダプログラムに関連する出力頂点を記憶するために必要な記憶空間の総量を示す情報に基づいて、マージ型頂点/ジオメトリシェーダプログラムを実行するために使用する被選択シェーダプログラム実行モードとして、非反復型シェーダプログラム実行モードおよび反復型シェーダプログラム実行モードのうちの1つを選択することができる。CPU104および/またはGPUドライバ116は、GPU30のシェーダユニット40に、被選択シェーダプログラム実行モードに基づいてマージ型頂点/ジオメトリシェーダプログラムを実行させることができる。
【０１８３】
いくつかの例では、非反復型モードは、小さい増幅の場合に最適化されるが、すべての増幅をサポートすることができるジオメトリシェーダ機能を使用することができる。ジオメトリシェーダ機能は、たとえば、ポイントスプライト(1点イン、4頂点アウト)、キューブマップ(三角形イン、6三角形アウト、すなわち18頂点アウト)、シャドーボリューム(三角形イン、15頂点アウト)を含む、いくつかの異なるタイプのプリミティブとともに使用され得る。
【０１８４】
いくつかの例では、非反復型モードは、ジオメトリシェーダインスタンスごとに1つのファイバーをサポートすることができる。さらなる例では、非反復型モードは、いくつかの例では、繰返し型ALU計算を回避し、頂点放出ごとの繰返し型リソース割振り(たとえば、GPR)を回避し、不規則アクセスビュー(UAV:unordered access view)の特殊処理を実装する必要を回避することができる。追加の例では、非反復型モードは、4つ未満の頂点を有する入力プリミティブのための頂点再使用をサポートすることができる。
【０１８５】
いくつかの例では、非反復型モードは、以下の例に示されるように、ウェーブごとに処理され得るプリミティブの数に関して、反復型モードよりも優れたパフォーマンスをもたらすことができる。第1の例によれば、複数のポイントスプライトプリミティブが処理され得る。入力トポロジーはポイントリスト(すなわち、PointList)であってよく、ジオメトリシェーダの最大出力頂点カウントは4に等しくてよい(すなわち、MaxGSOutputVertex=4)。この例では、反復型モードは、ウェーブごとに8個のプリミティブを処理することができる。一方、非反復型モードは、ウェーブごとに32個のプリミティブを処理することができ、それによって、ウェーブごとのプリミティブスループットが4倍改善する。
【０１８６】
第2の例によれば、入力トポロジーは三角形ストリップ(すなわち、TriangleStrip)であり、MaxGSOutputVertex=4である。この例では、反復型モードは、ウェーブごとに8個のプリミティブを処理することができる。一方、非反復型モードは、ウェーブごとに30個のプリミティブを処理することができ、それによって、ウェーブごとのプリミティブスループットが3.75倍改善する。
【０１８７】
第3の例によれば、入力トポロジーは三角形リスト(すなわち、TriangleList)であり、MaxGSOutputVertex=18(たとえば、キューブマップ)である。この例では、反復型モードは、ウェーブごとに2つのプリミティブを処理することができる。たとえば、反復型モードは、ウェーブごとに32回の放出を実行し、したがって、ウェーブが行われるとすぐにそれらを処理し始めることができる。一方、非反復型モードは、ウェーブごとに30個のプリミティブを処理することができ、それによって、プリミティブスループットが3.75倍改善する。たとえば、非反復型モードは、ファイバーごとに18回の放出(すなわち、ウェーブごとに576個の頂点)を実行することができ、したがって、ウェーブが完了したときにそれらを処理することができる。場合によっては、限られた数のジオメトリシェーダウェーブを開始することが可能であり得る。しかしながら、ユーザは、ウェーブごとの入力ジオメトリシェーダプリミティブの数を限定するようにプログラムすることが可能であり得る。
【０１８８】
第4の例によれば、入力トポロジーは10制御点パッチ(すなわち、Patch_10)であり、MaxGSOutputVertex=4である。この例では、反復型モードは、ウェーブごとに3つのプリミティブを処理することができ、非反復型モードは、ウェーブごとに3つのプリミティブを処理することができる(たとえば、頂点再使用なし)。したがって、ウェーブごとのプリミティブスループットに関して、パフォーマンスの改善がないことがある。しかしながら、非反復型はそれでも、ウェーブにおけるファイバーの他のロットがジオメトリシェーダを実行しなくてよい(すなわち、3つのファイバーがジオメトリシェーダコードを実行していることがある)ので、電力節約をもたらすことができる。
【０１８９】
いくつかの例では、各マージ型頂点シェーダ/ジオメトリシェーダ(VS|GS)ファイバーは、1プリミティブイン、複数頂点アウトをサポートすることができる。いくつかの例では、GPUは、どのファイバーが有効な頂点を有するかを示すマスクフラグとともに頂点の複数のウェーブ(たとえば、放出ごとに1つのウェーブ)を出力することができる。いくつかの例では、入力プリミティブのための頂点再使用チェックを実行して、4つ未満の頂点を有するプリミティブに対する所与のVS|GSウェーブにおける入力プリミティブに対する一意の頂点のための頂点シェーダを生成することができる。
【０１９０】
本開示で説明する技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せにおいて実装され得る。たとえば、説明する技法の様々な態様は、1つもしくは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、または任意の他の等価な集積論理回路もしくはディスクリート論理回路、ならびにそのような構成要素の任意の組合せを含む、1つまたは複数のプロセッサ内で実装され得る。「プロセッサ」または「処理回路」という用語は、一般に、単独の、もしくは他の論理回路と組み合わせた前述の論理回路のいずれか、または処理を実行するディスクリートハードウェアなどの任意の他の等価な回路を指すことがある。
【０１９１】
そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明する様々な動作および機能をサポートするために、同じデバイス内または別個のデバイス内で実装され得る。加えて、説明するユニット、モジュール、または構成要素のいずれも、一緒に、またはディスクリートであるが相互動作可能な論理デバイスとして別個に実装され得る。異なる特徴をモジュールまたはユニットとして図示することは、異なる機能的態様を強調することを意図したものであり、必ずしも、そのようなモジュールまたはユニットが別個のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを暗示するとは限らない。むしろ、1つまたは複数のモジュールまたはユニットに関連する機能は、別個のハードウェア、ファームウェア、および/もしくはソフトウェア構成要素によって実行されるか、または共通もしくは別個のハードウェアもしくはソフトウェア構成要素内で統合され得る。
【０１９２】
本開示で説明する技法はまた、命令を記憶するコンピュータ可読記憶媒体など、コンピュータ可読媒体内で記憶、具現化、または符号化され得る。コンピュータ可読媒体内で埋め込まれたかまたは符号化された命令は、たとえば、命令が1つまたは複数のプロセッサによって実行されるとき、1つまたは複数のプロセッサに本明細書で説明する技法を実行させ得る。いくつかの例では、コンピュータ可読媒体は、非一時的コンピュータ可読記憶媒体であり得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電気消去可能プログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD-ROM、フロッピーディスク、カセット、磁気媒体、光媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
【０１９３】
コンピュータ可読媒体は、上記に記載したものなどの有形記憶媒体に対応する、コンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を容易にする任意の媒体を含む、通信媒体を含み得る。このようにして、「コンピュータ可読媒体」という句は、概して、(1)非一時的である有形のコンピュータ可読記憶媒体、および(2)一時的な信号もしくは搬送波などの非有形のコンピュータ可読通信媒体に対応し得る。
【０１９４】
様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく、本開示の構造または技法に修正を行うことができる。
【符号の説明】
【０１９５】
10  グラフィックスパイプライン
12  リソースブロック
14  入力アセンブラ
16  頂点シェーダ
18  ジオメトリシェーダ
20  ラスタライザ
22  ピクセルシェーダ
24  出力マージャ
30  グラフィックス処理装置(GPU)
32  コマンドエンジン
34  処理ユニット
36  スレッドスケジューラ
38  シェーダユニット
40  シェーダユニット
42  制御ユニット
44  命令ストア
46  処理要素
46A〜46H  処理要素
48  レジスタ
50  ローカルメモリ
52  スレッド構成
54  スレッド構成
56  ウェーブ構成
58  ウェーブ構成
60  ウェーブ構成
62  ウェーブ構成
82  頂点シェーダ処理コード
84  ジオメトリシェーダ処理コード
86  パッチコード
88  コードセグメント
90  コードセグメント
92  コードセグメント
100  コンピューティングデバイス
102  ユーザインターフェース
104  CPU
106  メモリコントローラ
108  メモリ
110  ディスプレイインターフェース
112  ディスプレイ
114  バス
116  GPUドライバ
118  コンパイラ
【図１】
0006294565.tif 000002
【図２】
0006294565.tif 000003
【図３】
0006294565.tif 000004
【図４】
0006294565.tif 000005
【図５】
0006294565.tif 000006
【図６】
0006294565.tif 000007
【図７】
0006294565.tif 000008
【図８】
0006294565.tif 000009
【図９】
0006294565.tif 000010
【図１０】
0006294565.tif 000011
【図１１】
0006294565.tif 000012