ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
github: VulknAppAdocal2018
##validition layerとは
LunerG Vulkan SDKには、数多くのデバッグ用のレイヤーがあります。公式の説明書では、すべてvalidition layerと書かれています。
vulkanは最小限のオーバヘッドに基づいて設計されており、そのためAPI内のエラーチェックは、最小限に限定されています。そのため単純なミスでも通常は、処理されず未定義の動作や、クラッシュなどがおきます。vulkanでは、自分が行っている操作機能について非常に明示的に宣言する必要があるため、GPUの新しい機能を利用するときや、デバイスを宣言するときなどにミスをする可能性が高いです。
しかし、vulkanのAPIが最小限に限られているのならば新しくエラーをチェックするAPIを追加すればいいのです。これがvalidition layerです。validition layerでの主な機能は、以下のようなものです。
・仕様に対するパラメータをチェックして誤用のチェック
・リソースリークを見つけるためのオブジェクトの破壊と生成の追跡
・呼び出し元のスレッドを追跡してスレッドの安全性を監視
・すべての呼び出しとその呼び出しを標準出力に入力
・vulkanをトレースしてプロファイリングの再生を要求
validition layerはインストールされたPCでしか実行できません。そのためリリース時には、無効化する必要があります。
有効化については、前記事で書いてあるのでご覧ください
使用できる layerの確認
layerがデバイスで使用できるか、確認する必要があります。
uint32_t layer_count = 0;
vkEnumerateInstanceLayerProperties(&layer_count, nullptr);
std::vector<VkLayerProperties> layers(layer_count);
vkEnumerateInstanceLayerProperties(&layer_count, layers.data());
std::cout << "Amount of Layers " << layer_count << std::endl;
std::cout << std::endl;
for (int i = 0; i < layer_count; i++) {
std::cout << std::endl;
std::cout << "layerName: " << layers[i].layerName << std::endl;
std::cout << "specVersion: " << layers[i].specVersion << std::endl;
std::cout << "implementationVersion:" << layers[i].implementationVersion << std::endl;
std::cout << "description: " << layers[i].description << std::endl;
}
validition layer を使う
const std::vector<const char*>validationLayers = {
"VK_LAYER_LUNARG_standard_validation"
};
//...省略
instance_create_info.enabledExtensionCount = validationLayers.size();
instance_create_info.ppEnabledLayerNames = validationLayers.data();
instance_create_info.enabledExtensionCount = 0;
instance_create_info.ppEnabledExtensionNames = nullptr;
今回新しくExtensionを追加しました。Extensionについては、また後日説明します。一応定義しないと、エラーが起きるので定義しておきます。エラーを読みたい方は、一度コメントアウトしてみたらいいと思います。
vulkan標準のvalidition layerを使う方法を説明します。
validition layerを使うには、レイヤーの名前を指定して有効にします。
validition layerは、明示的に名前をしてあげる必要がなく
VK_LAYER_LUNARG_standard_validation
上のレイヤーを指定すると以下のレイヤーがすべてロードされます。
VK_LAYER_GOOGLE_threading
VK_LAYER_LUNARG_parameter_validation
VK_LAYER_LUNARG_device_limits
VK_LAYER_LUNARG_object_tracker
VK_LAYER_LUNARG_image
VK_LAYER_LUNARG_core_validation
VK_LAYER_LUNARG_swapchain
VK_LAYER_GOOGLE_unique_objects
##最後に
自分もこの記事を書くにあたって何度もたくさんのエラーコードとにらめっこしています。この記事についてよくわからないエラーを吐かれたら軽い気持ちでコメントに書いて下さい
連絡先
tweeter: tositada_nakada
mail: nakadasanda@outlook.com
寄付
paypal: tositada_nakada
Amazon: 欲しいものリスト