| 489 | } |
| 490 | |
| 491 | void 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 | |
| 537 | float VulkanBackend::getPipelineTime(const VulkanPipeline* pipeline, std::shared_ptr<VulkanLayout::DescriptorSet> des, std::vector<uint32_t> groupSize) { |
| 538 | std::shared_ptr<VulkanCommandPool::Buffer> cmd; |
no test coverage detected