diff --git a/modules/core/src/mathfuncs.cpp b/modules/core/src/mathfuncs.cpp index 79959435d..0b596071a 100644 --- a/modules/core/src/mathfuncs.cpp +++ b/modules/core/src/mathfuncs.cpp @@ -2041,9 +2041,12 @@ static bool ocl_pow(InputArray _src, double power, OutputArray _dst) (depth == CV_64F && !doubleSupport) ) return false; + bool issqrt = std::abs(power - 0.5) < DBL_EPSILON; + const char * const op = issqrt ? "OP_SQRT" : "OP_POW"; + ocl::Kernel k("KF", ocl::core::arithm_oclsrc, - format("-D dstT=%s -D OP_POW -D UNARY_OP%s", ocl::typeToStr(CV_MAKE_TYPE(depth, 1)), - doubleSupport ? " -D DOUBLE_SUPPORT" : "")); + format("-D dstT=%s -D %s -D UNARY_OP%s", ocl::typeToStr(CV_MAKE_TYPE(depth, 1)), + op, doubleSupport ? " -D DOUBLE_SUPPORT" : "")); if (k.empty()) return false; diff --git a/modules/core/test/ocl/test_arithm.cpp b/modules/core/test/ocl/test_arithm.cpp index e14fd67f5..42fc34749 100644 --- a/modules/core/test/ocl/test_arithm.cpp +++ b/modules/core/test/ocl/test_arithm.cpp @@ -1102,6 +1102,23 @@ OCL_TEST_P(Norm, NORM_L2_2args) } } +//////////////////////////////// Sqrt //////////////////////////////////////////////// + +typedef ArithmTestBase Sqrt; + +OCL_TEST_P(Sqrt, Mat) +{ + for (int j = 0; j < test_loop_times; j++) + { + generateTestData(); + + OCL_OFF(cv::sqrt(src1_roi, dst1_roi)); + OCL_ON(cv::sqrt(usrc1_roi, udst1_roi)); + + Near(1); + } +} + //////////////////////////////////////// Instantiation ///////////////////////////////////////// OCL_INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine(::testing::Values(CV_8U, CV_8S), OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool())); @@ -1133,6 +1150,7 @@ OCL_INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(::testing::Values(CV_32F, CV_ OCL_INSTANTIATE_TEST_CASE_P(Arithm, Magnitude, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool())); OCL_INSTANTIATE_TEST_CASE_P(Arithm, Flip, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool())); OCL_INSTANTIATE_TEST_CASE_P(Arithm, Norm, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool())); +OCL_INSTANTIATE_TEST_CASE_P(Arithm, Sqrt, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool())); } } // namespace cvtest::ocl