Pass warp size into SURF
authorpeng xiao <hisenxpress@gmail.com>
Tue, 26 Mar 2013 07:48:15 +0000 (15:48 +0800)
committerpeng xiao <hisenxpress@gmail.com>
Tue, 26 Mar 2013 07:48:15 +0000 (15:48 +0800)
modules/nonfree/src/surf.ocl.cpp
modules/nonfree/test/test_surf.ocl.cpp
modules/ocl/src/initialization.cpp

index b72d132..533d0c1 100644 (file)
@@ -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<size_t, const void *> > &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<int>(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;
index 0d09cc8..9f1b3f1 100644 (file)
@@ -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());
index 763c965..b5eaae6 100644 (file)
@@ -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