다음 단계: 사용할 수 있는 그래픽 카드가 있을까요? 더 정확히 말하면, “물리 장치(physical device)”가 있을까요? 한번 찾아봅시다:
let phys_devs = unsafe { instance.enumerate_physical_devices()? };
for p in phys_devs {
let props = unsafe { instance.get_physical_device_properties(p) };
dbg!(props);
}
이렇게 하면 터미널에 목록이 출력될 것입니다. 여기에는 우리가 사용하고 싶을 만한 장치의 속성도 포함됩니다. 물론, 이제 이 중에서 하나를 선택해야 합니다.
이 Vec의 첫 번째 항목을 선택할 수도 있습니다. (튜토리얼에서는 합리적인 선택이죠. 하지만 적어도 한 번은 dbg!를 통해 올바른 장치를 선택했는지, 혹은 잊고 있던 다른 내장 그래픽 카드가 컴퓨터에 있는지 확인해보는 것을 추천합니다.) 다른 방법으로는 이름이 일치하는 장치를 선택하는 것입니다:
let (physical_device, physical_device_properties) = {
let mut chosen = None;
for p in phys_devs {
let properties = unsafe { instance.get_physical_device_properties(p) };
let name = String::from(
unsafe { std::ffi::CStr::from_ptr(properties.device_name.as_ptr()) }
.to_str()
.unwrap(),
);
if name == "GeForce GTX 760" {
chosen = Some((p, properties));
}
}
chosen.unwrap()
};
제 컴퓨터에 어떤 그래픽 카드가 들어있는지도 알려주는 셈이네요… 말할 필요도 없이, 이 방법은 다른 컴퓨터에서 프로그램을 실행하려는 경우에는 좋은 선택이 아닙니다. 지금은, 목록에 있는 마지막 외장 GPU(discrete GPU)를 선택해 봅시다.
let (physical_device, physical_device_properties) = {
let mut chosen = None;
for p in phys_devs {
let properties = unsafe { instance.get_physical_device_properties(p) };
if properties.device_type == vk::PhysicalDeviceType::DISCRETE_GPU {
chosen = Some((p, properties));
}
}
chosen.unwrap()
};
이 방법 역시 최적은 아닐 수 있지만 (예를 들어 제 노트북을 제외하는 방법이 되기도 합니다), 쉽게 수정할 수 있습니다. 이제 물리 장치를 선택했으니, 그 장치에서 사용할 큐 패밀리(queue families)가 필요합니다.