MCPcopy Create free account
hub / github.com/alibaba/MNN / copyBufferToImage

Method copyBufferToImage

source/backend/vulkan/image/backend/VulkanBackend.cpp:491–535  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

489}
490
491void VulkanBackend::copyBufferToImage(const VulkanBuffer* buffer, const VulkanImage* image, VkImageLayout finalLayout) const {
492 std::vector<int> dimVector = image->dims();
493 const VulkanPipeline* transformPipeline = nullptr;
494 std::vector<VkDescriptorType> types{VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
495 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER};
496 int localX = 16;
497 int localY = 16;
498 int localZ = 1;
499 switch (dimVector.size()) {
500 case 1:
501 transformPipeline = getPipeline("glsl_buffer2Image1D_comp",
502 /*glsl_buffer2Image1D_comp, glsl_buffer2Image1D_comp_len,*/ types);
503 localX = 256;
504 localY = 1;
505 break;
506 case 2:
507 transformPipeline = getPipeline("glsl_buffer2Image2D_comp",
508 /*glsl_buffer2Image2D_comp, glsl_buffer2Image2D_comp_len,*/ types);
509 break;
510 case 3:
511 transformPipeline = getPipeline("glsl_buffer2Image3D_comp",
512 /*glsl_buffer2Image3D_comp, glsl_buffer2Image3D_comp_len,*/ types);
513 break;
514 default:
515 break;
516 }
517
518 std::unique_ptr<VulkanLayout::DescriptorSet> sets(transformPipeline->createSet());
519 auto constBuffer = std::make_shared<VulkanBuffer>(getMemoryPool(), false, dimVector.size() * sizeof(int),
520 dimVector.data(), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
521 sets->writeImage(image->view(), mRuntime->mSampler->get(), VK_IMAGE_LAYOUT_GENERAL, 0);
522 sets->writeBuffer(buffer->buffer(), 1, buffer->size());
523 sets->writeBuffer(constBuffer->buffer(), 2, constBuffer->size());
524
525 std::unique_ptr<VulkanCommandPool::Buffer> cmdbuffer(
526 const_cast<VulkanCommandPool::Buffer*>(mRuntime->mCmdPool->allocBuffer()));
527 cmdbuffer->begin(0);
528 image->barrierWrite(cmdbuffer->get());
529 transformPipeline->bind(cmdbuffer->get(), sets->get());
530 vkCmdDispatch(cmdbuffer->get(), UP_DIV(image->width(), localX), UP_DIV(image->height(), localY),
531 UP_DIV(image->depth(), localZ));
532 image->barrierRead(cmdbuffer->get());
533 cmdbuffer->end();
534 mRuntime->mCmdPool->submitAndWait(cmdbuffer->get());
535}
536
537float VulkanBackend::getPipelineTime(const VulkanPipeline* pipeline, std::shared_ptr<VulkanLayout::DescriptorSet> des, std::vector<uint32_t> groupSize) {
538 std::shared_ptr<VulkanCommandPool::Buffer> cmd;

Callers 9

VulkanPreluMethod · 0.80
_initMethod · 0.80
onEncodeConvolutionMethod · 0.80
createKernelMethod · 0.80
VulkanDeconvolutionMethod · 0.80
VulkanConvolution1x1Method · 0.80

Calls 15

createSetMethod · 0.80
writeImageMethod · 0.80
viewMethod · 0.80
writeBufferMethod · 0.80
barrierWriteMethod · 0.80
depthMethod · 0.80
barrierReadMethod · 0.80
submitAndWaitMethod · 0.80
dimsMethod · 0.45
sizeMethod · 0.45
dataMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected