
1 changed files with 101 additions and 0 deletions
@ -0,0 +1,101 @@ |
|||||
|
#define GLFW_INCLUDE_VULKAN |
||||
|
#include <GLFW/glfw3.h> |
||||
|
|
||||
|
#include <iostream> |
||||
|
#include <stdexcept> |
||||
|
#include <cstdlib> |
||||
|
#include <vector> |
||||
|
|
||||
|
const uint32_t WIDTH = 800; |
||||
|
const uint32_t HEIGHT = 600; |
||||
|
|
||||
|
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() |
||||
|
{ |
||||
|
createInstance(); |
||||
|
} |
||||
|
|
||||
|
void mainLoop() |
||||
|
{ |
||||
|
while (!glfwWindowShouldClose(window)) { |
||||
|
glfwPollEvents(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void cleanup() |
||||
|
{ |
||||
|
vkDestroyInstance(instance, nullptr); |
||||
|
glfwDestroyWindow(window); |
||||
|
glfwTerminate(); |
||||
|
} |
||||
|
|
||||
|
void createInstance() |
||||
|
{ |
||||
|
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; |
||||
|
|
||||
|
uint32_t glfwExtensionCount = 0; |
||||
|
const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); |
||||
|
createInfo.enabledExtensionCount = glfwExtensionCount; |
||||
|
createInfo.ppEnabledExtensionNames = glfwExtensions; |
||||
|
createInfo.enabledLayerCount = 0; |
||||
|
|
||||
|
std::vector<const char*> requiredExtensions{}; |
||||
|
for (uint32_t i = 0; i < glfwExtensionCount; i++) { |
||||
|
requiredExtensions.emplace_back(glfwExtensions[i]); |
||||
|
} |
||||
|
requiredExtensions.emplace_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); |
||||
|
|
||||
|
createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; |
||||
|
createInfo.enabledExtensionCount = (uint32_t)requiredExtensions.size(); |
||||
|
createInfo.ppEnabledExtensionNames = requiredExtensions.data(); |
||||
|
|
||||
|
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; |
||||
|
} |
Loading…
Reference in new issue