ocl: change processing of OpenCL failures
[profile/ivi/opencv.git] / modules / core / src / ocl.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