スポンサーリンク
とりあえずVulkan SDKをいれる。LunarGのサイトからVulkanSDKのインストーラをダウンロードしてインストール。
何も考えず次へを押していく。なおインストール先のデフォルトはC:\VulkanSDK\バージョン。
Rustのvulkanラッパーはいくつかあるがとりあえずashを使用
extern crate ash; use ash::vk; use std::ffi::{CStr, CString}; use std::ptr; fn main() { ///////////////////////////////////////////// // Vulkanライブラリのエントリポイントを作成 let entry = ash::Entry::linked(); ///////////////////////////////////////////// // アプリケーション情報を設定 let app_name = CString::new("Vulkan Sample").unwrap(); let engine_name = CString::new("No Engine").unwrap(); let app_info = vk::ApplicationInfo { s_type: vk::StructureType::APPLICATION_INFO, p_next: ptr::null(), p_application_name: app_name.as_ptr(), application_version: vk::make_version(1, 0, 0), p_engine_name: engine_name.as_ptr(), engine_version: vk::make_version(1, 0, 0), api_version: vk::API_VERSION_1_0, _marker: Default::default(), }; ///////////////////////////////////////////// // インスタンス作成情報の設定 let create_info = vk::InstanceCreateInfo { s_type: vk::StructureType::INSTANCE_CREATE_INFO, p_next: ptr::null(), flags: vk::InstanceCreateFlags::empty(), p_application_info: &app_info, enabled_layer_count: 0, pp_enabled_layer_names: ptr::null(), enabled_extension_count: 0, pp_enabled_extension_names: ptr::null(), _marker: Default::default(), }; ///////////////////////////////////////////// // Vulkanインスタンスの作成 let instance = unsafe { entry.create_instance(&create_info, None) .expect("Vulkanインスタンスの作成に失敗しました") }; ///////////////////////////////////////////// // システム上の物理デバイス(GPUなど)の列挙 let physical_devices = unsafe { instance.enumerate_physical_devices() .expect("物理デバイスの列挙に失敗しました") }; println!("検出された物理デバイス数: {}", physical_devices.len()); ///////////////////////////////////////////// // デバイスの情報を出力 for device in physical_devices { let properties = unsafe { instance.get_physical_device_properties(device) }; // device_name はnull終端 let device_name = unsafe { CStr::from_ptr(properties.device_name.as_ptr()) }; println!("デバイス名: {}", device_name.to_str().unwrap()); } ///////////////////////////////////////////// // 使用したVulkanインスタンスの破棄 unsafe { instance.destroy_instance(None); } }