main
  1#include "gogvid.h"
  2#include <SDL2/SDL_video.h>
  3#include <SDL2/SDL_vulkan.h>
  4#include <stdlib.h>
  5#include <string.h>
  6#include <vulkan/vulkan_core.h>
  7
  8
  9
 10gog_result gog_graphics_init(gog_graphics_hndl *gh)
 11{
 12	struct gog_vk_ext extensions={0};
 13	struct gog_vk_ext device_extensions={0};
 14	//open window
 15	gog_open_sdl_window(&gh->sdl_window_p,&extensions);
 16	//get instance 
 17	gog_vulkan_init(&gh->vk_instance, extensions, 0);
 18	//get surface 
 19	SDL_Vulkan_CreateSurface(gh->sdl_window_p,  gh->vk_instance, &gh->vk_surface);
 20
 21	gog_device_init(gh,device_extensions);
 22	//get phizical device
 23	//gog_get_physical_device(gh, extensions, VK_QUEUE_GRAPHICS_BIT);
 24	//get logical device plus queues
 25	//gog_get_logical_device();
 26	
 27	return GET_GOG_RESULT(GOG_SUCCES, 0);
 28}
 29	//swapchain
 30	//load shaders into memory
 31	//create pipelines
 32	//framebuffer
 33	//command buffer
 34	//uniforms
 35	//descriptor sets / texture loading
 36
 37gog_result gog_graphics_update(int flags)
 38{
 39	
 40	
 41	return GET_GOG_RESULT(GOG_SUCCES, 0);
 42}
 43
 44gog_result gog_graphics_render_frame()
 45{
 46	
 47	
 48	return GET_GOG_RESULT(GOG_SUCCES, 0);
 49}
 50
 51gog_result gog_open_sdl_window(SDL_Window ** window, struct gog_vk_ext * extensions)
 52{
 53	*window = SDL_CreateWindow(GOG_WINDOW_TITLE, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, GOG_WINDOW_REZ_WIDTH, GOG_WINDOW_REZ_HEIGHT,SDL_WINDOW_VULKAN);
 54	unsigned int sdl_extension_count;
 55	SDL_Vulkan_GetInstanceExtensions(*window , &sdl_extension_count,NULL);
 56	const char ** sdl_extensions = malloc(sdl_extension_count*sizeof(char*));
 57	SDL_Vulkan_GetInstanceExtensions(*window , &sdl_extension_count, sdl_extensions);
 58	extensions->vk_ext_count = sdl_extension_count;
 59	extensions->vk_ext_pp = sdl_extensions;
 60	return GET_GOG_RESULT(GOG_SUCCES,0);
 61}
 62
 63gog_result gog_vulkan_init(VkInstance * instance, struct gog_vk_ext extensions, int flags)
 64{
 65	const char * layers[] = {0};//{"VK_LAYER_KHRONOS_validation"};
 66	const int layer_count = 0;
 67	
 68	VkApplicationInfo app_ci={0};
 69	app_ci.sType=VK_STRUCTURE_TYPE_APPLICATION_INFO;
 70	app_ci.pNext=NULL;
 71	app_ci.apiVersion=VK_API_VERSION_1_3;
 72	app_ci.pEngineName=GOG_ENGINE_NAME;
 73	app_ci.pApplicationName=GOG_APPLICATION_NAME;
 74	app_ci.engineVersion=0;
 75	app_ci.applicationVersion=0;
 76	
 77	VkInstanceCreateInfo instance_ci={0};
 78	instance_ci.sType=VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
 79	instance_ci.pNext=NULL;
 80	instance_ci.pApplicationInfo=&app_ci;
 81	instance_ci.enabledLayerCount=0;
 82	instance_ci.ppEnabledLayerNames=&layers[0];
 83	instance_ci.enabledExtensionCount=extensions.vk_ext_count;
 84	instance_ci.ppEnabledExtensionNames=extensions.vk_ext_pp;
 85	
 86	VkResult result=vkCreateInstance(&instance_ci , 0, instance);
 87	free(extensions.vk_ext_pp);
 88	if(result!=VK_SUCCESS)
 89	{
 90		return GET_GOG_RESULT(GOG_FAIL,result);
 91	}
 92	return GET_GOG_RESULT(GOG_SUCCES,result);
 93}
 94
 95gog_result gog_device_init(gog_graphics_hndl *gh, struct gog_vk_ext gog_device_ext)
 96{
 97	unsigned int gpu_num;
 98	VkPhysicalDeviceProperties gpu_prop;
 99	vkEnumeratePhysicalDevices(gh->vk_instance,&gpu_num,NULL);
100	VkPhysicalDevice gpu_list[gpu_num];
101	vkEnumeratePhysicalDevices(gh->vk_instance,&gpu_num,gpu_list);
102	for(int i=0;i<gpu_num;i++)
103	{
104		vkGetPhysicalDeviceProperties(gpu_list[i],&gpu_prop);
105		uint32_t extension_count=0;
106		vkEnumerateDeviceExtensionProperties(gpu_list[i],NULL,&extension_count,NULL);
107		VkExtensionProperties extensions[extension_count];
108		vkEnumerateDeviceExtensionProperties(gpu_list[i],NULL,&extension_count,&extensions[0]);
109		if(gog_verify_device_extensions(gog_device_ext,extensions,extension_count).status == GOG_FAIL)
110		{
111			continue;
112		}
113		uint32_t queue_num=0;
114		vkGetPhysicalDeviceQueueFamilyProperties(gpu_list[i],&queue_num,NULL);
115		VkQueueFamilyProperties queue_properties_list[queue_num];
116		vkGetPhysicalDeviceQueueFamilyProperties(gpu_list[i], &queue_num, queue_properties_list);
117		if(gog_find_device_queues(gh,queue_properties_list,queue_num).status==GOG_FAIL)
118		{
119			continue;
120		}
121		VkBool32 present_support=0;
122		gh->vk_queue_index_present=-1;
123		for(int j=0;j<queue_num;j++)
124		{
125			vkGetPhysicalDeviceSurfaceSupportKHR(gpu_list[i], j, gh->vk_surface,&present_support);
126			if(present_support)
127			{
128				gh->vk_queue_index_present=j;
129				continue;
130			}
131		} 
132		gh->vk_gpu=gpu_list[i];
133		printf("valid gpu: %s\n",gpu_prop.deviceName);
134		
135	}
136	return GET_GOG_RESULT(GOG_SUCCES, 0);
137}
138
139gog_result gog_verify_device_extensions(struct gog_vk_ext gog_device_ext,VkExtensionProperties *ext, int ext_count)
140{
141	for(int i=0;i<gog_device_ext.vk_ext_count;i++)
142	{
143		int found=0;
144		for(int j=0;j<ext_count;j++)
145		{
146			if(strcmp(gog_device_ext.vk_ext_pp[i],ext[j].extensionName)==0)
147			{
148				found=1;
149				break;
150			}
151		}
152		if(found==0)return GET_GOG_RESULT(GOG_FAIL, GOG_ERR_MISMATCH);
153	}
154	return GET_GOG_RESULT(GOG_SUCCES, 0);
155}
156
157gog_result gog_find_device_queues(gog_graphics_hndl *gh, VkQueueFamilyProperties * queue_prop_p, int queue_prop_count)
158{
159	gh->vk_queue_index_graphics=-1;
160	gh->vk_queue_index_compute=-1;
161	gh->vk_queue_index_transfer=-1;
162	gh->vk_queue_index_sparse_binding=-1;
163	for(int i=0;i<queue_prop_count;i++)
164	{
165		if(queue_prop_p[i].queueFlags==VK_QUEUE_GRAPHICS_BIT)
166		{
167			gh->vk_queue_index_graphics=i;
168		}
169		if(queue_prop_p[i].queueFlags==VK_QUEUE_COMPUTE_BIT)
170		{
171			gh->vk_queue_index_compute=i;
172		}
173		if(queue_prop_p[i].queueFlags==VK_QUEUE_TRANSFER_BIT)
174		{
175			gh->vk_queue_index_transfer=i;
176		}
177		if(queue_prop_p[i].queueFlags==VK_QUEUE_SPARSE_BINDING_BIT)
178		{
179			gh->vk_queue_index_sparse_binding=i;
180		}
181	}
182	return GET_GOG_RESULT(GOG_SUCCES, 0);
183}
184