Qt Waylandコンポジター

Qt Wayland CompositorはWaylandプロトコルに基づいたカスタムディスプレイサーバーを開発するための便利で強力なQMLとC++ APIを提供するモジュールです。しばしばコンポジターと呼ばれるディスプレイサーバーは、Waylandプロトコルをサポートするクライアントアプリケーションからのコンテンツを表示します。

Waylandの設計哲学は、コア・プロトコルをシンプルかつ最小限に保つことです。開発者はこのコア・プロトコルを用途に応じた拡張機能で拡張することができます。Qt Wayland Compositorは多くの一般的な拡張機能をデフォルトでサポートしており、また新しいカスタム拡張機能を作成するためのAPIも備えています。

通常、Qt Wayland Compositorで書かれたコンポジターは、より大きなアプリケーションマネージャプロセスの中のサブシステムになります。Qt Wayland Compositorはクライアントと通信し、コンテンツを画面に表示するためのAPIを提供します。QML APIにはQtの他の部分と簡単に統合できる高レベルのAPIが含まれており、Qt Quickを通じて便利なアニメーションやエフェクト、UIを実現します。より低レベルなアクセスが必要な場合は、C++ API も利用できます。

アプリケーション・マネージャは通常、アプリケーション・ライフサイクル、仮想キーボード入力、セキュリティ、プロセス間通信(IPC)などの追加機能を実装します。Qt は、アプリケーションマネージャの残りの部分を他のモジュールで開発するために使用できる API を提供します。Qt Automotive SuiteはQt Wayland Compositorを使用して開発されたコンポジタを含む完全なアプリケーションマネージャであるQt Application Managerを提供します。

Waylandの詳細については、WaylandとQtを参照してください。

Qt Wayland Compositorの特徴

Qt Wayland Compositorにはコンポジターの作成に必要な機能が含まれています:

  • Qt Quickのすべての機能と完全に統合された、クライアントコンテンツを表示・操作するためのQML API。
  • 低レベルのアクセスと制御のためのC++ API
  • XDG Shell や IVI Application などの一般的な拡張機能のサポート。
  • カスタム拡張機能のサポートを簡単に拡張する API。

環境変数とコマンドライン引数

Qt Wayland Compositorは以下の環境変数とコマンドライン引数を認識します:

  • 環境変数
    • QT_WAYLAND_HARDWARE_INTEGRATION使用するハードウェア統合プラグインを選択します。
    • QT_WAYLAND_CLIENT_BUFFER_INTEGRATION使用するクライアント・バッファ統合プラグインを選択します。
    • QT_WAYLAND_SERVER_BUFFER_INTEGRATION使用するサーバー統合プラグインを選択します。
  • コマンドライン引数:
    • --wayland-socket-name クライアントとの通信に使用されるデフォルトのソケット名を上書きします。

Waylandコンポジターの実行

プラットフォーム固有の機能に依存しない限り、コンポジターはX11ベースのデスクトップ・システムで簡単にテストできます。これは、デバッグの簡略化や、新機能を試す際の効率的なターンアラウンドのために、開発中に有用です。

Qt Waylandは、クライアントとサーバー間でグラフィックス・バッファを共有するためのバックエンドをいくつかサポートしています。主なものは以下の通りです:

  • wayland-egl:これはデフォルトのバックエンドであり、可能な限り優先されるべきものです。これが動作するには、システムのOpenGLドライバがサポートしている必要があります。

他のバックエンドは環境変数QT_WAYLAND_CLIENT_BUFFER_INTEGRATION を設定することで選択できます。

注意: Qt Wayland Compositorがクライアントバッファバックエンドを初期化できない場合、フェイルセーフとして "共有メモリ "バックエンド(wl_shm に基づく)を使用します。このバックエンドは、グラフィックスバッファの共有にCPUメモリを使用し、必要に応じてデータを前後にコピーします。これは、特に高密度のスクリーンや限られたグラフィック・ハードウェアにおいて、パフォーマンスに影響を及ぼします。Qt Wayland Compositorのパフォーマンス問題を調査する場合、正しいクライアントバッファの統合が使用されているか確認することから始めてください。

また、システムがすでにWaylandコンポジターを実行している場合、XDG_RUNTIME_DIR 、別の場所を指すように設定する必要があるかもしれません。この場合、コンポジターの起動時に警告が表示されます。XDG_RUNTIME_DIR 、すでに使用されていないアクセス可能な場所を指定することができます。

例えば、fancy-compositor のサンプルをwayland-egl バックエンドで実行したい場合、次のコマンドラインを使用します:

% XDG_RUNTIME_DIR=~/my_temporary_runtime QT_XCB_GL_INTEGRATION=xcb_egl QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=wayland-egl ./fancy-compositor

同じXDG_RUNTIME_DIR を設定し、"-platform wayland "をコマンドライン引数として渡すことで、クライアントをコンポジター上で実行することができます。環境変数QT_QPA_PLATFORM を使用して、クライアント側でWayland QPAプラグインを選択することもできます。

注意: ほとんどの場合、クライアントは接続時にサーバーと同じOpenGLに適応します。しかし、いくつかの特定のドライバー上でEGLバックエンドを使用して実行する場合、初期化がより早く行われる必要があります。この問題が発生した場合、代わりに"-platform wayland-egl "を渡すことで、クライアントをEGLに事前に初期化することができます。

トラブルシューティング

複雑なコンポジターを開発していると、さらなる調査が必要な問題に遭遇することがあります。

環境変数WAYLAND_DEBUG を "1 "に設定すると、Waylandライブラリ自体のログ出力が有効になります。これは例えばWaylandプロトコルのカスタム拡張をデバッグするときに非常に便利です。どのイベントやリクエストがクライアントとサーバー間でやり取りされているか、タイムスタンプも含めて正確に表示されます。

さらに、Qt にはqt.waylandcompositor.*qt.qpa.wayland.* というロギングカテゴリがあり、追加のロギングを有効にすることができます。後者はWayland QPAプラグインからのロギングを有効にするため、クライアント側で設定する必要があります。

Qt Wayland Compositor Examplesで、これらのAPIを使ってカスタムコンポジターを作成する方法をご覧ください。

APIリファレンス

Qt Wayland CompositorはC++またはQMLから使用できます:

さらに、このモジュールはCMake関数qt_generate_wayland_protocol_server_sources()を提供します。

モジュールの進化

Qt 6への移植 - Qt Wayland Compositorでは、Qt 6シリーズのQtのために行われたモジュールのAPIと機能の重要な変更点を挙げています。

ライセンスと帰属

Qt Wayland CompositorとQt Wayland統合プラグインはThe Qt Companyから商用ライセンスで提供されています。

また、Qt Wayland CompositorはGNU General Public License, version 3で、Qt Wayland統合プラグインはGNU Lesser General Public License, version 3またはGNU General Public License, version 2で提供されています。

詳細はQt Licensingをご覧ください。

Qt Wayland CompositorとQt Wayland統合プラグインは以下の寛容なライセンスのもとでプロトコル定義を使用します:

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。