Изменения способа выбора очередей показа

This commit is contained in:
parent 05a82d76e4
commit a6accd663e
5 changed files with 44 additions and 22 deletions

View File

@ -12,8 +12,6 @@ typedef struct _PhysicalDevice
VkPhysicalDeviceFeatures features; // функции
VkPhysicalDeviceMemoryProperties memory; // память
std::vector<VkQueueFamilyProperties> queueFamilyProperties; // семейства очередей
uint32_t pickQueueFamily(VkQueueFlags);
} PhysicalDevice;
#endif // PHYSICALDEVICE_H

13
include/Queue.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef QUEUE_H
#define QUEUE_H
#include <vulkan/vulkan.h>
typedef struct _Queue
{
uint32_t index;
VkQueue descriptor;
VkQueueFamilyProperties properties;
} Queue;
#endif // QUEUE_H

View File

@ -6,6 +6,7 @@
#include "PhysicalDevice.h"
#include "Surface.h"
#include "Queue.h"
class Vulkan
{
@ -16,7 +17,7 @@ class Vulkan
VkInstance instance; // Экземпляр Vulkan
PhysicalDevice physicalDevice; // Физическое устройство
VkDevice logicalDevice; // логическое устройство
VkQueue graphicalQueue; // очередь для работы с графикой
Queue queue; // очередь
Surface surface; // Поверхность окна
VkSwapchainKHR swapChain; // Список показа
@ -29,6 +30,7 @@ class Vulkan
void createInstance(); // Создание экземпяра Vulkan
void selectPhysicalDevice(std::vector<const char*> &deviceExtensions); // Выбор физического устройства
void pickQueues(); // Выбор очередей
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
void createSwapchain(GLFWwindow* window); // Создание цепочки показа

View File

@ -1,16 +0,0 @@
#include "PhysicalDevice.h"
// Возвращает индекс первой попавшейся очереди, соответствующей требуемым флагам
uint32_t PhysicalDevice::pickQueueFamily(VkQueueFlags flags)
{
// Цикл по параметрам семейств очередей
for (uint32_t index = 0; index < queueFamilyProperties.size(); index++)
{
// Если очередь соответствует требованиям по возможностям очереди
if (queueFamilyProperties[index].queueFlags & flags)
{
// возвращаем её индекс
return index;
}
}
}

View File

@ -268,17 +268,42 @@ void Vulkan::selectPhysicalDevice(std::vector<const char*> &deviceExtensions)
}
}
// Выбор очередей
void Vulkan::pickQueues()
{
queue.index = -1;
for (int i = 0; i < physicalDevice.queueFamilyProperties.size(); i++)
{
// Проверка возможности вывода
VkBool32 presentSupport = false;
vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice.device, i, surface.surface, &presentSupport);
// Проверка поддержки очередью графических операций
if (physicalDevice.queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT
&& presentSupport)
{
queue.index = i;
queue.properties = physicalDevice.queueFamilyProperties[i];
break;
}
}
}
// Создание логического устройства
void Vulkan::createLogicalDevice(std::vector<const char*> &deviceExtensions)
{
// Выберем очереди
pickQueues();
// Приоритеты очередей
float priority[1] = {1};
// Данные о необходимых очередях
VkDeviceQueueCreateInfo queueCreateInfo{};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueCreateInfo.queueFamilyIndex = physicalDevice.pickQueueFamily(VK_QUEUE_GRAPHICS_BIT);
queueCreateInfo.queueFamilyIndex = queue.index;
queueCreateInfo.queueCount = 1;
queueCreateInfo.pQueuePriorities = priority;
// слои для логического устройства
std::vector<const char*> layers;
// Подключение других слоев
@ -315,7 +340,7 @@ void Vulkan::createLogicalDevice(std::vector<const char*> &deviceExtensions)
}
// Получим дескриптор очереди логического устройства
vkGetDeviceQueue(logicalDevice, queueCreateInfo.queueFamilyIndex, 0, &graphicalQueue);
vkGetDeviceQueue(logicalDevice, queueCreateInfo.queueFamilyIndex, 0, &queue.descriptor);
}
// Создание поверхности окна