| 147 | |
| 148 | template <typename ctype, typename mtype> |
| 149 | void WarpPerspectiveImpl::kern_fallback_multi_src( |
| 150 | const KernParam<ctype, mtype>& kern_param) { |
| 151 | UNPACK_WARP_PERSPECTIVE_FWD_KERN_PARAM(kern_param); |
| 152 | // cause error if accidentally used |
| 153 | sptr = nullptr; |
| 154 | mptr = nullptr; |
| 155 | dptr = nullptr; |
| 156 | MEGDNN_MARK_USED_VAR(sptr); |
| 157 | MEGDNN_MARK_USED_VAR(mptr); |
| 158 | MEGDNN_MARK_USED_VAR(dptr); |
| 159 | MEGDNN_MARK_USED_VAR(border_val); |
| 160 | |
| 161 | MEGDNN_MARK_USED_VAR(IH); |
| 162 | MEGDNN_MARK_USED_VAR(IW); |
| 163 | KernParam<ctype, mtype> sub_param = kern_param; |
| 164 | sub_param.n_src = 1; |
| 165 | sub_param.n_mat = 1; |
| 166 | sub_param.midx_ptr = RefPtr(); |
| 167 | sub_param.src_ptr = RefPtr(kern_param.srcs_ptr.front().get_ptr()); |
| 168 | sub_param.mat_ptr = RefPtr(kern_param.mat_ptr.get_ptr()); |
| 169 | sub_param.dst_ptr = RefPtr(kern_param.dst_ptr.get_ptr()); |
| 170 | sub_param.srcs_ptr = kern_param.srcs_ptr; |
| 171 | |
| 172 | rep(n, N_MAT) { |
| 173 | if (midx_ptr) { |
| 174 | size_t idx = midx_ptr[n]; |
| 175 | megdnn_assert( |
| 176 | idx < N_SRC, "mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", |
| 177 | n, idx, N_SRC); |
| 178 | sub_param.src_ptr.reset( |
| 179 | static_cast<ctype*>(kern_param.srcs_ptr[idx].get_ptr())); |
| 180 | } else if (n) { |
| 181 | sub_param.src_ptr.reset( |
| 182 | static_cast<ctype*>(kern_param.srcs_ptr[n].get_ptr())); |
| 183 | } |
| 184 | if (is_resize_optimizable(static_cast<mtype*>(sub_param.mat_ptr.get_ptr()))) { |
| 185 | if (bmode == BorderMode::CONSTANT) { |
| 186 | MIDOUT_BEGIN( |
| 187 | megdnn_fallback_warpperspective, midout_iv(1), midout_iv(true), |
| 188 | ctype, mtype) { |
| 189 | kern_resize<true, ctype, mtype>(sub_param); |
| 190 | } |
| 191 | MIDOUT_END(); |
| 192 | } else { |
| 193 | MIDOUT_BEGIN( |
| 194 | megdnn_fallback_warpperspective, midout_iv(1), midout_iv(false), |
| 195 | ctype, mtype) { |
| 196 | kern_resize<false, ctype, mtype>(sub_param); |
| 197 | } |
| 198 | MIDOUT_END(); |
| 199 | } |
| 200 | } else { |
| 201 | MIDOUT_BEGIN(megdnn_fallback_warpperspective, midout_iv(2), ctype, mtype) { |
| 202 | rep(oh, OH) kern_naive<ctype, mtype>(sub_param, oh); |
| 203 | } |
| 204 | MIDOUT_END(); |
| 205 | } |
| 206 | sub_param.mat_ptr += 3 * 3 * sizeof(mtype); |