From f90e41d54e12d92ac7f9c0f2cf665b30260b213b Mon Sep 17 00:00:00 2001
From: Konstantin Matskevich <konstantin.matskevich@itseez.com>
Date: Wed, 22 Jan 2014 10:08:42 +0400
Subject: [PATCH 1/3] dumpinfo

---
 modules/core/include/opencv2/core/ocl.hpp |  21 +++++
 modules/core/src/ocl.cpp                  | 107 ++++++++++++++++++++++
 modules/ts/include/opencv2/ts/ts_perf.hpp |  10 ++
 modules/ts/src/ocl_test.cpp               |  26 ++----
 4 files changed, 148 insertions(+), 16 deletions(-)

diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp
index fb9f0282b..5d339a488 100644
--- a/modules/core/include/opencv2/core/ocl.hpp
+++ b/modules/core/include/opencv2/core/ocl.hpp
@@ -59,6 +59,7 @@ class CV_EXPORTS Kernel;
 class CV_EXPORTS Program;
 class CV_EXPORTS ProgramSource2;
 class CV_EXPORTS Queue;
+class CV_EXPORTS PlatformInform;
 
 class CV_EXPORTS Device
 {
@@ -84,6 +85,7 @@ public:
 
     String name() const;
     String extensions() const;
+    String version() const;
     String vendor() const;
     String OpenCL_C_Version() const;
     String OpenCLVersion() const;
@@ -549,9 +551,28 @@ protected:
     Impl* p;
 };
 
+class CV_EXPORTS PlatformInform
+{
+public:
+    PlatformInform();
+    explicit PlatformInform(void* id);
+    ~PlatformInform();
+
+    String name() const;
+    String vendor() const;
+    String version() const;
+    int deviceNumber() const;
+    void getDevice(Device& device, int d) const;
+
+protected:
+    struct Impl;
+    Impl* p;
+};
+
 CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf);
 CV_EXPORTS const char* typeToStr(int t);
 CV_EXPORTS const char* memopTypeToStr(int t);
+CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInform>& platform_info);
 
 }}
 
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index e2f4d2c4b..c4859544d 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -1693,6 +1693,9 @@ String Device::name() const
 String Device::extensions() const
 { return p ? p->getStrProp(CL_DEVICE_EXTENSIONS) : String(); }
 
+String Device::version() const
+{ return p ? p->getStrProp(CL_DEVICE_VERSION) : String(); }
+
 String Device::vendor() const
 { return p ? p->getStrProp(CL_DEVICE_VENDOR) : String(); }
 
@@ -3621,6 +3624,110 @@ MatAllocator* getOpenCLAllocator()
     return &allocator;
 }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void getDevices(std::vector<cl_device_id>& devices,cl_platform_id& platform)
+{
+    cl_int status = CL_SUCCESS;
+    cl_uint numDevices = 0;
+    status = clGetDeviceIDs(platform, (cl_device_type)Device::TYPE_ALL, 0, NULL, &numDevices);
+    CV_Assert(status == CL_SUCCESS);
+    if (numDevices == 0)
+        return;
+    devices.resize((size_t)numDevices);
+    status = clGetDeviceIDs(platform, (cl_device_type)Device::TYPE_ALL, numDevices, &devices[0], &numDevices);
+    CV_Assert(status == CL_SUCCESS);
+    devices.resize(numDevices);
+}
+
+struct PlatformInform::Impl
+{
+    Impl(void* id)
+    {
+        handle = *(cl_platform_id*)id;
+        getDevices(devices, handle);
+    }
+
+    String getStrProp(cl_device_info prop) const
+    {
+        char buf[1024];
+        size_t sz=0;
+        return clGetPlatformInfo(handle, prop, sizeof(buf)-16, buf, &sz) >= 0 &&
+            sz < sizeof(buf) ? String(buf) : String();
+    }
+
+    IMPLEMENT_REFCOUNTABLE();
+    std::vector<cl_device_id> devices;
+    cl_platform_id handle;
+};
+
+PlatformInform::PlatformInform()
+{
+    p = 0;
+}
+
+PlatformInform::PlatformInform(void* platform_id)
+{
+    p = new Impl(platform_id);
+}
+
+PlatformInform::~PlatformInform()
+{
+    if(p)
+        p->release();
+}
+
+int PlatformInform::deviceNumber() const
+{
+    return p ? (int)p->devices.size() : 0;
+}
+
+void PlatformInform::getDevice(Device& device, int d) const
+{
+    CV_Assert(d < (int)p->devices.size() );
+    if(p)
+        device.set(p->devices[d]);
+}
+
+String PlatformInform::name() const
+{
+    return p ? p->getStrProp(CL_PLATFORM_NAME) : String();
+}
+
+String PlatformInform::vendor() const
+{
+    return p ? p->getStrProp(CL_PLATFORM_VENDOR) : String();
+}
+
+String PlatformInform::version() const
+{
+    return p ? p->getStrProp(CL_PLATFORM_VERSION) : String();
+}
+
+static void getPlatforms(std::vector<cl_platform_id>& platforms)
+{
+    cl_int status = CL_SUCCESS;
+    cl_uint numPlatforms = 0;
+    status = clGetPlatformIDs(0, NULL, &numPlatforms);
+    CV_Assert(status == CL_SUCCESS);
+    if (numPlatforms == 0)
+        return;
+    platforms.resize((size_t)numPlatforms);
+    status = clGetPlatformIDs(numPlatforms, &platforms[0], &numPlatforms);
+    CV_Assert(status == CL_SUCCESS);
+    platforms.resize(numPlatforms);
+}
+
+void getPlatfomsInfo(std::vector<PlatformInform>& platformsInfo)
+{
+    std::vector<cl_platform_id> platforms;
+    getPlatforms(platforms);
+    for (size_t i = 0; i < platforms.size(); i++)
+    {
+        platformsInfo.push_back( PlatformInform((void*)&platforms[i]) );
+    }
+}
+
 const char* typeToStr(int t)
 {
     static const char* tab[]=
diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp
index de674b7f3..bd3156930 100644
--- a/modules/ts/include/opencv2/ts/ts_perf.hpp
+++ b/modules/ts/include/opencv2/ts/ts_perf.hpp
@@ -509,6 +509,15 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os);
 #endif
 #endif
 
+#if defined(HAVE_OPENCL) && !defined(CV_BUILD_OCL_MODULE)
+namespace cvtest { namespace ocl {
+void dumpOpenCLDevice();
+}}
+#define TEST_DUMP_OCL_INFO cvtest::ocl::dumpOpenCLDevice();
+#else
+#define TEST_DUMP_OCL_INFO
+#endif
+
 #define CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, ...)	\
     ::perf::Regression::Init(#modulename); \
     ::perf::TestBase::Init(std::vector<std::string>(impls, impls + sizeof impls / sizeof *impls), \
@@ -518,6 +527,7 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os);
     ::testing::Test::RecordProperty("cv_module_name", #modulename); \
     ::perf::TestBase::RecordRunParameters(); \
     __CV_TEST_EXEC_ARGS(__VA_ARGS__) \
+    TEST_DUMP_OCL_INFO \
     return RUN_ALL_TESTS();
 
 // impls must be an array, not a pointer; "plain" should always be one of the implementations
diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp
index 201c5f459..7c9ca9c5c 100644
--- a/modules/ts/src/ocl_test.cpp
+++ b/modules/ts/src/ocl_test.cpp
@@ -98,28 +98,25 @@ void dumpOpenCLDevice()
     using namespace cv::ocl;
     try
     {
-#if 0
-        Platforms platforms;
-        getOpenCLPlatforms(platforms);
+        std::vector<PlatformInform> platforms;
+        cv::ocl::getPlatfomsInfo(platforms);
         if (platforms.size() > 0)
         {
             DUMP_MESSAGE_STDOUT("OpenCL Platforms: ");
             for (size_t i = 0; i < platforms.size(); i++)
             {
-                const Platform* platform = platforms.at(i);
+                const PlatformInform* platform = &platforms[i];
                 DUMP_MESSAGE_STDOUT("    " << platform->name().c_str());
-                const Devices& devices = platform->devices();
-                for (size_t j = 0; j < devices.size(); j++)
+                Device current_device;
+                for (int j = 0; j < platform->deviceNumber(); j++)
                 {
-                    const Device& current_device = *devices.at(j);
+                    platform->getDevice(current_device, j);
                     const char* deviceTypeStr = current_device.type() == Device::TYPE_CPU
                                 ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? "GPU" : "unknown");
                     DUMP_MESSAGE_STDOUT( "        " << deviceTypeStr << ": " << current_device.name().c_str() << " (" << current_device.version().c_str() << ")");
-                    DUMP_PROPERTY_XML(cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j),
-                            "(Platform=" << current_device.getPlatform().name().c_str()
-                            << ")(Type=" << deviceTypeStr
-                            << ")(Name=" << current_device.name().c_str()
-                            << ")(Version=" << current_device.version().c_str() << ")");
+                    DUMP_PROPERTY_XML( cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j ),
+                        cv::format("(Platform=%sType=%sName=%sVersion=%s",
+                        platform->name().c_str(), deviceTypeStr, current_device.name().c_str(), current_device.version().c_str()) );
                 }
             }
         }
@@ -129,10 +126,9 @@ void dumpOpenCLDevice()
             DUMP_PROPERTY_XML("cv_ocl", "not available");
             return;
         }
-#endif
-        DUMP_MESSAGE_STDOUT("Current OpenCL device: ");
 
         const Device& device = Device::getDefault();
+        DUMP_MESSAGE_STDOUT("Current OpenCL device: ");
 
 #if 0
         DUMP_MESSAGE_STDOUT("    Platform = "<< device.getPlatform().name());
@@ -147,10 +143,8 @@ void dumpOpenCLDevice()
         DUMP_MESSAGE_STDOUT("    Name = "<< device.name());
         DUMP_PROPERTY_XML("cv_ocl_current_deviceName", device.name());
 
-#if 0
         DUMP_MESSAGE_STDOUT("    Version = " << device.version());
         DUMP_PROPERTY_XML("cv_ocl_current_deviceVersion", device.version());
-#endif
 
         DUMP_MESSAGE_STDOUT("    Compute units = "<< device.maxComputeUnits());
         DUMP_PROPERTY_XML("cv_ocl_current_maxComputeUnits", device.maxComputeUnits());

From ae827a638c4b4f25f8e314aa3585340b179f63f8 Mon Sep 17 00:00:00 2001
From: Konstantin Matskevich <konstantin.matskevich@itseez.com>
Date: Fri, 24 Jan 2014 14:01:31 +0400
Subject: [PATCH 2/3] fixes

---
 modules/core/include/opencv2/core/ocl.hpp | 12 ++++++------
 modules/core/src/ocl.cpp                  | 22 +++++++++++-----------
 modules/ts/src/ocl_test.cpp               |  8 ++++----
 3 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp
index 5d339a488..12c7b8b06 100644
--- a/modules/core/include/opencv2/core/ocl.hpp
+++ b/modules/core/include/opencv2/core/ocl.hpp
@@ -59,7 +59,7 @@ class CV_EXPORTS Kernel;
 class CV_EXPORTS Program;
 class CV_EXPORTS ProgramSource2;
 class CV_EXPORTS Queue;
-class CV_EXPORTS PlatformInform;
+class CV_EXPORTS PlatformInfo2;
 
 class CV_EXPORTS Device
 {
@@ -551,12 +551,12 @@ protected:
     Impl* p;
 };
 
-class CV_EXPORTS PlatformInform
+class CV_EXPORTS PlatformInfo2
 {
 public:
-    PlatformInform();
-    explicit PlatformInform(void* id);
-    ~PlatformInform();
+    PlatformInfo2();
+    explicit PlatformInfo2(void* id);
+    ~PlatformInfo2();
 
     String name() const;
     String vendor() const;
@@ -572,7 +572,7 @@ protected:
 CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf);
 CV_EXPORTS const char* typeToStr(int t);
 CV_EXPORTS const char* memopTypeToStr(int t);
-CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInform>& platform_info);
+CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInfo2>& platform_info);
 
 }}
 
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index c4859544d..73980629a 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -3640,7 +3640,7 @@ static void getDevices(std::vector<cl_device_id>& devices,cl_platform_id& platfo
     devices.resize(numDevices);
 }
 
-struct PlatformInform::Impl
+struct PlatformInfo2::Impl
 {
     Impl(void* id)
     {
@@ -3661,45 +3661,45 @@ struct PlatformInform::Impl
     cl_platform_id handle;
 };
 
-PlatformInform::PlatformInform()
+PlatformInfo2::PlatformInfo2()
 {
     p = 0;
 }
 
-PlatformInform::PlatformInform(void* platform_id)
+PlatformInfo2::PlatformInfo2(void* platform_id)
 {
     p = new Impl(platform_id);
 }
 
-PlatformInform::~PlatformInform()
+PlatformInfo2::~PlatformInfo2()
 {
     if(p)
         p->release();
 }
 
-int PlatformInform::deviceNumber() const
+int PlatformInfo2::deviceNumber() const
 {
     return p ? (int)p->devices.size() : 0;
 }
 
-void PlatformInform::getDevice(Device& device, int d) const
+void PlatformInfo2::getDevice(Device& device, int d) const
 {
     CV_Assert(d < (int)p->devices.size() );
     if(p)
         device.set(p->devices[d]);
 }
 
-String PlatformInform::name() const
+String PlatformInfo2::name() const
 {
     return p ? p->getStrProp(CL_PLATFORM_NAME) : String();
 }
 
-String PlatformInform::vendor() const
+String PlatformInfo2::vendor() const
 {
     return p ? p->getStrProp(CL_PLATFORM_VENDOR) : String();
 }
 
-String PlatformInform::version() const
+String PlatformInfo2::version() const
 {
     return p ? p->getStrProp(CL_PLATFORM_VERSION) : String();
 }
@@ -3718,13 +3718,13 @@ static void getPlatforms(std::vector<cl_platform_id>& platforms)
     platforms.resize(numPlatforms);
 }
 
-void getPlatfomsInfo(std::vector<PlatformInform>& platformsInfo)
+void getPlatfomsInfo(std::vector<PlatformInfo2>& platformsInfo)
 {
     std::vector<cl_platform_id> platforms;
     getPlatforms(platforms);
     for (size_t i = 0; i < platforms.size(); i++)
     {
-        platformsInfo.push_back( PlatformInform((void*)&platforms[i]) );
+        platformsInfo.push_back( PlatformInfo2((void*)&platforms[i]) );
     }
 }
 
diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp
index 7c9ca9c5c..32cc5287e 100644
--- a/modules/ts/src/ocl_test.cpp
+++ b/modules/ts/src/ocl_test.cpp
@@ -98,21 +98,21 @@ void dumpOpenCLDevice()
     using namespace cv::ocl;
     try
     {
-        std::vector<PlatformInform> platforms;
+        std::vector<PlatformInfo2> platforms;
         cv::ocl::getPlatfomsInfo(platforms);
         if (platforms.size() > 0)
         {
             DUMP_MESSAGE_STDOUT("OpenCL Platforms: ");
             for (size_t i = 0; i < platforms.size(); i++)
             {
-                const PlatformInform* platform = &platforms[i];
+                const PlatformInfo2* platform = &platforms[i];
                 DUMP_MESSAGE_STDOUT("    " << platform->name().c_str());
                 Device current_device;
                 for (int j = 0; j < platform->deviceNumber(); j++)
                 {
                     platform->getDevice(current_device, j);
                     const char* deviceTypeStr = current_device.type() == Device::TYPE_CPU
-                                ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? "GPU" : "unknown");
+                        ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? current_device.hostUnifiedMemory() ? "iGPU" : "dGPU" : "unknown");
                     DUMP_MESSAGE_STDOUT( "        " << deviceTypeStr << ": " << current_device.name().c_str() << " (" << current_device.version().c_str() << ")");
                     DUMP_PROPERTY_XML( cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j ),
                         cv::format("(Platform=%sType=%sName=%sVersion=%s",
@@ -136,7 +136,7 @@ void dumpOpenCLDevice()
 #endif
 
         const char* deviceTypeStr = device.type() == Device::TYPE_CPU
-                        ? "CPU" : (device.type() == Device::TYPE_GPU ? "GPU" : "unknown");
+            ? ("CPU") : (device.type() == Device::TYPE_GPU ? device.hostUnifiedMemory() ? "iGPU" : "dGPU" : "unknown");
         DUMP_MESSAGE_STDOUT("    Type = "<< deviceTypeStr);
         DUMP_PROPERTY_XML("cv_ocl_current_deviceType", deviceTypeStr);
 

From c7a6537b8335a310a3e4e7ffdca0506229e31f00 Mon Sep 17 00:00:00 2001
From: Konstantin Matskevich <konstantin.matskevich@itseez.com>
Date: Fri, 24 Jan 2014 16:35:51 +0400
Subject: [PATCH 3/3] add brackets

---
 modules/ts/src/ocl_test.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp
index 32cc5287e..0ad3df693 100644
--- a/modules/ts/src/ocl_test.cpp
+++ b/modules/ts/src/ocl_test.cpp
@@ -115,7 +115,7 @@ void dumpOpenCLDevice()
                         ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? current_device.hostUnifiedMemory() ? "iGPU" : "dGPU" : "unknown");
                     DUMP_MESSAGE_STDOUT( "        " << deviceTypeStr << ": " << current_device.name().c_str() << " (" << current_device.version().c_str() << ")");
                     DUMP_PROPERTY_XML( cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j ),
-                        cv::format("(Platform=%sType=%sName=%sVersion=%s",
+                        cv::format("(Platform=%s)(Type=%s)(Name=%s)(Version=%s)",
                         platform->name().c_str(), deviceTypeStr, current_device.name().c_str(), current_device.version().c_str()) );
                 }
             }