1 #include <kiba/renderer/vulkan/context.h>
5 #include <kiba/renderer/vulkan/allocator.h>
7 b8 vulkan_context_resize_callback(u16 code,
void *sender,
void *listener,
event_context context);
9 b8 vulkan_context_resize_callback(u16 code,
void *sender,
void *listener,
event_context context) {
15 ctx->swap_chain.recreate =
true;
21 if (!vulkan_allocator_create(&context->alloc)) {
26 array_of(
const char *) instance_extensions = array_create(
const char *, 5, &context->alloc.kiba_alloc);
28 if (instance_extensions ==
KB_NULL) {
29 KB_ERROR(
"could not create array for instance extensions");
32 array_push(instance_extensions, VK_KHR_SURFACE_EXTENSION_NAME);
35 array_push(instance_extensions,
"VK_KHR_xcb_surface");
38 array_push(instance_extensions, VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
41 array_of(
const char *) instance_layers = array_create(
const char *, 4, &context->alloc.kiba_alloc);
42 if (instance_layers ==
KB_NULL) {
43 KB_ERROR(
"could not create array for instance layers");
47 array_push(instance_layers,
"VK_LAYER_KHRONOS_validation");
50 context->instance.extensions = instance_extensions;
51 context->instance.layers = instance_layers;
54 array_of(
const char *) device_extensions = array_create(
const char *, 4, &context->alloc.kiba_alloc);
55 if (device_extensions ==
KB_NULL) {
56 KB_ERROR(
"could not create array for device extensions");
59 array_push(device_extensions, VK_KHR_SWAPCHAIN_EXTENSION_NAME);
60 array_push(device_extensions, VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
62 VkPhysicalDeviceFeatures features = {
63 .samplerAnisotropy = VK_TRUE,
72 .extensions = device_extensions,
76 context->device.requirements = device_requirements;
79 VkSurfaceFormatKHR swap_chain_format = {
80 .colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,
81 .format = VK_FORMAT_B8G8R8A8_SRGB,
84 .format = swap_chain_format,
85 .present_mode = VK_PRESENT_MODE_FIFO_KHR,
88 context->swap_chain.requirements = swap_chain_requirements;
91 context->window = window;
93 event_register(EVENT_CODE_WINDOW_RESIZE, context, &vulkan_context_resize_callback,
false);
99 event_unregister(EVENT_CODE_WINDOW_RESIZE, context, &vulkan_context_resize_callback);
100 array_destroy(&context->device.requirements.extensions);
101 array_destroy(&context->instance.layers);
102 array_destroy(&context->instance.extensions);
103 vulkan_allocator_destroy(&context->alloc);
#define UNUSED(x)
Mark parameter as unused.
#define KB_NULL
Value of an invalid ptr (nullptr).
b8 event_unregister(u16 event_code, void *listener, on_event_function on_event)
Unregister a callback for a particular event type.
b8 event_register(u16 event_code, void *listener, on_event_function on_event, b8 append)
Register a callback for a particular event type.
#define KB_ERROR(...)
Log entry with error log level.
Context used to store data of an event.