OpenCL job chaining support

Resolve COMPMID-4714

Change-Id: I53b74956da10a8d7ffa2c5681f3b7f74acaa3201
Signed-off-by: Giorgio Arena <giorgio.arena@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/6215
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
diff --git a/arm_compute/runtime/CL/CLScheduler.h b/arm_compute/runtime/CL/CLScheduler.h
index 56852ae..37d9e2a 100644
--- a/arm_compute/runtime/CL/CLScheduler.h
+++ b/arm_compute/runtime/CL/CLScheduler.h
@@ -76,14 +76,14 @@
     /** Schedule the execution of the passed kernel if possible.
      *
      * @param[in] kernel Kernel to execute.
-     * @param[in] flush  (Optional) Specifies if the command queue will be flushed after running the kernel.
+     * @param[in] flush  (Optional) Specifies if the command queue will be flushed after running the kernel. This will be ignored if job chaining is enabled.
      */
     void enqueue(ICLKernel &kernel, bool flush = true);
     /** Schedule the execution of the passed kernel if possible.
      *
      * @param[in] kernel  Kernel to execute.
      * @param[in] tensors Vector containing the tensors to operate on.
-     * @param[in] flush   (Optional) Specifies if the command queue will be flushed after running the kernel.
+     * @param[in] flush   (Optional) Specifies if the command queue will be flushed after running the kernel. This will be ignored if job chaining is enabled.
      */
     void enqueue_op(ICLKernel &kernel, ITensorPack &tensors, bool flush = true);
 
@@ -163,6 +163,12 @@
      */
     void tune_kernel_static(ICLKernel &kernel);
 
+    /** Enable job chaining. The command queue will only be flushed when @p job_chaining_size kernels have been enqueued.
+     *
+     * @param[in] job_chaining_size Kernels to enqueue before flushing
+     */
+    void enable_job_chaining(int job_chaining_size);
+
     bool is_initialised() const;
 
 private:
@@ -177,6 +183,9 @@
     ICLTuner               *_cl_tuner;
     CLGEMMHeuristicsHandle *_gemm_heuristics;
     CLBackendType           _backend_type;
+    bool                    _job_chaining_enabled;
+    int                     _job_chaining_size;
+    int                     _job_chaining_count;
 };
 } // namespace arm_compute
 #endif /* ARM_COMPUTE_CLSCHEDULER_H */