EmbeddedWizardアプリはGPU(グラフィックプロセッサユニット)で動作することを前提としている。しかし調査の結果、GPUを使うための“入口”であるEGL(Embedded-System Graphics Library)を経由できていないことが判明している。その結果GPUを使えていない。
[ Embedded Wizard ]
↓
[ OpenGL ES ]
↓
(EGL失敗)★
↓
[ llvmpipe(CPU) ]
↓
[ DRM/KMS ]
↓
[ DSI 表示 ]
この状態をさらに調査した結果、接続されているFreenove5インチの表示デバイスはDSI_1に接続されているが、EmbeddedWizardにおける表示デバイスの判定としてDSI_0と認識されていることが判明した。このDSI_0の認識はEmbeddedWizardが提供するソースに依存していることが分かった。gfx_system_drm.c内のGfxSystemInit( void )関数における以下のopen関数コール後の判定が根本原因である。
DrmFd = open( DrmDevices[ dev ], O_RDWR );
resources = drmModeGetResources( DrmFd );
if ( resources )
break;
本来DrmDevicesのconnectを判定条件とするべきであるが、デバイスの存在を判定条件としている。これでは0から始まるDrmDevicesの判定で0にて判定クリアとなりbreakとなる。実際はデバイスは1で接続されているので、EGLは0の表示先が存在しないため間違ったデバイスであると認識することになりEGLの初期化に失敗することになる。
修正としては、DrmDevicesを1で固定として判定する修正を実施している。
修正結果として以下のengineの消費時間が増加していることが確認でき、かつtopでもCPU占有時間を90%から10%以下にダウンできている。
cat /proc/*/fdinfo/* | grep drm-engine
drm-engine-bin: 1435627157 ns
drm-engine-render: 12307580191 ns
現在実現しているEmbeddedWizardアプリにおいては、GPUを使わないCPUオンリーの処理でもグラフィック表示は違和感なくできているが、GPU(グラフィックプロセッサユニット)を使う本来の方式を実現できたので、より動きのあるグラフィックスの表示対応のケースも自信をもって実現できると考える。
