続・玩式草子 ―戯れせんとや生まれけん―

第33回 Days of WINE and Struggles again[2]

この記事を読むのに必要な時間:およそ 5 分

前回3Dグラフィックスの技術の歴史を振り返り,Windowsが利用しているDirectX(Direct3D)の機能をWineではOpenGLやVulkanを利用して実現していること,そのOpenGLやVulkanの機能をOSSとして実装しているのがMesa3Dライブラリであることなどを紹介しました。

元々Mesaは,OpenGLをソフトウェア的に実現するライブラリとして開発が始まったものの,ビデオカードが急速に進化し,プログラム可能なGPUを搭載するようになると,GPUを操作する機能を一括して担うようになりました。

自社のビデオカード/GPUにしか対応しない商用ドライバに比べ,Mesaは複数メーカに対応できるよう設計が工夫され,各機能はライブラリやモジュール化されたドライバとして提供されています。Mesaも長い歴史を持つプロジェクトで,調べていくとあれこれ興味深い話題が出てくるので,今回は少し脱線してMesa3Dライブラリについて語ってみましょう。

Mesa3Dライブラリの提供する機能

先に述べたように,現在のMesa3Dライブラリは,元々の目的だったOpenGL機能の実装に留まらず,GPUを操作するための総合的なライブラリに発展し,その役割は大きく以下の3つに分けられます。

  • (1)OpenGL/OpenGL ES/Vulkanといった3Dグラフィックス機能
  • (2)各種動画コーデックのハードウェア処理機能
  • (3)GPUをグラフィックス以外の演算に利用するGPGPU機能

自社のGPU用にのみこれらの機能を提供すればいい商用ドライバに対し,Mesa3Dライブラリは,Intel/AMD/NVIDIAと言ったデスクトップPC用のGPUに留まらず,Android用のSoC化されたGPUまで手広く対応しています。

それら全てを扱うことは困難なので,ここではPlamo Linux用に作成したmesaパッケージを元に,どのファイルがどの機能を担っているのかを紹介することにしましょう。

Plamo Linuxでは,あるパッケージがどのようなファイルをインストールしたかを/var/log/packages/以下にテキストファイルで記録しているので,このディレクトリにあるmesaパッケージの記録を元に説明します。この記録は1行1ファイルなので,"cat -n"で連番を振ってみたものの,説明の都合上,取りあげる行は前後することをご理解ください。

$ cat -n /var/log/packages/mesa
   1  PACKAGE NAME:     mesa-21.1.8-x86_64-B1
   2  COMPRESSED PACKAGE SIZE:     59467 K
   3  UNCOMPRESSED PACKAGE SIZE:     220210 K
   ...

(1)3Dグラフィックス用ライブラリ

まずは,⁠1)の各種3Dグラフィックス用のライブラリから紹介しましょう。これらはOpenGL/GLX用,EGL用,Vulkan用等に分けられ,/usr/lib/以下にインストールされています。

(a)OpenGL/GLX/EGL用のライブラリ

65  usr/lib/libglapi.so.0.0.0
77  usr/lib/libOSMesa.so.8.0.0
71  usr/lib/libGLX_mesa.so.0.0.0
72  usr/lib/libgbm.so.1.0.0
73  usr/lib/libEGL_mesa.so.0.0.0

(b)Vulkan用のライブラリ

66  usr/lib/libVkLayer_MESA_overlay.so
67  usr/lib/libVkLayer_MESA_device_select.so
69  usr/lib/libVkLayer_INTEL_nullhw.so
68  usr/lib/libvulkan_radeon.so
70  usr/lib/libvulkan_intel.so
79  usr/lib/libvulkan_lvp.so

(a)に分類したのがMesa3Dライブラリが元々の対象としていたOpenGL関連のライブラリで,77行目のlibOSMesa.soがOpenGL/OpenGL ESを処理するためのライブラリ,71行目のlibGLX_mesal.soはX Window SystemからOpenGLを使う際に利用するライブラリ,65行目のlibglapiと72行目のlibgbmはこれらライブラリの機能を補助するためのライブラリです。

OpenGLでは「レンダリング・コンテキスト(RC⁠⁠」という形で描画データ(オブジェクト)を扱うものの,元々シングル・スレッド環境を前提に設計されたOpenGLでは複数のRCを扱うことができないため,libglapiによってRCに応じたAPIを呼び出すようになっているそうです。またlibgbmは"GeneralBuffer Management"の名前の通り,バッファ管理用のライブラリです。

73行目のlibEGL_mesa.soは,EGL(Native Platform Graphics Interface)という機能を提供するライブラリで,主にOpenGL ESから利用され,OpenGLではハードウェア用のドライバが担っていた機能をソフトウェア的に提供し,Nativeなグラフィック環境(XやMS Windows)に依存しないコードを書くことを可能にします。すなわちEGL用に作成したアプリは,EGL経由でX上でもMS Windows上でもAndroid上でも動作可能になるわけです。

(b)に分類したのがVulkan用のライブラリで,68,70行目のlibvulkan_{radeon,intel}.soがレンダリング処理にAMDやIntelのGPUの機能を使うためのライブラリ,79行目のlibvulkan_lvp.soは"Lavapipe"と呼ばれるソフトウェア的な実装で,処理は正確なものの,GPUに比べるとはるかに遅いそうです。

VulkanではAPIコールを受け付けてから実際にドライバが処理するまでに,エラーチェック(Validation)や利用するドライバを選択するためのレイヤーを設けることができ,66~69行めのlibVkLayer_XXX.soはこのレイヤー機能に対応するためのライブラリです。

ちなみにVulkanのAPIコールを受け付けるのは別途Vulkan_Loaderパッケージからインストールされる/usr/lib/libvulkan.so.1で,このライブラリが/usr/share/vulkan/icd.d/以下の定義ファイルを元に,適切なドライバを選択するようになっています。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html