Creator グラフィックスアクセラレータにおける XIL の高速化
|
この章では、Creator または Creator3D グラフィックスアクセラレータに固有の XIL 関数について説明します。
XIL はサンの画像イメージとビデオのライブラリです。主要な XIL 関数では、UltraSPARC Visual Instruction Set (VIS) と Creator グラフィックスアクセラレータを使用する Ultra シリーズにおける動作が高速化されています。
XIL データの種類
XIL は一般的な画像構造をサポートしていますが、VIS や Creator を使用した XIL の画像がすべて高速化されるわけではありません。VIS ポートがサポートする XIL データの種類を以下に示します。
- 1、2、3、4 バンドの符号なしバイト画像
- 1、2、3、4 バンドの符号付き簡略画像
- バンド調整された子画像
- 全画像処理領域
- XIL_PIXEL_SEQUENTIAL 型の画像
高速化された関数
VIS を使用して高速化された XIL 関数を以下に示します。画像分子は、1 バンドと 3 バンド XIL_BYTE イメージに定義されています。
表 4-1 高速化された XIL 関数
関数
|
VIS 高速化
|
画像分子
|
コメント
|
8 ビット
|
16 ビット
|
表示
|
その他
|
xil_absolute
|
|
1 - 4 バンド
|
|
|
|
xil_add
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_add_constant
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_affine
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
注 6 参照
|
xil_and
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_and_constant
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_band_combine
|
1 - 4 バンド
|
1 - 4 バンド
|
|
|
|
xil_blend
|
1 - 4 バンド
|
1 - 4 バンド
|
|
|
|
xil_cast
8 x 16
16 x 8
|
1 - 4 バンド
1 - 4 バンド
|
1 - 4 バンド
1 - 4 バンド
|
x
|
|
|
xil_convolve
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
注 1 参照
|
xil_copy
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_decompress
|
|
|
|
|
注 2、5 参照
|
xil_get_pixel
|
|
|
|
|
注 4 参照
|
xil_lookup
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
x
|
注 5 参照
|
xil_max
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_min
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_multiply
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_multiply_constant
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_not
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_or
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_or_constant
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_rescale
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
x
|
注 3、5 参照
|
xil_rotate
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
注 6 参照
|
xil_scale
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
x
|
注 5、6 参照
|
xil_set_pixel
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
注 4 参照
|
xil_set_value
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_subtract
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_subtract_const
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_subtract_from_const
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_tablewarp
|
|
|
x
|
|
注 4 参照
|
xil_threshold
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
x
|
注 3、5 参照
|
xil_transpose
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_xor
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
xil_xor_const
|
1 - 4 バンド
|
1 - 4 バンド
|
x
|
|
|
注 1 -- xil-convolve は、3 × 3、5 × 5、7 × 7 のカーネルにより高速化されています。
注 2 -- xil_decompress は、以下の場合に高速化されます。
- xil_decompress + color_convert (JPEG 圧縮画像またはシーケンス、MPEG1 圧縮シーケンス)
- xil_decompress + color_convert + disply (JPEG 圧縮画像またはシーケンス、MPEG1 圧縮シーケンス)
- xil_decompress + color_convert + scale + display (MPEG1 圧縮シーケンス)
このデコーダは、最高精度 24 ビット CCIR 601 YCC → RGB709 カラー空間変換に付着します。
以下の場合には、ストリームの伸張処理が高速化されません。
- JPEG または MPEG1 のストリームが、メモリー中で一連したバッファーとなっていない場合、たとえば xil_cis_put_bits_ptr によって分割されたストリームの伸張処理などは高速化されません。
- ストリーム中のフレームの 1 つが、何らかの理由 (たとえば伸張処理を実行中に、フレーム内で無効なデータが検出されるなど) によって高速化されない場合には、ストリーム中の後続のフレームの伸張処理も高速化されません。
- ストリーム中で、順方向または逆方向の検索を実行する場合は高速化されません。
注 3 -- xil_rescale + xil_threshold + xil_threshold + 画像分子は、Creator のデプスキューイングハードウェアを使用して高速化されますが、以下の制限が適用されます。
- 第 1 のしきい値は 255 を上限値とします。また、下限値とマップ値を同一のものとします。第 1 しきい値を N とすれば、N は 0 〜 255 の間の任意の数となります。
- 第 2 のしきい値は 0 を下限値とします。また、上限値とマップ値を同一のものとします。第 2 しきい値を M とすれば、M は 0 〜 N 間の任意の数となります。
- xil_rescale のパラメタ値は、変域 (x) が 0 〜 255 の時に、値域 (y) に N および M の両方のしきい値が含まれるように設定する必要があります。これを図示すると、図 4-1 のようにパラメタ値の関数 y = f(x) が、0 ≦ x ≦ 255 の範囲内で直線 y = N、y = M の両方と交わる時に有効となります。
- 画像は、1 バンドの XIL_BYTE である必要があります。
図 4-1 Creator のデプスキューイング
この分子を呼び出す、正しいコードの例を以下に示します。
float scale[1] = 1.5;float offset[1] = -10;float t1_lo[1] = 255;float t1_hi[1] = 240;float t1_map[1] = 240;float t2_lo[1] = 0;float t2_hi[1] = 15;float t2_map[1] = 15;xil_rescale(src,tmp1,scale,offset);xil_threshold(tmp1,tmp2,t1_lo,t1_hi,t1_map);xil_threshold(tmp2,tmp3,t2_lo,t2_hi,t2_map);xil_display(tmp3,display);
|
同一の呼出しシーケンスが scale[1] = .40 で行われた場合、y = 0.40* x - 10 では、y =-10 〜 y = (255*0.40) - 10 = 92、x = 0 〜 x = 255 の範囲にしか及ばないため、この分子は呼び出されません。この分子を実行するためには、x = 0 〜 x = 255 に対してy = 15 〜 y = 240 である必要があります。
注 4 -- xil_get_pixel、xil_set_pixel、xil_tablewarp は、画像分子として扱われた場合のみ高速化されます。xil_tablewarp では、interpolation = "nearest" だけが高速化されます。
注 5 -- 以下の分子は、すべて 高速化されます (単一 xil 機能 + 表示を除く)。
- xil_decompress + xil_colorconvert [+ display] (JPEG 画像)
- xil_decompress + xil_colorconvert [+ display] (MPEG1 画像)
- xil_decompress + xil_colorconvert + xil_scale + display (MPEG1 画像)
- xil_threshold + xil_threshold [+ display]
- [xil_rescale] + [xil_threshold] + [xil_threshold] + [xil_cast] + display
- xil_scale + xil_lookup + display (高速化された分子は、8 x 8 ビットまたは 16 x 8 ビットのルックアップに従う 8 ビットまたは 16 ビットのバイリニアスケールです。)
注 6 -- xil_affine、xil_scale、xil_rotate の高速化には、いくつかの制限があります。xil_affine と xil_rotate は、最近傍補間処理をされた 1、3、4 バンドの画像およびバイリニア補間処理またはバイキュービック補間処理をされた 1 バンドと 3 バンドの画像に対してのみ高速化されます。interpolation = "general" と設定した場合の xil_scale では、再サンプリングカーネルのサイズは、8 ビット画像に対して 8 × 8、16 ビット画像に対して 8 × 4 に制限されます。
ダブルバッファーのサポート
XIL 関数は、(Creator シリーズなど) ダブルバッファーが搭載されているハードウェア上でのダブルバッファーをサポートします。この節では、ダブルバッファーのサポート機能と使用法について説明します。
機能:
- xil_create_double_buffered_window
- xil_set_active_buffer
- xil_get_active_buffer
- xil_swap_buffers
表示画像をダブルバッファーの表示画像として使用する場合は、xil_create_from_window を使用するかわりに xil_create_double_buffered_window を使用して画像を作成してください。ダブルバッファーをサポートしていないハードウェア上で xil_create_double_buffer_window を実行すると、無効なデバイスが返されます。開発者は、このことを理解して xil_create_from_window を呼び出す必要があります。
ダブルバッファーをサポートするハードウェア上で xil_create_double_buffered_window を実行して画像を作成した場合は、XilBufferId が有効となり、XIL_BACK_BUFFER と XIL_FRONT_BUFFER の 2 つの値を選択することができます。このようなウィンドウでは、バッファーのひとつが常時アクティブで、画像に書き込みをするすべての機能が、アクティブなバッファーに書き込みます (たとえば、画像へのコピーは画像のアクティブなバッファーへピクセルをコピーします)。一方、前面にあるバッファーが画面に表示される部分ですが、作成時に実際にアクティブなバッファーは XIL_BACK_BUFFER です。
xil_create_double_buffered_window でダブルバッファーの画像を作成した後に、その画像を表示画像として使用する場合には、実際にアクティブなバッファーが XIL_BACK_BUFFER であるため、特に必要な作業はありません。アクティブなバッファーが XIL_FRONT_BUFFER である場合には、画像処理操作は失敗しませんが、その画像をダブルバッファーの画像として使用することはできません。この画像を再びダブルバッファーの画像として使用する場合は、以下のように呼び出してください。
# xil_set_active_buffer(dest,XIL_BACK_BUFFER)
|
これにより、フロントバッファーからバックバッファーへの変換が実行されます。この場合、ユーザーによる以下の呼び出しなしでは、画像の内容は表示されません。
この操作により、画像の内容を見ることができるようになります。ダブルバッファーの画像が不要になった場合には、以下のように呼び出してください。
# xil_set_active_buffer(dest,XIL_FRONT_BUFFER)
|
この操作により、ハードウェアの書き込みおよび表示バッファーはデフォルト値にリセットされます。
以下にダブルバッファーを使用する場合の、一般的なプログラム例を示します。
dest = xil_create_double_buffered_window(state,display,dwindow);
...
for (i=0; i<repeat; i++) {
...
xil_lookup(src,dest,lut);
xil_swap_buffers(dest);
}
xil_set_active_buffer(dest,XIL_FRONT_BUFFER);
|
Sun フレームバッファー使用の手引き
| 817-0408-10
|
|
Copyright© 2002, Sun Microsystems, Inc. All rights reserved.