ae2f_docs
Loading...
Searching...
No Matches
vk.h
1#include <vulkan/vulkan_core.h>
2
3#include <assert.h>
4#include <stdio.h>
5#include <string.h>
6#include <stdlib.h>
7
8VkResult s_vkres = VK_SUCCESS;
9
10static VkApplicationInfo s_vkapp;
11static VkInstanceCreateInfo s_vkcreat;
12static VkInstance s_vulkan;
13
14static VkPhysicalDevice* sp_vkphydev;
15#define vkphydev (*sp_vkphydev)
16
17static uint32_t s_vkphydevcount = 0;
18static VkPhysicalDeviceMemoryProperties s_vkphydevmemprops;
19
20static VkDevice s_vkdev;
21static VkDeviceCreateInfo s_vkdevcreat;
22static VkQueue s_vkqueue;
23
24static uint32_t find_queue_family(VkPhysicalDevice phydev) {
25 uint32_t queueFamilyCount = 0;
26
27 union {
28 void* v;
29 VkQueueFamilyProperties* p;
30 } queueFamilies;
31 uint32_t queueFamilyIndex = UINT32_MAX;
32
33 vkGetPhysicalDeviceQueueFamilyProperties(
34 phydev
35 , &queueFamilyCount
36 , NULL
37 );
38
39
40 queueFamilies.v = malloc((size_t)(queueFamilyCount * sizeof(VkQueueFamilyProperties)));
41
42 vkGetPhysicalDeviceQueueFamilyProperties(
43 phydev
44 , &queueFamilyCount
45 , queueFamilies.p
46 );
47
48 {
49 uint32_t i = queueFamilyCount;
50 while (i--) {
51 if (queueFamilies.p[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
52 queueFamilyIndex = i;
53 break;
54 }
55 }
56 }
57 free(queueFamilies.v);
58 return queueFamilyIndex;
59}
60
61static void Test_VkInit(void) {
62 uint32_t queueFamilyIndex;
63 float queuePriority;
64 VkDeviceQueueCreateInfo queueCreateInfo;
65
66 union {
67 VkExtensionProperties* m_vkextprops;
68 void* m_v;
69 } exts;
70
71 union {
72 VkExtensionProperties* m_vkextprops_send;
73 const char** m_pch;
74 } extnames;
75
76 memset(&s_vkphydevmemprops, 0, sizeof(s_vkphydevmemprops));
77 memset(&s_vkdevcreat, 0, sizeof(s_vkdevcreat));
78 memset(&s_vkcreat, 0, sizeof(s_vkcreat));
79
80 vkEnumerateInstanceExtensionProperties(NULL, &s_vkcreat.enabledExtensionCount, NULL);
81 printf("enabledextcount: %u\n", s_vkcreat.enabledExtensionCount);
82 exts.m_v = malloc((size_t)(s_vkcreat.enabledExtensionCount * (sizeof(VkExtensionProperties) + sizeof(void*))));
83 extnames.m_vkextprops_send = exts.m_vkextprops + s_vkcreat.enabledExtensionCount;
84 vkEnumerateInstanceExtensionProperties(NULL, &s_vkcreat.enabledExtensionCount, exts.m_vkextprops);
85
86 {
87 uint32_t i = s_vkcreat.enabledExtensionCount;
88
89 while(i--) {
90 puts(exts.m_vkextprops[i].extensionName);
91 extnames.m_pch[i]
92 = exts.m_vkextprops[i].extensionName;
93 }
94 }
95
96
97
98 s_vkdev = VK_NULL_HANDLE;
99 s_vulkan = 0;
100 s_vkphydevcount = 0;
101 sp_vkphydev = NULL;
102
103 s_vkapp.apiVersion = VK_MAKE_VERSION(1, 0, 0);
104 s_vkapp.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
105 s_vkapp.pApplicationName = "ae2f_vktest";
106 s_vkapp.engineVersion = VK_MAKE_VERSION(1, 0, 0);
107 s_vkapp.pNext = NULL;
108 s_vkapp.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
109 s_vkapp.pEngineName = "ae2f_vktest_engine";
110 s_vkcreat.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
111 s_vkcreat.enabledExtensionCount = 0; /** extnames.m_pch; */
112 s_vkcreat.ppEnabledExtensionNames = NULL; /** extnames.m_pch; */
113 s_vkcreat.ppEnabledLayerNames = 0;
114 s_vkcreat.flags = 0;
115 s_vkcreat.pApplicationInfo = &s_vkapp;
116
117 s_vkres = vkCreateInstance(&s_vkcreat, 0, &s_vulkan);
118 printf("vkCreateInstance result: %d\n", s_vkres);
119 assert(vkres == VK_SUCCESS && "vkCreateInstance has failed");
120 assert(s_vulkan);
121
122 s_vkres = vkEnumeratePhysicalDevices(
123 s_vulkan
124 , &s_vkphydevcount
125 , NULL
126 );
127
128 assert(vkres == VK_SUCCESS);
129 assert(vkphydevcount && "vkphydevcount must be greater than 0.");
130
131 printf("Number of Physical Device available: %u\n", s_vkphydevcount);
132
133 sp_vkphydev = malloc((size_t)(sizeof(VkPhysicalDevice) * s_vkphydevcount));
134 assert(p_vkphydev);
135
136 s_vkres = vkEnumeratePhysicalDevices(
137 s_vulkan
138 , &s_vkphydevcount
139 , sp_vkphydev
140 );
141
142 assert(vkres == VK_SUCCESS || vkres == VK_INCOMPLETE && "vkEnumeratePhysicalDevices has failed.");
143 assert(vkphydev && "vkphydev is no initialised");
144
145 s_vkdevcreat.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
146
147 /** Find a queue family */
148 queueFamilyIndex = find_queue_family(vkphydev);
149 assert(queueFamilyIndex != UINT32_MAX && "No suitable queue family found");
150
151 /* Initialize VkDeviceQueueCreateInfo */
152 queuePriority = 1.0f;
153 memset(&queueCreateInfo, 0, sizeof(queueCreateInfo));
154
155 queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
156 queueCreateInfo.queueFamilyIndex = queueFamilyIndex;
157 queueCreateInfo.queueCount = 1;
158 queueCreateInfo.pQueuePriorities = &queuePriority;
159
160 /* Initialize VkDeviceCreateInfo */
161 s_vkdevcreat.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
162 s_vkdevcreat.queueCreateInfoCount = 1;
163 s_vkdevcreat.pQueueCreateInfos = &queueCreateInfo;
164 s_vkdevcreat.enabledExtensionCount = 0;
165 s_vkdevcreat.ppEnabledExtensionNames = NULL;
166 s_vkdevcreat.enabledLayerCount = 0;
167 s_vkdevcreat.ppEnabledLayerNames = NULL;
168 s_vkdevcreat.flags = 0;
169
170 s_vkres = vkCreateDevice(
172 , &s_vkdevcreat
173 , 0
174 , &s_vkdev
175 );
176
177 vkGetDeviceQueue(
178 s_vkdev
179 , queueFamilyIndex
180 , 0
181 , &s_vkqueue
182 );
183
184 assert(vkres == VK_SUCCESS && "vkCreateDevice has failed.");
185 assert(vkdev == VK_NULL_HANDLE && "vkdev is not initialised");
186
187 vkGetPhysicalDeviceMemoryProperties(
189 , &s_vkphydevmemprops
190 );
191
192 puts("Test_VkInit has done.");
193 free(exts.m_v);
194}
195
196static void Test_VkEnd(void) {
197 if(s_vkdev) vkDestroyDevice(s_vkdev, 0);
198 if(s_vulkan) vkDestroyInstance(s_vulkan, 0);
199 free(sp_vkphydev);
200}
#define SWTCH
Definition init.c:1
#define vkphydev
Definition vk.h:15