ashen-aetna-ko

Ashen Aetna (재투성이 에트나)

— 재 덮인 화산 위에서 녹슬게(Rust-하게) 비틀거리기

(3D 그래픽스, Rust, Vulkan, ash에 대한/과 함께하는 튜토리얼)

물리 장치 (Physical device)

다음 단계: 사용할 수 있는 그래픽 카드가 있을까요? 더 정확히 말하면, “물리 장치(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)가 필요합니다.

계속