MCPcopy Create free account
hub / github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator / AcquireBuffer

Method AcquireBuffer

src/Tests.cpp:851–931  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

849}
850
851bool 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 {

Callers 2

UploadGpuDataFunction · 0.80
ValidateGpuDataFunction · 0.80

Calls 7

vmaCreateBufferFunction · 0.85
TESTEnum · 0.85
vmaDestroyBufferFunction · 0.85
eraseMethod · 0.80
sizeMethod · 0.45
push_backMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected