| 710 | } |
| 711 | |
| 712 | VkResult CreateDeviceBuffer(VkPhysicalDevice vk_physical_device, VkDevice vk_device, |
| 713 | VkDeviceSize vk_size, VkMemoryPropertyFlags vk_memory_flags, DeviceBuffer* bufferOut) |
| 714 | { |
| 715 | assert(vk_size < 0x80000000); // must match max bit count in graphics_vulkan_private.h |
| 716 | |
| 717 | VkBufferCreateInfo vk_buffer_create_info; |
| 718 | memset(&vk_buffer_create_info, 0, sizeof(vk_buffer_create_info)); |
| 719 | |
| 720 | vk_buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; |
| 721 | vk_buffer_create_info.size = vk_size; |
| 722 | vk_buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; |
| 723 | vk_buffer_create_info.usage = bufferOut->m_Usage; |
| 724 | |
| 725 | VkResult res = vkCreateBuffer(vk_device, &vk_buffer_create_info, 0, &bufferOut->m_Handle.m_Buffer); |
| 726 | if (res != VK_SUCCESS) |
| 727 | { |
| 728 | return res; |
| 729 | } |
| 730 | |
| 731 | // Allocate GPU memory to hold buffer |
| 732 | VkMemoryRequirements vk_buffer_memory_req; |
| 733 | vkGetBufferMemoryRequirements(vk_device, bufferOut->m_Handle.m_Buffer, &vk_buffer_memory_req); |
| 734 | |
| 735 | VkMemoryAllocateInfo vk_memory_alloc_info; |
| 736 | memset(&vk_memory_alloc_info, 0, sizeof(vk_memory_alloc_info)); |
| 737 | |
| 738 | vk_memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; |
| 739 | vk_memory_alloc_info.allocationSize = vk_buffer_memory_req.size; |
| 740 | vk_memory_alloc_info.memoryTypeIndex = 0; |
| 741 | |
| 742 | uint32_t memory_type_index = 0; |
| 743 | if (!GetMemoryTypeIndex(vk_physical_device, vk_buffer_memory_req.memoryTypeBits, vk_memory_flags, &memory_type_index)) |
| 744 | { |
| 745 | res = VK_ERROR_INITIALIZATION_FAILED; |
| 746 | goto bail; |
| 747 | } |
| 748 | |
| 749 | vk_memory_alloc_info.memoryTypeIndex = memory_type_index; |
| 750 | |
| 751 | res = vkAllocateMemory(vk_device, &vk_memory_alloc_info, 0, &bufferOut->m_Handle.m_Memory); |
| 752 | if (res != VK_SUCCESS) |
| 753 | { |
| 754 | goto bail; |
| 755 | } |
| 756 | |
| 757 | res = vkBindBufferMemory(vk_device, bufferOut->m_Handle.m_Buffer, bufferOut->m_Handle.m_Memory, 0); |
| 758 | if (res != VK_SUCCESS) |
| 759 | { |
| 760 | return res; |
| 761 | } |
| 762 | |
| 763 | bufferOut->m_MemorySize = (size_t) vk_buffer_memory_req.size; |
| 764 | bufferOut->m_Destroyed = 0; |
| 765 | |
| 766 | return VK_SUCCESS; |
| 767 | bail: |
| 768 | DestroyDeviceBuffer(vk_device, &bufferOut->m_Handle); |
| 769 | return res; |
no test coverage detected