| 849 | } |
| 850 | |
| 851 | bool StagingBufferCollection::AcquireBuffer(VkDeviceSize size, VkBuffer& outBuffer, void*& outMappedPtr) |
| 852 | { |
| 853 | assert(size <= MAX_TOTAL_SIZE); |
| 854 | |
| 855 | // Try to find existing unused buffer with best size. |
| 856 | size_t bestIndex = SIZE_MAX; |
| 857 | for(size_t i = 0, count = m_Bufs.size(); i < count; ++i) |
| 858 | { |
| 859 | BufInfo& currBufInfo = m_Bufs[i]; |
| 860 | if(!currBufInfo.Used && currBufInfo.Size >= size && |
| 861 | (bestIndex == SIZE_MAX || currBufInfo.Size < m_Bufs[bestIndex].Size)) |
| 862 | { |
| 863 | bestIndex = i; |
| 864 | } |
| 865 | } |
| 866 | |
| 867 | if(bestIndex != SIZE_MAX) |
| 868 | { |
| 869 | m_Bufs[bestIndex].Used = true; |
| 870 | outBuffer = m_Bufs[bestIndex].Buffer; |
| 871 | outMappedPtr = m_Bufs[bestIndex].MappedPtr; |
| 872 | return true; |
| 873 | } |
| 874 | |
| 875 | // Allocate new buffer with requested size. |
| 876 | if(m_TotalSize + size <= MAX_TOTAL_SIZE) |
| 877 | { |
| 878 | BufInfo bufInfo; |
| 879 | bufInfo.Size = size; |
| 880 | bufInfo.Used = true; |
| 881 | |
| 882 | VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO }; |
| 883 | bufCreateInfo.size = size; |
| 884 | bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; |
| 885 | |
| 886 | VmaAllocationCreateInfo allocCreateInfo = {}; |
| 887 | allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO; |
| 888 | allocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; |
| 889 | |
| 890 | VmaAllocationInfo allocInfo; |
| 891 | VkResult res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &bufInfo.Buffer, &bufInfo.Allocation, &allocInfo); |
| 892 | bufInfo.MappedPtr = allocInfo.pMappedData; |
| 893 | TEST(res == VK_SUCCESS && bufInfo.MappedPtr); |
| 894 | |
| 895 | outBuffer = bufInfo.Buffer; |
| 896 | outMappedPtr = bufInfo.MappedPtr; |
| 897 | |
| 898 | m_Bufs.push_back(std::move(bufInfo)); |
| 899 | |
| 900 | m_TotalSize += size; |
| 901 | |
| 902 | return true; |
| 903 | } |
| 904 | |
| 905 | // There are some unused but smaller buffers: Free them and try again. |
| 906 | bool hasUnused = false; |
| 907 | for(size_t i = 0, count = m_Bufs.size(); i < count; ++i) |
| 908 | { |
no test coverage detected