src/ngfx/porting/vulkan/VKInstance.cpp
Source code
/*
* Copyright 2020 GoPro Inc.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "ngfx/porting/vulkan/VKInstance.h"
#include "ngfx/core/DebugUtil.h"
#include "ngfx/porting/vulkan/VKConfig.h"
#include "ngfx/porting/vulkan/VKDebugUtil.h"
#include <cstring>
using namespace ngfx;
void VKInstance::create(const char *appName, const char *engineName,
uint32_t apiVersion, bool enableValidation) {
VkResult vkResult;
this->settings.enableValidation = enableValidation;
appInfo = {};
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = appName;
appInfo.pEngineName = engineName;
appInfo.apiVersion = apiVersion;
// Get instance layer properties
uint32_t instanceLayerCount;
vkEnumerateInstanceLayerProperties(&instanceLayerCount, nullptr);
instanceLayerProperties.resize(instanceLayerCount);
vkEnumerateInstanceLayerProperties(&instanceLayerCount,
instanceLayerProperties.data());
// Set instance layers
if (settings.enableValidation) {
const char *validationLayerName = "VK_LAYER_KHRONOS_validation";
// Check if this layer is available
bool validationLayerPresent = hasInstanceLayer(validationLayerName);
if (validationLayerPresent) {
instanceLayers.push_back(validationLayerName);
} else {
NGFX_ERR("Validation layer VK_LAYER_KHRONOS_validation not found");
}
}
// Set instance extensions
instanceExtensions = {VK_KHR_SURFACE_EXTENSION_NAME};
std::vector<const char *> surfaceExtensions = {VK_SURFACE_EXTENSION_NAMES};
for (auto &ext : surfaceExtensions)
instanceExtensions.push_back(ext);
if (instanceExtensions.size() > 0) {
if (settings.enableValidation) {
instanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
}
}
createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pNext = NULL;
createInfo.pApplicationInfo = &appInfo;
createInfo.ppEnabledExtensionNames = instanceExtensions.data();
createInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size();
createInfo.ppEnabledLayerNames = instanceLayers.data();
createInfo.enabledLayerCount = (uint32_t)instanceLayers.size();
V(vkCreateInstance(&createInfo, nullptr, &v));
}
bool VKInstance::hasInstanceLayer(const char *name) {
for (VkLayerProperties &props : instanceLayerProperties) {
if (strcmp(props.layerName, name) == 0) {
return true;
}
}
return false;
}
VKInstance::~VKInstance() {
if (v)
VK_TRACE(vkDestroyInstance(v, nullptr));
}
Updated on 3 April 2021 at 20:21:52 PDT