今回の記事は実験的なネタです。 DirectX では描画結果を画面に反映するのに IDXGISwapChain を使用します。一方 Vulkan では VkSwapchainKHR を生成して描画結果を画面に反映します。それぞれのAPIがそれぞれの SwapChain を使うように出来ているのですが、ここで敢えて Vulkan の描画結果を DirectXの IDXGISwapChain に書き込むような実験をしてみました。
結果はおおよそうまく動作しているようで、その結果を撮影しました。ただ動作画面を見てもよくわからないものと思います。描画結果が壊れていないなぁくらいの感じでしかありません。
類似実験について
以前、当ブログで色々と実験していました。テクスチャを Vulkan / DirectX11 とで行き来できないか、など。それが今回のものと近いと思います。
これらの結果を駆使して、Vulkan の描画結果を DXGISwapChain のバッファへ書き込むことを実現しています。
動作状況など
Vulkan SDK 1.2.135 を使用して開発しています。拡張機能を多めに使用していますが、検証レイヤーから文句を言われることなく動作できています。
- NVIDIA GeForce RTX 2060Super (ドライバ 442.92)
- RADEON Vega11
手持ちのGPUのみですが NVIDIA / AMD の両方で動作の確認も出来ました。しかし、 AMD のほうは期待する値が返ってこず不定値が入っていたりするなど、拡張機能の使用にやや注意が必要のようです。また Intel UHD 620 の環境ではクラッシュこそしないものの、正常動作させることは今のところ出来ていません。
いずれの環境も Windows10 64bit 1909バージョンで動作させていました。
実装について
以前の内容と同じように実装しています。以前は DirectX11を使っていましたが、今回 DirectX12 を使って IDXGISwapChain を生成しています。また Present を実行すると妙な不具合に出遭ったりしたので、対策コードを仕込んでいます
まとめ
拡張機能に積極的なNVIDIA のみの動作になるだろうと考えていましたが、意外にも最近のAMDでも動作できたことに驚きを感じました。今回のような普通はやらないであろうことが動いたことは自分としては少し嬉しくなりました。
あくまで動作できた、というだけの話でありパフォーマンスの観点からこれが実用になるかどうかはチェックしていません。技術的には可能かどうか、というのを見たかったからです。何かに使おうと思っている人は注意が必要です。
コメント