#endif
#ifdef HAVE_IPP
+#define IPP_DISABLE_FILTERING_INMEM_PARTIAL 1 // IW 2017u2 has bug which doesn't allow use of partial inMem with tiling
#define IPP_GAUSSIANBLUR_PARALLEL 1
#ifdef HAVE_IPP_IW
if(!ippBorder.m_borderType)
return false;
- // IW 2017u2 has bug which doesn't allow use of partial inMem with tiling
- if((((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem)) {
- return false;
- }
-
- bool ok;
- ipp_gaussianBlurParallel invoker(iwSrc, iwDst, ksize.width, (float) sigma1, ippBorder, &ok);
-
- if(!ok)
- return false;
-
- const Range range(0, (int) iwDst.m_size.height);
+ const bool disableThreading = IPP_DISABLE_FILTERING_INMEM_PARTIAL &&
+ ((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem;
const int threads = ippiSuggestThreadsNum(iwDst, 2);
- if(IPP_GAUSSIANBLUR_PARALLEL && threads > 1)
+ if(!disableThreading && IPP_GAUSSIANBLUR_PARALLEL && threads > 1) {
+ bool ok;
+ ipp_gaussianBlurParallel invoker(iwSrc, iwDst, ksize.width, (float) sigma1, ippBorder, &ok);
+
+ if(!ok)
+ return false;
+ const Range range(0, (int) iwDst.m_size.height);
parallel_for_(range, invoker, threads*4);
- else
- invoker(range);
- if(!ok)
- return false;
+ if(!ok)
+ return false;
+ } else {
+ CV_INSTRUMENT_FUN_IPP(::ipp::iwiFilterGaussian, &iwSrc, &iwDst, ksize.width, (float) sigma1, ippBorder);
+ }
}
catch (::ipp::IwException ex)
{
if(!ippBorder.m_borderType)
return false;
- // IW 2017u2 has bug which doesn't allow use of partial inMem with tiling
- if((((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem))
- return false;
-
- bool ok = true;
- int threads = ippiSuggestThreadsNum(iwDst, 2);
- Range range(0, (int)iwDst.m_size.height);
- ipp_bilateralFilterParallel invoker(iwSrc, iwDst, radius, valSquareSigma, posSquareSigma, ippBorder, &ok);
- if(!ok)
- return false;
+ const bool disableThreading = IPP_DISABLE_FILTERING_INMEM_PARTIAL &&
+ ((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem;
+ const int threads = ippiSuggestThreadsNum(iwDst, 2);
+ if(!disableThreading && IPP_BILATERAL_PARALLEL && threads > 1) {
+ bool ok = true;
+ Range range(0, (int)iwDst.m_size.height);
+ ipp_bilateralFilterParallel invoker(iwSrc, iwDst, radius, valSquareSigma, posSquareSigma, ippBorder, &ok);
+ if(!ok)
+ return false;
- if(IPP_BILATERAL_PARALLEL && threads > 1)
parallel_for_(range, invoker, threads*4);
- else
- invoker(range);
- if(!ok)
- return false;
+ if(!ok)
+ return false;
+ } else {
+ CV_INSTRUMENT_FUN_IPP(::ipp::iwiFilterBilateral, &iwSrc, &iwDst, radius, valSquareSigma, posSquareSigma, ippiFilterBilateralGauss, ippDistNormL1, ippBorder);
+ }
}
catch (::ipp::IwException)
{