in RenderScriptMigrationSample/app/src/main/cpp/VulkanContext.cpp [251:280]
bool VulkanContext::createBuffer(size_t size, VkFlags bufferUsage, VkFlags memoryProperties,
VkBuffer* buffer, VkDeviceMemory* memory) const {
if (buffer == nullptr || memory == nullptr) return false;
// Create VkBuffer
const VkBufferCreateInfo bufferCreateInfo = {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.size = size,
.usage = bufferUsage,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
};
CALL_VK(vkCreateBuffer, mDevice.handle(), &bufferCreateInfo, nullptr, buffer);
// Allocate memory for the buffer
VkMemoryRequirements memoryRequirements;
vkGetBufferMemoryRequirements(mDevice.handle(), *buffer, &memoryRequirements);
const auto memoryTypeIndex =
findMemoryType(memoryRequirements.memoryTypeBits, memoryProperties);
RET_CHECK(memoryTypeIndex.has_value());
const VkMemoryAllocateInfo allocateInfo = {
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.pNext = nullptr,
.allocationSize = memoryRequirements.size,
.memoryTypeIndex = memoryTypeIndex.value(),
};
CALL_VK(vkAllocateMemory, mDevice.handle(), &allocateInfo, nullptr, memory);
vkBindBufferMemory(mDevice.handle(), *buffer, *memory, 0);
return true;
}