ocl: change processing of OpenCL failures
authorAlexander Alekhin <alexander.alekhin@itseez.com>
Wed, 5 Nov 2014 15:41:39 +0000 (18:41 +0300)
committerAlexander Alekhin <alexander.alekhin@itseez.com>
Wed, 5 Nov 2014 16:44:36 +0000 (19:44 +0300)
disable "unwanted" messages

modules/core/src/ocl.cpp
modules/ts/src/ocl_test.cpp

index 9f8489e..5e18e03 100644 (file)
@@ -1453,7 +1453,7 @@ bool useOpenCL()
     {
         try
         {
-            data->useOpenCL = (int)haveOpenCL() && Device::getDefault().ptr() != NULL;
+            data->useOpenCL = (int)haveOpenCL() && Device::getDefault().ptr() && Device::getDefault().available();
         }
         catch (...)
         {
@@ -2130,7 +2130,8 @@ const Device& Device::getDefault()
 {
     const Context& ctx = Context::getDefault();
     int idx = coreTlsData.get()->device;
-    return ctx.device(idx);
+    const Device& device = ctx.device(idx);
+    return device;
 }
 
 ////////////////////////////////////// Context ///////////////////////////////////////////////////
@@ -2210,7 +2211,10 @@ static cl_device_id selectOpenCLDevice()
     std::vector<std::string> deviceTypes;
 
     const char* configuration = getenv("OPENCV_OPENCL_DEVICE");
-    if (configuration && !parseOpenCLDeviceConfiguration(std::string(configuration), platform, deviceTypes, deviceName))
+    if (configuration &&
+            (strcmp(configuration, "disabled") == 0 ||
+             !parseOpenCLDeviceConfiguration(std::string(configuration), platform, deviceTypes, deviceName)
+            ))
         return NULL;
 
     bool isID = false;
@@ -2339,14 +2343,16 @@ static cl_device_id selectOpenCLDevice()
     }
 
 not_found:
-    std::cerr << "ERROR: Required OpenCL device not found, check configuration: " << (configuration == NULL ? "" : configuration) << std::endl
+    if (!configuration)
+        return NULL; // suppress messages on stderr
+
+    std::cerr << "ERROR: Requested OpenCL device not found, check configuration: " << (configuration == NULL ? "" : configuration) << std::endl
             << "    Platform: " << (platform.length() == 0 ? "any" : platform) << std::endl
             << "    Device types: ";
     for (size_t t = 0; t < deviceTypes.size(); t++)
         std::cerr << deviceTypes[t] << " ";
 
     std::cerr << std::endl << "    Device name: " << (deviceName.length() == 0 ? "any" : deviceName) << std::endl;
-    CV_Error(CL_INVALID_DEVICE, "Requested OpenCL device is not found");
     return NULL;
 }
 #endif
index d429d4b..270dec9 100644 (file)
@@ -128,6 +128,9 @@ void dumpOpenCLDevice()
         }
 
         const Device& device = Device::getDefault();
+        if (!device.available())
+            CV_ErrorNoReturn(CV_OpenCLInitError, "OpenCL device is not available");
+
         DUMP_MESSAGE_STDOUT("Current OpenCL device: ");
 
 #if 0