vulkan-c

Basic C setup code for vulcan
Log | Files | Refs

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 }