特記事項: SPARCstation 10SX、SPARCstation 20

第 4 章 SX の XGL アクセラレータ

この章では、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 の割り当て」を参照してください。

X の画像表示形式

XGL/SX ドライバでは、利用可能な cg14 の画像表示形式のうち、以下の画像をサポートしています。

アプリケーションは、8 ビットダイレクトカラーと 8 ビットトゥルーカラー画像を認識し、XGL と一緒に使用しないようにプログラムする必要があります (XGL は、そのような画像表示で XGL ラスターを作成しません)。 また、ウィンドウシステムは defdepth 24 で起動される可能性があるため (詳細は、openwin (1) のマニュアルページを参照)、アプリケーションは、ルートウィンドウが深さ 8 で、デフォルトのカラーマップを利用できると見なすことはできません。

XGL_3D_CTX_JITTER_OFFSET

蓄積バッファリング (グローバルな平滑化) を使用する場合は、0 以外 のジッター値を使用する必要があります。XGL/SX ドライバは、X および Y のジッター値が 0 の場合は、3 次元で Bresenham 方式の線を描画し、それ以外の場合は、正確にサンプリングした線 (蓄積に適している) を描画します。

SIGFPE

性能を向上させるために、XGL/SX ドライバの正常な操作で、0 除算や浮動小数点のオーバーフローの発生が黙認されます。デフォルトでは、これらの例外は無視されます。アプリケーションがこれらの例外を有効にする場合は、例外を無視するように設定したあと、XGL を呼び出します。

XGL_CTX_PICK_APERTURE

SX は、ピッキングとしてラスター化方式を使用します。詳細は、『Solaris XGL Reference Manual』を参照してください。

XGL_DEV_COLOR_TYPE と XGL_DEV_REAL_COLOR_TYPE

XGL/SX ドライバは、適切な XGL_DEV_COLOR_TYPEXGL_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_ROPXGL_ROP_COPY の線

3 次元では、細い線、実線あるいはパターン、カラーなし、フラグ、均一な値またはデータ値、モデルクリップなし、+w クリップのみ、XGL_CTX_ROPXGL_ROP_COPY の線

xgl_multi_simple_polygon()

3 次元の三角形。ヒントフラグは、XGL_FACET_FLAG_SIDES_ARE_3 です

xgl_triangle_strip()

均一な値やデータ値なし、モデルクリップなし、+w クリップのみ、24 ビットで、エッジなし、塗りつぶしで不透明、XGL_3D_CTX_Z_BUFFER_COMP_METHODXGL_Z_COMP_LESS_THAN_OR_EQUAL の三角形

xgl_context_accumulate()

すべての操作