RPi2にPiTFT3.5を実装したyocto環境でQt5を組み込みQt Quick2のQMLアプリケーションを実行してみたところエラーがでて実行できなかった。 その原因を調査したのでメモ。
原因はOpenGL
Qt Quick2はOpenGLに依存している
Qt Quick2はOpenGLに依存しており、OpenGLが使用できない環境では実行することができない。 OpenGLが無い状況下でQMLアプリケーションを実行すると下記のエラーが発生する。
QtQuick: failed to create OpenGL context
PiTFT3.5ではOpenGLは使用できない
RPi2ではOpenGLはGPUで描画するために、高速なI/Fで接続されている必要があるが、 PiTFT3.5はGPIOヘッダ上のSPIにより接続されているので、この要件が満たせない。
2.2インチや2.8インチのPiTFTではGPUを使用せずにOpenGLを描画することができるが、この仕組みを使用しても、3.5インチのPiTFTでは転送するピクセル数が多く、リフレッシュが間に合わないため実用に耐えないとのこと。
回避策はないか
結果的にはどれもうまくいかなかった。 ソフトウェアの方でQMLのレンダリングをOpenGL使用しない手段がいくつか考えられたが、どれも使用できなかった。
Qt Quick 2D Renderer
QMLの描画処理の中でOpenGLに依存する部分をソフトウェアでエミュレーションする、OpenGLが使えない環境のためのプラグイン。 組み込み環境などを想定している。
これは有償機能なので、今回は試していない。
Mesa OpenGL backend
platformをxcbに限定して、Mesaの機能でソフトウェアでの描画を試みる。
LIBGL_ALWAYS_SOFTWARE
LibGLが使用する環境変数で、この変数がセットされている場合は常にソフトウェアでレンダリングする様になる。
Mesaが持っているソフトウェアレンダラは下記のものがある。
- llvmpipe - LLVMを使用しx86向けのJITコードをマルチスレッドで生成する。
- softpipe - Galliumドライバのリファレンス。
- swrast - Mesaのレガシーかつオリジナルのソフトウェアラスタライザ。
meta-raspberrypi環境で使用されるmesa-glにはswrastが含まれている。しかし、platform xcbとして、LIBGL_ALWAYS_SOFTWAREをセットしても「QtQuick: failed to create OpenGL context」は解消されなかった。
Mesaの機能についての詳細は下記を参照。
QT_XCB_FORCE_SOFTWARE_OPENGL
LIBGL_ALWAYS_SOFTWAREの影響をQtアプリのみ限定するための環境変数。 QT_XCB_FORCE_SOFTWARE_OPENGLがセットされていると、Qtアプリケーション内部で自動的に LIBGL_ALWAYS_SOFTWAREが有効化される。 結局はLIBGL_ALWAYS_SOFTWAREが効果なしだったためこちらも効果なし。