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());
    }
Пример #3
0
			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;
			}