From 400ded6619f3a72ba88e2baf0b14aec0af2d5ca1 Mon Sep 17 00:00:00 2001 From: Madan mohan Manokar Date: Wed, 26 Aug 2026 11:34:38 +0530 Subject: [PATCH] Enable GaussianBlur OpenCL fast paths on non-Intel GPUs. Remove Intel-only gates from dedicated 3x3/5x5 GaussianBlur kernels and single-pass separable filter paths so AMD and other OpenCL devices can use the same optimized implementations with existing fallbacks. --- modules/imgproc/src/filter.dispatch.cpp | 8 ++------ modules/imgproc/src/smooth.dispatch.cpp | 3 +-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/modules/imgproc/src/filter.dispatch.cpp b/modules/imgproc/src/filter.dispatch.cpp index ff46540b3f..ddad89b0e0 100644 --- a/modules/imgproc/src/filter.dispatch.cpp +++ b/modules/imgproc/src/filter.dispatch.cpp @@ -946,7 +946,6 @@ bool ocl_sepFilter2D( double delta, int borderType ) { - const ocl::Device & d = ocl::Device::getDefault(); Size imgSize = _src.size(); int type = _src.type(), sdepth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type); @@ -1008,8 +1007,7 @@ bool ocl_sepFilter2D( imgSize.width > optimizedSepFilterLocalWidth + anchor.x && imgSize.height > optimizedSepFilterLocalHeight + anchor.y && (!(borderType & BORDER_ISOLATED) || _src.offset() == 0) && - anchor == Point(kernelX.cols >> 1, kernelY.cols >> 1) && - OCL_PERFORMANCE_CHECK(d.isIntel()), // TODO FIXIT + anchor == Point(kernelX.cols >> 1, kernelY.cols >> 1), ocl_sepFilter2D_SinglePass( _src, _dst, kernelX, kernelY, delta, borderType & ~BORDER_ISOLATED, ddepth, @@ -1052,7 +1050,6 @@ bool ocl_sepFilter2D_BitExact( int shift_bits ) { - const ocl::Device & d = ocl::Device::getDefault(); Size imgSize = _src.size(); int type = _src.type(), sdepth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type); @@ -1082,8 +1079,7 @@ bool ocl_sepFilter2D_BitExact( imgSize.width > optimizedSepFilterLocalWidth + anchor.x && imgSize.height > optimizedSepFilterLocalHeight + anchor.y && (!(borderType & BORDER_ISOLATED) || _src.offset() == 0) && - anchor == Point(kernelX.cols >> 1, kernelY.cols >> 1) && - OCL_PERFORMANCE_CHECK(d.isIntel()), // TODO FIXIT + anchor == Point(kernelX.cols >> 1, kernelY.cols >> 1), ocl_sepFilter2D_SinglePass( _src, _dst, kernelX, kernelY, delta, borderType & ~BORDER_ISOLATED, ddepth, bdepth, diff --git a/modules/imgproc/src/smooth.dispatch.cpp b/modules/imgproc/src/smooth.dispatch.cpp index f7373f362d..2511620b4f 100644 --- a/modules/imgproc/src/smooth.dispatch.cpp +++ b/modules/imgproc/src/smooth.dispatch.cpp @@ -318,10 +318,9 @@ Ptr createGaussianFilter( int type, Size ksize, static bool ocl_GaussianBlur_8UC1(InputArray _src, OutputArray _dst, Size ksize, int ddepth, InputArray _kernelX, InputArray _kernelY, int borderType) { - const ocl::Device & dev = ocl::Device::getDefault(); int type = _src.type(), sdepth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type); - if ( !(dev.isIntel() && (type == CV_8UC1) && + if ( !(type == CV_8UC1 && (_src.offset() == 0) && (_src.step() % 4 == 0) && ((ksize.width == 5 && (_src.cols() % 4 == 0)) || (ksize.width == 3 && (_src.cols() % 16 == 0) && (_src.rows() % 2 == 0)))) )