ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
github: VulknAppAdocal2018
##物理デバイスの選択
Vulkanライブラリーを初期化した後必要な機能をサポートするシステム内のグラフィクスカードを探して選択する必要があります。グラフィクスカードは同時にいくつでも使用することができます。
VkPhysicalDevice _gpu = nullptr;
vkEnumeratePhysicalDevices関数を使用することで、グラフィクスカードの一覧を、番号だけで照会することができます。
uint32_t gpu_count = 0;
vkEnumeratePhysicalDevices(_instance, &gpu_count, nullptr);
GPUが0台の時は、gpu_Countの値が0でこの機種でVulkanはサポートしていません。
それ以外の場合vkPhysicalDevicesのハンドル保持する配列を割り当てることができます。
std::vector<VkPhysicalDevice> gpu_list(gpu_count);
vkEnumeratePhysicalDevices(_instance, &gpu_count, gpu_list.data());
##デバイスの適合性
すべてのデバイスで Vulkan APIの指定バージョンを使えるというわけではありません。
例えば自分のパソコンではgtx1080とintel系のCPUが乗っています。
その場合利用できるバージョンの違いは必ず出てきます。バージョンの違いだけでなく、テクスチャーの圧縮、マルチビューポートレンダリング最近発売されたRTX20では、レイトレーシング、テンサーコアが使える等機能的にも大きく違います。そのためちゃんと持っているデバイスの特性を確かめる必要がありますね。ここでは、ベストなGPUを見つける方法について書いていきます。
##GPUの基本情報
GPUの名前、ベンダーID、製品情報などの基本的なことは、vkGetPhysicalDevicePropertiesを使用して取得することができます
VkPhysicalDeviceProperties _gpu_property = {};
vkGetPhysicalDeviceProperties(_gpu, &_gpu_property);
##GPUの拡張機能
お持ちのGPUの名前が分かっても、ある特定の機能使えるかどうかは、分からないです。
そのような拡張機能を調べるには、vkGetPhysicalDeviceFeatures関数を使用します。
vkGetPhysicalDeviceFeatures(gpu, &features_properties);
##キューファミリー
使用するコマンドがデバイスでサポートされているキューファミリーか確認する必要があります。そのためにvkGetPhysicalDeviceQueueFamilyPropertiesを使用します。
vkGetPhysicalDeviceQueueFamilyProperties(_gpu, &family_count, family_property_list.data());
相対的に見て一番GPUとして適したものをデフォルトのGPUに設定します。今回は、GPUをグラフィクス用途に使うためGRAPHICS_BITが立っているものを選びます。
bool found = false;
for (uint32_t i = 0; i < family_count; ++i) {
if (family_property_list[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
found = true;
_graphics_family_index = 1;
}
}
if (!found) {
assert(0 && "Vulkan err: Queue Family supporting graphics not faound");
std:exit(-1);
}
まとめ
今回やったことは、正しい物理デバイスを見つけるための操作です。
連絡先
tweeter: tositada_nakada
mail: nakadasanda@outlook.com
寄付
paypal: tositada_nakada
Amazon: 欲しいものリスト