IVGCVSW-6989 "Merged experimental/armnn_shim_sl"

* Updated Serializer CMakeLists.txt to build armnnSerializerObj
* Added constant tensors as input support to SL

Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I22f6cf50147d99a01f7fe70d7446b114a4c57af3
diff --git a/shim/sl/canonical/ArmnnDevice.cpp b/shim/sl/canonical/ArmnnDevice.cpp
new file mode 100644
index 0000000..c404822
--- /dev/null
+++ b/shim/sl/canonical/ArmnnDevice.cpp
@@ -0,0 +1,147 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#define LOG_TAG "arm-armnn-sl"
+
+#include "ArmnnDevice.hpp"
+
+#include <LegacyUtils.h>
+#include <OperationsUtils.h>
+
+#include <log/log.h>
+
+#include <memory>
+#include <string>
+
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+
+namespace
+{
+
+std::string GetBackendString(const armnn_driver::DriverOptions& options)
+{
+    std::stringstream backends;
+    for (auto&& b : options.GetBackends())
+    {
+        backends << b << " ";
+    }
+    return backends.str();
+}
+
+} // anonymous namespace
+
+namespace armnn_driver
+{
+
+using namespace android::nn;
+
+ArmnnDevice::ArmnnDevice(DriverOptions options)
+    : m_Runtime(nullptr, nullptr)
+    , m_ClTunedParameters(nullptr)
+    , m_Options(std::move(options))
+{
+    // First check if the DriverOptions is happy.
+    if (options.ShouldExit())
+    {
+        // Is this a good or bad exit?
+        if (options.GetExitCode() != EXIT_SUCCESS)
+        {
+            throw armnn::InvalidArgumentException("ArmnnDevice: Insufficient or illegal options specified.");
+        }
+        else
+        {
+            throw armnn::InvalidArgumentException("ArmnnDevice: Nothing to do.");
+        }
+    }
+
+    initVLogMask();
+    VLOG(DRIVER) << "ArmnnDevice::ArmnnDevice()";
+
+#ifdef __ANDROID__
+    __android_log_print(ANDROID_LOG_DEBUG, "ARMNN_SL", "ArmnnDevice::ArmnnDevice()");
+#endif
+
+    armnn::ConfigureLogging(false, m_Options.IsVerboseLoggingEnabled(), armnn::LogSeverity::Trace);
+    if (m_Options.IsVerboseLoggingEnabled())
+    {
+        SetMinimumLogSeverity(android::base::VERBOSE);
+    }
+    else
+    {
+        SetMinimumLogSeverity(android::base::INFO);
+    }
+
+    armnn::IRuntime::CreationOptions runtimeOptions;
+
+#if defined(ARMCOMPUTECL_ENABLED)
+    try
+    {
+        if (!m_Options.GetClTunedParametersFile().empty())
+        {
+            m_ClTunedParameters = armnn::IGpuAccTunedParameters::Create(m_Options.GetClTunedParametersMode(),
+                                                                        m_Options.GetClTuningLevel());
+            try
+            {
+                m_ClTunedParameters->Load(m_Options.GetClTunedParametersFile().c_str());
+            }
+            catch (std::exception& error)
+            {
+                // This is only a warning because the file won't exist the first time you are generating it.
+                VLOG(DRIVER) << "ArmnnDevice: Failed to load CL tuned parameters file "
+                      << m_Options.GetClTunedParametersFile().c_str() << " : " <<  error.what());
+            }
+            runtimeOptions.m_GpuAccTunedParameters = m_ClTunedParameters;
+        }
+    }
+    catch (const armnn::ClRuntimeUnavailableException& error)
+    {
+        VLOG(DRIVER) <<  "ArmnnDevice: Failed to setup CL runtime: %s. Device will be unavailable." << error.what();
+    }
+    catch (std::exception& error)
+    {
+        VLOG(DRIVER) <<  "ArmnnDevice: Unknown exception: %s. Device will be unavailable." << error.what();
+    }
+#endif
+    runtimeOptions.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled();
+    m_Runtime = armnn::IRuntime::Create(runtimeOptions);
+
+    std::vector<armnn::BackendId> backends;
+
+    if (m_Runtime)
+    {
+        const armnn::BackendIdSet supportedDevices = m_Runtime->GetDeviceSpec().GetSupportedBackends();
+        for (auto &backend : m_Options.GetBackends())
+        {
+            if (std::find(supportedDevices.cbegin(), supportedDevices.cend(), backend) == supportedDevices.cend())
+            {
+                VLOG(DRIVER) << "ArmnnDevice: Requested unknown backend " << backend.Get().c_str();
+            }
+            else
+            {
+                backends.push_back(backend);
+            }
+        }
+    }
+
+    if (backends.empty())
+    {
+        // No known backend specified
+        throw armnn::InvalidArgumentException("ArmnnDevice: No known backend specified.");
+    }
+
+    m_Options.SetBackends(backends);
+    VLOG(DRIVER) << "ArmnnDevice: Created device with the following backends: " << GetBackendString(m_Options).c_str();
+
+#ifdef __ANDROID__
+    __android_log_print(ANDROID_LOG_DEBUG,
+                        "ARMNN_SL",
+                        "ArmnnDevice: Created device with the following backends: %s",
+                        GetBackendString(m_Options).c_str());
+#endif
+}
+
+} // namespace armnn_driver