| 210 | |
| 211 | template <typename ctype, typename mtype> |
| 212 | void WarpPerspectiveImpl::kern_fallback(const KernParam<ctype, mtype>& kern_param) { |
| 213 | UNPACK_WARP_PERSPECTIVE_FWD_KERN_PARAM(kern_param); |
| 214 | |
| 215 | // cause error if accidentally used |
| 216 | sptr = nullptr; |
| 217 | mptr = nullptr; |
| 218 | dptr = nullptr; |
| 219 | MEGDNN_MARK_USED_VAR(sptr); |
| 220 | MEGDNN_MARK_USED_VAR(mptr); |
| 221 | MEGDNN_MARK_USED_VAR(dptr); |
| 222 | MEGDNN_MARK_USED_VAR(border_val); |
| 223 | |
| 224 | KernParam<ctype, mtype> sub_param = kern_param; |
| 225 | sub_param.n_src = 1; |
| 226 | sub_param.n_mat = 1; |
| 227 | sub_param.midx_ptr = RefPtr(); |
| 228 | sub_param.src_ptr = RefPtr(kern_param.src_ptr.get_ptr()); |
| 229 | sub_param.mat_ptr = RefPtr(kern_param.mat_ptr.get_ptr()); |
| 230 | sub_param.dst_ptr = RefPtr(kern_param.dst_ptr.get_ptr()); |
| 231 | rep(n, N_MAT) { |
| 232 | if (midx_ptr) { |
| 233 | size_t idx = midx_ptr[n]; |
| 234 | megdnn_assert( |
| 235 | idx < N_SRC, "mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", |
| 236 | n, idx, N_SRC); |
| 237 | sub_param.src_ptr.reset( |
| 238 | static_cast<ctype*>(kern_param.src_ptr.get_ptr()) + |
| 239 | idx * (C * IH * IW)); |
| 240 | } else if (n) { |
| 241 | sub_param.src_ptr.reset( |
| 242 | static_cast<ctype*>(kern_param.src_ptr.get_ptr()) + |
| 243 | n * C * IH * IW); |
| 244 | } |
| 245 | if (is_resize_optimizable(static_cast<mtype*>(sub_param.mat_ptr.get_ptr()))) { |
| 246 | if (bmode == BorderMode::CONSTANT) { |
| 247 | MIDOUT_BEGIN( |
| 248 | megdnn_fallback_warpperspective, midout_iv(1), midout_iv(true), |
| 249 | ctype, mtype) { |
| 250 | kern_resize<true, ctype, mtype>(sub_param); |
| 251 | } |
| 252 | MIDOUT_END(); |
| 253 | } else { |
| 254 | MIDOUT_BEGIN( |
| 255 | megdnn_fallback_warpperspective, midout_iv(1), midout_iv(false), |
| 256 | ctype, mtype) { |
| 257 | kern_resize<false, ctype, mtype>(sub_param); |
| 258 | } |
| 259 | MIDOUT_END(); |
| 260 | } |
| 261 | } else { |
| 262 | MIDOUT_BEGIN(megdnn_fallback_warpperspective, midout_iv(2), ctype, mtype) { |
| 263 | rep(oh, OH) kern_naive<ctype, mtype>(sub_param, oh); |
| 264 | } |
| 265 | MIDOUT_END(); |
| 266 | } |
| 267 | sub_param.mat_ptr += 3 * 3 * sizeof(mtype); |
| 268 | sub_param.dst_ptr += C * OH * OW * sizeof(ctype); |
| 269 | } |