ocl: added cv::ocl::Device::isExtensionSupported() method
authorAlexander Alekhin <alexander.alekhin@intel.com>
Wed, 6 Sep 2017 20:15:47 +0000 (23:15 +0300)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sun, 10 Sep 2017 20:32:30 +0000 (20:32 +0000)
modules/core/include/opencv2/core/ocl.hpp
modules/core/src/ocl.cpp

index 78837dc..12814e1 100644 (file)
@@ -91,6 +91,7 @@ public:
 
     String name() const;
     String extensions() const;
+    bool isExtensionSupported(const String& extensionName) const;
     String version() const;
     String vendorName() const;
     String OpenCL_C_Version() const;
@@ -160,6 +161,7 @@ public:
     uint imagePitchAlignment() const;
     uint imageBaseAddressAlignment() const;
 
+    /// deprecated, use isExtensionSupported() method (probably with "cl_khr_subgroups" value)
     bool intelSubgroupsSupport() const;
 
     size_t image2DMaxWidth() const;
index 309ef88..1741d67 100644 (file)
@@ -43,6 +43,7 @@
 #include <list>
 #include <map>
 #include <deque>
+#include <set>
 #include <string>
 #include <sstream>
 #include <iostream> // std::cerr
@@ -518,6 +519,7 @@ struct Device::Impl
 
         name_ = getStrProp(CL_DEVICE_NAME);
         version_ = getStrProp(CL_DEVICE_VERSION);
+        extensions_ = getStrProp(CL_DEVICE_EXTENSIONS);
         doubleFPConfig_ = getProp<cl_device_fp_config, int>(CL_DEVICE_DOUBLE_FP_CONFIG);
         hostUnifiedMemory_ = getBoolProp(CL_DEVICE_HOST_UNIFIED_MEMORY);
         maxComputeUnits_ = getProp<cl_uint, int>(CL_DEVICE_MAX_COMPUTE_UNITS);
@@ -528,6 +530,20 @@ struct Device::Impl
         String deviceVersion_ = getStrProp(CL_DEVICE_VERSION);
         parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_);
 
+        size_t pos = 0;
+        while (pos < extensions_.size())
+        {
+            size_t pos2 = extensions_.find(' ', pos);
+            if (pos2 == String::npos)
+                pos2 = extensions_.size();
+            if (pos2 > pos)
+            {
+                std::string extensionName = extensions_.substr(pos, pos2 - pos);
+                extensions_set_.insert(extensionName);
+            }
+            pos = pos2 + 1;
+        }
+
         intelSubgroupsSupport_ = isExtensionSupported("cl_intel_subgroups");
 
         vendorName_ = getStrProp(CL_DEVICE_VENDOR);
@@ -569,23 +585,19 @@ struct Device::Impl
             sz < sizeof(buf) ? String(buf) : String();
     }
 
-    bool isExtensionSupported(const String& extensionName) const
+    bool isExtensionSupported(const std::string& extensionName) const
     {
-        bool ret = false;
-        size_t pos = getStrProp(CL_DEVICE_EXTENSIONS).find(extensionName);
-        if (pos != String::npos)
-        {
-            ret = true;
-        }
-        return ret;
+        return extensions_set_.count(extensionName) > 0;
     }
 
 
     IMPLEMENT_REFCOUNTABLE();
+
     cl_device_id handle;
 
     String name_;
     String version_;
+    std::string extensions_;
     int doubleFPConfig_;
     bool hostUnifiedMemory_;
     int maxComputeUnits_;
@@ -597,6 +609,8 @@ struct Device::Impl
     String vendorName_;
     int vendorID_;
     bool intelSubgroupsSupport_;
+
+    std::set<std::string> extensions_set_;
 };
 
 
@@ -651,7 +665,10 @@ String Device::name() const
 { return p ? p->name_ : String(); }
 
 String Device::extensions() const
-{ return p ? p->getStrProp(CL_DEVICE_EXTENSIONS) : String(); }
+{ return p ? String(p->extensions_) : String(); }
+
+bool Device::isExtensionSupported(const String& extensionName) const
+{ return p ? p->isExtensionSupported(extensionName) : false; }
 
 String Device::version() const
 { return p ? p->version_ : String(); }
@@ -744,16 +761,7 @@ bool Device::imageSupport() const
 
 bool Device::imageFromBufferSupport() const
 {
-    bool ret = false;
-    if (p)
-    {
-        size_t pos = p->getStrProp(CL_DEVICE_EXTENSIONS).find("cl_khr_image2d_from_buffer");
-        if (pos != String::npos)
-        {
-            ret = true;
-        }
-    }
-    return ret;
+    return p ? p->isExtensionSupported("cl_khr_image2d_from_buffer") : false;
 }
 
 uint Device::imagePitchAlignment() const