bool VulkanWrapper::VWGraphicInstance::CheckValidationLayerSupport() { uint32_t layerCount; vkEnumerateInstanceLayerProperties(&layerCount, nullptr); std::vector<VkLayerProperties> availableLayers(layerCount); vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); for (const char* layerName : validationLayers) { bool layerFound = false; for (const auto& layerProperties : availableLayers) { if (strcmp(layerName, layerProperties.layerName) == 0) { layerFound = true; break; } } if (!layerFound) { return false; } } return true; }
// Check for the availabilty of some validation layers bool checkValidationLayerSupport() { uint32_t layerCount; vkEnumerateInstanceLayerProperties(&layerCount, nullptr); // Get the available validation layers std::vector<VkLayerProperties> availableLayers(layerCount); vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); // Convert to a set std::unordered_set<std::string> availableLayersSet; std::for_each(availableLayers.begin(), availableLayers.end(), [&availableLayersSet] (VkLayerProperties& p) { availableLayersSet.emplace(p.layerName); }); // Construct other set std::unordered_set<std::string> validationLayersSet(validationLayers.begin(), validationLayers.end()); // Ensure selected validation layers is a subset of available layers return std::includes(availableLayersSet.begin(), availableLayersSet.end(), validationLayersSet.begin(), validationLayersSet.end()); }
bool Device::Create() { // Application info structure VkApplicationInfo appInfo = {}; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = "Shard Application"; appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName = "Shard Engine"; appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion = VK_API_VERSION_1_0; // Instance info structure VkInstanceCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; // Load validation layers const std::vector<const char*> validationLayers = { "VK_LAYER_LUNARG_standard_validation" }; const bool enableValidationLayers = true; // TODO: only in debug if (enableValidationLayers) { uint32 layerCount = 0; vkEnumerateInstanceLayerProperties(&layerCount, NULL); std::vector<VkLayerProperties> availableLayers(layerCount); vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); for (const char* layerName : validationLayers) { bool layerFound = false; for (const auto& layerProp : availableLayers) { if (std::strcmp(layerName, layerProp.layerName) == 0) { layerFound = true; break; } } if (!layerFound) { Debugging::Logger::d() << "Could not find VK validation layer: " << layerName << std::endl; return false; } } // Write layers in create info createInfo.enabledLayerCount = validationLayers.size(); createInfo.ppEnabledLayerNames = validationLayers.data(); } else { // No layers are enabled createInfo.enabledLayerCount = 0; } // Load extensions std::vector<const char*> extensionsNeeded = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME }; if (enableValidationLayers) { extensionsNeeded.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); } uint32 extensionCount = 0; vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL); std::vector<VkExtensionProperties> availableExtensions(extensionCount); vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, availableExtensions.data()); for (const char* extName : extensionsNeeded) { bool extFound = false; for (const auto& extProp : availableExtensions) { if (std::strcmp(extName, extProp.extensionName) == 0) { extFound = true; break; } } if (!extFound) { Debugging::Logger::d() << "Could not find VK extension: " << extName << std::endl; return false; } } // Write extensions in create info createInfo.enabledExtensionCount = extensionsNeeded.size(); createInfo.ppEnabledExtensionNames = extensionsNeeded.data(); // Create the instance VkInstance instance; if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) { Debugging::Logger::d() << "Could not create VK device" << std::endl; return false; } return true; }