2019年07月一覧

DirectX12 フルスクリーンの罠

DirectX12 でフルスクリーン描画を行おうとしたときに、予想外に色々と苦戦しました。
DirectX12 というよりは、フルスクリーンは DXGI の機能・制御管轄なので、もしかすると今回の話は DirectX11 でも症状が出るのかもしれません。もしかすると環境要因もあるのかもしれませんが、何かの参考になれば幸いです。

出遭ったこと

「ALT+ENTER でフルスクリーンとウィンドウモードを行き来(切り替え)をしたい。」
これを実現するのに苦戦しています。

ディスプレイの解像度に対してのフルスクリーンとウィンドウモードの切り替えは、標準 DXGI の機能で問題なく出来ました。
ですが、描画の内容によっては指定された解像度でフルスクリーンとしたいことがあり、描画ターゲットの解像度を変えるのでは無く、ディスプレイの解像度設定のほうを変更したいという条件になります。

これには初期化時に DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH フラグを設定しますが、これがあると色々と問題に出遭いました。

続きを読む


Vulkan での排他フルスクリーン

Vulkan でフルスクリーンアプリケーションを作ろうと思ったら、全画面のウィンドウを枠なしで作るという方法でした。
いわゆる仮想フルスクリーンの手法です。OpenGL でもフルスクリーンのアプリケーションは同様の手順で作るので、特に違和感はありませんでした。
ただ、DirectX9 時には専用のフルスクリーン設定がありましたし、9.0c 以降では DXGI がそのあたりの設定を引き受けてくれていました。

VK_EXT_full_screen_exclusive

しかしつい最近に Vulkan にも排他フルスクリーンの拡張が用意されました!
それが VK_EXT_full_screen_exclusive です。紹介文を軽く読むと、ディスプレイのコンポジッタを迂回してフルスクリーン化が出来るようなので、画面表示完了までのレイテンシーは短くなるのではないかと期待です。

拡張そのものの説明は https://github.com/KhronosGroup/Vulkan-Docs/blob/master/appendices/VK_EXT_full_screen_exclusive.txt に記載されています。

NVIDIA の環境では、 Windows 版だと 425.89, Linux 版だと 418.52.14 のドライバでサポートされるようです。ただどちらもまだベータドライバなのでその点には注意が必要です。
RADEON の環境では、Adrenalin 2019 19.6.2 から対応されて居るみたいですね。

最近は不安定なドライバを入れて実験する時間がないので、安定版になってから試してみようと思います。