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.");