(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-06-09
(45)【発行日】2022-06-17
(54)【発明の名称】Zカリング後の重複フラグメントの除去又は識別
(51)【国際特許分類】
G06T 15/00 20110101AFI20220610BHJP
【FI】
G06T15/00 501
(21)【出願番号】P 2019530409
(86)(22)【出願日】2017-11-15
(86)【国際出願番号】 US2017061825
(87)【国際公開番号】W WO2018106422
(87)【国際公開日】2018-06-14
【審査請求日】2020-11-13
(32)【優先日】2016-12-09
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2016-12-13
(33)【優先権主張国・地域又は機関】EP
(73)【特許権者】
【識別番号】591016172
【氏名又は名称】アドバンスト・マイクロ・ディバイシズ・インコーポレイテッド
【氏名又は名称原語表記】ADVANCED MICRO DEVICES INCORPORATED
(73)【特許権者】
【識別番号】508301087
【氏名又は名称】エーティーアイ・テクノロジーズ・ユーエルシー
【氏名又は名称原語表記】ATI TECHNOLOGIES ULC
【住所又は居所原語表記】One Commerce Valley Drive East, Markham, Ontario, L3T 7X6 Canada
(74)【代理人】
【識別番号】100108833
【氏名又は名称】早川 裕司
(74)【代理人】
【識別番号】100111615
【氏名又は名称】佐野 良太
(74)【代理人】
【識別番号】100162156
【氏名又は名称】村雨 圭介
(72)【発明者】
【氏名】ローラン ルフェーブル
(72)【発明者】
【氏名】マイケル マントア
(72)【発明者】
【氏名】マーク ファウラー
(72)【発明者】
【氏名】ミッコ アルホ
(72)【発明者】
【氏名】ミカ ツオミ
(72)【発明者】
【氏名】キーア カッリオ
(72)【発明者】
【氏名】パトリック クラス ルドルフ バス
(72)【発明者】
【氏名】ジャリー アンテロ コンッパ
(72)【発明者】
【氏名】カイ ツオミ
(72)【発明者】
【氏名】クリストファー ジェイ. ブレナン
【審査官】片岡 利延
(56)【参考文献】
【文献】米国特許出願公開第2014/0292756(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06T 15/00
(57)【特許請求の範囲】
【請求項1】
ピクセルシェーダによる処理のためにフラグメントのストリームの重複フラグメントを識別する方法であって、
Zカリングされたフラグメントのストリームから、
フラグメントを記憶する遅延ピクセルシェーディングバッファに入力される新たなフラグメントを受信することであって、前記新たなフラグメントは、第1スクリーン位置を有する
、ことと、
前記遅延ピクセルシェーディングバッファにおいて、
前記遅延ピクセルシェーディングバッファに入力される前記新たなフラグメントの前記第1スクリーン位置と一致する第2スクリーン位置を有する
既存のフラグメントを識別することと、
前記識別したことに応じて、
前記既存のフラグメントの深度値と前記新たなフラグメントの深度値とを比較することなく、前記一致に基づいて前記遅延ピクセルシェーディングバッファを変更すること
であって、前記変更することは、前記既存のフラグメント及び前記新たなフラグメントを重複しているものとしてマーキングすることと、前記遅延ピクセルシェーディングバッファから前記既存のフラグメントを除去することと、のうち少なくとも1つを含む、ことと、
前記新たなフラグメントを前記遅延ピクセルシェーディングバッファに記憶することと、
前記遅延ピクセルシェーディングバッファ
に記憶されたフラグメントを、シェーディングのために前記ピクセルシェーダに送信することと、を含む、
方法。
【請求項2】
複数の入力プリミティブをビン処理して、複数のビン処理された入力プリミティブを生成することと、
前記複数のビン処理された入力プリミティブをラスタライズして、フラグメントのセットを生成することと、
前記フラグメントのセットをZカリングして、前記Zカリングされたフラグメントのストリームを生成することと、を含む、
請求項1の方法。
【請求項3】
前記複数の入力プリミティブをビン処理して、前記複数のビン処理された入力プリミティブを生成することは、前記複数の入力プリミティブのプリミティブをビンに割り当てることであって、各ビンは、スクリーン空間の異なる部分に関連している、ことを含み、
前記複数のビン処理された入力プリミティブは、前記複数の入力プリミティブのプリミティブによって重複したスクリーン空間の部分に基づいて順序付けられた前記複数の入力プリミティブのプリミティブを含む、
請求項2の方法。
【請求項4】
前記フラグメントのセットをZカリングすることは、
前記フラグメントのセットのフラグメント毎に、前記フラグメントが隠されることを示す深度値を深度バッファが記憶しているかどうかを判別することと、
前記フラグメントが隠される場合に、前記フラグメントを破棄することと、
前記フラグメントが隠されない場合に、前記深度値を、前記フラグメントの深度値と等しくなるように更新することと、を含む、
請求項2の方法。
【請求項5】
前記複数のビン処理された入力プリミティブをラスタライズして前記フラグメントのセットを生成することは、
入力プリミティブ毎に、前記入力プリミティブによってカバーされたスクリーン位置を識別することと、前記カバーされたスクリーン位置に対してフラグメントを生成することであって、前記生成されたフラグメントは、前記ラスタライズによって生成された前記フラグメントのセットに含まれ、前記Zカリングされたフラグメントのストリームを生成するためにZカリングされる、ことと、を含む、
請求項2の方法。
【請求項6】
前記遅延ピクセルシェーディングバッファのフラグメントを、シェーディングのためにピクセルシェーダに送信することは、ビンの全てのプリミティブに対応するフラグメントが前記遅延ピクセルシェーディングバッファで受信されたことを検出すること、フレームの全てのプリミティブが前記遅延ピクセルシェーディングバッファで受信されたことを検出すること、及び、前記遅延ピクセルシェーディングバッファがフルであることを検出すること、のうち1つ以上に応じて行われる、
請求項1の方法。
【請求項7】
前記遅延ピクセルシェーディングバッファは、スクリーン空間の第1部分に関連付けられており、
前記方法は、前記スクリーン空間の第2部分に関連する第2遅延ピクセルシェーディングバッファのために、前記受信することと、前記識別することと、前記変更することと、前記送信することと、を実行することを含む、
請求項1の方法。
【請求項8】
フラグメントのセットのフラグメントをZカリングして、Zカリングされたフラグメントのストリームを生成するように構成されたZカリングユニットと、
ピクセルシェーダであって、前記ピクセルシェーダに提供されたフラグメントに対してピクセルシェーディング処理を実行するように構成されたピクセルシェーダと、
遅延ピクセルシェーディングユニットと、を備え、
前記遅延ピクセルシェーディングユニットは、
前記Zカリングされたフラグメントのストリームから、
フラグメントを記憶する遅延ピクセルシェーディングバッファに入力される新たなフラグメントを受信することであって、前記新たなフラグメントは、第1スクリーン位置を有する
、ことと、
前記遅延ピクセルシェーディングバッファにおいて、
前記遅延ピクセルシェーディングバッファに入力される前記新たなフラグメントの前記第1スクリーン位置と一致する第2スクリーン位置を有する
既存のフラグメントを識別することと、
前記識別したことに応じて、
前記既存のフラグメントの深度値と前記新たなフラグメントの深度値とを比較することなく、前記一致に基づいて前記遅延ピクセルシェーディングバッファを変更すること
であって、前記変更することは、前記既存のフラグメント及び前記新たなフラグメントを重複しているものとしてマーキングすることと、前記遅延ピクセルシェーディングバッファから前記既存のフラグメントを除去することと、のうち少なくとも1つを含む、ことと、
前記新たなフラグメントを前記遅延ピクセルシェーディングバッファに記憶することと、
前記遅延ピクセルシェーディングバッファ
に記憶されたフラグメントを、シェーディングのために前記ピクセルシェーダに送信することと、
を行うように構成されている、
アクセラレーテッド処理デバイス(APD)。
【請求項9】
複数の入力プリミティブをビン処理して、複数のビン処理された入力プリミティブを生成するように構成されたビン処理部と、
前記複数のビン処理された入力プリミティブをラスタライズして、前記フラグメントのセットを生成するように構成されたスキャンコンバータと、を備える、
請求項
8のAPD。
【請求項10】
前記複数の入力プリミティブをビン処理して、前記複数のビン処理された入力プリミティブを生成することは、前記複数の入力プリミティブのプリミティブをビンに割り当てることであって、各ビンは、スクリーン空間の異なる部分に関連している、ことを含み、
前記複数のビン処理された入力プリミティブは、前記複数の入力プリミティブのプリミティブによって重複したスクリーン空間の部分に基づいて順序付けられた前記複数の入力プリミティブのプリミティブを含む、
請求項
9のAPD。
【請求項11】
前記Zカリングユニットは、
前記フラグメントのセットのフラグメント毎に、前記フラグメントが隠されることを示す深度値を深度バッファが記憶しているかどうかを判別することと、
前記フラグメントが隠される場合に、前記フラグメントを破棄することと、
前記フラグメントが隠されない場合に、前記深度値を、前記フラグメントの深度値と等しくなるように更新することと、
によって、前記フラグメントのセットのフラグメントをZカリングするように構成されている、
請求項
9のAPD。
【請求項12】
前記スキャンコンバータは、
入力プリミティブ毎に、前記入力プリミティブによってカバーされたスクリーン位置を識別することと、前記カバーされたスクリーン位置に対してフラグメントを生成することであって、前記生成されたフラグメントは、前記ラスタライズによって生成された前記フラグメントのセットに含まれ、前記Zカリングされたフラグメントのストリームを生成するためにZカリングされる、こととによって、前記複数のビン処理された入力プリミティブをラスタライズして、前記フラグメントのセットを生成するように構成されている、
請求項
9のAPD。
【請求項13】
前記遅延ピクセルシェーディングユニットは、ビンの全てのプリミティブに対応するフラグメントが前記遅延ピクセルシェーディングバッファで受信されたことを検出すること、フレームの全てのプリミティブが前記遅延ピクセルシェーディングバッファで受信されたことを検出すること、及び、前記遅延ピクセルシェーディングバッファがフルであることを検出すること、のうち1つ以上に応じて、前記遅延ピクセルシェーディングバッファのフラグメントを、シェーディングのために前記ピクセルシェーダに送信するように構成されている、
請求項
8のAPD。
【請求項14】
プロセッサによって実行されると、ピクセルシェーダによる処理のためにフラグメントのストリームの重複フラグメントを識別する方法を前記プロセッサに実行させる命令を記憶するコンピュータ可読記憶媒体であって、
前記方法は、
Zカリングされたフラグメントのストリームから、
フラグメントを記憶する遅延ピクセルシェーディングバッファに入力される新たなフラグメントを受信することであって、前記新たなフラグメントは、第1スクリーン位置を有する
、ことと、
前記遅延ピクセルシェーディングバッファにおいて、
前記遅延ピクセルシェーディングバッファに入力される前記新たなフラグメントの前記第1スクリーン位置と一致する第2スクリーン位置を有する
既存のフラグメントを識別することと、
前記識別したことに応じて、
前記既存のフラグメントの深度値と前記新たなフラグメントの深度値とを比較することなく、前記一致に基づいて前記遅延ピクセルシェーディングバッファを変更すること
であって、前記変更することは、前記既存のフラグメント及び前記新たなフラグメントを重複しているものとしてマーキングすることと、前記遅延ピクセルシェーディングバッファから前記既存のフラグメントを除去することと、のうち少なくとも1つを含む、ことと、
前記新たなフラグメントを前記遅延ピクセルシェーディングバッファに記憶することと、
前記遅延ピクセルシェーディングバッファ
に記憶されたフラグメントを、シェーディングのためにピクセルシェーダに送信することと、を含む、
コンピュータ可読記憶媒体。
【請求項15】
前記方法は、
複数の入力プリミティブをビン処理して、複数のビン処理された入力プリミティブを生成することと、
前記複数のビン処理された入力プリミティブをラスタライズして、フラグメントのセットを生成することと、
前記フラグメントのセットをZカリングして、前記Zカリングされたフラグメントのストリームを生成することと、を含む、
請求項
14のコンピュータ可読記憶媒体。
【請求項16】
前記遅延ピクセルシェーディングバッファのフラグメントを、シェーディングのためにピクセルシェーダに送信することは、ビンの全てのプリミティブに対応するフラグメントが前記遅延ピクセルシェーディングバッファで受信されたことを検出すること、フレームの全てのプリミティブが前記遅延ピクセルシェーディングバッファで受信されたことを検出すること、及び、前記遅延ピクセルシェーディングバッファがフルであることを検出すること、のうち1つ以上に応じて行われる、
請求項
14のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
(関連出願の相互参照)
本願は、2016年12月9日出願の米国特許出願第15/374,752号及び2016年12月13日出願の欧州特許出願第16203877.2号の利益を主張するものであり、これらは、言及することによって本明細書に完全に記載されているものとして援用される。
【0002】
開示された実施形態は、概して、グラフィックス処理に関し、特に、Zカリング後の隠蔽フラグメント(occluded fragments)の除去に関する。
【背景技術】
【0003】
3次元グラフィックスをレンダリングするハードウェアは、スクリーンに描画されるプリミティブを指定する入力を受け付け、当該入力を三角形に変換し、当該三角形を処理してスクリーンに表示するための色を生成する。この処理は、ピクセルの色を決定する処理であるピクセルシェーディングを含む。ピクセルシェーディングは、通常、ピクセルシェーダが特定のピクセルに対して複数の色を不必要に計算し、最終的に1つの色のみが使用される場合に発生する少なくとも一部の「オーバードロー」を含む。オーバードローは、例えば、2つの三角形がスクリーン空間内で重なっている場合に発生することがある。このような状況では、ピクセルシェーダは、第1三角形内のピクセルに対して第1色を決定し、次いで、第2三角形内の同じピクセルに対して第2色を決定する場合がある。このようなピクセルは1つしか使用できないので、決定された色値のうち1つの色値が破棄される。グラフィックス処理ハードウェアのパフォーマンスを向上させるには、オーバードローを抑制することが重要である。
【0004】
添付の図面と共に例として与えられる以下の説明から、より詳細な理解を得ることができるであろう。
【図面の簡単な説明】
【0005】
【
図1】1つ以上の開示された実施形態が実装され得る例示的なデバイスのブロック図である。
【
図2】一例によるアクセラレーテッド処理デバイスのブロック図である。
【
図3】
図2に示すグラフィックス処理パイプラインの更なる詳細を示すブロック図である。
【
図4】一例による、
図3のビン処理部(binner)によって実行される処理を示す図である。
【
図5】一例による、
図3のスキャンコンバータ及び
図3のZカリングユニットによって実行される処理を示す図である。
【
図6】一例による、後に受信したフラグメントによって隠されるフラグメントを破棄する方法のフロー図である。
【
図7】一例による、後に受信したフラグメントによって隠されるフラグメントを破棄する例示的な処理を示す図である。
【発明を実施するための形態】
【0006】
本開示は、Zカリングが完了した後のフラグメントストリーム内の重複フラグメントを除去又は識別する技術に関する。この技術は、Zカリング後のフラグメントを記憶する先入れ先出し(FIFO)バッファを維持することを含む。新たなフラグメントがバッファで受信される毎に、当該フラグメントのスクリーン位置が、バッファ内の他の全てのフラグメントに対してチェックされる。フラグメントのスクリーン位置がバッファ内のフラグメントのスクリーン位置と一致する場合、バッファ内のフラグメントが除去されるか、重複しているものとしてマーキングされる。フラグメントのスクリーン位置がバッファ内の何れのフラグメントのスクリーン位置にも一致しない場合、バッファ内の既存のフラグメントに対する変更が実行されない。何れの場合も、フラグメントがバッファに追加される。バッファの内容は、後に、ピクセルシェーディングのためにピクセルシェーダに送信される。
【0007】
図1は、本開示の1つ以上の態様が実装された例示的なデバイス100のブロック図である。デバイス100は、例えば、コンピュータ、ゲーム機、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話又はタブレットコンピュータ等を含む。デバイス100は、プロセッサ102と、メモリ104と、ストレージデバイス106と、1つ以上の入力デバイス108と、1つ以上の出力デバイス110と、を含む。また、デバイス100は、入力デバイス108及び出力デバイス110をそれぞれ駆動する入力ドライバ112及び出力ドライバ114も含む。デバイス100は、
図1に示されていない追加のコンポーネントを含み得ることが理解されるであろう。
【0008】
プロセッサ102は、中央処理装置(CPU)、グラフィックス処理装置(GPU)、同じダイ上に配置されたCPU及びGPU、又は、1つ以上のプロセッサコアを含み、各プロセッサコアは、CPU又はGPUであってもよい。メモリ104は、プロセッサ102と同じダイ上に配置されてもよいし、プロセッサ102とは別に配置されてもよい。メモリ104は、揮発性又は不揮発性メモリ(例えば、ランダムアクセスメモリ(RAM)、ダイナミックRAM、キャッシュ等)を含む。
【0009】
ストレージデバイス106は、固定又は着脱可能なストレージ(例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク若しくはフラッシュドライブ等)を含む。入力デバイス108は、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、バイオメトリクススキャナ又はネットワーク接続(例えば、無線IEEE802信号の送信及び/若しくは受信用の無線ローカルエリアネットワークカード)を含む。出力デバイス110は、ディスプレイ、スピーカ、プリンタ、触覚フィードバックデバイス、1つ以上のライト、アンテナ又はネットワーク接続(例えば、無線IEEE802信号の送信及び/若しくは受信用の無線ローカルエリアネットワークカード)を含む。
【0010】
入力ドライバ112は、プロセッサ102及び入力デバイス108と通信し、プロセッサ102が入力デバイス108から入力を受信するのを可能にする。出力ドライバ114は、プロセッサ102及び出力デバイス110と通信し、プロセッサ102が出力デバイス110に出力を送信するのを可能にする。出力ドライバ114は、ディスプレイデバイス118に接続されたアクセラレーテッド処理デバイス(APD)116を含む。APD116は、プロセッサ102から計算コマンド及びグラフィックスレンダリングコマンドを受信し、計算コマンド及びグラフィックスレンダリングコマンドを処理して、表示のためにピクセル出力をディスプレイデバイス118に提供するように構成されている。
【0011】
APD116は、単一命令複数データ(SIMD)パラダイムに従って計算を実行するように構成された1つ以上の並列処理装置を含む。しかしながら、APD116によって実行されるものとして説明した機能は、SIMDパラダイムに従ってデータを処理しない処理デバイスによって実行されてもよい。
【0012】
図2は、一例によるアクセラレーテッド処理デバイス116のブロック図である。プロセッサ102は、プロセッサ102による実行のための1つ以上の制御論理モジュールをシステムメモリ104内に保持している。制御論理モジュールは、オペレーティングシステム120と、ドライバ122と、アプリケーション126と、を含む。これらの制御論理モジュールは、プロセッサ102及びAPD116の様々な態様の処理を制御する。例えば、オペレーティングシステム120は、ハードウェアと直接通信し、プロセッサ102で実行中の他のソフトウェア用のハードウェアへのインタフェースを提供する。ドライバ122は、例えば、APD116の様々な機能にアクセスするために、プロセッサ102で実行中のソフトウェア(例えば、アプリケーション126)へのアプリケーションプログラミングインタフェース(API)を提供することによって、APD116の処理を制御する。また、ドライバ122は、APD116の処理コンポーネント(例えば、以下でさらに詳細に説明するSIMDユニット138等)による実行のために、シェーダプログラムをコンパイルするジャストインタイムコンパイラを含む。
【0013】
APD116は、例えばグラフィックス処理及び非グラフィックス処理等のように、並列処理に適し得る選択された機能のためのコマンド及びプログラムを実行する。APD116は、例えばピクセル演算、幾何学的計算等のグラフィックスパイプライン処理を実行し、プロセッサ102から受信したコマンドに基づいて画像をディスプレイデバイス118にレンダリングするために使用することができる。また、APD116は、プロセッサ102から受信したコマンド、又は、グラフィックス処理パイプライン134の「正常な」情報フローの一部ではないコマンドに基づいて、例えばビデオ、物理シミュレーション、計算流体力学又は他のタスクに関係する処理等のようにグラフィックス処理に直接関連しない(若しくは関連していない)計算処理を実行する。
【0014】
APD116は、SIMDパラダイムに従って、プロセッサ102の要求に応じて並列に処理を実行するように構成された1つ以上のSIMDユニット138を有するシェーダエンジン132(本明細書では、まとめて「プログラマブル処理装置202」と呼ばれる)を含む。SIMDパラダイムは、複数の処理要素が単一のプログラム制御フローユニット及びプログラムカウンタを共有することによって同一のプログラムを実行するが、異なるデータを用いて当該プログラムを実行することができるパラダイムである。一例では、各SIMDユニット138は、16個のレーンを含んでおり、各レーンは、SIMDユニット138内の他のレーンと同時に同じ命令を実行するが、異なるデータを用いて当該命令を実行することができる。全てのレーンが所定の命令を実行するのに必要とされていない場合、レーンを予測によってスイッチオフにすることができる。予測を使用して、分岐した制御フローを有するプログラムを実行することもできる。より具体的には、制御フローが個々のレーンによって実行された計算に基づく条件付き分岐又は他の命令を有するプログラムの場合、現在実行されていない制御フローパスに対応するレーンの予測、及び、異なる制御フローパスの連続実行は、任意の制御フローに追従することを可能にする。
【0015】
シェーダエンジン132における実行の基本単位は、ワークアイテムである。各ワークアイテムは、特定のレーンで並行して実行されるプログラムの単一のインスタンス化(instantiation)を表す。ワークアイテムは、単一のSIMDユニット138上で「ウェーブフロント(wavefront)」として同時に実行することができる。複数のウェーブフロントは、同じプログラムを実行するように指定されたワークアイテムの集合を含む「ワークグループ」に含まれてもよい。ワークグループを構成する各ウェーブフロントを実行することによって、ワークグループを実行することができる。ウェーブフロントは、単一のSIMDユニット138上で連続して実行されてもよいし、異なるSIMDユニット138上で部分的に又は完全に並列して実行されてもよい。ウェーブフロントは、単一のSIMDユニット138上で同時に実行可能なワークアイテムの最大の集合と考えることができる。したがって、プロセッサ102から受信したコマンドが、特定のプログラムが単一のSIMDユニット138上で同時に実行できない程度に並列化されることを示す場合、当該プログラムは、2つ以上のSIMDユニット138で並列化され、又は、同じSIMDユニット138上で直列化(必要に応じて、並列化及び直列化の両方が行われる)されたウェーブフロントに分割される。スケジューラ136は、異なるシェーダエンジン132及びSIMDユニット138で様々なウェーブフロントをスケジュールすることに関連する処理を実行するように構成されている。スケジュールすることは、SIMDユニット138上で実行するためのウェーブフロントを割り当てること、ウェーブフロントがいつ終了したかを決定することと、ウェーブフロントがいつストールし、他のウェーブフロントとスワップアウトされるかを判別することと、他のスケジューリングタスクを実行すること、を含む。
【0016】
シェーダエンジン132によって提供される並列処理は、例えば、ピクセル値計算、頂点変換及び他のグラフィックス処理等のグラフィックス関連処理に適している。プロセッサ102からグラフィックス処理コマンドを受信するグラフィックス処理パイプライン134は、並列実行のために計算タスクをシェーダエンジン132に提供する。
【0017】
また、シェーダエンジン132は、グラフィックスに関連しないか、グラフィックス処理パイプライン134の「通常」処理(例えば、グラフィックス処理パイプライン134の処理のために実行される処理を補足するのに実行されるカスタム処理)の一部として実行されない計算タスクを実行するために使用される。プロセッサ102で実行中のアプリケーション126又は他のソフトウェアは、係る計算タスクを定義するプログラム(「計算シェーダプログラム」と呼ばれることが多い)を、実行のためにAPD116に送信する。
【0018】
図3は、
図2に示すグラフィックス処理パイプライン134の更なる詳細を示すブロック図である。グラフィックス処理パイプライン134は、ワールド空間パイプライン302と、ビン処理部304と、スキャンコンバータ306と、Zカリングユニット308と、遅延ピクセルシェーディングユニット310と、ピクセルシェーダ312と、出力マージャ314と、を含む。出力マージャ314は、ディスプレイデバイス118に表示するためのデータを記憶するフレームバッファ316に対してピクセルデータを出力する。フレームバッファは、ディスプレイデバイス118にデータを表示する以外の目的に使用することができる。
【0019】
ワールド空間パイプライン302は、3次元ワールド空間で定義されたオブジェクトを、スクリーン空間で定義された三角形に変換する頂点及びプリミティブ処理を実行する。ワールド空間パイプライン302は、ユーザ充填バッファ(例えば、プロセッサ102によって実行されるソフトウェア(例えば、アプリケーション等)の要求によって充填されたバッファ)からプリミティブデータを読み出し、当該データを、パイプラインの残りの部分によって使用されるプリミティブにアセンブルする。ワールド空間パイプライン302は、プロセッサ102から受信した入力を、スクリーンピクセルにレンダリングするのにより適した形態に変換する機能を実行する。より具体的には、ワールド空間パイプライン302は、頂点シェーディング機能と、テッセレーションが可能である場合にはオプションのテッセレーション機能と、ジオメトリシェーディングが可能である場合にはオプションのジオメトリシェーディング機能と、を実行する。
【0020】
頂点シェーディングは、例えば、トランスフォーム、スキニング、モーフィング、頂点単位のライティング等の様々な頂点単位の処理を実行することを含む。トランスフォーム処理は、頂点の座標をトランスフォーム(変換)するための様々な処理を含むことができる。これらの処理は、モデリングトランスフォーム、表示トランスフォーム(viewing transformations)、投影トランスフォーム、パースペクティブ(perspective)分割及びビューポートトランスフォームのうち1つ以上を含んでもよい。本明細書では、このようなトランスフォームは、トランスフォームが実行される頂点の座標、つまり「位置」を変更すると考えられる。頂点シェーディングの他の処理は、座標以外の属性を変更してもよい。頂点シェーディングは、1つ以上のシェーダエンジン132で実行される頂点シェーダプログラムとして部分的又は完全に実装される。いくつかの例では、頂点シェーダプログラムは、プロセッサ102によって提供され、コンピュータプログラマによって事前に生成されたプログラムに基づいている。ドライバ122は、このようなプログラムをコンパイルして、シェーダエンジン132内での実行に適したフォーマットを有する頂点シェーダプログラムを生成する。他の例において、頂点シェーダプログラムは、ドライバ122によって直接提供されるか、APD116自体のメモリから取り出されるか、任意の他の技術的に実現可能な手段を通じて提供される。
【0021】
テッセレーションは、プリミティブを細分化することによって、単純なプリミティブをより複雑なプリミティブに変換する。テッセレーションは、入力プリミティブに基づいてテッセレーションのパッチを生成し、パッチのサンプルのセットを生成し、パッチのサンプルに対応する頂点の頂点位置を計算することを含む。テッセレーションは、プログラマブル処理装置202で実行されるシェーダプログラムによって、部分的又は完全に実行することができる。
【0022】
ジオメトリシェーディングは、プリミティブ毎に頂点処理を実行する。様々な異なるタイプの処理を、例えば、ポイントスプライト展開、動的パーティクルシステム操作、ファーフィン(fur-fin)生成、シャドウボリューム生成、キューブマップへのシングルパスレンダリング、プリミティブ毎のマテリアルスワップ、プリミティブ毎のマテリアル設定等の処理を含むジオメトリシェーディングを介して実行することができる。ジオメトリシェーディングのための処理は、プログラマブル処理装置202で実行されるシェーダプログラムによって実行されてもよい。
【0023】
ワールド空間パイプライン302は、ハードウェア(固定機能のハードウェア及びプログラム可能なハードウェアを含む)とソフトウェアとの組み合わせとして実装することができ、全てハードウェア(全て固定機能のハードウェア、全てプログラム可能なハードウェア、もしくはこれらの組み合わせを含む)として実装することができ、またはハードウェアプロセッサ上で実行されているソフトウェアとして完全に実装することができる。ワールド空間パイプライン302は、フレームバッファ316に書き込まれ、ディスプレイデバイス118に出力されるスクリーンピクセルに最終的に変換できるようにグラフィックス処理パイプライン134内の他のユニットによって処理するために、プリミティブ(通常は三角形)を出力する。
【0024】
オプションであるビン処理部304は、ワールド空間パイプライン302からプリミティブを受信し、各プリミティブを1つ以上の「ビン」に割り当てる。ビンは、スクリーン空間の特定の区画に関連するピクセルデータの論理的なグループである。例えば、1つのビンは、スクリーン空間の左上のコーナーのピクセルデータのグループ(例えば、スクリーン空間の上部64×64ピクセル)を含むことができる。ビン処理部304は、特定のトリガ条件が満たされるまでビンを充填した後、順次、処理のためにスキャンコンバータ306にビンを送信する。ビン処理の目的は、グラフィックス処理パイプライン134内の後のユニットが、所定時間に処理されるスクリーンの部分に関して、ピクセルを「集中」的に処理可能にすることである。この「集中」は、処理の任意の特定の部分の間に維持される作業データの量を削減することを目的としており、これにより、キャッシュ又はバッファをより小さくし及び/又は(例えば、より高いヒット率を有する等によって)より効率的に使用することができる。例えば、スクリーンの左上隅に関連するデータを送信してから他のデータを送信することによって、左上隅に関連するデータを記憶するバッファ及びキャッシュは、スクリーンの当該左上隅のデータのみを有する。これにより、このようなバッファ又はキャッシュをより小さくし及び/又はより高いヒット率を得ることが可能になる。ビン処理部304の処理の例は、
図4に関連して以下に提供される。ビン処理部の処理に関する更なる詳細は、2013年3月29日に出願された“Hybrid Render with Deferred Primitive Batch Binning”と題する米国特許出願第13/853,422号、及び、2016年8月29日に出願された“Hybrid Render with Preferred Primitive Batch Binning and Sorting”と題する米国特許出願第15/250,357号において提供されており、これらの両方の全体は、言及することによって本明細書に援用される。
【0025】
スキャンコンバータ306は、ビン処理部304からプリミティブを受信し、これらのプリミティブに対してラスタライズを実行する。ラスタライズは、何れのスクリーンピクセル(又は、アンチエイリアシング等の目的で複数の色値サンプルがスクリーンピクセル毎に生成されるモードの場合には、サブピクセルサンプル)が特定のプリミティブによってカバーされるかを判別することを含む。「ピクセル」という用語は、本明細書において「サブピクセルサンプル」に置き換えられてもよいことを理解されたい。サブピクセルサンプルは、複数のサンプルがピクセル毎に生成される状況では、ピクセルよりも小さいスクリーン空間の一部である。例えば、アンチエイリアシングアルゴリズムは、ピクセル毎に複数のサンプルを利用して、エッジの見かけの急峻さを低減してもよい。
【0026】
スキャンコンバータ306は、特定のピクセルに対するデータの未完成な表現である「フラグメント」を生成して出力する。フラグメントは、グラフィックス処理パイプライン134の残りの部分を通って移動し、フラグメントの色、及び、可能であれば他の値を識別するように処理される。フラグメントは、深度テスト(depth testing)又は他の理由によりカリングされてもよいし、存続して、ディスプレイデバイス118に表示するための色値としてフレームバッファ316に書き込まれてもよい。スキャンコンバータ306は、複数のフラグメントを、スクリーン空間内の隣接する2×2のフラグメントのグループである「クワッド」にグループ分けして出力してもよい。各クワッドは、スクリーン空間内のクワッドの位置を一意に定義するクワッドアドレスに対応することができる。例えば、クワッドが2×2のフラグメントのグループである場合、クワッドアドレスは、偶数のスクリーン位置x及びyを有するクワッド内のフラグメントのスクリーン位置を2で割ったものであってもよい。一例において、クワッドは、スクリーン位置[0,0]、[1,0]、[0,1]、[1,1]を有する4つのフラグメントを含む。このクワッドのクワッドアドレスは、偶数のスクリーン位置(0,0)を有するフラグメントの座標を2で割ったもの(0,0)となる。スクリーン位置[10,8]、[11,8]、[10,9]、[11,9]を有する4つのフラグメントを含むクワッドの場合、クワッドアドレスは、共に偶数番号のピクセル座標([10,8])を有するフラグメントについて、その両方の座標を2で割ったスクリーン位置([5,4])となる。各クワッドは、クワッド内の何れのフラグメントがプリミティブによってカバーされ、何れのフラグメントがカバーされないかを示すカバレッジマップを含む。例えば、ラスタライズは、プリミティブが、特定のクワッドの4つのフラグメントのうち3つのフラグメントをカバーすると決定してもよい。そのクワッドのカバレッジマップは、3つのカバーされたフラグメントがカバーされ、残りの1つのフラグメントがカバーされていないことを示す。
【0027】
Zカリングユニット308は、後に見られるフラグメント及び既に見られたフラグメントの深度値によって判別されるように、既に見られたフラグメントによって隠されていると判別されたフラグメントを破棄する。蓄積された深度データは、フレーム毎にリセットされる。一例では、現在のフレームに対してZカリングユニット308によってフラグメントが処理されていない特定のスクリーン位置について、Zカリングユニット308は、5の深度を有する第1フラグメント、次に8の深度を有する第2フラグメント、次いで2の深度を有する第3フラグメントを受信する。Zカリングユニット308は、スクリーン位置の深度データが未だ存在しないので、第1フラグメントを破棄しない。しかしながら、第2フラグメントの深度値が、当該フラグメントが第1フラグメントに比べてカメラから遠い(例えば、8の深度が5の深度よりも大きい)ことを示しているので、Zカリングユニット308は、第2フラグメントを破棄する。Zカリングユニット308は、第3フラグメントが2の深度値を有しており、5の深度値を有する他の最も近いフラグメントよりも近いので、第3フラグメントを破棄しない。また、Zカリングユニット308は、後に見られるフラグメントの処理のために、スクリーン位置の深度値を2に更新する。クワッドの処理においてフラグメントを破棄することは、クワッドのカバレッジマップを変更することを含んでもよく、クワッドのカバレッジマップが更新された後にフラグメントが全く見えない場合には、クワッド全体を破棄することを含んでもよい。
【0028】
遅延ピクセルシェーディングユニット310は、Zカリングユニット308から受信したフラグメントを保持して、保持されたフラグメントを、当該フラグメントを上書きすることになるより新たなフラグメントに対してテストする。このテストは、ピクセルシェーダ312によって処理されるフラグメントの数を低減するために実行される。Zカリングユニット308に関して説明した3つのフラグメントの例に戻ると、第3フラグメントがカメラに最も近く、これにより他の2つのフラグメントを隠すため、Zカリングユニット308によって処理された3つのフラグメントのうち第3フラグメントのみが最終的に見えるようになる。しかしながら、Zカリングユニット308は、深度値5を有する第1フラグメントと、深度値2を有する第3フラグメントと、の両方を渡す。最終的なシーンでは見えなくなる第1フラグメントがピクセルシェーダ312によって処理されるのを抑制するために、遅延ピクセルシェーディングユニット310は、フラグメントを更に処理して、後に見られるフラグメントによって隠されるにも関わらずZカリングユニット308によって渡された少なくともいくつかのフラグメントを除去する。遅延ピクセルシェーディングユニット310の処理に関する詳細は、少なくとも
図6及び
図7並びに関連する開示において与えられる。
【0029】
ピクセルシェーダ312は、ピクセルシェーディングを実施する。ピクセルシェーディングは、ワールド空間パイプライン302で生成されたプリミティブと、ラスタライズ及びZカリングの結果と、に基づいて、フラグメントの値(色等)を決定することを含む。ピクセルシェーディングは、テクスチャメモリからのテクスチャを適用すること、シェーディングアルゴリズムを適用すること、及び/又は、他の処理を適用することを含んでもよい。ピクセルシェーディングのための処理は、プログラマブル処理装置202で実行される1つ以上のシェーダプログラムによって実行されてもよい。
【0030】
出力マージャ314は、ピクセルシェーダ312から受信したフラグメントを処理してフレームバッファ316に出力する。フレームバッファは、ディスプレイデバイス118への出力又は他の目的のために、ピクセルデータを記憶する。
【0031】
ワールド空間パイプライン302、ビン処理部304、スキャンコンバータ306、Zカリングユニット308、遅延ピクセルシェーディングユニット310、ピクセルシェーダ312及び出力マージャ314の各々は、ハードウェア(固定機能のハードウェア及びプログラマブルハードウェアを含む)とソフトウェアとの組み合わせとして実装することができ、全てをハードウェア(全て固定機能のハードウェア、全てプログラム可能なハードウェア、若しくは、これらの組み合わせを含む)として実装することができ、ハードウェアプロセッサで実行されているソフトウェアとして完全に実装することができる。
【0032】
図4は、一例による、
図3のビン処理部304によって実行される処理を示す図である。いくつかのスクリーン空間区画404に分割されたスクリーン空間402が示されている。スクリーン空間402は、ディスプレイデバイス118に最終的に出力するためにピクセルをレンダリングすることができるジオメトリック領域を表す。各スクリーン空間区画404は、スクリーン空間402の空間的に異なる部分である。
【0033】
図4は、ワールド空間パイプライン302から受信した5つの異なるプリミティブ406を示している。異なるプリミティブ406は、異なるスクリーン空間区画404をカバーしている。第1プリミティブ406(1)は、スクリーン空間区画404(1)、スクリーン空間区画404(2)、スクリーン空間区画404(4)及びスクリーン空間区画404(5)をカバーしている。第2プリミティブ406(2)は、スクリーン空間区画404(1)、スクリーン空間区画404(2)及びスクリーン空間区画404(3)をカバーしている。第3プリミティブ406(3)は、スクリーン空間区画404(5)をカバーしている。第4プリミティブ406(4)は、スクリーン空間区画404(3)、スクリーン空間区画404(5)及びスクリーン空間区画404(6)をカバーしている。第5プリミティブ406(5)は、スクリーン空間区画404(5)、スクリーン空間区画404(6)、スクリーン空間区画404(7)、スクリーン空間区画404(8)及びスクリーン空間区画404(9)をカバーしている。
【0034】
ビン処理部304は、ビン1~9(ビン1 408(1)、ビン2 408(2)、以下同様にビン9 408(9)までを含む)を生成する。各ビン408は、その特定のビンに関連するスクリーン空間区画404をカバーするプリミティブ406を含む。ビン408は、処理のためにグラフィックス処理パイプライン134の残りの部分に順次送信される。図示された特定の順序は、左から右及び行毎であるが、ビン408を処理のために送信する順序は、技術的に実現可能な任意の順序とすることができる。
【0035】
プリミティブ406は、関連するスクリーン空間区画404の境界で「切断」されているように
図4に示されているが、プリミティブ全体は、特定の各ビンに含まれる。関連するスクリーン空間区画404の境界に合わせたクリッピング矩形は、各ビン408と共にグラフィックス処理パイプライン134の残りの部分に送信される。その結果、グラフィックス処理パイプライン134の残りの部分は、スクリーン空間区画404の外側ではなく内側のフラグメントのデータを処理することを認識している。クリッピング矩形の境界は、隣接ピクセルからのデータを使用するアンチエイリアシング又は他の処理等のように、境界の変更を必要とする可能性がある様々な処理のために変更することができる。
【0036】
ビン408は、クリッピング矩形と共に、グラフィックス処理パイプライン134の残りの部分によって処理され、プリミティブをビンの順序でピクセルにレンダリングする。例えば、スキャンコンバータ306は、第1ビン408(1)、第2ビン408(2)、第3ビン408(3)等におけるプリミティブのピクセルカバレッジを決定する。スキャンコンバータ306は、第1ビン408(1)のプリミティブ、第2ビン408(2)のプリミティブ、第3ビン408(3)のプリミティブ等をラスタライズする。上述したように、ラスタライズは、特定のプリミティブによってカバーされているスクリーン位置を識別することを含む。クリッピング矩形は、識別されたスクリーン位置を、特定のビン408に関連するスクリーン空間区画404内に含まれるスクリーン位置のみに制限する。したがって、特定のビン408に対するスキャンコンバータ306の出力は、ビン408内のプリミティブ406毎に、当該ビン408に関連するスクリーン空間区画404内に存在し、当該プリミティブ406によってカバーされるフラグメントを含む。特定のビン408に対するピクセルシェーダ312の出力は、プリミティブ406毎に、当該プリミティブ406をカバーし、当該ビン408に関連するスクリーン空間区画404内にあるシェーディング付きフラグメントを含む。
【0037】
図5は、一例による、
図3のスキャンコンバータ306及び
図3のZカリングユニット308によって実行される処理を示す図である。スキャンコンバータ306は、ワールド空間パイプライン302及びビン処理部304によって処理されたプリミティブ406を受信し、スキャンコンバージョン(「ラスタライズ」とも呼ばれる)を実行する。スキャンコンバージョンは、何れのスクリーン位置502がプリミティブ406によってカバーされるかを識別することを含む。特定のスクリーン位置502が特定のプリミティブによってカバーされているかどうかを判別するためのルールは様々であり、何れのスクリーン位置502がプリミティブ406によってカバーされるているかを識別するための技術的に実現可能な方法が使用されてもよい。プリミティブがピクセルをカバーしているかどうかを判別するための1つの例示的な技術は、ピクセルの中心点がプリミティブのエッジの内側にあるかどうかを判別することである。この例では、ピクセルの中心点がプリミティブのエッジの内側にある場合、プリミティブが当該ピクセルをカバーしているとみなされる。この例では、ピクセルの中心点がプリミティブのエッジの内側にない場合、プリミティブが当該ピクセルをカバーしていないとみなされる。ピクセルがプリミティブによってカバーされているかどうかを判別するための他の技術的に実現可能な技術を代わりに使用することができる。いくつかの状況において、グラフィックス処理パイプライン134は、スクリーンピクセル毎に複数の「サンプル」(例えば、色値)を含む画像をフレームバッファ316内に生成する。マルチサンプル画像は、ピクセルに対して生成された複数のサンプルに基づいてスクリーンピクセル毎に単一の色値を生成するマルチサンプルアンチエイリアシング等の様々なタスクに使用することができる。このような状況において、スキャンコンバータ306は、ピクセル内のサンプル毎にカバレッジを判別し、ピクセル内のカバーされたサンプル毎にフラグメントを出力する。また、スキャンコンバータ306は、ピクセル毎にカバレッジマスクを生成して出力してもよい。ここで、カバレッジマスクは、ピクセル内の何れのサンプルがプリミティブによってカバーされているかを示す。スキャンコンバータ306は、Zカリングユニット308による処理のために、プリミティブ406によってカバーされたフラグメント504を出力する。
図5では、6つのスクリーン位置502がプリミティブ406によってカバーされているとみなされる。
【0038】
6つのスクリーン位置502に対応する6つのフラグメント504(504(1)~504(6))が
図5に示されている。各フラグメント504は、同様に示された深度値を有する。この深度値は、各フラグメント504内に示された数である。
図5に示す例では、各フラグメント504の深度値が6であるが、他の例では、同じプリミティブのフラグメントが異なる深度値を有することができる。
【0039】
Zカリングユニット308は、Zカリングを実行するために、受信したフラグメント504の深度値を深度バッファ506内の深度値と比較する。深度バッファ506内の対応する深度値が、検討中のフラグメント504がZカリングユニット308によって既に処理されたフラグメントによって隠されていることを示す場合、当該フラグメント504が破棄される。深度バッファ506内の対応する深度値が、検討中のフラグメント504がZカリングユニット308によって既に処理されたフラグメントによって隠されていないことを示す場合、当該フラグメント504がZカリングユニット308を通過し、深度バッファ506内の深度値は、通過したフラグメント504の深度値と一致するように更新される。
【0040】
深度バッファ506内の深度値は、プリミティブ406に対して局所的なスクリーン領域508について示されているが、簡単さ及び明瞭さのために深度バッファ506の他の部分から省略されている。しかしながら、深度バッファ506は、スクリーンの他の領域の深度値を記憶することを理解されたい。
【0041】
プリミティブ406に対して局所的なスクリーン領域508は、左から右へ、上から下への順に、2、9、9、9、2、9、9、9、2、9、9、9である12個の深度値を示す。プリミティブ406に基づいて生成されたフラグメント504の位置は、深度バッファ506内のプリミティブ406の位置によって示されるように、異なる深度値に対応する。より具体的には、フラグメント504(1)は、一番上の深度値2と重なり合い、フラグメント504(2)は、中央の深度値2と重なり合い、フラグメント504(4)は、下の深度値2と重なり合い、フラグメント504(3)は、左中央の深度値9と重なり合い、フラグメント504(5)は、左下の深度値9と重なり合い、フラグメント504(6)は、下中央の深度値9と重なり合う。
【0042】
Zカリングユニット308は、フラグメント504の深度値を、フラグメント504によって重ねられた深度バッファ506内の深度値と比較する。深度バッファ506内の深度値が重複フラグメント504の深度値よりも小さい(したがって、関連するフラグメントが重複フラグメント504よりもカメラに近い)場合、重複フラグメント504は、Zカリングユニット308によって既に処理されたフラグメントによって隠される。この状況では、Zカリングユニット308は、重複フラグメントを破棄する。
図5において、左端のフラグメント504(フラグメント504(1)、フラグメント504(2)及びフラグメント504(4))は、6の深度値を有し、深度バッファ506内で重複する部分の深度値は、2に等しい。したがって、Zカリングユニット308は、左端のフラグメント504を破棄する(これらの破棄は、「X」で示されている)。深度バッファ506内の深度値が重複フラグメント504の深度値よりも大きい場合、重複フラグメント504は、Zカリングユニット308によって既に処理された何れのフラグメント504によっても隠されない。この状況では、Zカリングユニット308は、フラグメント504を破棄しないが、代わりに、深度バッファ506内に記憶された深度値を、隠されないフラグメント504の深度値で更新する。
図5では、フラグメント504(3)、フラグメント504(5)及びフラグメント504(6)に対応する3つの深度値が更新される。よって、深度バッファが更新された後では、2の深度値が3つ存在し、6の深度値が3つ存在し、残りの深度値は9である。
【0043】
要約すると、Zカリングユニット308は、Zカリングユニット308によって処理されたフラグメント504の最小の深度値を記憶するように深度バッファ506を保持する。Zカリングユニット308から出力された後続のフラグメントを、Zカリングユニット308から出力された先行のフラグメントによって隠すことができない。しかしながら、Zカリングユニット308から出力された先行のフラグメントは、場合によっては、Zカリングユニット308によって後に処理されたフラグメントによって隠される可能性がある。特定の「深度モデル」が本明細書で説明されている。このモデルでは、より小さい深度値は、より大きい深度値よりもフラグメントがカメラに近いことを意味する。しかしながら、本明細書で提供された教示は、この特定の「深度モデル」に限定されず、他の技術的に実現可能な深度モデルに適用可能であることを当業者によって理解されたい。一例では、より大きい深度値は、より小さい深度値を有するフラグメントよりもフラグメントがカメラに近いことを意味する。他の技術的に実現可能な深度モデルが同様に可能である。
【0044】
このため、遅延ピクセルシェーディングユニット310は、Zカリングユニット308から出力されたフラグメントを「保持」して、先行のフラグメントを隠す後続のフラグメントの有無をチェックする。
図6は、一例による、後に受信したフラグメントによって隠されるフラグメントを破棄する方法600のフロー図である。
図1~
図5に関連して示され説明されたシステムについて述べたが、技術的に実現可能な順序で方法を実行するように構成された任意のシステムが本開示の範囲内に含まれることを理解されたい。
【0045】
図に示すように、方法600は、ステップ602から開始する。このステップでは、スキャンコンバータ306は、プリミティブをラスタライズして、当該プリミティブに対応するフラグメントのセットを取得する。ラスタライズは、
図3及び
図5に関連して説明したように実行されてもよい。ビン処理を使用した場合には、取得されたフラグメントのセットは、プリミティブに対応するフラグメントであり、特定のスクリーン空間区画404内に存在する。ステップ604では、Zカリングユニット308は、ラスタライズされたフラグメントをスキャンコンバータ306から受信し、これらのフラグメントに対してZカリングを実行する。Zカリングは、受信したフラグメントの深度値を、深度バッファ内に記憶された深度値と比較することを含む。深度バッファ内の対応する値よりも大きい深度値を有するフラグメントは、以前に処理されたフラグメントによって隠され、これにより破棄される。深度バッファ内の対応する値よりも小さい深度値を有するフラグメントは、以前に処理されたフラグメントによって隠されない。この状況では、Zカリングユニット308は、深度バッファ内の深度値をフラグメントの深度値で更新し、遅延ピクセルシェーディングユニット310にフラグメントを渡す。
【0046】
ステップ606では、遅延ピクセルシェーディングユニット310は、受信したフラグメントを、遅延ピクセルシェーディングユニット310によって以前に処理されたフラグメントを記憶する先入れ先出し(FIFO)バッファ内に記憶されたフラグメントと比較する。より具体的には、遅延ピクセルシェーディングユニット310は、入力フラグメントのスクリーン位置が、FIFOバッファ内に記憶されたフラグメントのスクリーン位置と一致するかどうかを判別する。ビン処理は、FIFOバッファ内で一致する可能性を高める。この理由は、ビン処理によって、スクリーン空間の他の部分のフラグメントではなく、ビンに関連するスクリーン空間のごく一部のフラグメントが、遅延ピクセルシェーディングユニット310内で共に処理されるためである。
【0047】
ステップ608では、遅延ピクセルシェーディングユニット310は、FIFOバッファ内のフラグメントのスクリーン位置と一致するスクリーン位置を有するフラグメントに対して、最も古い一致フラグメントをFIFOバッファから除去する。入力フラグメントとFIFOバッファ内のフラグメントとの間でスクリーン位置が一致しない場合、遅延ピクセルシェーディングユニット310は、何れのフラグメントもFIFOバッファから破棄しない。ステップ610では、遅延ピクセルシェーディングユニット310は、受信したフラグメントをFIFOバッファに入れる。遅延ピクセルシェーディングユニット310は、ステップ606で比較した際にこのようなフラグメントがFIFOバッファ内の既存のフラグメントと一致するかどうかに関わらず、このステップにおいてフラグメントをFIFOバッファに入れる。
【0048】
遅延ピクセルシェーディングユニット310は、FIFOを充填し続けてフラッシュ条件が満たされると、この時点で、FIFO内のフラグメントをピクセルシェーダ312に送信し、FIFOによって示された順序で処理できるようにする。フラッシュは、1)FIFOがフルである、2)ビン処理部304が、特定のビン408の全てのプリミティブがビン処理部304によって送信されたことを遅延ピクセルシェーディングユニット310に示す、3)ビン処理部304が、現在のフレームが終了し、次のフレームが処理されることを遅延ピクセルシェーディングユニット310に示す、又は、4)デバイスドライバ122若しくはアプリケーション126によって設定されたプログラム可能なフラッシュ条件を含む任意の理由のためにフラッシュが実行されることを示す任意の他のイベントを含む。
【0049】
上記の方法600は、スクリーンピクセル毎に単一のフラグメントが存在するか、スクリーンピクセル毎に複数のフラグメントが存在する状況においてフラグメントを処理するために使用することができる。さらに、ステップ604に関連して特定の「深度モデル」(より小さい深度値が、より大きい深度値よりもカメラに近いフラグメントを示す)が説明されているが、他の深度モデルが代わりに使用されてもよい。
【0050】
図7は、一例による、後に受信したフラグメントによって隠されるフラグメントを破棄する例示的な処理を示す図である。
図7は、第1入力プリミティブ702(1)が、第2入力プリミティブ702(2)が遅延ピクセルシェーディングユニット310に入力される前に、遅延ピクセルシェーディングユニット310に入力されることを示している。第1入力プリミティブ702(1)は、クワッド0~9(ここで、0~9の各々は、「クワッド識別子」と呼ばれる)を含み、各クワッドにはスクリーン位置x及びyの値が示されている。第2入力プリミティブ702(2)は、クワッド10~19(ここで、10~19の各々は、「クワッド識別子」と呼ばれる)を有し、同様にスクリーン位置x及びyの値が示されている。より具体的には、第1入力プリミティブ702(1)は、位置0,0のクワッド0と、位置1,0のクワッド1と、位置2,0のクワッド2と、位置3,0のクワッド3と、位置0,1のクワッド4と、位置1,1のクワッド5と、位置2,1のクワッド6と、位置0,2のクワッド7と、位置1,2のクワッド8と、位置0,2のクワッド9と、を有する。第2入力プリミティブ702(2)は、位置0,0のクワッド10と、位置1,0のクワッド11と、位置2,0のクワッド12と、位置3,0のクワッド13と、位置1,1のクワッド14と、位置2,1のクワッド15と、位置3,1のクワッド16と、位置2,2のクワッド17と、位置3,2のクワッド18と、位置3,3のクワッド19と、を有する。各クワッドのカバレッジが視覚的に示されている。クワッド内のカバーされたピクセルが特定のハッチングで示されており、カバーされていないピクセルはハッチングされていない。例えば、クワッド3では、左上のピクセル、右上のピクセル及び左下のピクセルにカバレッジが存在するが、右下のピクセルにはカバレッジが存在しない。カバレッジマスクと、遅延ピクセルシェーディングユニット310の処理との間の相互作用を示すために、個々のフラグメントではなくクワッドが
図7に示されている。
【0051】
先入れ先出し(FIFO)バッファ状態706は、FIFOバッファ(20個のボックスの行として示され、各ボックスは、異なるFIFOバッファエントリに対応する)の状態と、遅延ピクセルシェーディングユニット310にてクワッドを受信したときにFIFOバッファがどのように変化するかと、を示している。FIFOバッファは、Zカリングユニット308から受信したクワッドに関するデータを記憶するFIFOエントリを含む。FIFOバッファの目的は、入力クワッドのスクリーン位置を、FIFOバッファに記憶された古いクワッドのスクリーン位置に対してチェックして、古いクワッド又はその一部を、新たなクワッドによって隠されたために破棄すべきかどうかを判別可能にすることである。上述したように、Zカリングユニット308は、後に処理されたフラグメントが先に処理されたフラグメントによって隠されないことを保証する。したがって、後に処理されたフラグメントは、先に処理されたフラグメントと同じスクリーン位置に存在する場合に、先に処理されたフラグメントを隠し、これにより、先に処理されたフラグメントが破棄される。
【0052】
遅延ピクセルシェーディングユニット310は、新たなクワッドを受信する毎に、当該クワッドのスクリーン位置を、FIFOバッファ内の全てのクワッドのスクリーン位置に対してチェックする。一致が生じない場合(FIFOバッファ内のクワッドのスクリーン位置が、受信したクワッドのスクリーン位置と同じである場合に、一致が生じる)、遅延ピクセルシェーディングユニット310は、FIFOバッファ内に既に記憶されたクワッドに対して変更を加えない。一致が生じて、カバーされた少なくとも1つのフラグメントであって、FIFOバッファ内の一致クワッドのカバーされたフラグメントに重なるフラグメントを新たなクワッドが有する場合、遅延ピクセルシェーディングユニット310は、FIFOバッファを更新して、入力クワッドの少なくとも1つのフラグメントによって重ねられたFIFOバッファ内のフラグメントを排除する。一致が生じるかどうかに関わらず、遅延ピクセルシェーディングユニット310は、クワッドを1つ分下に(
図7において右方向に)シフトし、「最新エントリ」に対応するFIFOバッファの端(
図7のFIFOバッファの左端)において新たなクワッドをFIFOバッファ内に記憶する。
【0053】
第1FIFOバッファ状態706(1)は、第1入力プリミティブ702(1)のクワッド0を受信した後のFIFOバッファの状態を示す。第2FIFOバッファ状態706(2)は、第1入力プリミティブ702(1)のクワッド1を受信した後のFIFOバッファの状態を示す。先に進むと、第3FIFOバッファ状態706(3)は、FIFOバッファ内の第1入力プリミティブ702(1)の全てのクワッドを示す。第1入力プリミティブ702(1)の全てのクワッドがFIFOバッファに入力された後、遅延ピクセルシェーディングユニット310は、第2入力プリミティブ702(2)のクワッドを処理する。第2入力プリミティブ702(2)のクワッドが第1入力プリミティブ702(1)のクワッドの後に処理されるという事実は、スキャンコンバータ306がこの順序でクワッドを出力するという事実による。この特定の順序付けは、スキャンコンバータ306が、最初に第1入力プリミティブ702(1)を処理し、次いで第2入力プリミティブ702(2)を処理し、これにより、第1入力プリミティブ702(1)のクワッドを、第2入力プリミティブ702(2)のクワッドの前に遅延ピクセルシェーディングユニット310に送信するという事実の結果であってもよい。Zカリングは、ラスタライズの後に実行されるが、遅延ピクセルシェーディングユニット310の処理の前に行われるので、後に受信したプリミティブ(第2入力プリミティブ702(2))の各フラグメントは、先に受信したプリミティブ(第1入力プリミティブ702(1))の何れのフラグメントによっても隠されないことが保証される。
【0054】
第3FIFOバッファ状態706(3)の後、遅延ピクセルシェーディングユニット310は、クワッド10を受信し、クワッド10を、FIFOバッファ内のクワッドに対してチェックする。遅延ピクセルシェーディングユニット310は、クワッド0がクワッド10と同じスクリーン位置を有すると判別する。この競合は、第4FIFOバッファ状態706(4)のクワッド0の周囲の太線の矩形で示されている。この状況において、遅延ピクセルシェーディングユニット310は、FIFOバッファ内の古い競合クワッドを変更又は排除するが、当該競合クワッドは、クワッド0である。変更又は排除は、重なるカバレッジが新旧の競合クワッドに存在する程度に基づいている。より具体的には、新たなクワッドが、FIFOバッファ内の既存のクワッドと同じスクリーン位置を有する場合、遅延ピクセルシェーディングユニット310は、新たなクワッドのカバレッジと古いクワッドのカバレッジとの間の重複の程度を決定する。部分的に重なる場合、新たなクワッドによって重ねられた古いクワッドの一部がFIFOバッファから除去されるように、古いクワッドが更新される。部分的な重複は、古いクワッドが、新たなクワッドによってカバーされるクワッドの全てではなく少なくとも一部をカバーしていることを意味する。完全に重複する場合、遅延ピクセルシェーディングユニット310は、古いクワッドをFIFOバッファから除去する。完全な重複は、古いクワッドが新たなクワッドによって完全にカバーされていることを意味する(すなわち、古いクワッドでカバーされているものとして示されたクワッドの全ての部分が新たなクワッドによってカバーされている)。重複がない場合、遅延ピクセルシェーディングユニット310は、FIFOバッファ内の古いクワッドに対して変更を加えない。重複がないことは、古いクワッドでカバーされているものとして示されたクワッドの何れの部分も、新たなクワッドでカバーされていないことを意味する。
【0055】
クワッド10は、クワッド0と同じスクリーン位置に存在する。しかしながら、クワッド0は、そのスクリーン位置の領域全体をカバーするのに対し、クワッド10は、右上部分をカバーするのみである。この状況では、遅延ピクセルシェーディングユニット310は、クワッド0がクワッド10によって部分的に重ねられていると判別し、これにより、FIFOバッファ内のクワッド0を変更して、重ねられた部分を除去する。したがって、状態706(5)において、クワッド0は、除去された右上部分ではなく左下部分のみを含むものとして示されている。
【0056】
また、状態706(5)では、遅延ピクセルシェーディングユニット310は、クワッド11が、FIFOバッファ内の別のクワッド(すなわち、クワッド1)と同じスクリーン位置を有する(両方のクワッドは、スクリーン位置1,0を有する)と判別する。これに応じて、遅延ピクセルシェーディングユニット310は、クワッド1の何れの部分がクワッド11によってカバーされているかを判別する。クワッド11がクワッド1と完全に重なっているので、遅延ピクセルシェーディングユニット310は、FIFOバッファからクワッド1を除去する。したがって、状態706(6)では、クワッド1は、カバレッジを有しないものとして示されている。これは、クワッド1が「空の」クワッドであり、ピクセルシェーダ312に転送されないことを示している。図示した例示的な実施形態では、空のクワッドによって占有されたスロットを解放する代わりに、空のクワッドがFIFOバッファ内に保持されるが、代替的な実施形態では、スロットを解放することができ、空でないクワッドを解放されたスロットにシフトすることができる。状態706(6)では、遅延ピクセルシェーディングユニット310は、クワッド12がクワッド2に完全に重なると判別することによって、クワッド2をFIFOバッファから除去する。
【0057】
先に進むと、FIFOバッファ状態706(7)は、入力プリミティブ702(1)及び入力プリミティブ702(2)のクワッドを処理した後のFIFOバッファを示している。後続のクワッド10によって部分的に重ねられたクワッド0は、重ねられていない残りの部分のみを有する。クワッド1,2,3は、クワッド11,12,13によって完全に重ねられ、これにより、FIFOバッファから除去される。クワッド4は、図示した後続のクワッドによってカバーされず、これにより、FIFOバッファ内に残される。クワッド5は、クワッド14によって部分的に重ねられ、これにより、重ねられていない部分のみがFIFOバッファ内に残される。クワッド6は、クワッド15によって完全に重ねられ、これにより、FIFOバッファから除去される。クワッド7,8,9は、後のクワッドによって重ねられず、これにより、FIFOバッファ内で変更されない。同様に、入力プリミティブ702(2)の全てのクワッドは、他のクワッドによって重ねられず、これにより、FIFOバッファ内で変更されない。
【0058】
FIFOバッファの内容は、処理のためにパイプラインの残りの部分に送信され、フレームバッファ316内で出力プリミティブ704(1)及び出力プリミティブ704(2)を生成する(出力プリミティブ704(1)又は出力プリミティブ704(2)に重なる後続のプリミティブが処理されないと仮定する)。出力プリミティブ704(1)は、図示したように、出力プリミティブ704(2)によってクリップされる。ピクセルシェーダ312は、プリミティブのクリップ部分を処理しない。この理由は、これらのクリップ部分が、ピクセルシェーダ312に送信される前にFIFOバッファから除去されるためである。
【0059】
上記の説明は、ピクセル毎に1つのサンプルが存在する例である。しかしながら、上記の技術は、各ピクセルが複数のサンプルを有する状況でも適用することができる。
【0060】
上記の技術に対する1つの変形例は、これらのフラグメントを削除する代わりに、フラグメントを重複しているものとしてマークすることを含む。より具体的には、入力クワッドとFIFOバッファ内のクワッドとの間で一致が生じ、遅延ピクセルシェーディングユニット310が、これら2つのクワッド間のカバレッジが重複していると判別した場合、遅延ピクセルシェーディングユニット310は、両方のクワッドの重複フラグメントを重複しているものとしてマークする。ピクセルシェーダ312は、その後、この重複情報を使用して、古い重複フラグメントを新たな重複フラグメントの前に確実に処理する。ピクセルシェーダ312は、バリア処理を利用して、古いフラグメントが処理された後、新たな重複フラグメントが処理される前に、ピクセルシェーダ312内の処理を待機させることができる。透過性がオンになっている場合に、この「マーキング」処理モードを利用することができる。透過性をオンにすると、別のフラグメントと重複するフラグメントは、単に当該フラグメントを上書きするのではなく、ブレンド処理で当該フラグメントとブレンドすることができる。このような状況では、FIFOバッファ内の最も古いマッチングフラグメントを除去するのではなく、FIFOバッファ内で一致する各フラグメントが重複しているものとしてマークされる。透過性がオンになった場合の他の1つの代替例は、FIFOバッファをバイパスすることである。このような状況では、遅延ピクセルシェーディングユニット310は、効率的にオフに切り替えられ又はバイパスされる。フラグメントはFIFOバッファに記憶されず、FIFOバッファ内に記憶されたフラグメントと入力フラグメントとが一致するかどうかを判別するためのチェックが行われない。
【0061】
FIFOバッファは、クワッドに対応するエントリを記憶するものとして
図7に示されているが、エントリは、その代わりに、個々のピクセル又は2×2よりも大きいピクセルのグループに対応してもよい。個々のピクセルに対応するエントリの場合には、入力ピクセルとFIFOバッファ内のピクセルとの間でスクリーン位置の一致が生じた場合に、カバレッジがチェックされない。代わりに、このような一致が生じた場合、エントリは、単にFIFOから削除される。個々のFIFOバッファエントリが2×2よりも大きいピクセルのグループに対応する場合には、カバレッジチェックは、より細かい粒度で実行されることを除いて、上記の説明と同様の方法で実行される。
【0062】
APD116は、並列に処理する複数の異なるFIFOバッファを含んでもよく、各バッファは、スクリーン空間の異なる部分に割り当てられていてもよい。グラフィックス処理パイプライン134内の様々なユニットによって処理され出力されるフラグメントのシーケンスは、本明細書において「ストリーム」と呼ばれる場合がある。
【0063】
ビン処理が実行されるという事実により、FIFOバッファを比較的小さいサイズにすることができ、及び/又は、FIFOバッファのヒット率が向上する。より具体的には、FIFOバッファは、特定のビンの全てのフラグメントを受信した後に空にされるので、任意の特定の時点で特定のビンに含まれるフラグメントのみを記憶すると考えられる。したがって、任意のスクリーン位置のフラグメントをFIFOバッファに記憶することが可能な場合と比較して、FIFOバッファにおいて「ヒット」する可能性が高くなる。このようにヒット率が向上することによって、隠されたフラグメントが除去される割合が高まり、ピクセルシェーダ312によって実行される不必要な作業量を低減させる。
【0064】
ピクセルシェーダによる処理のためにフラグメントのストリームの重複フラグメントを識別する方法が提供される。方法は、Zカリングされたフラグメントのストリームから、第1スクリーン位置を有する第1フラグメントを受信することを含む。方法は、フラグメントを記憶する遅延ピクセルシェーディングバッファにおいて、第1スクリーン位置と一致する第2スクリーン位置を有する第2フラグメントを識別することを含む。方法は、識別したことに応じて、一致に基づいて遅延ピクセルシェーディングバッファを変更することを含む。方法は、遅延ピクセルシェーディングバッファのフラグメントを、シェーディングのためにピクセルシェーダに送信することを含む。
【0065】
アクセラレーテッド処理デバイスも提供される。アクセラレーテッド処理デバイスは、フラグメントのセットのフラグメントをZカリングして、Zカリングされたフラグメントのストリームを生成するように構成されたZカリングユニットを含む。また、アクセラレーテッド処理デバイスは、ピクセルシェーダに提供されたフラグメントに対してピクセルシェーディング処理を実行するように構成されたピクセルシェーダを含む。アクセラレーテッド処理デバイスは、遅延ピクセルシェーディングユニットを含む。遅延ピクセルシェーディングユニットは、Zカリングされたフラグメントのストリームから、第1スクリーン位置を有する第1フラグメントを受信するように構成されている。遅延ピクセルシェーディングユニットは、フラグメントを記憶する遅延ピクセルシェーディングバッファにおいて、第1スクリーン位置と一致する第2スクリーン位置を有する第2フラグメントを識別するように構成されている。遅延ピクセルシェーディングユニットは、識別したことに応じて、一致に基づいて遅延ピクセルシェーディングバッファを変更するように構成されている。遅延ピクセルシェーディングユニットは、遅延ピクセルシェーディングバッファのフラグメントを、シェーディングのためにピクセルシェーダに送信するように構成されている。
【0066】
プロセッサによって実行されると、ピクセルシェーダによる処理のためにフラグメントのストリームの重複フラグメントを識別する方法をプロセッサに実行させる命令を記憶する非一時的なコンピュータ可読記憶媒体が提供される。方法は、Zカリングされたフラグメントのストリームから、第1スクリーン位置を有する第1フラグメントを受信することを含む。方法は、フラグメントを記憶する遅延ピクセルシェーディングバッファにおいて、第1スクリーン位置と一致する第2スクリーン位置を有する第2フラグメントを識別することを含む。方法は、識別したことに応じて、一致に基づいて遅延ピクセルシェーディングバッファを変更することを含む。方法は、遅延ピクセルシェーディングバッファのフラグメントを、シェーディングのためにピクセルシェーダに送信することを含む。
【0067】
本明細書の開示に基づいて多くの変形が可能であることを理解されたい。機能及び要素は、特定の複合で上記に説明されているが、各機能又は要素は、他の機能や要素なしに単独で使用されてもよいし、他の機能や要素を伴って若しくは伴わずに様々な複合で使用されてもよい。
【0068】
提供された方法は、汎用コンピュータ、プロセッサ又はプロセッサコアにおいて実施されてもよい。適切なプロセッサには、例として、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタル信号プロセッサ(DSP)、複数のマイクロプロセッサ、DSPコアに関連する1つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)回路、任意の他のタイプの集積回路(IC)、及び/又は、ステートマシンが含まれる。このようなプロセッサは、処理されたハードウェア記述言語(HDL)命令、及び、ネットリストを含む他の中間データ(このような命令はコンピュータ可読媒体に記憶され得る)の結果を使用して製造プロセスを構成することによって製造されてもよい。このような処理の結果は、本実施形態の態様を実施するプロセッサを製造するために半導体製造プロセスにおいて使用されるマスクワークであってもよい。
【0069】
本明細書で提供される方法又はフローチャートは、汎用コンピュータ若しくはプロセッサによる実行のために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア、ファームウェアにおいて実施されてもよい。非一時的なコンピュータ可読記憶媒体の例には、読み出し専用メモリ(ROM)、ランダムアクセスメモリ(RAM)、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク及びリムーバブルディスク等の磁気媒体、光磁気媒体、光学媒体(CD-ROMディスク等)、デジタル多用途ディスク(DVD)等が含まれる。