2015/02/14
Raspberry Pi 2 OpenGL ES のレイヤー合成
大幅に強化された CPU と違い、GPU 周りは Raspberry Pi 1 とほとんど変わっていないようです。
以前移植したコードが Raspberry Pi 2 でもそのまま動いています。
Raspberry Pi 2 の Desktop (Raspbian) から起動できる Minecraft は、
一見 Windows 内で動いているように見えますが他のウィンドウの下に隠れることができません。
3D Rendering 自体は別のレイヤーに描画されており、
スクリーンに対して Overlay で表示されているようです。

↑ 上のように半透明が描画されているシーンだけ下のウィンドウが透けて見えます。
フレームバッファに alpha 値が入るとレイヤー同士の合成とみなされてしまうため。
この辺りの挙動は Window 無しのフルスクリーン描画と違いがないようです。
自分が移植したプログラムでも最初は下記のようになっていました。

↑背景を alpha = 0.0f でクリアしていたため console と合成されてしまっています。
うっすら見えているのは alpha 値が入っているところだけです。
OpenGL で常に Alpha=1.0 を書き込んでも良いのですが、
VideoCore の API でも指定できるようです。
下記のように alpha に固定値 255 を指定することで layer が不透明になりました。
↓不透明になったもの

他にも位置の指定や拡縮、90度回転や反転等の指定もできるようです。
↓ ありもののケース(旧型)

関連エントリ
・Raspberry Pi 2 で速くなったコンパイル時間の比較
以前移植したコードが Raspberry Pi 2 でもそのまま動いています。
Raspberry Pi 2 の Desktop (Raspbian) から起動できる Minecraft は、
一見 Windows 内で動いているように見えますが他のウィンドウの下に隠れることができません。
3D Rendering 自体は別のレイヤーに描画されており、
スクリーンに対して Overlay で表示されているようです。

↑ 上のように半透明が描画されているシーンだけ下のウィンドウが透けて見えます。
フレームバッファに alpha 値が入るとレイヤー同士の合成とみなされてしまうため。
この辺りの挙動は Window 無しのフルスクリーン描画と違いがないようです。
自分が移植したプログラムでも最初は下記のようになっていました。

↑背景を alpha = 0.0f でクリアしていたため console と合成されてしまっています。
うっすら見えているのは alpha 値が入っているところだけです。
OpenGL で常に Alpha=1.0 を書き込んでも良いのですが、
VideoCore の API でも指定できるようです。
下記のように alpha に固定値 255 を指定することで layer が不透明になりました。
static VC_DISPMANX_ALPHA_T alpha= {
DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS,
255,
NULL
};
dispman_element= vc_dispmanx_element_add(
dispman_update, // DISPMANX_UPDATE_HANDLE_T
dispman_display, // DISPMANX_DISPLAY_HANDLE_T
0, // layer
&dest_rect, // VC_RECT_T*
0, // DISPMANX_RESOURCE_HANDLE_T
&src_rect, // VC_RECT_T*
DISPMANX_PROTECTION_NONE, // DISPMANX_PROTECTION_T
&alpha, // VC_DISPMANX_ALPHA_T
NULL, // DISPMANX_CLAMP_T*
DISPMANX_NO_ROTATE // DISPMANX_TRANSFORM_T
);
DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS,
255,
NULL
};
dispman_element= vc_dispmanx_element_add(
dispman_update, // DISPMANX_UPDATE_HANDLE_T
dispman_display, // DISPMANX_DISPLAY_HANDLE_T
0, // layer
&dest_rect, // VC_RECT_T*
0, // DISPMANX_RESOURCE_HANDLE_T
&src_rect, // VC_RECT_T*
DISPMANX_PROTECTION_NONE, // DISPMANX_PROTECTION_T
&alpha, // VC_DISPMANX_ALPHA_T
NULL, // DISPMANX_CLAMP_T*
DISPMANX_NO_ROTATE // DISPMANX_TRANSFORM_T
);
↓不透明になったもの

他にも位置の指定や拡縮、90度回転や反転等の指定もできるようです。
↓ ありもののケース(旧型)

関連エントリ
・Raspberry Pi 2 で速くなったコンパイル時間の比較
2015/02/12
Raspberry Pi 2 で速くなったコンパイル時間の比較
Raspberry Pi 2 を入手したので使ってみました。
ARM11 の Raspberry Pi と比べると格段に速くなっています。
VFP Benchmark の比較
ARM11 世代の VFP と比べると core あたり 2.6倍 (単精度時,クロック差含む)。
詳細な結果は下記に追加しました
・VFP Benchmark Log
Cortex-A7 は big.LITTLE でも省電力 core として用いられており、
単体の性能はあまり高くありません。
それでもエントリークラスのスマートフォンやタブレットでは
同じ Cortex-A7 Quad core のデバイスが多数リリースされています。
Snapdraogn 400 MSM8926/8226 や MT8125/8389/6582 など、
それなりにバランスが良い構成なのだと思われます。
下記は手持ちライブラリ(flatlib3)のビルド時間の比較です。
36分から 5分半へと現実的な数値になりました。
SD Card の速度に依存するためあまり正確ではないですが、
およそ 6.6倍で公称値通りといえそうです。
Raspberry Pi 2 でそのままビルドすると ARMv6 のバイナリが生成されるため、
gcc-4.8 -march=armv7-a mfpu=neon-vfpv4 のオプションでコンパイルしています。
下記はそれぞれの詳細です。
GPU 周りは変わっていないようです。下記ページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
ARM11 の Raspberry Pi と比べると格段に速くなっています。
VFP Benchmark の比較
CPU clock single fp double fp ---------------------------------------------------------------- Raspberry Pi B ARM1176 0.7GHz x1 0.674 GFLOPS 0.674 GFLOPS Raspberry Pi 2 Cortex-A7 0.9GHz x4 7.087 GFLOPS 3.472 GFLOPS
ARM11 世代の VFP と比べると core あたり 2.6倍 (単精度時,クロック差含む)。
詳細な結果は下記に追加しました
・VFP Benchmark Log
Cortex-A7 は big.LITTLE でも省電力 core として用いられており、
単体の性能はあまり高くありません。
それでもエントリークラスのスマートフォンやタブレットでは
同じ Cortex-A7 Quad core のデバイスが多数リリースされています。
Snapdraogn 400 MSM8926/8226 や MT8125/8389/6582 など、
それなりにバランスが良い構成なのだと思われます。
下記は手持ちライブラリ(flatlib3)のビルド時間の比較です。
36分から 5分半へと現実的な数値になりました。
SD Card の速度に依存するためあまり正確ではないですが、
およそ 6.6倍で公称値通りといえそうです。
Clock core ISA RAM gcc-4.8 clang-3.4 --------------------------------------------------------------------------- (1) Raspberry Pi B ARM1176JZF 0.7GHz x1 armv6l 0.5GB 36m18s (2) Raspberry Pi 2 Cortex-A7 0.9GHz x4 armv7l 1GB 5m29s (3) Nexus 7 2012 Cortex-A9 1.3GHz x4 armv7l 1GB 3m42s (4) Atom Z540 Bonnell 1.8GHz x1+HT x86 2GB 6m23s 6m18s (5) BayTrail-D J1900 Silvermont 2.0GHz x4 x86_64 8GB 1m30s 1m11s (6) Athlon-5350 Jaguar 2.0GHz x4 x86_64 8GB 1m33s 1m10s (7) Core i7-2720QM SandyBridge 2.2GHz x4+HT x86_64 16GB 0m31s 0m24s ・36m18s = 36分18秒 ・値は実行時間(3回の平均)。数値が小さい方が高速
Raspberry Pi 2 でそのままビルドすると ARMv6 のバイナリが生成されるため、
gcc-4.8 -march=armv7-a mfpu=neon-vfpv4 のオプションでコンパイルしています。
下記はそれぞれの詳細です。
(1) Raspberry Pi model B BMC2835 ARM1176JZF 0.7GHz x1 RAM 512MB, SD 16GB Debian wheezy armv6l (console) (2) Raspberry Pi 2 model B BMC2836 Cortex-A7 0.9GHz x4 RAM 1GB DDR2, SD 16GB Debian wheezy armv7l (console) gcc-4.8 (-march=armv7-a mfpu=neon-vfpv4) (3) Nexus 7 (2012) Tegra 3 T30L Cortex-A9 1.3GHz x4 RAM 1GB DDR3L, 8GB Ubuntu 13.04 armv7l (console) (4) VAIO Type P Atom Z540 Bonnell 1.86GHz x1+HT RAM 2GB, SSD 64GB Ubuntu 14.04LTS x86 (console) (5) Desktop PC BayTrail-D Celeron J1900 Silvermont 2.0GHz x4 RAM 8GB, HDD Ubuntu 14.04LTS x86_64 (6) Desktop PC Athlon-5350 Jaguar 2.0GHz x4 RAM 8GB, HDD Ubuntu 14.04LTS x86_64 (7) Desktop PC Core i7-2720QM SandyBridge 2.2GHz x4+HT RAM 16GB, HDD Ubuntu 14.04LTS x86_64
GPU 周りは変わっていないようです。下記ページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)