물리적 장치 선택

VkInstance를 통해 Vulkan 라이브러리를 초기화한 후 시스템에 필요한 기능을 지원하는 그래픽카드를 찾아 선택해야 합니다. 실제로 그래픽카드를 원하는 수만큼 선택하여 동시에 사용할 수 있지만, 이 튜토리얼에서는 필요에 맞는 첫번째 그래픽카드만 사용하겠습니다.

pickPhysicalDevice 함수를 추가하고 initVulkan 함수에서 호출합니다.

void initVulkan() {
    createInstance();
    setupDebugMessenger();
    pickPhysicalDevice();
}

void pickPhysicalDevice() {

}

최종적으로 선택하게 될 그래픽카드는 새 클래스의 멤버로 추가되는 VkPhysicalDevice 핸들에 저장됩니다. 이 객체는 VkInstance가 소멸될 때 암시적으로 소멸되므로 cleanup 함수에서 따로 처리할 필요가 없습니다.

VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;

그래픽카드를 나열하는 것은 확장을 나열하는 것과 매우 유사하며 숫자만 쿼리하는 것으로 시작합니다.

uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);

Vulkan을 지원하는 장치가 0개라면 더 이상 의미가 없습니다.

if (deviceCount == 0) {
    throw std::runtime_error("failed to find GPUs with Vulkan support!");
}

그렇지 않으면 이제 모든 VkPhysicalDevice핸들을 보유할 배열을 할당할 수 있습니다.

std::vector<VkPhysicalDevice> devices(deviceCount);
vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());

이제 각 그래픽카드를 평가하고 모든 그래픽카드가 동일하게 생성되지 않기 때문에 수행하려는 작업에 적합한지 확인해야 합니다. 이를 위해 우리는 새로운 기능을 도입할 것입니다.

bool isDeviceSuitable(VkPhysicalDevice device) {
    return true;
}

그리고 물리적 장치가 해당 기능에 추가할 요구사항을 충족하는지 확인합니다.

for (const auto& device : devices) {
    if (isDeviceSuitable(device)) {
        physicalDevice = device;
        break;
    }
}

if (physicalDevice == VK_NULL_HANDLE) {
    throw std::runtime_error("failed to find a suitable GPU!");
}

다음 섹션에서는 isDeviceSuitable 함수에서 확인할 첫번째 요구사항을 소개합니다. 이후 챕터에서 더 많은 Vulkan 기능을 사용할 것이므로 더 많은 검사를 포함하도록 이 함수를 확장할 것입니다.