1 #include <kiba/renderer/vulkan/buffer.h>
3 #include <kiba/renderer/vulkan/command_buffer.h>
7 VkBufferUsageFlags usage_flags,
8 VkMemoryPropertyFlags property_flags,
10 VkBufferCreateInfo create_info = {
11 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
14 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
17 vkCreateBuffer(context->device.logical, &create_info, &context->alloc.vulkan_callbacks, &buffer->buffer));
18 VkMemoryRequirements memory_requirements;
19 vkGetBufferMemoryRequirements(context->device.logical, buffer->buffer, &memory_requirements);
24 u32 type_index = vulkan_get_memory_type(context, memory_requirements.memoryTypeBits, property_flags);
25 if (type_index == U32_MAX) {
26 KB_ERROR(
"could not find memory type matching the buffers requirements");
29 VkMemoryAllocateInfo alloc_info = {
30 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
31 .allocationSize = memory_requirements.size,
32 .memoryTypeIndex = type_index,
35 vkAllocateMemory(context->device.logical, &alloc_info, &context->alloc.vulkan_callbacks, &buffer->memory));
36 VK_CALL_B8(vkBindBufferMemory(context->device.logical, buffer->buffer, buffer->memory, 0));
41 VkCommandBuffer command_buffer;
42 if (!vulkan_command_buffer_start_single_time_command(context, &command_buffer)) {
45 VkBufferCopy copy_info = {
50 vkCmdCopyBuffer(command_buffer, src->buffer, dst->buffer, 1, ©_info);
52 return vulkan_command_buffer_end_single_time_command(context, &command_buffer);
56 vkDestroyBuffer(context->device.logical, buffer->buffer, &context->alloc.vulkan_callbacks);
57 vkFreeMemory(context->device.logical, buffer->memory, &context->alloc.vulkan_callbacks);
60 u32 vulkan_get_memory_type(
vulkan_context *context, u32 type_filter, VkMemoryPropertyFlags flags) {
61 VkPhysicalDeviceMemoryProperties memory_properties;
62 vkGetPhysicalDeviceMemoryProperties(context->device.physical, &memory_properties);
63 for (u32 i = 0; i < memory_properties.memoryTypeCount; ++i) {
#define KB_UBIT(n)
Get unsigned value with the n-th bit set to 1. All other bits are 0.
#define KB_FLAGS_ALL_SET(value, flags)
Check if all flags are set inside value.
#define KB_ERROR(...)
Log entry with error log level.