| 64 | } |
| 65 | |
| 66 | void VulkanRaster::onEncodeFast(const Tensor* input, const Tensor* output, const VulkanCommandPool::Buffer *cmdBuffer, bool zero) { |
| 67 | auto des = TensorUtils::getDescribe(input); |
| 68 | auto vkBn = static_cast<VulkanBackend*>(backend()); |
| 69 | auto dstTensor = vkBn->getTensorBuffer(output); |
| 70 | auto dstTensorSize = vkBn->getTensorSize(output); |
| 71 | if (zero) { |
| 72 | vkCmdFillBuffer(cmdBuffer->get(), dstTensor.first->buffer(), dstTensor.second, dstTensorSize, 0); |
| 73 | cmdBuffer->barrierSource(dstTensor.first->buffer(), dstTensor.second, dstTensorSize, VulkanCommandPool::Buffer::WRITE_WRITE); |
| 74 | } |
| 75 | |
| 76 | std::string pKey = "glsl_blit_C4_"; |
| 77 | if (output->getType().code == halide_type_float && vkBn->useFP16()) { |
| 78 | pKey += "FP16_"; |
| 79 | } |
| 80 | pKey += "comp"; |
| 81 | auto blitPipeline = vkBn->getPipeline(pKey, { |
| 82 | VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| 83 | VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| 84 | VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER |
| 85 | }); |
| 86 | |
| 87 | for (int i=0; i< des->regions.size(); ++i) { |
| 88 | auto& slice = des->regions[i]; |
| 89 | Tensor::InsideDescribe::Region newRegion; |
| 90 | OpCommonUtils::turnToPackRegion(slice, newRegion, output, 4, true); |
| 91 | // TODO: Find better way |
| 92 | newRegion.dst.offset /= 4; |
| 93 | newRegion.src.offset /= 4; |
| 94 | SamplerInfo info; |
| 95 | writeSamplerInfo(info, newRegion); |
| 96 | auto total = info.size[0] * info.size[1] * info.size[2]; |
| 97 | auto group = UP_DIV(total, 256); |
| 98 | std::shared_ptr<VulkanLayout::DescriptorSet> describe(blitPipeline->createSet()); |
| 99 | std::shared_ptr<VulkanBuffer> uniform = vkBn->allocUniform(); |
| 100 | ::memcpy(uniform->map(), &info, sizeof(SamplerInfo)); |
| 101 | uniform->unmap(); |
| 102 | auto srcTensor = vkBn->getTensorBuffer(slice.origin); |
| 103 | auto srcTensorSize = vkBn->getTensorSize(slice.origin); |
| 104 | describe->writeBuffer(dstTensor.first->buffer(), 0, dstTensorSize, dstTensor.second); |
| 105 | describe->writeBuffer(srcTensor.first->buffer(), 1, srcTensorSize, srcTensor.second); |
| 106 | describe->writeBuffer(uniform->buffer(), 2, uniform->size()); |
| 107 | cmdBuffer->barrierSource(srcTensor.first->buffer(), srcTensor.second, srcTensorSize); |
| 108 | blitPipeline->bind(cmdBuffer->get(), describe->get()); |
| 109 | vkCmdDispatch(cmdBuffer->get(), group, 1, 1); |
| 110 | mExtraUniform.emplace_back(uniform); |
| 111 | mExtraDescribes.emplace_back(describe); |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | |
| 116 | ErrorCode VulkanRaster::onEncode(const std::vector<Tensor *> &____inputs, const std::vector<Tensor *> &outputs, |
nothing calls this directly
no test coverage detected