1 #include <kiba/renderer/vulkan/instance.h>
3 #include <kiba/containers/array.h>
6 b8 verify_extension_availability(array_of(
const char *) names);
8 b8 verify_layer_availability(array_of(
const char *) names);
11 VkApplicationInfo app_info = {
12 .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
13 .pApplicationName =
"Vulkan POC",
14 .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
15 .pEngineName =
"kiba",
16 .engineVersion = VK_MAKE_VERSION(0, 0, 1),
17 .apiVersion = VK_API_VERSION_1_0,
20 if (!verify_extension_availability(context->instance.extensions)) {
21 KB_ERROR(
"not all required extensions available");
25 if (!verify_layer_availability(context->instance.layers)) {
26 KB_ERROR(
"not all required layers available");
31 VkValidationFeatureEnableEXT enabled[] = {VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT};
32 VkValidationFeaturesEXT features = {
33 .sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT,
34 .disabledValidationFeatureCount = 0,
35 .enabledValidationFeatureCount = 1,
36 .pDisabledValidationFeatures = VK_NULL_HANDLE,
37 .pEnabledValidationFeatures = enabled,
41 VkInstanceCreateInfo instance_info = {
42 .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
43 .pApplicationInfo = &app_info,
44 .enabledLayerCount = (u32) array_size(context->instance.layers),
45 .ppEnabledLayerNames = context->instance.layers,
46 .enabledExtensionCount = (u32) array_size(context->instance.extensions),
47 .ppEnabledExtensionNames = context->instance.extensions,
53 VK_CALL_B8(vkCreateInstance(&instance_info, &context->alloc.vulkan_callbacks, &context->instance.instance));
59 vkDestroyInstance(context->instance.instance, &context->alloc.vulkan_callbacks);
62 b8 verify_extension_availability(array_of(
const char *) names) {
63 u32 avail_extension_count = 0;
64 VK_CALL_B8(vkEnumerateInstanceExtensionProperties(0, &avail_extension_count, 0))
65 if (avail_extension_count < array_size(names)) {
66 KB_INFO(
"not all required extensions available");
69 array_of(VkExtensionProperties) available_extensions =
70 array_create(VkExtensionProperties, avail_extension_count, array_alloc(names));
71 if (available_extensions ==
KB_NULL) {
72 KB_INFO(
"could not allocate enough memory for list of available extensions");
76 VK_CALL_B8(vkEnumerateInstanceExtensionProperties(0, &avail_extension_count, available_extensions));
77 array_resize(&available_extensions, avail_extension_count);
79 b8 has_extensions =
true;
80 array_for_each(
const char *, name, names) {
82 for (u32 j = 0; j < avail_extension_count; ++j) {
89 KB_ERROR(
"could not find required extension {raw_string}", *name);
90 has_extensions =
false;
93 array_destroy(&available_extensions);
94 return has_extensions;
97 b8 verify_layer_availability(array_of(
const char *) names) {
98 u32 avail_layer_count = 0;
99 VK_CALL_B8(vkEnumerateInstanceLayerProperties(&avail_layer_count, 0));
100 if (avail_layer_count < array_size(names)) {
101 KB_INFO(
"not all required extensions available");
104 array_of(VkLayerProperties) avail_layers = array_create(VkLayerProperties, avail_layer_count, array_alloc(names));
106 KB_INFO(
"could not allocate enough memory for list of available layers");
111 VK_CALL_B8(vkEnumerateInstanceLayerProperties(&avail_layer_count, avail_layers));
112 array_resize(&avail_layers, avail_layer_count);
114 b8 has_layers =
true;
115 array_for_each(
const char *, name, names) {
117 for (u32 j = 0; j < avail_layer_count; ++j) {
124 KB_ERROR(
"could not find required validation layer {raw_string}", *name);
128 array_destroy(&avail_layers);
b8 string_equal(const string lhs, const string rhs)
Check if the contents of two strings are equal.
string string_from_raw(const char *raw)
Construct a string from a raw string.
Custom library for interactions with strings using string views.
#define KB_NULL
Value of an invalid ptr (nullptr).
#define KB_ERROR(...)
Log entry with error log level.
#define KB_INFO(...)
Log entry with info log level.