IVGCVSW-7628 Update GpuFsa to use ACLs latest fixes

* Updates to the existing GpuFsa backend to incorporate patch:
  https://review.mlplatform.org/c/ml/ComputeLibrary/+/10990
* Update the ACL pin to include the patch with the fixes

Change-Id: I08d111265f4617657ee7f20249aeb111f64ba7a9
Signed-off-by: David Monahan <david.monahan@arm.com>
diff --git a/src/backends/gpuFsa/layers/GpuFsaConvolution2d.cpp b/src/backends/gpuFsa/layers/GpuFsaConvolution2d.cpp
index c7137d7..7aa643d 100644
--- a/src/backends/gpuFsa/layers/GpuFsaConvolution2d.cpp
+++ b/src/backends/gpuFsa/layers/GpuFsaConvolution2d.cpp
@@ -17,7 +17,6 @@
 
 #include <arm_compute/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.h>
 #include <arm_compute/dynamic_fusion/sketch/gpu/GpuWorkloadContext.h>
-#include <src/dynamic_fusion/sketch/gpu/GpuWorkloadContextImpl.h>
 #include <arm_compute/dynamic_fusion/sketch/gpu/operators/GpuConv2d.h>
 #include <arm_compute/dynamic_fusion/sketch/gpu/operators/GpuOutput.h>
 
@@ -49,8 +48,7 @@
 
     // Only create the bias tensor info if enabled, otherwise pass nullptr to validate_op
     arm_compute::TensorInfo aclBiasInfo;
-    arm_compute::TensorInfo biasSketchInfo;
-    arm_compute::TensorInfo* biasSketchInfoPtr = nullptr;
+    arm_compute::ITensorInfo* biasSketchInfoPtr = nullptr;
 
     if (descriptor.m_BiasEnabled)
     {
@@ -61,8 +59,7 @@
         aclBiasInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout);
         aclBiasInfo.set_are_values_constant(biases.value().IsConstant());
 
-        biasSketchInfo    = workloadContext.create_tensor_info(aclBiasInfo);
-        biasSketchInfoPtr = &biasSketchInfo;
+        biasSketchInfoPtr = workloadContext.create_tensor_info(aclBiasInfo);
     }
 
     // Set Conv2d attributes using descriptor
@@ -78,8 +75,8 @@
 
     // Validate operator, check status and update reasonIfUnsupported
     arm_compute::Status aclStatus = GpuConv2d::validate_op(sketch,
-                                                           &inputInfo,
-                                                           &weightInfo,
+                                                           inputInfo,
+                                                           weightInfo,
                                                            biasSketchInfoPtr,
                                                            conv2DAttributes);
 
@@ -93,34 +90,32 @@
                                  const Optional<TensorInfo>& biases)
 {
 /*
- * Creating an Op for the GpuFds backend requires us to create and maintain quite a bit of data, which is then stored
+ * Creating an Op for the GpuFsa backend requires us to create and maintain quite a bit of data, which is then stored
  * in a GpuFsaPreCompiledBlob for execution later. Specifically we need:
  * GpuWorkloadContext, this contains the TensorInfos and is unique to the Graph being executed
  * Sketch, this is similar to a subgraph and can contain one or more operations. Multiple ops can be "fused" together
  * using a single sketch.
- * The TensorInfoIds, these are the ids of the TensorInfos used when creating the sketch. They refer to the TensorInfos
- * stored within the GpuWorkloadContext and are used to fetch them later when executing the sketch.
+ * The inputTensorinfos / outputTensorInfos, these are pointers to the TensorInfos used when creating the sketch.
+ * They refer to the TensorInfos stored within the GpuWorkloadContext and are needed when executing the sketch
+ * as the TensorInfos used when creating the Tensors must match those used to create the Sketch. Otherwise the runtime
+ * doesn't know which Tensors to use.
  */
     using namespace arm_compute::experimental::dynamic_fusion;
     GpuWorkloadSketch* sketch = blob->sketch.get();
     GpuWorkloadContext* workloadContext = blob->workloadContext.get();
-    std::vector<int32_t> inputIds = {};
-    std::vector<int32_t> outputIds = {};
+    std::vector<arm_compute::ITensorInfo*> inputTensorInfos = {};
+    std::vector<arm_compute::ITensorInfo*> outputTensorInfos = {};
 
     // Build and create tensor infos using the sketch
     const arm_compute::TensorInfo aclInputInfo   = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
     arm_compute::TensorInfo       aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout);
     aclWeightsInfo.set_are_values_constant(weights.IsConstant());
-    auto inputInfo = workloadContext->create_tensor_info(aclInputInfo);
-    aclWeightsInfo.set_are_values_constant(weights.IsConstant());
-    inputIds.emplace_back(inputInfo.id());
 
-    auto weightInfo = workloadContext->create_tensor_info(aclWeightsInfo);
-    inputIds.emplace_back(weightInfo.id());
+    inputTensorInfos.emplace_back(workloadContext->create_tensor_info(aclInputInfo));
+    inputTensorInfos.emplace_back(workloadContext->create_tensor_info(aclWeightsInfo));
 
-    // Only create the bias tensor info if enabled, otherwise pass nullptr to validate_op
+    // Only create the bias tensor info if enabled, otherwise pass nullptr to validate_op / create_op
     arm_compute::TensorInfo aclBiasInfo;
-    arm_compute::TensorInfo biasSketchInfo;
     arm_compute::ITensorInfo* biasSketchInfoPtr = nullptr;
 
     if (descriptor.m_BiasEnabled)
@@ -132,9 +127,8 @@
         aclBiasInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout);
         aclBiasInfo.set_are_values_constant(biases.value().IsConstant());
 
-        biasSketchInfo    = workloadContext->create_tensor_info(aclBiasInfo);
-        inputIds.emplace_back(biasSketchInfo.id());
-        biasSketchInfoPtr = workloadContext->implementation().get_tensor_info(biasSketchInfo.id());
+        inputTensorInfos.emplace_back(workloadContext->create_tensor_info(aclBiasInfo));
+        biasSketchInfoPtr = inputTensorInfos[2];
     }
 
     // Set Conv2d attributes using descriptor
@@ -149,12 +143,11 @@
     conv2DAttributes.stride(aclStrideInfo);
 
     // Validate operator, check status and update reasonIfUnsupported
-    arm_compute::Status aclStatus =
-        GpuConv2d::validate_op(*sketch,
-                               workloadContext->implementation().get_tensor_info(inputInfo.id()),
-                               workloadContext->implementation().get_tensor_info(weightInfo.id()),
-                               biasSketchInfoPtr,
-                               conv2DAttributes);
+    arm_compute::Status aclStatus = GpuConv2d::validate_op(*sketch,
+                                                           inputTensorInfos[0],
+                                                           inputTensorInfos[1],
+                                                           biasSketchInfoPtr,
+                                                           conv2DAttributes);
 
     const bool supported = (aclStatus.error_code() == arm_compute::ErrorCode::OK);
     if (!supported)
@@ -162,19 +155,20 @@
         throw BackendCapabilityException("\"GpuFsa\" backend failed during Convolution2D operation validation");
     }
 
-    arm_compute::ITensorInfo* convOutInfo =
-        GpuConv2d::create_op(*sketch,
-                             workloadContext->implementation().get_tensor_info(inputInfo.id()),
-                             workloadContext->implementation().get_tensor_info(weightInfo.id()),
-                             biasSketchInfoPtr,
-                             conv2DAttributes);
+    // Create the Op within the Sketch using the TensorInfos we have stored
+    arm_compute::ITensorInfo* convOutInfo = GpuConv2d::create_op(*sketch,
+                                                                 inputTensorInfos[0],
+                                                                 inputTensorInfos[1],
+                                                                 biasSketchInfoPtr,
+                                                                 conv2DAttributes);
 
-    arm_compute::TensorInfo outputDstInfo = workloadContext->create_tensor_info();
-    outputIds.emplace_back(outputDstInfo.id());
+    // Create the Output
+    outputTensorInfos.emplace_back(workloadContext->create_tensor_info());
+    GpuOutput::create_op(*sketch, convOutInfo, outputTensorInfos[0]);
 
-    GpuOutput::create_op(*sketch, convOutInfo, workloadContext->implementation().get_tensor_info(outputDstInfo.id()));
-    blob->inputIds = std::make_unique<std::vector<int32_t>>(inputIds);
-    blob->outputIds = std::make_unique<std::vector<int32_t>>(outputIds);
+    // Store the TensorInfos within the blob as unique_ptrs to be used later
+    blob->inputTensorInfos = std::make_unique<std::vector<arm_compute::ITensorInfo*>>(inputTensorInfos);
+    blob->outputTensorInfos = std::make_unique<std::vector<arm_compute::ITensorInfo*>>(outputTensorInfos);
 }
 
 } // namespace armnn