import vulkan , vulkan_utils type Uniform_Buffer_Object = object of RootObj device_memory*: VkDeviceMemory vk_buffer*: VkBuffer # The descriptor set stores the resources bound to the binding points in a shader # It connects the binding points of the different shaders with the buffers and images used for those bindings descriptor_buffer_info*: VkDescriptorBufferInfo descriptor_set*: VkDescriptorSet # We keep a pointer to the mapped buffer, so we can easily update it's contents via a memcpy data*: pointer Uniform_Buffer* = ref object of Uniform_Buffer_Object proc a_uniform_buffer*( vk_device: VkDevice , gpu_memory_properties: VkPhysicalDeviceMemoryProperties , buffer_usage_flags: VkBufferUsageFlags , memory_flags: VkMemoryPropertyFlags , allocation_size: VkDeviceSize ): Uniform_Buffer = result = Uniform_Buffer() var allocation_info = VkMemoryAllocateInfo(sType: VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO) memory_allocation_flag_info = VkMemoryAllocateFlagsInfo(sType: VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR) mem_reqs: VkMemoryRequirements buffer_info = VkBufferCreateInfo( sType: VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO , pNext: nil , size: allocation_size , usage: VkBufferUsageFlags VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT ) assert vkCreateBuffer( vk_device , addr buffer_info , nil , addr result.vk_buffer ) == VK_SUCCESS vkGetBufferMemoryRequirements( vk_device , result.vk_buffer , addr mem_reqs ) allocation_info.allocationSize = mem_reqs.size allocation_info.memoryTypeIndex = gpu_memory_properties.find_memory_with_property( mem_reqs.memoryTypeBits , memory_flags ) discard vkAllocateMemory( vk_device , addr allocation_info , nil , addr result.device_memory ) discard vkBindBufferMemory( vk_device , result.vk_buffer , result.device_memory , VkDeviceSize 0 ) assert vkMapMemory( vk_device , result.device_memory , VkDeviceSize 0 , allocation_size , VkMemoryMapFlags 0 , addr result.data ) == VK_SUCCESS return result