COMPMID-1478: Stop relying on static default OpenCL objects in cl2.hpp

This causes problems when ACL is used as a shared library on Android.
Fixes some problems related to creation / destruction order between the Graph's CL backend and core / runtime

Change-Id: I716d63fd42f4586df1ffbb6fa97e4db06d3a781b
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/143228
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Michele DiGiorgio <michele.digiorgio@arm.com>
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
diff --git a/src/runtime/CL/CLScheduler.cpp b/src/runtime/CL/CLScheduler.cpp
index f524a91..a812bad 100644
--- a/src/runtime/CL/CLScheduler.cpp
+++ b/src/runtime/CL/CLScheduler.cpp
@@ -29,15 +29,15 @@
 
 using namespace arm_compute;
 
-#if defined(ARM_COMPUTE_DEBUG_ENABLED)
 namespace
 {
+#if defined(ARM_COMPUTE_DEBUG_ENABLED)
 void printf_callback(const char *buffer, unsigned int len, size_t complete, void *user_data)
 {
     printf("%.*s", len, buffer);
 }
-} // namespace
 #endif /* defined(ARM_COMPUTE_DEBUG_ENABLED) */
+} // namespace
 
 std::once_flag CLScheduler::_initialize_symbols;
 
@@ -57,19 +57,25 @@
 {
     if(!_is_initialised)
     {
-        cl::Context ctx              = cl::Context::getDefault();
-        auto        queue_properties = cl::CommandQueue::getDefault().getInfo<CL_QUEUE_PROPERTIES>(nullptr);
+        std::vector<cl::Platform> platforms;
+        cl::Platform::get(&platforms);
+        ARM_COMPUTE_ERROR_ON_MSG(platforms.size() == 0, "Couldn't find any OpenCL platform");
+        cl::Platform            p = platforms[0];
+        cl::Context             ctx;
+        cl::Device              device;
+        std::vector<cl::Device> platform_devices;
+        p.getDevices(CL_DEVICE_TYPE_DEFAULT, &platform_devices);
+        ARM_COMPUTE_ERROR_ON_MSG(platform_devices.size() == 0, "Couldn't find any OpenCL device");
+        device = platform_devices[0];
 #if defined(ARM_COMPUTE_DEBUG_ENABLED)
-        // Query devices in the context for cl_arm_printf support
-        std::vector<cl::Device> def_platform_devices;
-        cl::Platform::getDefault().getDevices(CL_DEVICE_TYPE_DEFAULT, &def_platform_devices);
 
-        if(device_supports_extension(def_platform_devices[0], "cl_arm_printf"))
+        // Query devices in the context for cl_arm_printf support
+        if(device_supports_extension(device, "cl_arm_printf"))
         {
             // Create a cl_context with a printf_callback and user specified buffer size.
             cl_context_properties properties[] =
             {
-                CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(cl::Platform::get()()),
+                CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(p()),
                 // Enable a printf callback function for this context.
                 CL_PRINTF_CALLBACK_ARM, reinterpret_cast<cl_context_properties>(printf_callback),
                 // Request a minimum printf buffer size of 4MB for devices in the
@@ -77,13 +83,22 @@
                 CL_PRINTF_BUFFERSIZE_ARM, 0x1000,
                 0
             };
-            ctx = cl::Context(CL_DEVICE_TYPE_DEFAULT, properties);
+            ctx = cl::Context(device, properties);
         }
+        else
 #endif // defined(ARM_COMPUTE_DEBUG_ENABLED)
+        {
+            cl_context_properties properties[] =
+            {
+                CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(p()),
+                0
+            };
+            ctx = cl::Context(device, properties);
+        };
 
-        cl::CommandQueue queue = cl::CommandQueue(ctx, cl::Device::getDefault(), queue_properties);
-        CLKernelLibrary::get().init("./cl_kernels/", ctx, cl::Device::getDefault());
-        init(ctx, queue, cl::Device::getDefault(), cl_tuner);
+        cl::CommandQueue queue = cl::CommandQueue(ctx, device);
+        CLKernelLibrary::get().init("./cl_kernels/", ctx, device);
+        init(ctx, queue, device, cl_tuner);
 
         // Create a default static tuner and set if none was provided
         _cl_default_static_tuner = tuners::TunerFactory::create_tuner(_target);