オープンソースのNVKドライバがDLSSに対応。まだ実験段階だが意味は大きい

オープンソースのNVKドライバがDLSSに対応。まだ実験段階だが意味は大きい

NVIDIAのオープンソースVulkanドライバNVKが、DLSSの実行に必要なコードをMesa 26.2-develに統合した。環境変数を設定すれば、Linux上のゲームでDLSSが動く。ただし既知のバグがあり、すべてのGPUで使えるわけではない。「対応した」と「実用になる」のあいだには、まだ距離がある。


8か月かけて埋まった溝

2025年10月、Valveの開発者オータム・アシュトン(Autumn Ashton)が3日間の作業でDLSSをNVK上で動かしたと発表した。ゲーム「Control」の画面が960×540から1920×1080にアップスケールした画面がそのまま証拠になった。

DLSSの実体はCUDAカーネルの集合体だ。NVKにVK_NVX_binary_importとVK_NVX_image_view_handleという2つのVulkan拡張を実装すれば、ゲームが同梱するDLSSバイナリをGPU上で実行できる。DXVKとVKD3D-ProtonがDXVK-NVAPIを通じてこの仕組みを使い、Windows向けゲームのDLSSをLinux上で再現する。原理はシンプルだが、CUDAバイナリ(CuBIN)のパースは厄介だった。ELFの中にELFが入った入れ子構造で、メタデータの一部は序数ベース、一部は名前ベースという設計をほどく必要があった。

アシュトンのマージリクエスト(!37898)は、だがそのままでは統合に至らなかった。レビューコメントへの対応やAPIの変更が重なり、Mesa本流との衝突が広がっていく。2026年4月、コミュニティ開発者のトーマス・アンダーセン(Thomas Andersen)が新たなマージリクエスト(!40686)を立ち上げ、コンフリクトの解消とバグ修正を積み重ねた。2か月に及ぶレビューとCIパイプラインの修正を経て、6月20日、コードはMesaのmainブランチに入った。

NVK DLSS対応の経緯
2025年10月
DLSSプロトタイプ動作
Valveのアシュトンが3日で初期実装
2026年4月
MR !40686 開設
アンダーセンがコンフリクト解消に着手
2026年6月
Mesaのmainにマージ
Mesa 26.2-develに統合完了
2026年8月
Mesa 26.2 安定版
一般ユーザーが利用可能になる見込み

GPUごとに違う「動く」の意味

DLSSのバイナリには、GPU世代ごとにコンパイル済みのコード(バイトコード)と、中間表現のPTXが含まれている。NVKは現時点でバイトコードしか実行できない。プロプライエタリドライバにはPTXからバイトコードへ変換するパスがあるが、NVKにはない。PTXからNIRへの変換は、まだ書かれていない。

問題は、どのGPUにどのバイトコードが同梱されているか。アンダーセンがNVIDIAのDLSSリポジトリを調査した結果は明快だった。Turing(SM 7.5)とAmpere(SM 8.6)のバイトコードは、ほぼすべてのDLSSバージョンに含まれている。だがAda(SM 8.9)のバイトコードを全CuBINに含んでいるのは、v310.5.0とv310.5.3の2バージョンだけだ。

TuringとAmpereのユーザーなら、多くのゲームでDLSSが動く可能性がある。Adaの場合は、ゲームが同梱するDLSSのバージョンに左右される。Adaで動かないわけではないが、確実に動くわけでもない。

Mesa開発者のカロル・ヘルプスト(Karol Herbst)は、異なる世代のバイトコードを流用することの技術的リスクを指摘している。NVIDIAのドキュメントでは同じメジャーバージョン内のバイトコードに後方互換性があると記載されているが、実際にはGPU世代間で命令のレイテンシやスケジューリング要件が異なる。SM 8.0向けにコンパイルされたコードをSM 8.9で動かすと、特定のDLSSプリセットで画面にアーティファクトが出る場合がある。

GPU世代別 DLSSバイトコード対応状況
TuringAmpereAda
バイトコード全22バージョン全22バージョン2バージョン
PTXなしSM 8.0SM 8.9(一部)
実用性ほぼ全対応ほぼ全対応バージョン依存
※ NVIDIAのDLSSリポジトリ全22バージョンの調査に基づく。NVKは現時点でバイトコードのみ実行可能(PTXからNIRへの変換は未実装)

マージ後のコードには環境変数が2つある。NVK_EXPERIMENTAL=dlss でDLSS拡張そのものを有効化し、NVK_EXPERIMENTAL=dlss_backwards_compat でGPU世代間のバイトコード流用を許可する。後者は画面の乱れを承知のうえで試す、という選択肢だ。

CIと格闘した2か月

マージリクエストのスレッドを読むと、機能そのものよりもCIパイプラインとの格闘が占める時間の方が長い。

最初の壁はAndroid CIだった。CuBINパーサーが使うGELF_ST_VISIBILITYというマクロが、Android NDK環境のlibelfに定義されていなかった。64ビット用のELF64_ST_VISIBILITYに切り替えたが、今度はそちらも未定義だった。原因は、Mesa CIがAndroid向けに使っている15年前のlibelf実装(libelf-0.8.13)が、このマクロをプライベートヘッダにしか定義していなかったこと。アンダーセンが#ifndefガードで不足分を補って解決した。

CIの問題で2度マージに失敗し、タイムアウトでも1度弾かれた。それでもアンダーセンはmainの更新に追従しながらリベースを繰り返し、メル・ヘニング(Mel Henning)やヘルプストのレビューを受けてコードを磨いた。マリー・ギユマール(Mary Guillemard)のReviewed-byとTested-byが付き、ヘルプストのAcked-byが揃って、Marge Botがマージを実行した。

次の壁はPTXからNIRへの変換

今回の統合で動くようになったのは、ゲームが同梱するCUDAバイトコードがGPUと一致するケースだけだ。PTXしか同梱されていない場合、あるいはバイトコードが合わない場合、DLSSは起動しない。

ヘルプストはマージリクエストのスレッドで「PTXからNIRかSPIR-Vへの変換を書くべきだ」と発言している。PTXはNVIDIAのGPU向け中間言語で、特定のGPU世代に依存しない。これをMesaのシェーダ中間表現であるNIRに落とし込めれば、どのGPU世代でもDLSSバイナリを実行できるようになる。だがヘルプストが「相当な規模のプロジェクトになる」と認めている。Blackwell世代ではIMMAがサポートする型が変わっており、バイナリの直接修正よりもNIR変換の方が扱いやすいという技術的な動機もある。

この課題が解決されるまで、NVKのDLSS対応は「特定の条件下で動く」段階に留まる。

実験フラグの向こう側にあるもの

NVKはVulkan 1.4準拠のオープンソースドライバとして、KeplerからBlackwellまでのNVIDIA GPUをカバーしている。Mesa 25.1以降、Turing以降のGPUではNVK+Zinkがデフォルトのグラフィックスドライバになった。プロプライエタリドライバとの性能差はまだあるが、機能面での溝は確実に狭まっている。

DLSSへの対応は、その溝を埋める象徴的な一歩だ。NVIDIAが自社のプロプライエタリドライバ向けに設計した技術を、コミュニティが解析し、オープンソースドライバ上で動かした。アシュトンが最初のプロトタイプを3日で動かし、アンダーセンがそれを2か月かけてメインラインに押し込んだ。ヘルプスト、ヘニング、ギユマールがコードをレビューし、libelfのマクロ1つ足りないという些細な問題にまで付き合った。

NVK_EXPERIMENTAL=dlss。この環境変数を打ち込んでゲームを起動する人は、当面はそう多くないだろう。動かないゲームもある。画面が乱れるプリセットもある。だが、この実験フラグの向こうには、NVIDIAのGPUをオープンソースドライバだけで完結させる未来が透けて見える。

Mesa 26.2の安定版リリースは8月の見込みだ。

参照元

他参照

関連記事

この記事を共有する