COMPMID-2549: Add GLES Runtime Context interfaces.

* Creates interfaces and concrete classes
* Ports GCActivationalLayer
* Adapts test framework and relevant tests

Change-Id: Ide36cd65ebf185958db3c4a5bebd630fcb2f39b3
Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Reviewed-on: https://review.mlplatform.org/c/2199
Reviewed-by: Pablo Marquez <pablo.tello@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
diff --git a/arm_compute/core/GLES_COMPUTE/GCCoreRuntimeContext.h b/arm_compute/core/GLES_COMPUTE/GCCoreRuntimeContext.h
new file mode 100644
index 0000000..be47bfd
--- /dev/null
+++ b/arm_compute/core/GLES_COMPUTE/GCCoreRuntimeContext.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2019 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_GCCORERUNTIME_CONTEXT_H__
+#define __ARM_COMPUTE_GCCORERUNTIME_CONTEXT_H__
+
+#include "arm_compute/core/GLES_COMPUTE/OpenGLES.h"
+
+namespace arm_compute
+{
+// Forward declarations
+class GCKernelLibrary;
+
+/** Core runtime context for OpenGL ES */
+class GCCoreRuntimeContext final
+{
+public:
+    /** Legacy constructor */
+    GCCoreRuntimeContext();
+
+    /** Constructor */
+    GCCoreRuntimeContext(GCKernelLibrary *kernel_lib);
+    /** Destructor */
+    ~GCCoreRuntimeContext() = default;
+    /** Default copy constructor */
+    GCCoreRuntimeContext(const GCCoreRuntimeContext &) = default;
+    /** Default move constructor */
+    GCCoreRuntimeContext(GCCoreRuntimeContext &&) = default;
+    /** Default copy assignment */
+    GCCoreRuntimeContext &operator=(const GCCoreRuntimeContext &) = default;
+    /** Default move assignment operator */
+    GCCoreRuntimeContext &operator=(GCCoreRuntimeContext &&) = default;
+    /** Kernel Library accessor
+     *
+     * @return The kernel library instance used by the core context
+     */
+    GCKernelLibrary *kernel_library() const;
+
+private:
+    GCKernelLibrary *_kernel_lib{ nullptr };
+};
+} // namespace arm_compute
+#endif /*__ARM_COMPUTE_GCCORERUNTIME_CONTEXT_H__ */
diff --git a/arm_compute/core/GLES_COMPUTE/GCHelpers.h b/arm_compute/core/GLES_COMPUTE/GCHelpers.h
index 1422afe..ccab6c5 100644
--- a/arm_compute/core/GLES_COMPUTE/GCHelpers.h
+++ b/arm_compute/core/GLES_COMPUTE/GCHelpers.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -24,13 +24,20 @@
 #ifndef __ARM_COMPUTE_GCHELPERS_H__
 #define __ARM_COMPUTE_GCHELPERS_H__
 
+#include "arm_compute/core/GLES_COMPUTE/IGCKernel.h"
 #include "arm_compute/core/GLES_COMPUTE/OpenGLES.h"
 #include "arm_compute/core/GPUTarget.h"
 #include "arm_compute/core/Helpers.h"
 #include "support/ToolchainSupport.h"
 
+#include <set>
+#include <string>
+
 namespace arm_compute
 {
+// Forward declarations
+class GCCoreRuntimeContext;
+
 /** Max vector width of an GLES vector */
 static constexpr unsigned int max_gc_vector_width = 16;
 
@@ -39,5 +46,14 @@
  * @return the GPU target
  */
 GPUTarget get_target_from_device();
+/** Creates an GLES kernel
+ *
+ * @param[in] ctx         A context to be used to create the GLES kernel.
+ * @param[in] kernel_name The kernel name.
+ * @param[in] build_opts  The build options to be used for the GLES kernel compilation.
+ *
+ * @return A GLES kernel
+ */
+GCKernel create_opengl_kernel(GCCoreRuntimeContext *ctx, const std::string &kernel_name, const std::set<std::string> &build_opts);
 } // namespace arm_compute
 #endif /* __ARM_COMPUTE_GCHELPERS_H__ */
diff --git a/arm_compute/core/GLES_COMPUTE/GCKernelLibrary.h b/arm_compute/core/GLES_COMPUTE/GCKernelLibrary.h
index 89d6d17..92e6bee 100644
--- a/arm_compute/core/GLES_COMPUTE/GCKernelLibrary.h
+++ b/arm_compute/core/GLES_COMPUTE/GCKernelLibrary.h
@@ -36,7 +36,7 @@
 namespace arm_compute
 {
 /** GCProgram class */
-class GCProgram
+class GCProgram final
 {
 public:
     /** Default constructor. */
@@ -84,7 +84,7 @@
 };
 
 /** GCKernel class */
-class GCKernel
+class GCKernel final
 {
 public:
     /** Default Constructor. */
@@ -184,22 +184,21 @@
 };
 
 /** GCKernelLibrary class */
-class GCKernelLibrary
+class GCKernelLibrary final
 {
     using StringSet = std::set<std::string>;
 
-private:
+public:
     /** Default Constructor. */
     GCKernelLibrary();
+    /** Default Destructor */
     ~GCKernelLibrary();
-
-public:
     /** Prevent instances of this class from being copied */
     GCKernelLibrary(const GCKernelLibrary &) = delete;
     /** Prevent instances of this class from being copied */
     const GCKernelLibrary &operator=(const GCKernelLibrary &) = delete;
     /** Get the static instance of @ref GCKernelLibrary.
-     *
+     * This method has been deprecated and will be removed in the next release.
      * @return The static instance of GCKernelLibrary.
      */
     static GCKernelLibrary &get();
@@ -209,40 +208,18 @@
      * @param[in] dpy         (Optional) EGLdisplay set by external application.
      * @param[in] ctx         (Optional) EGLContext set by external application.
      */
-    void init(std::string shader_path = "./", EGLDisplay dpy = EGL_NO_DISPLAY, EGLContext ctx = EGL_NO_CONTEXT)
-    {
-        //TODO: deal with old display and context.
-        _shader_path = std::move(shader_path);
-
-        _display = dpy;
-        _context = ctx;
-
-        eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, _context);
-        setup_dummy_fbo();
-    }
-
+    void init(std::string shader_path = "./", EGLDisplay dpy = EGL_NO_DISPLAY, EGLContext ctx = EGL_NO_CONTEXT);
     /** Sets the path that the shaders reside in.
      *
      * @param[in] shader_path Path of the shader.
      */
-    void set_shader_path(const std::string &shader_path)
-    {
-        _shader_path = shader_path;
-    };
+    void set_shader_path(const std::string &shader_path);
     /** Sets display and context to create kernel.
      *
      * @param[in] dpy EGLdisplay set by external application.
      * @param[in] ctx EGLContext set by external application.
      */
-    void set_context(EGLDisplay dpy, EGLContext ctx)
-    {
-        //TODO: deal with old display and context.
-        _display = dpy;
-        _context = ctx;
-
-        eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx);
-        setup_dummy_fbo();
-    };
+    void set_context(EGLDisplay dpy, EGLContext ctx);
     /** Creates a kernel from the kernel library.
      *
      * @param[in] shader_name       Shader name.
@@ -251,17 +228,11 @@
      * @return The created kernel.
      */
     GCKernel create_kernel(const std::string &shader_name, const StringSet &build_options_set = {}) const;
-    /** Serializes and saves programs to a binary.
-     *
-     */
+    /** Serializes and saves programs to a binary. */
     void save_binary();
-    /** Load serialized binary with all the programs.
-     *
-     */
+    /** Load serialized binary with all the programs. */
     void load_binary();
-    /** Setup a dummy fbo to workaround an issue on Galaxy S8.
-     *
-     */
+    /** Setup a dummy fbo to workaround an issue on Galaxy S8. */
     void setup_dummy_fbo();
 
 private:
@@ -296,5 +267,5 @@
     static const std::map<std::string, std::string> _program_source_map; /**< Contains sources for all programs.
                                                                               Used for compile-time shader inclusion. */
 };
-}
+} // namespace arm_compute
 #endif /* __ARM_COMPUTE_GCKERNELLIBRARY_H__ */
diff --git a/arm_compute/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.h b/arm_compute/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.h
index fc1d52f..8388222 100644
--- a/arm_compute/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.h
+++ b/arm_compute/core/GLES_COMPUTE/kernels/GCActivationLayerKernel.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -28,14 +28,19 @@
 
 namespace arm_compute
 {
+// Forward declarations
 class IGCTensor;
+class GCCoreRuntimeContext;
 
 /** Interface for the activation layer kernel. */
 class GCActivationLayerKernel : public IGCKernel
 {
 public:
-    /** Default constructor */
-    GCActivationLayerKernel();
+    /** Default constructor
+     *
+     * @param[in, out] ctx Core context to use
+     */
+    explicit GCActivationLayerKernel(GCCoreRuntimeContext *ctx = nullptr);
     /** Prevent instances of this class from being copied (As this class contains pointers) */
     GCActivationLayerKernel(const GCActivationLayerKernel &) = delete;
     /** Prevent instances of this class from being copied (As this class contains pointers) */
@@ -61,8 +66,9 @@
     void run(const Window &window) override;
 
 private:
-    IGCTensor *_input;
-    IGCTensor *_output;
+    IGCTensor            *_input;
+    IGCTensor            *_output;
+    GCCoreRuntimeContext *_ctx;
 };
-}
+} // namespace arm_compute
 #endif /*__ARM_COMPUTE_GCACTIVATIONLAYERKERNEL_H__ */