COMPMID-1601: Graph examples segfaulting on some platform when gles=1

Makes the graph to setup and initialize only the backends used as some
platform have issues when GLES backend get initialized but not used.

Change-Id: Icf88675ffd8c2997e54a68baabfbbce241b0712c
Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Reviewed-on: https://review.mlplatform.org/745
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Giuseppe Rossini <giuseppe.rossini@arm.com>
diff --git a/arm_compute/graph/Utils.h b/arm_compute/graph/Utils.h
index 1a0509b..4ffccec 100644
--- a/arm_compute/graph/Utils.h
+++ b/arm_compute/graph/Utils.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 ARM Limited.
+ * Copyright (c) 2018-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -89,11 +89,12 @@
  * @return A PassManager with default mutating passes
  */
 PassManager create_default_pass_manager(Target target);
-/** Default setups the graph context if not done manually
+/** Setups requested backend context if it exists, is supported and hasn't been initialized already.
  *
- * @param[in,out] ctx Graph Context
+ * @param[in,out] ctx    Graph Context.
+ * @param[in]     target Target to setup the backend for.
  */
-void setup_default_graph_context(GraphContext &ctx);
+void setup_requested_backend_context(GraphContext &ctx, Target target);
 /** Default releases the graph context if not done manually
  *
  * @param[in,out] ctx Graph Context
diff --git a/src/graph/GraphManager.cpp b/src/graph/GraphManager.cpp
index 57c5f9d..4f942b9 100644
--- a/src/graph/GraphManager.cpp
+++ b/src/graph/GraphManager.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 ARM Limited.
+ * Copyright (c) 2018-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -45,9 +45,6 @@
 
 void GraphManager::finalize_graph(Graph &graph, GraphContext &ctx, PassManager &pm, Target target)
 {
-    // Setup graph context if not done manually
-    setup_default_graph_context(ctx);
-
     // Check if graph has been registered
     if(_workloads.find(graph.id()) != std::end(_workloads))
     {
@@ -55,7 +52,7 @@
     }
 
     // Force target to all graph construct
-    // TODO (geopin01) : Support heterogeneous execution
+    // TODO (COMPMID-2014) : Support heterogeneous execution
     Target forced_target = target;
     if(!is_target_supported(target))
     {
@@ -64,6 +61,10 @@
     }
     force_target_to_graph(graph, forced_target);
 
+    // Setup backend context
+    // TODO (COMPMID-2014) : Setup all backends needed by the graph
+    setup_requested_backend_context(ctx, forced_target);
+
     // Configure all tensors
     detail::configure_all_tensors(graph);
 
diff --git a/src/graph/Utils.cpp b/src/graph/Utils.cpp
index 71ec548..71a6fc5 100644
--- a/src/graph/Utils.cpp
+++ b/src/graph/Utils.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 ARM Limited.
+ * Copyright (c) 2018-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -104,13 +104,14 @@
     }
 }
 
-void setup_default_graph_context(GraphContext &ctx)
+void setup_requested_backend_context(GraphContext &ctx, Target target)
 {
-    for(const auto &backend : backends::BackendRegistry::get().backends())
+    if(backends::BackendRegistry::get().contains(target))
     {
-        if(backend.second->is_backend_supported())
+        const auto &backend = backends::BackendRegistry::get().find_backend(target);
+        if(backend->is_backend_supported())
         {
-            backend.second->setup_backend_context(ctx);
+            backend->setup_backend_context(ctx);
         }
     }
 }