main.c (7371B)
1 #include <stdio.h> /*For print and the like*/ 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_vulkan.h> 4 #include <vulkan/vulkan.h> 5 6 #define DEVICE_INDEX 0 7 8 SDL_Window* g_sdl_window; 9 10 int g_i_window_width = 1600; 11 int g_i_window_height= 900; 12 13 VkApplicationInfo g_vk_app_info; 14 VkInstanceCreateInfo g_vk_inst_create_info; 15 VkInstance g_vk_instance; 16 17 int main(){ 18 unsigned int l_i_count = 0; 19 unsigned int l_i_layer_count = 0; 20 unsigned int l_i_device_ext_count = 0; 21 unsigned int iter = 0; 22 SDL_Event l_sdl_event; 23 24 VkExtensionProperties* l_vkextensionprops; 25 VkLayerProperties* l_vklayerprops; 26 VkResult l_vkresult; 27 VkPhysicalDevice* l_vkdevices; 28 VkPhysicalDeviceProperties* l_vkdeviceprops; 29 VkQueueFamilyProperties* l_vkqueuefamilyprops; 30 VkDevice l_vkdevice; 31 VkDeviceQueueCreateInfo l_vkdevicequeueinfo; 32 VkDeviceCreateInfo l_vkdevicecreateinfo; 33 VkExtensionProperties* l_vkdeviceextensionprops; 34 VkQueue l_graphics_queue; 35 36 unsigned int l_qfamilyindex; 37 38 const char** l_cpp_sdl_extensions = 0; 39 const char** l_cpp_sdl_layers = 0; 40 const char** l_cpp_dev_ext_names = 0; 41 float l_fa_priorities[1] = {0.0f}; 42 43 printf("\n\t\tPure C vulkan test\n\n"); 44 45 if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0){ 46 printf("Failed to initialize SDL\n"); 47 return 0; 48 } 49 50 g_sdl_window = SDL_CreateWindow("C Vulkan Test", 51 SDL_WINDOWPOS_CENTERED, 52 SDL_WINDOWPOS_CENTERED, 53 g_i_window_width, 54 g_i_window_height, 55 SDL_WINDOW_VULKAN | SDL_WINDOW_SHOWN); 56 57 if(!g_sdl_window){ 58 printf("Failed to create SDL window"); 59 return 0; 60 } 61 62 if(vkEnumerateInstanceExtensionProperties(0, &l_i_count, 0) != VK_SUCCESS){ 63 printf("Failed to enumerate vulkan extensions\n"); 64 return 0; 65 } 66 67 printf("Found %i vulkan extensions\n",l_i_count); 68 69 l_vkextensionprops = malloc(sizeof(VkExtensionProperties)*l_i_count); 70 71 vkEnumerateInstanceExtensionProperties(0, &l_i_count,l_vkextensionprops ); 72 73 for(iter = 0; iter < l_i_count; ++iter) 74 printf("\t%s\n",l_vkextensionprops[iter].extensionName); 75 76 printf("\n"); 77 78 g_vk_app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; 79 g_vk_app_info.pApplicationName = "Based Vulkan Test"; 80 g_vk_app_info.applicationVersion = VK_MAKE_VERSION(1,0,0); 81 g_vk_app_info.pEngineName = "hk"; 82 g_vk_app_info.engineVersion = VK_MAKE_VERSION(1,0,0); 83 g_vk_app_info.apiVersion = VK_API_VERSION_1_0; 84 85 g_vk_inst_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; 86 g_vk_inst_create_info.pApplicationInfo = &g_vk_app_info; 87 88 l_i_count = 0; 89 90 91 if(SDL_Vulkan_GetInstanceExtensions(g_sdl_window,&l_i_count,0) == 0){ 92 printf("Failed to get Vulkan extensions from SDL"); 93 return 0; 94 } 95 96 /* For some reason in the vkQuake code it was l_i_count+3*/ 97 l_cpp_sdl_extensions = malloc(sizeof(const char*) * (l_i_count)); 98 99 SDL_Vulkan_GetInstanceExtensions(g_sdl_window,&l_i_count,l_cpp_sdl_extensions); 100 101 printf("Found %i required vulkan extensions for SDL\n",l_i_count); 102 for(iter = 0; iter < l_i_count; ++iter) 103 printf("\t%s\n",l_cpp_sdl_extensions[iter]); 104 105 printf("\n"); 106 107 g_vk_inst_create_info.enabledExtensionCount = l_i_count; 108 g_vk_inst_create_info.ppEnabledExtensionNames = l_cpp_sdl_extensions; 109 110 l_i_count = 0; 111 112 if(vkEnumerateInstanceLayerProperties(&l_i_layer_count,0) != VK_SUCCESS){ 113 printf("Failed to get Vulkan layers\n"); 114 return 0; 115 } 116 117 printf("Found %i vulkan layers\n",l_i_layer_count); 118 119 l_vklayerprops = malloc(sizeof(VkLayerProperties)*l_i_layer_count); 120 l_cpp_sdl_layers = malloc(sizeof(char*) * l_i_layer_count); 121 vkEnumerateInstanceLayerProperties(&l_i_layer_count,l_vklayerprops); 122 123 for(iter = 0; iter < l_i_count; ++iter){ 124 l_cpp_sdl_layers[iter] = l_vklayerprops[iter].layerName; 125 printf("\t%s\n",l_cpp_sdl_layers[iter]); 126 } 127 printf("\n"); 128 129 g_vk_inst_create_info.enabledLayerCount = l_i_count; 130 g_vk_inst_create_info.ppEnabledLayerNames = l_cpp_sdl_layers; 131 132 l_vkresult = vkCreateInstance(&g_vk_inst_create_info,0,&g_vk_instance); 133 134 l_i_count = 0; 135 if(vkEnumeratePhysicalDevices(g_vk_instance,&l_i_count,0) != VK_SUCCESS){ 136 printf("Failed to enumerate physical devices\n\n"); 137 return 0; 138 } 139 140 l_vkdevices = malloc(sizeof(VkPhysicalDevice)*l_i_count); 141 vkEnumeratePhysicalDevices(g_vk_instance,&l_i_count,l_vkdevices); 142 143 l_vkdeviceprops = malloc(sizeof(VkPhysicalDeviceProperties)*l_i_count); 144 145 printf("\nListing GPUs\n"); 146 for(iter = 0; iter < l_i_count; ++iter){ 147 vkGetPhysicalDeviceProperties(l_vkdevices[iter],&l_vkdeviceprops[iter]); 148 printf("\t%s - device %i\n",l_vkdeviceprops[iter].deviceName, iter); 149 } 150 printf("\n\n"); 151 152 l_i_count = 0; 153 /* Primary GPU */ 154 vkGetPhysicalDeviceQueueFamilyProperties(l_vkdevices[DEVICE_INDEX],&l_i_count,0); 155 printf("Found %i Queue Family Properties on device %i\n",l_i_count, DEVICE_INDEX); 156 157 l_vkqueuefamilyprops = malloc(sizeof(VkQueueFamilyProperties)*l_i_count); 158 vkGetPhysicalDeviceQueueFamilyProperties(l_vkdevices[DEVICE_INDEX],&l_i_count,l_vkqueuefamilyprops); 159 160 for(iter = 0; iter < l_i_count; ++iter){ 161 if(l_vkqueuefamilyprops[iter].queueCount > 0 && l_vkqueuefamilyprops[iter].queueFlags & VK_QUEUE_GRAPHICS_BIT){ 162 printf("Found VK_QUEUE_GRAPHICS_BIT capibilities on family index %i\n",iter); 163 printf("\tqueueCount=%i\n\n",l_vkqueuefamilyprops[iter].queueCount); 164 l_qfamilyindex = iter; 165 break; 166 } 167 } 168 if(vkEnumerateDeviceExtensionProperties(l_vkdevices[DEVICE_INDEX],0,&l_i_device_ext_count,0) != VK_SUCCESS){ 169 printf("Failed to get device extension properties\n"); 170 return 0; 171 } 172 173 l_vkdeviceextensionprops = malloc(sizeof(VkExtensionProperties)*l_i_device_ext_count); 174 l_cpp_dev_ext_names = malloc(sizeof(char*)*l_i_device_ext_count); 175 176 vkEnumerateDeviceExtensionProperties(l_vkdevices[DEVICE_INDEX],0,&l_i_device_ext_count,l_vkdeviceextensionprops); 177 178 printf("Printing device %i extension properties \n",DEVICE_INDEX); 179 for(iter = 0; iter < l_i_device_ext_count; ++iter){ 180 l_cpp_dev_ext_names[iter] = l_vkdeviceextensionprops[iter].extensionName; 181 printf("\t\t%s",l_cpp_dev_ext_names[iter]); 182 if(((iter+1) % 2) == 0) 183 printf("\n"); 184 } 185 printf("\n\n"); 186 187 l_vkdevicequeueinfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 188 l_vkdevicequeueinfo.queueFamilyIndex = l_qfamilyindex; 189 l_vkdevicequeueinfo.queueCount = 1; 190 l_vkdevicequeueinfo.pQueuePriorities = l_fa_priorities; 191 l_vkdevicequeueinfo.pNext = 0; 192 l_vkdevicequeueinfo.flags = 0; 193 194 l_vkdevicecreateinfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; 195 l_vkdevicecreateinfo.queueCreateInfoCount = 1; 196 l_vkdevicecreateinfo.pQueueCreateInfos = &l_vkdevicequeueinfo; 197 l_vkdevicecreateinfo.ppEnabledLayerNames = l_cpp_sdl_layers; 198 l_vkdevicecreateinfo.enabledLayerCount = l_i_layer_count; 199 l_vkdevicecreateinfo.ppEnabledExtensionNames = l_cpp_dev_ext_names; 200 l_vkdevicecreateinfo.enabledExtensionCount = l_i_device_ext_count; 201 l_vkdevicecreateinfo.pNext = 0; 202 l_vkdevicecreateinfo.pEnabledFeatures = 0; 203 l_vkdevicecreateinfo.flags = 0; 204 205 if(vkCreateDevice(l_vkdevices[DEVICE_INDEX], &l_vkdevicecreateinfo, 0, &l_vkdevice) != VK_SUCCESS){ 206 printf("Failed to create logical device\n\n"); 207 } 208 209 vkGetDeviceQueue(l_vkdevice,l_qfamilyindex,0,&l_graphics_queue); 210 211 do{ 212 213 SDL_PollEvent(&l_sdl_event); 214 215 }while(l_sdl_event.type != SDL_QUIT); 216 217 }