diff --git a/modules/dnn/src/layers/reshape_layer.cpp b/modules/dnn/src/layers/reshape_layer.cpp index d4a2875356..3183a3f898 100644 --- a/modules/dnn/src/layers/reshape_layer.cpp +++ b/modules/dnn/src/layers/reshape_layer.cpp @@ -182,11 +182,40 @@ public: return true; } + bool forward_ocl(InputArrayOfArrays inps, OutputArrayOfArrays outs, OutputArrayOfArrays internals) + { + std::vector inputs; + std::vector outputs; + + inps.getUMatVector(inputs); + outs.getUMatVector(outputs); + + for (size_t i = 0; i < inputs.size(); i++) + { + UMat srcBlob = inputs[i]; + void *src_handle = inputs[i].handle(ACCESS_READ); + void *dst_handle = outputs[i].handle(ACCESS_WRITE); + if (src_handle != dst_handle) + { + MatShape outShape = shape(outputs[i]); + UMat umat = srcBlob.reshape(1, (int)outShape.size(), &outShape[0]); + umat.copyTo(outputs[i]); + } + } + outs.assign(outputs); + + return true; + } + void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr) { CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); + CV_OCL_RUN((preferableTarget == DNN_TARGET_OPENCL) && + OCL_PERFORMANCE_CHECK(ocl::Device::getDefault().isIntel()), + forward_ocl(inputs_arr, outputs_arr, internals_arr)) + Layer::forward_fallback(inputs_arr, outputs_arr, internals_arr); }