113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
| #include "vulkan/vulkan_core.h"
 | |
| #define GLFW_INCLUDE_VULKAN
 | |
| #include <GLFW/glfw3.h>
 | |
| 
 | |
| #define GLM_FORCE_RADIANS
 | |
| #define GLM_FORCE_DEPTH_ZERO_TO_ONE
 | |
| #include <cglm/mat4.h>
 | |
| #include <cglm/vec4.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| void glfw_error(int error, const char* description) {
 | |
|   fprintf(stderr, "GLFW_ERR: 0x%02x - %s\n", error, description);
 | |
| }
 | |
| 
 | |
| GLFWwindow* init_window(int width, int height) {
 | |
|   glfwInit();
 | |
|   glfwSetErrorCallback(glfw_error);
 | |
| 
 | |
|   glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
 | |
|   glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
 | |
|   GLFWwindow* window = glfwCreateWindow(width, height, "Vulkan window", 0, 0);
 | |
| 
 | |
| 
 | |
|   return window;
 | |
| }
 | |
| 
 | |
| VkInstance create_instance() {
 | |
|   VkInstance instance;
 | |
| 
 | |
|   VkApplicationInfo app_info;
 | |
|   app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
 | |
|   app_info.pApplicationName = "spacegame";
 | |
|   app_info.applicationVersion = VK_MAKE_VERSION(0, 0, 1);
 | |
|   app_info.pEngineName = "spacegame";
 | |
|   app_info.engineVersion = VK_MAKE_VERSION(0, 0, 1);
 | |
|   app_info.apiVersion = VK_API_VERSION_1_3;
 | |
| 
 | |
|   VkInstanceCreateInfo instance_info;
 | |
|   instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
 | |
|   instance_info.pApplicationInfo = &app_info;
 | |
| 
 | |
|   uint32_t glfwExtensionCount = 0;
 | |
|   const char** glfwExtensions;
 | |
| 
 | |
|   glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
 | |
| 
 | |
|   uint32_t extensionCount = 0;
 | |
|   vkEnumerateInstanceExtensionProperties(0, &extensionCount, 0);
 | |
| 
 | |
|   VkExtensionProperties* extensions = (VkExtensionProperties*)(malloc(sizeof(VkExtensionProperties)*extensionCount));
 | |
|   vkEnumerateInstanceExtensionProperties(0, &extensionCount, extensions);
 | |
| 
 | |
|   for(uint32_t i = 0; i < extensionCount; i++) {
 | |
|     fprintf(stderr, "Supported Extension: %s\n", extensions[i].extensionName);
 | |
|   }
 | |
| 
 | |
|   free(extensions);
 | |
| 
 | |
|   instance_info.enabledExtensionCount = glfwExtensionCount;
 | |
|   instance_info.ppEnabledExtensionNames = glfwExtensions;
 | |
|   instance_info.enabledLayerCount = 0;
 | |
| 
 | |
|   VkResult result = vkCreateInstance(&instance_info, 0, &instance);
 | |
|   if(result != VK_SUCCESS) {
 | |
|     fprintf(stderr, "vkCreateInstance: 0x%02x\n", result);
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   return instance;
 | |
| }
 | |
| 
 | |
| int init_vulkan() {
 | |
|   VkInstance instance = create_instance();
 | |
|   if(instance == 0) {
 | |
|     return 1;
 | |
|   }
 | |
| 
 | |
|   vkDestroyInstance(instance, 0);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| void main_loop(GLFWwindow* window) {
 | |
|   while(!glfwWindowShouldClose(window)) {
 | |
|     glfwPollEvents();
 | |
|   }
 | |
| }
 | |
| 
 | |
| void cleanup(GLFWwindow* window) {
 | |
|   glfwDestroyWindow(window);
 | |
| 
 | |
|   glfwTerminate();
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|   GLFWwindow* window = init_window(800, 600);
 | |
|   if(window == 0) {
 | |
|     fprintf(stderr, "failed to initialize glfw window\n");
 | |
|     return 1;
 | |
|   }
 | |
| 
 | |
|   int result = init_vulkan();
 | |
|   if (result != 0) {
 | |
|     fprintf(stderr, "failed to initialize vulkan: err %d\n", result);
 | |
|     return 2;
 | |
|   }
 | |
| 
 | |
|   main_loop(window);
 | |
| 
 | |
|   cleanup(window);
 | |
| 
 | |
|   return 0;
 | |
| }
 |