diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index c6b0cf2d0..f7fae9e4e 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -87,7 +87,7 @@ public: String name() const; String extensions() const; String version() const; - String vendor() const; + String vendorName() const; String OpenCL_C_Version() const; String OpenCLVersion() const; int deviceVersionMajor() const; @@ -161,6 +161,17 @@ public: size_t imageMaxBufferSize() const; size_t imageMaxArraySize() const; + enum + { + UNKNOWN_VENDOR=0, + VENDOR_AMD=1, + VENDOR_INTEL=2, + VENDOR_NVIDIA=3 + }; + int vendorID() const; + inline bool isAMD() const { return vendorID() == VENDOR_AMD; }; + inline bool isIntel() const { return vendorID() == VENDOR_INTEL; }; + int maxClockFrequency() const; int maxComputeUnits() const; int maxConstantArgs() const; diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 9c92b8381..1cbbc2ac4 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1712,6 +1712,17 @@ struct Device::Impl String deviceVersion_ = getStrProp(CL_DEVICE_VERSION); parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_); + + vendorName_ = getStrProp(CL_DEVICE_VENDOR); + if (vendorName_ == "Advanced Micro Devices, Inc." || + vendorName_ == "AMD") + vendorID_ = VENDOR_AMD; + else if (vendorName_ == "Intel(R) Corporation") + vendorID_ = VENDOR_INTEL; + else if (vendorName_ == "NVIDIA Corporation") + vendorID_ = VENDOR_NVIDIA; + else + vendorID_ = UNKNOWN_VENDOR; } template @@ -1754,6 +1765,8 @@ struct Device::Impl int deviceVersionMajor_; int deviceVersionMinor_; String driverVersion_; + String vendorName_; + int vendorID_; }; @@ -1813,8 +1826,11 @@ String Device::extensions() const String Device::version() const { return p ? p->version_ : String(); } -String Device::vendor() const -{ return p ? p->getStrProp(CL_DEVICE_VENDOR) : String(); } +String Device::vendorName() const +{ return p ? p->vendorName_ : String(); } + +int Device::vendorID() const +{ return p ? p->vendorID_ : 0; } String Device::OpenCL_C_Version() const { return p ? p->getStrProp(CL_DEVICE_OPENCL_C_VERSION) : String(); } @@ -3009,6 +3025,12 @@ struct Program::Impl for( i = 0; i < n; i++ ) deviceList[i] = ctx.device(i).ptr(); + Device device = Device::getDefault(); + if (device.isAMD()) + buildflags += " -D AMD_DEVICE"; + else if (device.isIntel()) + buildflags += " -D INTEL_DEVICE"; + retval = clBuildProgram(handle, n, (const cl_device_id*)deviceList, buildflags.c_str(), 0, 0); diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index bb187cd61..3f0e6e38c 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -583,9 +583,7 @@ bool HaarEvaluator::read(const FileNode& node, Size _origWinSize) localSize = lbufSize = Size(0, 0); if (ocl::haveOpenCL()) { - String vname = ocl::Device::getDefault().vendor(); - if (vname == "Advanced Micro Devices, Inc." || - vname == "AMD") + if (ocl::Device::getDefault().isAMD()) { localSize = Size(8, 8); lbufSize = Size(origWinSize.width + localSize.width, @@ -769,9 +767,7 @@ bool LBPEvaluator::read( const FileNode& node, Size _origWinSize ) if (ocl::haveOpenCL()) { const ocl::Device& device = ocl::Device::getDefault(); - String vname = device.vendor(); - if ((vname == "Advanced Micro Devices, Inc." || - vname == "AMD") && !device.hostUnifiedMemory()) + if (device.isAMD() && !device.hostUnifiedMemory()) localSize = Size(8, 8); } return true;