| 11 | namespace MNN { |
| 12 | |
| 13 | VulkanBuffer::VulkanBuffer(const VulkanMemoryPool& pool, bool separate, size_t size, const void* hostData, |
| 14 | VkBufferUsageFlags usage, VkSharingMode shared, VkFlags requirements_mask) |
| 15 | : mPool(pool) { |
| 16 | MNN_ASSERT(size > 0); |
| 17 | mSize = size; |
| 18 | mShared = shared; |
| 19 | mBuffer = const_cast<VulkanMemoryPool&>(mPool).allocBuffer(size, usage, shared); |
| 20 | mUsage = usage; |
| 21 | |
| 22 | VkMemoryRequirements memReq; |
| 23 | mPool.device().getBufferMemoryRequirements(mBuffer, memReq); |
| 24 | mMemory = const_cast<VulkanMemoryPool&>(mPool).allocMemory(memReq, requirements_mask, separate); |
| 25 | // FUNC_PRINT(mMemory->type()); |
| 26 | auto realMem = (VulkanMemory*)mMemory.first; |
| 27 | |
| 28 | if (nullptr != hostData) { |
| 29 | void* data = nullptr; |
| 30 | CALL_VK(mPool.device().mapMemory(realMem->get(), mMemory.second, size, 0 /*flag, not used*/, &data)); |
| 31 | ::memcpy(data, hostData, size); |
| 32 | mPool.device().unmapMemory(realMem->get()); |
| 33 | } |
| 34 | CALL_VK(mPool.device().bindBufferMemory(mBuffer, realMem->get(), mMemory.second)); |
| 35 | } |
| 36 | |
| 37 | VulkanBuffer::~VulkanBuffer() { |
| 38 | const_cast<VulkanMemoryPool&>(mPool).returnBuffer(mBuffer, mSize, mUsage, mShared); |
nothing calls this directly
no test coverage detected