From afe58601254d2c1b5bf19d7fb2a0a1748fa71e2d Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Sat, 5 Feb 2022 16:59:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BB=D0=BE=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vk.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/vk.cpp b/src/vk.cpp index bfa3b07..1b75ad7 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -13,8 +13,47 @@ void Vulkan::init() // завершение работы void Vulkan::destroy() { - // Уничтожение экземпляра Vulkan - vkDestroyInstance(instance, nullptr); + vkDestroyInstance(instance, nullptr); // Уничтожение экземпляра Vulkan +} + +#include +// Проверка слоев на доступность. Возвращает true, если все слои доступны +// по ссылке заполняет вектор недоступных слоев +bool checkValidationLayerSupport(std::vector requestedLayers, std::vector & unavailableLayers) +{ + bool layerAvailable; // флаг доступности слоя для цикла + + // Первым вызовом определим кол-во доступных слоев + uint32_t layerCount; + vkEnumerateInstanceLayerProperties(&layerCount, nullptr); + + // Вторым вызовом запишем в вектор доступные слои + std::vector availableLayers(layerCount); + vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); + + // Цикл по запрошенным слоям + for (const char* layerName : requestedLayers) + { + layerAvailable = false; + + // Цикл по доступным слоям + for (const auto& layerProperties : availableLayers) + { + // Сравнение строк + if (strcmp(layerName, layerProperties.layerName) == 0) + { + layerAvailable = true; + break; + } + } + + // Если слой не найден то заносим в массив недоступных + if (!layerAvailable) { + unavailableLayers.push_back(layerName); + } + } + + return unavailableLayers.size() == 0; } void Vulkan::createInstance() @@ -47,10 +86,33 @@ void Vulkan::createInstance() createInfo.enabledExtensionCount = static_cast(extensions.size()); createInfo.ppEnabledExtensionNames = extensions.data(); + // Подключение слоев + std::vector validationLayers = { + "VK_LAYER_KHRONOS_validation" + }; + + if (states.VALIDATION) + { + createInfo.enabledLayerCount = static_cast(validationLayers.size()); + createInfo.ppEnabledLayerNames = validationLayers.data(); + } + + // Проверим доступность слоев + std::vector unavailableLayers; + if (!checkValidationLayerSupport(validationLayers, unavailableLayers)) + { + std::cout << "Запрошены недоступные слои:\n"; + // Цикл по недоступным слоям + for (const char* layer : unavailableLayers) + std::cout << layer << "\n"; + // Отправим исключение об отсутствующем слое + throw std::runtime_error("Requested layer unavailable"); + } + // Создание экземпляра Vulkan VkResult result = vkCreateInstance(&createInfo, nullptr, &instance); if (result != VK_SUCCESS) - { // Отправим исключение в случае ошибок создания экземпляра Vulkan + { // Отправим исключение в случае ошибок создания экземпляра throw std::runtime_error("Instance create error"); } } \ No newline at end of file