From 169add5aa6264d66190cdedab5620fb965fbfdd0 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 6 Sep 2017 23:15:47 +0300 Subject: [PATCH] ocl: added cv::ocl::Device::isExtensionSupported() method --- modules/core/include/opencv2/core/ocl.hpp | 2 + modules/core/src/ocl.cpp | 46 +++++++++++++---------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 78837dc708..12814e179f 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -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; diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 309ef88919..1741d67ed4 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include // 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_DOUBLE_FP_CONFIG); hostUnifiedMemory_ = getBoolProp(CL_DEVICE_HOST_UNIFIED_MEMORY); maxComputeUnits_ = getProp(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 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