diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index b72d132d64..533d0c1aee 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -57,19 +57,29 @@ namespace cv ///////////////////////////OpenCL kernel strings/////////////////////////// extern const char *surf; - const char* noImage2dOption = "-D DISABLE_IMAGE2D"; + const char noImage2dOption [] = "-D DISABLE_IMAGE2D"; + static char SURF_OPTIONS [1024] = ""; + static bool USE_IMAGE2d = false; static void openCLExecuteKernelSURF(Context *clCxt , const char **source, string kernelName, size_t globalThreads[3], size_t localThreads[3], vector< pair > &args, int channels, int depth) { - if(support_image2d()) + char * pSURF_OPTIONS = SURF_OPTIONS; + static bool OPTION_INIT = false; + if(!OPTION_INIT) { - openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth); - } - else + if( !USE_IMAGE2d ) { - openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, noImage2dOption); + strcat(pSURF_OPTIONS, noImage2dOption); + pSURF_OPTIONS += strlen(noImage2dOption); + } + + size_t wave_size = 0; + queryDeviceInfo(DEVICE_INFO::WAVEFRONT_SIZE, &wave_size); + sprintf(pSURF_OPTIONS, " -D WAVE_SIZE=%d", static_cast(wave_size)); + OPTION_INIT = true; } + openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, SURF_OPTIONS); } } } @@ -152,8 +162,20 @@ public: integral(img, surf_.sum); if(support_image2d()) { - bindImgTex(img, imgTex); - bindImgTex(surf_.sum, sumTex); + try + { + bindImgTex(img, imgTex); + bindImgTex(surf_.sum, sumTex); + USE_IMAGE2d = true; + } + catch (const cv::Exception& e) + { + USE_IMAGE2d = false; + if(e.code != CL_IMAGE_FORMAT_NOT_SUPPORTED && e.code != -217) + { + throw e; + } + } } maskSumTex = 0; diff --git a/modules/nonfree/test/test_surf.ocl.cpp b/modules/nonfree/test/test_surf.ocl.cpp index 0d09cc8b93..9f1b3f170d 100644 --- a/modules/nonfree/test/test_surf.ocl.cpp +++ b/modules/nonfree/test/test_surf.ocl.cpp @@ -178,7 +178,7 @@ TEST_P(SURF, Detector) EXPECT_GT(matchedRatio, 0.99); } -TEST_P(SURF, DISABLED_Descriptor) +TEST_P(SURF, Descriptor) { cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 763c965e92..b5eaae6e8b 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -361,7 +361,7 @@ namespace cv { case WAVEFRONT_SIZE: { -#ifndef CL_DEVICE_WAVEFRONT_WIDTH_AMD +#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0)); #else