みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

ラズベリーパイ3 warriorのglimagesinkがエラー

2019/10/09 追記

はじめに

warrior(2.7)でcore-image-baseを作ってgstreamerで遊ぼうとしたら、次のコマンドでエラーが発生した。

$ export GST_GL_WINDOW=dispmanx ; export GST_GL_API=gles2 ; export GST_GL_PLATFORM=egl
$ gst-launch-1.0 v4l2src device=/dev/video0 ! videobox ! capsfilter caps=video/x-raw,format=AYUV,width=640,height=480,framerate=30/1 !  glimagesink

エラーの内容は次の通り。

ERROR: Pipeline doesn't want to pause.
Got context from element 'sink': gst.gl.GLDisplay=context, gst.gl.GLDisplay=(GstGLDisplay)"\(GstGLDisplayEGL\)\ gldisplayegl0";
ERROR: from element /GstPipeline:pipeline0/GstGLImageSinkBin:glimagesinkbin0/GstGLImageSink:sink: Failed to initialize egl: EGL_NOT_INITIALIZED

EGLの初期化ができていないらしい。

このコマンドはインターフェース 2019年9月号に掲載された第30回 ラズパイ早送りタイムラプス動画カメラで書かせてもらった時に、thud(2.6)で動作確認しているため、 コマンドライン自体に問題はないはず。(リスト5)

ビルド環境の確認

EGL関連で少し思い当たるフシがあるためビルド環境の環境変数を確認。

thud

$ bitbake core-image-base -e | grep '^MACHINE_FEATURES='
MACHINE_FEATURES=" apm usbhost keyboard vfat ext2 screen touchscreen alsa bluetooth wifi sdio qemu-usermode"

warrior

$ bitbake core-image-base -e | grep '^MACHINE_FEATURES='
MACHINE_FEATURES=" apm usbhost keyboard vfat ext2 screen touchscreen alsa bluetooth wifi sdio vc4graphics qemu-usermode"

やはり、デフォルトでvc4graphicsが有効化されている。

これはX環境でもOpenGLが使えるようにするドライバを有効にするためのフラグで、オンになっているとドライバがOpenGLのリソースを先に取ってしまうようになる。

そのため、直接EGLを叩くglimagesinkのようなものを動かそうとすると、リソースが取れずに初期化が失敗する。

これを無効化するにはlocal.confに次の行を追加する。

MACHINE_FEATURES_remove = "vc4graphics"

2019/10/09 追記

どうやらこの記事を書いた後に、デフォルトで実行になったvc4graphicsを無効にするフラグが実装されていた。

commit 96c8459c9363cc6bf463aedf4d24f92a1ee7d6ba
Author: Andrei Gherzan <andrei@gherzan.ro>
Date:   Fri Sep 13 12:25:49 2019 +0100

    rpi-base.inc: Introduce DISABLE_VC4GRAPHICS
    
    Since we enabled vc4graphics by default[1], there is no easy way to disable
    it if needed. This patch introduces a variable (DISABLE_VC4GRAPHICS)
    which when set to '1' will not add 'vc4graphics' to MACHINE_FEATURES
    forcing the old behaviour.
    One could use it in 'local.conf' for example.
    
    [1] https://github.com/agherzan/meta-raspberrypi/pull/417
    
    Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>

なのでlocal.confに次を追加するほうが、筋がいい感じ。

DISABLE_VC4GRAPHICS = "1"

2019/10/09 追記終了

これで環境変数を再度確認する。

$ bitbake core-image-base -e | grep '^MACHINE_FEATURES='
MACHINE_FEATURES=" apm usbhost keyboard vfat ext2 screen touchscreen alsa bluetooth wifi sdio  qemu-usermode"

すでにビルドしてしまった状態のビルドディレクトリでbitbakeを実行するとファイルが競合するため、一度tmp以下をすべて削除する。

$ rm -rf ./sstate-cache/ tmp/ cache/ bitbake-cookerdaemon.log

-c cleansstateだとゴミが残るようだし-c cleanallだとダウンロード済みのソースまで消えてしまうので、あえて手動で消している。(これもっとスマートに解消できる方法ないかなぁ。。。)

まとめ

meta-raspberrypiのwarriorからは、MACHINE_FEATURESにvc4graphicsがデフォルトで入るようになっているので注意が必要。