Created
April 21, 2022 01:29
-
-
Save FantasyVR/2d0e9cc0b563332a5ad4db1ed6a89668 to your computer and use it in GitHub Desktop.
Create vulkan instance twice.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define GLFW_INCLUDE_VULKAN | |
#include <GLFW/glfw3.h> | |
#include <iostream> | |
#include <stdexcept> | |
#include <cstdlib> | |
#include <vector> | |
#include <string> | |
const uint32_t WIDTH = 800; | |
const uint32_t HEIGHT = 600; | |
const std::vector<const char*> validationLayers = { | |
"VK_LAYER_KHRONOS_validation" | |
}; | |
#ifdef NDEBUG | |
const bool enableValidationLayers = false; | |
#else | |
const bool enableValidationLayers = true; | |
#endif | |
class HelloTriangleApplication { | |
public: | |
void run() { | |
initWindow(); | |
initVulkan(); | |
mainLoop(); | |
cleanup(); | |
} | |
private: | |
GLFWwindow* window; | |
VkInstance instance; | |
void initWindow() { | |
glfwInit(); | |
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); | |
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); | |
window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr); | |
} | |
void initVulkan() { | |
check_vulkan_device(); | |
createInstance(); | |
} | |
void check_vulkan_device(){ | |
bool found_device_with_compute = false; | |
VkApplicationInfo app_info{}; | |
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; | |
app_info.pApplicationName = "Checking Vulkan Device"; | |
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0); | |
app_info.pEngineName = "No Engine"; | |
app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0); | |
app_info.apiVersion = VK_API_VERSION_1_0; | |
VkInstanceCreateInfo create_info{}; | |
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; | |
create_info.pApplicationInfo = &app_info; | |
VkInstance instance{VK_NULL_HANDLE}; | |
VkResult res = vkCreateInstance(&create_info, nullptr, &instance); | |
do { | |
if (res != VK_SUCCESS) { | |
throw std::runtime_error("Can not create Vulkan instance"); | |
break; | |
} | |
// load_instance(instance); | |
uint32_t device_count = 0; | |
vkEnumeratePhysicalDevices(instance, &device_count, nullptr); | |
if (device_count == 0) { | |
throw std::runtime_error("Can not find Vulkan capable devices"); | |
break; | |
} | |
std::vector<VkPhysicalDevice> devices(device_count); | |
vkEnumeratePhysicalDevices(instance, &device_count, devices.data()); | |
for (int i = 0; i < devices.size(); i++) { | |
const auto &physical_device = devices[i]; | |
uint32_t queue_family_count = 0; | |
vkGetPhysicalDeviceQueueFamilyProperties(physical_device, | |
&queue_family_count, nullptr); | |
if (queue_family_count > 0) { | |
std::vector<VkQueueFamilyProperties> queue_families(queue_family_count); | |
vkGetPhysicalDeviceQueueFamilyProperties( | |
physical_device, &queue_family_count, queue_families.data()); | |
for (auto &queue : queue_families) { | |
if (queue.queueFlags & VK_QUEUE_COMPUTE_BIT) { | |
found_device_with_compute = true; | |
} | |
} | |
} | |
} | |
} while (false); | |
if (instance) { | |
vkDestroyInstance(instance, nullptr); | |
} | |
} | |
void mainLoop() { | |
while (!glfwWindowShouldClose(window)) { | |
glfwPollEvents(); | |
} | |
} | |
void cleanup() { | |
vkDestroyInstance(instance, nullptr); | |
glfwDestroyWindow(window); | |
glfwTerminate(); | |
} | |
bool checkValidationLayerSupport(){ | |
// 查询设备上支持的layers:availableLayers | |
uint32_t layerCount; | |
vkEnumerateInstanceLayerProperties(&layerCount, nullptr); | |
std::vector<VkLayerProperties> availableLayers(layerCount); | |
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); | |
// 查询需要的layer:validationLayers 在不在设置支持的layer中 | |
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; | |
} | |
void createInstance() { | |
if (enableValidationLayers && !checkValidationLayerSupport()) { | |
throw std::runtime_error("validation layers requested, but not available!"); | |
} | |
VkApplicationInfo appInfo{}; | |
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; | |
appInfo.pApplicationName = "Hello Triangle"; | |
appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); | |
appInfo.pEngineName = "No Engine"; | |
appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); | |
appInfo.apiVersion = VK_API_VERSION_1_0; | |
VkInstanceCreateInfo createInfo{}; | |
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; | |
createInfo.pApplicationInfo = &appInfo; | |
// Extension | |
uint32_t extensionCount = 0; | |
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); | |
std::vector<VkExtensionProperties> extensions(extensionCount); | |
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data()); | |
std::cout << "available extensions:" << extensionCount <<"\n"; | |
for (const auto& extension : extensions) { | |
std::cout << '\t' << extension.extensionName << '\n'; | |
} | |
const std::vector<const char *> eeee {"VK_KHR_get_physical_device_properties2","VK_EXT_metal_surface","VK_KHR_surface"}; | |
createInfo.enabledExtensionCount = 3; | |
createInfo.ppEnabledExtensionNames = eeee.data(); | |
// Layer | |
if (enableValidationLayers) { | |
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size()); | |
createInfo.ppEnabledLayerNames = validationLayers.data(); | |
} else { | |
createInfo.enabledLayerCount = 0; | |
} | |
// Create Instance | |
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) { | |
throw std::runtime_error("Failed to create instance!"); | |
} | |
} | |
}; | |
int main() { | |
HelloTriangleApplication app; | |
try { | |
app.run(); | |
} catch (const std::exception& e) { | |
std::cerr << e.what() << std::endl; | |
return EXIT_FAILURE; | |
} | |
return EXIT_SUCCESS; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment