diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index 508fb3f127..6839294a2a 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -59,32 +59,28 @@ namespace cv const char noImage2dOption [] = "-D DISABLE_IMAGE2D"; - static char SURF_OPTIONS [1024] = ""; - static bool USE_IMAGE2d = false; + static bool use_image2d = false; + static void openCLExecuteKernelSURF(Context *clCxt , const char **source, String kernelName, size_t globalThreads[3], size_t localThreads[3], std::vector< std::pair > &args, int channels, int depth) { - char * pSURF_OPTIONS = SURF_OPTIONS; - static bool OPTION_INIT = false; - if(!OPTION_INIT) + char optBuf [100] = {0}; + char * optBufPtr = optBuf; + if( !use_image2d ) { - if( !USE_IMAGE2d ) - { - strcat(pSURF_OPTIONS, noImage2dOption); - pSURF_OPTIONS += strlen(noImage2dOption); - } - - size_t wave_size = 0; - queryDeviceInfo(WAVEFRONT_SIZE, &wave_size); - std::sprintf(pSURF_OPTIONS, "-D WAVE_SIZE=%d", static_cast(wave_size)); - OPTION_INIT = true; + strcat(optBufPtr, noImage2dOption); + optBufPtr += strlen(noImage2dOption); } - openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, SURF_OPTIONS); + cl_kernel kernel; + kernel = openCLGetKernelFromSource(clCxt, source, kernelName, optBufPtr); + size_t wave_size = queryDeviceInfo(kernel); + CV_Assert(clReleaseKernel(kernel) == CL_SUCCESS); + sprintf(optBufPtr, "-D WAVE_SIZE=%d", static_cast(wave_size)); + openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, optBufPtr); } } } - static inline size_t divUp(size_t total, size_t grain) { return (total + grain - 1) / grain; @@ -166,11 +162,11 @@ public: { bindImgTex(img, imgTex); bindImgTex(surf_.sum, sumTex); - USE_IMAGE2d = true; + use_image2d = true; } catch (const cv::Exception& e) { - USE_IMAGE2d = false; + use_image2d = false; if(e.code != CL_IMAGE_FORMAT_NOT_SUPPORTED && e.code != -217) { throw e; diff --git a/modules/ocl/include/opencv2/ocl/private/util.hpp b/modules/ocl/include/opencv2/ocl/private/util.hpp index 76d3faf5da..2463fc279c 100644 --- a/modules/ocl/include/opencv2/ocl/private/util.hpp +++ b/modules/ocl/include/opencv2/ocl/private/util.hpp @@ -128,7 +128,7 @@ namespace cv enum DEVICE_INFO { WAVEFRONT_SIZE, - IS_CPU_DEVICE //supports + IS_CPU_DEVICE }; template _ty queryDeviceInfo(cl_kernel kernel = NULL);