グラフィックオペレーションのための高レベルプログラムインターフェース
【課題】イメージ処理のツールにプログラマが容易にアクセスできることや、グラフィック計算が効率的であることの重要性が常に高まっている。OpenGL(登録商標)とプログラム可能GPUの組み合わせは、グラフィックプログラムが可能であることについて広範な進歩を遂げたが、更に高レベルのインターフェースを実現する。
【解決手段】フィルタとイメージとの間の関係を定義することによって、イメージを生成するためのAPI及び技術を含み、このような関係は、要求しているアプリケーションとグラフィックサービス資源との間の協働セッションによってプログラム的にオブジェクトで組み立てられる。本システムはまた、プログラム的に組み立てられたオブジェクトの最適化とマルチプロセッサ環境でのレンダリングのための技術とに関する態様を含む。
【解決手段】フィルタとイメージとの間の関係を定義することによって、イメージを生成するためのAPI及び技術を含み、このような関係は、要求しているアプリケーションとグラフィックサービス資源との間の協働セッションによってプログラム的にオブジェクトで組み立てられる。本システムはまた、プログラム的に組み立てられたオブジェクトの最適化とマルチプロセッサ環境でのレンダリングのための技術とに関する態様を含む。
【発明の詳細な説明】
【技術分野】
【0001】
ここ数年にわたって、全ての種類のハードウェアにおいてグラフィックサブシステムが重要となる需要が増えてきた。例えば、汎用コンピュータ関連分野において、プレゼンテーションソフトウェアのような従来からの日常的なプログラムでさえ、より高速でより複雑な図形処理機能を必要とするアニメーションや他のツールが含まれている。更に、ビデオ、写真編集、ゲームのような従来のグラフィック性が強いアプリケーションは、適用範囲とグラフィック強度の両方で成長しつつある。更に、ゲームやグラフィック専用演算処理のような垂直システム(例えば、任天堂ゲームキューブなど)では、グラフィックの優位性に関して、汎用コンピューティングアーキテクチャとの高速駆動の競争が加速してきた。
【背景技術】
【0002】
これと同じ期間に、ハードウェア製造業者は、増大する一方の容量を備えた専用グラフィックプロセッサに関して高まる需要を満たし、これを越えようと努めてきた。現在では、プログラム可能な幾つかの市販されているグラフィックス・プロセッシング・ユニット(GPU)がある。プログラム可能GPUや非プログラム可能GPUの両方がグラフィック計算において高速化をもたらすが、プログラム可能GPUは、高い柔軟性を提供する点で異なっている。例えば、プログラム可能GPU以前には、アプリケーションプログラマは、より興味深いグラフィックをレンダリングするためにCPU時間を消費するか、又は理想的ではないグラフィックを表示する代償として全体のアプリケーション性能を向上させるためにGPUを使用するか、そのいずれかを判断していた。プログラム可能GPUは、従来のGPUの速度上の利点とかなりの程度の柔軟性とを組み合わせたものである。実際の問題として、プログラム可能であることは、システムマイクロプロセッサに類似する方法でプログラムがグラフィックチップを利用可能となるので重要な利点である。このようにGPUを使用することによって、本システムは、システムCPUをロードすることなく事実上無限のグラフィックエフェクトを生成することができる。
【0003】
プログラム可能GPUは、一般的にフラグメントプログラムと呼ばれるプログラムを実行する。「フラグメント」プログラムという名称は、動作しているデータの単位が一般に画素−すなわちイメージのフラグメントであることに由来する。GPUは、同時に幾つかの画素上でフラグメントプログラムを実行し、一般的には常駐するバッファの名称で呼ばれる結果をもたらす。GPUは、画素の集合に類似した一般にテクスチャと呼ばれるデータ入力を使用する。
【0004】
また、GPUが企図され開発された同じ期間中に、グラフィック専用ハードウェアの使用を求めるアプリケーションプログラムのために幾つかのプログラミングインターフェースを提供する取り組みが進行していた。1つのこのような取り組みは、OpenGLとして一般に知られている。OpenGLの目標は、ハードウェアに依存せずにプログラマがグラフィック機能を利用しやすくすることである。このようにすることで、OpenGLは状態機械のように動作する。特に、OpenGLライブラリを使用するプログラムは、現カラー、ライティング、ブレンドなどのステート(状態)を設定しなければならない。プログラムが実行されると、結果として生じるコンテキストは、プログラムされたものに依存する組合せなどの状態と入力テクスチャとの組合せとなる。状態機械型のオペレーションの場合、オペレーションの結果は、必ずしも容易に予測できるとは限らない。
【0005】
コンピュータが視覚的に更にリッチなコンテンツに移行するにつれて、イメージ処理はより重要になっている。その結果、これらのツールにプログラマが容易にアクセスできることや、グラフィック計算が効率的であることの重要性が常に高まっている。OpenGLとプログラム可能GPUの組み合わせは、グラフィックプログラムが可能であることについて広範な進歩を遂げたが、依然としてグラフィックサブシステムへのより高レベルのインターフェースに対する必要性がある。この必要性は、イメージ処理(例えば、PhotoShop、AfterEffects、又は類似のソフトウェア)に直接関連するアプリケーションにおいて高まっている。これらのアプリケーションやその他においては、そのインフラストラクチャを利用するアプリケーションからグラフィックハードウェアの複雑さを隠す抽象レイヤを有することが望ましい。更に、オペレーティングシステムは、全てのアプリケーションに対してこのような抽象レイヤを提示することによって全体的にリッチなユーザーグラフィック体験を容易にすることを求める可能性がある。
【0006】
このようなインターフェースは、プログラマ又はプログラムが所与のイメージにフィルタ又はエフェクトを簡単に適用できるようにする必要がある。より高いレベルのAPIに対する暗黙的な必要性は、高速と効率の両方の方法でそのAPIを実装する必要性である。効率的であるためには、システムは、理解が容易で且つ動作が容易な方法でグラフィックプログラミングを概念化するメカニズムを有する必要がある。更に、このようなシステムは、CPUとGPUとの間で作業を効率的に分担しながら同時にメモリの使用と計算時間を最小にしなければならない。最終的には、デュアルプロセッサシステム(GPUとCPU)のために構築されたプログラムがCPUだけを有するレガシーシステム上で実行することができるように、単一のプロセッサ上でエミュレートできるシステムを有することが望ましい。
【発明の概要】
【0007】
他の利点の中でも、本発明は、上述の問題を解決し、上述の必要性と要求を満たそうとするものである。これを行う場合、本発明の幾つかの実施態様は、グラフィックオペレーション、或いは二次的なプロセッサ資源を利用できる潜在的な他のオペレーションのための高レベルプログラムインターフェースを含む。このタイプの更に特定の実施態様において、高レベルプログラムインターフェースは、ユーザー又はシステム内のプログラムが呼び出すことができるグラフィックフィルタリング機能を含む。プログラム又はユーザーは、エフェクトを生成することによって、或いは事前に定義されたリストからフィルタ機能を指定することによって高レベルプログラムインターフェースを利用する。別の実施態様において、プログラマ又はプログラムは、フィルタを事前に定義されたリストに加えるために拡張可能なインフラストラクチャへアクセスすることができる。
【0008】
本発明の1つの一般的な実施態様において、ソフトウェアは、イメージタスクのグラフ状記述を構成するためにシステム内の選択されたプロセッサを利用する。グラフ状記述は、イメージのノードやリンク表示であり、ここでノードはオペレータを表し、リンクは、中間段階の結果と中間段階の結果を保持するのに必要な記憶装置を表す。詳細には、グラフ状記述のノードは、別のプロセッサ上の全体的なイメージオペレーションの一部分を計算するためのスレッド又はプログラムを最終的に含むことができる。更に、全体的なイメージタスクのグラフ状記述を有することで、最適化コンパイラの使用は全体的なイメージタスクに対して必要な資源を低減させることができる。このコンパイリング機能は、ノードプログラムがコンパイラを実行するプロセッサ以外のプロセッサ上で一般的に実行するので特に有用である。
【0009】
前述の一般的な実施態様は、単一のCPUと単一のGPUとの一時的なペアのコンテキストで説明することができる。この実施態様は、全体的なイメージタスクを評価し、そのグラフ状記述を構成するためにCPU上で実行するソフトウェアを提案する。これは、上述されたような関連づけを備えたノードやリンクのツリーグラフとして視覚的に表現することができる。ノード−プログラムがGPU上で実行できるので、プログラムの構成は、GPUのプロパティを考慮する。とりわけ一般的な意味では、プログラム可能GPUは幾つかの並列実行ストリームを操作し、そのためノードプログラムは並行処理可能言語で表すことができる。例えば、ノードプログラムはGPUフラグメントプログラムとすることができる。全体的なイメージタスクを表すグラフの構成後、グラフは、CPU上で実行されるコンパイラによって最適化することができる。或いは、グラフは、該グラフが作成されるときに別の部分においてコンパイラによって最適化することができる。最適化の目的は、メモリ使用量やCPU又はGPU時間を最小にすること、或いはイメージが計算されるときの効率を高めることである。
【0010】
本発明の種々の実施態様によると、最適化は、多くの機能的特性を有する。例えば最適化は、中間段階の結果をキャッシュする段階、複数のフラグメントプログラムを1つに統合する段階、閉じこめられた定義ドメインや関心領域内のエリアにメモリと計算を制限する段階、又はプロセッサ間での計算の分割を最適化する段階を含む。
【0011】
最新のグラフィックコンテキストにこれらの技術を適用することは、非常に効率的であり、これによって開発者はコンパイラが占めるシステム内の特定のハードウェアを考慮することなく、1つ又は複数の素子(例えば画素)で実行されるオペレーションを表現することによってフィルタを記述することができる。更に、マルチプロセッサシステム内に装備するためのAPIや効率的な処理インフラストラクチャを作成したことで、多くの実施態様はまた、シングルプロセッサシステム上のAPIを利用する機能を含む。ごく一般的な意味で、これはエミュレーションによって達成される。
【図面の簡単な説明】
【0012】
【図1】サンプルハードウェア構成を示す図である。
【図2(a)】ハードウェア構成のサンプルを示す図である。
【図2(b)】ハードウェア構成のサンプルを示す図である。
【図3】ソフトウェアスタックの説明図である。
【図4】グラフを示す図である。
【図5】グラフ及びサンプルプログラムステップを示す図である。
【図6】グラフを示す図である。
【図7】イメージ生成のための例示的なフローチャートを示す図である。
【図8】ノード結合のための例示的なフローチャートを示す図である。
【図9】ノード結合のための例示的なフローチャートを示す図である。
【図10】ノード結合のための例示的なフローチャートを示す図である。
【図11】グラフを示す図(a)とグラフ最適化のための例示的なフローチャートを示す図(b)である。
【図12】グラフ最適化のための例示的なフローチャートを示す図である。
【図13】最適化のための例示的なフローチャートを示す図である。
【図14】グラフ最適化のための例示的なフローチャートを示す図である。
【図15(a)】複数のエフェクトを加えるために複数のプロセッサを使用する段階を示す図である。
【図15(b)】複数のエフェクトを加えるために複数のプロセッサを使用する段階を示す図である。
【図15(c)】複数のエフェクトを加えるために複数のプロセッサを使用する段階を示す図である。
【図16】最適化のための例示的なフローチャートを示す図である。
【図17】多角形分割の実施例を示す図である。
【発明を実施するための形態】
【0013】
A.技術及び用語
1.技術
本明細書で説明される本発明の実施形態は、特に種々のタイプのプロセッサが1つのシステム内で利用される、全てのタイプのマルチプロセッサコンピューティングシステムに関連し、用途を有する。本明細書での説明のほとんどは、CPU資源やGPU資源を有する一般的なコンピューティング構成に焦点を絞っている。この説明は、例証のためのものであり、GPUなし、複数のCPUと1つのGPU、複数のGPUと1つのCPU、或いは複数のGPUと複数のCPUのいずれかを有する他のシステムに対して本発明の適用を制限するものではない。この注意に関して、発明者らは典型的なハードウェアとソフトウェア動作環境に関する情報を提供するものとする。
【0014】
図1を参照すると、一般的なハードウェアコンピューティング構成が示されている。極めて一般的であるが、マイクロプロセッサ11は、チップセットサポート集積回路13、17に結合されている。マイクロプロセッサは、23、24、又は25のようなインテルペンティアム(登録商標)ファミリー又はIBM/モトローラパワーPCチップのうちの1つのような、いずれかのマイクロプロセッサ又はコントローラとすることができる。チップセットIC(本明細書ではノースブリッジ13、サウスブリッジ17として表現される)は、1つ又はそれ以上のICに実装することができる。チップセット13、17は一般に、バス12を介して又は現在当該技術分野で公知の直接リンクによってマイクロプロセッサに結合される。チップセット13、17が1つより多いICに実装される場合、ノースブリッジの機能(AGP、メモリ管理など)が共通バスへの接続又は前述のリンクのいずれかによるプロセッサへのより直接的な接続を有することは一般的である。サウスブリッジ機能を含む別のチップは、ノースブリッジを介して極めて一般的にマイクロプロセッサ11に結合される。しかしながら、発明者らは、現在又は将来的に存在する利用可能な他の構成を排除することを意図するものではない。可能性のあるサウスブリッジ機能は、ディスクドライブのような周辺接続機構のためのATAバス16、あらゆる種類の周辺機器の接続機構のためのPCIバス18、USBデバイスの接続機構のためのUSBコントローラ19、イーサネット(登録商標)又は場合によっては他のネットワークをサポートするためのネットワークインターフェースコントローラ110、音声サポート111を含む。更に関連するものとして、標準的なノースブリッジ機能は、メインメモリ114をサポートするメモリコントローラと、ビデオサブシステムのサポートのためのアクセラレイティッド・グラフィックス・ポート15を含む。メモリは通常、種々のタイプのダイナミックランダムアクセスメモリのいずれかであるが、代替の構成では、スタティックRAM、磁気メモリ、光メモリ、又は現在又は将来的に存在する可能性のある他のいずれか適切な記憶媒体とすることができる。AGP15は、グラフィックサブシステムがマイクロプロセッサやメインメモリなどのシステム資源に高速にアクセスするようにする、チップセット内に配置された特別なポートである。種々の新しく出てきたAGP系、及びコア資源とグラフィックサブシステムとの間の対話速度を確実に加速する他の方法が存在する。この説明は、類似の機能を実行するいずれかの特定の方法に用途を限定するものではない。最後に、図2は別のコンピューティングハードウェア構成24、25を示しており、これは24と25のマイクロプロセッサそれぞれとの緩い連係を意図するものである。
【0015】
上述のように、本明細書で開示される本発明の実施形態はソフトウェアを含む。従って、図3のレイヤ図に表されるような、一般的なコンピューティングソフトウェアアーキテクチャの説明を行う。ハードウェア実施例と同様に、これらは、どのような意味においても限定するものではなく、むしろ例証に過ぎない。これは、ソフトウェア開発者が幾分異なる方法で表す傾向にあるレイヤタイプの図に特に当てはまる。この場合、O/Sカーネルから始まるレイヤを表したので、低レベルのソフトウェア及びファームウェアは省略した。発明者らの表記は一般に、レイヤ内に示されたソフトウェア要素が、その下のレイヤからの資源を使用して、その上のレイヤにサービスすることを意味する。しかしながら実際には、特定のソフトウェア要素の全ての構成要素は、完全にその様態で動作するというわけではない場合がある。
【0016】
ソフトウェアに関する注意では、図3(a)を参照すると、レイヤ31は、高度に保護された環境でコアO/S機能を提供するO/Sカーネルである。O/Sカーネルの上には、上位のレイヤにディスクや通信アクセスのような拡張機能がサービスされるレイヤ32のO/Sコアサービスが存在する。レイヤ33は、OpenGLライブラリや類似の資源の一般的な相対的位置付けを示すようにここに挿入されている。レイヤ34は、2つのレイヤ、すなわちアプリケーションフレームワークとアプリケーションサービスとして通常表される機能の融合である。説明の目的のために、これらの両方のレイヤは、ここでは35で示される最高レイヤでの常駐によってアプリケーションプログラムの高レベルで且つ頻繁な機能サポートを提供する。アイテム3100は、「Core Imaging」、ソフトウェアスーツ、モニカの相対的位置付けを示すもものであり、これは、本発明の多くの実施形態を説明するための媒体を提供する(本発明の実施形態の一部、いずれか、又は全てを含むソフトウェアスーツを意味する場合、用語「Core Imaging」を一般的に用いることにする)。
【0017】
ここで3(b)を参照すると、アイテム101は、Core Imagingスーツの相対的な位置付けを表している。図3(b)において、図3(a)と比較すると、別のグラフィック機能−合成に対してレイヤ324が加えられたことが明らかである。合成器のジョブは、多くの実施形態において説明されるようにウィンドウイングシステムにおけるウィンドウ合成と管理を実行することである。
【0018】
2.ツリーとグラフ
数学や他の計算科学において、問題を、機械実行の計算やこのような機械のプログラミングに結び付くパーズ(構文解析)方式で表することができる。パーズ表現の実施例は、図4に示されるような一般化ツリー構造である。図4を参照すると、ツリー構造41は、最も近い従属ノードの結果を表すリンク(42、43、44、45、46、47、48、49、410、411、412、413、414)と、2つのタイプのノードとから構成される。事前に存在している計算入力(例えば、オペランド)、419、424、425、426、427、428、429を表すリーフ(葉)ノードが存在する。或いは、計算関数(例えば演算子)415、416、417、418、420、421、422、423を表す機能ノードが存在する。全体的な実施例として、図4を参照すると、リンク46は、機能ノード417への入力として役割を果たし、リーフノード424の結果(単にリーフであるリーフノードの結果)を表す。
【0019】
ここで図5を参照すると、別のツリーが、円ではなく矩形のノードを使用して示されている。しかしながら、図の表示の性質は同じであり、リーフノード51はオペランドに類似しており、機能ノード52、53、54は、演算子を表し、リンク5100、5101、5102、5103、5104は、結果を表している。
【0020】
本開示の種々の箇所では、図4、5にあるようなツリーを使用し、コンピュータシステム内で使用又は組み立てられる「グラフ」のコンテキストにおけるツリーを説明する。発明者らは一般に、描写されるグラフィックツリーをコンピュータシステムが構成又は使用することを意味するものではなく、むしろ人への例証の目的で描かれるグラフィックツリーの何らかの表示をシステムが作成、保持、又は使用することを意味するものとする。
【0021】
更に、グラフィック技術やソフトウェアを説明するコンテキストにおいては、一般にツリー(又はグラフ)を使用する。アプリケーションプログラム又はプログラマの観点から、ツリー又はグラフによって定義されるイメージは、画素のアレイによって定義されたイメージとは通常区別できない。イメージの両方のタイプは、同じ最終のオブジェクトを定義し、アプリケーションプログラムがイメージと関連付けるのがオブジェクトである。幾つかの点で、同じことがCore Imaging(又は本明細書で本発明を具現化する他のソフトウェア)の観点に関して当てはまる。従って、Core Imagingは、グラフを評価することによってイメージ計算タスクを評価することができる。その点に関して、グラフのルート(根)ノードの結果は最終結果である。図4、5を参照すると、ノード415、54は、グラフのそれぞれのルートノードである。
【0022】
本発明の実施形態及びCore Imagingの説明においては、これらの例証的なツールを引用することが多い。従って、本明細書で説明される実施形態の多くに関する前置きとして、図4を参照すると、以下の関連付けは発明者らの説明のコンテキストにおいて一般に適切であり、すなわち、(i)図示されるツリーは一般に低レベルグラフと呼ばれ;(ii)機能ノード415、416、417、418、420、421、422、423は、GPUのようなマイクロプロセッサ上で実行される「カーネル」又はフラグメントプログラムを表し;(iii)リーフノード419、424、425、426、427、428、429は一般的にイメージを表し、換言すると、画素の集合又はその表現であり;(iv)リンク42、43、44、45、46、47、48、49、410、411、412、413、414は結果を表すが、実際に生じるであろうオペレーションのコンテキストでは、これらの結果は、これらを記憶するためのバッファに通常関連付けられる。
【0023】
更に、本明細書で説明される実施形態の多くに関する前置きとして図5を参照すると、以下の関連付けは、発明者らの説明のコンテキストにおいて適切であり、すなわち:(i)図示されるツリーは、一般的に高レベルグラフと呼ばれ;リーフノード51はイメージを表し;機能ノード52、53、54は、一般に事前に定義されたフィルタである高レベルフィルタを表し;リンク5100、5101、5102、5103、5104は、フィルタの結果を表すが、低レベルのグラフとは異なり必ずしもバッファに関連付けられない。
【0024】
B.プログラマの観点からのCore Imaging API
本発明の多くの実施形態は、オブジェクト指向のプログラミングを含み、4つのタイプのオブジェクトをプログラマに利用可能にする。これらのオブジェクトタイプは、イメージ、フィルタ、コンテキスト、ベクトルである。各々については、簡潔に説明するが、その普遍性を制限しないようにする。
【0025】
イメージは、レンダリングの2次元結果(画素イメージ)又はその表現のいずれかである。高レベルのプログラムオペレーションでは、当該オブジェクトが実際の画素値になるために計算を必要とすることで、イメージを表すオブジェクトが維持される場合が多い。本発明の種々の実施形態は、イメージの定義として画素値イメージと未計算のイメージのいずれか又は両方を利用することができる。特定の意味は、コンテキスト的な使用(「コンテキスト」オブジェクトへの関連性がない)からかなり容易に得られる。一般的な意味において、フィルタに関する説明の中では、イメージは、ある関数又はフィルタへの入力として解釈される必要がある。
【0026】
フィルタは、イメージに影響を与えるのに使用される高レベルな機能である。フィルタは、この開示の最後にリストされる事前に定義されたフィルタの1つ又はそれ以上を含むことができる。フィルタは、フラグメントプログラムに類似したものとすることができ、同様にイメージに(又はより正確に一般的にはテクスチャに)影響を与えるが、一度に1つの画素だけを生成する。本発明の実施形態の多くにおいて、Core Imagingは、フィルタベースのイメージ操作をコンパイルし、このような操作を、フラグメントプログラムを使用してGPU上で行うことができるようにする。フィルタとフラグメントプログラムとの間には必ずしも1対1の対応がある訳ではない。
【0027】
コンテキストは、フィルタリングオペレーションの結果が常駐するメモリ内の定義された場所などの空間である。上記で提案されたように、イメージが入力と仮定すると、コンテキストは出力と仮定される。
【0028】
ベクトルは、浮動小数点数の集合である。本明細書で説明されるほとんどの実施形態では、ベクトルは、4つの浮動小数点数に関連付けられ、各数は、同じ固定ビット数(通常は32)を有する。グラフィックでは、ベクトルを用いて、(i)画素の外観(R(赤);G(緑);B(青)、アルファ(透明性))を記述するのに必要な4次元;又は(ii)それぞれX、Y、Z、Wの2空間、3空間、又は4空間(均一)座標を記述するのに必要な2又は3次元を表すことができる。
【0029】
C.Core ImagingとCore ImagingAPI
Core Imagingは、多くのルーチンを含み、特にグラフィック機能のために構成された高レベルプログラミング言語又はAPIとして機能するが、数値計算単独(例えば畳み込みオペレーション)などの他の機能にも適用可能なソフトウェアスーツである。いずれか1つの実施形態又は実施形態のいずれかのグループに言及するためにモニカCore Imagingを使用するが、「Core Imaging」に関するどのような特定のコメントにも本発明を限定するものではない点を想起されたい。同様に、Core Imagingとして或いはCore Imaging内でルーチン又はプロセスに言及するが、それにより、本発明が単一のユニット又はレイヤとしてこのようなソフトウェアが実装されることを意味するものではない。
【0030】
Core Imagingは、グラフィックフレームワークやグラフィック固有アプリケーションサービススーツと通信するための高レベル言語又はAPIを含む。これはまた、高レベル言語からアセンブリを生成するためのコンパイラを含む。グラフィックフレームワークと従属のソフトウェアレイヤがプラットフォーム又はハードウェアの差違を考慮することができるので、言語/APIはプラットフォームやハードウェアに依存しない。APIによりプログラマは、(1)OpenGL又は類似のインターフェースによって要求される状態と他のパラメータ、或いは(2)グラフィックレンダリングを実行するGPU又は他の資源のためのアセンブリ言語を懸念することなく、イメージにエフェクトを加えることができる。
【0031】
ソフトウェアとして概念化される場合、Core Imaging(又はAPIと関連するコンパイラの実施形態)は、一般には、アプリケーションプログラムとオペレーティングシステムとの間に位置付けられるグラフィックサービスルーチンの組として見ることができる。階レイヤソフトウェアの概念化は、様々な解釈の影響を受けるので、この説明は、Core Imagingの階レイヤ化位置(又は本発明の実施形態によるあらゆるグラフィックサービスソフトウェアスーツ)を概念化するために他の方法を排除するものではない。図3(a)、3(b)を参照すると、この注意で、グラフィックサービスソフトウェアスーツ3100と3101がそれぞれ示されている。
【0032】
これらのグラフィックサービス3100、3101の位置付けは、これらのスーツがアプリケーションフレームワーク、アプリケーションサービス、グラフィック資源の構成要素を含むことができることを意味している。要約すると、この位置付けの意図は、Core Imaging3100、3101が、レイヤ35、327のアプリケーション;レイヤ34、326の他のフレームワーク又はサービス;レイヤ33、325のOpenGLなどの資源;レイヤ24の合成器;レイヤ32、323のO/Sサービスと対話することができることを意味するものである。
【0033】
一般的な意味では、グラフィックに適用されたように、Core Imagingによってプログラマとプログラムは、(1)事前に定義された高レベルフィルタを使用する、或いは(2)API又は本発明の1つ又はそれ以上の別の実施形態を使用する一連の事前に定義されたフィルタをアセンブリする、これらのいずれかによってエフェクトを実装することができる。後者の場合、プログラマ又はプログラムは、事前に定義されたフィルタのゼロ又はそれ以上の高レベルの記述のためにCore ImagingへのAPI呼出しを行う。プログラム又はプログラマは、発明者らが高レベルグラフと呼ぶデータ構造内にその高レベル記述(又はその基準)を配置する。高レベルグラフは、新しいフィルタを作成するプログラマ又はプログラムによってアセンブリされる。高レベルグラフは、事前に定義されたフィルタと新しいフィルタで用いられるイメージとの間の関係を定義する。プログラマ又はプログラムは、その高レベルグラフの構築を完了すると、新しいフィルタを作成するためのそのタスクを効率良く完了する。すなわち、新しいフィルタを作成するのに必要な情報の全ては、高レベルグラフにおいて具現化される。
【0034】
別の実施形態では、プログラマ又はプログラムがCore Imagingと協働してグラフをアセンブリするときに、作成されたグラフは、低レベルグラフ又は相当に低レベルのグラフになる可能性がある。例えば、プログラム又はプログラマの観点からは、要求は高レベルフィルタに対して行うことができるが、Core Imagingは、低レベルフィルタ又は低レベルフィルタと高レベルフィルタ間のある中間段階のオブジェクトを作成し配信することができる。プログラム又はプログラマは実際にはオブジェクトを検査しないので、Core Imagingは、低レベルコードで高レベルコードの要求に対応することができる。このようにして、Core Imagingは、プログラムが高レベルフィルタやオブジェクトと共に機能していると考えられる限り低レベルグラフをアセンブリすることができる。
【0035】
Core Imagingは、高レベルグラフ(いずれかの適用可能な入力パラメータと共に)を最終的に最適化してコンパイルし、GPU対応プログラムを得る追加タスクを有する。コンパイリングステップは、最終イメージの使用に間に合うように実行することができる。以上をまとめると、プログラマ又はプログラムは、生成し、達成するためAPIの高レベル言語(事前に定義されたフィルタを含む)を使用したが、これは種々の他のフィルタと入力から構成される本質的に新しいフィルタである。プログラマ又はプログラムはまた、プログラムによりこのフィルタをイメージに適用することができる。本発明の種々の実施形態は、GPUとCPUとの間の作業の種々の分割を企図している。一般に、CPUはCore Imagingを実行し、GPUはCore Imagingの最終製品を実行することになる。しかしながら、ハードウェア能力及び最終的な最適化に応じて、Core Imagingは、CPUとGPUのためのタスクを生成することができる。更に、システム内にプログラム可能GPUがない場合、Core Imagingは、CPUのためのオブジェクトを生成し、イメージをコンテキストにレンダリングすることができる。
【0036】
D.Core Imaging基本機能の実施形態
ここでCore Imagingの機能を更に詳しく見てみると、1つの実施形態においてAPIは、プログラマ及び最終的にはアプリケーションプログラムのユーザーのための6つの高レベル機能、すなわち、コンテキストの作成、イメージの生成、フィルタの生成、フィルタに関連したパラメータを設定する機能(例えば、フィルタ関数の引数)、アセンブリされたフィルタ又はフィルタのグループの出力を要求する機能、イメージをコンテキストにレンダリングする機能を提供する。
【0037】
1.コンテキストの作成
コンテキストを作成する機能はメモリ内のオブジェクトの定義を可能にするツールから得られるので、一般に出力はコンテキストと呼ばれる。オペレーションの結果に対するデスティネーションが存在することができるように、このようなオブジェクトの定義が必要とされる。例えば、コンテキストは、メインメモリ内のビットマップ又はOpenGLビューに関連付けることができる。これらの関連付けられたイメージコンテナは、レンダリングのデスティネーションとして使用される。本発明は、システムのグラフィック機能に関連するビデオメモリなどのメモリを第一に企図しており、ここで説明される概念は、システム内のいずれかで見出される、或いはシステムにアクセス可能なあらゆるメモリ又は記憶装置に等しく適用される。従って限定ではないが、メモリは、ダイナミックメモリ又はスタティックメモリのような全てのタイプの半導体メモリを含むことができ、これは、特にグラフィックサブシステムに関連付けられるか、グラフィックサブシステムと共用されるか、或いはメインシステム又はメインシステムによってアクセス可能な別のサブシステムに名目上専用であるか否かに関係しない。更に、速度は確かに問題であるが、本明細書の概念は磁気又は光メモリを排除するものではない。
【0038】
コンテキストを作成する実施例としては、アプリケーションプログラムは画面に最終的に何かを表示することを意図していると仮定することができる。AppleのiPhotoアプリケーションがユーザーコマンドに応答して海岸のイメージの表示を要求しているものと仮定する。iPhotoは、コンテキストの作成を要求する関数を呼び出すことによって、Core Imaging APIを利用することができる。Core Imagingは、可能な中でも特に、作成されたコンテキストの識別のハンドルを返すことになる。ハンドルが「空コンテキスト」であると仮定する。
【0039】
2.イメージの生成
一般的に入力をイメージと呼ぶ、なぜなら、イメージ内の座標又は画素は、関連性のある値が得られるようにサンプリングすることができるからである。本発明のAPIの実施形態を使用すると、イメージを、ゼロから或いは別のイメージから生成することができる。画素値を生成するメカニズムが提供されることによりイメージがゼロから生成される。例えばイメージを色又は色の数値的な組合せ(チェッカーボード又は縞模様のページのような)として単純に定義することにより、イメージをゼロから生成することができる。より一般的には、イメージは、1つ又はそれ以上のフィルタを既存のイメージに加えることによって別のイメージから生成される。
【0040】
上記のiPhotoの実施例に続いて、iPhotoは、海岸での子供の既存のイメージを取り、フィルタ(例えば、ブラー)を子供の外側のあるエリアに加えるようグラフィックサービスに要求することによって、イメージを生成することができる。このフィルタの適用により、新しいイメージが生成される。理解を容易にするために、これは、新しい画素値の計算が完了していないのではなく、ブラーフィルタがプログラムにより加えられている未計算イメージであり、画素を計算するのに必要な他のエレメントの全てが記憶又は参照されるイメージバッファ内において常駐又は参照される。
【0041】
3.フィルタの作成
一般的にフィルタを、ゼロ又はそれ以上のイメージ(最終的には画素)上で実行できるいずれかの機能と呼ぶことにする。更に具体的に言うと、フィルタは、入力としてイメージと他のパラメータ(特定のフィルタに関連付けられ、これに依存する)を受け入れて新しいイメージを生成する機能とすることができる。APIは現在のところ、この開示内容のいずれかでリストされ説明される数十のフィルタを提供する。しかしながら、本発明の実施形態は、発明者らが継続してフィルタを開発し、その上フィルタを開発するために他の機能を提供したような拡張的な性質を求めている。本発明は、事前定義タイプのフィルタの追加を可能にする拡張性を企図しており、この説明は、ゼロ又はそれ以上の事前定義フィルタの組合せと処理によって作成された新しいフィルタに注目する。
【0042】
フィルタの作成が企図される1つの方法は、プログラマ又はプログラムが、API事前定義フィルタの1つ又はそれ以上並びにプログラマが加えることを意図した他のいずれかのアイテム又は機能を共に結び付ける本発明のAPIの実施形態を用いることによって開始する。上述のように、新しいフィルタを作成するためには、プログラム又はプログラマは、使用される全イメージと事前定義フィルタの表示とこれらのオブジェクト間の関係を含む高レベルのグラフを作成する。幾つかの実施形態において、事前定義フィルタは、基本的なグラフィック機能を可能な限り包括的にするものとし、プログラマ又はプログラムがGPUのためのアセンブリを記述する必要性又は誘因を最小にする。実際、Core Imagingの全体的な利点は、特定のグラフィックハードウェアに関係なくアプリケーションレイヤでプログラムする能力である。
【0043】
新しいフィルタが高レベルグラフによって定義されると、アプリケーションプログラム又はユーザー(CPUレベルでの)は、高レベルのグラフを実装するためにCore Imagingを呼び出す(グラフによって定義される方法でグラフにおいて参照されるイメージ上で、グラフ内で参照されるフィルタに影響を与える)。もちろん、高レベルグラフは、1つより多いイメージを取り込むように記述されるが、技術は同じである。フィルタを実装する場合、Core Imagingは、フィルタが後でリストされるフィルタ定義において規定されているようなブラーのブラー半径、幾何学的パラメータ、又は他のいずれかの入力などのフィルタ指定入力を通常は有するので、他の入力データを必要とすることがある。
【0044】
Core Imagingの重要な機能は、その後で1つ又はそれ以上のオブジェクトをアプリケーションプログラム又はユーザーに返すことである。本発明の種々の実施形態によれば、返されたオブジェクトは、GPU、CPU、又はこれらの2つのある組合せでレンダリングされ、又は計算する状態にすることができる。1つの別の実施形態において、Core Imagingは、高レベル要素のためのアプリケーションプログラム要求に応答しながら、低レベルグラフの全て又は一部を構築する。この実施形態において、アプリケーションプログラムは、Core Imagingがより低いレベルのコードを供給している間は、アプリケーションプログラムがより高いレベルのコードを要求していると考えられる(アプリケーションプログラムは、Core Imagingによって与えられたオブジェクトを解析しないので、その違いを検出できない)。或いは、好ましい実施形態において、アプリケーションがコンテキスト内のイメージを要求する場合、返されたオブジェクトは、ジャストインタイムコンパイルの準備ができた最適化された低レベルグラフとすることができる。幾つかの実施形態において、Core Imagingは、ジャストインタイムコンパイルされGPUで実行される1つだけのオブジェクトを返すことになる。このようにするために、Core Imagingは、高レベルグラフを変換(及び一般的に最適化)し、イメージをテクスチャに変換する必要がある(GPUは、計算のためにイメージではなくテクスチャを使用する)。イメージをテクスチャに変換する場合、Core ImagingはCPUを用いて最初にイメージをサンプラーに変換する。サンプラーは、イメージにその状態をプラスしたものであり、サンプラーへの変換は、(i)透過、クランプ、又は複製などのラップモード、(ii)最も近い画素全体からサブジェクト画素までの値を使用すること、或いはサブジェクト画素を囲む4つの画素の格子間を補間するなどの補間モード、(iii)回転、スケール、スキュー、平行移動、ミラーなどのアフィン変換のような状態情報を組み入れるステップを含む。次いで、サンプラーは、GPUで使用するために容易にテクスチャに変換される。入力としてのこれらの全てに関して、Core Imagingを実行するCPUは、実行時には実際の画素(上記で作成されたテクスチャによって提供される)上でフィルタを実装することになるGPUプログラムを含むオブジェクトを作成する。
【0045】
次に図5を参照し、フィルタ作成の一般的な実施例に進む。iPhotoの海岸の実施例を振り返ると、ユーザーは、iPhotoに写真の自動画質向上を要求することができる。純粋に例証の目的で、自動画質向上が以下のフィルタ作成を必要とすると仮定する。これは、現在のiPhoto画質向上機能が実際にはこのようには動作しないという点で、純粋に例証のためのものである。iPhotoは最初に、その要求のフィルタを作成する。このプロセスは、この時点ではグラフ又は画素形式とすることができる基本イメージ51を割り当てるために、Core Imagingを呼び出すことによって始める。これは、図5、高レベルグラフツリー図のステップ1で見られる。次にiPhotoは、Core Imagingを呼び出し、プログラムステップ(及び対応するツリーポジション)を追加して、カラー補正フィルタ52をイメージ51に加える。これは、図5のステップ2及び高レベルグラフツリー図で見られる。図5のステップ2の出力は、プレースホルダーCC(カラー補正された)の海岸として定義される点に留意されたい。この時点では、この中間段階の結果(CC海岸)が常に存在するかどうかは不確かであるので、バッファを割り当てずに、中間段階の結果の可能性を示す高レベルグラフ内にプレースホルダーを配置する。自動画質向上機能の強化において、iPhotoは、疑似色フィルタ53を52のフィルタリングの結果に更に加えることができる。上記のように、iPhotoは、Core Imagingを呼び出して、高レベル疑似色フィルタを取得し、マウントする高レベルグラフ(及び例証の目的の図5のツリー)にこれを挿入する。次に自動画質向上機能を完成させるために、iPhotoは、53フィルタリングの結果(FC CC海岸)をオリジナルの海岸イメージ(51)で平均化するよう選択することができ、その結果、適切なフィルタ54をCore Imagingから呼出して高レベルグラフに挿入する。これは、図5のツリーグラフとサンプルプログラムステップの両方で見られる。
【0046】
実施例において、iPhotoは今や、自動画質向上の海岸イメージの要求された結果についての高レベルグラフを有する。この実施例の実施形態によるこの結果を利用可能にするために、iPhotoは、上述のように高レベルプログラムを変換、最適化、又はコンパイルするためにCore Imagingのルーチンを順次呼び出すことができる(或いはCore Imagingは単独で動作することができる)。例証の目的において、単一の形式で表現される結果(図5に類似した)が図6に表示される。フラグメントプログラム(62、63、64)は、図5に示された自動画質向上の高レベルツリーを含む高レベル事前定義フィルタに似せる必要がないことが図6で理解される。各高レベルフィルタは、その目的を果たすために1つ又はそれ以上のフラグメントプログラムを含むことができる。更に、プログラムが最適化された場合、フラグメントプログラムを置き換え、再配置、或いは削除を行うことができる。最後に、図6に示されたGPU実装は、イメージではなくテクスチャで始まり、物理的な場所(バッファ−それ以上プレースホルダーはない)に結果を配置することによって終了することが分かる。
【0047】
4.フィルタのための設定値
上記で参照されたように、各高レベルフィルタは、上記のように作成されるか、或いは本明細書のリストで事前に定義されるかに関わらず、必要とされ且つフィルタ機能によって定義される入力値のセットを有することができる。海岸の実施例においては、一般的な入力を表すためにベクトル"パラメータ(X、Y、Z、W)としてこれらの入力パラメータを示した(図5を参照)。別の一般的でない実施例は、ブラーフィルタであり、入力パラメータとしてほぼ確実にブラーの半径が必要となる。更に他の実施例は、入力カラー、入力の強さ、入力飽和度などである。(コンテキストにおけるより多くの実施例のフィルタのリストを参照。)Core ImagingのためのAPIは、これらの入力パラメータの設定機能をプログラマ及びプログラムに必然的に提供し、イメージの予測可能な作成又は編集を可能にする。
【0048】
iPhotoの海岸の実施例を参照すると、写真のエリアにブラーを行った。正確な入力パラメータは特定のブラーフィルタに依存することになり、iPhotoは、ブラーの半径を供給する必要性が高い。
【0049】
5.フィルタの出力要求
1つの実施形態において、特定のフィルタに対するグラフが存在すると、プログラム又はプログラマは、そのフィルタを出力するためにCore Imagingを呼び出すことができる。これに応じて、Core Imagingは、ジャストインタイムコンパイル、次いでGPU上での通常の実行の準備ができたオブジェクトを作成する。高レベルフィルタのこの出力は、単に未計算の又は代表的なイメージである。別の実施形態において、Core Imagingは、この時点でグラフの最適化或いはイメージの計算のいずれかを行うことができる。最適化には処理サイクルが必要とされ、計算は処理サイクル及びメモリを用いることになるので、多くの場合、前者の最適化の実施形態が好ましい。これらの資源は通常、イメージをコンテキストにレンダリングする必要があることを確認するまで保存するのが適切である。
【0050】
一般的により好ましい実施形態(メモリとプロセッサ時間を節約する)においてiPhotoの実施例を参照すると、iPhotoは、Core Imagingを呼び出して、ジャストインタイムコンパイル及び実行の準備ができた未計算イメージを生成する。
【0051】
a.フィルタ出力を作成することに対する注意
多くのグラフィック処理エンジンと同様に、Core Imagingは、1つだけのカラー空間、例えば「ライトリニア」で動作するように構築される可能性が高い。従ってグラフを処理するために、幾つかの実施形態では、カラー空間をライトリニアに変換する必要があり、結果を返す前にカラー空間をその元のカラーに変換して戻さなければならない。幾つかの実施形態において、この変換は、高レベルグラフの入力と出力に適切なカラー変換高レベルフィルタを配置することによって、高レベルグラフ上で行われる。別の実施形態においては、これは、低レベルグラフ上で極めて類似の方式で行う。低レベルグラフの場合、カラー変換のための「カーネル」又はフラグメントプログラムノードは、グラフの入力と出力に配置される。ノードがグラフ(高又は低レベル)に配置されるほとんどの実施形態では、この状況は、そのカラー変換ノードの結果が今後極めて有用となる可能性が高いことを決定付ける。従って、カラー変換ノードの結果は、ほとんどの実施形態でキャッシュしなければならない。カラー変換のためのグラフノードを作成する代替の方法は、このような変換をCore Imagingルーチンの1つにプログラムすることである。
【0052】
6.コンテキストへイメージをレンダリング
最終的に、ほとんどのイメージはディスプレイのような視覚的用途のために生成される。従って、イメージ生成のこの実施形態における極めて一般的なステップは、イメージをある定義されたコンテキストにレンダリングする段階を呼び出すことである。ほとんどの実施形態において、Core Imagingは、この時点でグラフの最適化を実行することになる。要約すると、最適化は、以下のいずれか又は全てを含むことができ、すなわち、(1)低レベルグラフを作成する段階、ここで概念化の目的において、グラフのノードはフラグメントプログラムを表し、低レベルグラフはイメージとフラグメントプログラムとの間の関係を定義する(これは、イメージと高レベルフィルタさらにその内部関係を含む高レベルグラフと対照的である)、(2)定義ドメインに対する最適化段階、(3)関心領域に対する最適化段階、(4)フラグメントプログラムを組み合わせて、グラフのサイズ又は最終的にはその実行が必要となるメモリ空間を低減させる段階、(5)最適化された低レベルグラフの実行要件を常駐ハードウェア(GPU、CPU、メモリなど)と比較する段階である。最適化されると、低レベルグラフはコンパイルされ、1つ又はそれ以上の実行可能なオブジェクトが作成される。説明されたように、一般的にはGPUのための1つの実行可能なオブジェクトが存在するが、最適化又はコンパイル中に、複数のプロセッサを用いることを決定することができる。コンパイル後、結果として得られたオブジェクトが実行され、イメージが指定コンテキストにレンダリングされる。
【0053】
再度iPhotoの実施例を参照すると、画面上にイメージを配置するためには、iPhotoがCore Imagingを呼出し、オブジェクトを画面にレンダリングする。一般的な実施形態では、このステップは、イメージ内の関連する画素の全てに対してGPUコードを実行し、拡張写真イメージを生成する段階を含む。イメージは、画面ディスプレイと関連付けられたバッファ内に該イメージを配置することによって画面上に配置される。
【0054】
E.最適化
最適化は、タスクが実際に実行されたときに最も効率良く或いは容易に実行されるように、プログラム又はタスクを解析し変更するプロセスである。本明細書で説明されるほとんどの実施形態のコンテキストでは、1つのマイクロプロセッサを使用して別のマイクロプロセッサのためのプログラムコードを最適化するよう試みている。更に特定の実施形態において、システムCPU資源を使用して、GPU上で実行されるプログラムを最適化しようと試みている。また更に特定の実施形態において、グラフとして表されたグラフィックタスク(通常はイメージへのエフェクトの適用)を解析したCPUはグラフを最適化し、グラフがジャストインタイムコンパイルされたときにGPU上で最も効率良く実行するようにする。
【0055】
発明者らは、汎用及び特殊コンテキストの両方で最適化及びコンパイルを説明してきた。上記の開示事項の範囲を限定することなく、最適化のための4つの異なる汎用技術のいずれか1つを含む、Core Imagingの実施形態を説明する。これらの4つの汎用技術は、中間段階の結果のキャッシング、定義ドメインに対する計算と記憶の制限、関心領域に対する計算と記憶の制限、グラフを縮小又は簡略化するためのグラフ再書き込みである。
【0056】
最適化はCPUサイクル、GPUサイクル、メモリ空間のような現実世界のアイテムにおける節約を扱うので、通常は導入した最も低いレベル(ハードウェアに最も近い)の概念例証ツールに関連した最適化技術を説明することになる。そのツールが低レベルグラフである。しかしながら、これらの技術は、概念化の単一のレベルに限定されたものと見なすべきではない。実際、これらの技術を、例示的な抽象概念の高レベルと低レベル(例えば高レベルのグラフ又はコンパイルコード)での効率を適用し実現することができる。
【0057】
開示される最適化技術は、種々の順序及び、シーケンシャル技術が一度に1つのノードに或いはグラフのセクションに再帰的に加えられる混成順序で用いられる場合にでも有用であ。しかしながら、最も分かり易く説明するために、図7に示されるような論理シーケンシャル順序で技術を導入する。ここで図7を参照すると、Core Imagingは、ステップ7100でアプリケーションプログラムからグラフィックタスクを受け取る。タスクが低レベルグラフで未だ具現化されていない限り、ステップ7101において、Core Imagingは低レベルグラフを作成する必要がある。次にステップ7102で、Core Imagingは、ノード低減解析を行い、可能であればノードを除去する。不要な(又はコラプス可能な(collapsible))ノードが最適化されるとCore Imagingはステップ7103に進み、ここでバッファのサイズとイメージ入力を最終的に制限するために最適化が行われる。このステップは、定義ドメイン(「DOD」)と関心領域(「ROI」)と呼ばれる2つの領域を交差する段階を含む。ROI/DOD最適化後、グラフは、ステップ7104でコンパイルをする状態にある。最後に、全てのこの上記の作業がCPU上で実行されると、プログラムは、レンダリングのためにGPUに送られる(全体を通して説明したように、幾つかの実施形態では、グラフの一部をコンパイルして更にCPUに送ることができる。)
【0058】
上述の最適化技術を説明する場合、より深く理解するためにグラフにおけるノードの実施形態を用いることができる。低レベルグラフのノードに関して説明するが、この概念は、どのような類似の説明にも当てはまる。ここまでは、機能、フィルタ、フラグメントプログラムとしてノードを説明してきた。しかしながら、グラフの解析を行うためには、より具体的でより豊富な情報を有するノード表現が必要である。従って本発明の種々の実施形態では、要望又は必要に応じて、低レベルグラフノードは、以下の関連する情報すなわち(i)説明されているフラグメントプログラムのようなプログラム、(ii)サンプラー(状態付きイメージ)と1つ又はそれ以上のベクトル(ベクトルは浮動小数点数の集まりであることを想起されたい)を含むプログラムのための引数、(iii)ノードの出力の定義ドメイン、(iv)出力形状が与えられた場合のノードの入力形状の正確な予測をもたらすROI関数(両方の形状は、座標系、恐らくは同じグローバル座標系で定義される)を有する。
【0059】
1.中間段階の結果のキャッシング
最新のコンピューティングに内在する理由から、アプリケーションプログラムは、同一又は類似のイメージの計算を何度も要求する場合が多い。アプリケーションプログラムはまた、以前に計算されたイメージのサブセット又はスーパーセットであるイメージの計算を要求する場合が多い。この理由のために、Core Imagingは、不必要な作業をさせないためにキャッシング技術を利用する。ほとんどの実施形態において、グラフノードはキャッシュ管理のためのベースを形成する。詳細には、図5のツリーによって表されるような高レベルグラフを説明したことを想起されたい。同様に、図4や図6に示されるツリーのように概念化することができる低レベルグラフについても言及している。幾つかの実施形態において、グラフ内の各ノードは不変であり、その下のグラフの部分によって定義(すなわちノードを解くのに必要なオブジェクト及び計算)されると仮定する。このように仮定すると、発明者らはノードの結果(通常はイメージ)をキャッシュし、次いで同じノード(その下のグラフの和として定義される)が再計算される待ち行列にあるかどうかを判定することができる。ノードを再計算するのではなく、メモリから結果を単にフェッチしてもよい。種々の実施形態によれば、これは全ノードに対して行うことができる。メモリを効率的に使用するために、様々なタイミング(例えば、メモリ使用量が多い場合、又はキャッシュされた入力が古い場合、又は関連するアプリケーションプログラムがクローズした場合、又はシステムがシャットダウンした場合)でキャッシュの削除を選ぶことができる。更に、メモリを効率的に使用するために、別の記憶装置を使用することができる。ほとんどの実施形態においては、ビデオサブシステム又はGPUに割り当てられたスタティックメモリ又はダイナミックメモリが主として使用されている。しかしながら、システムメモリ、ハードドライブ、或いはシステム又は場合によってはネットワークアクセス可能な記憶装置内の他の磁気メモリなど、どのようなアクセス可能な記憶装置内にこれらのキャッシュを配置するように選択してもよい。
【0060】
種々の実施形態において、キャッシングは、最適化中(例えばCPU上で)、レンダリング中(例えばGPU上で)、又は両方のタイミングで利用することができる。
【0061】
2.グラフを低減又は簡単化するためのグラフ再書込み
本発明の幾つかの実施形態で利用される別の効率化技術は、不要なノードを削除することによってグラフを最適化することである。成功すると、これは、一般的に一時イメージ全体及びこれに応じたバッファの必要性が排除されるので、その節約において重大な意味を持つ。更に、ノードの統合又は削除は、実行中の処理サイクルを節約することになる。
【0062】
統合のために、Core Imagingは、削減することのできる隣接するノードのペアを見つけなければならない。一般的に2つのノードは、1つのノードの出力が第2のノードの入力である場合には1つに減らすことができる。例えば、ノードアルファの出力がアルファバッファとして定義され、ノードベータの入力がアルファバッファに格納されたテクスチャである場合、2つのノードは結合することができる。
【0063】
コンピューテーションサイクルの点では、2つのノードを結合できるかどうかを判定することは、比較的高コストの解析となる可能性がある。従って、2つのノードを結合できるかどうかに関する判定を行う際にその判定をキャッシュすることができる。明確にするために、幾つかの実施形態では、肯定的な結果と否定的な結果の両方をキャッシュすることで、プログラムは、キャッシュされた結合を見つけるためだけでなく、結合が不可能であるか否かを判定するためにもキャッシュを用いることができ、その結果、解析を行う時間が無駄にならないようになる。例示的な実施形態が図8に示されている。結合照会8100の実施において、第1ステップ8101で、これらのノードでの解析の結果が以前に行ったものでありキャッシュに常駐しているかどうかを判定する。従って、ステップ8101でシステムは、事前に解析された結合結果のキャッシュをチェックする。更に、説明しているルーチンは通常CPU上で実行しているので、このキャッシュは多くの実施形態においてシステムメモリを使用する。最後に、キャッシュにタグを付ける方法の実施例として、1つの実施形態において、キャッシュキーは4つのデータの要素、すなわち(1と2)2つのノードプログラムの表示、(3)従属ノードプログラムからの出力を受け取る上位ノードプログラムのテクスチャユニットインデックスの表示、(4)出力値を範囲0,1にクランプする必要があるかどうかを指定するブール値の表示を有する。
【0064】
ステップ8101に戻ると、この決定ステップで3つの可能な経路が存在する。第1に、結果をキャッシュすることができ、ノードを結合することができる。この場合、制御はステップ8103に進み、キャッシュ結果を使用して結合が行われる。次いで制御はステップ8104に進み、次のノードを見つけて解析する。第2に、結果はキャッシュされるが、ノードは結合されない。この場合、制御は次のノードステップ8104に直接進む。第3に、最終的には結果はキャッシュ内に存在しない場合がある。この場合、制御はステップ8102に進み、提案されたノードの結合が可能であるかどうかを判定する。ステップ8105で示されるように、結合が可能であるか否かに関係なく、結果はキャッシュされる(結合が不可能であるか、又は結合が可能であるかを示し、結果を記憶する)。ステップ8012で、結合が可能である場合には、ステップ8106で行われるが、実際には、幾つかの実施形態では解析中に結合を行う。結合が行われた後、制御は次のノードのための8104に進む。最後に、結合が不可能であるとステップ8102が判定した場合、制御は次のノードのためのステップ8104に進む。
【0065】
3.2つのノード結合の実施形態
図4及び図9を参照し、ノード415、420が結合できるか否かをCore Imagingが解析すると仮定する。ステップ9100で始まると、ほとんどの実施形態において、Core Imagingは、ノード415の出力がノード420の入力に事実上十分に近い場合にこれらのノードを結合しようとする。多くの実施形態において、ノード415の出力は、出力バッファが入力テクスチャの常駐する場所に存在するはずである点において、ノード420の入力と同じでなくてはならない。しかしながら、別の実施形態において、Core Imagingは、このような出力と入力から正確な結果が得られ、或いは更に別の実施形態では正確に近い結果が得られるほど十分に類似しているかどうかを評価することができる。
【0066】
決定9100に戻り、それぞれの出力と入力が十分類似していない場合、ノードはステップ9103に示されるように結合されない。しかしながら、それぞれの出力と入力が十分類似している場合には、制御はステップ9101に進み、第2ノード(この実施例ではノード420)に関連したフラグメントプログラムの各ラインをチェックする。ラインチェックについては後述するが、このプロセスのレベルでは、各ラインは、ノード415と420の結合の可能性を否定しないことを確認するためにチェックされると仮定する。更に、結合を容易にするために些少の変更が幾つかのラインで行われる。従って、ステップ9101でのラインチェックがノード結合を否定する結果をもたらす場合には、ノード415、420は、ステップ9103で示されるように結合されないことになる。或いは、ステップ9101でのラインチェックがノード結合の可能性を継続して示す場合には、制御は、ハードウェアが結合されたノードを扱うことができるか否かを判定する、決定ステップ9102に進む。一般的な意味で、これは、メモリ、いずれかのマイクロプロセッサの特性、又はシステム状態などのシステム内の何らかのハードウェア制限を意味する可能性がある。更に特定の意味において、ほとんどの実施形態は、必要なルックアップ又はレジスタが多すぎるかどうかを確認するために常駐GPUの能力のチェックだけを必要とする。明らかに、(エミュレーションが使用されない場合)常駐ハードウェアがノード415、420の結合を処理できないとステップ9102が判定した場合には、ステップ9103で示されるように結合を行うことはできない。或いは、ハードウェアが結合されたノードを扱うことができるとステップ9102が判定した場合には、制御は、一連のタスクがノードの結合を終了し始めるステップ9104に進む。
【0067】
ステップ9104で、ノードのためのプログラムコードが実際に連結される。ステップ9105で、標準的なプリコンパイラ・オプティマイザープログラムが適用される。これは、本発明の幾つかの実施形態の主題である最適化ではない。これは、容易に利用可能なプリコンパイル最適化ルーチンである。次にステップ9106で、レジスタを割り当てる命令が適用される。最後にステップ9107で、結果が今後の結合解析のためにキャッシュされる。
【0068】
この実施例を説明する場合、第2プログラムの各ラインのチェックであるステップ9101に僅かな注意しか払われていなかった。ここで図10を参照し、更に詳細にこのプロセスを調べることにする。ステップ10107で、Core Imagingは、解析のための次のプログラムラインを探す。次のラインは、第2ノード420を表すプログラムの第1ラインとすることができる。制御は決定ステップ10100に進み、ここでCore Imagingは、プログラムラインにローカル変数があるかどうかを判定する。このようなローカル変数がある場合、該ローカル変数は、第1プログラム(この実施例でノード415を表すプログラム)のローカル変数と競合しないようにリネームする必要があるので、制御はステップ10101に進む。幾つかの実施形態において、全てのローカル変数は、各フラグメントプログラムにおいてゼロから始まる連続した整数で番号が付与される。従って、第2フラグメントプログラム(ノード420を表す)のローカル変数をリネームする際に、(1)第1の新しい名前は、第1プログラムの最も大きな番号が付けられたローカル変数に単に加算することによって得られ、(2)次のローカル変数は、基本名として第1リネームローカル変数を用いて順次名前が付けられる。
【0069】
プログラムラインのローカル変数がリネームされると、制御は決定ステップ10102に進み、ここでCore Imagingがプログラムラインにおいてテクスチャ基準を捜す。リネームが必要なローカル変数がない場合には、決定ステップ10100もステップ10102に至ることは注目に値する。いずれの場合でも、決定ステップ10102でCore Imagingは、プログラムラインにおいてあらゆるテクスチャ基準を捜す。テクスチャ基準が見つからなかった場合、制御は決定ステップ10105に進む。テクスチャ基準が見つかった場合には、制御はステップ10103に進み、見つかったテクスチャ基準が第1ノード(415)の処理のプロダクトであるかどうかを調べる。見つかったテクスチャ基準が第1ノードの処理のプロダクトでない場合、制御はステップ10108に進み、必要に応じてテクスチャをリネームする。
【0070】
見つかったテクスチャが第1ノードの処理のプロダクトであると仮定すると、制御は、ステップ10103からステップ10104に進み、そのテクスチャを単一の画素に置き換える。一般的な意味では、フラグメントプログラムが入力のテクスチャ全体と出力のバッファ全体を有するときには、フラグメントプログラムは一度に1つだけの画素を処理するので、1つのテクスチャを単一の画素に置き換える。従って、Core Imagingが2つのフラグメントプログラムを結合又は連結することになる場合、これらのプログラムは、結合されたプログラムの拡張された長さ全体にわたり同じ画素を渡すために書き換える必要があり、単一の(結合又はそれ以外の)フラグメントプログラムによって生成された中間バッファは存在できない。結果として、幾つかの実施形態においてステップ10104は、サブジェクト入力テクスチャに対するどのような基準も排除し、これをオペレーション中の画素を保持するレジスタ基準と置き換える段階を含む。ステップ10104が終了した後、制御はステップ10108に進み、必要に応じてテクスチャをリネームする。
【0071】
テクスチャのリネームは、ローカル変数リネームと同じ原理とプロセスであるので、追加のコメントは実質上必要ではない。テクスチャリネームが行われた後、制御は決定ステップ10105に進む。
【0072】
決定ステップ10105では、Core Imagingは、レジスタによって識別された入力テクスチャの画素に対する何らかの基準をチェックする。このステップを詳細に説明するために、第2ノード(420)への入力テクスチャはテクスチャアルファであったと仮定する。また、テクスチャアルファは、レジスタベータの画素を優先してプログラムから書き出されたと仮定する。ステップ10105で、Core Imagingは、レジスタベータに記憶された画素ではなく、テクスチャアルファの画素に対する何らかの基準を捜している。これは、2つのフラグメントプログラムの結合がテクスチャアルファ(中間イメージ)の生成を排除することになり、更に実行時において、テクスチャアルファに対するシステムだけの基準がレジスタベータ内の単一の画素になるためである。従って、第2ノード(420)のベースにあるプログラムがレジスタベータの画素以外の画素に対する実質的な基準を有する場合には、結合が生じることはできず、ステップ10106で示されるように中止されるはずである。このような画素に対する基準が存在しない場合、プログラム制御はステップ10107に進み、次のラインに移る。
【0073】
本明細書で説明されるプログラムステップをレビューする場合、説明される機能と変更を有するコードのラインを処理するための多くの方法がある点に留意されたい。例えば、プログラムは、各ラインで一度に1つの項目を調べて特定の項目について全てのオプションにわって処理し、その後、単一のラインが終了するまで同じラインの次の項目に移ることができる。別の実施例では、プログラムは第1項目を読み取ることができ、それがローカル変数かどうかをチェックし、ローカル変数である場合これをリネームし、これがテクスチャ基準であるかどうかをチェックし、そうである場合にはこの基準が第1プログラムの出力に対するものであるかどうかをチェックし、以下同様である。重要なのは、開示された技術を考えると、熟練のプログラマであれば解析し、ラインチェックを進める方法を決定することができるということである。
【0074】
4.定義ドメインに対する計算と記憶の制限
一般的な意味では、イメージは、これらが存在する座標系以外の何れによっても境界付けられない。ほとんどの座標系では、この「境界」は有用な制限を加えない。従って、イメージを考察する場合、発明者らはその定義ドメインを考慮することができる。イメージの定義ドメインは、イメージが定義される全ての場所の表現である(すなわち名前「定義ドメイン」)。定義ドメインに関して考察する実用的な方法は、明示的に定義され且つ透明でないイメージの全ての場所の表現としてのものである。定義ドメインの1つの実施例は、全ての不透明な画素が存在する幾何学形状である。
【0075】
最適化技術を開発する場合、定義ドメイン(「DOD」)は、DODの外側の画素を計算又は描画する必要がないので魅力的である。従って、グラフを最適化する場合、ルートノード(最も高いノード、例えば図4のノード415)のDODを最初に計算する段階において用途がある。ルートノードのDODを有する場合、ノードの実質的な結果をその形状に交差させ、DODの外に常駐する実質的な結果の全ての部分をレンダリングタスクと描画タスクから除去することができる。残念ながら、ノードのDODは、必ずしも利用可能ではなく、このような場合、DODは有限とみなす必要がある。
【0076】
一般的な意味では、ルートノードのDODは、グラフの底部から上向きに伝播させることによって計算される。図4を参照すると、リーフノード424、425、426、427、428、429から始めることによってルートノード415のDODを計算する。リーフノードが既に定義されているイメージを表現するので、これらは、より低いノード(実際的な問題として、リーフノードは通常、グラフでの読み取りコマンドである)に関係なくDODを有することができる。より高レベルのノードのDODは、ノードへの入力とノードが実行する機能を使用して計算される。幾つかの実施形態の実施において、システム内の各ノードタイプは、その利用可能な入力を考慮してDODを決定するための関数呼び出しを有する(これは、ノードがその出力DODを含むことができる以前のステートメントをビューする1つの方法である)。別の実施形態において、最適化プログラムは、最適化中にDOD自体を計算する。また別の実施形態において、幾つかのノードに対するDODは最適化中に直接計算され、他のノードは、関数を呼び出すことによって間接的に計算される。例えば1つの実施形態では、簡単なノード(入力と出力の形状が同じであるノード)に対するDODを直接計算することができ、且つ難しいノード(入力と出力の形状が変わるノード)に対しては関数呼び出しを行うことができる。例証としてDODの計算を極めて要約して評価する。
【0077】
DODのこの計算は、解析されるノードのタイプに応じて僅かに異なる。例えば、ノード418の関数が単にカラー変換である場合、ノード417のDODは、リーフノード424のDODと同じになる。この同じ実施例は、入力イメージDODの形状(すなわち、範囲変更、カラー空間変換、イメージ色調)を変化させない全オペレーションに当てはまる。しかしながら、幾つかのノードは、いずれも複数の入力を有するので、或いは関数が入力ノードのDODの形状を変える(例えば、幾何学的変化)ので、計算がより複雑になる可能性がある。最初に複数のノード問題をみると、ノード417、418、419に対するDODは既に有しており、ノード416に対するDODを計算するものと仮定する。ノード416に対するDODは、入力ノードのDODの単純な関数であり、通常は入力ノードのDODの結合又は交差のいずれかである。結果のDODが、交差、結合、又は幾分複雑な関数であるかどうかはノードの関数に依存し、どのようなプログラマも評価しやすい。
【0078】
DODを計算する際、関数によって引き起こされるイメージ形状の変化は更なる検討を必要とする。これらのタイプの関数は、限定ではないが、関数の純粋なオペレーションに起因してイメージが形状を変化させるブラー(ブラー又はスケールオペレーションなど、通常ブラーはイメージをより大きくすることになる)のようなアイテムを含む。或いは、関数は、イメージを単に再配向(回転、オフセットなど)する。そのオペレーションは座標系内のロケーションを変えるだけである。いずれの場合においても、ほとんどの実施形態は、何らかの利用可能な入力に応じて出力に対するDODを呼び出す関数を要求することになる。あらゆる熟練のプログラマはこのような関数を記述することができる。
【0079】
最後に、幾つかのノードは定義されたDODを持たないことを想起されたい。このような場合、ほとんどの実施形態は、DODの値として無限を割り当てることになる。
【0080】
5.関心領域に対する計算と記憶の制限
ノードに対するDODを有する場合、次に、関連するノードの関心領域(ROI)を決定する。要約すると、関心領域は、所与の出力DODを計算するのに必要な入力イメージの部分である。従って、各ノードはその出力上にDODを有し、各入力に対するROIを有する(グラフをビューする際に、リンク毎にROIとしてこれを概念化することができる)。ROIの実施例として、「大きな矩形」である入力イメージと「小さな矩形」である出力DODを備えたブラーであるノード関数を仮定する。このブラー用のROI関数は、入力イメージ「大きな矩形」のどの部分が出力DODのブラー結果の部分を計算するのに関係するかを定義する形状を返すことになる。このROI領域を理解することの重要性は、発明者らは単に入力イメージの関連部分を記憶する必要があるに過ぎず、中間段階の結果(及び同様に最終結果の幾つか)を記憶するためのメモリが節約され、最終的に無関係とすることができる画素にエフェクトを加える処理時間が節約されることである。例えば、リンク46で発生するはずのバッファは、ノード24の出力DODとノード17のROIの交差である関連の結果を記憶することのみ必要とし、このような交差は、最適化された結果の領域である。
【0081】
DOD計算のように、幾つかの実施形態の実施において、ノードのROIを決定するために関数が使用される。またDODと同様に、幾つかのROIは、これらがノード両端のリンク上に見られる値に単に同一であるので容易に決定される。例えば、リンク45が「アルファ」のROIを有し、且つノード417がカラー変換である場合には、リンク46に対するROIもアルファであるが、ノード417がブラーである場合には、リンク46に対するROIを決定することは、より難しい(これは、アルファとは異なる可能性が高く、恐らくは小さい)。幾つかの実施形態において、ノードに関連する関数は、決定が難しいROIを解決するために呼び出される。別の実施形態において、最適化ルーチンは、最適化中にROI自体を計算する。更に別の実施形態において、幾つかのリンクに対するROIは最適化中に直接計算され、他のリンクは、関数を呼び出すことによって間接的に計算される。例えば、1つの実施形態は、易しいリンク(入力と出力形状が同じリンク)に対するROIを直接計算することができ、難しいリンク(出力形状が入力形状と異なるリンク)に対し関数呼び出しを行うことができる。例証として、ROIの計算について極めて簡潔に説明することにする。
【0082】
DOD計算と同様に、ROI計算はグラフツリーを介して伝播させる必要があるが、下のルートから上を意味する(DODのように上のリーフからではない)。Core Imagingがグラフィックタスクの実行することを求められる場合、要求エンティティが出力に対するROIを提供するので、ルートノード(例えば415)は既知であると仮定することができる。他のROIを決定するためには、単にグラフツリーから後方へ伝播するだけである。例えば、入力/リンク43に対するROIを計算するためには、結果における「既知の」ROIと415の関数とを考慮する。
【0083】
6.ROIとDODの例示的な実施形態
上記で説明されたように、アプリケーションプログラムは、Core Imaging APIを使用して高レベルグラフを構成する。これらのグラフの1つを使用するか、或いは他の手段により、アプリケーションプログラムのプログラマは、グラフィックタスクの実行をCore Imagingに依頼することができる。図11(a)を参照し、タスクは結果ROIを描画するものであると仮定する。図11(b)を参照すると、Core Imagingに対する第1タスクは、ステップ11100で低レベルグラフを作成することである。低レベルグラフ(図11(a)にツリーで示される)の作成にはより多く関わっているものがあるが、この実施例の目的においては、グローバルDOD(ルートノード116のDOD)を含む出力DODがこのステップ11100の最後のノードで計算され表現されることを認識することだけが重要である。次にステップ11101で、Core ImagingはグローバルDOD及び結果ROIの交差を求める。便宜上、これを「結果交差」と呼ぶことにする。
【0084】
次いで、Core Imagingは、決定ステップ11102に進み、調べるべき更なるノードがあるかどうか判定する。この決定11102は、熟練したプログラマには明らかである何らかの適切な方法で行うことができる。調べるべき更なるノードがない場合、プログラムは、ステップ11103でこの最適化タスクを終了し、ジャストインタイムコンパイルの準備が整う。「更にノードがあるか?」決定11102に戻り、最適化すべき更なるノードがある場合、Core Imagingは、次のノードの入力に対するROIを求める。ツリー歩行においてどれが次のノードであるかを決定するための種々の公知の方法があるので、ここではその話題については説明しない。
【0085】
図11の実施例の目的のために、ノード116(すなわちルートノード)に対する入力ROIを計算するタスクに関して、ノード116に留まり、ステップ11104に留まる。上記で説明されたように、これは、直接或いは関数を呼び出すことによって決定することができる。いずれの場合も、リンク114、115に対するROIが決定され、グラフに挿入される。
【0086】
ROIがノード116の入力に対して決定された後で、Core Imagingは、決定11102に戻り、クエリー「更にノードはあるか?」に答える。ノードがまだある場合、Core Imagingはステップ11104に進みノード115の入力ROIを決定する。ノード113がリーフノードであり入力を持たないので、ノード113についてのROI計算はない点に留意されたい。従って、入力ROIがリンク118、112に対して決定されグラフに挿入される。
【0087】
Core Imagingはステップ11102に戻り、更にノードがあるかどうかを判定し、ノードある場合には再度ステップ11104に進み、ノード114に対するROIを決定する。112はリーフノードであり、そのため計算は必要ではない点に留意されたい。111に対するROIが決定されグラフに入力される。
【0088】
制御は決定ノード11102に戻り、もはやノードがないことを判定する(ノード111はリーフである)。Core Imagingはステップ11103に進み、終了する!
【0089】
グラフはROIとDODに対して最適化されているが、ノードの統合やキャッシングのような他の最適化は、この上にレイヤを形成することができ、或いは同時に実行できる。
【0090】
7.再帰的実行の実施形態
上述のように、プログラマは、種々の順序で最適化技術の編成の効率を求めることができる。しかしながら、本発明の幾つかの実施形態は、グラフの一部分だけにわたる定義シーケンスにおける技術の1つ又はそれ以上を実施する。特に、同じ(又は類似の)プログラムシーケンスは、グラフの一部分に対し一度に1つの部分を再帰的に加えることができる。この方法は、メモリ再使用及びシーケンシャル処理(ある程度までの)に対する機会を提供することによって、効率の向上を可能にする。簡単にするために、キャッシングの概念はこれらの実施形態の説明から大部分が省かれている。しかしながら、本明細書の開示事項が与えられると、当業者であれば、キャッシングステップを実装する必要がある場合を理解するであろう。
【0091】
例証のために、図12を参照すると、結果に到達するための本発明の再帰的実行の実施形態についてのフローチャートが示されている。別の言い方をすれば、実施例の目的はルートノードを計算することである。ステップ12100で、Core Imagingは、ルートノードを隣接するノードと結合しようとする。ノードが結合できる場合、そのプロセスは、各入力リンクに沿った複数のノードをルートノードにできる限り吸収するように実行される。制御はステップ12101に進み、ここでCore Imagingは、(できる限りマージされた)ルートノードに対するDODを決定する。DODが既知である場合、制御はステップ12102に進み、ここでROIがルートノードへの子リンクについて計算される。ROIとDODを有する場合、この2つは、結果領域を決定するために交差させることができる。制御はステップ12104に進み、ルートノードの入力に対するテクスチャを作成する。これらの入力テクスチャは、ルートノードをレンダリングするために必要である。しかしながら、多くの場合ノードの入力テクスチャは未計算であり、グラフによってのみ表現される。このような場合、Core Imagingは、この実施例で説明されるステップに類似のステップを各従属ノード上で再帰的に処理しなければならない。従って、図12に示されるプロセスはネストされた方式で加え、グラフを下に移動し、ルートノードを計算するために最終的には解決する必要のあるノードを解決する。別の言い方をすると、ノードを解決するためのプロセスは、ルートノードへの入力のためのテクスチャを計算するのに必要な全ノードを制御が解決するまでネストされた方式で加えられる。ルートノード入力テクスチャが計算された後で、制御は、結果に対するバッファの作成のステップ12104に進む。最後に、制御はステップ12105に進み、ここでGPUが結果をステップ12104で作成されたバッファにレンダリングするのに使用される。
【0092】
再帰的プロセスに焦点を合わせるために、上記説明からキャッシングの概念が故意に省かれていたことを理解されたい。しかしながら、キャッシングは、ノード結果とノード結合の解析と結果を限定ではなく含む、種々の場所で利用することができる。
【0093】
更に別の再帰的に処理される実施形態が、図13にフローチャートで示されている。図13を参照すると、ステップ131は、ルートノードの計算に取り組んでいることを示している。その際に、ステップ132では、ルートノードを隣接するノードと結合することが可能かどうかを判定する。ステップ133に従って、結合が可能である場合、結合が行われ、更なる結合が可能ではないと判定されるまで継続して結合を行う(ステップ131、132、133を介して)。このような判定の後で、制御は、DODとROI最適化のステップ134、135に進む。次に、決定ステップ136は、ルートノードをレンダリングすることが可能かどうかを判定する。ルートノードへの入力の全てが計算された場合のみルートノードをレンダリングすることが可能になる。従って、決定136への答えがノーであると仮定すると、制御は、ルートノードを求めるのに必要な紛失子テクスチャ(missing child texture)を生成するタスクのためのステップ1310に進む。1310の下の次のプロセスがルートノードを求めるプロセス全体に極めて類似していることは注目すべきである。特に、サブノードとルートノードを求めるために同じルーチンが使用される。しかしながら、これらのルーチンは、グラフの複数のノードを求めるためにネストされた方式で呼び出すことができる。或いは、これらのルーチンは、一度に幾つかのノード、関係のないグラフの偶数ノードを求めるために並行して実行することができる。
【0094】
ここでステップ1311に戻り、次の子ノードを決定する必要があり、解析する次のノードを単に適切に選択する。ステップ1312、1313は、ステップ132、133に類似する。ステップ1314、1315、1316は、ステップ134、135、136に類似する。ステップ1317は、ステップ137、138に(略して)類似する。ステップ1319は、サブノードがその入力テクスチャが利用不能であるためにレンダリングできない場合、次のノード(ステップ1311)はネストされた演算処理で計算される可能性があることを示している。同様にステップ1318は、ノードが求められてレンダリングされた後にレベルをネストしていない可能性を示している。
【0095】
最終的に、ステップ1311で、求めるべき子がない場合、制御はステップ137、138に進み、ここでバッファがルートノードの結果に対して形成され、ルートノードがコンテキストにレンダリングされる。
【0096】
更に別の実施形態又は再帰的オペレーションにおいて、図4、14を参照し、図4に示されたグラフをCore Imagingによって最適化及びレンダリングしなければならないと仮定する。ルートノード415から始めて、Core ImagingはグローバルDODとのグローバルROI交差を計算することによってステップ14100で開始する。制御はステップ14101に進み、次のノードがあるかどうかを判定する。次のノードがない場合、処理はステップ14106で示されるように完了する。しかしながら、この場合、ルートノード415は次のノードである。制御はステップ14102に進み、入力リンク42上のノード415に対する入力ROIを得る。このような入力ROIを取得すると、制御は決定14103に進み、415/ROIの結果がキャッシュ内にあるかどうかを判定する。415/ROIイメージがキャッシュ内にある場合、制御は決定ブロック14101に戻り、処理すべき更なるノードがあるかどうかチェックする(その結果がキャッシュ内で見つかった場合は、システムは見つけたノードの下の全グラフを処理する必要がないことを想起されたい)。この場合において、415/ROIの結果がキャッシュ内に存在せず、制御がバッファ割り当てステップ14104に進んだと仮定する。このステップで、バッファが定義され、415入力ROIのサイズに割り当てることができる。次いで、制御は決定ステップ14105に進み、ノード(415)がこの時点でレンダリングすることができるかどうかを判定する。実際には、これは、直前で定義されたバッファにノード415をレンダリングするコマンドとすることができる。
【0097】
図4から分かるように、ノード415はルートノードであり、レンダリングする準備が整っていない。ステップ14105でYの決定を後で処理する。ノード415はレンダリングする準備ができていないので、制御はステップ14107に進み、次の隣接するノードをノード415にコラプス(collapse)されるかどうかを判定する。このステップではシステムは、ノード415を次の隣接するノードにコラプスされる(上記で詳述されたように)かどうかを判定しなければならない。本明細書の他の場所でも説明されるように、結合決定とオペレーションは第2キャッシングシステムを含み、システムは、2つのノードをコラプスされるかどうか、その場合、コラプスの結果をルックアップすることができることができる。
【0098】
ステップ14107での決定に戻り、415が隣接するノードに結合できる場合には、制御はステップ14112に進み、結合が行われる。次いで制御はノード14101に戻り、ここで解析のための次のノードが新たに作成される415。結合が不可能であることをステップ14107が判定した場合には、制御は決定ステップ14101に戻り、解析のための次のノードを決定する。幾つかの実施形態の実施において、ステップ14107での「NO」はノード415をそのまま残し、ステップ14101への戻りは、ネストされた方式で次のノード上でルーチンを実行する。ネストは無限に深く進むことができ、最終的には次のノードステップ14101でネストを解除する(一度に1つのネスト)ことによって解くことができる。
【0099】
次にステップ14101に戻り、次のノードが420であることを判定して、制御はステップ14102に進み、ノード420に対する入力ROIを検索又は計算する。ROIが決定されると、制御は決定ノード14103に進み、ここで420/ROI結合がキャッシュ内でチェックされる。キャッシュミスがあると仮定すると、制御はステップ14104に進み、バッファが割り当てられる。次いで制御は、ステップ14105に進み、レンダリングが可能であるかどうかの決定を行う(この場合も実際にはこれは、単に420をレンダリングしようとする試みとすることができる)。図4は、ノード420がレンダリングできないことを示しており、その結果、制御はステップ14107に進み、ノードのコラプスの可能性に関して判定する。判定がやはり否定であると仮定すると、制御はステップ14101(幾つかの実施形態においてはルーチンの第2ネストのためのもの)に戻る。
【0100】
14101で、次のノードはノード422であると決定される。入力ROIがステップ14102で求められ、制御はステップ14103のキャッシュチェックに進む。ここで、ノード422とその下の全てが解決され記憶されるようなキャッシュヒットを有すると仮定する。次いで制御はステップ14101に戻り、ここで次のノードはノード421になる(ノード420は、リンク49に続くツリーの小さな部分によりレンダリングできないままである)。421に関しては、入力ROIがステップ14102で求められ、決定14103でのキャッシュミスを仮定する。ステップ14104で、421ROIに対するバッファが定義され、ステップ14105で、ノード421がレンダリングすることができることが分かる(ノード427、428はツリーリーフ又は入力イメージであるので、ノード421のレンダリングを妨げない)。
【0101】
ノード421をレンダリングする能力を考慮して、制御はROI/DOD最適化のためのステップ14108に進む。ここでノード421の出力DODをノード20の入力ROIと交差させ、レンダリング中に書き込まれることになる最終のバッファのサイズを最小にする。幾つかの実施形態では、ステップ104で行われたバッファ設定を調整する。次いでノード421はコンパイラに渡され(ステップ14109)、コンパイルされた結果がレンダリングされる(ステップ14110)。レンダリングの後で(又はこのプロセスの幾つかのポイントで)、多くの実施形態は、バッファによって発生するメモリ使用量と、その空間を自由に又は再利用するよう設定することができるか否かを再検討することになる。この考察はステップ14111において表す。
【0102】
制御はここでステップ14101に戻り、ここでノード420がレンダリングの準備ができていることが最終的に判定されることになる(ステップ14105)。レンダリングが上記で説明されたように行われることになり、最終的に制御は、ノード410の検討のためのステップ14101に戻る。ノード410/ROIがキャッシュされると仮定すると、レンダリングは最終的には結果ノード415上で行われることになる。
【0103】
F.簡単なコードの実施例
例証として、以下は、Core Imaging APIが簡単な露出フィルタにどのように用いることができるかを示すコードの実施例である。
【0104】
【表1】
【0105】
同様に例証として、以下は、本発明の実施形態によるフラグメントを結合する実施例である。
【0106】
【表2】
【0107】
G.Core Imagingが作成するCPUコードとGPUコード
高レベルフィルタ結合をコンパイルする際に、Core Imagingは、レンダリング中に実行するための複数のオブジェクトを生成する。Core Imagingのこの特徴は、複数の異機種プロセッサを備えたシステムに広く適用可能である。例えばこれは、ジャストインタイムコンパイルを行い、航行中の航空機で行われる天気予報計算を分割するのに有用である。ジャストインタイムコンパイルにより、効率アルゴリズムがどの処理資源を使用するかを判定する際に航空機(飛行中)の状態を考慮に入れることができる。この一般的なプロセスは、7つのステップに要約できるが、効率的なシステムでは、これらのステップのサブセット上で動作することができ、すなわち、(1)プロセッサ、コントローラ、メモリ空間などのどの資源が有功に利用可能であるかをチェックする;(2)資源の各々の能力を評価する;(3)各資源の動作状態をチェックする;(4)現在のタスクの要件を評価する;(5)利用可能な資源の一部又は全てに関してタスクの要件を解析する;(6)システム内のハードウェア使用量の全体的な効率を高めながら(一般的にはタスクによって使用される資源を低減させるが、恐らくは十分に利用されていない資源又は使用されていない資源を用いる)、タスクの要件を満たすようにソフトウェアを最適化しコンパイルする;(7)コンパイルされたコードを実行する;である。実施形態によっては、1から5までのステップを実行時又は実行前に行ってもよいが、ステップ6と7は、実行時又は実行時の近くで行う場合にプロセスにおいて最も有用である点は注目すべきである。
【0108】
ハードウェア能力、タスクの特性と困難度、作業の効率的な分割を決定する際のリアルタイムの状態を考慮することができるこのプロセス(全体又は短縮型)に対し実質上無限のアプリケーションが存在する。これらの実質上無限のアプリケーションにも関わらず、Core ImagingがCPUコードを作成する3つの一般的な理由がある。その1つは、CPU上でGPUをエミュレートするためであり、これは後で説明する。二番目の理由は、オフラインレンダリングを行うためにCPUを使用することにより効率が厳しくなるためである。最後の理由は、タスクがGPUのハードウェア能力を越える場合のような絶対的な必要性のためである(これも後の部分で幾分説明する)。
【0109】
第1及び第3の理由を他の箇所で説明するので、ここで第2の理由について実施例を提供して簡潔に説明する。複数のプロセッサに対する最も重要な恩恵は、並行して作動する能力である。アプリケーションプログラムが、フィルタリングルーチンのシリアルアプリケーションを必要とするタスクを提示する場合には、並行処理は最も容易に設定される。一例として、図15(a)を参照すると、6フレームシーケンス上でシリアルに動作するCPUとGPUのタイミングを示すチャートが示されている。この実施例の目的のために、各フレームにシーケンシャルに加えられる2つのエフェクトがあり、CPUが第1のエフェクトを加え、GPUが第2のエフェクトを加える。GPUはフレーム1を始め、GPUはアイドル状態又は他の動作中である。第1エフェクトがフレーム1に加えられた後、フレームは、第2のエフェクトを加えるためにGPUに渡される。GPUは第2のエフェクトをフレーム1に加えるときには、CPUは第1のエフェクトをフレーム2に加えている。プロセスが続行し(チャート15(a)に示される)、簡単な並行処理を使用してハードウェアを極めて効率的に利用し、2つのエフェクトをストリームに迅速に加えるようになる。図15(b)と図15(c)を参照すると、4つのプロセッサ(図15(b))又は2つのプロセッサ(図15(c))のいずれかで4つのエフェクトを加えることに関する効率を伝える類似のチャートが示されている。図15(c)でのネストが多くの方法で配置され、どのような数のエフェクトをどのような数のプロセッサにも加えることができることは注目すべきである。効率は、エフェクトの適用をシリアル化することで実現される。効率は、各エフェクトに対して必要な作業がタスクを実行するプロセッサに最適である場合に更に向上させることができる。例えば図15(a)で、CPUが第2エフェクトを加えるために好適である場合には、CPUとGPUとの間で処理するフレームの順序が逆にされる。
【0110】
H.エミュレーション:Core Imaging生成CPUコード
上記で説明されたように、過去数年の間、フレキシブルなグラフィック関連ハードウェアとソフトウェア技術は、本発明の多くの実施形態のような有用な技術のベースを発展させ提供してきた。特に、OpenGLとプログラム可能GPUなどの技術の出現は、本明細書で説明される技術革新の多くに対するツールを提供した。しかしながら、これらのツールは、必ずしも後方互換性があるものではなく、利用可能なインフラストラクチャ(例えばプログラム可能GPU)がないため、Core Imagingの機能の全てがあらゆるプラットフォームで実行可能な訳ではない場合がある。従って、Core Imagingのサービスに依存するプログラマ又はプログラムが存在する場合、これらのプログラマ又はプログラムは、Core Imagingのサービスの一部又は全てが利用可能でない場合に特定のプラットフォーム上で損なわれる可能性がある。
【0111】
実際的な実施例として、Core Imagingの機能などを提供するためにオペレーティングシステムを設計する場合、恐らくは、本明細書の実施形態の多くで説明されるような高レベルグラフィックの呼出しを行うようにアプリケーションが設計される。しかしながら、新しいオペレーティングシステムが用いられるとしても、古いコンピュータでこれらのアプリケーションを実行しようと試みることを想定した場合には問題が生じる。具体的には、Core Imagingに対して呼び出しが行われ、GPUが通常通りにレンダリングを行う場合に問題が発生する。この理由のために、Core Imagingの機能の全て又は最大限があらゆるプラットフォームでも利用可能にすることができるように、Core Imagingがエミュレーション機能を備えるのが有用である。
【0112】
従って、非常に高レベル(システム機能)であることにより、必須ではないが、エミュレータが極めて有効となるタイミングがあることを知ることができる。しかしながら、Core Imagingの従来の適用性は、この開示事項の誘因となるが、本明細書の革新性はこれに限定されない。従って、エミュレータを用いることができるより詳細な状況に関して、説明を簡潔に行うものとする。特に発明者らは、プログラム可能GPU又はどのようなGPUも無い場合のエミュレータの有用性を既に指摘した。しかしながらこれに加えて、GPUを含むシステムでもエミュレーションの有益な用途を有する場合がある。特に、問題であるのは、特定のGPUの資源の限界を越える可能性があることである。例えば最新のGPUでは、2048×2048を越えるイメージは一般に大きすぎる。更に、正確な結果を得るには、CPUを必要とする可能性がある(現在ATIから入手可能なような幾つかのGPUは、24ビット浮動小数点だけを使用する)。当然、特定のグラフ又はノードを求めるためにエミュレータが役立つことができる多数の他のハードウェア制限及び場合によっては低レベルのソフトウェア検討事項が存在する。
【0113】
1.エミュレートの決定
エミュレートを行う決定は、ホストシステムの特性とエミュレーションの事由に応じて種々のタイミングで行うことができる。例えば、プログラム可能GPUサポートがないシステムでは、ソフトウェアスイッチは適切なグラフィック呼出しをエミュレートするように構成を恒久的に設定することができる。或いは、Core Imagingが特定のタスクに対して呼び出された後でこの決定を行うことができる。この場合、タスクの特性は、常駐GPUの特定の機能を考慮するだけでなく、場合によってはプロセスの状態やハードウェア項目を考慮する。幾つかの特定の実施形態において、Core Imagingは、グラフィック呼出しの時点でエミュレーションに関する決定を行う。このような実施形態の幾つかにおいては、エミュレーションは、常駐GPUが存在しないか、或いは常駐GPUがプログラム可能でない場合に使用される。これらの実施形態の他のものでは、グラフ最適化が少なくとも部分的に加えられた後で決定が行われ、GPUが特定のフラグメントを処理できないか、或いはこのような特定のフラグメントはCPU上でのエミュレーションにより処理する方が賢明であるかが判定される。更に別の実施形態において、エミュレートの決定は、グラフィック要求のソース又は出力のデスティネーションに依存する。これは、グラフィック要求に対する全体のシステム応答をメモリオペレーションの速度を向上させることによって改善することができるためである。例えば、Core Imagingが結果をシステムメモリにレンダリングするよう求められる場合、エミュレーションはCPU上で行われることにより、その最終的なデスティネーションは、エミュレーションに関する1つの要因である。メインメモリへのアクセスは一般的に、GPUからよりもCPUからの方が高速である。同様に、ビデオRAM内のメモリオペレーションは一般にGPUからの方が高速になる。従って、Core ImagingがVRAMにレンダリングするよう求められる場合、これはGPUを使用する傾向への要因である。
【0114】
2.ソフトウェアスタックでのレイヤとしてのエミュレーション
図3(a)、3(b)を参照して、エリア3100、3101におけるサービスを一般に提供するCore Imagingを説明した。Core Imagingエミュレータの多くの実施形態において、OpenGL36又は320のレイヤに存在するサービスに言及することができる。従って、これらの実施形態のエミュレータは、OpenGLでのほぼ同じレベルでサービスを提供する。これは、エミュレータがOpenGLの下位のサービスを提供する別の実施形態との違いである。この違いは、1つには、前の実施形態がOpenGLの(又は同様の状態にあるサービス)機能のサブセットだけに関するエミュレーションを提供することによって性能を達成することによって生じる。別の実施形態において、エミュレータはOpenGL(又は類似の)実装の一部とすることができる。更に別の実施形態において、エミュレータは、OpenGL(又は類似のサービス)の下位とすることができ、より包括的な適用範囲を提供することができる。当然、これは性能を犠牲にする可能性がある。
【0115】
本発明のエミュレータ実施形態の説明の際に、実施形態の2つのセットに関する更に具体的な説明を行うものとする。実施形態の1つのセットは、GPUプログラム(例えばフラグメントプログラム)をターゲットの1つ又は複数のCPUのための機械コードに直接コンパイルする段階を含む。実施形態の第2のセットは、各GPU命令が高レベルプログラミング言語(3のような)における関数によってモデル化されるバイトコード仮想マシンを含む。実施形態のいずれのタイプにおいても、必須ではないが、低レベルグラフから始めるのが好ましい。更に、上記で説明されたようなグラフ最適化は、ノード、メモリ、計算を低減させることができるので、やはり最適化されたグラフから始めるのが好ましい。エミュレータはノードの一部とすることができるフラグメントプログラムで動作するので、エミュレータタスクは、上記で説明されたグラフウォーキングと解像技術の下位にレイヤされるものと見なすことができる。
【0116】
I.GPUプログラムの機械コードへの直接コンパイル
エミュレートの決定が行われると、多くの実施形態は、CPU対応プログラムの以下の汎用プロセスを使用する。上記の説明から、GPUコードによる開始を仮定することは明らかなはずである。更に詳細には、これは通常、グラフのノードに関連付けられたフラグメントプログラムとすることができる。各フラグメントプログラムは、1つ又はそれ以上のGPU命令を有する。(これらはラインと呼ぶ場合がある。)次いでプログラムの各ラインは、CPU等価命令に翻訳される。追加命令を含むラインのような多くのラインは、単一の命令CPU均等物を有することができる。他のラインは、フラグメントコードの単一のラインが複数のCPU命令に翻訳する必要がある点で高度なエミュレーションを必要とする。翻訳のいずれかのタイプ(1対1又は1対多)は、熟練したプログラマが理解できるどのような種類の方式でも達成することができる。1つの好ましい実施形態において、命令翻訳は、大きな「if」文によって行われる。別の実施形態において、テーブルやルックアップは、GPU命令を等価の1つ又はそれ以上のCPU命令に位置合わせするために使用される。
【0117】
翻訳ステップ中、GPUコードは、どのようなレベルのGPU命令からもあらゆるレベルのCPU命令に翻訳することができる。例えば、翻訳はGPUアセンブリからCPUアセンブリに行うことができる。1つの好ましい実施形態において、翻訳は、GPUアセンブリと、現行の実装ではバイナリであるCPU機械コードとの間で行われる。
【0118】
プログラムがCPU命令として表現されると、コードをアンロール(展開)することができる。コードアンローリングと最終的な命令スケジューリングは、命令レベル並行処理(「ILP」)を利用するかなり標準的な最適化技術である。ILPの一般的な目的は、ソフトウェア命令によって利用されるハードウェア並行処理の量を増大させることである。これが達成される1つの方法は、性能を最大にするために命令を再配置することである。更に具体的には、相互依存のない命令のグループを並行して実行することができる。ループアンローリングは、ILP技術のクラスであり、ループに固有の並行処理を用いることによって効率が向上する。これは、単一のフラグメント、或いは詳細にはそのCPUエミュレート等価物が多数の画素を解像するために極めて多くのループを実行する(1つの画素につき1ループ)ことになるので、グラフィックオペレーションにおいては重要である。ループアンローリングでは、ループのnインスタンスがアンロールされ、すなわち、ループコードのnインスタンスがプログラムラインに書き込まれる(例えば、ループに10のラインがあり、nが4である場合、40ラインのアンロールドコードがあることになる)。最後に、アンロールドコードは、この形式で実行するようにセットアップする必要があり、これは、変数のインクリメントやループを再始動させるブランチ又はgotoコマンドへの調整が必要となる場合があることを意味している。アンローリング後、次にプログラムスケジューリングを使用して、サブジェクトハードウェアでの最大並行処理のためアンロールドコードを最適化する。アンロールドコードが最終的に実行される場合、オリジナルループの回数のn分の1だけのループを必要とし、各新しいループは遙かに少ない機能停止事象で実行される。
【0119】
アンロールされると、コード上での次の3つのステップは、標準的な最適化、レジスタ割り当て、プログラム/命令スケジューリングである。熟練したプログラマであれば、これらのステップの全てをどのように実行するかを理解するであろうが、ごく簡潔な説明を行う。この説明は網羅的或いは排他的ではない。言及されない多くの技術が存在することができる。更に、言及する技術の全てが提示するカテゴリの下で行われない場合もある。標準的なプログラム最適化は、コード短縮や重複除去などの多くの技術によって時間とメモリ性能を向上させることを目的としている。レジスタ割り当ては、競合を避け、使用されるレジスタの数を最小にし、出力エフェクトのない命令を拒否するように実行される。最後に、プログラム/命令スケジューリングは、特定のハードウェアのパイプライン及び並行処理のためのコードを最適化する。
【0120】
この時点までに多くを達成している場合、コードは今後このようにキャッシュされるので、この作業は不要である。
【0121】
1.特定の実施例の実施形態
図16を参照すると、本発明のエミュレータの実施形態のサンプルプログラムフローが示されている。プログラムフロー及び説明は、例証のためだけのものとする。実際の実施形態は、フラットなフローチャートでは容易に説明できないオブジェクト指向手法を用いることができる。
【0122】
ステップ161を参照すると、プログラムは、通常多角形として境界付けられるイメージのレンダリング又は生成を要求するためにCore Imagingを呼び出す。制御は決定162に進み、ここでエミュレータを利用する必要があるかどうかが判定される。エミュレータが利用されない場合、この例の目的において、制御はステップ164に進み終了する。勿論、開示事項は他の場所でエミュレーションに対する代替形態を説明する。
【0123】
エミュレーションを利用するための考慮事項について上記で説明したが、ステップ162がエミュレータを使用することを決定し、制御はステップ163に進み、ここでデータがCore Imagingの他のルーチンからエミュレータにプッシュされると仮定する。詳細には、このデータは、サブジェクトフラグメントプログラム、フラグメントプログラムをレンダリングするのに必要なテクスチャ、ローカル変数、状態である。これらの項目がエミュレータに利用可能になった後、制御は決定165に進み、CPU機械コードがこのタスクのために既に作成されたかどうかを調べる。フラグメントプログラムは、キャッシュへのインデックスとして使用される。しかしながら、キャッシュを実装するための種々の方法がある。ある実施形態においては、キャッシュルックアップは、必要なデータの全てについてのフォーマットを含むことができる。例えばキャッシュは、出力の画素フォーマット(1画素につき32ビット、RGBAなど)、/又は各テクスチャの画素フォーマットや状態などの情報を記憶しているテーブルから入力することができる。
【0124】
決定165に戻り、キャッシュヒットがある場合、制御はステップ169にスキップする。例証を完全にするために、キャッシュミスを想定すると、制御は、GPUフラグメントコードをCPUコードへ変換するステップ167に進む。この変換のための技術は上記で説明されているので、この課題に対しては簡潔に対応する。ほとんどの実施形態において、このステップ167は、変換、アンロール、標準的な最適化、レジスタ割り当て、プログラム/命令スケジューリングの全てを行う。しかしながら、別の実施形態は、どのステップが既に完了しているかに応じて、多少の機能を実行することができる。同様の注意点が次のステップ168にあてはまり、ここでCPUコード結果がキャッシュされる。ほとんどの実施形態はバイナリ機械コードをキャッシュし、熟練のプログラマであればより少なく処理された結果をキャッシュする事由を理解することができるであろう。
【0125】
ここでステップ169に移ると、機械コードは、画素評価のためのN長ループに配置される。このループのジョブは、L画素を評価することである。好ましい実施形態において、Lは128である。本明細書で説明される本発明はLのほぼどのような値にもあてはまり、本発明者らは、その実施において128のL値が種々の検討事項(テクスチャルックアップによって引き起こされたより大きなオーバーヘッドによって、部分的なブロックを扱うことによって一度に多くの画素を処理したいという要求)のバランスをとる際の最適な性能をもたらすことが分かった。従って、ステップ169のループがL画素を評価することである場合、アンロールドコードは、LをNで除算したものに等しい回数分ループしなければならず、ここでNは、アンロールドコードで表現されるループの反復数である。最終的にはNはL/nに等しい。従って、全ループにつき128画素の好ましい実施形態が利用され、4つのアンロールド反復を想定する場合、アンロールドコードを32回ループしなければならない。
【0126】
ここでステップ1610に移ると、エミュレータによりスラブが生成される。好ましい実施形態において、これは関数呼び出しにより達成することができる。用語「スラブ」は、グラフィックアートにおいて比較的一般的な意味で使用される。しかしながらこの実施形態においては、スラブは、出力多角形上の全頂点で水平線を引くことによって形成される。例えば図17を参照すると、図17(a)には傾いた矩形とスラブに分割された同様の傾いた矩形が示されている。図17(b)では、同じ関係を有する2つの台形を示しており、一方は描かれたスラブを伴って示されている。
【0127】
スラブが生成された後、制御はレンダリングのためのステップ1611に進む。好ましい実施形態において、スラブは一度に1つレンダリングされる。特に、各スラブは、スラブの走査線上で見られるLの連続した画素上で、ステップ169で作成された画素ループを実行することによってレンダリングされる。更に詳細には、多角形は、(i)第1スラブを選択する段階(X、Y、Zグローバル座標系を想定し、好ましい実施形態ではセクションが最も小さな値から最も大きなY値に進むことができる);(ii)このような第1スラブ上で第1走査線を選択する段階(X、Y、Zグローバル座標系を想定し、好ましい実施形態ではセクションは最も小さな値から最も大きなY値に進むことができる);(iii)ステップ169で作成されたループを使用して走査線の第1のL画素をレンダリングし、次いで走査線が全てレンダリングされるまでこのステップを繰り返す段階;(iv)スラブ内の全走査線が終了するまで次の走査線(L画素の部分を含む)に進む段階;(v)同様の方法で全ての後続のスラブを完了する段階によってレンダリングされる。更に、L画素のCore Imagingの選択がサービス要求者(例えばアプリケーションプログラム)に任されるので、幾つかの実施形態では、レンダリングされた結果を1つ又はそれ以上のバッファに一度に1画素ずつ書き出す。次いで、最終的な結果が、望ましいピースで要求デスティネーション内に配置することができる。例えば、結果は、L画素の終了後、或いは全部分(スラブのような)の終了後、或いは全多角形の終了後に要求デスティネーションに移動させることができる。この追加のステップはまた、フォーマット変換(バッファと要求されるデスティネーション間)のようなどのような後処理に対しても好都合な場所を作成する。
【0128】
走査線全体に渡るレンダリングを説明する際に、画素カウントがLの倍数でない走査線の処理に関する疑問が生じる可能性がある。熟練したプログラマは、このケースを実施するための種々の方法を考案することができるが、本発明の幾つかの実施形態では、図16に示されるプロセスのフレームワーク内でこの問題を考慮する。1つの特定の実施例では、ステップ169の画素ループは、ある変数(例えばアルファ)に従って何度もループする。従って、128画素でループが4回アンロールされる場合、アルファは32になる。しかしながら、48画素しかない場合(例えば、走査線全体で128ビットの数グループを処理した後)、アルファは12に設定することができる。或いは、66画素の場合、アルファは、第1の64画素の処理のために16に設定することができ、次にアルファは65番目の画素と66番目の画素を処理するために1に設定される。要約すると、これらの実施形態は、ルーピングを制御するために変数を使用すること、様々な量の画素を処理するためにその変数を調整することを必要とする。
【0129】
L画素の非倍数を処理するための別の方法は、様々な量の画素に対しアンロールドコードセグメントを提供する。例えば、メインループが4アンロールドセグメントを有する場合、3つのアンロールドセグメント、2つのアンロールドセグメント、1つのアンロールドセグメントで作成されたコードも存在する。従って、3つの画素がある場合、3画素コードを使用できる。1つの画素がある場合、1画素コードを使用できる。
【0130】
前述の技術を組み合わせた実施形態もある。例えば66画素がある場合、アルファは、最初の64画素を処理するために16に設定され、次いで2画素コードを65番目と66番目の画素を処理するために実行される。或いは、67画素の場合、アルファは、最初の64画素を処理するために16に設定され、次いで1画素コードを65番目、66番目、67番目の画素を処理するために3回実行される。
【0131】
2.スラブ
多くの実施形態がスラブを使用する。スラブの代わりとして、説明された同じ方法で全多角形をレンダリングすることができる。しかしながら、スラブは、テクスチャ計算において有意な利点を提供する。特に、出力多角形の頂点に対してテクスチャ座標が知られている。ほとんどの実施形態において、これは、上にあるレイヤ(例えばグラフオプティマイザ)がこの情報を提供することによる。しかしながら、通常ハードウェアは、その基本ユニット多角形(一般に三角形)の頂点を関連するテクスチャマップにマップすることができ、ハードウェアの基本ユニット多角形の頂点は、出力多角形の頂点と一致しなければならない。図17(a)、図17(b)を参照すると、これらの頂点は、円形のドットで示されている。図17(a)、図17(b)を再度参照すると、スラブが形成される場合、スラブは通常、オリジナルの多角形上の頂点ではない1つ又はそれ以上の頂点を含む。図17の全てにおいて、これらの「新しい」頂点は三角形で示されている。従って、1つ又はそれ以上の実施形態において、スラブが形成されると、新しい頂点のテクスチャ値(図17の三角形)を種々の技術によって計算する。幾つかの実施形態では、既知の多角形頂点から座標値を補間することによって新しい頂点のテクスチャ座標を計算する。好ましい実施形態において、直線補間を用いて、分割スラブの端部まで補間される。その結果、各スラブは、既知のテクスチャ座標で3つ又は4つの頂点を有する。スラブの頂点での3つ又は4つの既知の座標で、スラブ上のどの画素のテクスチャ値も、補間、又はより詳細には直線補間のような数学的手法によって求めることができる。
【0132】
最終的に、スラブは多角形より小さいので、スラブはテクスチャ値の極めて容易な計算を提供する。詳細には、ここまで説明されたように、スラブは結果として得られる多角形の一部を含み、三角形又は4つの側面を有する多角形のいずれかとして生じる。三角形の場合、全頂点についてテクスチャ座標が既知であると、いずれのポイントの座標(及び最終的には値)も数学的(例えば、補間又は直線補間)に計算することができる。更に、スラブが多角形である場合、プログラムは、複数の数学的手法を使用して、多角形の点のテクスチャ座標を考案することができる。例えば、幾つかの実施形態ではプログラムは3つの頂点を選択し、直線補間を実行する。
【0133】
スラブの利点は、種々の形状によって実現される。例えば幾つかの実施形態において、結果として得られる多角形は、レンダリングのため全て三角形に分割することができる。これは、常に3つの頂点だけが存在するという点でテクスチャルックアップを簡素化することができる。従って、4つの側面がある多角形のどの3つの頂点を補間のため使用すればよいかに関して決定する必要性がない。更に、熟練したプログラマであれば本明細書で教示されている概念を他の方式に適用することができ、これによって結果として得られる多角形は、レンダリングのために分割される。
【0134】
3.テクスチャルックアップ
例えばスラブや多角形の頂点のコンテキストにおいてテクスチャルックアップを説明した。ここで、開示されてきた実施形態の幾つかに効率的にテクスチャルックアップを組み込む方法に関してより詳細に説明する。最初に、テクスチャルックアップの2つの関連するタイプを述べ、次に前述の説明に類似する可能性のあるコンテキストを提供することによって、この詳細な説明の裏付けを与える必要がある。
【0135】
エミュレーションタスクにおいて、遭遇する可能性のあるテクスチャルックアップの2つの一般的なタイプがある。公知のテクスチャへの座標である独立したテクスチャルックアップがある。例えば独立したテクスチャルックアップは、既知のテクスチャでの所与の座標を参照するコードにおける場所である。或いは、ある他の項目又は事象に依存するテクスチャルックアップである従属テクスチャルックアップが存在し、そのため、座標は通常レジスタ内にプログラムによって配置される。例えば、これは、所与のテクスチャへの座標がレジスタ内で見られるコードの場所とすることができる。テクスチャルックアップは、レジスタを読み込むことができるある他のオペレーションの結果に依存する。
【0136】
テクスチャルックアップ技術のためのコンテキストを設定する場合、種々の実施形態のために説明されたエミュレータのメインループ内の動作をより詳細に調べる。詳細には、これは一般に169のような図16に関して説明するループに類似している。この類似性及び図16を参照することによって、ステップ169でループをセットアップする際に、128画素の処理に影響を与えるためにループ内にアンロールドコードを単に配置する以外に達成すべきことがある。特に、画素の各グループ(スラブ、走査線、又は好ましくはL或いは画素の残りのグループ)について、コードをセットアップしなければならない。上記で説明されたように、コードのセットアップの部分は、走査線が128の倍数でない画素長(L)を含む場合、コードは残りの画素を考慮に入れることができるものとすることができる。更に、コードは、テクスチャルックアップに対しセットアップすることができる。
【0137】
ここで、テクスチャルックアップのサブジェクトに直接的を絞ると、エミュレータの好ましい実施形態は、テクスチャルックアップのメインループをセットアップする。1つの実施形態において、このようなセットアップは、L画素毎に行われ、独立と従属テクスチャ基準に対して別々にセットアップする段階を含む。これらの実施形態では、セットアップ中に各独立したテクスチャ基準は、好ましくは同じステップでルックアップされる。また、各従属テクスチャ基準では、従属性が満たされた後でルックアップを行うためにコード中に関数が挿入される。理解し易いように、関数呼出しは、各ルックアップに対してコードに挿入される。関数は、プログラムでの従属テクスチャ基準によってアクセスされるまで、テクスチャユニット毎に作成される。テクスチャルックアップ関数に渡される唯一の値は、ルックアップのための座標と使用するテクスチャである。更に正確には、コードのこの挿入された部分は、ループの外側で呼び出すことができ、このような関数は、本質的にGPUテクスチャルックアップ機能をエミュレートする。1つの好ましい実施形態において、ループ内部からの関数呼出しは、テクスチャ、状態、座標を渡し、関数はベクトルを返す。しかしながらこの関数呼出しは、他の方法で実装してもよい。
【0138】
4.セットアップ
発明者らは既に幾度もコードのセットアップを説明してきたが、幾つかの例示的な実施形態を提供する。例えば、所与の実施形態において、各多角形についてセットアップされるコードの部分と、各スラブのためにセットアップされる部分、各走査線のセットアップの部分と、各画素グループ(例えば、L又は残りのグループ)に対してセットアップされる部分が存在することができる。所与のセットアップでの種々のアクティビティは、本明細書での他の説明から外挿することができる。
【0139】
J.複数のCPU
前述の実施例に類似する技術に従う実施形態は、複数のCPUに極めて良好に適合する。これは、ステップ169(図16)で作成されたループ機械コードが種々のスラブ又は種々の多角形上で別々のインスタンスにおいて実行できるためである。特に、Core Imaging又は別の適切なプログラムは、プロセッサ間でタスクを分割することによってマルチプロセッサシステム上でのグラフィックレンダリングの速度を大幅に高めることができる。好ましい実施形態において、各プロセッサに送られることになるタスクのインクリメントは、スラブ(又は他の細分化されたもの)である。しかしながら、インクリメントは、より小さいもの(例えば走査線)又はより大きいもの(例えば全多角形)であってもよい。
【0140】
K.バイトコード化仮想マシン
仮想マシンはまた、CPU上でGPUコードをエミュレートするのに用いることができる。仮想マシンは、命令を受け取りプロセッサ資源を別のプロセッサにエミュレートすることができる点で、ハードウェアのように動作するプロセスである。一般的な意味で、仮想マシンエミュレータソリューションの利点は、仮想マシンがよりポータブルであることである。特に、仮想マシンは高レベル言語で記述することができ、次いでどのようなプラットフォームにもコンパイルすることができる。或いは、GPUプログラムを機械コードにコンパイルする実施形態は、各ハードウェアプラットフォーム用に特注とすることができる。
【0141】
1つの好ましい実施形態では、本発明は、バイトコード仮想マシンエミュレータを必要とする。形容詞「バイトコード」は、コンパイルされたコード、或いは幾つかの実施形態の場合においてハードウェアが受け入れるものに類似した低レベルのコードを仮想マシンプロセスが受け入れる意味が付加される。高レベルでは、仮想マシンは、GPU対機械コードエミュレータを説明する実施形態でのCPUに類似している可能性がある。より詳細には、仮想マシンは、上記で説明されたより高レベルの機能と技術の下に存在しているものとして概念化できる。従って、上記で説明されたエミュレーションや他の方法と技術の全ては、開示される仮想マシンエミュレータに類似しこれに適用することができる。しかしながら、独立した考慮事項に値する仮想マシン実施形態の興味深い態様がある。
【0142】
1つの実施形態において、仮想マシンは、出力画素を構築するための極めて大きな仮想レジスタを含む。特にハードウェアの制約が無ければ、仮想マシンは、効率などの他の基準の要求を満たすレジスタサイジングを使用することができる。従って幾つかの実施形態において、仮想マシンは、L画素幅である画素のレジスタをセットアップすることになる(走査線に沿って処理される128画素の実施例に戻り参照されたい)。レジスタのこの幅は、メインループ処理のための多くのオプションを提供する。一方の極端では、レジスタは、一度に(単一の画素ループ)処理される1つの画素を備える出力バッファとして機能する。他の極端では、メインループの各ステップは、次のステップに移る前に各画素で影響を受ける(これは、完全にループをアンロールすることに類似する)。これらの極端間のバランスをとるために、幾つかの実施形態では、従属問題を生じさせることなく概念的に出来るだけ多くループをアンロールするように仮想マシンを実装する。システムの考慮事項に応じて、画素レジスタは、Lの倍数又はLの分数とすることができる。更に画素レジスタは、走査線のサイズ又は多角形動作セグメント(スラブなど)のサイズを一致させるように動的に実装される。
【0143】
実際にエミュレータの実施形態が実行しているとき、その実施形態は高いレイヤからの命令を受け取る。これはCore Imagingのより高いレイヤであるのが好ましい。概念的には命令はどのレベルのものでもよいが、好ましい実施形態では、命令はバイトコードなどの低レベルである。次いで、仮想マシンは、命令をCPUのためのタスクに変換しなければならない。このような変換の第1部分は、CPU認識可能命令への直接変換を行う「if」文又はジャンプテーブルである。1つの好ましい実施形態において、仮想マシンは、C関数のようにGPU命令をモデル化する。このタイプの実施形態では、エミュレートされる各GPU命令はC関数に相当する。次いで、C関数は、通常のコンパイラでCPU認識可能コードに変換される。ごく一般的には、好ましい実施形態において各エミュレートされたGPU命令は、C言語などの高レベル言語でモデル化される。高レベルモデルがコンパイルされ、その結果が、仮想マシンエミュレータのオペレーション中に使用されることになるジャンプテーブルの「if」文に組み込まれる。最後に、エミュレーション中の要素(画素など)上で動作する場合、CPUベクトルレジスタは、ベクトルを記憶するために使用することができるのが好ましい。
【0144】
L.機能のサブセットのエミュレーティング
性能を得るために、多くの実施形態では全ての利用可能な低レベルグラフィック呼出しをエミュレートしない。一般に、利用可能なグラフィック命令のサブセットだけをエミュレートすることによって、サポートされる呼出しについてのより多くの想定が実装により行われ、従って幾つかの偶発事象が回避され、これによって作業を短縮することができる。例えば幾つかの実施形態において、Core Imagingは、透視用法の正確な補間に対し必要ではない。特にOpenGLは通常、1つの補間されたテクスチャ座標あたりの画素毎に少なくとも1つの分割命令を必要とする。分割は、コンピュータ的に極めて高コストであり、Core Imagingのこれらの実施形態が透視図を持たないので、分割は必要ではない。オペレーションのサブセットだけをサポートすることによって向上する性能の別の実施例は、Core Imagingの幾つかの実施形態が少数のテクスチャフォーマットとデスティネーションフォーマットだけをサポートものである。これはデータ変換を制限し、より容易なインラインコード作成を可能にする。
【0145】
機能のサブセットだけをサポートする実施例として、1つの実施形態においてエミュレータは、(i)4つの側面を持つ多角形の描画;(ii)テクスチャ結合;(iii)プログラム結合;(iv)ローカル変数の設定;及び(v)デスティネーション設定などのOpenGLの機能のサブセットだけをサポートする。
【0146】
この簡潔にされたタイプのサポートを実際に適用するための幾つかの方法がある。第一に、定義された高レベルAPIは、エミュレートできないコマンドを受け取る可能性がないようにこれらの機能だけをサポートすることができる。例えば、Core Imagingが機能のサブセットだけをサポートする場合、Core Imagingエミュレータはこれ以上をサポートする必要はない。この場合、プログラム又はプログラマがサポートされていないグラフィック呼出しを使用したい場合には、OpenGLへの直接呼出し、又はGPUの直接利用などといった、別のメカニズムを介してこれを行わなければならない。或いは、1つのエミュレーション技術は、エミュレートされる機能のサブセット(又はある別のサブセット)のために使用でき、別の技術は、全ての他のグラフィック呼出しのために使用できる。例えば、5つのエミュレートされた機能は、GPU対機械技術を使用する実施形態を介してエミュレートすることができ、他の機能は、仮想マシン実施形態を通じてエミュレートすることができる。この構成は、最も一般的なグラフィック呼出し関する最高の性能を可能にし、他の呼出しをサポートするためのより容易なポータビリティとプログラミングを可能にする。勿論、この分割は、呼出しをサービスする難易度、又はそれぞれの技術による呼出しサービスの適性などの他の基準に沿って設けることができる。更に、2つのセットの技術(仮想マシン及びCPU対機械)は、システム内の全体のグラフィック機能の1つ又はそれ以上のサブセットを実装するための分担を同様に分けることができる。
【0147】
M.サンプルフィルタリスト
本明細書の種々の箇所で、フィルタの例証的なリストに言及してきた。以下の多くのページは、そのリストに充てられる。このリスト及び添付のパラメータは例証として、説明を完全にするために提供される。上記の発明の本発明者らの実装に関して、リストされたフィルタの各々を使用又は修正してもよく、或いは使用又は修正しなくてもよい。更に、より多くのフィルタを作成することができ、これらは、開示されたものとはかなり異なる場合がある。
【0148】
【表3】
【0149】
以下の同時申請出願、すなわち、同時申請のMark Zimmerによる「IMPROVED BLUR COMPUTATION ALGORITHM(改良型ブラー計算アルゴリズム)」、同時申請のJohn Harperによる「SYSTEM FOR EMULATING GRAPHICS OPERATIONS(グラフィックオペレーションをエミュレートするためのシステム)」、同時申請のJohn Harper、Mark Zimmer、Ralph Brunner、Peter Graffagninoによる「SYSTEM FOR OPTIMIZING GRAPHICS OPERATIONS(グラフィックオペレーションを最適化するためのシステム)」、同時申請のJohn Harperによる「SYSTEM FOR REDUCING THE NUMBER OF PROGRAMS NECESSARY TO RENDER AN IMAGE(イメージをレンダリングするために必要なプログラムの数を低減させるためのシステム)」は、引用により本明細書に組み込まれる。
【技術分野】
【0001】
ここ数年にわたって、全ての種類のハードウェアにおいてグラフィックサブシステムが重要となる需要が増えてきた。例えば、汎用コンピュータ関連分野において、プレゼンテーションソフトウェアのような従来からの日常的なプログラムでさえ、より高速でより複雑な図形処理機能を必要とするアニメーションや他のツールが含まれている。更に、ビデオ、写真編集、ゲームのような従来のグラフィック性が強いアプリケーションは、適用範囲とグラフィック強度の両方で成長しつつある。更に、ゲームやグラフィック専用演算処理のような垂直システム(例えば、任天堂ゲームキューブなど)では、グラフィックの優位性に関して、汎用コンピューティングアーキテクチャとの高速駆動の競争が加速してきた。
【背景技術】
【0002】
これと同じ期間に、ハードウェア製造業者は、増大する一方の容量を備えた専用グラフィックプロセッサに関して高まる需要を満たし、これを越えようと努めてきた。現在では、プログラム可能な幾つかの市販されているグラフィックス・プロセッシング・ユニット(GPU)がある。プログラム可能GPUや非プログラム可能GPUの両方がグラフィック計算において高速化をもたらすが、プログラム可能GPUは、高い柔軟性を提供する点で異なっている。例えば、プログラム可能GPU以前には、アプリケーションプログラマは、より興味深いグラフィックをレンダリングするためにCPU時間を消費するか、又は理想的ではないグラフィックを表示する代償として全体のアプリケーション性能を向上させるためにGPUを使用するか、そのいずれかを判断していた。プログラム可能GPUは、従来のGPUの速度上の利点とかなりの程度の柔軟性とを組み合わせたものである。実際の問題として、プログラム可能であることは、システムマイクロプロセッサに類似する方法でプログラムがグラフィックチップを利用可能となるので重要な利点である。このようにGPUを使用することによって、本システムは、システムCPUをロードすることなく事実上無限のグラフィックエフェクトを生成することができる。
【0003】
プログラム可能GPUは、一般的にフラグメントプログラムと呼ばれるプログラムを実行する。「フラグメント」プログラムという名称は、動作しているデータの単位が一般に画素−すなわちイメージのフラグメントであることに由来する。GPUは、同時に幾つかの画素上でフラグメントプログラムを実行し、一般的には常駐するバッファの名称で呼ばれる結果をもたらす。GPUは、画素の集合に類似した一般にテクスチャと呼ばれるデータ入力を使用する。
【0004】
また、GPUが企図され開発された同じ期間中に、グラフィック専用ハードウェアの使用を求めるアプリケーションプログラムのために幾つかのプログラミングインターフェースを提供する取り組みが進行していた。1つのこのような取り組みは、OpenGLとして一般に知られている。OpenGLの目標は、ハードウェアに依存せずにプログラマがグラフィック機能を利用しやすくすることである。このようにすることで、OpenGLは状態機械のように動作する。特に、OpenGLライブラリを使用するプログラムは、現カラー、ライティング、ブレンドなどのステート(状態)を設定しなければならない。プログラムが実行されると、結果として生じるコンテキストは、プログラムされたものに依存する組合せなどの状態と入力テクスチャとの組合せとなる。状態機械型のオペレーションの場合、オペレーションの結果は、必ずしも容易に予測できるとは限らない。
【0005】
コンピュータが視覚的に更にリッチなコンテンツに移行するにつれて、イメージ処理はより重要になっている。その結果、これらのツールにプログラマが容易にアクセスできることや、グラフィック計算が効率的であることの重要性が常に高まっている。OpenGLとプログラム可能GPUの組み合わせは、グラフィックプログラムが可能であることについて広範な進歩を遂げたが、依然としてグラフィックサブシステムへのより高レベルのインターフェースに対する必要性がある。この必要性は、イメージ処理(例えば、PhotoShop、AfterEffects、又は類似のソフトウェア)に直接関連するアプリケーションにおいて高まっている。これらのアプリケーションやその他においては、そのインフラストラクチャを利用するアプリケーションからグラフィックハードウェアの複雑さを隠す抽象レイヤを有することが望ましい。更に、オペレーティングシステムは、全てのアプリケーションに対してこのような抽象レイヤを提示することによって全体的にリッチなユーザーグラフィック体験を容易にすることを求める可能性がある。
【0006】
このようなインターフェースは、プログラマ又はプログラムが所与のイメージにフィルタ又はエフェクトを簡単に適用できるようにする必要がある。より高いレベルのAPIに対する暗黙的な必要性は、高速と効率の両方の方法でそのAPIを実装する必要性である。効率的であるためには、システムは、理解が容易で且つ動作が容易な方法でグラフィックプログラミングを概念化するメカニズムを有する必要がある。更に、このようなシステムは、CPUとGPUとの間で作業を効率的に分担しながら同時にメモリの使用と計算時間を最小にしなければならない。最終的には、デュアルプロセッサシステム(GPUとCPU)のために構築されたプログラムがCPUだけを有するレガシーシステム上で実行することができるように、単一のプロセッサ上でエミュレートできるシステムを有することが望ましい。
【発明の概要】
【0007】
他の利点の中でも、本発明は、上述の問題を解決し、上述の必要性と要求を満たそうとするものである。これを行う場合、本発明の幾つかの実施態様は、グラフィックオペレーション、或いは二次的なプロセッサ資源を利用できる潜在的な他のオペレーションのための高レベルプログラムインターフェースを含む。このタイプの更に特定の実施態様において、高レベルプログラムインターフェースは、ユーザー又はシステム内のプログラムが呼び出すことができるグラフィックフィルタリング機能を含む。プログラム又はユーザーは、エフェクトを生成することによって、或いは事前に定義されたリストからフィルタ機能を指定することによって高レベルプログラムインターフェースを利用する。別の実施態様において、プログラマ又はプログラムは、フィルタを事前に定義されたリストに加えるために拡張可能なインフラストラクチャへアクセスすることができる。
【0008】
本発明の1つの一般的な実施態様において、ソフトウェアは、イメージタスクのグラフ状記述を構成するためにシステム内の選択されたプロセッサを利用する。グラフ状記述は、イメージのノードやリンク表示であり、ここでノードはオペレータを表し、リンクは、中間段階の結果と中間段階の結果を保持するのに必要な記憶装置を表す。詳細には、グラフ状記述のノードは、別のプロセッサ上の全体的なイメージオペレーションの一部分を計算するためのスレッド又はプログラムを最終的に含むことができる。更に、全体的なイメージタスクのグラフ状記述を有することで、最適化コンパイラの使用は全体的なイメージタスクに対して必要な資源を低減させることができる。このコンパイリング機能は、ノードプログラムがコンパイラを実行するプロセッサ以外のプロセッサ上で一般的に実行するので特に有用である。
【0009】
前述の一般的な実施態様は、単一のCPUと単一のGPUとの一時的なペアのコンテキストで説明することができる。この実施態様は、全体的なイメージタスクを評価し、そのグラフ状記述を構成するためにCPU上で実行するソフトウェアを提案する。これは、上述されたような関連づけを備えたノードやリンクのツリーグラフとして視覚的に表現することができる。ノード−プログラムがGPU上で実行できるので、プログラムの構成は、GPUのプロパティを考慮する。とりわけ一般的な意味では、プログラム可能GPUは幾つかの並列実行ストリームを操作し、そのためノードプログラムは並行処理可能言語で表すことができる。例えば、ノードプログラムはGPUフラグメントプログラムとすることができる。全体的なイメージタスクを表すグラフの構成後、グラフは、CPU上で実行されるコンパイラによって最適化することができる。或いは、グラフは、該グラフが作成されるときに別の部分においてコンパイラによって最適化することができる。最適化の目的は、メモリ使用量やCPU又はGPU時間を最小にすること、或いはイメージが計算されるときの効率を高めることである。
【0010】
本発明の種々の実施態様によると、最適化は、多くの機能的特性を有する。例えば最適化は、中間段階の結果をキャッシュする段階、複数のフラグメントプログラムを1つに統合する段階、閉じこめられた定義ドメインや関心領域内のエリアにメモリと計算を制限する段階、又はプロセッサ間での計算の分割を最適化する段階を含む。
【0011】
最新のグラフィックコンテキストにこれらの技術を適用することは、非常に効率的であり、これによって開発者はコンパイラが占めるシステム内の特定のハードウェアを考慮することなく、1つ又は複数の素子(例えば画素)で実行されるオペレーションを表現することによってフィルタを記述することができる。更に、マルチプロセッサシステム内に装備するためのAPIや効率的な処理インフラストラクチャを作成したことで、多くの実施態様はまた、シングルプロセッサシステム上のAPIを利用する機能を含む。ごく一般的な意味で、これはエミュレーションによって達成される。
【図面の簡単な説明】
【0012】
【図1】サンプルハードウェア構成を示す図である。
【図2(a)】ハードウェア構成のサンプルを示す図である。
【図2(b)】ハードウェア構成のサンプルを示す図である。
【図3】ソフトウェアスタックの説明図である。
【図4】グラフを示す図である。
【図5】グラフ及びサンプルプログラムステップを示す図である。
【図6】グラフを示す図である。
【図7】イメージ生成のための例示的なフローチャートを示す図である。
【図8】ノード結合のための例示的なフローチャートを示す図である。
【図9】ノード結合のための例示的なフローチャートを示す図である。
【図10】ノード結合のための例示的なフローチャートを示す図である。
【図11】グラフを示す図(a)とグラフ最適化のための例示的なフローチャートを示す図(b)である。
【図12】グラフ最適化のための例示的なフローチャートを示す図である。
【図13】最適化のための例示的なフローチャートを示す図である。
【図14】グラフ最適化のための例示的なフローチャートを示す図である。
【図15(a)】複数のエフェクトを加えるために複数のプロセッサを使用する段階を示す図である。
【図15(b)】複数のエフェクトを加えるために複数のプロセッサを使用する段階を示す図である。
【図15(c)】複数のエフェクトを加えるために複数のプロセッサを使用する段階を示す図である。
【図16】最適化のための例示的なフローチャートを示す図である。
【図17】多角形分割の実施例を示す図である。
【発明を実施するための形態】
【0013】
A.技術及び用語
1.技術
本明細書で説明される本発明の実施形態は、特に種々のタイプのプロセッサが1つのシステム内で利用される、全てのタイプのマルチプロセッサコンピューティングシステムに関連し、用途を有する。本明細書での説明のほとんどは、CPU資源やGPU資源を有する一般的なコンピューティング構成に焦点を絞っている。この説明は、例証のためのものであり、GPUなし、複数のCPUと1つのGPU、複数のGPUと1つのCPU、或いは複数のGPUと複数のCPUのいずれかを有する他のシステムに対して本発明の適用を制限するものではない。この注意に関して、発明者らは典型的なハードウェアとソフトウェア動作環境に関する情報を提供するものとする。
【0014】
図1を参照すると、一般的なハードウェアコンピューティング構成が示されている。極めて一般的であるが、マイクロプロセッサ11は、チップセットサポート集積回路13、17に結合されている。マイクロプロセッサは、23、24、又は25のようなインテルペンティアム(登録商標)ファミリー又はIBM/モトローラパワーPCチップのうちの1つのような、いずれかのマイクロプロセッサ又はコントローラとすることができる。チップセットIC(本明細書ではノースブリッジ13、サウスブリッジ17として表現される)は、1つ又はそれ以上のICに実装することができる。チップセット13、17は一般に、バス12を介して又は現在当該技術分野で公知の直接リンクによってマイクロプロセッサに結合される。チップセット13、17が1つより多いICに実装される場合、ノースブリッジの機能(AGP、メモリ管理など)が共通バスへの接続又は前述のリンクのいずれかによるプロセッサへのより直接的な接続を有することは一般的である。サウスブリッジ機能を含む別のチップは、ノースブリッジを介して極めて一般的にマイクロプロセッサ11に結合される。しかしながら、発明者らは、現在又は将来的に存在する利用可能な他の構成を排除することを意図するものではない。可能性のあるサウスブリッジ機能は、ディスクドライブのような周辺接続機構のためのATAバス16、あらゆる種類の周辺機器の接続機構のためのPCIバス18、USBデバイスの接続機構のためのUSBコントローラ19、イーサネット(登録商標)又は場合によっては他のネットワークをサポートするためのネットワークインターフェースコントローラ110、音声サポート111を含む。更に関連するものとして、標準的なノースブリッジ機能は、メインメモリ114をサポートするメモリコントローラと、ビデオサブシステムのサポートのためのアクセラレイティッド・グラフィックス・ポート15を含む。メモリは通常、種々のタイプのダイナミックランダムアクセスメモリのいずれかであるが、代替の構成では、スタティックRAM、磁気メモリ、光メモリ、又は現在又は将来的に存在する可能性のある他のいずれか適切な記憶媒体とすることができる。AGP15は、グラフィックサブシステムがマイクロプロセッサやメインメモリなどのシステム資源に高速にアクセスするようにする、チップセット内に配置された特別なポートである。種々の新しく出てきたAGP系、及びコア資源とグラフィックサブシステムとの間の対話速度を確実に加速する他の方法が存在する。この説明は、類似の機能を実行するいずれかの特定の方法に用途を限定するものではない。最後に、図2は別のコンピューティングハードウェア構成24、25を示しており、これは24と25のマイクロプロセッサそれぞれとの緩い連係を意図するものである。
【0015】
上述のように、本明細書で開示される本発明の実施形態はソフトウェアを含む。従って、図3のレイヤ図に表されるような、一般的なコンピューティングソフトウェアアーキテクチャの説明を行う。ハードウェア実施例と同様に、これらは、どのような意味においても限定するものではなく、むしろ例証に過ぎない。これは、ソフトウェア開発者が幾分異なる方法で表す傾向にあるレイヤタイプの図に特に当てはまる。この場合、O/Sカーネルから始まるレイヤを表したので、低レベルのソフトウェア及びファームウェアは省略した。発明者らの表記は一般に、レイヤ内に示されたソフトウェア要素が、その下のレイヤからの資源を使用して、その上のレイヤにサービスすることを意味する。しかしながら実際には、特定のソフトウェア要素の全ての構成要素は、完全にその様態で動作するというわけではない場合がある。
【0016】
ソフトウェアに関する注意では、図3(a)を参照すると、レイヤ31は、高度に保護された環境でコアO/S機能を提供するO/Sカーネルである。O/Sカーネルの上には、上位のレイヤにディスクや通信アクセスのような拡張機能がサービスされるレイヤ32のO/Sコアサービスが存在する。レイヤ33は、OpenGLライブラリや類似の資源の一般的な相対的位置付けを示すようにここに挿入されている。レイヤ34は、2つのレイヤ、すなわちアプリケーションフレームワークとアプリケーションサービスとして通常表される機能の融合である。説明の目的のために、これらの両方のレイヤは、ここでは35で示される最高レイヤでの常駐によってアプリケーションプログラムの高レベルで且つ頻繁な機能サポートを提供する。アイテム3100は、「Core Imaging」、ソフトウェアスーツ、モニカの相対的位置付けを示すもものであり、これは、本発明の多くの実施形態を説明するための媒体を提供する(本発明の実施形態の一部、いずれか、又は全てを含むソフトウェアスーツを意味する場合、用語「Core Imaging」を一般的に用いることにする)。
【0017】
ここで3(b)を参照すると、アイテム101は、Core Imagingスーツの相対的な位置付けを表している。図3(b)において、図3(a)と比較すると、別のグラフィック機能−合成に対してレイヤ324が加えられたことが明らかである。合成器のジョブは、多くの実施形態において説明されるようにウィンドウイングシステムにおけるウィンドウ合成と管理を実行することである。
【0018】
2.ツリーとグラフ
数学や他の計算科学において、問題を、機械実行の計算やこのような機械のプログラミングに結び付くパーズ(構文解析)方式で表することができる。パーズ表現の実施例は、図4に示されるような一般化ツリー構造である。図4を参照すると、ツリー構造41は、最も近い従属ノードの結果を表すリンク(42、43、44、45、46、47、48、49、410、411、412、413、414)と、2つのタイプのノードとから構成される。事前に存在している計算入力(例えば、オペランド)、419、424、425、426、427、428、429を表すリーフ(葉)ノードが存在する。或いは、計算関数(例えば演算子)415、416、417、418、420、421、422、423を表す機能ノードが存在する。全体的な実施例として、図4を参照すると、リンク46は、機能ノード417への入力として役割を果たし、リーフノード424の結果(単にリーフであるリーフノードの結果)を表す。
【0019】
ここで図5を参照すると、別のツリーが、円ではなく矩形のノードを使用して示されている。しかしながら、図の表示の性質は同じであり、リーフノード51はオペランドに類似しており、機能ノード52、53、54は、演算子を表し、リンク5100、5101、5102、5103、5104は、結果を表している。
【0020】
本開示の種々の箇所では、図4、5にあるようなツリーを使用し、コンピュータシステム内で使用又は組み立てられる「グラフ」のコンテキストにおけるツリーを説明する。発明者らは一般に、描写されるグラフィックツリーをコンピュータシステムが構成又は使用することを意味するものではなく、むしろ人への例証の目的で描かれるグラフィックツリーの何らかの表示をシステムが作成、保持、又は使用することを意味するものとする。
【0021】
更に、グラフィック技術やソフトウェアを説明するコンテキストにおいては、一般にツリー(又はグラフ)を使用する。アプリケーションプログラム又はプログラマの観点から、ツリー又はグラフによって定義されるイメージは、画素のアレイによって定義されたイメージとは通常区別できない。イメージの両方のタイプは、同じ最終のオブジェクトを定義し、アプリケーションプログラムがイメージと関連付けるのがオブジェクトである。幾つかの点で、同じことがCore Imaging(又は本明細書で本発明を具現化する他のソフトウェア)の観点に関して当てはまる。従って、Core Imagingは、グラフを評価することによってイメージ計算タスクを評価することができる。その点に関して、グラフのルート(根)ノードの結果は最終結果である。図4、5を参照すると、ノード415、54は、グラフのそれぞれのルートノードである。
【0022】
本発明の実施形態及びCore Imagingの説明においては、これらの例証的なツールを引用することが多い。従って、本明細書で説明される実施形態の多くに関する前置きとして、図4を参照すると、以下の関連付けは発明者らの説明のコンテキストにおいて一般に適切であり、すなわち、(i)図示されるツリーは一般に低レベルグラフと呼ばれ;(ii)機能ノード415、416、417、418、420、421、422、423は、GPUのようなマイクロプロセッサ上で実行される「カーネル」又はフラグメントプログラムを表し;(iii)リーフノード419、424、425、426、427、428、429は一般的にイメージを表し、換言すると、画素の集合又はその表現であり;(iv)リンク42、43、44、45、46、47、48、49、410、411、412、413、414は結果を表すが、実際に生じるであろうオペレーションのコンテキストでは、これらの結果は、これらを記憶するためのバッファに通常関連付けられる。
【0023】
更に、本明細書で説明される実施形態の多くに関する前置きとして図5を参照すると、以下の関連付けは、発明者らの説明のコンテキストにおいて適切であり、すなわち:(i)図示されるツリーは、一般的に高レベルグラフと呼ばれ;リーフノード51はイメージを表し;機能ノード52、53、54は、一般に事前に定義されたフィルタである高レベルフィルタを表し;リンク5100、5101、5102、5103、5104は、フィルタの結果を表すが、低レベルのグラフとは異なり必ずしもバッファに関連付けられない。
【0024】
B.プログラマの観点からのCore Imaging API
本発明の多くの実施形態は、オブジェクト指向のプログラミングを含み、4つのタイプのオブジェクトをプログラマに利用可能にする。これらのオブジェクトタイプは、イメージ、フィルタ、コンテキスト、ベクトルである。各々については、簡潔に説明するが、その普遍性を制限しないようにする。
【0025】
イメージは、レンダリングの2次元結果(画素イメージ)又はその表現のいずれかである。高レベルのプログラムオペレーションでは、当該オブジェクトが実際の画素値になるために計算を必要とすることで、イメージを表すオブジェクトが維持される場合が多い。本発明の種々の実施形態は、イメージの定義として画素値イメージと未計算のイメージのいずれか又は両方を利用することができる。特定の意味は、コンテキスト的な使用(「コンテキスト」オブジェクトへの関連性がない)からかなり容易に得られる。一般的な意味において、フィルタに関する説明の中では、イメージは、ある関数又はフィルタへの入力として解釈される必要がある。
【0026】
フィルタは、イメージに影響を与えるのに使用される高レベルな機能である。フィルタは、この開示の最後にリストされる事前に定義されたフィルタの1つ又はそれ以上を含むことができる。フィルタは、フラグメントプログラムに類似したものとすることができ、同様にイメージに(又はより正確に一般的にはテクスチャに)影響を与えるが、一度に1つの画素だけを生成する。本発明の実施形態の多くにおいて、Core Imagingは、フィルタベースのイメージ操作をコンパイルし、このような操作を、フラグメントプログラムを使用してGPU上で行うことができるようにする。フィルタとフラグメントプログラムとの間には必ずしも1対1の対応がある訳ではない。
【0027】
コンテキストは、フィルタリングオペレーションの結果が常駐するメモリ内の定義された場所などの空間である。上記で提案されたように、イメージが入力と仮定すると、コンテキストは出力と仮定される。
【0028】
ベクトルは、浮動小数点数の集合である。本明細書で説明されるほとんどの実施形態では、ベクトルは、4つの浮動小数点数に関連付けられ、各数は、同じ固定ビット数(通常は32)を有する。グラフィックでは、ベクトルを用いて、(i)画素の外観(R(赤);G(緑);B(青)、アルファ(透明性))を記述するのに必要な4次元;又は(ii)それぞれX、Y、Z、Wの2空間、3空間、又は4空間(均一)座標を記述するのに必要な2又は3次元を表すことができる。
【0029】
C.Core ImagingとCore ImagingAPI
Core Imagingは、多くのルーチンを含み、特にグラフィック機能のために構成された高レベルプログラミング言語又はAPIとして機能するが、数値計算単独(例えば畳み込みオペレーション)などの他の機能にも適用可能なソフトウェアスーツである。いずれか1つの実施形態又は実施形態のいずれかのグループに言及するためにモニカCore Imagingを使用するが、「Core Imaging」に関するどのような特定のコメントにも本発明を限定するものではない点を想起されたい。同様に、Core Imagingとして或いはCore Imaging内でルーチン又はプロセスに言及するが、それにより、本発明が単一のユニット又はレイヤとしてこのようなソフトウェアが実装されることを意味するものではない。
【0030】
Core Imagingは、グラフィックフレームワークやグラフィック固有アプリケーションサービススーツと通信するための高レベル言語又はAPIを含む。これはまた、高レベル言語からアセンブリを生成するためのコンパイラを含む。グラフィックフレームワークと従属のソフトウェアレイヤがプラットフォーム又はハードウェアの差違を考慮することができるので、言語/APIはプラットフォームやハードウェアに依存しない。APIによりプログラマは、(1)OpenGL又は類似のインターフェースによって要求される状態と他のパラメータ、或いは(2)グラフィックレンダリングを実行するGPU又は他の資源のためのアセンブリ言語を懸念することなく、イメージにエフェクトを加えることができる。
【0031】
ソフトウェアとして概念化される場合、Core Imaging(又はAPIと関連するコンパイラの実施形態)は、一般には、アプリケーションプログラムとオペレーティングシステムとの間に位置付けられるグラフィックサービスルーチンの組として見ることができる。階レイヤソフトウェアの概念化は、様々な解釈の影響を受けるので、この説明は、Core Imagingの階レイヤ化位置(又は本発明の実施形態によるあらゆるグラフィックサービスソフトウェアスーツ)を概念化するために他の方法を排除するものではない。図3(a)、3(b)を参照すると、この注意で、グラフィックサービスソフトウェアスーツ3100と3101がそれぞれ示されている。
【0032】
これらのグラフィックサービス3100、3101の位置付けは、これらのスーツがアプリケーションフレームワーク、アプリケーションサービス、グラフィック資源の構成要素を含むことができることを意味している。要約すると、この位置付けの意図は、Core Imaging3100、3101が、レイヤ35、327のアプリケーション;レイヤ34、326の他のフレームワーク又はサービス;レイヤ33、325のOpenGLなどの資源;レイヤ24の合成器;レイヤ32、323のO/Sサービスと対話することができることを意味するものである。
【0033】
一般的な意味では、グラフィックに適用されたように、Core Imagingによってプログラマとプログラムは、(1)事前に定義された高レベルフィルタを使用する、或いは(2)API又は本発明の1つ又はそれ以上の別の実施形態を使用する一連の事前に定義されたフィルタをアセンブリする、これらのいずれかによってエフェクトを実装することができる。後者の場合、プログラマ又はプログラムは、事前に定義されたフィルタのゼロ又はそれ以上の高レベルの記述のためにCore ImagingへのAPI呼出しを行う。プログラム又はプログラマは、発明者らが高レベルグラフと呼ぶデータ構造内にその高レベル記述(又はその基準)を配置する。高レベルグラフは、新しいフィルタを作成するプログラマ又はプログラムによってアセンブリされる。高レベルグラフは、事前に定義されたフィルタと新しいフィルタで用いられるイメージとの間の関係を定義する。プログラマ又はプログラムは、その高レベルグラフの構築を完了すると、新しいフィルタを作成するためのそのタスクを効率良く完了する。すなわち、新しいフィルタを作成するのに必要な情報の全ては、高レベルグラフにおいて具現化される。
【0034】
別の実施形態では、プログラマ又はプログラムがCore Imagingと協働してグラフをアセンブリするときに、作成されたグラフは、低レベルグラフ又は相当に低レベルのグラフになる可能性がある。例えば、プログラム又はプログラマの観点からは、要求は高レベルフィルタに対して行うことができるが、Core Imagingは、低レベルフィルタ又は低レベルフィルタと高レベルフィルタ間のある中間段階のオブジェクトを作成し配信することができる。プログラム又はプログラマは実際にはオブジェクトを検査しないので、Core Imagingは、低レベルコードで高レベルコードの要求に対応することができる。このようにして、Core Imagingは、プログラムが高レベルフィルタやオブジェクトと共に機能していると考えられる限り低レベルグラフをアセンブリすることができる。
【0035】
Core Imagingは、高レベルグラフ(いずれかの適用可能な入力パラメータと共に)を最終的に最適化してコンパイルし、GPU対応プログラムを得る追加タスクを有する。コンパイリングステップは、最終イメージの使用に間に合うように実行することができる。以上をまとめると、プログラマ又はプログラムは、生成し、達成するためAPIの高レベル言語(事前に定義されたフィルタを含む)を使用したが、これは種々の他のフィルタと入力から構成される本質的に新しいフィルタである。プログラマ又はプログラムはまた、プログラムによりこのフィルタをイメージに適用することができる。本発明の種々の実施形態は、GPUとCPUとの間の作業の種々の分割を企図している。一般に、CPUはCore Imagingを実行し、GPUはCore Imagingの最終製品を実行することになる。しかしながら、ハードウェア能力及び最終的な最適化に応じて、Core Imagingは、CPUとGPUのためのタスクを生成することができる。更に、システム内にプログラム可能GPUがない場合、Core Imagingは、CPUのためのオブジェクトを生成し、イメージをコンテキストにレンダリングすることができる。
【0036】
D.Core Imaging基本機能の実施形態
ここでCore Imagingの機能を更に詳しく見てみると、1つの実施形態においてAPIは、プログラマ及び最終的にはアプリケーションプログラムのユーザーのための6つの高レベル機能、すなわち、コンテキストの作成、イメージの生成、フィルタの生成、フィルタに関連したパラメータを設定する機能(例えば、フィルタ関数の引数)、アセンブリされたフィルタ又はフィルタのグループの出力を要求する機能、イメージをコンテキストにレンダリングする機能を提供する。
【0037】
1.コンテキストの作成
コンテキストを作成する機能はメモリ内のオブジェクトの定義を可能にするツールから得られるので、一般に出力はコンテキストと呼ばれる。オペレーションの結果に対するデスティネーションが存在することができるように、このようなオブジェクトの定義が必要とされる。例えば、コンテキストは、メインメモリ内のビットマップ又はOpenGLビューに関連付けることができる。これらの関連付けられたイメージコンテナは、レンダリングのデスティネーションとして使用される。本発明は、システムのグラフィック機能に関連するビデオメモリなどのメモリを第一に企図しており、ここで説明される概念は、システム内のいずれかで見出される、或いはシステムにアクセス可能なあらゆるメモリ又は記憶装置に等しく適用される。従って限定ではないが、メモリは、ダイナミックメモリ又はスタティックメモリのような全てのタイプの半導体メモリを含むことができ、これは、特にグラフィックサブシステムに関連付けられるか、グラフィックサブシステムと共用されるか、或いはメインシステム又はメインシステムによってアクセス可能な別のサブシステムに名目上専用であるか否かに関係しない。更に、速度は確かに問題であるが、本明細書の概念は磁気又は光メモリを排除するものではない。
【0038】
コンテキストを作成する実施例としては、アプリケーションプログラムは画面に最終的に何かを表示することを意図していると仮定することができる。AppleのiPhotoアプリケーションがユーザーコマンドに応答して海岸のイメージの表示を要求しているものと仮定する。iPhotoは、コンテキストの作成を要求する関数を呼び出すことによって、Core Imaging APIを利用することができる。Core Imagingは、可能な中でも特に、作成されたコンテキストの識別のハンドルを返すことになる。ハンドルが「空コンテキスト」であると仮定する。
【0039】
2.イメージの生成
一般的に入力をイメージと呼ぶ、なぜなら、イメージ内の座標又は画素は、関連性のある値が得られるようにサンプリングすることができるからである。本発明のAPIの実施形態を使用すると、イメージを、ゼロから或いは別のイメージから生成することができる。画素値を生成するメカニズムが提供されることによりイメージがゼロから生成される。例えばイメージを色又は色の数値的な組合せ(チェッカーボード又は縞模様のページのような)として単純に定義することにより、イメージをゼロから生成することができる。より一般的には、イメージは、1つ又はそれ以上のフィルタを既存のイメージに加えることによって別のイメージから生成される。
【0040】
上記のiPhotoの実施例に続いて、iPhotoは、海岸での子供の既存のイメージを取り、フィルタ(例えば、ブラー)を子供の外側のあるエリアに加えるようグラフィックサービスに要求することによって、イメージを生成することができる。このフィルタの適用により、新しいイメージが生成される。理解を容易にするために、これは、新しい画素値の計算が完了していないのではなく、ブラーフィルタがプログラムにより加えられている未計算イメージであり、画素を計算するのに必要な他のエレメントの全てが記憶又は参照されるイメージバッファ内において常駐又は参照される。
【0041】
3.フィルタの作成
一般的にフィルタを、ゼロ又はそれ以上のイメージ(最終的には画素)上で実行できるいずれかの機能と呼ぶことにする。更に具体的に言うと、フィルタは、入力としてイメージと他のパラメータ(特定のフィルタに関連付けられ、これに依存する)を受け入れて新しいイメージを生成する機能とすることができる。APIは現在のところ、この開示内容のいずれかでリストされ説明される数十のフィルタを提供する。しかしながら、本発明の実施形態は、発明者らが継続してフィルタを開発し、その上フィルタを開発するために他の機能を提供したような拡張的な性質を求めている。本発明は、事前定義タイプのフィルタの追加を可能にする拡張性を企図しており、この説明は、ゼロ又はそれ以上の事前定義フィルタの組合せと処理によって作成された新しいフィルタに注目する。
【0042】
フィルタの作成が企図される1つの方法は、プログラマ又はプログラムが、API事前定義フィルタの1つ又はそれ以上並びにプログラマが加えることを意図した他のいずれかのアイテム又は機能を共に結び付ける本発明のAPIの実施形態を用いることによって開始する。上述のように、新しいフィルタを作成するためには、プログラム又はプログラマは、使用される全イメージと事前定義フィルタの表示とこれらのオブジェクト間の関係を含む高レベルのグラフを作成する。幾つかの実施形態において、事前定義フィルタは、基本的なグラフィック機能を可能な限り包括的にするものとし、プログラマ又はプログラムがGPUのためのアセンブリを記述する必要性又は誘因を最小にする。実際、Core Imagingの全体的な利点は、特定のグラフィックハードウェアに関係なくアプリケーションレイヤでプログラムする能力である。
【0043】
新しいフィルタが高レベルグラフによって定義されると、アプリケーションプログラム又はユーザー(CPUレベルでの)は、高レベルのグラフを実装するためにCore Imagingを呼び出す(グラフによって定義される方法でグラフにおいて参照されるイメージ上で、グラフ内で参照されるフィルタに影響を与える)。もちろん、高レベルグラフは、1つより多いイメージを取り込むように記述されるが、技術は同じである。フィルタを実装する場合、Core Imagingは、フィルタが後でリストされるフィルタ定義において規定されているようなブラーのブラー半径、幾何学的パラメータ、又は他のいずれかの入力などのフィルタ指定入力を通常は有するので、他の入力データを必要とすることがある。
【0044】
Core Imagingの重要な機能は、その後で1つ又はそれ以上のオブジェクトをアプリケーションプログラム又はユーザーに返すことである。本発明の種々の実施形態によれば、返されたオブジェクトは、GPU、CPU、又はこれらの2つのある組合せでレンダリングされ、又は計算する状態にすることができる。1つの別の実施形態において、Core Imagingは、高レベル要素のためのアプリケーションプログラム要求に応答しながら、低レベルグラフの全て又は一部を構築する。この実施形態において、アプリケーションプログラムは、Core Imagingがより低いレベルのコードを供給している間は、アプリケーションプログラムがより高いレベルのコードを要求していると考えられる(アプリケーションプログラムは、Core Imagingによって与えられたオブジェクトを解析しないので、その違いを検出できない)。或いは、好ましい実施形態において、アプリケーションがコンテキスト内のイメージを要求する場合、返されたオブジェクトは、ジャストインタイムコンパイルの準備ができた最適化された低レベルグラフとすることができる。幾つかの実施形態において、Core Imagingは、ジャストインタイムコンパイルされGPUで実行される1つだけのオブジェクトを返すことになる。このようにするために、Core Imagingは、高レベルグラフを変換(及び一般的に最適化)し、イメージをテクスチャに変換する必要がある(GPUは、計算のためにイメージではなくテクスチャを使用する)。イメージをテクスチャに変換する場合、Core ImagingはCPUを用いて最初にイメージをサンプラーに変換する。サンプラーは、イメージにその状態をプラスしたものであり、サンプラーへの変換は、(i)透過、クランプ、又は複製などのラップモード、(ii)最も近い画素全体からサブジェクト画素までの値を使用すること、或いはサブジェクト画素を囲む4つの画素の格子間を補間するなどの補間モード、(iii)回転、スケール、スキュー、平行移動、ミラーなどのアフィン変換のような状態情報を組み入れるステップを含む。次いで、サンプラーは、GPUで使用するために容易にテクスチャに変換される。入力としてのこれらの全てに関して、Core Imagingを実行するCPUは、実行時には実際の画素(上記で作成されたテクスチャによって提供される)上でフィルタを実装することになるGPUプログラムを含むオブジェクトを作成する。
【0045】
次に図5を参照し、フィルタ作成の一般的な実施例に進む。iPhotoの海岸の実施例を振り返ると、ユーザーは、iPhotoに写真の自動画質向上を要求することができる。純粋に例証の目的で、自動画質向上が以下のフィルタ作成を必要とすると仮定する。これは、現在のiPhoto画質向上機能が実際にはこのようには動作しないという点で、純粋に例証のためのものである。iPhotoは最初に、その要求のフィルタを作成する。このプロセスは、この時点ではグラフ又は画素形式とすることができる基本イメージ51を割り当てるために、Core Imagingを呼び出すことによって始める。これは、図5、高レベルグラフツリー図のステップ1で見られる。次にiPhotoは、Core Imagingを呼び出し、プログラムステップ(及び対応するツリーポジション)を追加して、カラー補正フィルタ52をイメージ51に加える。これは、図5のステップ2及び高レベルグラフツリー図で見られる。図5のステップ2の出力は、プレースホルダーCC(カラー補正された)の海岸として定義される点に留意されたい。この時点では、この中間段階の結果(CC海岸)が常に存在するかどうかは不確かであるので、バッファを割り当てずに、中間段階の結果の可能性を示す高レベルグラフ内にプレースホルダーを配置する。自動画質向上機能の強化において、iPhotoは、疑似色フィルタ53を52のフィルタリングの結果に更に加えることができる。上記のように、iPhotoは、Core Imagingを呼び出して、高レベル疑似色フィルタを取得し、マウントする高レベルグラフ(及び例証の目的の図5のツリー)にこれを挿入する。次に自動画質向上機能を完成させるために、iPhotoは、53フィルタリングの結果(FC CC海岸)をオリジナルの海岸イメージ(51)で平均化するよう選択することができ、その結果、適切なフィルタ54をCore Imagingから呼出して高レベルグラフに挿入する。これは、図5のツリーグラフとサンプルプログラムステップの両方で見られる。
【0046】
実施例において、iPhotoは今や、自動画質向上の海岸イメージの要求された結果についての高レベルグラフを有する。この実施例の実施形態によるこの結果を利用可能にするために、iPhotoは、上述のように高レベルプログラムを変換、最適化、又はコンパイルするためにCore Imagingのルーチンを順次呼び出すことができる(或いはCore Imagingは単独で動作することができる)。例証の目的において、単一の形式で表現される結果(図5に類似した)が図6に表示される。フラグメントプログラム(62、63、64)は、図5に示された自動画質向上の高レベルツリーを含む高レベル事前定義フィルタに似せる必要がないことが図6で理解される。各高レベルフィルタは、その目的を果たすために1つ又はそれ以上のフラグメントプログラムを含むことができる。更に、プログラムが最適化された場合、フラグメントプログラムを置き換え、再配置、或いは削除を行うことができる。最後に、図6に示されたGPU実装は、イメージではなくテクスチャで始まり、物理的な場所(バッファ−それ以上プレースホルダーはない)に結果を配置することによって終了することが分かる。
【0047】
4.フィルタのための設定値
上記で参照されたように、各高レベルフィルタは、上記のように作成されるか、或いは本明細書のリストで事前に定義されるかに関わらず、必要とされ且つフィルタ機能によって定義される入力値のセットを有することができる。海岸の実施例においては、一般的な入力を表すためにベクトル"パラメータ(X、Y、Z、W)としてこれらの入力パラメータを示した(図5を参照)。別の一般的でない実施例は、ブラーフィルタであり、入力パラメータとしてほぼ確実にブラーの半径が必要となる。更に他の実施例は、入力カラー、入力の強さ、入力飽和度などである。(コンテキストにおけるより多くの実施例のフィルタのリストを参照。)Core ImagingのためのAPIは、これらの入力パラメータの設定機能をプログラマ及びプログラムに必然的に提供し、イメージの予測可能な作成又は編集を可能にする。
【0048】
iPhotoの海岸の実施例を参照すると、写真のエリアにブラーを行った。正確な入力パラメータは特定のブラーフィルタに依存することになり、iPhotoは、ブラーの半径を供給する必要性が高い。
【0049】
5.フィルタの出力要求
1つの実施形態において、特定のフィルタに対するグラフが存在すると、プログラム又はプログラマは、そのフィルタを出力するためにCore Imagingを呼び出すことができる。これに応じて、Core Imagingは、ジャストインタイムコンパイル、次いでGPU上での通常の実行の準備ができたオブジェクトを作成する。高レベルフィルタのこの出力は、単に未計算の又は代表的なイメージである。別の実施形態において、Core Imagingは、この時点でグラフの最適化或いはイメージの計算のいずれかを行うことができる。最適化には処理サイクルが必要とされ、計算は処理サイクル及びメモリを用いることになるので、多くの場合、前者の最適化の実施形態が好ましい。これらの資源は通常、イメージをコンテキストにレンダリングする必要があることを確認するまで保存するのが適切である。
【0050】
一般的により好ましい実施形態(メモリとプロセッサ時間を節約する)においてiPhotoの実施例を参照すると、iPhotoは、Core Imagingを呼び出して、ジャストインタイムコンパイル及び実行の準備ができた未計算イメージを生成する。
【0051】
a.フィルタ出力を作成することに対する注意
多くのグラフィック処理エンジンと同様に、Core Imagingは、1つだけのカラー空間、例えば「ライトリニア」で動作するように構築される可能性が高い。従ってグラフを処理するために、幾つかの実施形態では、カラー空間をライトリニアに変換する必要があり、結果を返す前にカラー空間をその元のカラーに変換して戻さなければならない。幾つかの実施形態において、この変換は、高レベルグラフの入力と出力に適切なカラー変換高レベルフィルタを配置することによって、高レベルグラフ上で行われる。別の実施形態においては、これは、低レベルグラフ上で極めて類似の方式で行う。低レベルグラフの場合、カラー変換のための「カーネル」又はフラグメントプログラムノードは、グラフの入力と出力に配置される。ノードがグラフ(高又は低レベル)に配置されるほとんどの実施形態では、この状況は、そのカラー変換ノードの結果が今後極めて有用となる可能性が高いことを決定付ける。従って、カラー変換ノードの結果は、ほとんどの実施形態でキャッシュしなければならない。カラー変換のためのグラフノードを作成する代替の方法は、このような変換をCore Imagingルーチンの1つにプログラムすることである。
【0052】
6.コンテキストへイメージをレンダリング
最終的に、ほとんどのイメージはディスプレイのような視覚的用途のために生成される。従って、イメージ生成のこの実施形態における極めて一般的なステップは、イメージをある定義されたコンテキストにレンダリングする段階を呼び出すことである。ほとんどの実施形態において、Core Imagingは、この時点でグラフの最適化を実行することになる。要約すると、最適化は、以下のいずれか又は全てを含むことができ、すなわち、(1)低レベルグラフを作成する段階、ここで概念化の目的において、グラフのノードはフラグメントプログラムを表し、低レベルグラフはイメージとフラグメントプログラムとの間の関係を定義する(これは、イメージと高レベルフィルタさらにその内部関係を含む高レベルグラフと対照的である)、(2)定義ドメインに対する最適化段階、(3)関心領域に対する最適化段階、(4)フラグメントプログラムを組み合わせて、グラフのサイズ又は最終的にはその実行が必要となるメモリ空間を低減させる段階、(5)最適化された低レベルグラフの実行要件を常駐ハードウェア(GPU、CPU、メモリなど)と比較する段階である。最適化されると、低レベルグラフはコンパイルされ、1つ又はそれ以上の実行可能なオブジェクトが作成される。説明されたように、一般的にはGPUのための1つの実行可能なオブジェクトが存在するが、最適化又はコンパイル中に、複数のプロセッサを用いることを決定することができる。コンパイル後、結果として得られたオブジェクトが実行され、イメージが指定コンテキストにレンダリングされる。
【0053】
再度iPhotoの実施例を参照すると、画面上にイメージを配置するためには、iPhotoがCore Imagingを呼出し、オブジェクトを画面にレンダリングする。一般的な実施形態では、このステップは、イメージ内の関連する画素の全てに対してGPUコードを実行し、拡張写真イメージを生成する段階を含む。イメージは、画面ディスプレイと関連付けられたバッファ内に該イメージを配置することによって画面上に配置される。
【0054】
E.最適化
最適化は、タスクが実際に実行されたときに最も効率良く或いは容易に実行されるように、プログラム又はタスクを解析し変更するプロセスである。本明細書で説明されるほとんどの実施形態のコンテキストでは、1つのマイクロプロセッサを使用して別のマイクロプロセッサのためのプログラムコードを最適化するよう試みている。更に特定の実施形態において、システムCPU資源を使用して、GPU上で実行されるプログラムを最適化しようと試みている。また更に特定の実施形態において、グラフとして表されたグラフィックタスク(通常はイメージへのエフェクトの適用)を解析したCPUはグラフを最適化し、グラフがジャストインタイムコンパイルされたときにGPU上で最も効率良く実行するようにする。
【0055】
発明者らは、汎用及び特殊コンテキストの両方で最適化及びコンパイルを説明してきた。上記の開示事項の範囲を限定することなく、最適化のための4つの異なる汎用技術のいずれか1つを含む、Core Imagingの実施形態を説明する。これらの4つの汎用技術は、中間段階の結果のキャッシング、定義ドメインに対する計算と記憶の制限、関心領域に対する計算と記憶の制限、グラフを縮小又は簡略化するためのグラフ再書き込みである。
【0056】
最適化はCPUサイクル、GPUサイクル、メモリ空間のような現実世界のアイテムにおける節約を扱うので、通常は導入した最も低いレベル(ハードウェアに最も近い)の概念例証ツールに関連した最適化技術を説明することになる。そのツールが低レベルグラフである。しかしながら、これらの技術は、概念化の単一のレベルに限定されたものと見なすべきではない。実際、これらの技術を、例示的な抽象概念の高レベルと低レベル(例えば高レベルのグラフ又はコンパイルコード)での効率を適用し実現することができる。
【0057】
開示される最適化技術は、種々の順序及び、シーケンシャル技術が一度に1つのノードに或いはグラフのセクションに再帰的に加えられる混成順序で用いられる場合にでも有用であ。しかしながら、最も分かり易く説明するために、図7に示されるような論理シーケンシャル順序で技術を導入する。ここで図7を参照すると、Core Imagingは、ステップ7100でアプリケーションプログラムからグラフィックタスクを受け取る。タスクが低レベルグラフで未だ具現化されていない限り、ステップ7101において、Core Imagingは低レベルグラフを作成する必要がある。次にステップ7102で、Core Imagingは、ノード低減解析を行い、可能であればノードを除去する。不要な(又はコラプス可能な(collapsible))ノードが最適化されるとCore Imagingはステップ7103に進み、ここでバッファのサイズとイメージ入力を最終的に制限するために最適化が行われる。このステップは、定義ドメイン(「DOD」)と関心領域(「ROI」)と呼ばれる2つの領域を交差する段階を含む。ROI/DOD最適化後、グラフは、ステップ7104でコンパイルをする状態にある。最後に、全てのこの上記の作業がCPU上で実行されると、プログラムは、レンダリングのためにGPUに送られる(全体を通して説明したように、幾つかの実施形態では、グラフの一部をコンパイルして更にCPUに送ることができる。)
【0058】
上述の最適化技術を説明する場合、より深く理解するためにグラフにおけるノードの実施形態を用いることができる。低レベルグラフのノードに関して説明するが、この概念は、どのような類似の説明にも当てはまる。ここまでは、機能、フィルタ、フラグメントプログラムとしてノードを説明してきた。しかしながら、グラフの解析を行うためには、より具体的でより豊富な情報を有するノード表現が必要である。従って本発明の種々の実施形態では、要望又は必要に応じて、低レベルグラフノードは、以下の関連する情報すなわち(i)説明されているフラグメントプログラムのようなプログラム、(ii)サンプラー(状態付きイメージ)と1つ又はそれ以上のベクトル(ベクトルは浮動小数点数の集まりであることを想起されたい)を含むプログラムのための引数、(iii)ノードの出力の定義ドメイン、(iv)出力形状が与えられた場合のノードの入力形状の正確な予測をもたらすROI関数(両方の形状は、座標系、恐らくは同じグローバル座標系で定義される)を有する。
【0059】
1.中間段階の結果のキャッシング
最新のコンピューティングに内在する理由から、アプリケーションプログラムは、同一又は類似のイメージの計算を何度も要求する場合が多い。アプリケーションプログラムはまた、以前に計算されたイメージのサブセット又はスーパーセットであるイメージの計算を要求する場合が多い。この理由のために、Core Imagingは、不必要な作業をさせないためにキャッシング技術を利用する。ほとんどの実施形態において、グラフノードはキャッシュ管理のためのベースを形成する。詳細には、図5のツリーによって表されるような高レベルグラフを説明したことを想起されたい。同様に、図4や図6に示されるツリーのように概念化することができる低レベルグラフについても言及している。幾つかの実施形態において、グラフ内の各ノードは不変であり、その下のグラフの部分によって定義(すなわちノードを解くのに必要なオブジェクト及び計算)されると仮定する。このように仮定すると、発明者らはノードの結果(通常はイメージ)をキャッシュし、次いで同じノード(その下のグラフの和として定義される)が再計算される待ち行列にあるかどうかを判定することができる。ノードを再計算するのではなく、メモリから結果を単にフェッチしてもよい。種々の実施形態によれば、これは全ノードに対して行うことができる。メモリを効率的に使用するために、様々なタイミング(例えば、メモリ使用量が多い場合、又はキャッシュされた入力が古い場合、又は関連するアプリケーションプログラムがクローズした場合、又はシステムがシャットダウンした場合)でキャッシュの削除を選ぶことができる。更に、メモリを効率的に使用するために、別の記憶装置を使用することができる。ほとんどの実施形態においては、ビデオサブシステム又はGPUに割り当てられたスタティックメモリ又はダイナミックメモリが主として使用されている。しかしながら、システムメモリ、ハードドライブ、或いはシステム又は場合によってはネットワークアクセス可能な記憶装置内の他の磁気メモリなど、どのようなアクセス可能な記憶装置内にこれらのキャッシュを配置するように選択してもよい。
【0060】
種々の実施形態において、キャッシングは、最適化中(例えばCPU上で)、レンダリング中(例えばGPU上で)、又は両方のタイミングで利用することができる。
【0061】
2.グラフを低減又は簡単化するためのグラフ再書込み
本発明の幾つかの実施形態で利用される別の効率化技術は、不要なノードを削除することによってグラフを最適化することである。成功すると、これは、一般的に一時イメージ全体及びこれに応じたバッファの必要性が排除されるので、その節約において重大な意味を持つ。更に、ノードの統合又は削除は、実行中の処理サイクルを節約することになる。
【0062】
統合のために、Core Imagingは、削減することのできる隣接するノードのペアを見つけなければならない。一般的に2つのノードは、1つのノードの出力が第2のノードの入力である場合には1つに減らすことができる。例えば、ノードアルファの出力がアルファバッファとして定義され、ノードベータの入力がアルファバッファに格納されたテクスチャである場合、2つのノードは結合することができる。
【0063】
コンピューテーションサイクルの点では、2つのノードを結合できるかどうかを判定することは、比較的高コストの解析となる可能性がある。従って、2つのノードを結合できるかどうかに関する判定を行う際にその判定をキャッシュすることができる。明確にするために、幾つかの実施形態では、肯定的な結果と否定的な結果の両方をキャッシュすることで、プログラムは、キャッシュされた結合を見つけるためだけでなく、結合が不可能であるか否かを判定するためにもキャッシュを用いることができ、その結果、解析を行う時間が無駄にならないようになる。例示的な実施形態が図8に示されている。結合照会8100の実施において、第1ステップ8101で、これらのノードでの解析の結果が以前に行ったものでありキャッシュに常駐しているかどうかを判定する。従って、ステップ8101でシステムは、事前に解析された結合結果のキャッシュをチェックする。更に、説明しているルーチンは通常CPU上で実行しているので、このキャッシュは多くの実施形態においてシステムメモリを使用する。最後に、キャッシュにタグを付ける方法の実施例として、1つの実施形態において、キャッシュキーは4つのデータの要素、すなわち(1と2)2つのノードプログラムの表示、(3)従属ノードプログラムからの出力を受け取る上位ノードプログラムのテクスチャユニットインデックスの表示、(4)出力値を範囲0,1にクランプする必要があるかどうかを指定するブール値の表示を有する。
【0064】
ステップ8101に戻ると、この決定ステップで3つの可能な経路が存在する。第1に、結果をキャッシュすることができ、ノードを結合することができる。この場合、制御はステップ8103に進み、キャッシュ結果を使用して結合が行われる。次いで制御はステップ8104に進み、次のノードを見つけて解析する。第2に、結果はキャッシュされるが、ノードは結合されない。この場合、制御は次のノードステップ8104に直接進む。第3に、最終的には結果はキャッシュ内に存在しない場合がある。この場合、制御はステップ8102に進み、提案されたノードの結合が可能であるかどうかを判定する。ステップ8105で示されるように、結合が可能であるか否かに関係なく、結果はキャッシュされる(結合が不可能であるか、又は結合が可能であるかを示し、結果を記憶する)。ステップ8012で、結合が可能である場合には、ステップ8106で行われるが、実際には、幾つかの実施形態では解析中に結合を行う。結合が行われた後、制御は次のノードのための8104に進む。最後に、結合が不可能であるとステップ8102が判定した場合、制御は次のノードのためのステップ8104に進む。
【0065】
3.2つのノード結合の実施形態
図4及び図9を参照し、ノード415、420が結合できるか否かをCore Imagingが解析すると仮定する。ステップ9100で始まると、ほとんどの実施形態において、Core Imagingは、ノード415の出力がノード420の入力に事実上十分に近い場合にこれらのノードを結合しようとする。多くの実施形態において、ノード415の出力は、出力バッファが入力テクスチャの常駐する場所に存在するはずである点において、ノード420の入力と同じでなくてはならない。しかしながら、別の実施形態において、Core Imagingは、このような出力と入力から正確な結果が得られ、或いは更に別の実施形態では正確に近い結果が得られるほど十分に類似しているかどうかを評価することができる。
【0066】
決定9100に戻り、それぞれの出力と入力が十分類似していない場合、ノードはステップ9103に示されるように結合されない。しかしながら、それぞれの出力と入力が十分類似している場合には、制御はステップ9101に進み、第2ノード(この実施例ではノード420)に関連したフラグメントプログラムの各ラインをチェックする。ラインチェックについては後述するが、このプロセスのレベルでは、各ラインは、ノード415と420の結合の可能性を否定しないことを確認するためにチェックされると仮定する。更に、結合を容易にするために些少の変更が幾つかのラインで行われる。従って、ステップ9101でのラインチェックがノード結合を否定する結果をもたらす場合には、ノード415、420は、ステップ9103で示されるように結合されないことになる。或いは、ステップ9101でのラインチェックがノード結合の可能性を継続して示す場合には、制御は、ハードウェアが結合されたノードを扱うことができるか否かを判定する、決定ステップ9102に進む。一般的な意味で、これは、メモリ、いずれかのマイクロプロセッサの特性、又はシステム状態などのシステム内の何らかのハードウェア制限を意味する可能性がある。更に特定の意味において、ほとんどの実施形態は、必要なルックアップ又はレジスタが多すぎるかどうかを確認するために常駐GPUの能力のチェックだけを必要とする。明らかに、(エミュレーションが使用されない場合)常駐ハードウェアがノード415、420の結合を処理できないとステップ9102が判定した場合には、ステップ9103で示されるように結合を行うことはできない。或いは、ハードウェアが結合されたノードを扱うことができるとステップ9102が判定した場合には、制御は、一連のタスクがノードの結合を終了し始めるステップ9104に進む。
【0067】
ステップ9104で、ノードのためのプログラムコードが実際に連結される。ステップ9105で、標準的なプリコンパイラ・オプティマイザープログラムが適用される。これは、本発明の幾つかの実施形態の主題である最適化ではない。これは、容易に利用可能なプリコンパイル最適化ルーチンである。次にステップ9106で、レジスタを割り当てる命令が適用される。最後にステップ9107で、結果が今後の結合解析のためにキャッシュされる。
【0068】
この実施例を説明する場合、第2プログラムの各ラインのチェックであるステップ9101に僅かな注意しか払われていなかった。ここで図10を参照し、更に詳細にこのプロセスを調べることにする。ステップ10107で、Core Imagingは、解析のための次のプログラムラインを探す。次のラインは、第2ノード420を表すプログラムの第1ラインとすることができる。制御は決定ステップ10100に進み、ここでCore Imagingは、プログラムラインにローカル変数があるかどうかを判定する。このようなローカル変数がある場合、該ローカル変数は、第1プログラム(この実施例でノード415を表すプログラム)のローカル変数と競合しないようにリネームする必要があるので、制御はステップ10101に進む。幾つかの実施形態において、全てのローカル変数は、各フラグメントプログラムにおいてゼロから始まる連続した整数で番号が付与される。従って、第2フラグメントプログラム(ノード420を表す)のローカル変数をリネームする際に、(1)第1の新しい名前は、第1プログラムの最も大きな番号が付けられたローカル変数に単に加算することによって得られ、(2)次のローカル変数は、基本名として第1リネームローカル変数を用いて順次名前が付けられる。
【0069】
プログラムラインのローカル変数がリネームされると、制御は決定ステップ10102に進み、ここでCore Imagingがプログラムラインにおいてテクスチャ基準を捜す。リネームが必要なローカル変数がない場合には、決定ステップ10100もステップ10102に至ることは注目に値する。いずれの場合でも、決定ステップ10102でCore Imagingは、プログラムラインにおいてあらゆるテクスチャ基準を捜す。テクスチャ基準が見つからなかった場合、制御は決定ステップ10105に進む。テクスチャ基準が見つかった場合には、制御はステップ10103に進み、見つかったテクスチャ基準が第1ノード(415)の処理のプロダクトであるかどうかを調べる。見つかったテクスチャ基準が第1ノードの処理のプロダクトでない場合、制御はステップ10108に進み、必要に応じてテクスチャをリネームする。
【0070】
見つかったテクスチャが第1ノードの処理のプロダクトであると仮定すると、制御は、ステップ10103からステップ10104に進み、そのテクスチャを単一の画素に置き換える。一般的な意味では、フラグメントプログラムが入力のテクスチャ全体と出力のバッファ全体を有するときには、フラグメントプログラムは一度に1つだけの画素を処理するので、1つのテクスチャを単一の画素に置き換える。従って、Core Imagingが2つのフラグメントプログラムを結合又は連結することになる場合、これらのプログラムは、結合されたプログラムの拡張された長さ全体にわたり同じ画素を渡すために書き換える必要があり、単一の(結合又はそれ以外の)フラグメントプログラムによって生成された中間バッファは存在できない。結果として、幾つかの実施形態においてステップ10104は、サブジェクト入力テクスチャに対するどのような基準も排除し、これをオペレーション中の画素を保持するレジスタ基準と置き換える段階を含む。ステップ10104が終了した後、制御はステップ10108に進み、必要に応じてテクスチャをリネームする。
【0071】
テクスチャのリネームは、ローカル変数リネームと同じ原理とプロセスであるので、追加のコメントは実質上必要ではない。テクスチャリネームが行われた後、制御は決定ステップ10105に進む。
【0072】
決定ステップ10105では、Core Imagingは、レジスタによって識別された入力テクスチャの画素に対する何らかの基準をチェックする。このステップを詳細に説明するために、第2ノード(420)への入力テクスチャはテクスチャアルファであったと仮定する。また、テクスチャアルファは、レジスタベータの画素を優先してプログラムから書き出されたと仮定する。ステップ10105で、Core Imagingは、レジスタベータに記憶された画素ではなく、テクスチャアルファの画素に対する何らかの基準を捜している。これは、2つのフラグメントプログラムの結合がテクスチャアルファ(中間イメージ)の生成を排除することになり、更に実行時において、テクスチャアルファに対するシステムだけの基準がレジスタベータ内の単一の画素になるためである。従って、第2ノード(420)のベースにあるプログラムがレジスタベータの画素以外の画素に対する実質的な基準を有する場合には、結合が生じることはできず、ステップ10106で示されるように中止されるはずである。このような画素に対する基準が存在しない場合、プログラム制御はステップ10107に進み、次のラインに移る。
【0073】
本明細書で説明されるプログラムステップをレビューする場合、説明される機能と変更を有するコードのラインを処理するための多くの方法がある点に留意されたい。例えば、プログラムは、各ラインで一度に1つの項目を調べて特定の項目について全てのオプションにわって処理し、その後、単一のラインが終了するまで同じラインの次の項目に移ることができる。別の実施例では、プログラムは第1項目を読み取ることができ、それがローカル変数かどうかをチェックし、ローカル変数である場合これをリネームし、これがテクスチャ基準であるかどうかをチェックし、そうである場合にはこの基準が第1プログラムの出力に対するものであるかどうかをチェックし、以下同様である。重要なのは、開示された技術を考えると、熟練のプログラマであれば解析し、ラインチェックを進める方法を決定することができるということである。
【0074】
4.定義ドメインに対する計算と記憶の制限
一般的な意味では、イメージは、これらが存在する座標系以外の何れによっても境界付けられない。ほとんどの座標系では、この「境界」は有用な制限を加えない。従って、イメージを考察する場合、発明者らはその定義ドメインを考慮することができる。イメージの定義ドメインは、イメージが定義される全ての場所の表現である(すなわち名前「定義ドメイン」)。定義ドメインに関して考察する実用的な方法は、明示的に定義され且つ透明でないイメージの全ての場所の表現としてのものである。定義ドメインの1つの実施例は、全ての不透明な画素が存在する幾何学形状である。
【0075】
最適化技術を開発する場合、定義ドメイン(「DOD」)は、DODの外側の画素を計算又は描画する必要がないので魅力的である。従って、グラフを最適化する場合、ルートノード(最も高いノード、例えば図4のノード415)のDODを最初に計算する段階において用途がある。ルートノードのDODを有する場合、ノードの実質的な結果をその形状に交差させ、DODの外に常駐する実質的な結果の全ての部分をレンダリングタスクと描画タスクから除去することができる。残念ながら、ノードのDODは、必ずしも利用可能ではなく、このような場合、DODは有限とみなす必要がある。
【0076】
一般的な意味では、ルートノードのDODは、グラフの底部から上向きに伝播させることによって計算される。図4を参照すると、リーフノード424、425、426、427、428、429から始めることによってルートノード415のDODを計算する。リーフノードが既に定義されているイメージを表現するので、これらは、より低いノード(実際的な問題として、リーフノードは通常、グラフでの読み取りコマンドである)に関係なくDODを有することができる。より高レベルのノードのDODは、ノードへの入力とノードが実行する機能を使用して計算される。幾つかの実施形態の実施において、システム内の各ノードタイプは、その利用可能な入力を考慮してDODを決定するための関数呼び出しを有する(これは、ノードがその出力DODを含むことができる以前のステートメントをビューする1つの方法である)。別の実施形態において、最適化プログラムは、最適化中にDOD自体を計算する。また別の実施形態において、幾つかのノードに対するDODは最適化中に直接計算され、他のノードは、関数を呼び出すことによって間接的に計算される。例えば1つの実施形態では、簡単なノード(入力と出力の形状が同じであるノード)に対するDODを直接計算することができ、且つ難しいノード(入力と出力の形状が変わるノード)に対しては関数呼び出しを行うことができる。例証としてDODの計算を極めて要約して評価する。
【0077】
DODのこの計算は、解析されるノードのタイプに応じて僅かに異なる。例えば、ノード418の関数が単にカラー変換である場合、ノード417のDODは、リーフノード424のDODと同じになる。この同じ実施例は、入力イメージDODの形状(すなわち、範囲変更、カラー空間変換、イメージ色調)を変化させない全オペレーションに当てはまる。しかしながら、幾つかのノードは、いずれも複数の入力を有するので、或いは関数が入力ノードのDODの形状を変える(例えば、幾何学的変化)ので、計算がより複雑になる可能性がある。最初に複数のノード問題をみると、ノード417、418、419に対するDODは既に有しており、ノード416に対するDODを計算するものと仮定する。ノード416に対するDODは、入力ノードのDODの単純な関数であり、通常は入力ノードのDODの結合又は交差のいずれかである。結果のDODが、交差、結合、又は幾分複雑な関数であるかどうかはノードの関数に依存し、どのようなプログラマも評価しやすい。
【0078】
DODを計算する際、関数によって引き起こされるイメージ形状の変化は更なる検討を必要とする。これらのタイプの関数は、限定ではないが、関数の純粋なオペレーションに起因してイメージが形状を変化させるブラー(ブラー又はスケールオペレーションなど、通常ブラーはイメージをより大きくすることになる)のようなアイテムを含む。或いは、関数は、イメージを単に再配向(回転、オフセットなど)する。そのオペレーションは座標系内のロケーションを変えるだけである。いずれの場合においても、ほとんどの実施形態は、何らかの利用可能な入力に応じて出力に対するDODを呼び出す関数を要求することになる。あらゆる熟練のプログラマはこのような関数を記述することができる。
【0079】
最後に、幾つかのノードは定義されたDODを持たないことを想起されたい。このような場合、ほとんどの実施形態は、DODの値として無限を割り当てることになる。
【0080】
5.関心領域に対する計算と記憶の制限
ノードに対するDODを有する場合、次に、関連するノードの関心領域(ROI)を決定する。要約すると、関心領域は、所与の出力DODを計算するのに必要な入力イメージの部分である。従って、各ノードはその出力上にDODを有し、各入力に対するROIを有する(グラフをビューする際に、リンク毎にROIとしてこれを概念化することができる)。ROIの実施例として、「大きな矩形」である入力イメージと「小さな矩形」である出力DODを備えたブラーであるノード関数を仮定する。このブラー用のROI関数は、入力イメージ「大きな矩形」のどの部分が出力DODのブラー結果の部分を計算するのに関係するかを定義する形状を返すことになる。このROI領域を理解することの重要性は、発明者らは単に入力イメージの関連部分を記憶する必要があるに過ぎず、中間段階の結果(及び同様に最終結果の幾つか)を記憶するためのメモリが節約され、最終的に無関係とすることができる画素にエフェクトを加える処理時間が節約されることである。例えば、リンク46で発生するはずのバッファは、ノード24の出力DODとノード17のROIの交差である関連の結果を記憶することのみ必要とし、このような交差は、最適化された結果の領域である。
【0081】
DOD計算のように、幾つかの実施形態の実施において、ノードのROIを決定するために関数が使用される。またDODと同様に、幾つかのROIは、これらがノード両端のリンク上に見られる値に単に同一であるので容易に決定される。例えば、リンク45が「アルファ」のROIを有し、且つノード417がカラー変換である場合には、リンク46に対するROIもアルファであるが、ノード417がブラーである場合には、リンク46に対するROIを決定することは、より難しい(これは、アルファとは異なる可能性が高く、恐らくは小さい)。幾つかの実施形態において、ノードに関連する関数は、決定が難しいROIを解決するために呼び出される。別の実施形態において、最適化ルーチンは、最適化中にROI自体を計算する。更に別の実施形態において、幾つかのリンクに対するROIは最適化中に直接計算され、他のリンクは、関数を呼び出すことによって間接的に計算される。例えば、1つの実施形態は、易しいリンク(入力と出力形状が同じリンク)に対するROIを直接計算することができ、難しいリンク(出力形状が入力形状と異なるリンク)に対し関数呼び出しを行うことができる。例証として、ROIの計算について極めて簡潔に説明することにする。
【0082】
DOD計算と同様に、ROI計算はグラフツリーを介して伝播させる必要があるが、下のルートから上を意味する(DODのように上のリーフからではない)。Core Imagingがグラフィックタスクの実行することを求められる場合、要求エンティティが出力に対するROIを提供するので、ルートノード(例えば415)は既知であると仮定することができる。他のROIを決定するためには、単にグラフツリーから後方へ伝播するだけである。例えば、入力/リンク43に対するROIを計算するためには、結果における「既知の」ROIと415の関数とを考慮する。
【0083】
6.ROIとDODの例示的な実施形態
上記で説明されたように、アプリケーションプログラムは、Core Imaging APIを使用して高レベルグラフを構成する。これらのグラフの1つを使用するか、或いは他の手段により、アプリケーションプログラムのプログラマは、グラフィックタスクの実行をCore Imagingに依頼することができる。図11(a)を参照し、タスクは結果ROIを描画するものであると仮定する。図11(b)を参照すると、Core Imagingに対する第1タスクは、ステップ11100で低レベルグラフを作成することである。低レベルグラフ(図11(a)にツリーで示される)の作成にはより多く関わっているものがあるが、この実施例の目的においては、グローバルDOD(ルートノード116のDOD)を含む出力DODがこのステップ11100の最後のノードで計算され表現されることを認識することだけが重要である。次にステップ11101で、Core ImagingはグローバルDOD及び結果ROIの交差を求める。便宜上、これを「結果交差」と呼ぶことにする。
【0084】
次いで、Core Imagingは、決定ステップ11102に進み、調べるべき更なるノードがあるかどうか判定する。この決定11102は、熟練したプログラマには明らかである何らかの適切な方法で行うことができる。調べるべき更なるノードがない場合、プログラムは、ステップ11103でこの最適化タスクを終了し、ジャストインタイムコンパイルの準備が整う。「更にノードがあるか?」決定11102に戻り、最適化すべき更なるノードがある場合、Core Imagingは、次のノードの入力に対するROIを求める。ツリー歩行においてどれが次のノードであるかを決定するための種々の公知の方法があるので、ここではその話題については説明しない。
【0085】
図11の実施例の目的のために、ノード116(すなわちルートノード)に対する入力ROIを計算するタスクに関して、ノード116に留まり、ステップ11104に留まる。上記で説明されたように、これは、直接或いは関数を呼び出すことによって決定することができる。いずれの場合も、リンク114、115に対するROIが決定され、グラフに挿入される。
【0086】
ROIがノード116の入力に対して決定された後で、Core Imagingは、決定11102に戻り、クエリー「更にノードはあるか?」に答える。ノードがまだある場合、Core Imagingはステップ11104に進みノード115の入力ROIを決定する。ノード113がリーフノードであり入力を持たないので、ノード113についてのROI計算はない点に留意されたい。従って、入力ROIがリンク118、112に対して決定されグラフに挿入される。
【0087】
Core Imagingはステップ11102に戻り、更にノードがあるかどうかを判定し、ノードある場合には再度ステップ11104に進み、ノード114に対するROIを決定する。112はリーフノードであり、そのため計算は必要ではない点に留意されたい。111に対するROIが決定されグラフに入力される。
【0088】
制御は決定ノード11102に戻り、もはやノードがないことを判定する(ノード111はリーフである)。Core Imagingはステップ11103に進み、終了する!
【0089】
グラフはROIとDODに対して最適化されているが、ノードの統合やキャッシングのような他の最適化は、この上にレイヤを形成することができ、或いは同時に実行できる。
【0090】
7.再帰的実行の実施形態
上述のように、プログラマは、種々の順序で最適化技術の編成の効率を求めることができる。しかしながら、本発明の幾つかの実施形態は、グラフの一部分だけにわたる定義シーケンスにおける技術の1つ又はそれ以上を実施する。特に、同じ(又は類似の)プログラムシーケンスは、グラフの一部分に対し一度に1つの部分を再帰的に加えることができる。この方法は、メモリ再使用及びシーケンシャル処理(ある程度までの)に対する機会を提供することによって、効率の向上を可能にする。簡単にするために、キャッシングの概念はこれらの実施形態の説明から大部分が省かれている。しかしながら、本明細書の開示事項が与えられると、当業者であれば、キャッシングステップを実装する必要がある場合を理解するであろう。
【0091】
例証のために、図12を参照すると、結果に到達するための本発明の再帰的実行の実施形態についてのフローチャートが示されている。別の言い方をすれば、実施例の目的はルートノードを計算することである。ステップ12100で、Core Imagingは、ルートノードを隣接するノードと結合しようとする。ノードが結合できる場合、そのプロセスは、各入力リンクに沿った複数のノードをルートノードにできる限り吸収するように実行される。制御はステップ12101に進み、ここでCore Imagingは、(できる限りマージされた)ルートノードに対するDODを決定する。DODが既知である場合、制御はステップ12102に進み、ここでROIがルートノードへの子リンクについて計算される。ROIとDODを有する場合、この2つは、結果領域を決定するために交差させることができる。制御はステップ12104に進み、ルートノードの入力に対するテクスチャを作成する。これらの入力テクスチャは、ルートノードをレンダリングするために必要である。しかしながら、多くの場合ノードの入力テクスチャは未計算であり、グラフによってのみ表現される。このような場合、Core Imagingは、この実施例で説明されるステップに類似のステップを各従属ノード上で再帰的に処理しなければならない。従って、図12に示されるプロセスはネストされた方式で加え、グラフを下に移動し、ルートノードを計算するために最終的には解決する必要のあるノードを解決する。別の言い方をすると、ノードを解決するためのプロセスは、ルートノードへの入力のためのテクスチャを計算するのに必要な全ノードを制御が解決するまでネストされた方式で加えられる。ルートノード入力テクスチャが計算された後で、制御は、結果に対するバッファの作成のステップ12104に進む。最後に、制御はステップ12105に進み、ここでGPUが結果をステップ12104で作成されたバッファにレンダリングするのに使用される。
【0092】
再帰的プロセスに焦点を合わせるために、上記説明からキャッシングの概念が故意に省かれていたことを理解されたい。しかしながら、キャッシングは、ノード結果とノード結合の解析と結果を限定ではなく含む、種々の場所で利用することができる。
【0093】
更に別の再帰的に処理される実施形態が、図13にフローチャートで示されている。図13を参照すると、ステップ131は、ルートノードの計算に取り組んでいることを示している。その際に、ステップ132では、ルートノードを隣接するノードと結合することが可能かどうかを判定する。ステップ133に従って、結合が可能である場合、結合が行われ、更なる結合が可能ではないと判定されるまで継続して結合を行う(ステップ131、132、133を介して)。このような判定の後で、制御は、DODとROI最適化のステップ134、135に進む。次に、決定ステップ136は、ルートノードをレンダリングすることが可能かどうかを判定する。ルートノードへの入力の全てが計算された場合のみルートノードをレンダリングすることが可能になる。従って、決定136への答えがノーであると仮定すると、制御は、ルートノードを求めるのに必要な紛失子テクスチャ(missing child texture)を生成するタスクのためのステップ1310に進む。1310の下の次のプロセスがルートノードを求めるプロセス全体に極めて類似していることは注目すべきである。特に、サブノードとルートノードを求めるために同じルーチンが使用される。しかしながら、これらのルーチンは、グラフの複数のノードを求めるためにネストされた方式で呼び出すことができる。或いは、これらのルーチンは、一度に幾つかのノード、関係のないグラフの偶数ノードを求めるために並行して実行することができる。
【0094】
ここでステップ1311に戻り、次の子ノードを決定する必要があり、解析する次のノードを単に適切に選択する。ステップ1312、1313は、ステップ132、133に類似する。ステップ1314、1315、1316は、ステップ134、135、136に類似する。ステップ1317は、ステップ137、138に(略して)類似する。ステップ1319は、サブノードがその入力テクスチャが利用不能であるためにレンダリングできない場合、次のノード(ステップ1311)はネストされた演算処理で計算される可能性があることを示している。同様にステップ1318は、ノードが求められてレンダリングされた後にレベルをネストしていない可能性を示している。
【0095】
最終的に、ステップ1311で、求めるべき子がない場合、制御はステップ137、138に進み、ここでバッファがルートノードの結果に対して形成され、ルートノードがコンテキストにレンダリングされる。
【0096】
更に別の実施形態又は再帰的オペレーションにおいて、図4、14を参照し、図4に示されたグラフをCore Imagingによって最適化及びレンダリングしなければならないと仮定する。ルートノード415から始めて、Core ImagingはグローバルDODとのグローバルROI交差を計算することによってステップ14100で開始する。制御はステップ14101に進み、次のノードがあるかどうかを判定する。次のノードがない場合、処理はステップ14106で示されるように完了する。しかしながら、この場合、ルートノード415は次のノードである。制御はステップ14102に進み、入力リンク42上のノード415に対する入力ROIを得る。このような入力ROIを取得すると、制御は決定14103に進み、415/ROIの結果がキャッシュ内にあるかどうかを判定する。415/ROIイメージがキャッシュ内にある場合、制御は決定ブロック14101に戻り、処理すべき更なるノードがあるかどうかチェックする(その結果がキャッシュ内で見つかった場合は、システムは見つけたノードの下の全グラフを処理する必要がないことを想起されたい)。この場合において、415/ROIの結果がキャッシュ内に存在せず、制御がバッファ割り当てステップ14104に進んだと仮定する。このステップで、バッファが定義され、415入力ROIのサイズに割り当てることができる。次いで、制御は決定ステップ14105に進み、ノード(415)がこの時点でレンダリングすることができるかどうかを判定する。実際には、これは、直前で定義されたバッファにノード415をレンダリングするコマンドとすることができる。
【0097】
図4から分かるように、ノード415はルートノードであり、レンダリングする準備が整っていない。ステップ14105でYの決定を後で処理する。ノード415はレンダリングする準備ができていないので、制御はステップ14107に進み、次の隣接するノードをノード415にコラプス(collapse)されるかどうかを判定する。このステップではシステムは、ノード415を次の隣接するノードにコラプスされる(上記で詳述されたように)かどうかを判定しなければならない。本明細書の他の場所でも説明されるように、結合決定とオペレーションは第2キャッシングシステムを含み、システムは、2つのノードをコラプスされるかどうか、その場合、コラプスの結果をルックアップすることができることができる。
【0098】
ステップ14107での決定に戻り、415が隣接するノードに結合できる場合には、制御はステップ14112に進み、結合が行われる。次いで制御はノード14101に戻り、ここで解析のための次のノードが新たに作成される415。結合が不可能であることをステップ14107が判定した場合には、制御は決定ステップ14101に戻り、解析のための次のノードを決定する。幾つかの実施形態の実施において、ステップ14107での「NO」はノード415をそのまま残し、ステップ14101への戻りは、ネストされた方式で次のノード上でルーチンを実行する。ネストは無限に深く進むことができ、最終的には次のノードステップ14101でネストを解除する(一度に1つのネスト)ことによって解くことができる。
【0099】
次にステップ14101に戻り、次のノードが420であることを判定して、制御はステップ14102に進み、ノード420に対する入力ROIを検索又は計算する。ROIが決定されると、制御は決定ノード14103に進み、ここで420/ROI結合がキャッシュ内でチェックされる。キャッシュミスがあると仮定すると、制御はステップ14104に進み、バッファが割り当てられる。次いで制御は、ステップ14105に進み、レンダリングが可能であるかどうかの決定を行う(この場合も実際にはこれは、単に420をレンダリングしようとする試みとすることができる)。図4は、ノード420がレンダリングできないことを示しており、その結果、制御はステップ14107に進み、ノードのコラプスの可能性に関して判定する。判定がやはり否定であると仮定すると、制御はステップ14101(幾つかの実施形態においてはルーチンの第2ネストのためのもの)に戻る。
【0100】
14101で、次のノードはノード422であると決定される。入力ROIがステップ14102で求められ、制御はステップ14103のキャッシュチェックに進む。ここで、ノード422とその下の全てが解決され記憶されるようなキャッシュヒットを有すると仮定する。次いで制御はステップ14101に戻り、ここで次のノードはノード421になる(ノード420は、リンク49に続くツリーの小さな部分によりレンダリングできないままである)。421に関しては、入力ROIがステップ14102で求められ、決定14103でのキャッシュミスを仮定する。ステップ14104で、421ROIに対するバッファが定義され、ステップ14105で、ノード421がレンダリングすることができることが分かる(ノード427、428はツリーリーフ又は入力イメージであるので、ノード421のレンダリングを妨げない)。
【0101】
ノード421をレンダリングする能力を考慮して、制御はROI/DOD最適化のためのステップ14108に進む。ここでノード421の出力DODをノード20の入力ROIと交差させ、レンダリング中に書き込まれることになる最終のバッファのサイズを最小にする。幾つかの実施形態では、ステップ104で行われたバッファ設定を調整する。次いでノード421はコンパイラに渡され(ステップ14109)、コンパイルされた結果がレンダリングされる(ステップ14110)。レンダリングの後で(又はこのプロセスの幾つかのポイントで)、多くの実施形態は、バッファによって発生するメモリ使用量と、その空間を自由に又は再利用するよう設定することができるか否かを再検討することになる。この考察はステップ14111において表す。
【0102】
制御はここでステップ14101に戻り、ここでノード420がレンダリングの準備ができていることが最終的に判定されることになる(ステップ14105)。レンダリングが上記で説明されたように行われることになり、最終的に制御は、ノード410の検討のためのステップ14101に戻る。ノード410/ROIがキャッシュされると仮定すると、レンダリングは最終的には結果ノード415上で行われることになる。
【0103】
F.簡単なコードの実施例
例証として、以下は、Core Imaging APIが簡単な露出フィルタにどのように用いることができるかを示すコードの実施例である。
【0104】
【表1】
【0105】
同様に例証として、以下は、本発明の実施形態によるフラグメントを結合する実施例である。
【0106】
【表2】
【0107】
G.Core Imagingが作成するCPUコードとGPUコード
高レベルフィルタ結合をコンパイルする際に、Core Imagingは、レンダリング中に実行するための複数のオブジェクトを生成する。Core Imagingのこの特徴は、複数の異機種プロセッサを備えたシステムに広く適用可能である。例えばこれは、ジャストインタイムコンパイルを行い、航行中の航空機で行われる天気予報計算を分割するのに有用である。ジャストインタイムコンパイルにより、効率アルゴリズムがどの処理資源を使用するかを判定する際に航空機(飛行中)の状態を考慮に入れることができる。この一般的なプロセスは、7つのステップに要約できるが、効率的なシステムでは、これらのステップのサブセット上で動作することができ、すなわち、(1)プロセッサ、コントローラ、メモリ空間などのどの資源が有功に利用可能であるかをチェックする;(2)資源の各々の能力を評価する;(3)各資源の動作状態をチェックする;(4)現在のタスクの要件を評価する;(5)利用可能な資源の一部又は全てに関してタスクの要件を解析する;(6)システム内のハードウェア使用量の全体的な効率を高めながら(一般的にはタスクによって使用される資源を低減させるが、恐らくは十分に利用されていない資源又は使用されていない資源を用いる)、タスクの要件を満たすようにソフトウェアを最適化しコンパイルする;(7)コンパイルされたコードを実行する;である。実施形態によっては、1から5までのステップを実行時又は実行前に行ってもよいが、ステップ6と7は、実行時又は実行時の近くで行う場合にプロセスにおいて最も有用である点は注目すべきである。
【0108】
ハードウェア能力、タスクの特性と困難度、作業の効率的な分割を決定する際のリアルタイムの状態を考慮することができるこのプロセス(全体又は短縮型)に対し実質上無限のアプリケーションが存在する。これらの実質上無限のアプリケーションにも関わらず、Core ImagingがCPUコードを作成する3つの一般的な理由がある。その1つは、CPU上でGPUをエミュレートするためであり、これは後で説明する。二番目の理由は、オフラインレンダリングを行うためにCPUを使用することにより効率が厳しくなるためである。最後の理由は、タスクがGPUのハードウェア能力を越える場合のような絶対的な必要性のためである(これも後の部分で幾分説明する)。
【0109】
第1及び第3の理由を他の箇所で説明するので、ここで第2の理由について実施例を提供して簡潔に説明する。複数のプロセッサに対する最も重要な恩恵は、並行して作動する能力である。アプリケーションプログラムが、フィルタリングルーチンのシリアルアプリケーションを必要とするタスクを提示する場合には、並行処理は最も容易に設定される。一例として、図15(a)を参照すると、6フレームシーケンス上でシリアルに動作するCPUとGPUのタイミングを示すチャートが示されている。この実施例の目的のために、各フレームにシーケンシャルに加えられる2つのエフェクトがあり、CPUが第1のエフェクトを加え、GPUが第2のエフェクトを加える。GPUはフレーム1を始め、GPUはアイドル状態又は他の動作中である。第1エフェクトがフレーム1に加えられた後、フレームは、第2のエフェクトを加えるためにGPUに渡される。GPUは第2のエフェクトをフレーム1に加えるときには、CPUは第1のエフェクトをフレーム2に加えている。プロセスが続行し(チャート15(a)に示される)、簡単な並行処理を使用してハードウェアを極めて効率的に利用し、2つのエフェクトをストリームに迅速に加えるようになる。図15(b)と図15(c)を参照すると、4つのプロセッサ(図15(b))又は2つのプロセッサ(図15(c))のいずれかで4つのエフェクトを加えることに関する効率を伝える類似のチャートが示されている。図15(c)でのネストが多くの方法で配置され、どのような数のエフェクトをどのような数のプロセッサにも加えることができることは注目すべきである。効率は、エフェクトの適用をシリアル化することで実現される。効率は、各エフェクトに対して必要な作業がタスクを実行するプロセッサに最適である場合に更に向上させることができる。例えば図15(a)で、CPUが第2エフェクトを加えるために好適である場合には、CPUとGPUとの間で処理するフレームの順序が逆にされる。
【0110】
H.エミュレーション:Core Imaging生成CPUコード
上記で説明されたように、過去数年の間、フレキシブルなグラフィック関連ハードウェアとソフトウェア技術は、本発明の多くの実施形態のような有用な技術のベースを発展させ提供してきた。特に、OpenGLとプログラム可能GPUなどの技術の出現は、本明細書で説明される技術革新の多くに対するツールを提供した。しかしながら、これらのツールは、必ずしも後方互換性があるものではなく、利用可能なインフラストラクチャ(例えばプログラム可能GPU)がないため、Core Imagingの機能の全てがあらゆるプラットフォームで実行可能な訳ではない場合がある。従って、Core Imagingのサービスに依存するプログラマ又はプログラムが存在する場合、これらのプログラマ又はプログラムは、Core Imagingのサービスの一部又は全てが利用可能でない場合に特定のプラットフォーム上で損なわれる可能性がある。
【0111】
実際的な実施例として、Core Imagingの機能などを提供するためにオペレーティングシステムを設計する場合、恐らくは、本明細書の実施形態の多くで説明されるような高レベルグラフィックの呼出しを行うようにアプリケーションが設計される。しかしながら、新しいオペレーティングシステムが用いられるとしても、古いコンピュータでこれらのアプリケーションを実行しようと試みることを想定した場合には問題が生じる。具体的には、Core Imagingに対して呼び出しが行われ、GPUが通常通りにレンダリングを行う場合に問題が発生する。この理由のために、Core Imagingの機能の全て又は最大限があらゆるプラットフォームでも利用可能にすることができるように、Core Imagingがエミュレーション機能を備えるのが有用である。
【0112】
従って、非常に高レベル(システム機能)であることにより、必須ではないが、エミュレータが極めて有効となるタイミングがあることを知ることができる。しかしながら、Core Imagingの従来の適用性は、この開示事項の誘因となるが、本明細書の革新性はこれに限定されない。従って、エミュレータを用いることができるより詳細な状況に関して、説明を簡潔に行うものとする。特に発明者らは、プログラム可能GPU又はどのようなGPUも無い場合のエミュレータの有用性を既に指摘した。しかしながらこれに加えて、GPUを含むシステムでもエミュレーションの有益な用途を有する場合がある。特に、問題であるのは、特定のGPUの資源の限界を越える可能性があることである。例えば最新のGPUでは、2048×2048を越えるイメージは一般に大きすぎる。更に、正確な結果を得るには、CPUを必要とする可能性がある(現在ATIから入手可能なような幾つかのGPUは、24ビット浮動小数点だけを使用する)。当然、特定のグラフ又はノードを求めるためにエミュレータが役立つことができる多数の他のハードウェア制限及び場合によっては低レベルのソフトウェア検討事項が存在する。
【0113】
1.エミュレートの決定
エミュレートを行う決定は、ホストシステムの特性とエミュレーションの事由に応じて種々のタイミングで行うことができる。例えば、プログラム可能GPUサポートがないシステムでは、ソフトウェアスイッチは適切なグラフィック呼出しをエミュレートするように構成を恒久的に設定することができる。或いは、Core Imagingが特定のタスクに対して呼び出された後でこの決定を行うことができる。この場合、タスクの特性は、常駐GPUの特定の機能を考慮するだけでなく、場合によってはプロセスの状態やハードウェア項目を考慮する。幾つかの特定の実施形態において、Core Imagingは、グラフィック呼出しの時点でエミュレーションに関する決定を行う。このような実施形態の幾つかにおいては、エミュレーションは、常駐GPUが存在しないか、或いは常駐GPUがプログラム可能でない場合に使用される。これらの実施形態の他のものでは、グラフ最適化が少なくとも部分的に加えられた後で決定が行われ、GPUが特定のフラグメントを処理できないか、或いはこのような特定のフラグメントはCPU上でのエミュレーションにより処理する方が賢明であるかが判定される。更に別の実施形態において、エミュレートの決定は、グラフィック要求のソース又は出力のデスティネーションに依存する。これは、グラフィック要求に対する全体のシステム応答をメモリオペレーションの速度を向上させることによって改善することができるためである。例えば、Core Imagingが結果をシステムメモリにレンダリングするよう求められる場合、エミュレーションはCPU上で行われることにより、その最終的なデスティネーションは、エミュレーションに関する1つの要因である。メインメモリへのアクセスは一般的に、GPUからよりもCPUからの方が高速である。同様に、ビデオRAM内のメモリオペレーションは一般にGPUからの方が高速になる。従って、Core ImagingがVRAMにレンダリングするよう求められる場合、これはGPUを使用する傾向への要因である。
【0114】
2.ソフトウェアスタックでのレイヤとしてのエミュレーション
図3(a)、3(b)を参照して、エリア3100、3101におけるサービスを一般に提供するCore Imagingを説明した。Core Imagingエミュレータの多くの実施形態において、OpenGL36又は320のレイヤに存在するサービスに言及することができる。従って、これらの実施形態のエミュレータは、OpenGLでのほぼ同じレベルでサービスを提供する。これは、エミュレータがOpenGLの下位のサービスを提供する別の実施形態との違いである。この違いは、1つには、前の実施形態がOpenGLの(又は同様の状態にあるサービス)機能のサブセットだけに関するエミュレーションを提供することによって性能を達成することによって生じる。別の実施形態において、エミュレータはOpenGL(又は類似の)実装の一部とすることができる。更に別の実施形態において、エミュレータは、OpenGL(又は類似のサービス)の下位とすることができ、より包括的な適用範囲を提供することができる。当然、これは性能を犠牲にする可能性がある。
【0115】
本発明のエミュレータ実施形態の説明の際に、実施形態の2つのセットに関する更に具体的な説明を行うものとする。実施形態の1つのセットは、GPUプログラム(例えばフラグメントプログラム)をターゲットの1つ又は複数のCPUのための機械コードに直接コンパイルする段階を含む。実施形態の第2のセットは、各GPU命令が高レベルプログラミング言語(3のような)における関数によってモデル化されるバイトコード仮想マシンを含む。実施形態のいずれのタイプにおいても、必須ではないが、低レベルグラフから始めるのが好ましい。更に、上記で説明されたようなグラフ最適化は、ノード、メモリ、計算を低減させることができるので、やはり最適化されたグラフから始めるのが好ましい。エミュレータはノードの一部とすることができるフラグメントプログラムで動作するので、エミュレータタスクは、上記で説明されたグラフウォーキングと解像技術の下位にレイヤされるものと見なすことができる。
【0116】
I.GPUプログラムの機械コードへの直接コンパイル
エミュレートの決定が行われると、多くの実施形態は、CPU対応プログラムの以下の汎用プロセスを使用する。上記の説明から、GPUコードによる開始を仮定することは明らかなはずである。更に詳細には、これは通常、グラフのノードに関連付けられたフラグメントプログラムとすることができる。各フラグメントプログラムは、1つ又はそれ以上のGPU命令を有する。(これらはラインと呼ぶ場合がある。)次いでプログラムの各ラインは、CPU等価命令に翻訳される。追加命令を含むラインのような多くのラインは、単一の命令CPU均等物を有することができる。他のラインは、フラグメントコードの単一のラインが複数のCPU命令に翻訳する必要がある点で高度なエミュレーションを必要とする。翻訳のいずれかのタイプ(1対1又は1対多)は、熟練したプログラマが理解できるどのような種類の方式でも達成することができる。1つの好ましい実施形態において、命令翻訳は、大きな「if」文によって行われる。別の実施形態において、テーブルやルックアップは、GPU命令を等価の1つ又はそれ以上のCPU命令に位置合わせするために使用される。
【0117】
翻訳ステップ中、GPUコードは、どのようなレベルのGPU命令からもあらゆるレベルのCPU命令に翻訳することができる。例えば、翻訳はGPUアセンブリからCPUアセンブリに行うことができる。1つの好ましい実施形態において、翻訳は、GPUアセンブリと、現行の実装ではバイナリであるCPU機械コードとの間で行われる。
【0118】
プログラムがCPU命令として表現されると、コードをアンロール(展開)することができる。コードアンローリングと最終的な命令スケジューリングは、命令レベル並行処理(「ILP」)を利用するかなり標準的な最適化技術である。ILPの一般的な目的は、ソフトウェア命令によって利用されるハードウェア並行処理の量を増大させることである。これが達成される1つの方法は、性能を最大にするために命令を再配置することである。更に具体的には、相互依存のない命令のグループを並行して実行することができる。ループアンローリングは、ILP技術のクラスであり、ループに固有の並行処理を用いることによって効率が向上する。これは、単一のフラグメント、或いは詳細にはそのCPUエミュレート等価物が多数の画素を解像するために極めて多くのループを実行する(1つの画素につき1ループ)ことになるので、グラフィックオペレーションにおいては重要である。ループアンローリングでは、ループのnインスタンスがアンロールされ、すなわち、ループコードのnインスタンスがプログラムラインに書き込まれる(例えば、ループに10のラインがあり、nが4である場合、40ラインのアンロールドコードがあることになる)。最後に、アンロールドコードは、この形式で実行するようにセットアップする必要があり、これは、変数のインクリメントやループを再始動させるブランチ又はgotoコマンドへの調整が必要となる場合があることを意味している。アンローリング後、次にプログラムスケジューリングを使用して、サブジェクトハードウェアでの最大並行処理のためアンロールドコードを最適化する。アンロールドコードが最終的に実行される場合、オリジナルループの回数のn分の1だけのループを必要とし、各新しいループは遙かに少ない機能停止事象で実行される。
【0119】
アンロールされると、コード上での次の3つのステップは、標準的な最適化、レジスタ割り当て、プログラム/命令スケジューリングである。熟練したプログラマであれば、これらのステップの全てをどのように実行するかを理解するであろうが、ごく簡潔な説明を行う。この説明は網羅的或いは排他的ではない。言及されない多くの技術が存在することができる。更に、言及する技術の全てが提示するカテゴリの下で行われない場合もある。標準的なプログラム最適化は、コード短縮や重複除去などの多くの技術によって時間とメモリ性能を向上させることを目的としている。レジスタ割り当ては、競合を避け、使用されるレジスタの数を最小にし、出力エフェクトのない命令を拒否するように実行される。最後に、プログラム/命令スケジューリングは、特定のハードウェアのパイプライン及び並行処理のためのコードを最適化する。
【0120】
この時点までに多くを達成している場合、コードは今後このようにキャッシュされるので、この作業は不要である。
【0121】
1.特定の実施例の実施形態
図16を参照すると、本発明のエミュレータの実施形態のサンプルプログラムフローが示されている。プログラムフロー及び説明は、例証のためだけのものとする。実際の実施形態は、フラットなフローチャートでは容易に説明できないオブジェクト指向手法を用いることができる。
【0122】
ステップ161を参照すると、プログラムは、通常多角形として境界付けられるイメージのレンダリング又は生成を要求するためにCore Imagingを呼び出す。制御は決定162に進み、ここでエミュレータを利用する必要があるかどうかが判定される。エミュレータが利用されない場合、この例の目的において、制御はステップ164に進み終了する。勿論、開示事項は他の場所でエミュレーションに対する代替形態を説明する。
【0123】
エミュレーションを利用するための考慮事項について上記で説明したが、ステップ162がエミュレータを使用することを決定し、制御はステップ163に進み、ここでデータがCore Imagingの他のルーチンからエミュレータにプッシュされると仮定する。詳細には、このデータは、サブジェクトフラグメントプログラム、フラグメントプログラムをレンダリングするのに必要なテクスチャ、ローカル変数、状態である。これらの項目がエミュレータに利用可能になった後、制御は決定165に進み、CPU機械コードがこのタスクのために既に作成されたかどうかを調べる。フラグメントプログラムは、キャッシュへのインデックスとして使用される。しかしながら、キャッシュを実装するための種々の方法がある。ある実施形態においては、キャッシュルックアップは、必要なデータの全てについてのフォーマットを含むことができる。例えばキャッシュは、出力の画素フォーマット(1画素につき32ビット、RGBAなど)、/又は各テクスチャの画素フォーマットや状態などの情報を記憶しているテーブルから入力することができる。
【0124】
決定165に戻り、キャッシュヒットがある場合、制御はステップ169にスキップする。例証を完全にするために、キャッシュミスを想定すると、制御は、GPUフラグメントコードをCPUコードへ変換するステップ167に進む。この変換のための技術は上記で説明されているので、この課題に対しては簡潔に対応する。ほとんどの実施形態において、このステップ167は、変換、アンロール、標準的な最適化、レジスタ割り当て、プログラム/命令スケジューリングの全てを行う。しかしながら、別の実施形態は、どのステップが既に完了しているかに応じて、多少の機能を実行することができる。同様の注意点が次のステップ168にあてはまり、ここでCPUコード結果がキャッシュされる。ほとんどの実施形態はバイナリ機械コードをキャッシュし、熟練のプログラマであればより少なく処理された結果をキャッシュする事由を理解することができるであろう。
【0125】
ここでステップ169に移ると、機械コードは、画素評価のためのN長ループに配置される。このループのジョブは、L画素を評価することである。好ましい実施形態において、Lは128である。本明細書で説明される本発明はLのほぼどのような値にもあてはまり、本発明者らは、その実施において128のL値が種々の検討事項(テクスチャルックアップによって引き起こされたより大きなオーバーヘッドによって、部分的なブロックを扱うことによって一度に多くの画素を処理したいという要求)のバランスをとる際の最適な性能をもたらすことが分かった。従って、ステップ169のループがL画素を評価することである場合、アンロールドコードは、LをNで除算したものに等しい回数分ループしなければならず、ここでNは、アンロールドコードで表現されるループの反復数である。最終的にはNはL/nに等しい。従って、全ループにつき128画素の好ましい実施形態が利用され、4つのアンロールド反復を想定する場合、アンロールドコードを32回ループしなければならない。
【0126】
ここでステップ1610に移ると、エミュレータによりスラブが生成される。好ましい実施形態において、これは関数呼び出しにより達成することができる。用語「スラブ」は、グラフィックアートにおいて比較的一般的な意味で使用される。しかしながらこの実施形態においては、スラブは、出力多角形上の全頂点で水平線を引くことによって形成される。例えば図17を参照すると、図17(a)には傾いた矩形とスラブに分割された同様の傾いた矩形が示されている。図17(b)では、同じ関係を有する2つの台形を示しており、一方は描かれたスラブを伴って示されている。
【0127】
スラブが生成された後、制御はレンダリングのためのステップ1611に進む。好ましい実施形態において、スラブは一度に1つレンダリングされる。特に、各スラブは、スラブの走査線上で見られるLの連続した画素上で、ステップ169で作成された画素ループを実行することによってレンダリングされる。更に詳細には、多角形は、(i)第1スラブを選択する段階(X、Y、Zグローバル座標系を想定し、好ましい実施形態ではセクションが最も小さな値から最も大きなY値に進むことができる);(ii)このような第1スラブ上で第1走査線を選択する段階(X、Y、Zグローバル座標系を想定し、好ましい実施形態ではセクションは最も小さな値から最も大きなY値に進むことができる);(iii)ステップ169で作成されたループを使用して走査線の第1のL画素をレンダリングし、次いで走査線が全てレンダリングされるまでこのステップを繰り返す段階;(iv)スラブ内の全走査線が終了するまで次の走査線(L画素の部分を含む)に進む段階;(v)同様の方法で全ての後続のスラブを完了する段階によってレンダリングされる。更に、L画素のCore Imagingの選択がサービス要求者(例えばアプリケーションプログラム)に任されるので、幾つかの実施形態では、レンダリングされた結果を1つ又はそれ以上のバッファに一度に1画素ずつ書き出す。次いで、最終的な結果が、望ましいピースで要求デスティネーション内に配置することができる。例えば、結果は、L画素の終了後、或いは全部分(スラブのような)の終了後、或いは全多角形の終了後に要求デスティネーションに移動させることができる。この追加のステップはまた、フォーマット変換(バッファと要求されるデスティネーション間)のようなどのような後処理に対しても好都合な場所を作成する。
【0128】
走査線全体に渡るレンダリングを説明する際に、画素カウントがLの倍数でない走査線の処理に関する疑問が生じる可能性がある。熟練したプログラマは、このケースを実施するための種々の方法を考案することができるが、本発明の幾つかの実施形態では、図16に示されるプロセスのフレームワーク内でこの問題を考慮する。1つの特定の実施例では、ステップ169の画素ループは、ある変数(例えばアルファ)に従って何度もループする。従って、128画素でループが4回アンロールされる場合、アルファは32になる。しかしながら、48画素しかない場合(例えば、走査線全体で128ビットの数グループを処理した後)、アルファは12に設定することができる。或いは、66画素の場合、アルファは、第1の64画素の処理のために16に設定することができ、次にアルファは65番目の画素と66番目の画素を処理するために1に設定される。要約すると、これらの実施形態は、ルーピングを制御するために変数を使用すること、様々な量の画素を処理するためにその変数を調整することを必要とする。
【0129】
L画素の非倍数を処理するための別の方法は、様々な量の画素に対しアンロールドコードセグメントを提供する。例えば、メインループが4アンロールドセグメントを有する場合、3つのアンロールドセグメント、2つのアンロールドセグメント、1つのアンロールドセグメントで作成されたコードも存在する。従って、3つの画素がある場合、3画素コードを使用できる。1つの画素がある場合、1画素コードを使用できる。
【0130】
前述の技術を組み合わせた実施形態もある。例えば66画素がある場合、アルファは、最初の64画素を処理するために16に設定され、次いで2画素コードを65番目と66番目の画素を処理するために実行される。或いは、67画素の場合、アルファは、最初の64画素を処理するために16に設定され、次いで1画素コードを65番目、66番目、67番目の画素を処理するために3回実行される。
【0131】
2.スラブ
多くの実施形態がスラブを使用する。スラブの代わりとして、説明された同じ方法で全多角形をレンダリングすることができる。しかしながら、スラブは、テクスチャ計算において有意な利点を提供する。特に、出力多角形の頂点に対してテクスチャ座標が知られている。ほとんどの実施形態において、これは、上にあるレイヤ(例えばグラフオプティマイザ)がこの情報を提供することによる。しかしながら、通常ハードウェアは、その基本ユニット多角形(一般に三角形)の頂点を関連するテクスチャマップにマップすることができ、ハードウェアの基本ユニット多角形の頂点は、出力多角形の頂点と一致しなければならない。図17(a)、図17(b)を参照すると、これらの頂点は、円形のドットで示されている。図17(a)、図17(b)を再度参照すると、スラブが形成される場合、スラブは通常、オリジナルの多角形上の頂点ではない1つ又はそれ以上の頂点を含む。図17の全てにおいて、これらの「新しい」頂点は三角形で示されている。従って、1つ又はそれ以上の実施形態において、スラブが形成されると、新しい頂点のテクスチャ値(図17の三角形)を種々の技術によって計算する。幾つかの実施形態では、既知の多角形頂点から座標値を補間することによって新しい頂点のテクスチャ座標を計算する。好ましい実施形態において、直線補間を用いて、分割スラブの端部まで補間される。その結果、各スラブは、既知のテクスチャ座標で3つ又は4つの頂点を有する。スラブの頂点での3つ又は4つの既知の座標で、スラブ上のどの画素のテクスチャ値も、補間、又はより詳細には直線補間のような数学的手法によって求めることができる。
【0132】
最終的に、スラブは多角形より小さいので、スラブはテクスチャ値の極めて容易な計算を提供する。詳細には、ここまで説明されたように、スラブは結果として得られる多角形の一部を含み、三角形又は4つの側面を有する多角形のいずれかとして生じる。三角形の場合、全頂点についてテクスチャ座標が既知であると、いずれのポイントの座標(及び最終的には値)も数学的(例えば、補間又は直線補間)に計算することができる。更に、スラブが多角形である場合、プログラムは、複数の数学的手法を使用して、多角形の点のテクスチャ座標を考案することができる。例えば、幾つかの実施形態ではプログラムは3つの頂点を選択し、直線補間を実行する。
【0133】
スラブの利点は、種々の形状によって実現される。例えば幾つかの実施形態において、結果として得られる多角形は、レンダリングのため全て三角形に分割することができる。これは、常に3つの頂点だけが存在するという点でテクスチャルックアップを簡素化することができる。従って、4つの側面がある多角形のどの3つの頂点を補間のため使用すればよいかに関して決定する必要性がない。更に、熟練したプログラマであれば本明細書で教示されている概念を他の方式に適用することができ、これによって結果として得られる多角形は、レンダリングのために分割される。
【0134】
3.テクスチャルックアップ
例えばスラブや多角形の頂点のコンテキストにおいてテクスチャルックアップを説明した。ここで、開示されてきた実施形態の幾つかに効率的にテクスチャルックアップを組み込む方法に関してより詳細に説明する。最初に、テクスチャルックアップの2つの関連するタイプを述べ、次に前述の説明に類似する可能性のあるコンテキストを提供することによって、この詳細な説明の裏付けを与える必要がある。
【0135】
エミュレーションタスクにおいて、遭遇する可能性のあるテクスチャルックアップの2つの一般的なタイプがある。公知のテクスチャへの座標である独立したテクスチャルックアップがある。例えば独立したテクスチャルックアップは、既知のテクスチャでの所与の座標を参照するコードにおける場所である。或いは、ある他の項目又は事象に依存するテクスチャルックアップである従属テクスチャルックアップが存在し、そのため、座標は通常レジスタ内にプログラムによって配置される。例えば、これは、所与のテクスチャへの座標がレジスタ内で見られるコードの場所とすることができる。テクスチャルックアップは、レジスタを読み込むことができるある他のオペレーションの結果に依存する。
【0136】
テクスチャルックアップ技術のためのコンテキストを設定する場合、種々の実施形態のために説明されたエミュレータのメインループ内の動作をより詳細に調べる。詳細には、これは一般に169のような図16に関して説明するループに類似している。この類似性及び図16を参照することによって、ステップ169でループをセットアップする際に、128画素の処理に影響を与えるためにループ内にアンロールドコードを単に配置する以外に達成すべきことがある。特に、画素の各グループ(スラブ、走査線、又は好ましくはL或いは画素の残りのグループ)について、コードをセットアップしなければならない。上記で説明されたように、コードのセットアップの部分は、走査線が128の倍数でない画素長(L)を含む場合、コードは残りの画素を考慮に入れることができるものとすることができる。更に、コードは、テクスチャルックアップに対しセットアップすることができる。
【0137】
ここで、テクスチャルックアップのサブジェクトに直接的を絞ると、エミュレータの好ましい実施形態は、テクスチャルックアップのメインループをセットアップする。1つの実施形態において、このようなセットアップは、L画素毎に行われ、独立と従属テクスチャ基準に対して別々にセットアップする段階を含む。これらの実施形態では、セットアップ中に各独立したテクスチャ基準は、好ましくは同じステップでルックアップされる。また、各従属テクスチャ基準では、従属性が満たされた後でルックアップを行うためにコード中に関数が挿入される。理解し易いように、関数呼出しは、各ルックアップに対してコードに挿入される。関数は、プログラムでの従属テクスチャ基準によってアクセスされるまで、テクスチャユニット毎に作成される。テクスチャルックアップ関数に渡される唯一の値は、ルックアップのための座標と使用するテクスチャである。更に正確には、コードのこの挿入された部分は、ループの外側で呼び出すことができ、このような関数は、本質的にGPUテクスチャルックアップ機能をエミュレートする。1つの好ましい実施形態において、ループ内部からの関数呼出しは、テクスチャ、状態、座標を渡し、関数はベクトルを返す。しかしながらこの関数呼出しは、他の方法で実装してもよい。
【0138】
4.セットアップ
発明者らは既に幾度もコードのセットアップを説明してきたが、幾つかの例示的な実施形態を提供する。例えば、所与の実施形態において、各多角形についてセットアップされるコードの部分と、各スラブのためにセットアップされる部分、各走査線のセットアップの部分と、各画素グループ(例えば、L又は残りのグループ)に対してセットアップされる部分が存在することができる。所与のセットアップでの種々のアクティビティは、本明細書での他の説明から外挿することができる。
【0139】
J.複数のCPU
前述の実施例に類似する技術に従う実施形態は、複数のCPUに極めて良好に適合する。これは、ステップ169(図16)で作成されたループ機械コードが種々のスラブ又は種々の多角形上で別々のインスタンスにおいて実行できるためである。特に、Core Imaging又は別の適切なプログラムは、プロセッサ間でタスクを分割することによってマルチプロセッサシステム上でのグラフィックレンダリングの速度を大幅に高めることができる。好ましい実施形態において、各プロセッサに送られることになるタスクのインクリメントは、スラブ(又は他の細分化されたもの)である。しかしながら、インクリメントは、より小さいもの(例えば走査線)又はより大きいもの(例えば全多角形)であってもよい。
【0140】
K.バイトコード化仮想マシン
仮想マシンはまた、CPU上でGPUコードをエミュレートするのに用いることができる。仮想マシンは、命令を受け取りプロセッサ資源を別のプロセッサにエミュレートすることができる点で、ハードウェアのように動作するプロセスである。一般的な意味で、仮想マシンエミュレータソリューションの利点は、仮想マシンがよりポータブルであることである。特に、仮想マシンは高レベル言語で記述することができ、次いでどのようなプラットフォームにもコンパイルすることができる。或いは、GPUプログラムを機械コードにコンパイルする実施形態は、各ハードウェアプラットフォーム用に特注とすることができる。
【0141】
1つの好ましい実施形態では、本発明は、バイトコード仮想マシンエミュレータを必要とする。形容詞「バイトコード」は、コンパイルされたコード、或いは幾つかの実施形態の場合においてハードウェアが受け入れるものに類似した低レベルのコードを仮想マシンプロセスが受け入れる意味が付加される。高レベルでは、仮想マシンは、GPU対機械コードエミュレータを説明する実施形態でのCPUに類似している可能性がある。より詳細には、仮想マシンは、上記で説明されたより高レベルの機能と技術の下に存在しているものとして概念化できる。従って、上記で説明されたエミュレーションや他の方法と技術の全ては、開示される仮想マシンエミュレータに類似しこれに適用することができる。しかしながら、独立した考慮事項に値する仮想マシン実施形態の興味深い態様がある。
【0142】
1つの実施形態において、仮想マシンは、出力画素を構築するための極めて大きな仮想レジスタを含む。特にハードウェアの制約が無ければ、仮想マシンは、効率などの他の基準の要求を満たすレジスタサイジングを使用することができる。従って幾つかの実施形態において、仮想マシンは、L画素幅である画素のレジスタをセットアップすることになる(走査線に沿って処理される128画素の実施例に戻り参照されたい)。レジスタのこの幅は、メインループ処理のための多くのオプションを提供する。一方の極端では、レジスタは、一度に(単一の画素ループ)処理される1つの画素を備える出力バッファとして機能する。他の極端では、メインループの各ステップは、次のステップに移る前に各画素で影響を受ける(これは、完全にループをアンロールすることに類似する)。これらの極端間のバランスをとるために、幾つかの実施形態では、従属問題を生じさせることなく概念的に出来るだけ多くループをアンロールするように仮想マシンを実装する。システムの考慮事項に応じて、画素レジスタは、Lの倍数又はLの分数とすることができる。更に画素レジスタは、走査線のサイズ又は多角形動作セグメント(スラブなど)のサイズを一致させるように動的に実装される。
【0143】
実際にエミュレータの実施形態が実行しているとき、その実施形態は高いレイヤからの命令を受け取る。これはCore Imagingのより高いレイヤであるのが好ましい。概念的には命令はどのレベルのものでもよいが、好ましい実施形態では、命令はバイトコードなどの低レベルである。次いで、仮想マシンは、命令をCPUのためのタスクに変換しなければならない。このような変換の第1部分は、CPU認識可能命令への直接変換を行う「if」文又はジャンプテーブルである。1つの好ましい実施形態において、仮想マシンは、C関数のようにGPU命令をモデル化する。このタイプの実施形態では、エミュレートされる各GPU命令はC関数に相当する。次いで、C関数は、通常のコンパイラでCPU認識可能コードに変換される。ごく一般的には、好ましい実施形態において各エミュレートされたGPU命令は、C言語などの高レベル言語でモデル化される。高レベルモデルがコンパイルされ、その結果が、仮想マシンエミュレータのオペレーション中に使用されることになるジャンプテーブルの「if」文に組み込まれる。最後に、エミュレーション中の要素(画素など)上で動作する場合、CPUベクトルレジスタは、ベクトルを記憶するために使用することができるのが好ましい。
【0144】
L.機能のサブセットのエミュレーティング
性能を得るために、多くの実施形態では全ての利用可能な低レベルグラフィック呼出しをエミュレートしない。一般に、利用可能なグラフィック命令のサブセットだけをエミュレートすることによって、サポートされる呼出しについてのより多くの想定が実装により行われ、従って幾つかの偶発事象が回避され、これによって作業を短縮することができる。例えば幾つかの実施形態において、Core Imagingは、透視用法の正確な補間に対し必要ではない。特にOpenGLは通常、1つの補間されたテクスチャ座標あたりの画素毎に少なくとも1つの分割命令を必要とする。分割は、コンピュータ的に極めて高コストであり、Core Imagingのこれらの実施形態が透視図を持たないので、分割は必要ではない。オペレーションのサブセットだけをサポートすることによって向上する性能の別の実施例は、Core Imagingの幾つかの実施形態が少数のテクスチャフォーマットとデスティネーションフォーマットだけをサポートものである。これはデータ変換を制限し、より容易なインラインコード作成を可能にする。
【0145】
機能のサブセットだけをサポートする実施例として、1つの実施形態においてエミュレータは、(i)4つの側面を持つ多角形の描画;(ii)テクスチャ結合;(iii)プログラム結合;(iv)ローカル変数の設定;及び(v)デスティネーション設定などのOpenGLの機能のサブセットだけをサポートする。
【0146】
この簡潔にされたタイプのサポートを実際に適用するための幾つかの方法がある。第一に、定義された高レベルAPIは、エミュレートできないコマンドを受け取る可能性がないようにこれらの機能だけをサポートすることができる。例えば、Core Imagingが機能のサブセットだけをサポートする場合、Core Imagingエミュレータはこれ以上をサポートする必要はない。この場合、プログラム又はプログラマがサポートされていないグラフィック呼出しを使用したい場合には、OpenGLへの直接呼出し、又はGPUの直接利用などといった、別のメカニズムを介してこれを行わなければならない。或いは、1つのエミュレーション技術は、エミュレートされる機能のサブセット(又はある別のサブセット)のために使用でき、別の技術は、全ての他のグラフィック呼出しのために使用できる。例えば、5つのエミュレートされた機能は、GPU対機械技術を使用する実施形態を介してエミュレートすることができ、他の機能は、仮想マシン実施形態を通じてエミュレートすることができる。この構成は、最も一般的なグラフィック呼出し関する最高の性能を可能にし、他の呼出しをサポートするためのより容易なポータビリティとプログラミングを可能にする。勿論、この分割は、呼出しをサービスする難易度、又はそれぞれの技術による呼出しサービスの適性などの他の基準に沿って設けることができる。更に、2つのセットの技術(仮想マシン及びCPU対機械)は、システム内の全体のグラフィック機能の1つ又はそれ以上のサブセットを実装するための分担を同様に分けることができる。
【0147】
M.サンプルフィルタリスト
本明細書の種々の箇所で、フィルタの例証的なリストに言及してきた。以下の多くのページは、そのリストに充てられる。このリスト及び添付のパラメータは例証として、説明を完全にするために提供される。上記の発明の本発明者らの実装に関して、リストされたフィルタの各々を使用又は修正してもよく、或いは使用又は修正しなくてもよい。更に、より多くのフィルタを作成することができ、これらは、開示されたものとはかなり異なる場合がある。
【0148】
【表3】
【0149】
以下の同時申請出願、すなわち、同時申請のMark Zimmerによる「IMPROVED BLUR COMPUTATION ALGORITHM(改良型ブラー計算アルゴリズム)」、同時申請のJohn Harperによる「SYSTEM FOR EMULATING GRAPHICS OPERATIONS(グラフィックオペレーションをエミュレートするためのシステム)」、同時申請のJohn Harper、Mark Zimmer、Ralph Brunner、Peter Graffagninoによる「SYSTEM FOR OPTIMIZING GRAPHICS OPERATIONS(グラフィックオペレーションを最適化するためのシステム)」、同時申請のJohn Harperによる「SYSTEM FOR REDUCING THE NUMBER OF PROGRAMS NECESSARY TO RENDER AN IMAGE(イメージをレンダリングするために必要なプログラムの数を低減させるためのシステム)」は、引用により本明細書に組み込まれる。
【特許請求の範囲】
【請求項1】
1つまたはそれ以上のプログラム可能なプロセッシング・ユニットを含むコンピュータ上で初期イメージを編集する方法であって、この方法は、
第1プロセスが第1のプロセッシング・ユニット上で実行されて前記第1のプロセッシング・ユニット上で実行される第2プロセスにフィルタを要求するステップと、
前記第1プロセスが前記フィルタと前記初期イメージ間の関係を定義するステップであって、その関係付けられたフィルタと初期イメージがプログラムを含む、前記定義するステップと、
前記第2プロセスが前記プログラムをコンパイルして、コンパイルされたプログラムを作成するステップと、
前記コンパイルされたプログラムの少なくとも一部を第2のプロセッシング・ユニット上で実行して、前記フィルタの関数を前記イメージに加え、画素イメージ結果を得るステップと、を含み、
前記1つまたはそれ以上のプログラム可能なプロセッシング・ユニットを含むコンピュータはこれらのステップを実行するように構成されて成る、前記方法。
【請求項2】
前記プログラムを最適化する追加ステップを有する請求項1に記載の方法。
【請求項3】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、キャッシュルックアップを使用して前記画素イメージ結果が既にキャッシュ内にあるかどうかを調べるステップを含む請求項1に記載の方法。
【請求項4】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含む請求項1に記載の方法。
【請求項5】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含み、前記コンパイルされたプログラムの実行中に、前記計算された交差を使用して、計算を必要とする画素数を制限するステップを更に含む請求項1に記載の方法。
【請求項6】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含み、
前記計算された交差を使用して、計算されたイメージを記憶するのに必要なメモリの量を制限するステップを更に含む請求項1に記載の方法。
【請求項7】
前記コンパイルされたプログラムは、単一のプロセッシング・ユニット用であることを特徴とする請求項1に記載の方法。
【請求項8】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含むことを特徴とする請求項1に記載の方法。
【請求項9】
前記コンパイルされたプログラムは、単一のプロセッシング・ユニット用であり、前記単一のプロセッシング・ユニットはCPUであることを特徴とする請求項1に記載の方法。
【請求項10】
前記コンパイルされたプログラムは、単一のプロセッシング・ユニット用であり、前記単一のプロセッシング・ユニットはプログラム可能GPUであることを特徴とする請求項1に記載の方法。
【請求項11】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含み、前記第1のプロセッシング・ユニットはCPUであり、前記第2のプロセッシング・ユニットはGPUであることを特徴とする請求項1に記載の方法。
【請求項12】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含み、前記第1と第2のプロセッシング・ユニットは両方ともCPUであることを特徴とする請求項1に記載の方法。
【請求項13】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含み、前記第1と第2のプロセッシング・ユニットは両方ともGPUであることを特徴とする請求項1に記載の方法。
【請求項14】
前記初期イメージはカラーだけであることを特徴とする請求項1に記載の方法。
【請求項15】
前記第1プロセスはアプリケーションプログラムであることを特徴とする請求項1に記載の方法。
【請求項16】
前記第2プロセスは、一式のグラフィックサービス機能を含むことを特徴とする請求項1に記載の方法。
【請求項17】
オペレーティングシステムは前記第2プロセスを含むことを特徴とする請求項1に記載の方法。
【請求項18】
前記第1プロセスは、高レベルフィルタを要求し、前記第2プロセスは、低レベルフィルタを表現するオブジェクトに応答することを特徴とする請求項1に記載の方法。
【請求項19】
前記第1プロセスと第2プロセスはCPU上で実行され、前記コンパイルされたプログラムはGPU上で実行されることを特徴とする請求項1に記載の方法。
【請求項20】
前記プログラムを最適化する追加ステップを有し、前記第1プロセスと第2プロセスはCPU上で実行され、前記コンパイルされたプログラムはGPU上で実行されることを特徴とする請求項1に記載の方法。
【請求項21】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含み、前記コンパイルされたプログラムの実行中に、前記計算された交差を使用して、計算を必要とする画素数を制限するステップを更に含み、前記第1プロセスと第2プロセスはCPU上で実行され、前記コンパイルされたプログラムはGPU上で実行されることを特徴とする請求項1に記載の方法。
【請求項22】
初期イメージを編集するためのシステムであって、
第1プロセスからの要求をサービスするため前記第1プロセスと第2プロセスを実行する第1のプロセッシング・ユニットと、
前記第1プロセスによって要求されたフィルタを記憶するためのメモリと、
前記初期イメージと前記フィルタとの間の関係を含み、前記第1プロセスにより作成されるデータ構造を記憶するための第2メモリと、
前記データ構造を使用して作成されたプログラムを実行するための第2のプロセッシング・ユニットと、
前記プログラムを実行することで得られる画素イメージを記憶するための第3メモリと、を備えるシステム。
【請求項23】
前記第1と第2メモリは同じものであることを特徴とする請求項22に記載のシステム。
【請求項24】
前記第1、第2、第3メモリは同じものであることを特徴とする請求項22に記載のシステム。
【請求項25】
前記第1と第2メモリはシステムメモリ内にあり、前記第3メモリはビデオメモリ内にあることを特徴とする請求項22に記載のシステム。
【請求項26】
前記第1のプロセッシング・ユニットは前記データ構造を処理し、前記第2のプロセッシング・ユニット上で使用するための前記プログラムを生成することを特徴とする請求項22に記載のシステム。
【請求項27】
前記第2のプロセッシング・ユニットにより、前記プログラムの制御下で前記画素イメージが前記第3メモリ内に記憶されることを特徴とする請求項22に記載のシステム。
【請求項28】
請求項1に記載された方法をコンピュータに実行させるためのコンピュータ実行可能命令を格納するコンピュータ可読媒体。
【請求項1】
1つまたはそれ以上のプログラム可能なプロセッシング・ユニットを含むコンピュータ上で初期イメージを編集する方法であって、この方法は、
第1プロセスが第1のプロセッシング・ユニット上で実行されて前記第1のプロセッシング・ユニット上で実行される第2プロセスにフィルタを要求するステップと、
前記第1プロセスが前記フィルタと前記初期イメージ間の関係を定義するステップであって、その関係付けられたフィルタと初期イメージがプログラムを含む、前記定義するステップと、
前記第2プロセスが前記プログラムをコンパイルして、コンパイルされたプログラムを作成するステップと、
前記コンパイルされたプログラムの少なくとも一部を第2のプロセッシング・ユニット上で実行して、前記フィルタの関数を前記イメージに加え、画素イメージ結果を得るステップと、を含み、
前記1つまたはそれ以上のプログラム可能なプロセッシング・ユニットを含むコンピュータはこれらのステップを実行するように構成されて成る、前記方法。
【請求項2】
前記プログラムを最適化する追加ステップを有する請求項1に記載の方法。
【請求項3】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、キャッシュルックアップを使用して前記画素イメージ結果が既にキャッシュ内にあるかどうかを調べるステップを含む請求項1に記載の方法。
【請求項4】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含む請求項1に記載の方法。
【請求項5】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含み、前記コンパイルされたプログラムの実行中に、前記計算された交差を使用して、計算を必要とする画素数を制限するステップを更に含む請求項1に記載の方法。
【請求項6】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含み、
前記計算された交差を使用して、計算されたイメージを記憶するのに必要なメモリの量を制限するステップを更に含む請求項1に記載の方法。
【請求項7】
前記コンパイルされたプログラムは、単一のプロセッシング・ユニット用であることを特徴とする請求項1に記載の方法。
【請求項8】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含むことを特徴とする請求項1に記載の方法。
【請求項9】
前記コンパイルされたプログラムは、単一のプロセッシング・ユニット用であり、前記単一のプロセッシング・ユニットはCPUであることを特徴とする請求項1に記載の方法。
【請求項10】
前記コンパイルされたプログラムは、単一のプロセッシング・ユニット用であり、前記単一のプロセッシング・ユニットはプログラム可能GPUであることを特徴とする請求項1に記載の方法。
【請求項11】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含み、前記第1のプロセッシング・ユニットはCPUであり、前記第2のプロセッシング・ユニットはGPUであることを特徴とする請求項1に記載の方法。
【請求項12】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含み、前記第1と第2のプロセッシング・ユニットは両方ともCPUであることを特徴とする請求項1に記載の方法。
【請求項13】
前記コンパイルされたプログラムは、第1のプロセッシング・ユニット用の構成要素と第2のプロセッシング・ユニット用の構成要素とを含み、前記第1と第2のプロセッシング・ユニットは両方ともGPUであることを特徴とする請求項1に記載の方法。
【請求項14】
前記初期イメージはカラーだけであることを特徴とする請求項1に記載の方法。
【請求項15】
前記第1プロセスはアプリケーションプログラムであることを特徴とする請求項1に記載の方法。
【請求項16】
前記第2プロセスは、一式のグラフィックサービス機能を含むことを特徴とする請求項1に記載の方法。
【請求項17】
オペレーティングシステムは前記第2プロセスを含むことを特徴とする請求項1に記載の方法。
【請求項18】
前記第1プロセスは、高レベルフィルタを要求し、前記第2プロセスは、低レベルフィルタを表現するオブジェクトに応答することを特徴とする請求項1に記載の方法。
【請求項19】
前記第1プロセスと第2プロセスはCPU上で実行され、前記コンパイルされたプログラムはGPU上で実行されることを特徴とする請求項1に記載の方法。
【請求項20】
前記プログラムを最適化する追加ステップを有し、前記第1プロセスと第2プロセスはCPU上で実行され、前記コンパイルされたプログラムはGPU上で実行されることを特徴とする請求項1に記載の方法。
【請求項21】
前記プログラムを最適化する追加ステップを有し、この最適化するステップは、前記画素イメージ結果が定義され且つ前記第2プロセスの要求された結果領域にあるエリアを表す交差を計算するステップを含み、前記コンパイルされたプログラムの実行中に、前記計算された交差を使用して、計算を必要とする画素数を制限するステップを更に含み、前記第1プロセスと第2プロセスはCPU上で実行され、前記コンパイルされたプログラムはGPU上で実行されることを特徴とする請求項1に記載の方法。
【請求項22】
初期イメージを編集するためのシステムであって、
第1プロセスからの要求をサービスするため前記第1プロセスと第2プロセスを実行する第1のプロセッシング・ユニットと、
前記第1プロセスによって要求されたフィルタを記憶するためのメモリと、
前記初期イメージと前記フィルタとの間の関係を含み、前記第1プロセスにより作成されるデータ構造を記憶するための第2メモリと、
前記データ構造を使用して作成されたプログラムを実行するための第2のプロセッシング・ユニットと、
前記プログラムを実行することで得られる画素イメージを記憶するための第3メモリと、を備えるシステム。
【請求項23】
前記第1と第2メモリは同じものであることを特徴とする請求項22に記載のシステム。
【請求項24】
前記第1、第2、第3メモリは同じものであることを特徴とする請求項22に記載のシステム。
【請求項25】
前記第1と第2メモリはシステムメモリ内にあり、前記第3メモリはビデオメモリ内にあることを特徴とする請求項22に記載のシステム。
【請求項26】
前記第1のプロセッシング・ユニットは前記データ構造を処理し、前記第2のプロセッシング・ユニット上で使用するための前記プログラムを生成することを特徴とする請求項22に記載のシステム。
【請求項27】
前記第2のプロセッシング・ユニットにより、前記プログラムの制御下で前記画素イメージが前記第3メモリ内に記憶されることを特徴とする請求項22に記載のシステム。
【請求項28】
請求項1に記載された方法をコンピュータに実行させるためのコンピュータ実行可能命令を格納するコンピュータ可読媒体。
【図1】
【図2(a)】
【図2(b)】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15(a)】
【図15(b)】
【図15(c)】
【図16】
【図17】
【図2(a)】
【図2(b)】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15(a)】
【図15(b)】
【図15(c)】
【図16】
【図17】
【公開番号】特開2010−113724(P2010−113724A)
【公開日】平成22年5月20日(2010.5.20)
【国際特許分類】
【出願番号】特願2009−281419(P2009−281419)
【出願日】平成21年12月11日(2009.12.11)
【分割の表示】特願2007−508356(P2007−508356)の分割
【原出願日】平成17年3月16日(2005.3.16)
【出願人】(503260918)アップル インコーポレイテッド (568)
【Fターム(参考)】
【公開日】平成22年5月20日(2010.5.20)
【国際特許分類】
【出願日】平成21年12月11日(2009.12.11)
【分割の表示】特願2007−508356(P2007−508356)の分割
【原出願日】平成17年3月16日(2005.3.16)
【出願人】(503260918)アップル インコーポレイテッド (568)
【Fターム(参考)】
[ Back to top ]