osViGetCurrentFramebuffer.htm
9.8 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
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osVi(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osViGetStatus, osViGetCurrentMode,
osViGetCurrentLine, osViGetCurrentField, osViGetCurrentFramebuffer,
osViGetNextFramebuffer, osViSetMode, osViSetEvent, osViSetSpecialFeatures,
osViSetXScale, osViSetYScale, osViSwapBuffer, osViBlack, osViFade,
osViRepeatLine, osCreateViManager</FONT>
<P>
→ ビデオインターフェイス(VI)のためのマネージメント関数
<BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<P>
<B>u32 osViGetStatus(void);</B>
<P>
u32 osViGetCurrentMode(void);
<P>
u32 osViGetCurrentLine(void);
<P>
u32 osViGetCurrentField(void);
<P>
void *osViGetCurrentFramebuffer(void);
<P>
void *osViGetNextFramebuffer(void);
<P>
void osViSetMode(OSViMode *mode);
<P>
void osViSetEvent(OSMesgQueue *mq, OSMesg msg, u32
retraceCount);
<P>
void osViSetSpecialFeatures(u32 func);
<P>
void osViSetXScale(f32 xscale);
<P>
void osViSetYScale(f32 yscale);
<P>
void osViSwapBuffer(void *vaddr);
<P>
void osViBlack(u8 active);
<P>
void osViFade(u8 active, u16 factor);
<P>
void osViRepeatLine(u8 active);
<P>
void osCreateViManager(OSPri pri);<BR>
<P>
<B>説明<BR>
</B>
<P>
ビデオインターフェイス(VI)は数々のビデオモードでRDPレンダリングイメージをディスプレイする管理を行います。現在、VIは42のディスプレイモードをサポートし、内NTSCが14、PALで14、MPALで14となります。それぞれのモードでインターレースとノンインターレース、16bitと32bitピクセルカラー、そしてロウ及びハイレゾリューションの様なアトリビュート操作の異なるセッティングが含まれています。さらにモードはレンダリングスピードの低下を解消するためにイメージをリスケールすることも可能です。28のモードは5つのスイッチによって表されるハイ/ロウレゾリューション、16/32bitカラーピクセル、アンチエイリアシング/ポイントサンプリング、フィルタリング/ノンフィルタリング、そしてMPAL/PAL/NTSCフォーマットでサポートされています。<os.h>中にそれらのモードのために定義された象徴的な名前があります。たとえば、OS_VI_NTSC_LPNがロウレゾリューション、ポイントサンプリング、ノンインターレース、16bitカラーピクセルをサポートしていることを表しています。同様に、OS_VI_PAL_LPN1はPALフォーマットでの同じモードを表しています。シンボルネームの最後の4文字(i.e.
LPN1)はそれぞれの文字の位置に下記のコード使用して組み立てられています。
<BR>
<P>
1st position = high resolution (H) / low resolution
(L)
<P>
2nd position = antialiasing (A) / point-sampled (P)
<P>
3rd position = for low res: non-interlace (N) / interlace
(F)
<P>
for high res: normal-interlace (N) / defliceres interlace
(F)
<P>
4th position = 16-bit pixel size (1) / 32-bit pixcel
size (2)<BR>
<P>
上記コードによって、以下の14モードがPAL/MPALモード同様NTSCモードにおいてもサポートされています:LPN1,
LPF1, LAN1, LAF1, LPN2, LPF2, LAN2, LAF2, HPN1, HPF1, HAN1, HAF1,HPN2,
HPF2。<BR>
<P>
ロウレゾリューション(320ピクセル×240ライン)では、ノンインターレースとインターレースモードが選択できます。ノンインターレースモードはそれぞれのフィールドで同じフレームを繰り返します。インターレースモードは隣り合ったラインの間に最初のフィールドで75%の上ラインに25%の下ラインを加え、2番目のフィールドで25%の上ラインに75%の下ラインを加えて入れていきます。注意として、高い空間周波数がないので、フリッカー(ちらつき)はありません。
<BR>
<P>
ハイレゾリューション(640ピクセル×480ライン)では、ノーマルインターレースとデフリッカードインターレースの選択があります。ノーマルインターレースはそのフィールドディスプレイに1フィールドでレンダリングされたデータのみを使用します。このモードは、1つのフィールドが次のレンダリングされている間にお互いに処理することなくディスプレイされることが可能なので、ダブルバッファリングを加える必要なく、1つのハイレゾリューションフレームバッファを使用することができます。しかしながら、いくつかの非常に小さなピクセル単体は1フィールド中にだけそれがディスプレイされるので、ちらつきます。デフリッカードインターレースは高周波の垂直ディテールを流し出すために両方のレンダリングフィールドが各々のフィールドで表示するために使用されるので、完全なハイレゾリューションフレームのダブルバッファリングを行うことによって、隣接したラインを平均化します。
<BR>
<P>
現在、これらの42のモードをセッティングするレジスタを含むグローバルなVIモードテーブルosViModeTableが存在します。osViSetModeは次の垂直リトレイスで使用されるVIとこれらのモードの1つを登録するために使用されます。この関数は単にmode(osViModeTable中のポインタ)からのデータですべてのVIレジスタを上書きします。それ以前の全てのセッティング(XYスケーリングとガンマ補正)がリセットされます。例えばNTSC、ロウレゾリューション、アンチエイリアシング、ノンインターレースを登録するために、以下の様に記述します。
<BR>
<P>
osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
<BR>
<P>
さらに、効率的に保存するために、グローバルVIモードテーブルはそれぞれのストラクチャが独立したソースファイルにグローバルに定義されている42のセパレートモードストラクチャに分割されます。これらのストラクチャは外面的には<os.h>中に宣言されています。上述に相当するモードにアクセスするためには次のコールを行います。
<BR>
<P>
osViSetMode(&osViModeNtscLan1); <BR>
<P>
osViGetCurrentModeコールは現在使用されているVIモードを返します。
<BR>
<P>
ディスプレイモードをセットした後、アプリケーションはメッセージキューmqとメッセージmをVIマネージャに登録するためにosViSetEventをコールしなければいけません。これによって垂直リトレイスが発生したときにプログラムがVIマネージャからメッセージ待ち行列mqに通知メッセージmを受け取ることができます。1よりも大きい数値(たとえば2)にretraceCountをセッティングすることは60Hzの代わりに30Hzの低速で実行することを許可し、アプリケーションが垂直リトレイスの通知を受け取る周期を減少させます。
<BR>
<P>
VIマネージャはアプリケーション開始時に優先順位priをもってosCreateViManagerをコールすることにより指定しなければいけません。通常、この優先順位は<os.h>中で定義されるOS_PRIORITY_VIMGRであるべきです。VIマネージャはVIインタラプト(OS_EVENT_VI)とCPUカウンタインタラプト(OS_EVENT_COUNTER)の両方をもっとも効果的な方法でサポートするためにデザインされています。カウンタインタラプトはタイママネージャによって使用されます。
<BR>
<P>
ディスプレイモードとメッセージキューがVIマネージャで登録されてから、アプリケーションは次のVブランク割り込み時にディスプレイするためのフレームバッファframeBufferPtrを登録するためのosViSwapBufferをコールする必要があります。
<BR>
NINTENDO64の電源投入時に、ブートコードがNTSC/PAL/MPALそしてビデオのブランクに合わせて設定します。osCreateViManager()コールすると、ビデオからLAN1(NTSC/PAL/MPALのどれか)やビデオブランクも初期化しあmす。
<BR>
<BR>
<BR>
<P>
osViSetXScaleはライン毎にレンダリングされた減少したピクセル数から必要とされるディスプレイフォーマットに水平に(X軸方向に)イメージをスケーリングさせます。変数xscaleはスケーリングファクターを指定し、そのレンジは0.25から1.0が可能です。同様に、osViSetYScaleはフレーム毎にレンダリングされた減少したライン数から必要とされるディスプレイフォーマットに垂直イメージを(Y軸方向に)スケーリングすることを許可します。YスケーリングはLAN1,
LAN2, LPN1, LPN2の様なロウレゾリューションでノンインターレイスモードでのみ使用可能です。変数はスケーリングファクターを指定し、0.05から1.0間での範囲が指定可能です。
<BR>
<P>
osViSpecialFeaturesはGAMMA, GAMMA_DITHER, DIVOT,
DITHER_FILTERの様なVIスペシャルフィーチャーのイネーブル/ディスエーブル変数を許可します。OS_VI_GAMMA_ON,
OS_VI_GAMMA_OFF,OS_VI_GAMMA_DITHER_ON,OS_VI_GAMMA_DITHER_OFF,OS_VI_DIVOT_ON,
OS_VI_DIVOT_OFF, OS_VI_DITHER_FILTER_ON, OS_VI_DITHER_FILTER_OFFのシンボリックなfuncが<os.h>中に定義されています。それらはスペシャルフィーチャーのイネーブルまたはディスエーブルのためにビットORして使用できます。
<BR>
<P>
<B>osViGetStatus</B>は単にビデオインターフェイスステータス/コントロールレジスタ変数を返します。unsign型の32bitの返値は<rcp.h>中に定義されているビットパターン変数を含んでいます。ビットパターンは以下のようになります。
<BR>
</FONT>
<P>
<B>VI_CTRL_TYPE_16</B> :16bitピクセルサイズ
<P>
<B>VI_CTRL_TYPE_32</B> :32bitピクセルサイズ
<P>
<B>VI_CTRL_GAMMA_DITHER_ON </B>:gamma_ditherモードイネーブル
<P>
<B>VI_CTRL_GAMMA_ON</B> :gamma補正イネーブル
<P>
<B>VI_CTRL_DIVOT_ON</B> :divotモードイネーブル
<P>
<B>VI_CTRL_SERRATE_ON</B> :serrateモードイネーブル
<P>
<B>VI_CTRL_DITHER_FILTER_ON</B>
:dither filterモードイネーブル <BR>
</FONT>
<P>
これらのビットパターンはビデオインターフェイスステータス割り込みへの返値に対してマスクする(ANDする)ことが可能です。
<BR>
<P>
osViGetCurrentLineはいったんライン毎にサンプリングされた現在のハーフラインを返します。この変数の最下位ビット(lsb)はノンインターレースモードではフィールド中には固定です。しかしインターレースモードではフィールドナンバー(0または1)を与えるためのトグルになります。
<BR>
<P>
osViGetCurrentFieldはVIによって現在アクセスされているフィールドナンバー(0または1)を返します。
<BR>
<P>
osViGetCurrentFramebufferは単に現在ディスプレイされているフレームバッファへのポインタを返します。osViGetNextFramebufferは次にディスプレイされるフレームバッファへのポインタを返します。
<BR>
<P>
基本的なアクティブフラグのセット(TRUE(イネーブル)またはFALSE(ディスエーブル))として、osViBlackは垂直リトレイス信号が発生するまでスクリーンをブラックアウトすることができます。ロウレゾリューション、ポイントサンプリング、ノンインターレースモード(LPN1,LPN2など)では、それはフレームバッファの最初の2スキャンライン内にフェードするためにosViFade中の10bitの少数値を使用することができます。さらに、osViRepeatLineは全体のフレームについてフレームバッファの最初のスキャンラインを繰り返すために使用することができます。
<BR>
<P>
<B>注意<BR>
</B>
<P>
VIマネージャは垂直リトレイス割り込みが可能な限り早く与えられるためにプログラムの最初にスタートされなければなりません。注意として、osViSetModeはX-Yスケーリングやスペシャルフィーチャー(i.e.
gamma)などの現在のすべてのセッティングをグローバルモードテーブルに定義されたデフォルト値にリセットします。
<BR>
<P>
<B>参照<BR>
<A HREF="osSetEventMesg.htm"><B>osSetEventMesg</B></A>(3P),<A HREF="osGetTime.htm"><B>osGetTime</B></A>(3P)
<BR>
<BR>
</B>
</BODY>
</HTML>