Добавил структуру с данными физ. устройства

This commit is contained in:
2022-02-07 18:29:59 +03:00
parent f44e838959
commit f30ad1335f
3 changed files with 35 additions and 18 deletions

View File

@@ -119,32 +119,32 @@ void Vulkan::createInstance()
}
// Выбор физического устройства на основании требований
VkPhysicalDevice selectPhysicalDeviceByProperties(std::vector<VkPhysicalDevice> & devices)
PhysicalDevice selectPhysicalDeviceByProperties(std::vector<VkPhysicalDevice> & devices)
{
int i;
VkPhysicalDeviceProperties properties; // Параметры конкретного устройства
VkPhysicalDeviceFeatures features; // Функции конкретного устройства
VkPhysicalDeviceMemoryProperties memory; // Память
PhysicalDevice result; // физическое устройство (PhysicalDevice.h)
for (const auto& device : devices)
{
// Запомним устройство
result.device = device;
// Получаем данные
vkGetPhysicalDeviceProperties(device, &properties);
vkGetPhysicalDeviceFeatures(device, &features);
vkGetPhysicalDeviceMemoryProperties(device, &memory);
vkGetPhysicalDeviceProperties(device, &result.properties);
vkGetPhysicalDeviceFeatures(device, &result.features);
vkGetPhysicalDeviceMemoryProperties(device, &result.memory);
// Данные по семействам очередей
uint32_t queueFamilyPropertiesCount = 0;
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyPropertiesCount, nullptr);
std::vector<VkQueueFamilyProperties> queueFamilyProperties(queueFamilyPropertiesCount);
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyPropertiesCount, queueFamilyProperties.data());
result.queueFamilyProperties.resize(queueFamilyPropertiesCount);
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyPropertiesCount, result.queueFamilyProperties.data());
// Производим оценку
if (features.geometryShader
&& 4000 < memory.memoryHeaps[0].size / 1000 / 1000)
return device;
if (result.features.geometryShader
&& 4000 < result.memory.memoryHeaps[0].size / 1000 / 1000)
return result;
}
return nullptr;
// Если устройство не найдено - вернем пустую структуру
return PhysicalDevice();
}
// Выбор физического устройства
@@ -168,10 +168,8 @@ void Vulkan::selectPhysicalDevice()
physicalDevice = selectPhysicalDeviceByProperties(devices);
// Если не удалось выбрать подходящее требованием устройство - выдадим исключение
if (!physicalDevice)
if (!physicalDevice.device)
{
throw std::runtime_error("failed to find a suitable GPU!");
}
}