kiba-engine
context.c
1 #include <kiba/renderer/vulkan/context.h>
2 
3 #include <kiba/core/event.h>
4 #include <kiba/core/log.h>
5 #include <kiba/renderer/vulkan/allocator.h>
6 
7 b8 vulkan_context_resize_callback(u16 code, void *sender, void *listener, event_context context);
8 
9 b8 vulkan_context_resize_callback(u16 code, void *sender, void *listener, event_context context) {
10  UNUSED(code);
11  UNUSED(sender);
12  UNUSED(context);
13  vulkan_context *ctx = listener;
14 
15  ctx->swap_chain.recreate = true;
16  return false;
17 }
18 
19 b8 vulkan_default_context_create(vulkan_context *context, platform_window *window) {
20  // allocator
21  if (!vulkan_allocator_create(&context->alloc)) {
22  return false;
23  }
24 
25  // instance extensions and layers
26  array_of(const char *) instance_extensions = array_create(const char *, 5, &context->alloc.kiba_alloc);
27 
28  if (instance_extensions == KB_NULL) {
29  KB_ERROR("could not create array for instance extensions");
30  return false;
31  }
32  array_push(instance_extensions, VK_KHR_SURFACE_EXTENSION_NAME);
33  // TODO: move somewhere else
34 #ifdef KB_LINUX
35  array_push(instance_extensions, "VK_KHR_xcb_surface");
36 #endif
37 #ifdef KB_DEBUG_BUILD
38  array_push(instance_extensions, VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
39 #endif
40 
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");
44  return false;
45  }
46 #ifdef KB_DEBUG_BUILD
47  array_push(instance_layers, "VK_LAYER_KHRONOS_validation");
48 #endif
49 
50  context->instance.extensions = instance_extensions;
51  context->instance.layers = instance_layers;
52 
53  // device extensions and requirements
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");
57  return false;
58  }
59  array_push(device_extensions, VK_KHR_SWAPCHAIN_EXTENSION_NAME);
60  array_push(device_extensions, VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
61 
62  VkPhysicalDeviceFeatures features = {
63  .samplerAnisotropy = VK_TRUE,
64  };
65 
66  vulkan_device_requirements device_requirements = {
67  .graphics = true,
68  .transfer = true,
69  .present = true,
70  .compute = true,
71  .discrete_gpu = true,
72  .extensions = device_extensions,
73  .features = features,
74  };
75 
76  context->device.requirements = device_requirements;
77 
78  // swap chain
79  VkSurfaceFormatKHR swap_chain_format = {
80  .colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,
81  .format = VK_FORMAT_B8G8R8A8_SRGB,
82  };
83  vulkan_swap_chain_requirements swap_chain_requirements = {
84  .format = swap_chain_format,
85  .present_mode = VK_PRESENT_MODE_FIFO_KHR, // VK_PRESENT_MODE_IMMEDIATE_KHR
86  };
87 
88  context->swap_chain.requirements = swap_chain_requirements;
89 
90  // window
91  context->window = window;
92 
93  event_register(EVENT_CODE_WINDOW_RESIZE, context, &vulkan_context_resize_callback, false);
94 
95  return true;
96 }
97 
98 void vulkan_context_destroy(vulkan_context *context) {
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);
104 }
#define UNUSED(x)
Mark parameter as unused.
Definition: defines.h:21
#define KB_NULL
Value of an invalid ptr (nullptr).
Definition: defines.h:18
b8 event_unregister(u16 event_code, void *listener, on_event_function on_event)
Unregister a callback for a particular event type.
Definition: event.c:67
b8 event_register(u16 event_code, void *listener, on_event_function on_event, b8 append)
Register a callback for a particular event type.
Definition: event.c:47
Event system.
Logging system.
#define KB_ERROR(...)
Log entry with error log level.
Definition: log.h:142
Context used to store data of an event.
Definition: event.h:15
Structure holding information about a window.
Definition: window.h:13