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