この章では、SX 上での XGL 3.1 の動作について説明します。 SX と XGL/SX ドライバの効果的な使用方法を理解するために、SX と XGL/SX ドライバの実装方法についても説明します。
SX は、ピクセル操作を高速化するプログラム可能なデバイスです。XGL では以下の操作と、その他のピクセルデータ (カラーと Z バッファーを含む) の読み取りと書き込みの操作を高速化することができます。
ピクセルデータは、ビデオ RAM (cg14 フレームバッファー 、VRAM)、あるいは主記憶 (DRAM) に置かれます。
SPARCstation 10SX システムおよび SPARCstation 20 システム は、すべての XGL ピクセル操作を高速化するために使用されます。ただし、特定の属性が設定されていないと、テクスチャー MipMap からテクスチャーされたピクセルへのアクセスは加速されません。
SX は、浮動小数点演算をサポートしていません。したがって、変換、クリップの確認、クリッピング、および 2 次元と 3 次元のグラフィックスのパイプラインを含む光源処理は、CPU で行われます。SX は CPU と並列に動作するので、SX がオブジェクトを描画している間に、CPU は次のオブジェクトを変換します。
SX は、単一のハードウェアコンテキストを持っています。このコンテキストは、SX を使用するすべてのプロセスの間で切り替えられます。たとえば、Xlib を使用してサーバーの SX ドライバ経由でピクセルを描画し、次に XGL を使用して XGL/SX ドライバ経由でピクセルを描画すると、ハードウェアコンテキストが 2 つのプロセスの間で切り替えられるために、遅延が発生します。たとえば、性能測定プログラムを実行中に、SX のコンテキストが測定プロセスとアプリケーションの間で切り替わるとき、アプリケーションの動きに目に見える中断が発生します。Xlib と XGL の描画が混在するときには、Direct X を使用することをお薦めします。Direct X を使用すると、コンテキストの切り替えが発生しません。同じ SX コンテキストが、Xlib 描画呼び出しと XGL/SX ドライバで共有されるためです。同様に、同じプロセスに XIL、XGL と X の直接呼び出しが混在しても、コンテキストの切り替えは起こりません。
フレームバッファー (cg14) は、8 ビットおよび 24 ビットのドロアブルをサポートし、同時に両方を表示することができます。他の 8 ビットダブルバッファーを持つドロアブルが、ウィンドウ識別子を使い切っていない場合には、cg14 はダブルバッファリングのためにバッファー切り換えを使用します。そうでなければ、XGL/SX ドライバは、 SX を使用してコピーを高速化し、コピーダブルバッファリングを使用します。24 ビットドロアブルでは、ドライバはコピーダブルバッファリングを常に使用します。
Z バッファーは、Z バッファリングを有効にした XGL ラスタごとに 1 つ割り当てられ、DRAM に格納されます。SX は、Z バッファーの消去と比較を高速化します。
SXDRAM が利用できる場合には、XGL/SX ドライバは Z バッファーとしてそれを使用し、バックバッファーとしてもそれを使用します (ダブルバッファリングが可能で、コピーダブルバッファリングが使用されている場合)。SXDRAM を使用すると、線の描画とコンテキスト切り換えの性能が顕著に向上します。他のピクセル操作は、約 10 〜 20 % 速くなります。
XGL/SX ドライバのリリース 3.1 は、3 次元 triangle_strips や multi_simple_polygons などの高速テクスチャーマッピングを部分的にサポートしています。XGL 属性を以下に示す値に設定できる場合は、すべてのテクスチャーマッピング機能を完全にサポートすることができますが、その場合、SPARCstation 10SX と SPARCstation 20 のハードウェアは、以下のテクスチャー面を描画するために使用されます。
XGL_3D_CTX_SURF_FACE_DISTINGUISH FALSE XGL_3D_CTX_SURF_FRONT_ILLUMINATION XGL_ILLUM_NONE XGL_3D_CTX_SURF_TMAP_PERSP_CORRECTION XGL_TEXTURE_PERSP_NONE Xgl_texture_interp_method XGL_TEXTURE_INTERP_POINT (desc.interp_info.filter1/filter2) Xgl_texture_op XGL_TEXTURE_OP_REPLACE (desc.comp_info.render_component_desc[0].texture_op)
テクスチャーを保持するための SXDRAM が必要です。テクスチャーのサイズに対する SXDRAM の容量を計算する際の詳細については、第 2 章「SX 高速化アプリケーションへの DRAM の割り当て」を参照してください。
XGL/SX ドライバでは、利用可能な cg14 の画像表示形式のうち、以下の画像をサポートしています。
8 ビット疑似カラー
8 ビットスタティックカラー
8 ビットスタティックグレー
8 ビットグレースケール
24 ビットトゥルーカラー
アプリケーションは、8 ビットダイレクトカラーと 8 ビットトゥルーカラー画像を認識し、XGL と一緒に使用しないようにプログラムする必要があります (XGL は、そのような画像表示で XGL ラスターを作成しません)。 また、ウィンドウシステムは defdepth 24 で起動される可能性があるため (詳細は、openwin (1) のマニュアルページを参照)、アプリケーションは、ルートウィンドウが深さ 8 で、デフォルトのカラーマップを利用できると見なすことはできません。
蓄積バッファリング (グローバルな平滑化) を使用する場合は、0 以外 のジッター値を使用する必要があります。XGL/SX ドライバは、X および Y のジッター値が 0 の場合は、3 次元で Bresenham 方式の線を描画し、それ以外の場合は、正確にサンプリングした線 (蓄積に適している) を描画します。
性能を向上させるために、XGL/SX ドライバの正常な操作で、0 除算や浮動小数点のオーバーフローの発生が黙認されます。デフォルトでは、これらの例外は無視されます。アプリケーションがこれらの例外を有効にする場合は、例外を無視するように設定したあと、XGL を呼び出します。
SX は、ピッキングとしてラスター化方式を使用します。詳細は、『Solaris XGL Reference Manual』を参照してください。
XGL/SX ドライバは、適切な XGL_DEV_COLOR_TYPE と XGL_DEV_REAL_COLOR_TYPE だけをサポートします。これらは両方とも、XGL_COLOR_INDEX または XGL_COLOR_RGB である必要があります。それ以外の場合は、より低速の XGL/Xlib ドライバを使用して、ウィンドウラスターが描画されます。
平滑化された線と点を表示する前に、cg14config (1M) を使用してモニターに合ったガンマ値を設定します。正しく実行するには、まず以下のように入力します。
/platform/SUNW,SPARCstation-10,SX/sbin/cg14config -g 2.2 -u 2.2
ガンマ値が上記のように設定されていないと、平滑化されたオブジェクトが正しく表示されません。
三角形以外の多角形を描画するには、gcache を使用してください。
すべての描画関数が、XGL/SX ドライバによって等しく高速化されるわけではありません。最もよく使用される描画関数の性能向上に力を注いでいます。完全ではありませんが、以下に性能向上に効果のある描画関数の一覧を示します。この一覧にない関数が低速ということではありません。それらは、XGL/SX ドライバの次のリリースのものほど高速でないことを意味します。使用するアプリケーションに関する重要な操作がこの一覧にない場合は、その操作の速度向上を要求してください。
表 4-1 性能向上に効果のあるXGL 関数
xgl_context_copy_raster() |
ウィンドウラスタからウィンドウラスタへのコピー |
xgl_multi_marker() |
半径 1 〜 32 ピクセルの 2 次元の円 |
xgl_multi_polyline() |
2 次元では、細い線、実線あるいはパターン、カラーなしまたは均一な値、XGL_CTX_ROP が XGL_ROP_COPY の線 3 次元では、細い線、実線あるいはパターン、カラーなし、フラグ、均一な値またはデータ値、モデルクリップなし、+w クリップのみ、XGL_CTX_ROP が XGL_ROP_COPY の線 |
xgl_multi_simple_polygon() |
3 次元の三角形。ヒントフラグは、XGL_FACET_FLAG_SIDES_ARE_3 です |
xgl_triangle_strip() |
均一な値やデータ値なし、モデルクリップなし、+w クリップのみ、24 ビットで、エッジなし、塗りつぶしで不透明、XGL_3D_CTX_Z_BUFFER_COMP_METHOD が XGL_Z_COMP_LESS_THAN_OR_EQUAL の三角形 |
xgl_context_accumulate() |
すべての操作 |