Добавил структуру с данными физ. устройства
This commit is contained in:
parent
f44e838959
commit
f30ad1335f
|
@ -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
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
32
src/vk.cpp
32
src/vk.cpp
|
@ -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!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue