PC環境を一新したタイミングで、 Vulkan SDK を 1.2.135 に更新しました。これが今回出遭った事件の始まりでした。タイトルにもあるように VK_LAYER_LUNARG_standard_validation が使えなくなったのです。
状況
こまめにSDKの更新をチェックして、リリースノートにも目を通している人ならば既知の内容だと思います。少し前から VK_LAYER_LUNARG_standard_validation の検証レイヤーは非推奨とされ Deprecated マークが付いていたようです。それが、 Vulkan SDK 1.2.135 から完全に削除となり、使用不可能状態になりました。
リリースノート: https://vulkan.lunarg.com/doc/sdk/1.2.135.0/windows/release_notes.html
デバッグレポート用の関数アドレスも取得でき、動いているだろうと安心してしまったのが、気づくのが遅れた原因でした。
対応策
自分が考えた対応策としては以下の2点です。
- Vulkan SDK 1.2.135 をアンインストールして、昔のバージョンに戻す
- 1.1.130 をインストールしたところ使用可能状態に戻りました。
- 将来も使えるコードに書き直す
今回コードの実装・確認を急いでいたので、昔のバージョンに戻して作業を続行しました。
デバッグ実行時に以下に示すようにレイヤーのDLLがロードされているようなら動作しています。
‘C:\VulkanSDK\1.1.130.0\Bin\VkLayer_khronos_validation.dll’ が読み込まれました。シンボルが読み込まれました。
SDK を旧バージョンに戻す場合には、必ず新しいバージョンをアンインストールが必要となるようです。単に旧バージョンを追加インストールでは機能の復活にはなりません(でした)。
書き直す方法
今後も使えるコードに書き直すためには、 “VK_LAYER_LUNARG_standard_validation” を変更します。変更先は、 ” VK_LAYER_KHRONOS_validation” になります。
知っての通り、VK_LAYER_LUNARG_standard_validation はメタレイヤーであり、そのメタレイヤー自体が廃止の方向となったために起こった状態となります。
まとめ
まだまだ多くのアプリケーション開発において、 VK_LAYER_LUNARG_standard_validation を有効化してチェックするとなっているように思います。しかし今回自分が陥ったように検証レイヤーが動いていない、となると不具合の発見が遅れ、将来のどこかでバグが爆発するかなと思います。
また多くの Vulkan チュートリアルの文献では、従来のままになっているので注意が必要です。 Vulkan のレイヤーの仕組みがこんな風に変わるとは自分も思っていませんでした。新しいレイヤーが随時増えていくのは見えていましたが、メタレイヤー自体が廃止になるとは…。
コメント
vulkan_book_1のSimple Triangleのサンプルを試したところ、Release版では動くのにDebug版では落ちるので、何でだろう?と悩んでいたところでした。
https://github.com/techlabxe/vulkan_book_1/blob/master/common/vkappbase.cpp#L179
//const char* layers[] = { “VK_LAYER_LUNARG_standard_validation” };
const char* layers[] = { “VK_LAYER_KHRONOS_validation” };
に書き換えたら動作するようになりました。情報ありがとうございます!