README.jp 15.2 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
-------------------------------------------------------------------------------
===============================================================================
	F3DEX2 マイクロコード (F3DEX Level2) ドキュメント
	
					Release 2.08
					Jan  5, 1999.
					Copyright (C) 1999, Nintendo.
					任天堂株式会社開発第 3 部    安本吉孝
===============================================================================
-------------------------------------------------------------------------------
目次
	1. F3DEX2 マイクロコードの特徴
	2. F3DEX2 の使用についての詳細
	3. 付録
	4. 変更履歴

-------------------------------------------------------------------------------
1. F3DEX2 マイクロコードの特徴

  F3DEX2 マイクロコードは, 従来よりリリースしておりました F3DEX マイク
ロコードを再構成し RSP の計算速度を高速にしたマイクロコードです. 

  以下の特徴があります.

	o GBI 命令セットは F3DEX と互換性がある(一部 GBI を除く).
	o RSP の処理の高速化が可能.
	o FIFO 形式だけでなく XBUS 形式もサポート.


-------------------------------------------------------------------------------
2. F3DEX2 の使用についての詳細

● GBI の互換性

  F3DEX2 シリーズで使用する GBI は Fast3D/F3DEX シリーズのものとソース
レベルでの互換性を有しています. Fast3D/F3DEX で作成されたコードは, 再
コンパイルによって F3DEX2 で使用可能となります. バイナリレベルでの互換
性はないのでご注意ください.

具体的には, コンパイル時にマクロ F3DEX_GBI_2 を定義する必要があります.

C コンパイラ(cc/gcc)のオプションに -DF3DEX_GBI_2 を追加するか, ソース
ファイルの ultra64.h の include 文の前に define 文を以下のように追加し
てください.

|
|#define	F3DEX_GBI_2
|#include	<ultra64.h>
|

また以下の GBI はサポートしておりません.

  g[s]SPInsertMatrix()


● F3DEX2, F3DEX2.NoN, F3DEX2.Rej, F3DLX2.Rej, L3DEX2 のサポート

  F3DEX でサポートしていた F3DLX / F3DLX.NoN (F3DEX のサブピクセル計算
省略版) および F3DLP.Rej (F3DLX.Rej のテクスチャ補正省略版) のサポート
は無くなりました. この理由は F3DEX マイクロコードの最適化の結果, サブ
ピクセル計算やテクスチャ補正処理を省くことによるメリットがほぼ無くなっ
てしまったことによります. よってこれらのマイクロコードをお使いの方は以
下のような置き換えを行なってください. またマイクロコードの対応について
の詳しい情報は 付録 A にあります.

	gspF3DLX.fifo.o     を使用 ----> gspF3DEX2.fifo.o     を使う
	gspF3DLX.NoN.fifo.o を使用 ----> gspF3DEX2.NoN.fifo.o を使う
	gspF3DLP.Rej.fifo.o を使用 ----> gspF3DLX2.Rej.fifo.o または
	                                 gspF3DEX2.Rej.fifo.o を使う

  また F3DLX2.Rej のサブピクセル計算版の F3DEX2.Rej を新たにサポートし
ました. これは F3DEX2 と違い Clipping を行わず Rejection 処理を行ない
ますが頂点キャッシュが 64 個あり, 処理速度は F3DEX2 より速く,
F3DLX2.Rej より遅くなっています. また得られる画質は F3DEX2 と同等なの
で, 状況に応じて F3DLX2.Rej と F3DEX2.Rej を使い分けるとよいでしょう.


● S2DEX2 のサポート

  スプライトマイクロコードとして S2DEX のかわりに S2DEX2 を用意しまし
た. F3DEX2 シリーズと gSPLoadUcode による自己ロードをしたいときにはこ
れをご使用下さい.

	gspS2DEX.fifo.o を使用 ----> gspS2DEX2.fifo.o を使う

  S2DEX2 マイクロコードは S2DEX と全く性能は変わっていません. F3DEX2 
シリーズと相互にロードできるだけですので, F3DEX2 と混在して使用しない
限りは S2DEX をお使いになられても問題ありません.

  S2DEX2 では F3DEX2 と同様に XBUS 版をサポートしていますが, S2DEX で
サポートしていたデバグ用のマイクロコードである S2DEX_d マイクロコード
は S2DEX2 ではサポートしていません. ご了承ください.

  S2DEX2 マイクロコードの使用法は F3DEX2 と同様で以下のようにします.

	o マクロ F3DEX_GBI_2 をコンパイルオプションで定義するか define 文
	  で ultra64.h の include 文の前に定義する.
	o ヘッダファイル PR/gs2dex.h を ultra64.h の include 文以降に
	  include する.

	define 文を使用したときの例
	|
	|#define	F3DEX_GBI_2
	|#include	<ultra64.h>
	|#include	<PR/gs2dex.h>
	|


● RSP 計算速度の向上

  F3DEX シリーズと比べると F3DEX2 シリーズは 5 〜 70% もの処理時間軽減
が可能です. F3DEX から F3DEX2 への置換が最も軽減効果が大きいため, この
変更によって劇的に RSP の計算速度が改善する可能性があります. また 
F3DLX.Rej から F3DLX2.Rej への置換による軽減効果は F3DEX の時ほど大き
くはありませんが, それでも 5 〜 15% ぐらいありますので試してみる価値は
あるでしょう.


● XBUS マイクロコードのサポート

  グラフィクスマイクロコードは最終的には GBI コマンド列から RDP コマン
ド列を生成し RDP へ送ることによって描画を行うことになります. この RDP 
コマンド列の RDP への送信手法として XBUS 方式, FIFO 方式, DRAM(DUMP)方
式の 3 手法があります.

  FIFO 方式は RDP コマンドを RDRAM 上に FIFO バッファとして展開し RDP 
へ送るものです. これは F3DEX シリーズではこの方式のみがサポートされて
います.

  次に XBUS 方式は RDP コマンドを RSP と RDP を直接繋いでいる内部バス
(XBUS)を通じて RDP へ送るものです. このため FIFO と違い RDRAM を使用し
ません. 現在のライブラリに付随しているサンプルプログラムはこのマイクロ
コードを使用しているものが多数を占めています.

  DRAM(DUMP) 方式は RDP コマンドを RDRAM 上にだた展開するだけのもので
あり, RDP への送信開始処理は CPU がする必要があります. これは RDRAM の
使用量が余りに多いため実用的ではありません.

  歴史的には最初のマイクロコードである Fast3D (F3DEX の元になったバー
ジョン) マイクロコードシリーズには 3 つの手法それぞれに対応するマイク
ロコードがありました. しかし, F3DEX は頂点キャッシュを 16 から 32 に増
やすために XBUS 方式のときに RDP コマンドの送信に使用される内部バッファ
を頂点キャッシュ領域に使用したため, XBUS マイクロコードのサポートが出
来なくなりました. また FIFO マイクロコードと異なり XBUS マイクロコード
は Audio マイクロコードの動作中に RDP に描画処理をさせることが出来ない
ため全体的なパフォーマンスが上がらないため, XBUS のサポートを断念して
いました.

  今回, F3DEX2 シリーズのリリースにあたってこの内部バッファの使用法を
最適化することで, F3DEX シリーズと同じ数の頂点キャッシュを保ったままで
XBUS 方式のマイクロコードをサポートすることができるようになりました.

  XBUS バージョンのマイクロコードで RDP コマンドの送信に使用するの内部
バッファのサイズは通常の FIFO マイクロコードよりも小さいため (約 
1KBytes) RDP の描画処理に時間がかかるような大きな OBJECT を連続して描
画すると内部バッファが一杯になり, RSP は内部バッファが空くまで停止する
ことになります. これがボトルネックとなり RSP の演算処理が遅くなること
も有り得ます. また前記のように RSP での Audio 処理と RDP の描画処理を
並列に行なうこともできません. しかしながら FIFO よりも RDRAM に対する 
I/O が少ないため(約 1/2) RDRAM のバスの競合による CPU/RDP の速度低下に
対する有効な手段となる可能性があります. XBUS マイクロコードを使用され
る場合はいろいろな組み合わせを試してみてください.

  今まで Fast3D の XBUS マイクロコードを使用していたため, F3DEX を使用
できなかった方も, F3DEX2 マイクロコードに乗り換えられることをお勧めし
ます.  マイクロコードの対応についての情報は 付録 A の新旧マイクロコー
ド対応表を参照してください.


● Flat Shading ポリゴンに対する Fog 処理

  Flat Shading 処理されたポリゴン (G_SHADING_SMOOTH=OFF で描画) に対し
て Fog 処理を行なうことができるようになりました.


● CLIPRATIO のデフォルト値の変更

  Fast3D/F3DEX においての CLIPBOX のサイズを指定する CLIPRATIO のデフォ
ルト値が1 から 2 になりました.


● FIFO バッファの最低必要サイズの増大

  FIFO マイクロコードにおける FIFO バッファ (OSTask 構造体における 
output_buff) の最低必要サイズが大きくなりました. gspF3DEX で 0x300
Bytes だったものが

		gspF3DEX2(.NoN) で 0x410 Bytes 
		gspF3DEX2.Rej   で 0x600 Bytes 
		gspF3DLX2.Rej   で 0x600 Bytes 
		gspL3DEX2       で 0x540 Bytes
		gspS2DEX2	で 0x800 Bytes

となりました. もし複数のマイクロコードで FIFO バッファを共用する場合は, 
最も必要サイズが大きいマイクロコードに合わせる必要があります.
また XBUS マイクロコードには FIFO バッファは必要ありません.


● マイクロコードの自己ロード処理の変更

  マイクロコードを自己ロードしたときに, 幾つかのパラメータを保持するよ
うにしました. 保持するパラメータは以下の通りです.

  o DisplayList スタック
  o マトリクススタック
  o ModelView  マトリクス
  o Projection マトリクス
  o セグメントテーブル
  o Scissor Box の範囲
  o SetOtherMode パラメータ
  o PerspNormalize の値
  o ViewPort パラメータ

これ以外の GeometryMode や Light, 頂点キャッシュは保存されません.  ま
た Model および Projection マトリクスは保持されますが, MP マトリクスは
保持されませんので, 再度 M または P マトリクスのどちらか一方をロードし
MP マトリクスを再構成する必要があります.

  またこれらの変更に伴い, 以前の F3DEX/S2DEX マイクロコードとの自己ロー
ドが出来なくなっています. F3DEX2 シリーズ間および F3DEX2 と S2DEX2 マ
イクロコード間でのみ自己ロードが可能です.

  FIFO のマイクロコードと XBUS マイクロコード間でも自己ロードが可能と
なっています.


● F3DLX2.Rej の頂点ロードが一度に 64 個まで行なえるようになった.

  旧版の F3DLX.Rej では頂点キャッシュの数が 64 個になっていましたが,一
度にロードできる頂点の数は 32 個までという制限がありました. そのため 
64 頂点分のデータをロードするためには 2 つの gSPVertex 命令を発行する
必要がありました. 今回リリースする F3DLX2.Rej ではその制限が無くなり,
1 つの gSPVertex 命令で 1 〜 64 頂点分のデータを一度にロードできるよう
になりました. これは F3DEX2.Rej も同様です.


● F3DLX2.Rej の CULL_FRONT サポート

  旧版の F3DLX.Rej では CULL_FRONT/CULL_BOTH をサポートしていませんで
したが, F3DLX2.Rej では双方をサポートしました. F3DEX2.Rej でも当然
CULL_FRONT/CULL_BOTH はサポートしています.


● gSPForceMatrix の GBI 数の変更

  gSPForceMatrix は Fast3D/F3DEX シリーズでは, 4 つの GBI の複合コマン
ドでしたが, F3DEX2 シリーズでは 2 つの GBI の複合コマンドに変更されま
した. この点に依存しているソースコードは変更が必要です. 以下の例を参考
にしてください.

  <例> 修正の必要なコード

	Gfx *gp = glist;	----->	Gfx *gp = glist;
	gSPForceMatrix(gp, mptr);	gSPForceMatrix(gp, mptr);
	gp += 4;			gp += 2;
	     ~~~                             ~~~
  <例> 修正の不要なコード

	Gfx *gp = glist;
	gSPForceMatrix(gp++, mptr);


● Line マイクロコードにおける FillRectangle/TextureRectangle との共存

  Line マイクロコードを使用して Line を描画した後に再度 Scissor Box を
指定しないと FillRectangle/TextureRectangle が正常に描画できないことが
あるという点を L3DEX2 では修正しました. これにより LoadUCode によって 
L3DEX2 -> F3DEX2 というように切替えた場合でも ScissorBox の再設定なし
に描画可能となりました.


● Debug 用マイクロコード F3DEX2d.

  F3DEX2d マイクロコードは F3DEX2 を使用ているアプリケーションの 
RSP/RDP の Debug を補助するためのマイクロコードです. F3DEX2 と互換性が
あり Debug 時に F3DEX2 と置き換えて使用します.

  F3DEX2d には以下の機能があります.

   + RSP の暴走などの場合において, 最後に処理をしようとした Display List の
     物理アドレスを調べる.
   + RDP のパイプラインの Sync 処理を自動で行なう.

  この機能のため F3DEX2 と比べて処理は遅くなっています.

  マイクロコードのエントリの extern 定義をしているファイル ucode_debug.h を
include します.

	|
	|#include  <ucode_debug.h>
	|

, マクロ DEBUG_DL_PTR() を使用することで最後に処理しようとした(暴走時)また
は現在処理中(正常起動中)の Display List の物理アドレスを取得することができ
ます. 

	|
	|	u32	dl_adrs;
	|
	|	dl_adrs = DEBUG_DL_PTR();
	|

  ただし, マイクロコードが完全に暴走状態にあった場合, この物理アドレス
データの保存場所を破壊する可能性もあるので 100% 取得できることは保証で
きません. しかしながら通常は有益な情報を返すことが期待できます.


-------------------------------------------------------------------------------
3. 付録

[A] 新旧マイクロコード対応表

	------------------------------------------------------
	  (旧)Fast3D/F3DEX シリーズ	(新)F3DEX2 シリーズ	
	------------------------------------------------------
	<FIFO>
  	  gspFast3D.fifo.o
	  gspF3DEX.fifo.o      		gspF3DEX2.fifo.o
	  gspF3DLX.fifo.o
	<XBUS>
	  gspFast3D.o			gspF3DEX2.xbus.o
	------------------------------------------------------
	<FIFO>
	  gspF3DNoN.fifo.o
	  gspF3DEX.NoN.fifo.o		gspF3DEX2.NoN.fifo.o
	  gspF3DLX.NoN.fifo.o
	<XBUS>
	  gspF3DNoN.o			gspF3DEX2.NoN.xbus.o
	------------------------------------------------------
	<FIFO>
	  gspF3DLP.Rej.fifo.o
	  gspF3DLX.Rej.fifo.o		gspF3DLX2.Rej.fifo.o 
					gspF3DEX2.Rej.fifo.o 
	<XBUS>
	  対応なし			gspF3DLX2.Rej.fifo.o 
					gspF3DEX2.Rej.fifo.o 
	------------------------------------------------------
	<FIFO>
	  gspLine3D.fifo.o
	  gspL3DEX.fifo.o		gspL3DEX2.fifo.o
	<XBUS>
	  gspLine3D.o			gspL3DEX2.xbus.o
	------------------------------------------------------

	------------------------------------------------------
	<FIFO>
	  gspS2DEX.fifo.o		gspS2DEX2.fifo.o
	  gspS2DEX_d.fifo.o		サポートなし
	<XBUS>
	  対応なし			gspS2DEX2.xbus.o 
	------------------------------------------------------

-------------------------------------------------------------------------------
[B] 各マイクロコードの説明

	gspF3DEX2.fifo.o/gspF3DEX2.xbus.o
		頂点キャッシュ数 32
		サブピクセル計算あり
		クリッピングあり
		
	gspF3DEX2.NoN.fifo.o/gspF3DEX2.NoN.xbus.o
		頂点キャッシュ数 32
		サブピクセル計算あり
		NearPlane 以外の平面によるクリッピングあり
		
	gspF3DEX2.Rej.fifo.o/gspF3DEX2.Rej.xbus.o
		頂点キャッシュ数 64
		サブピクセル計算あり
		リジェクション処理
		(3 角形の一部分が CLIPBOX 外なら 3 角形全体の描画を止める)

	gspF3DLX2.Rej.fifo.o/gspF3DLX2.Rej.xbus.o
		頂点キャッシュ数 64
		サブピクセル計算なし
		リジェクション処理
		(3 角形の一部分が CLIPBOX 外なら 3 角形全体の描画を止める)

	gspL3DEX2.fifo.o/gspL3DEX2.xbus.o
		ラインマイクロコード
		頂点キャッシュ数 32
		サブピクセル計算あり
		クリッピングあり

	gspS2DEX2.fifo.o/gspS2DEX2.xbus.o
		スプライトマイクロコード

-------------------------------------------------------------------------------
4. 変更履歴

03/26/98:
    Release 2.00
	* 正式リリース

03/30/98:
    Release 2.01
	* F3DEX2.Rej を追加, F3DLX2.Rej の若干の高速化

04/16/98:
    Release 2.02 (patchNg980423 版)
	* gSPForceMatrix の GBI 数の変更/Line マイクロコードにおける 
	  FillRectangle/TextureRectangle との共存についての情報の追加
	* 空のスタックに対し gSPPopMatrix 処理をしたときに暴走するのを
	  修正し, スタックが空の時は gSPPopMatrix を無視するようにした.
	* gSPLoadUcodeL で F3DEX2 シリーズと相互ロードが可能な S2DEX2
	  マイクロコードをパッケージに追加し, それに関する説明を追加した.
	* S2DEX 1.06 において gSPBgRectCopy 命令で幅の狭いフレームに対
	  する描画処理が正常に機能しなかったことの修正.
	* Flat Shading を使用したときにクリッピング処理が起きると Flat
	  Shading の色が不定になることの修正.
	* gSPLightColor で LIGHT_1 以外の指定がおかしかったことの修正.

04/23/98:
    Release 2.03
	* gSPBranchLessZ* 命令が正常に動作しないことの修正.
	* ライトを 3 個以上使用したときにカラーが正しくでないことの修正.

05/20/98:
    Release 2.04
	* 128 で正規化された法線ベクトルが設定された頂点を含む3角形の
	  ライティング計算が正常に行われない場合があることの修正.

05/28/98:
    Release 2.04 (patchNg980610 版)
	* G_TEXTURE_ENABLE を無効にするために gbi.h を変更.
	* マイクロコードは 05/20/98 版から変更なし

06/15/98:
    Release 2.05
	* G_TEXTURE_GEN_LINEAR の動作を修正.
	* F3DEX2.NoN で視点の手前から NearPlane の間に描画されるポリゴンの
	  Z 座標値が定義範囲を超えることの修正.
	* クリッピング処理によってクリップされた結果多角形に変換されたポリ
	  ゴンを描画したときの結果を F3DEX シリーズのそれとなるべく等しくな
	  るように描画方法を変更.

07/29/98:
    Release 2.06
	* F3DEX2.NoN における NearClip 処理の不都合を修正.

10/04/98:
    Release 2.07
	* F3DEX2, F3DEX2.NoN, F3DEX2.Rej において隣接したポリゴンの境界に小
	  さな穴が開くことがあるのを修正.

01/05/99:
    Release 2.08
	* 一部のマイクロコードを起動した直後に F3DEX2 を起動した場合に, 
	  レジスタの初期化に失敗する可能性があるのを修正.
	* Debug 用マイクロコードの追加. 本ドキュメントの 2 章に関連項目
	  を追加.

-------------------------------------------------------------------------------