|
|
|
@ -270,22 +270,70 @@ VkShaderModule Context::create_shader_module_from_file(const char* path) { |
|
|
|
return VK_NULL_HANDLE; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t Context::find_memory(uint32_t type_filter, VkMemoryPropertyFlags properties) { |
|
|
|
VkPhysicalDeviceMemoryProperties memory_properties; |
|
|
|
vkGetPhysicalDeviceMemoryProperties( |
|
|
|
m_physical_device, |
|
|
|
&memory_properties |
|
|
|
); |
|
|
|
|
|
|
|
for(uint32_t type_index = 0; type_index < memory_properties.memoryTypeCount; type_index += 1) { |
|
|
|
int32_t Context::find_memory_type(uint32_t type_filter, VkMemoryPropertyFlags properties) { |
|
|
|
for(uint32_t type_index = 0; type_index < m_memory_properties.memoryTypeCount; type_index += 1) { |
|
|
|
if(((1 << type_index) & type_filter) && |
|
|
|
(memory_properties.memoryTypes[type_index].propertyFlags & properties) == properties) |
|
|
|
(m_memory_properties.memoryTypes[type_index].propertyFlags & properties) == properties) |
|
|
|
return type_index; |
|
|
|
} |
|
|
|
|
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
VkDeviceMemory Context::allocate_memory(VkDeviceSize size, uint32_t type_filter, VkMemoryPropertyFlags properties) { |
|
|
|
uint32_t memory_type = find_memory_type(type_filter, properties); |
|
|
|
|
|
|
|
VkMemoryAllocateInfo malloc_info { |
|
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, |
|
|
|
.allocationSize = size, |
|
|
|
.memoryTypeIndex = memory_type, |
|
|
|
}; |
|
|
|
|
|
|
|
VkDeviceMemory memory = VK_NULL_HANDLE; |
|
|
|
if(vkAllocateMemory(m_device, &malloc_info, nullptr, &memory) != VK_SUCCESS) |
|
|
|
throw std::runtime_error("failed to allocate device memory"); |
|
|
|
|
|
|
|
return memory; |
|
|
|
} |
|
|
|
|
|
|
|
std::tuple<VkBuffer, VkDeviceMemory> Context::create_buffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags memory_properties) { |
|
|
|
VkDeviceMemory memory = VK_NULL_HANDLE; |
|
|
|
VkBuffer buffer = VK_NULL_HANDLE; |
|
|
|
|
|
|
|
VkBufferCreateInfo buffer_info { |
|
|
|
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, |
|
|
|
.size = size, |
|
|
|
.usage = usage, |
|
|
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE, |
|
|
|
}; |
|
|
|
|
|
|
|
if(vkCreateBuffer( |
|
|
|
m_device, |
|
|
|
&buffer_info, |
|
|
|
nullptr, |
|
|
|
&buffer |
|
|
|
) != VK_SUCCESS) |
|
|
|
throw std::runtime_error("failed to create buffer"); |
|
|
|
|
|
|
|
VkMemoryRequirements memory_requirements; |
|
|
|
vkGetBufferMemoryRequirements( |
|
|
|
m_device, |
|
|
|
buffer, |
|
|
|
&memory_requirements |
|
|
|
); |
|
|
|
|
|
|
|
memory = allocate_memory( |
|
|
|
memory_requirements.size, |
|
|
|
memory_requirements.memoryTypeBits, |
|
|
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
|
|
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
|
|
|
); |
|
|
|
|
|
|
|
vkBindBufferMemory(m_device, buffer, memory, 0); |
|
|
|
|
|
|
|
return { buffer, memory }; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Context::destroy_instance(VkInstance& instance) { |
|
|
|
if(instance == nullptr) |
|
|
|
@ -531,6 +579,7 @@ void Context::choose_physical_device(const ContextSettings& settings) { |
|
|
|
if(maybe_properties) { |
|
|
|
m_physical_device = physical_device; |
|
|
|
m_physical_device_properties = *maybe_properties; |
|
|
|
vkGetPhysicalDeviceMemoryProperties(m_physical_device, &m_memory_properties); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|