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

This commit is contained in:
parent f44e838959
commit f30ad1335f
3 changed files with 35 additions and 18 deletions

17
include/PhysicalDevice.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef PHYSICALDEVICE_H
#define PHYSICALDEVICE_H
#include <vulkan/vulkan.h>
#include <vector>
typedef struct _PhysicalDevice
{
VkPhysicalDevice device; // устройство
VkPhysicalDeviceProperties properties; // параметры
VkPhysicalDeviceFeatures features; // функции
VkPhysicalDeviceMemoryProperties memory; // память
std::vector<VkQueueFamilyProperties> queueFamilyProperties; // семейства очередей
} PhysicalDevice;
#endif // PHYSICALDEVICE_H

View File

@ -4,6 +4,8 @@
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include "PhysicalDevice.h"
class Vulkan class Vulkan
{ {
public: public:
@ -11,7 +13,7 @@ class Vulkan
void destroy(); // завершение работы void destroy(); // завершение работы
private: private:
VkInstance instance; // Экземпляр Vulkan VkInstance instance; // Экземпляр Vulkan
VkPhysicalDevice physicalDevice; // Физическое устройство PhysicalDevice physicalDevice; // Физическое устройство
// Структура для хранения флагов // Структура для хранения флагов
struct struct
{ {

View File

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