Qt Quick の OpenVG 対応

この記事は The Qt BlogGetting more out of Qt Quick with OpenVG を翻訳したものです。
執筆: Andy Nichols (nezticle), 2017年3月31日

Qt 5.9 では Qt Quick アプリケーションを OpenVG を利用して描画することが可能になりました。これは EGL と OpenVG によって Qt Quick のシーンを描画するための新しいシーングラフの拡張対応によって可能になりました。Qt for Device Creation が対応している環境の中には、これまでソフトウェアによる描画しか選択肢が無かったハードウェアでもグラフィックスのアクセラレーションが可能になるものがいくつかあります。

OpenVG Logo

OpenVG とは?(既に知っている方は... OpenVG ってマジ? )

OpenVG は 2D のベクターグラフィック向けのハードウェアアクセラレーションの API です。ハードウェアを利用したパスや画像の描画を API として提供しています。OpenVG 1.1 は Khronos Group によって公開され、GPU ベンダーによって実装されました。このセクションのタイトルに皮肉が込められているのとこれを読んでいる人の多くが目を回しているのは OpenVG は昔から存在するテクノロジーだからでしょう。最新の OpenVG 1.1 のリリースは 2008 年で、Khronos の OpenVG のワーキンググループは既に解散していて、今後のアップデートの予定はありそうにありません。

Qt が OpenVG をサポートするのは今回が初めてではありません。Qt 4 では OpenVG の API で QPainter の命令を描画する OpenGL の描画エンジンというものが存在しました。そのコードを復活させるのは避けたかったので、OpenVG の API で Qt Quick アプリケーションの描画を高速化するようなサブセットの道を選びました。

今さら OpenVG なの?

Qt は様々な組み込み機器で使われていますが、Qt Quick の力を最大限活かすには OpenGL 2.0 以上が必要とされてきました。同時に、OpenGL 非対応の GPU を搭載したローエンドの組み込みハードウェアで Qt Quick を動かしたいというお客様の声も多く聞きました。このため、まずは Qt Quick 2D Renderer と呼んでいたソフトウェアの実装を追加しました。詳しくは これこの記事 を参照してください。しかし、世の中には OpenGL 2.0 には対応していないけれど OpenVG 1.1 には対応している GPU を載せたハードウェアが存在しています。OpenVG は実際 Qt Quick の描画の高速化とは相性が良く、OpenVG 対応の GPU が載っているハードウェアではほとんどの機能を有効活用して高いパフォーマンスを実現することができました。

NXP の iMX6 SoloLite や Vybird VF5xxR などがこの構成に該当する SoC で、どちらも OpenVG がサポートされている GC355 Vector GPU が搭載されています。OpenVG のワーキンググループが標準化の活動をする可能性は極めて低いですが、SoC ベンダーは今でも OpenVG をサポートするハードウェアの開発を行っています。

パフォーマンスは?

今回の OpenVG 対応の目的は OpenGL とソフトウェアレンダリングの間を埋めることです。OpenGL と OpenVG の両方をサポートするハードウェアでは、一般的に OpenGL での描画の方が最適化の余地が多いため OpenVG よりも性能が出ます。Raspberry Pi で OpenVG の対応を確認するとデフォルトの OpenGL での描画の方が性能が良く 60 FPS を切ることは無いでしょう。

どうやれば OpenVG での描画になるのでしょう?

OpenVG のバックエンドを利用するには、Qt をビルドし直す必要があります。Qt 5.9 では OpenVG のテストも有効にし、 Qt Quick でも使えるようにしました。組み込み機器向けに準備した Qt のビルドが整っている場合は、EGL がサポートされているプラットフォームプラグインを用いてアプリケーションを起動してください。QT_QUICK_BACKEND=openvg と環境変数が設定されている場合に、起動した Qt Quick アプリケーションは OpenVG の機能が有効になった EGL のサーフェスを生成し、OpenVG の命令を利用して描画をします。詳細はドキュメントのスナップショットの scenegraph adaptation section をご覧ください。

制限事項

ソフトウェアによる実装と同様に、OpenVG による描画も 3D やシェーダーエフェクトに関するいくつかの制限事項があります。OpenGL や ShaderEffects に直接的に依存している QML のコンポーネントの利用はできません。もしソフトウェアでの描画で問題なく動作している場合には、OpenVG のバックエンドはハードウェアを利用してより速く動作するでしょう。

EGLFS プラットフォームプラグイン自体にも制限が発生します。Qt for Device Creation で EGLFS プラグインを使っている場合にマウスカーソルと複数の子ウィンドウを利用する事が多々あると思いますが、EGL Fullscreen というプラグインの名前にも関わらずいくつかのことにのみ OpenGL を使っているだけになります。複数のウィンドウやマウスカーソルの重ね合わせがこれにあたり、EGLFS を OpenGL の無いプラットフォームで利用する場合は、これらの機能は利用できません。製品として出荷する段階ではあまり問題になりませんが、開発中にこの問題に直面する可能性があります。おもしろいことに、Qt 4 の QWS 向けの OpenVG の描画エンジンにもこれととても似た制限がありました。

まとめ

組み込みの世界では使えるリソースは最大限活用する必要があります。今回の OpenVG 対応は Qt に対するそのような要求を満たすための一つの方法になります。この対応によって組み込み機器の開発の苦労が一つ減り、みなさんが製品開発の楽しい部分にもっと時間を費やすことができるとうれしいです。最後まで読んでくれてありがとうございました。


Blog Topics:

Comments