IVGCVSW-7556 Introduce Opaque Delegate API

 * Also added cmake for the new layers to reduce merge conflicts.

Signed-off-by: Francis Murtagh <francis.murtagh@arm.com>
Change-Id: Ieb59aa2b7e2a18c57c9357b8d5b5cd63d8211c85
diff --git a/delegate/opaque/include/armnn_delegate.hpp b/delegate/opaque/include/armnn_delegate.hpp
index 8957dc8..5522699 100644
--- a/delegate/opaque/include/armnn_delegate.hpp
+++ b/delegate/opaque/include/armnn_delegate.hpp
@@ -1,5 +1,5 @@
 //
-// Copyright © 2020-2023 Arm Ltd and Contributors. All rights reserved.
+// Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
 
@@ -7,32 +7,17 @@
 
 #include <DelegateOptions.hpp>
 
-#include <tensorflow/lite/builtin_ops.h>
-#include <tensorflow/lite/c/builtin_op_data.h>
-#include <tensorflow/lite/c/common.h>
-#include <tensorflow/lite/minimal_logging.h>
-#include <tensorflow/lite/version.h>
+#include <tensorflow/lite/c/c_api_opaque.h>
+#include <tensorflow/lite/core/experimental/acceleration/configuration/c/stable_delegate.h>
 
-#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 3)
-#define ARMNN_POST_TFLITE_2_3
-#endif
-
-#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 4)
-#define ARMNN_POST_TFLITE_2_4
-#endif
-
-#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 5)
-#define ARMNN_POST_TFLITE_2_5
-#endif
-
-namespace armnnDelegate
+namespace armnnOpaqueDelegate
 {
 
 struct DelegateData
 {
     DelegateData(const std::vector<armnn::BackendId>& backends)
-            : m_Backends(backends)
-            , m_Network(nullptr, nullptr)
+    : m_Backends(backends)
+    , m_Network(nullptr, nullptr)
     {}
 
     const std::vector<armnn::BackendId>       m_Backends;
@@ -40,25 +25,25 @@
     std::vector<armnn::IOutputSlot*>          m_OutputSlotForNode;
 };
 
-// Forward decleration for functions initializing the ArmNN Delegate
-DelegateOptions TfLiteArmnnDelegateOptionsDefault();
+/// Forward declaration for functions initializing the ArmNN Delegate
+::armnnDelegate::DelegateOptions TfLiteArmnnDelegateOptionsDefault();
 
-TfLiteDelegate* TfLiteArmnnDelegateCreate(armnnDelegate::DelegateOptions options);
+TfLiteOpaqueDelegate* TfLiteArmnnOpaqueDelegateCreate(const void* settings);
 
-void TfLiteArmnnDelegateDelete(TfLiteDelegate* tfLiteDelegate);
+void TfLiteArmnnOpaqueDelegateDelete(TfLiteOpaqueDelegate* tfLiteDelegate);
 
-TfLiteStatus DoPrepare(TfLiteContext* context, TfLiteDelegate* delegate);
+TfLiteStatus DoPrepare(TfLiteOpaqueContext* context, TfLiteOpaqueDelegate* delegate, void* data);
 
-/// ArmNN Delegate
-class Delegate
+/// ArmNN Opaque Delegate
+class ArmnnOpaqueDelegate
 {
     friend class ArmnnSubgraph;
 public:
-    explicit Delegate(armnnDelegate::DelegateOptions options);
+    explicit ArmnnOpaqueDelegate(armnnDelegate::DelegateOptions options);
 
-    TfLiteIntArray* IdentifyOperatorsToDelegate(TfLiteContext* context);
+    TfLiteIntArray* IdentifyOperatorsToDelegate(TfLiteOpaqueContext* context);
 
-    TfLiteDelegate* GetDelegate();
+    TfLiteOpaqueDelegateBuilder* GetDelegateBuilder() { return &m_Builder; }
 
     /// Retrieve version in X.Y.Z form
     static const std::string GetVersion();
@@ -70,18 +55,18 @@
     armnn::IRuntime* GetRuntime(const armnn::IRuntime::CreationOptions& options)
     {
         static armnn::IRuntimePtr instance = armnn::IRuntime::Create(options);
-        // Instantiated on first use.
+        /// Instantiated on first use.
         return instance.get();
     }
 
-    TfLiteDelegate m_Delegate = {
+    TfLiteOpaqueDelegateBuilder m_Builder =
+    {
             reinterpret_cast<void*>(this),  // .data_
-            DoPrepare,                      // .Prepare
+            nullptr,                        // .Prepare
             nullptr,                        // .CopyFromBufferHandle
             nullptr,                        // .CopyToBufferHandle
             nullptr,                        // .FreeBufferHandle
             kTfLiteDelegateFlagsNone,       // .flags
-            nullptr,                        // .opaque_delegate_builder
     };
 
     /// ArmNN Runtime pointer
@@ -90,52 +75,62 @@
     armnnDelegate::DelegateOptions m_Options;
 };
 
+static int TfLiteArmnnOpaqueDelegateErrno(TfLiteOpaqueDelegate* delegate) { return 0; }
+
+
+    /// In order for the delegate to be loaded by TfLite
+const TfLiteOpaqueDelegatePlugin* GetArmnnDelegatePluginApi();
+
+extern const TfLiteStableDelegate TFL_TheStableDelegate =
+{
+    /*delegate_abi_version=*/ TFL_STABLE_DELEGATE_ABI_VERSION,
+    /*delegate_name=*/        "ArmnnDelegatePlugin",
+    /*delegate_version=*/     "1.0.0",
+    /*delegate_plugin=*/      GetArmnnDelegatePluginApi()
+};
+
 /// ArmnnSubgraph class where parsing the nodes to ArmNN format and creating the ArmNN Graph
 class ArmnnSubgraph
 {
 public:
-    static ArmnnSubgraph* Create(TfLiteContext* tfLiteContext,
-                                 const TfLiteDelegateParams* parameters,
-                                 const Delegate* delegate);
+    static ArmnnSubgraph* Create(TfLiteOpaqueContext* tfLiteContext,
+                                 const TfLiteOpaqueDelegateParams* parameters,
+                                 const ArmnnOpaqueDelegate* delegate);
 
-    TfLiteStatus Prepare(TfLiteContext* tfLiteContext);
+    TfLiteStatus Prepare(TfLiteOpaqueContext* tfLiteContext);
 
-    TfLiteStatus Invoke(TfLiteContext* tfLiteContext, TfLiteNode* tfLiteNode);
+    TfLiteStatus Invoke(TfLiteOpaqueContext* tfLiteContext, TfLiteOpaqueNode* tfLiteNode);
 
     static TfLiteStatus VisitNode(DelegateData& delegateData,
-                                  TfLiteContext* tfLiteContext,
-                                  TfLiteRegistration* tfLiteRegistration,
-                                  TfLiteNode* tfLiteNode,
+                                  TfLiteOpaqueContext* tfLiteContext,
+                                  TfLiteRegistrationExternal* tfLiteRegistration,
+                                  TfLiteOpaqueNode* tfLiteNode,
                                   int nodeIndex);
-
 private:
     ArmnnSubgraph(armnn::NetworkId networkId,
                   armnn::IRuntime* runtime,
                   std::vector<armnn::BindingPointInfo>& inputBindings,
                   std::vector<armnn::BindingPointInfo>& outputBindings)
-        : m_NetworkId(networkId), m_Runtime(runtime), m_InputBindings(inputBindings), m_OutputBindings(outputBindings)
+    : m_NetworkId(networkId)
+    , m_Runtime(runtime)
+    , m_InputBindings(inputBindings)
+    , m_OutputBindings(outputBindings)
     {}
-
     static TfLiteStatus AddInputLayer(DelegateData& delegateData,
-                                      TfLiteContext* tfLiteContext,
+                                      TfLiteOpaqueContext* tfLiteContext,
                                       const TfLiteIntArray* inputs,
                                       std::vector<armnn::BindingPointInfo>& inputBindings);
-
     static TfLiteStatus AddOutputLayer(DelegateData& delegateData,
-                                       TfLiteContext* tfLiteContext,
+                                       TfLiteOpaqueContext* tfLiteContext,
                                        const TfLiteIntArray* outputs,
                                        std::vector<armnn::BindingPointInfo>& outputBindings);
-
-
     /// The Network Id
     armnn::NetworkId m_NetworkId;
-    /// ArmNN Rumtime
+    /// ArmNN Runtime
     armnn::IRuntime* m_Runtime;
-
-    // Binding information for inputs and outputs
+    /// Binding information for inputs and outputs
     std::vector<armnn::BindingPointInfo> m_InputBindings;
     std::vector<armnn::BindingPointInfo> m_OutputBindings;
-
 };
 
-} // armnnDelegate namespace
\ No newline at end of file
+} // armnnOpaqueDelegate namespace
\ No newline at end of file