1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#if 0
#define VK_NO_PROTOTYPES
internal void
vk_render_entrypoint(MemArena *arena, WinParams *window, Params *params)
{
// NOTE: requires #define VK_NO_PROTOTYPES
// NOTE: dlopen searches for a path starting with a '/' afterwards it starts searching other directories
// thats why the param is called path here. but we pass the name in stead
// https://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html
VkApplicationInfo app_info{}; // used for creating a vkInstance
VkInstanceCreateInfo create_info{};
// fill in app info
{
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app_info.pApplicationName = params->name;
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.pEngineName = window->name;
app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.apiVersion = VK_API_VERSION_1_0;
}
// fill in create info
{
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
create_info.pApplicationInfo = &app_info;
#if 0
// TODO: fill in the extenions for windows.
// where do we find these?
create_info.enabledExtensionCount = ...;
create_info.ppEnabledExtensionNames = ...;
#endif
}
#if DEBUG
bool enable_validation_layer = true;
#else
bool enable_validation_layer = false;
#endif
bool layer_found = false;
// check validation support
ScratchArena scratch = scratch_start(arena);
// gather the validation layers and available layers
u32 layer_count;
vkEnumerateInstanceLayerProperties(&layer_count, NULL);
VkLayerProperties *available_layers;
String8List *validation_layers = PushStructZero(arena, String8List);
String8Node vk_layer_khronos_validation_node = ToString8Node(str8("VK_LAYER_KHRONOS_validation"));
str8_list_push_node(validation_layers, &vk_layer_khronos_validation_node);
available_layers = PushArrayZero(arena, VkLayerProperties, layer_count);
vkEnumerateInstanceLayerProperties(&layer_count, available_layers);
for(String8Node *current_node = validation_layers->first; !is_nil_str8_node(current_node); current_node = current_node->next) {
for(u32 index = 0; index < layer_count; ++index) {
VkLayerProperties *current_layer = &available_layers[index];
String8 current_layer_name = str8(current_layer->layerName);
if(str8_is_match(current_node->value, current_layer_name)) {
layer_found = true;
break;
}
}
}
// check if we found that specific layer and we can continue
if(enable_validation_layer) { // check the avalaiobe layers after creating the instance
if(!layer_found) {
Log("requested validation layer not found!");
}
// extract names, null terminated
String8 *names_in_one_str8_lit = PushStructZero(arena, String8);
for(u32 index = 0; index < layer_count; ++index) {
VkLayerProperties *current_layer = &available_layers[index];
String8 current_layer_name;
if(current_layer != NULL) {
current_layer_name = str8(current_layer->layerName);
} else {
breakpoint();
}
str8_append(names_in_one_str8_lit, ¤t_layer_name);
}
create_info.enabledLayerCount = layer_count;
create_info.ppEnabledLayerNames = (const char *)names_in_one_str8_lit->data; // TODO: is this fixed???
}
VkInstance instance = VK_NULL_HANDLE;
VkResult result = vkCreateInstance(&create_info, NULL, &instance);
if(result != VK_SUCCESS) { // check the return code of the instance creation
Log("Failed to create a VkInstance");
} else {
scratch_end(&scratch);
{
// TODO: window polling untill it closes
}
}
if(instance != VK_NULL_HANDLE) {
vkDestroyInstance(instance, nullptr);
}
}
internal void
render_loop()
{
}
#endif
|