Link

Selecionando um dispositivo físico

Neste projeto iremos dar preferência de escolha de GPUs dedicadas a GPUs integradas. Para isso iremos criar uma nova função em VulkanWindow chamada pickPhysicalDevice() e chamá-la no construtor da classe MainWindow:

VulkanWindow::VulkanWindow(QWindow *parentWindow) : QVulkanWindow(parentWindow) {
    if (!m_instance.create())
        qFatal("Failed to create Vulkan instance: %d", m_instance.errorCode());
    setVulkanInstance(&m_instance);
    pickPhysicalDevice();
}

void VulkanWindow::pickPhysicalDevice() {

}

Para recuperar uma lista de objetos que representam os dispositivos físicos instalados no sistema, devemos chamar a função QVulkanWindow::availablePhysicalDevices().

QVector<VkPhysicalDeviceProperties> devices = availablePhysicalDevices();

Em seguida, iremos verificar se algum desses dispositivos é do tipo dedicado/discreto (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) ou integrado (VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU), dando preferência para GPUs dedicadas:

int discreteGPUIndex = -1;
int integratedGPUIndex = -1;
for (int i = 0; i < devices.length(); ++i) {
    const VkPhysicalDeviceProperties &dev = devices.at(i);
    if (dev.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)
        discreteGPUIndex = i;
    else if (dev.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)
        integratedGPUIndex = i;
}

Por fim, chamamos a função QVulkanWindow::setPhysicalDeviceIndex() para definir a GPU dedicada disponível ou, caso não exista, a GPU integrada. Se não houver nenhuma GPU disponível chamamos a macro qFatal:

if (discreteGPUIndex != -1)
    setPhysicalDeviceIndex(discreteGPUIndex);
else if (integratedGPUIndex != -1)
    setPhysicalDeviceIndex(integratedGPUIndex);
else
    qFatal("No Vulkan capable GPU found.");


Anterior Próximo