3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

初めてのVulkanプログラミング step2 layer

Last updated at Posted at 2019-01-04

目次に戻る

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
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: 欲しいものリスト

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?