JPH10111948A - テクセル・データへの連続的メモリ割り当て方法 - Google Patents

テクセル・データへの連続的メモリ割り当て方法

Info

Publication number
JPH10111948A
JPH10111948A JP9167040A JP16704097A JPH10111948A JP H10111948 A JPH10111948 A JP H10111948A JP 9167040 A JP9167040 A JP 9167040A JP 16704097 A JP16704097 A JP 16704097A JP H10111948 A JPH10111948 A JP H10111948A
Authority
JP
Japan
Prior art keywords
level
memory
map
data
block
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP9167040A
Other languages
English (en)
Other versions
JPH10111948A5 (ja
JP4027463B2 (ja
Inventor
Bradley L Saunders
ブラッドリー・エル・サンダース
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
HP Inc
Original Assignee
Hewlett Packard Co
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hewlett Packard Co filed Critical Hewlett Packard Co
Publication of JPH10111948A publication Critical patent/JPH10111948A/ja
Publication of JPH10111948A5 publication Critical patent/JPH10111948A5/ja
Application granted granted Critical
Publication of JP4027463B2 publication Critical patent/JP4027463B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management

Landscapes

  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Image Generation (AREA)

Abstract

(57)【要約】 【課題】コンピュータ・グラフィックス・システムにお
いて連続的メモリにテクセル・データをダウンロードす
る方法を提供する。 【解決手段】最初のレベルに関するテクセル・データを
ダウンロードする時、当該テクスチャに関連するすべて
のMIPマップに必要な連続的メモリ量を割り当て、そ
のレベル番号にとって適切なメモリ位置に記憶する。後
続のいくつかのMIPマップをダウンロードする際、そ
れらの各々が、最初にダウンロードされたMIPマップ
とレベル番号およびサイズの観点から整合しているか否
かを判断し、整合していれば、上記連続メモリの適切な
位置へ記憶し、整合していない場合一時的メモリへ記憶
する。基底レベルのデータがダウンロードされる都度、
上記一時メモリに記憶されたデータを検査して、整合性
があるレベルのデータは当該基底レベルが記憶されてい
る連続的メモリへ移動する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、コンピュータ・グ
ラフィックス・システムにおけるキャッシュの一貫性を
維持する方法に関するもので、特に、テクスチャ・マッ
ピング・コンピュータ・グラフィックス・システムのテ
クスチャ・マップのソフトウェア・メモリ管理に関する
ものである。
【0002】
【従来の技術】テクスチャ・マッピングの従来技術は、
アメリカ合衆国特許出願第08/486,447号に記載されてい
るが、その内容は、ユーザのテクスチャのコピーをテク
スチャ照会メカニズムを提供するソフトウェアに記憶
し、一度にすべてのテクセルを収納することのできる十
分なメモリがない場合でもハードウェア上のテクセルの
キャッシュの実行を可能にさせる技術に関するものであ
る。
【0003】典型的なコンピュータ・グラフィックス・
システムにおいては、表示画面上に表されるべきオブジ
ェクトは、複数のグラフィックス・プリミティブに分解
される。プリミティブは、グラフィックス・ピクチャの
基本コンポーネントであって、点、線、ベクトルおよび
三角形のような多角形を含む場合がある。典型的には、
ハードウェア/ソフトウェア方式の実施によって、画面
上に表される1つまたは複数のオブジェクトの像を表す
グラフィックス・プリミティブが、2次元表示画面上に
描画(すなわちレンダリング)される。
【0004】描画されるべき3次元オブジェクトを定義
するプリミティブは、典型的には、プリミティブ・デー
タとして各プリミティブを定義するホスト・コンピュー
タから提供される。例えば、プリミティブが三角形であ
る場合、ホスト・コンピュータは、各頂点をx,y,z
座標およびR,G,Bカラー値を使用して表すことによ
ってそのプリミティブを定義する。各プリミティブを表
すためオンにセットされるべき表示画面ピクセルおよび
各ピクセルに関するR,G,B値を計算する際に、レン
ダリング・ハードウェアはプリミティブ・データを補間
する。
【0005】初期のグラフィックス・システムは、画像
表示のため、複雑な3次元オブジェクトを表現またはモ
デル化できる十分現実的な方法を持つことができなかっ
た。そのようなシステムによって画面表示される画像
は、円滑な表面の欠如したテクスチャ、でっぱり、ひっ
かき傷、陰影またはその他モデル化されているオブジェ
クトに存在する表面細部を露出させた。その結果、表面
細部を改善した画像を表示するため種々の方法が開発さ
れた。テクスチャ・マッピングは、そのような方法の1
つである。この方法は、ソース画像(本明細書では「テ
クスチャ」と呼ぶ)を3次元オブジェクト表面上へマッ
プし、その後その3次元オブジェクトを2次元グラフィ
ックス表示画面へマップすることによって、画像表示を
行う。一般的にはマップされたテクスチャである表面細
部属性は、カラー、鏡面反射、ベクトル摂動、反射、透
明度、影、表面不規則および階調を含む。
【0006】テクスチャ・マッピングは、1つまたは複
数の点からなるテクスチャ・エレメント(すなわち「テ
クセル」)を、テクスチャをマップする対象であるオブ
ジェクトの表示部分の各点エレメント(すなわち「ピク
セル」)に当てはめることを伴う。テクスチャ・マッピ
ング・ハードウェアは、テクスチャ・マップにおけるテ
クセルがオブジェクトを表現する表示画面上のピクセル
にどのように対応するかを示す情報を伝統的に備えてい
る。テクスチャ・マップにおける各テクセルは、2次元
テクスチャ・マップにおけるその位置を識別するSおよ
びT座標によって定義される。各ピクセル毎に、それに
マップする対応する1つまたは複数のテクセルが、テク
スチャ・マップから取り出され、表示画面上でテクスチ
ャ・オブジェクトを表現するピクセルのために生成され
る最終的R,G,B値に組み込まれる。
【0007】オブジェクト・プリミティブの各ピクセル
がテクスチャ・マップにおける単一のテクセルと必ずし
も一対一で対応しない点は注意されるべきである。例え
ば、オブジェクトが表示画面に表される視認ポートに接
近すればする程、オブジェクトは大きく拡大される。オ
ブジェクトが表示画面上で拡大されるにつれ、テクスチ
ャの表示は次第に詳細になる。従って、オブジェクトが
表示画面のかなりの部分を消費する時、そのオブジェク
トを表示画面で表すため多数のピクセルが使用され、オ
ブジェクトを表す各ピクセルがテクスチャ・マップにお
ける単一のテクセルと一対一の対応関係でマップ(対応
づけ)するか、あるいは単一のテクセルが複数のピクセ
ルにマップする。しかし、オブジェクトが表示画面の比
較的小さい部分を占める時、オブジェクトを表すため比
較的少数のピクセルが使用され、その結果、テクスチャ
の表現は粗くなり、各ピクセルが複数のテクセルにマッ
プする。更に、1つのテクスチャがオブジェクトの小さ
い部分にマップされる時、各ピクセルは複数のテクセル
にマップするかもしれない。複数のテクセルにマップす
るピクセルの各々毎に、目的のテクセル・データが計算
される。1つのピクセルが複数のテクセルにマップする
のが一般的であるので、1つのピクセルに対応するテク
セル・データは、典型的には、そのピクセルにマップす
る複数テクセルの平均を表現する。
【0008】テクスチャ・マッピング・ハードウェア・
システムは、典型的には、レンダリングされているオブ
ジェクトに関するテクスチャを表現するデータを記憶す
るローカル・メモリを含む。上述の通り、1つのピクセ
ルは複数のテクセルに対応する。テクスチャ・マッピン
グ・ハードウェアが1つのピクセルに対応する多数のテ
クセルをローカル・メモリから読み取って平均値を生成
しなければならないとすれば、多数のメモリ読取りと多
くのテクセル値の平均算出が必要となり、そのため、処
理時間の浪費とシステム性能の低下を生む。
【0009】この問題を克服するため、各テクスチャに
関して「MIP」マップと呼ばれる一連のマップを作成
してこれを利用する方式が開発された(MIPは、狭い
場所に多数のものを意味する"multum in parvo"の頭文
字をとったものである)。この方式は、レンダリングさ
れつつあるオブジェクトに関連するテクスチャの一連の
MIPマップをテクスチャ・マッピング・ハードウェア
のローカル・メモリに記憶する。あるテクスチャに関す
るMIPマップは、テクスチャ・マップに直接対応する
基底マップ(すなわち「レベル0」マップ)および一連の
後続のマップを含む。後続マップの各々のサイズは、テ
クスチャ・マップの各次元において、先行マップに対し
て2単位減少する。図1に、1つのMIPマップ・セッ
トの例が示されている。このMIPマップは、サイズが
8×8テクセルである(レベル0の)基底マップ100と
共に、サイズ的にそれぞれ4×4テクセルであるレベル
1、2×2テクセルであるレベル2および1×1テクセ
ルであるレベル3を表す一連のマップ102、104お
よび108を含む。
【0010】レベル1の4×4マップ102は、レベル
1マップ102の中の各テクセルがレベル0基底マップ
100の4つのテクセルの平均に対応するように、基底
マップ100をボックス・フィルタリング(すなわち比
例縮小)することによって生成される。例えば、レベル
1マップ102のテクセル110は、レベル0基底マッ
プ100のテクセル112−115の平均に等しい。同
様に、レベル1マップ102のテクセル118および1
20は、それぞれレベル0基底マップ100のテクセル
121−124および125−128の平均に等しい。
同様に、レベル2の2×2マップ104は、レベル2マ
ップ104の中のテクセル130がレベル1マップ10
2のテクセル110および118−120の平均に等し
くなるように、レベル1マップ102をボックス・フィ
ルタリングすることによって生成される。レベル3マッ
プ108における単一テクセルは、レベル2マップ10
4における4つのテクセルを平均して生成される。
【0011】従来技術のグラフィックス・システムは、
一般的に、表示画面上に描画されるべきプリミティブに
関して使用されるはずのすべてのテクスチャのための完
全なMIPマップ・セットを、ホスト・コンピュータの
メイン・メモリからテクスチャ・マッピング・ハードウ
ェアのローカル・メモリへ、ダウンロードする。当業者
には理解されることであろうが、完全なMIPマップ・
セットとは、レベル0からレベルNまでの(但しレベル
Nは1×1MIPマップ)すべてのMIPマップを意味
する。このようにして、テクスチャ・マッピング・ハー
ドウェアは、一連のMIPマップのどのレベルのマップ
からでもテクスチャ・データを取り出すことができる。
特定のピクセルに関してテクセル・データを取り出すた
めどのマップにアクセスすべきかの決定は、ピクセルが
マップするテクセルの数に基づく。例えば、ピクセル
が、テクスチャ・マップにおける単一のテクセルと一対
一の対応関係でマップする場合、基底マップ100がア
クセスされる。しかしながらピクセルが4、16または
64のテクセルへマップするとすれば、マップ102、
104および108がそれぞれアクセスされる。なぜな
らば、それらのマップは、テクスチャ・マップにおける
4、16および64のテクセルの平均を表現しているテ
クセル・データをそれぞれ記憶しているからである。
【0012】理解される通り、一連のテクスチャMIP
マップは記憶のため多量のシステム・ソフトウェア・メ
モリを必要とする。例えば、1024×1024のテク
セルのテクスチャ基底マップを持つテクスチャのための
一連のMIPマップは、MIPマップされたテクスチャ
の1コピーを記憶するため5メガバイト以上のシステム
・ソフトウェア・メモリを必要とする。従って、MIP
マップされたテクスチャの複数コピーの記憶は、膨大な
量のシステム・ソフトウェア・メモリを使用する。
【0013】システム・ソフトウェア・メモリは、数ギ
ガバイトまでのソフトウェア・データを記憶することが
できるが、考慮されなければならないもう一つの問題
は、MIPマップを実際にどこへ記憶するかである。特
に、グラフィックス画像の高速描画を達成するために
は、テクセル情報を適切なレベルのMIPマップからグ
ラフィックス・ディスプレイへ可能な限り迅速に転送す
ることができることが重要である。すべてのレベルの位
置が前もってわかっていれば最善ではあるが、典型的な
グラフィックス適用業務プログラム・インターフェース
(すなわちAPI)稼働形態はそのタスクを非常に困難に
させる。特に、ヒューレット・パッカード社から提供さ
れている"OpenGL"と呼ばれるグラフィックスAPIは、
ユーザがMIPマップをダウンロードする際種々のレベ
ルをどのようなレベルの順序でもメモリに送ることを可
能にする。
【0014】
【発明が解決しようとする課題】現在までは、オペレー
ティング・システムのメモリ割り当てルーチンによって
要求元に返されるメモリを各レベル毎の記憶位置として
使用して、そのようなMIPマップ・レベルを個別にメ
モリに記憶する形態がとられて来た。このように、MI
Pマップのレベルが記憶されるメモリの実際の位置は、
オペレーティング・システムに委ねられた。従って、個
々のレベルが必要とされる時点で記憶位置を特定しなけ
ればならず、そのためシステム動作速度の一般的低下を
もたらしている。従って、複数のレベルのMIPマップ
を整合性のある形態でメモリに記憶することが必要とさ
れている。
【0015】
【課題を解決するための手段】本発明は、上記課題を解
決するため、データの完全性を維持しながら、MIP化
されたOpenGLテクスチャ・マップの複数レベルを連続的
メモリに記憶することを可能にするメカニズムを提供す
る。それによって、本発明は、完全にMIP化されたテ
クスチャ・マップをハードウェアにダウンロードする際
あるいはテクスチャ・マッピングがソフトウェア・ラス
タライゼーションを使用する際に発生する可能性のある
メモリ・キャッシュ・ミスを減少あるいは除去する。ま
た、たとえデータが現在時の完全MIPマップ記述に適
合しない場合でも、本発明は、ダウンロードされつつあ
るデータの完全性を維持する。
【0016】本発明のアルゴリズムは、コンピュータ・
グラフィックス・システムにおける連続的メモリにテク
セル・データをダウンロードする方法を提供する。該方
法は、ダウンロードされる最初のテクセル・データのM
IPマップのレベル番号およびサイズを基にして、当該
テクスチャに関連するすべてのMIPマップに必要な連
続的メモリ量を割り当て、上記最初のMIPマップに関
するデータを、レベル番号およびサイズを基にして計算
するオフセット値に従ってそのレベル番号にとって適切
な上記連続的メモリ位置に記憶する。更に、本発明のア
ルゴリズムは、いくつかの後続のMIPマップがダウン
ロードされるにつれて、それらの各々が上記最初にダウ
ンロードされたMIPマップとレベル番号およびサイズ
の観点から整合しているか否かを判断し、上記判断の結
果整合していれば、それらレベル番号に基づいて計算さ
れるオフセット値が示す上記連続的メモリ位置へそれら
レベルのデータを記憶し、上記判断の結果整合していな
い場合、それらレベルのデータを一時的メモリへ記憶す
る。上記後続のMIPマップにおいて基底レベルのデー
タがダウンロードされる毎に、上記一時的メモリに記憶
されたデータを検査して、当該基底レベルと整合性があ
るレベルのデータがあれば、それらを当該基底レベルが
記憶される連続的メモリへ移動する。
【0017】
【発明の実施の形態】本発明に従って、図2ないし図6
に示される本発明の方法10は、テクスチャ・データを
連続的メモリに記憶することを目的とする。上述の通
り、テクスチャ・データは、レベル0からレベルNまで
のすべてのレベルに関連するデータから構成される(但
しレベルNは1×1配列である)。先ず第1に、すべて
のテクセル・データを単一メモリ・ブロックに記憶でき
る十分なメモリが存在するか否かを決定しなければなら
ない。この決定は図2のブロック14で行われる。十分
なメモリがあるかどうか判明しない場合、必要とされる
連続メモリ・ブロックのサイズを計算し(ブロック1
6)、そのメモリを割り当て(ブロック18)なければな
らない。例としてレベル0MIPマップが8×8マップ
であると仮定すれば、それは64個の「位置」を占有す
るが、実際のメモリ量はテクセルあたりのバイト数(×
64)によって決定される。この場合、レベル1MIP
マップは4×4すなわち16の位置を占め、レベル2M
IPマップは2×2すなわち4つの位置を占め、レベル
3MIPマップは1×1すなわち1つの位置を占める。
かくして、位置の総数は85で、メモリ量はテクセルあ
たりのバイト数×85である。レベル2MIPマップが
2×2マップであるということは基底マップが8×8マ
ップであることを意味する点は容易に理解されるであろ
う。従って、MIPマップのレベルとサイズを所与とす
れば、完全なMIPマップを記憶するために必要な連続
メモリ・ブロックのサイズは容易に決定することができ
る。
【0018】十分なメモリを割り当てることができない
と判断すれば(ブロック20)、エラー条件が発生する
(ブロック22)。そうではなく十分なメモリを割り当て
ることができると判断すれば(ブロック20)、基底マッ
プ(レベル0)が記憶される(ブロック24)。次に、本発
明の好ましい実施形態では、"LevelOK"と呼ばれるフラ
グが0にセットされ(ブロック26)、レベル情報がOK
か否かが判断される(ブロック28)。これは、ロードさ
れつつあるMIPマップ・レベルに関する情報が、MI
Pマップに関する既知の情報と整合しているか否かに関
して判断することを意味する。例を用いて説明すれば、
4×4のサイズを持つ「レベル1」MIPマップがダウ
ンロードされ、次に8×8のサイズを持つ「レベル0」
MIPマップがダウンロードされれば、データは整合し
ていて、レベルはOKである。これとは相違して、4×
4のサイズを持つ「レベル1」MIPマップがダウンロ
ードされ、次に4×4のサイズを持つ「レベル0」MI
Pマップがダウンロードされれば、データは整合してな
く、レベルはOKではない。データが以前にダウンロー
ドされたデータと整合していれば、LevelOKフラグは
「1」にセットされる。
【0019】LevelOKが「0」であれば、そのMIPマ
ップが基底マップ(レベル0)に関するものであったか否
かが判断される(ブロック32)。もしもそうではなく、
あるいはLevelOKが「1」に等しかったならば、処理の
流れは図5の"C"へ進む。そのMIPマップが基底マッ
プ(レベル0)に関するもので、LevelOKフラグが「1」
にセットされていれば(ブロック34)、図3のブロック
38(記号"A")へ進み、基底レベル情報および既存メモ
リへのポインタを記憶し(ブロック50および40)、次
に、連続メモリのサイズが計算され(ブロック42)、連
続メモリが割り当てられる(ブロック44)。連続メモリ
が正しく割り当てられたか否かを検証し(ブロック4
6)、エラーがあったと判断すれば、それ以上の動作は
行われない。
【0020】次に、後続のループにおいて繰り返し動作
を行うため、カウンタ、増分式および検証プロシージャ
56が設定される(ブロック52、54および56)。本
発明の好ましい実施形態において、ループは、現在時レ
ベルへのポインタを入手するステップ(ブロック62)、
および現在時レベルがまだメモリ64のいかなる位置を
もポイントしていないことを判断するステップ(ブロッ
ク64)を含む。このループは繰り返され、繰り返し毎
にループ・カウンタが増分され(ブロック54)、潜在的
にサポートされているレベルの最大数に対応する回数に
達するまでループは繰り返される。本発明の実施形態に
おいて、現行使用されるハードウェアおよびメモリ容量
に基づけば、16を越えるレベルはサポートされない。
従って、ループ処理は最高15回であるが、将来のハー
ドウェアおよびメモリが一層大きいMIPマップ・レベ
ルの使用を示せば、この回数は増加する点は当業者に理
解されることであろう。
【0021】現在時レベルがメモリをポイントしている
と判断されれば(ブロック64)、現在時レベルのサイズ
が計算され(ブロック70)、LevelOKが「0」にセット
されて、データが正しくないことが示される(ブロック
72)。次に、正確性についてレベル・データが検査さ
れ(ブロック74)、レベル・データが正確であると判断
されれば、LevelOKは、レベル・データが正確であるこ
とを示す「1」にセットされ(ブロック88)、そのレベ
ルに関して、基底マップの連続メモリへのオフセットが
計算される(ブロック90)。次に、現在時レベルのテク
セルが連続メモリの適切な位置にコピーされる(ブロッ
ク92)。
【0022】この時点において、ポインタ・フラグがセ
ットされているか否かを検査して(ブロック94)、セッ
トされていなければ、図3の上記ループへ記号"E"の位
置から再度入る。一方、ポインタ・フラグが「1」にセ
ットされていれば、このレベルに関するメモリを解放し
(ブロック96)、ポインタ・フラグを「0」にセットし
(ブロック97)、現在時レベルのメモリ・オフセットを
記憶する(ブロック98)。次に、図3の上記ループへ記
号"E"の位置から再度入る。
【0023】ブロック74でレベル・データが正しくな
いと判断され、ポインタ・フラグが「1」にセットされ
ていれば(ブロック76)、図3の上記ループへ記号"E"
の位置から再度入る。一方、ブロック74でレベル・デ
ータが正しくないと判断され、ポインタ・フラグが
「0」にセットされていれば(ブロック76)、ポインタ
・フラグを「1」にセットし(ブロック78)、このレベ
ルのため一時的記憶ブロックを割り当て(ブロック8
0)、メモリが正しく割り当てられたことを確認する(ブ
ロック82)。メモリ割り当ての際エラーが発生すれば
これ以上の動作は行われない(ブロック84)。メモリが
割り当てられれば、このレベルのデータが一時メモリに
コピーされ(ブロック86)、図3の上記ループへ記号"
E"の位置から再度入る。 図2に戻って、ブロック32
において、レベルが基底ブロックでない場合、処理は図
5の記号"C"へ進む。また、基底レベルであるが、Level
OKフラグが「0」にセットされていなければ(ブロック
34)、処理は同様に図5の記号"C"へ進む。
【0024】図5のブロック13において、レベル情報
が正しいか否かが判断される。正しくなければ、レベル
・サイズを計算し(ブロック15)、ポインタ・フラグを
「1」にセットし(ブロック17)、このレベルのため一
時的記憶ブロックを割り当てる(ブロック19)。次に、
メモリが正しく割り当てられたことを確認する(ブロッ
ク21)。メモリ割り当ての際エラーが発生すればこれ
以上処理は行わない。メモリが正しく割り当てられれ
ば、記号"D"へ進む。
【0025】上記ブロック13において、レベル情報が
正しいと判断される場合、ブロック27においてポイン
タ・フラグが「1」にセットされているか否かが検査さ
れる。「1」にセットされていれば、このレベルのため
の一時メモリが解放され(ブロック28)、ポインタ・フ
ラグを「0」にセットし(ブロック31)、このレベルに
関する連続メモリへのオフセットを計算する(ブロック
33)。次に処理は記号"D"へ進む。ブロック27におい
て、ポインタ・フラグが「0」にセットされていれば、
このレベルに関する基底マップの連続メモリへのオフセ
ットを計算するだけで(ブロック33)、記号"D"へ進
む。
【0026】図3のループに戻って、ループが15回の
繰り返しを完了すると、古い連続メモリが解放され(ブ
ロック60)、処理は記号"D"へ進む。図6の記号"D"へ
進んで、レベル情報が記憶され(ブロック39)、ポイン
タ・フラグが「1」にセットされているか否かが判断さ
れる(ブロック41)。「1」であれば、処理は終了する
(ブロック47)。ポインタ・フラグが「0」にセットさ
れていれば、オフセットが0を越えているかどうかが更
に検査される。オフセットが0であれば、処理は終了す
る(ブロック47)。ポインタ・フラグが「0」にセット
されていて、オフセットが0を越えていれば、このレベ
ルに関するオフセットを記憶しなければならない(ブロ
ック45)。次に処理は終了する(ブロック47)。
【0027】以下の表1ないし表4に、本発明の動作様
態を示すいくつかの特定の例を示す。以下の諸例の各々
において、ダウン・ロード・シーケンスは所与であり、
各ダウン・ロード・シーケンスは、そのレベルに関する
レベル番号、幅×高さのレベル・サイズおよびポインタ
・フラグ値を含む。
【0028】
【表1】例1 レベル番号 レベル・サイズ ポインタ・フラグ 0 8×8 0 1 4×4 0 2 2×2 0 3 1×1 0
【0029】例1において、レベル0、1、2および3
に対応する4つのレベル・マップがダウンロードされ、
それらはそれぞれ8×8、4×4、2×2および1×1
マップである。従って、レベル0(すなわち基底マップ)
に関する最初のレベル・マップのダウンロードに際して
連続的メモリの全ブロックを割り当てることができるの
で、問題はない。すべてのレベルが順序正しくダウンロ
ードされ、レベル・サイズのすべてが完全に整合してい
るので、これは最も簡単な場合である。
【0030】
【表2】例2 レベル番号 レベル・サイズ ポインタ・フラグ 2 1×1 0 1 2×2 0 0 4×4 0
【0031】例2においては、レベル2、1および0に
対応する3つのレベル・マップがダウンロードされ、そ
れらはそれぞれ1×1、2×2および4×4マップであ
る。最初のレベル2に関するレベル・マップがダウンロ
ードされる際、連続的メモリ・ブロック全体を割り当て
ることが可能であり、また、レベル番号およびレベル・
サイズのすべてが整合しているので、問題に出会うこと
はない。
【0032】
【表3】例3 レベル番号 レベル・サイズ ポインタ・フラグ 0 4×4 0 1 16×16 1 2 1×1 0 1 2×2 0
【0033】例3においては、レベル0、1、2および
1に対応する4つのレベル・マップがダウンロードさ
れ、それらはそれぞれ4×4、16×16、1×1およ
び2×2マップである。最初のレベル0に関するレベル
・マップがダウンロードされる時、連続的メモリ・ブロ
ック全体が割り当てられるが、その際次に2×2マップ
のレベル1、4×4マップのレベル2等々のレベル・マ
ップを受け取るであろうと仮定される(注:受け取るマ
ップの数は不明である)。しかしながら、16×16の
レベル1のダウンロードの際、整合性のないことが検出
される。従って、レベル1の16×16マップは一時的
メモリに記憶され、問題が存在することを示すためポイ
ンタ・フラグは1にセットされる。更に第3および第4
のレベルがダウンロードされる時、それら(1×1およ
び2×2マップ)は最初のレベル0と整合性があるの
で、問題は解消する。従って、元のダウンロードされた
16×l6の「レベル1」は破棄し、一時的メモリを解
放することができる。注:この例では、最初のレベルの
ダウンロードに基づく初めの連続メモリ・ブロックが使
用されている。
【0034】
【表4】例4 レベル番号 レベル・サイズ ポインタ・フラグ 0 8×8 0 1 2×2 1 2 1×1 1 0 4×4 0
【0035】例4においては、レベル0、1、2および
0に対応する4つのレベル・マップがダウンロードさ
れ、それらはそれぞれ8×8、2×2、1×1および4
×4マップである。レベル0(すなわち基底マップ)に関
する最初のレベル・マップがダウンロードされる際、連
続メモリ・ブロック全体が割り当てられる。しかしなが
ら、次にダウンロードしされるレベル1のサイズはレベ
ル0と整合していないので、レベル1(2×2マップ)デ
ータは一時的メモリに記憶され、ポインタ・フラグが1
にセットされる。3番目のレベルであるレベル2は、1
×1マップであり、これもまた最初のレベル0と整合性
がないため、一時的メモリに記憶され、ポインタ・フラ
グが1にセットされる。最後の第4の新たなレベル・ゼ
ロは既にロードされているレベル1およびレベル2と整
合性があるので、本発明に従って、それらレベル1およ
びレベル2は、第4の新しいレベル0と共に、連続メモ
リへ記憶される。
【0036】上述の通り、本発明の方法は、どのレベル
のマップの受領に際してもすべてのレベルに対して連続
的メモリ・ブロックを割り当てる手段を提供する。追加
のレベル・マップがダウンロードされる時、本発明は、
先行したメモリ割り当てと整合性があることを確認し、
整合性がない場合、整合性のあるレベルのマップがダウ
ンロードされるまで、それら整合性のないマップ情報を
一時的メモリに記憶する方法を提供する。整合性のある
レベル・マップ・セットの受領を確認すると、すべての
整合性のあるレベル・マップのデータは単一の連続メモ
リ・ブロックへ記憶される。
【0037】以下の表5ないし表11は、本発明の詳細
を更に理解する上での参照のため、本発明の好ましい実
施形態に関してCプログラミング言語で書かれたサンプ
ル・ソース・コードを含む。以下のプログラムの著作権
はヒューレット・パッカード・カンパニーにあり、ヒュ
ーレット・パッカード・カンパニーの書面による承諾な
しに、保存目的の場合を除いて、これらプログラムを複
製することは禁止されている。
【0038】
【表5】 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/shm.h> #include "mem_alloc.h" #include "GL/gl.h" #include "ogl_types.h" #include "ogl_state.h" #include "ogl_texture.h" #include "ogl_env.h" #include "ds_public.h" #include "ocm_cmd.h" #include "pcm_cmd.h" /* ****************************************************************** ** ** 目的 - 完全なMIPマップのために必要なメモリの計算 ** 入力 - w - マップ幅 ** h - マップの高さ ** myBorder - マップに関するボーダー・サイズ ** tSize - 内部記憶のためのテクセル・サイズ ** level - レベル番号 ** mipLevel - MIPレベルの総数−1を戻す ** offset - 計算されたオフセットを戻すために使用される ** 戻り値 - 計算されたメモリ・サイズ ****************************************************************** */ static int32 computeMipMemSize( int32 w, int32 h, int32 myBorder, int32 tSize, int32 level, uintl6 *mipLevel, int32 *offset) { int bSize; int memSize; int numLevels; int high; /* * これは1×1までの完全なMIPマップのサイズを計算する。 */ memSize = 0; high = (w > h)? w:h; for (numLevels = 0; high >= 1; high >>= 1) { /* * 現在時レベルのオフセットをメモリに保存する。 */ if(numLevels == level) *offset = memSize; /* * 現在時レベルのためのメモリを計算する。 */ bSize = (2 * myBorder) * w + (2 * myBorder) * h + (myBorder * myBorder) * 4; memSize += tSize * (w * h + bSize); w = (w + 1)/2; h = (h + 1)/2; numLevels++; } *mipLevel = numLevels; return(memSize); }
【0039】
【表6】 /* ****************************************************************** ** ** 目的 - マップの現在時レベルが、基底マップの高さ/幅、 ** ボーダー・サイズおよび形式と同じか検査する。 ** ** 入力 - target - テクスチャ・マップの次元 ** mipLevel - 基底レベル情報 ** width - 現在時レベルに対応する基底マップの(計算された)幅 ** height - 現在時レベルに対応する基底マップの ** (計算された)高さ ** border - 現在時レベルのボーダー・サイズ ** internalFormat - 現在時レベル内部形式 ** 戻り値 - レベルがOKなら1、さもなければ0 ******************************************************************* */ static int32 checkLevel( Enum target, Int32 level, MipLevelState mipLevel, Uint32 width, Uint32 height, Uint32 border, Enum internalFormat) { int levelOk; Uint32 tmpW; Uint32 tmpH; levelOk = 1; tmpW = mipLevel.width >> level; if(tmpW == 0) tmpW = 1; if(tmpW!=width) levelOk = 0; if(target == GL_TEXTURE_2D) { tmpH = mipLevel.height >> level; if(tmpH == 0) tmpH = 1; if(tmpH! = height) levelOk = 0; } if(mipLevel.border! = border) levelOk = 0; if(mipLevel.internalFormat!= internalFormat) levelOk = 0; return(levelOk); }
【0040】
【表7】 /* ****************************************************************** ** ** 目的 - MIPマップレベルのために必要とされるメモリを計算する。 ** ** 入力 - width - 基底レベルの幅 ** height - 基底レベルの高さ ** tSize - 内部記憶のためのテクセル・サイズ ** myBorder - 内部記憶のためのボーダー・サイズ ** 戻り値 - 計算されたレベル・サイズ ****************************************************************** */ Int32_hpOcm_computeLevelSize( Int32 width, Int32 height, Int32 tSize, Int32 myBorder) { int bSize; int levelSize; bSize = (2 * myBorder) * width + (2 myBorder) * height + (myBorder * myBorder) * 4; levelSize = tSize * (width * height + bSize); return(levelSize); }
【0041】
【表8】 /* ****************************************************************** ** 目的 - 現在時レベルに関する基底マップからのテクセル・オフセット ** を計算する。 ** ** 入力 - width - 基底レベルの幅 ** height - 基底レベルの高さ ** tSize - 内部記憶のためのテクセル・サイズ ** myBorder - 内部記憶のためのボーダー・サイズ ** level - MIPマップのレベル ** ** 戻り値 - 計算されたオフセット ****************************************************************** */ Uint32_hpOcm_computeTexelOffset( Int32 width, Int32 height, Int32 tSize, Int32 myBorder, Int32 level) { int i; unsigned int offset; offset = 0; /* * 現在時レベルより小さいレベルの各々のサイズを合計する。 */ for(i=O; i<level; i++) { offset += _hpOcm_computeLevelSize(width, height, tSize, myBorder); width = (width + 1)/2; height = (height + 1)/2; } return(offset); }
【0042】
【表9】 /* ****************************************************************** ** ** 目的 - テクスチャ・マップのための内部記憶域を割り当てる。 ** ** 入力 - memSize - 割り当てるメモリのサイズ ** *sharedID - 戻り値としての共有メモリID ** *ptr - 割り当てられたメモリ・ポインタを記憶するために ** 使用される ** *sharedTexels - 共用メモリが割り当てられたことを示す ** フラグ ** targetIndex - マップの次元 ** ** 戻り値 - 成功なら0 - 失敗なら1 ** 環境変数 - OGL_TXTR_SHMEM_THRESHOLD ** この環境変数は、プロセス・メモリ対共用メモリの ** 使用のためのフェンスをセットする。 ** しきい値(threshold)より大きいサイズを持ついかなる ** テクスチャも共用メモリに記憶される。 ** 初期値は、1024*1024バイトにセットされる。 ** **アルゴリズム - 要求されたメモリが共用メモリ・フェンスより ** 大きい場合、共用メモリ・プールからメモリを ** 割り当て、さもなければ通常のメモリを割り当てる。 ** ****************************************************************** */ Int32 allocateTexelMemory( Uint32 memSize, Uint32 *sharedID, Texel*ptr, unsigned *sharedTexels, Enum targetIndex) { int shmID; char *tmpPtr; char *cp; long int tmp_shared_memory_limit; if(memSize == 0) { ptr->lum8 = (TexelLum8 *)NULL; *sharedTexels = 0; return(0); } /* ** 可能な最適化:値がPCM状態である環境変数の値を記憶する。 ** それはただ1つのgenenvが存在する場合である。 */ cp = OglGetenv(HPOGLINT_TXTR_SHMEM_THRESHOLD); if(cp) { tmp_shared_memory_limit = (long int)atol(cp); /* ** 負数を1へクランプする */ if(tmp_shared_memory_limit < 1) tmp_shared-memory_limit = 1L; } else tmp_shared_memory_limit = OGL_TXTR_SHMEM_DEFAULT; shmID = -1; /* ** memSizeがしきい値より大きいかこれが1Dマップでない場合、 ** 共用メモリを割り当てる。1Dマップは使用しない。 */ if((memSize >= tmp_shared_memory_limit)&& (targetIndex!= OGL_TEXTURE_1D)) { shmID = shmget(IPC_PRIVATE,memSize,IPC_CREAT|0666); if(shmID!=-1) { tmpPtr = (char*)shmat(shmID,(char*)0,0); if((int)tmpPtr == -1) { /* ** 共用メモリIDを除去する */ shmctl(shmID,IPC_RMID,0); shmID = -1; } else{ /* ** 有効な共用メモリIDをメモリに添付する。 ** shmIDおよびメモリ・ポインタを保存し、成功を意味する1を戻す。 */ *sharedID shmID; ptr->lum8 = (TexelLum8*)tmpPtr; *sharedTexels = 1; return(0); /* 共用メモリ成功 */ } } } if(shmID == -1) { /* ** 通常メモリの割り当てを試みる */ tmpPtr = (char*)SumMalloc(memSize, FREE_MANUALLY); if(tmpPtr == (char*)NULL) { /* ** メモリなし、テクスチャ・マッピングなし */ SET_OGL_ERROR(GL_OUT_OF_MEMORY); return(-1); } else { /* ** メモリ割り当て可能。メモリ・ポインタを保存し、 ** 通常メモリ成功を示す0を戻す。 */ ptr->lum8 = (TexelLum8*)tmpPtr; *sharedTexels = 0; return(0); /* 通常メモリ成功 */ } } return(0); }
【0043】
【表10】 /* ****************************************************************** ** ** 目的 - 内部メモリ解放 ** ** 入力- sharedTexel - 共用メモリを示すフラグ ** sharedID - 共用メモリのID ** *ptr - メモリ・ポインタ ** ****************************************************************** */ void_hpOcm_freeTexelMemory( unsigned sharedTexel, Uint32 sharedID, void *ptr) { if(sharedTexel) { shmdt(ptr); shmctl(sharedID,IPC_RMID,0); } else { if(ptr! = (void*)NULL) SumFree(ptr); } } #pragma inline Log2 static int Log2(int Value) { int Result = 0; while( Value > 1 ){ Result++, Value >>= 1; } return Result; }
【表11】 /* ****************************************************************** ** ** 目的 - このルーチンは、テクスチャ・マップのための内部 ** グラフィック・コアメモリを割り当て、ピクセルをアンパック ** して転送するために2Dパイプを実行し、各テクスチャ・ ** マップに関してダウンロードされた有効な ** mipmap(MIPマップ)レベルの数を把握し続ける。すべての ** レベルのMIPマップを連続メモリに保持し続けるため、 ** このルーチンは複雑である。 ** ** 入力 - target - GL_TEXTURE_1DまたはGL_TEXTURE_2Dを指定する ** level - 細部レベル番号 ** internalFormat - ユーザ指定内部形式 ** width - テクスチャの幅 ** ボーダーを含まない ** ** height - テクスチャの高さ ** ボーダーを含まない ** ** border - テクスチャ・マップ・ボーダーのサイズ ** ** 呼び出し元:glTexImage*D ** ** アクセスされる大域変数:_hpOgl_context ** ** アルゴリズム - 基底マップがメモリを持っていなければ、 ** MIPマップに十分なメモリを割り当てる。 ** 到来レベルの形式または境界サイズが、現在時 ** 基底レベルのものと合致しない場合は、マップの ** 残りとは別のメモリを割り当て、そのレベルに ** マークをつける。 ** ** 呼び出される関数 - getInternalFormatAndSize ** computeMipMemSize ** allocateTexelMemory ** checkLevel ** DS_NO_LOCK.destroyTexture ** _hpOcm_computeLevelSize ** _hpOcm_computeTexelOffset ** memcpy ** SumFree ** SumMalloc ** _hpOcm_freeTexelMemory ** storeMagicBorderValue ** ** エラー・メッセージ - GL_OUT_OF_MEMORY ** */ static void downLoadTexels( Enum target, Int32 level, Int32 internalFormat, Int32 width, Int32 height, Int32 border) { TextureObjectPtr boundTexels; MipLevelStatePtr baseMap; MipLevelStatePtr thisLevel; Int32 offset; Int32 tSize; Int32 levelOk; Int32 ourType; Uint32 memSize; int i; int myBorder; unsigned tmpSharedTexels; Enum targetIndex; Int32 ignore[4]; /* ** たとえユーザがテクセルについてボーダーを持たないとしても、 ** 本方法はボーダーに対して常に空間を割り当てるので ** myBorderを1にセットする。オフセットは0に初期設定する。 */ myBorder = INTERNAL_BORDER_SIZE; offset = 0; /* ** 正しい次元の現在時テクスチャへのポインタを入手する。 ** baseMapおよびthisLevelをセットする。 */ if(target == GL_TEXTURE_2D) targetIndex = OGL_TEXTURE_2D; else { targetIndex = OGL_TEXTURE_1D; if(width > 0) height = 1; else height = 0; } boundTexels = OGL_TEXOBJ.boundTextures[targetIndex]; baseMap = &boundTexels->level[O]; thisLevel = &boundTexels->level[level]; /* ** 現在時テクスチャが表示リスト最適化の一部であれば、 ** 表示リスト・ポインタを変更しないようにテクセル情報を ** 新しいポインタへコピーする */ if(boundTexels->hdr.dlmFlag == 1) Texel texelSave; texelSave.lum8 = baseMap->texelData.lum8; memSize = computeMipMemSize(baseMap->width, baseMap->height, myBorder, baseMap->bytesPerTexel, 0, &boundTexels->hdr.numMipLevels, &offset); if(-1 = allocateTexelMemory(memSize, &boundTexels->hdr.sharedTexelIID, &baseMap->texelData, &tmpSharedTexels, boundTexels->targetIndex)) { /* ** エラーはすでにセットされている。 */ return; } boundTexels->hdr.sharedTexels = tmpSharedTexels; baseMap->pointerFlag =!TMP_MEMORY_POINTER; memcpy(baseMap->texelData.lum8, texelSave.lum8, memSize); boundTexels->hdr.dlmFlag = 0; } DS_NO_LOCK.getInternalFormatAndSize(internalFormat, &ourType, &tSize, ignore); /* ** 既存のテクセル・マップ・メモリを検査する。 ** 図2ないし図6の流れ図はここから始まる。 */ if(baseMap->texelData.lum8 == (TexelLum8 *)NULL) { Uint32 wSave; Uint32 hSave; /* ** 基底レベルのサイズを計算する。この情報を使用して、 ** 現在時レベルが正しいMIPレベルであるか、 ** メモリ割り当てを行うべきものかを確認する。 */ wSave = width; hSave = height; if(level!= 0) { wSave <<= level; if(target == GL_TEXTURE_2D) hSave <<= level; } /* ** テクセル・データに必要な全メモリを計算する。このコードは、 ** (サイズ1の)ボーダーを含む完全MIPマップに対して十分な ** メモリを割り当てる。 */ memSize = computeMipMemSize(wSave, hSave, myBorder, tSize, level, &boundTexels->hdr.numMipLevels, &offset); if(-1 == allocateTexelMemory(memSize, &boundTexels->hdr.sharedTexelID, &baseMap->texelData, &tmpSharedTexels, targetIndex)) { /* ** エラーは既にセットされている。 */ return; } boundTexels->hdr.sharedTexels = tmpSharedTexels; baseMap->texelType = ourType; baseMap->internalFormat = internalFormat; baseMap->bytesPerTexel = tSize; baseMap->border = border; baseMap->width = wSave; baseMap->height = hSave; baseMap->widthLog2 = Log2(wSave); baseMap->heightLog2 = Log2(hSave); baseMap->pointerFlag =!TMP_MEMORY_POINTER; baseMap->depth = 0; baseMap->depthLog2 = 0; } /* ** メモリは今割り当てられたか、あるいは既に存在していた。 ** レベルにテクセル情報を含める。このレベルが有効なMIPレベルで ** あるか検査する。この検査には、同じ境界サイズ持っているか、 ** 基底レベルと同じ内部形式か、正しい高さおよび幅の値を ** 持っているかが含まれる。 */ levelOk = checkLevel(target,level, *basemap, width, height, border,internalFormat); /* ** テクスチャが結合されていれば、DSM(ハードウェア)は、 ** これらのテクセルが変更されつつあることを知っている。 */ if((boundTexels->hdr.texelID!= INVALID_TEXE_ID) && (!IevelOk)) DS_NO_LOCK.destroyTexture(boundTexels); if(level == 0) { if(!levelOk) { /* ** テクセルを記憶するためのメモリは割り当てられたが、基底マップの ** サイズが変更された。従って、古いメモリ・ポインタを保存し、 ** 新しいメモリを割り当て、有効な古いマップのレベルを新しいマップ ** にコピーし、残りのレベルをtmpポインタにコピーし、 ** 次に古いメモリを解放する。 */ Texel texelSave; unsigned sharedTexelsSave; Uint32 sharedTexelIDSave; /* ** 基底レベルへ新しい値を入れる */ baseMap->texelType = ourType; baseMap->internalFormat = internalFormat; baseMap->bytesPerTexel = tSize; baseMap->border = border; baseMap->width = width; basemap->height = height; baseMap->widthLog2 = Log2(width); baseMap->heightLog2 = Log2(height); baseMap->pointerFlag = !TMP_MEMORY_POINTER; baseMap->depth = 0; baseMap->depthLog2 = 0; /* ** メモリを解放する前に、現在時テクセル・ポインタ、共用メモリID ** および共用メモリ・フラグを保存する。 */ texelSave.lum8 = baseMap->texelData.lum8; sharedTexelsSave = boundTexels->hdr.sharedTexels; sharedTexelIDSave = boundTexels->hdr.sharedTexelID; memSize = computeMipMemSize(width, height, myBorder, tSize, level, &boundTexels->hdr.numMipLevels, &offset); if(-1 == allocateTexelMemory(memSize, &boundTexels->hdr.sharedTexelID, &baseMap->texelData, &tmpSharedTexels, targetIndex)) { /* ** エラーは既にセットされている */ return; } boundTexels->hdr.sharedTexels = tmpSharedTexels; /* ** 既存のマップにおけるレベルの各々毎に、新しいマップへ ** コピーできるレベルを決定する。残りのレベルはtmpポインタへ ** コピーしポインタ・フラグをセットする。 */ for(i=1; i<OGL_MAX_MIPMAP_LEVELS; i++) { int leveSize; MipLevelStatePtr curLevel; curLevel = &boundTexels->level[i]; if(curLevel->texelData.lum8!= NULL) { levelSize = _hpOcm_computeLevelSize(curLevel->width, curLevel->height, curLevel->bytesPerTexel, myBorder); levelOk = checkLevel(target, i, *baseMap, curLevel->width, curLevel->height, curLevel->border, curLevel->i nternalFormat) if(levelOk) { offset = _hpOcm_computeTexelOffset(baseMap->width, baseMap->height, baseMap->bytesPerTexel, myBorder, level); memcpy(baseMap->texelData.lum8 + offset, curLevel->texelData.lum8, levelSize); if(curLevel->pointerFlag == TMP_MEMORY_POINTER) { SumFree(curLevel->texelData.lum8); curLevel->pointerFlag = !TMP-MEMORY-POINTER; curLevel->texelData.lum8 = baseMap->texelData.lum8 + offset; } else { Texel levelSave; /* ** このレベルについてポインタ・フラグが既にセットされていれば、 ** このレベルをコピーする理由はない。 */ if(curLevel->pointerFlag!= TMP_MEMORY_POINTER) { levelSave.lum8 = curLevel->texelData.lum8; curLevel->pointerFlag = TMP_MEMORY_POINTER; curLevel->texelData.lum8 = (TexelLum8 *)SumMalloc(levelSize, FREE_MANUALLY); if(curLevel->texelData.lum8 == (TexelLum8 *)NULL) { SET_OGL_ERROR(GL_OUT_OF_MEMORY); return; } memcpy(curLevel->texelData.lum8, levelSave.lum8, levelsize); } } } } /* ** texelSaveポインタにおける古いメモリを解放する。 */ _hpOcm_freeTexelMemory(sharedTexelsSave, sharedTexelIDSave, (void *)texelSave.lum8); } } else { /* ** 当該レベルは基底レベルでない。 */ if(levelOk) { if (thisLevel->pointerFlag == TMP_MEMORY_POINTER) { /* ** 以前OKではなかったこのレベルが今やOKである。 ** 従って、tmpメモリを解放し、pointerFlagをリセットし、 ** 基底マップによってポイントされているMIPアレイへの ** オフセットを再計算する。 */ SumFree(thisLevel->texelData.lum8); thisLevel->pointerFlag = !TMP_MEMORY_POINTER; offset = _hpOcm_computeTexelOffset(baseMap->width, baseMap->height, baseMap->bytesPerTexel, myBorder, level); } else { /* ** このレベルは既に初期化されていることは絶対にないので、 ** 基底マップによってポイントされているMIPアレイへの ** オフセットを計算する。 */ offset = _hpOcm_computeTexelOffset(baseMap->width, baseMap->height, baseMap->bytesPerTexel, myBorder, level); } } else { /* ** レベルはOKでない。従って、一時メモリを割り当て、そこへ ** このレベルのテクセルを記憶する。また、レベルが基底マップへの ** オフセットではないことを示すpointerFlagをセットする。 */ int levelSize; levelSize = _hpOcm_computeLevelSize(width, height, tSize, myBorder); thisLevel->pointerFlag = TMP_MEMORY_POINTER; thisLevel->texelData.lum8 = (TexelLum8 *)SumMalloc(levelSize, FREE_MANUALLY); if(thisLevel->texelData.lum8 == (TexeLum8*)NULL) { SET_OGL_ERROR(GL_OUT_OF_MEMORY); return; } } } /* ** レベル情報を保存する。 */ thisLevel->texelType = ourType; thisLevel->internalFormat = internalFormat; thisLevel->bytesPerTexel = tSize; thisLevel->border = border; thisLevel->width = width; thisLevel->height = height; thisLevel->widthLog2 = Log2(width); thisLevel->heightLog2 Log2(height); thisLevel->depth = 0; thisLevel->depthLog2 = 0; /* ** このレベルがOKであれば、このレベルに関するオフセットを ** texelDataに記憶する。注:これがレベル0であればオフセットは ** 常にゼロである。 */ if((thisLevel->pointerFlag! = TMP_MEMORY_POINTER) && offset) thisLevel->texelData.lum8 = baseMap->texelData.lum8 + offset; if(thisLevel->texelData.lum8) storeMagicBorderValue(tSize,(char*)thisLevel->texelData.lum8); }
【0044】本発明には、例として次のような実施様態
が含まれる。 (1)コンピュータ・グラフィックス・システムにおい
て連続的メモリ・ブロックをテクセル・データへ割り当
てる方法であって、ダウンロードされる最初のレベル・
マップに関するテクセル・データに対応するデータを受
け取るステップと、上記ダウンロードされる最初のレベ
ル・マップのサイズおよびレベル番号に基づいて、完全
なMIPマップを記憶することのできる連続的メモリ・
ブロックを割り当てるステップと、上記ダウンロードさ
れる最初のレベル・マップに関する上記テクセル・デー
タのレベル番号に基づいて、上記ダウンロードされる最
初のレベル・マップに関連するデータを記憶する上記連
続的メモリ・ブロックのあらかじめ定められた適切な位
置を表すオフセット値を決定するステップと、上記ダウ
ンロードされる最初のレベル・マップに関する上記テク
セル・データを上記オフセット値によってポイントされ
る連続的メモリ・ブロック内の位置に記憶するステップ
と、上記ダウンロードされる最初のレベル・データを受
け取った後、更に別のレベル・マップに関する付加的テ
クセル・データを繰り返し受け取り、それら受け取った
レベル・データのそれぞれ毎に、当該レベル・データが
上記ダウンロードされた最初のテクセル・データと整合
しているか否かを確認し、整合している場合上記連続的
メモリ・ブロックに対するオフセットを計算してそのオ
フセットによってポイントされる上記連続的メモリ・ブ
ロック内の位置へ当該テクセル・データを記憶し、整合
していない場合、当該テクセル・データを一時的メモリ
へ記憶すると共にテクセル・データが一時的メモリにあ
ることを示す値にポインタ・フラグをセットし、すべて
の上記付加的レベル・データについて上記処理を繰り返
した後、上記一時メモリを連続的メモリ・ブロックへ移
動することによって整合性のあるテクセル・データのセ
ットが完成する場合にはそれらテクセル・データを連続
的メモリ・ブロックへ移動するステップと、を含むテク
セル・データへの連続的メモリ割り当て方法。
【0045】(2)コンピュータ・グラフィックス・シ
ステムにおける連続的メモリにテクセル・データをダウ
ンロードする方法であって、ダウンロードされる最初の
テクセル・データのMIPマップのレベル番号およびサ
イズを基にして、当該テクスチャに関連するすべてのM
IPマップに必要な連続的メモリ量を割り当てるステッ
プと、上記最初のMIPマップに関するデータを、レベ
ル番号およびサイズを基にして計算するオフセット値に
従ってそのレベル番号にとって適切な上記連続的メモリ
位置に記憶するステップと、更にいくつかの後続のMI
Pマップがダウンロードされるにつれて、それらの各々
が上記最初にダウンロードされたMIPマップとレベル
番号およびサイズの観点から整合しているか否かを判断
するステップと、上記判断の結果整合していれば、それ
らレベル番号に基づいて計算されるオフセット値が示す
上記連続的メモリ位置へそれらレベルのデータを記憶す
るステップと、上記判断の結果整合していない場合、そ
れらレベルのデータを一時的メモリへ記憶するステップ
と、上記後続のMIPマップにおいて基底レベルのデー
タがダウンロードされる毎に、上記一時的メモリに記憶
されたデータを検査して、当該基底レベルと整合性があ
るレベルのデータがあれば、それらを当該基底レベルが
記憶される連続的メモリへ移動するステップと、を含
む、連続的メモリへのテクセル・データのダウンロード
方法。
【0046】
【発明の効果】本発明によって、データの完全性を維持
しながら、MIP化されたテクスチャ・マップの複数レ
ベルを連続的メモリに記憶することが可能となり、それ
によって、完全にMIP化されたテクスチャ・マップを
ハードウェアにダウンロードする際あるいはテクスチャ
・マッピングがソフトウェア・ラスタライゼーションを
使用する際のメモリ・キャッシュ・ミスが減少あるいは
除去される。
【図面の簡単な説明】
【図1】テクスチャMIPマップのセットを示す図式で
ある。
【図2】図3、図4、図5および図6と共に、本発明の
方法の動作を示す流れ図である。
【図3】図2、図4、図5および図6と共に、本発明の
方法の動作を示す流れ図である。
【図4】図2、図3、図5および図6と共に、本発明の
方法の動作を示す流れ図である。
【図5】図2、図3、図4および図6と共に、本発明の
方法の動作を示す流れ図である。
【図6】図2、図3、図4および図5と共に、本発明の
方法の動作を示す流れ図である。
【符号の説明】
100 基底マップ(レベル0マップ) 102 レベル1マップ 104 レベル2マップ 108 レベル3マップ 110、112、120、128 テクセル

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】コンピュータ・グラフィックス・システム
    において連続的メモリ・ブロックをテクセル・データへ
    割り当てる方法であって、 ダウンロードされる最初のレベル・マップに関するテク
    セル・データに対応するデータを受け取るステップと、 上記ダウンロードされる最初のレベル・マップのサイズ
    およびレベル番号に基づいて、完全なMIPマップを記
    憶することのできる連続的メモリ・ブロックを割り当て
    るステップと、 上記ダウンロードされる最初のレベル・マップに関する
    上記テクセル・データのレベル番号に基づいて、上記ダ
    ウンロードされる最初のレベル・マップに関連するデー
    タを記憶する上記連続的メモリ・ブロックのあらかじめ
    定められた適切な位置を表すオフセット値を決定するス
    テップと、 上記ダウンロードされる最初のレベル・マップに関する
    上記テクセル・データを上記オフセット値によってポイ
    ントされる連続的メモリ・ブロック内の位置に記憶する
    ステップと、 上記ダウンロードされる最初のレベル・データを受け取
    った後、更に別のレベル・マップに関する付加的テクセ
    ル・データを繰り返し受け取り、それら受け取ったレベ
    ル・データのそれぞれ毎に、当該レベル・データが上記
    ダウンロードされた最初のテクセル・データと整合して
    いるか否かを確認し、整合している場合上記連続的メモ
    リ・ブロックに対するオフセットを計算してそのオフセ
    ットによってポイントされる上記連続的メモリ・ブロッ
    ク内の位置へ当該テクセル・データを記憶し、整合して
    いない場合、当該テクセル・データを一時的メモリへ記
    憶すると共にテクセル・データが一時的メモリにあるこ
    とを示す値にポインタ・フラグをセットし、すべての上
    記付加的レベル・データについて上記処理を繰り返した
    後、上記一時メモリを連続的メモリ・ブロックへ移動す
    ることによって整合性のあるテクセル・データのセット
    が完成する場合にはそれらテクセル・データを連続的メ
    モリ・ブロックへ移動するステップと、 を含むテクセル・データへの連続的メモリ割り当て方
    法。
JP16704097A 1996-07-26 1997-06-24 テクセル・データを記憶する方法およびテクセル・データを記憶するシステム Expired - Fee Related JP4027463B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US690,432 1991-04-24
US08/690,432 US5781197A (en) 1996-07-26 1996-07-26 Method for maintaining contiguous texture memory for cache coherency

Publications (3)

Publication Number Publication Date
JPH10111948A true JPH10111948A (ja) 1998-04-28
JPH10111948A5 JPH10111948A5 (ja) 2005-07-07
JP4027463B2 JP4027463B2 (ja) 2007-12-26

Family

ID=24772430

Family Applications (1)

Application Number Title Priority Date Filing Date
JP16704097A Expired - Fee Related JP4027463B2 (ja) 1996-07-26 1997-06-24 テクセル・データを記憶する方法およびテクセル・データを記憶するシステム

Country Status (4)

Country Link
US (2) US5781197A (ja)
JP (1) JP4027463B2 (ja)
DE (1) DE19723063B4 (ja)
GB (1) GB2315968B (ja)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5781197A (en) * 1996-07-26 1998-07-14 Hewlett-Packard Company Method for maintaining contiguous texture memory for cache coherency
JP3586991B2 (ja) * 1996-08-30 2004-11-10 ソニー株式会社 テクスチャ・データ読出装置およびレンダリング装置
JP3885262B2 (ja) * 1996-12-17 2007-02-21 株式会社セガ テクスチャマップ上の複数画素を混合する方法及び、これを用いた複数画素混合回路と画像処理装置
JPH10326352A (ja) * 1997-05-27 1998-12-08 Mitsubishi Electric Corp 多角形塗り潰し方法及び記録媒体
US6046747A (en) * 1997-08-04 2000-04-04 Hewlett-Packard Company Graphics application programming interface avoiding repetitive transfer of texture mapping data
US6040837A (en) * 1998-04-22 2000-03-21 Ati Technologies, Inc. Method and apparatus for space variable texture filtering
US7518616B1 (en) * 1998-07-17 2009-04-14 3Dlabs, Inc. Ltd. Graphics processor with texture memory allocation system
US6184894B1 (en) 1999-01-29 2001-02-06 Neomagic Corp. Adaptive tri-linear interpolation for use when switching to a new level-of-detail map
US6750872B1 (en) * 1999-09-17 2004-06-15 S3 Graphics, Co., Ltd. Dynamic allocation of texture cache memory
US6850338B1 (en) 2000-05-12 2005-02-01 International Business Machines Corporation Method, system, program, and data structure for generating raster objects
US6894796B1 (en) 2000-05-12 2005-05-17 International Business Machines Corporation Method, system, and logic for selecting line work and control data for a pixel from multiple objects of line work data provided for the pixel
US6449328B1 (en) 2000-05-15 2002-09-10 International Business Machines Corporation Method and apparatus for shifting data from registers
US7394568B1 (en) 2000-05-15 2008-07-01 Infoprint Solutions Company Llc Method, system, and logic for selecting pixel data from multiple objects
US6804411B1 (en) 2000-05-15 2004-10-12 International Business Machines Corporation Method, system, and program for decompressing and aligning line work data from multiple objects
US6961134B1 (en) 2000-05-15 2005-11-01 International Business Machines Corporation Method, system, and logic using multiplexers to select data for pixels from multiple objects
US6917364B2 (en) * 2001-01-31 2005-07-12 International Business Machines Corporation Method and apparatus for managing texture memory in a data processing system
US8766998B1 (en) * 2008-08-22 2014-07-01 Aechelon Technology, Inc. Sampling of non-planar display surfaces
US9652815B2 (en) * 2012-09-11 2017-05-16 Nvidia Corporation Texel data structure for graphics processing unit programmable shader and method of operation thereof

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5097427A (en) * 1988-07-06 1992-03-17 Hewlett-Packard Company Texture mapping for computer graphics display controller system
GB2240016A (en) * 1990-01-15 1991-07-17 Philips Electronic Associated Texture memories store data at alternating levels of resolution
GB2240015A (en) * 1990-01-15 1991-07-17 Philips Electronic Associated Texture memory addressing
US5222205A (en) * 1990-03-16 1993-06-22 Hewlett-Packard Company Method for generating addresses to textured graphics primitives stored in rip maps
US5623693A (en) * 1994-02-17 1997-04-22 International Business Machines Corporation System for performing action by sorting actions into immediate and deferred queues, processing immediate queue while still sorting, and appending deferred queue to immediate after sorting
CA2144914A1 (en) * 1994-04-01 1995-10-02 Raymond L. Fitzgerald Computer graphics texture paging system with fragmentary mip map selection
US5790130A (en) * 1995-06-08 1998-08-04 Hewlett-Packard Company Texel cache interrupt daemon for virtual memory management of texture maps
US5781197A (en) * 1996-07-26 1998-07-14 Hewlett-Packard Company Method for maintaining contiguous texture memory for cache coherency

Also Published As

Publication number Publication date
DE19723063B4 (de) 2009-05-07
US5781197A (en) 1998-07-14
DE19723063A1 (de) 1998-01-29
GB2315968A (en) 1998-02-11
GB2315968B (en) 2000-11-08
US5917497A (en) 1999-06-29
GB9713353D0 (en) 1997-08-27
JP4027463B2 (ja) 2007-12-26

Similar Documents

Publication Publication Date Title
US6046747A (en) Graphics application programming interface avoiding repetitive transfer of texture mapping data
US6005583A (en) Precise gradient calculation system and method for a texture mapping system of a computer graphics system
JP4027463B2 (ja) テクセル・データを記憶する方法およびテクセル・データを記憶するシステム
US6078332A (en) Real-time lighting method using 3D texture mapping
CA2772030C (en) Systems and methods for providing intermediate targets in a graphics system
WO2022193941A1 (zh) 图像渲染方法、装置、设备、介质和计算机程序产品
US8823724B2 (en) Sparse texture systems and methods
JP5053857B2 (ja) 3次元グラフィックス処理装置および方法
CN103370728B (zh) 用于图形处理的数据存储地址指派的方法和设备
US5936632A (en) Method for fast downloading of textures to accelerated graphics hardware and the elimination of extra software copies of texels
US7965296B2 (en) Systems and methods for storing texture map data
KR102752364B1 (ko) 그래픽 처리
US20130271465A1 (en) Sort-Based Tiled Deferred Shading Architecture for Decoupled Sampling
US11521342B2 (en) Residency map descriptors
CN101236661A (zh) 在计算机中管理纹理数据的系统与方法
US6924814B1 (en) System and method for simulating clip texturing
US6181346B1 (en) Graphics system
US20050088450A1 (en) Texture roaming via dimension elevation
US6768492B2 (en) Texture tiling with adjacency information
US5369738A (en) Distributed processing apparatus and method for use in global rendering
US8681169B2 (en) Sparse texture systems and methods
US8860743B2 (en) Sparse texture systems and methods
KR20060125269A (ko) 그래픽스 처리장치와 처리방법, 및 그 기록 매체
US7324117B1 (en) Method and apparatus for using non-power of two dimension texture maps
US6590579B1 (en) System for low miss rate replacement of texture cache lines

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040621

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20040621

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20041029

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070214

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20070507

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20070510

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070809

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20070911

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20071010

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101019

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees