Steam FrameはOpenGLもVulkan経由で描画|ValveがFreedrenoでなくMesa Zinkを採用した理由を解説
本記事にはアフィリエイト広告(Amazon・楽天市場等)のリンクが含まれています。
ValveがFreedrenoでなくMesa Zinkを採用した理由
出典:Phoronix「Steam Frame Making Use Of Zink For OpenGL On Vulkan」、Steamworks公式Steam Frame互換性ドキュメント、Mesa公式Zinkドライバー解説、同Freedrenoドライバー解説、同NVKドライバー解説、Igalia「Helping Valve to Power Up Steam Devices」、同Turnip 2022年7月アップデート、Zink開発者Mike Blumenkrantz氏ブログ「New Blog Who Dis」にもとづきます。
ValveのVRヘッドセット「Steam Frame」では、OpenGLゲームも直接OpenGLドライバーで描画するのではなく、Mesaの「Zink」を利用してVulkanへ変換していることが明らかになりました。Steam FrameはQualcomm Snapdragon 8 Gen 3を搭載し、GPUにはAdreno 750を使用しています。
Adreno向けMesaにはOpenGLを直接実装する「Freedreno」も存在しますが、ValveはSteam FrameでZinkを採用しました。ZinkはOpenGL APIをVulkanへ変換するMesaのドライバーで、その先ではオープンソースのVulkanドライバー「Turnip」がAdreno GPUを動かします。ValveのLinuxグラフィックスチームでZink開発にも携わるMike Blumenkrantz氏は、Steam FrameについてAndroid側とネイティブ側の双方でZinkを使っていることを明らかにしています。
一見すると、OpenGLをそのままGPUへ渡した方が効率的にも思えます。公開されているSteam Frameの設計とValve・Igaliaによる開発内容を見ると、「OpenGLをVulkanへ変換すること」そのものよりも、グラフィックスドライバーの中心をTurnip/Vulkanへ一本化できることが重要だったと考えられます。
目次
前提Steam Frameの「ネイティブグラフィックスAPI」はVulkan
Steam Frameのグラフィックス構成を理解するうえで重要なのが、Valve自身がVulkanをネイティブグラフィックスAPIとして位置付けていることです。SteamworksのSteam Frame公式ドキュメントでは、WindowsゲームをProton経由で動かす際、DXVKなどを利用してDirectXを「Steam FrameのネイティブグラフィックスAPIであるVulkan」へ変換すると説明されています。
Steam Frameは一般的なWindowsゲーミングPCとは異なります。CPUはArm64のSnapdragon 8 Gen 3で、OSにはArch LinuxベースのSteamOSを採用しています。Valveはこの環境でWindows x86ゲームまで動かすため、CPU命令についてはFEX、Windows APIについてはProton、DirectXについてはDXVKやvkd3d-protonといった複数の互換技術を組み合わせています。
グラフィックス部分だけを見ると、多くの経路が最終的にVulkanへ集約されます。DirectX 9〜11ならDXVK、DirectX 12ならvkd3d-proton、そしてOpenGLならZinkです。その下にある実際のAdreno向けVulkanドライバーがTurnipです。Steam Frameでは「何でもVulkanへ変換している」というより、Vulkanを共通の土台として異なるAPIのゲームを動かす構成になっています。
仕組みZinkとは?特定GPU向けではないOpenGLドライバー
ZinkはMesaに含まれるOpenGLドライバーですが、特定GPUを直接制御する一般的なOpenGLドライバーとは性格が異なります。Mesa公式ドキュメントでは、Zinkを「特定のGPUアーキテクチャではなく、Vulkan APIコールを出力するGalliumドライバー」と説明しています。そのためVulkanドライバーさえ利用できれば、その上にOpenGL環境を構築できます。
一般的なネイティブOpenGLドライバーは「OpenGL→GPU専用OpenGLドライバー→GPU」という経路をたどりますが、Zinkの場合は「OpenGL→Zink→Vulkan→GPU専用Vulkanドライバー→GPU」という経路になります。Steam Frameでは、このGPU専用VulkanドライバーがTurnipです。OpenGLとVulkanの間に1段増えているため、一見すると無駄な処理のようにも見えますが、ドライバー開発の観点では大きなメリットがあります。
狙いZinkは「OpenGLドライバーを別に作らなくていい」ために生まれた
Zinkの目的はSteam Frame専用ではありません。Zink開発者のMike Blumenkrantz氏は開発初期の2020年、Zinkの狙いについて、新旧ハードウェアのドライバー開発者がOpenGLとVulkanの両方を個別に実装するのではなく、Vulkanに集中できるようにすることだと説明しています。つまりZinkが十分な互換性と性能を持つようになれば、GPUベンダーは「OpenGLドライバー+Vulkanドライバー」という2本の大きな実装を維持する代わりに、「Zink→Vulkanドライバー」という構成を利用できます。OpenGL側で必要になる多数の処理をZinkが共通実装し、GPU固有の最適化はVulkanドライバー側へ集中できるわけです。Steam Frameは、このZinkの設計思想と相性の良いハードウェアです。
疑問AdrenoにはFreedrenoもあるのになぜ使わない?
ここで疑問になるのがFreedrenoです。MesaにはQualcomm Adreno向けのネイティブOpenGL/OpenGL ESドライバーとしてFreedrenoが存在します。Mesa公式資料でも、FreedrenoはAdreno 2xx〜6xx GPU向けのGL/GLESドライバー(OpenGL ES 3.2・デスクトップOpenGL 4.5まで実装)、TurnipはAdreno 6xx GPU向けのVulkan 1.3ドライバーとして説明されています。両者はシェーダーコンパイラーや画像レイアウト、レジスタ・コマンドストリーム定義といったコア部分を共有しつつ、状態管理とコマンドストリーム生成は個別に実装されています。
つまりSteam Frameは理論上、「OpenGL→Freedreno→Adreno」という構成を取ることもできます。それでもValveはZinkを選択しています。ただし、Valveが「FreedrenoではなくZinkにした理由はこれだ」と詳細な比較結果を公表しているわけではありません。そのため、ここからは公開されているSteam Frameの開発内容から読み取れる理由を分けて考える必要があります。最も大きいのは、Steam Frame向けにTurnipそのものへ非常に大規模な開発・最適化を行ってきたことです。
背景ValveはTurnipをSteam Frame向けに大幅強化している
Valveと協力してSteam FrameのLinuxスタックを開発してきたIgaliaは、Steam FrameのAdreno 750を動かすためTurnipへ多数の機能追加と最適化を行っています。Igaliaによると、開発開始以前にはAdreno 700シリーズへの対応自体が不足しており、タイルレンダリング対応やLRZ、AutoTunerなど、ゲーム性能に重要な機能を整備する必要がありました。
さらに多数のVulkan拡張を実装し、DXVK経由のD3D11、vkd3d-proton経由のD3D12、Zink経由のOpenGLゲームについて実際のレンダリング問題を調査してきたと説明しています。Igaliaのエンジニアは、Steam Frame向けに整備したTurnipについて「プロプライエタリドライバーより高い正確性を実現し、多くのケースで性能も上回った」としています。
Steam Frameではすでに「DXVK→Turnip」「vkd3d-proton→Turnip」というゲーム向け経路を徹底的に最適化しています。OpenGLについても「Zink→Turnip」とすれば、同じTurnipを最終的なGPUドライバーとして利用できます。OpenGLだけ別にFreedrenoを利用するより、Steam Frame向けに集中的にテスト・最適化しているVulkanドライバーを共通基盤として利用できるわけです。
Igaliaが「プロプライエタリドライバーより高速なケースがある」と説明している対象は、主にTurnipとQualcomm側のVulkanドライバーの比較です。この結果だけを使って「Zink+TurnipはFreedrenoより高速だからValveが採用した」と結論付けることはできません。OpenGLをVulkanへ変換するZinkには変換処理のコストが存在し、ゲームや処理内容によって結果は変わります。Steam FrameのZink採用は「変換レイヤーを挟んだ方が必ず速い」という話ではなく、「十分に成熟したZinkを利用すれば、OpenGLのためだけに別のGPU固有ドライバー経路を持たなくてもよい」という設計面のメリットの方が重要と考えられます。
経緯Turnipは以前からZink経由でOpenGL 4.6を動かしていた
ZinkとTurnipの組み合わせ自体も、Steam Frameで突然作られたわけではありません。Igaliaは2022年の時点で、Adreno向けTurnip上でZinkを利用し、OpenGL 4.6まで動作させていました。当時のIgaliaの報告では、Zinkが要求するVulkan拡張をTurnipへ実装し、『The Witcher 3』など実ゲームを利用したテストも進めていました(GL適合性テストは一部が失敗する段階でした)。その後数年間にわたりTurnipとZinkの両方が改善され、Steam Frameでは実際の製品のグラフィックススタックとして利用されるところまで成熟したことになります。Phoronixも今回のSteam Frame採用について、Zinkが過去数年間で成熟したことを示す例として取り上げています。
応用x86ゲームではFEXとZinkを組み合わせる
Steam Frameがさらに特殊なのは、CPUがArm64であることです。PC向けSteamゲームの多くはx86またはx86-64向けに作られています。Steam FrameではFEXを使ってx86命令をArm64へ変換します。しかしSteamworks公式資料によると、FEXはOpenGLやVulkanなどのAPI呼び出しまで1命令ずつエミュレーションするのではなく、ネイティブなホスト側ライブラリへ転送します。Valveはこれによってエミュレーションのオーバーヘッドを抑えると説明しています。
OpenGLゲームなら概念的には「x86 OpenGLゲーム→FEX→Arm64ネイティブOpenGLライブラリ→Zink→Vulkan→Turnip→Adreno」という構造を取れます。CPUコードではx86→Arm64変換が必要ですが、GPU APIはホスト側へ渡した後、ネイティブなArm64グラフィックススタックで処理できます。Steam FrameでZinkを採用する意味は、ここでも大きくなります。
集約DirectXも最終的には同じTurnipへ集まる
Windowsゲームの場合は、さらにProtonが入ります。DirectX 9〜11を使用するゲームは主にDXVKによってDirect3DからVulkanへ変換され、DirectX 12ではvkd3d-protonが同じ役割を担います。Valve自身もSteam Frame公式資料で、DXVKによってDirectXをVulkanへ変換すると説明しています。
そのためSteam Frameでは、大まかに考えると、DirectX 9〜11はDXVK経由、DirectX 12はvkd3d-proton経由、OpenGLはZink経由、そしてネイティブVulkanはそのまま、という4つの経路がすべて最終的にTurnipへ到達します。異なるPC向けグラフィックスAPIが、最終的にほぼ同じVulkan/Turnipへ集約される構造です。これならTurnip側でシェーダーコンパイラー、メモリ管理、Adreno固有のタイルレンダリング、性能最適化、不具合修正を行った際、複数APIのゲームへ恩恵を広げやすくなります。
共通化Android側でもZinkを使用
Steam FrameはSteamOSだけでなく、Androidアプリを動かすための「Lepton」も搭載しています。Steamworksによると、LeptonはAndroidゲームをLinux上で動かす互換レイヤーです。今回Mike Blumenkrantz氏はSteam Frameについて、「Androidとnativeの双方」でZinkを利用していることを明らかにしました。SteamOS側だけZinkを利用し、Android側は完全に別のグラフィックススタックにするのではなく、ここでもVulkan/Turnipを中心に据えた構成を利用していることになります。Steam Frameが単なる「Linuxで動くVRヘッドセット」ではなく、Windows、Linux、Androidという異なるソフトウェア資産を1台で動かそうとしていることを考えると、グラフィックス基盤を共通化する意味は大きいでしょう。
方針Valveは「ゲームごとに別ビルドを作ってほしい」と考えていない
この設計はSteam Frame全体の方針とも一致します。ValveはSteamworksの開発者向け資料で、Steam Frame専用に複数バージョンのゲームを維持させるより、開発者が1つの最良のバージョンへ集中できた方がユーザーにとって良いと説明しています。一般的なPCゲームなら、Windows x86版をProtonとFEXで動かす方法を想定しています。すでにモバイルVR向けAndroid Arm64版を持つ開発者については、そのAndroid版を利用する方法も用意しています。
Steam Frameは「開発者がSteam Frame専用ゲームを大量に作る」ことだけを前提にしたハードウェアではなく、既存のWindows、Linux、Android向けソフトウェアを互換レイヤーで吸収することがプラットフォーム設計の重要な部分になっています。Zinkもその1つです。OpenGLゲームに対してSteam Frame専用の描画バックエンドを用意させるのではなく、既存のOpenGL呼び出しをZinkがVulkanへ変換します。
潮流ZinkはSteam Frameだけの特殊技術ではなくなっている
Zinkを「OpenGLがない環境で無理やり動かすための代替ドライバー」と考えると、Steam Frameの採用は奇妙に見えます。しかし現在のMesaでは、その位置付け自体が変わっています。たとえばMesaのNVKでは、Turing世代(RTX 2000シリーズ・GTX 16xx)以降のNVIDIA GPUでMesa 25.1から、従来のNouveau OpenGLドライバーではなく「NVK+Zink」が標準OpenGL実装になっています。Mesa公式ドキュメントでも、NVK+ZinkはOpenGL 4.6 Conformant実装として案内されています。
つまり「OpenGL専用GPUドライバーを用意する」という従来の方式から、「高品質なVulkanドライバーを作り、OpenGLはZinkで提供する」という構成が、実際のLinuxグラフィックス環境でも利用されるようになっています。Steam Frameはこの流れをQualcomm Adrenoでも実製品として採用した例と言えます。
影響Steam FrameのZink採用はユーザーに何が変わる?
Steam Frameユーザーが「OpenGLゲームだからZinkをオンにする」といった操作を毎回行う必要があるわけではありません。ZinkはSteam Frameのグラフィックススタック内部で使われる仕組みです。重要なのは、Steam Frameで古いOpenGLタイトルを動かす場合にも、Valveが重点的に整備しているTurnip/Vulkanスタックを利用できることです。
一方で、Zinkを使用しているからOpenGLゲームが必ず正常動作するわけでもありません。OpenGLとVulkanではAPIの設計が大きく異なるため、ZinkはOpenGL特有の挙動をVulkan上で再現する必要があります。さらにSteam Frameでは、x86ゲームならFEX、WindowsゲームならProtonなど別の互換レイヤーも追加されます。ゲームによってはCPU命令変換、Windows API、グラフィックスAPI、シェーダーなど複数の場所が互換性や性能のボトルネックになる可能性があります。Zink採用は「OpenGLゲームが100%動く」という保証ではなく、Steam Frameで広いPCゲーム資産を動かすための基盤の1つです。
FAQよくある質問
まとめまとめ|本質は「Vulkanへの一本化」
ValveがFreedrenoではなくZinkを選択した理由について、詳細な技術比較表は公表されていません。そのため性能だけを理由として断定することはできませんが、公開されているSteam Frameの設計を見ると、Zink採用の意味はかなり明確です。Steam FrameではValve自身がVulkanをネイティブグラフィックスAPIと位置付けています。DirectXはDXVKやvkd3d-protonによってVulkanへ変換され、Adreno GPUの実際の制御にはValveとIgaliaが長期間開発してきたTurnipを利用します。OpenGLについてもZinkを使えば、同じTurnipへ集約できます。
その結果、DirectX・OpenGL・Vulkan、Windowsゲーム・Linuxゲーム・Android側という異なるソフトウェア経路の多くで、最終的なGPUドライバーをTurnip中心に構成できます。これは、互換性修正や性能最適化の投資先を集中できるという大きなメリットです。Steam FrameでZinkが採用されたことは、単に「OpenGLをVulkanへ変換できる」というニュースではなく、かつて補助的なOpenGL実装として見られていたZinkが、Valveの市販ゲーミングハードウェアでグラフィックススタックの一部を任されるまで成熟したことを示す出来事でもあります。Steam Frameの特徴はOpenGLを捨てたことではなく、古いOpenGLゲームまでVulkan/Turnipという共通基盤へ取り込み、異なる世代・OS・CPUアーキテクチャのゲームを1つのSteamOSデバイスで動かそうとしている点にあります。



