IVGCVSW-2911 Add Android Q support to android-nn-driver infrastructure

 * Updated Android.mk to build Android Q
 * Added androidnn.go to inject cpp flags for Q
 * Create Runtime when ACL is not enabled

Change-Id: Ia3e7a8e484fc81ce63998a65e29753cbf941173c
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Signed-off-by: Kevin May <kevin.may@arm.com>
diff --git a/Android.bp b/Android.bp
index f6ccb09..4a99792 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3,6 +3,40 @@
 // SPDX-License-Identifier: MIT
 //
 
+bootstrap_go_package {
+    name: "armnn_nn_driver",
+    pkgPath: "android-nn-driver",
+    deps: [
+        "blueprint",
+        "blueprint-pathtools",
+        "blueprint-proptools",
+        "soong",
+        "soong-android",
+        "soong-cc",
+    ],
+    srcs: [
+        "androidnn.go",
+    ],
+    pluginFor: [ "soong_build" ],
+}
+
+armnn_nn_driver_defaults {
+       name: "armnn-nn-driver-default-cppflags",
+       cppflags: [
+            "-std=c++14",
+            "-fexceptions",
+            "-DBOOST_NO_AUTO_PTR",
+            "-DEMBEDDED_KERNELS",
+            "-DARM_COMPUTE_ASSERTS_ENABLED",
+            "-DARM_COMPUTE_CPP_SCHEDULER",
+            "-Wno-unused-parameter",
+            "-DNO_DOT_IN_TOOLCHAIN",
+
+            "-no-integrated-as"
+    ],
+    rtti: true,
+}
+
 ////////////////////////////////////////////
 //                                        //
 //              Arm Compute               //
@@ -10,6 +44,7 @@
 ////////////////////////////////////////////
 cc_library_static {
     name: "armnn-arm_compute",
+    defaults: ["armnn-nn-driver-default-cppflags"],
     proprietary: true,
     local_include_dirs: ["clframework/build/android-arm64v8a/src/core",
                          "clframework/build/android-arm64v8a/src/core/CL",
@@ -698,16 +733,6 @@
             ],
         },
     },
-    cppflags: [
-        "-std=c++14",
-        "-fexceptions",
-        "-DEMBEDDED_KERNELS",
-        "-DARM_COMPUTE_ASSERTS_ENABLED",
-        "-DARM_COMPUTE_CPP_SCHEDULER",
-        "-Wno-unused-parameter",
-        "-DNO_DOT_IN_TOOLCHAIN",
-        "-no-integrated-as"
-    ],
     rtti: true,
 }
 
@@ -724,6 +749,10 @@
         "-O3",
         "-fexceptions",
         "-Wno-unused-parameter",
+        "-DBOOST_NO_AUTO_PTR"
+    ],
+    cppflags: [
+        "-std=c++14"
     ],
     rtti: true,
 }
diff --git a/Android.mk b/Android.mk
index 3d23ecc..8d2fe9f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -6,6 +6,25 @@
 ANDROID_NN_DRIVER_LOCAL_PATH := $(call my-dir)
 LOCAL_PATH := $(ANDROID_NN_DRIVER_LOCAL_PATH)
 
+P_OR_LATER := 0
+Q_OR_LATER := 0
+
+ifeq ($(PLATFORM_VERSION),9)
+P_OR_LATER := 1
+endif # PLATFORM_VERSION == 9
+ifeq ($(PLATFORM_VERSION),P)
+P_OR_LATER := 1
+endif # PLATFORM_VERSION == P
+
+ifeq ($(PLATFORM_VERSION),10)
+P_OR_LATER := 1
+Q_OR_LATER := 1
+endif # PLATFORM_VERSION == 10
+ifeq ($(PLATFORM_VERSION),Q)
+P_OR_LATER := 1
+Q_OR_LATER := 1
+endif # PLATFORM_VERSION == Q
+
 # Configure these paths if you move the source or Khronos headers
 ARMNN_HEADER_PATH := $(LOCAL_PATH)/armnn/include
 ARMNN_UTILS_HEADER_PATH := $(LOCAL_PATH)/armnn/src/armnnUtils
@@ -17,13 +36,26 @@
 ARMNN_COMPUTE_CL_ENABLED := 1
 ARMNN_COMPUTE_NEON_ENABLED := 1
 
+ifeq ($(ARMNN_COMPUTE_CL_ENABLE),0)
+ARMNN_COMPUTE_CL_ENABLED := 0
+endif
+
+ifeq ($(ARMNN_COMPUTE_NEON_ENABLE),0)
+ARMNN_COMPUTE_NEON_ENABLED := 0
+endif
+
 #######################
 # libarmnn-driver@1.0 #
 #######################
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := libarmnn-driver@1.0
+ifeq ($(Q_OR_LATER),1)
+# "eng" is deprecated in Android Q
+LOCAL_MODULE_TAGS := optional
+else
 LOCAL_MODULE_TAGS := eng optional
+endif
 LOCAL_ARM_MODE := arm
 LOCAL_PROPRIETARY_MODULE := true
 # Mark source files as dependent on Android.mk
@@ -40,20 +72,24 @@
         -fexceptions \
         -Werror \
         -Wno-format-security
-ifeq ($(PLATFORM_VERSION),9)
+
+ifeq ($(P_OR_LATER),1)
 # Required to build with the changes made to the Android ML framework starting from Android P,
 # regardless of the HAL version used for the build.
 LOCAL_CFLAGS+= \
         -DARMNN_ANDROID_P
 endif # PLATFORM_VERSION == 9
+
 ifeq ($(ARMNN_DRIVER_DEBUG),1)
 LOCAL_CFLAGS+= \
         -UNDEBUG
 endif # ARMNN_DRIVER_DEBUG == 1
+
 ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
 LOCAL_CFLAGS += \
         -DARMCOMPUTECL_ENABLED
 endif # ARMNN_COMPUTE_CL_ENABLED == 1
+
 ifeq ($(ARMNN_COMPUTE_NEON_ENABLED),1)
 LOCAL_CFLAGS += \
         -DARMCOMPUTENEON_ENABLED
@@ -90,18 +126,32 @@
         libutils \
         android.hardware.neuralnetworks@1.0 \
         android.hidl.allocator@1.0 \
-        android.hidl.memory@1.0 \
-        libOpenCL
-ifeq ($(PLATFORM_VERSION),9)
+        android.hidl.memory@1.0
+
+ifeq ($(P_OR_LATER),1)
 # Required to build the 1.0 version of the NN Driver on Android P and later versions,
 # as the 1.0 version of the NN API needs the 1.1 HAL headers to be included regardless.
 LOCAL_SHARED_LIBRARIES+= \
         android.hardware.neuralnetworks@1.1
 endif # PLATFORM_VERSION == 9
 
+ifeq ($(Q_OR_LATER),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libnativewindow \
+        libui \
+        libfmq \
+        libcutils \
+        android.hardware.neuralnetworks@1.2
+endif # PLATFORM_VERSION == Q
+
+ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libOpenCL
+endif
+
 include $(BUILD_STATIC_LIBRARY)
 
-ifeq ($(PLATFORM_VERSION),9)
+ifeq ($(P_OR_LATER),1)
 # The following target is available starting from Android P
 
 #######################
@@ -110,7 +160,13 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := libarmnn-driver@1.1
+ifeq ($(Q_OR_LATER),1)
+# "eng" is deprecated in Android Q
+LOCAL_MODULE_TAGS := optional
+else
 LOCAL_MODULE_TAGS := eng optional
+endif
+#PRODUCT_PACKAGES_ENG := libarmnn-driver@1.1
 LOCAL_ARM_MODE := arm
 LOCAL_PROPRIETARY_MODULE := true
 # Mark source files as dependent on Android.mk
@@ -129,14 +185,17 @@
         -Wno-format-security \
         -DARMNN_ANDROID_P \
         -DARMNN_ANDROID_NN_V1_1
+
 ifeq ($(ARMNN_DRIVER_DEBUG),1)
 LOCAL_CFLAGS+= \
         -UNDEBUG
 endif # ARMNN_DRIVER_DEBUG == 1
+
 ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
 LOCAL_CFLAGS += \
         -DARMCOMPUTECL_ENABLED
 endif # ARMNN_COMPUTE_CL_ENABLED == 1
+
 ifeq ($(ARMNN_COMPUTE_NEON_ENABLED),1)
 LOCAL_CFLAGS += \
         -DARMCOMPUTENEON_ENABLED
@@ -176,8 +235,21 @@
         android.hardware.neuralnetworks@1.0 \
         android.hardware.neuralnetworks@1.1 \
         android.hidl.allocator@1.0 \
-        android.hidl.memory@1.0 \
+        android.hidl.memory@1.0
+
+ifeq ($(Q_OR_LATER),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libnativewindow \
+        libui \
+        libfmq \
+        libcutils \
+        android.hardware.neuralnetworks@1.2
+endif # PLATFORM_VERSION == Q
+
+ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
+LOCAL_SHARED_LIBRARIES+= \
         libOpenCL
+endif
 
 include $(BUILD_STATIC_LIBRARY)
 
@@ -190,7 +262,12 @@
 
 LOCAL_MODULE := android.hardware.neuralnetworks@1.0-service-armnn
 LOCAL_INIT_RC := android.hardware.neuralnetworks@1.0-service-armnn.rc
+ifeq ($(Q_OR_LATER),1)
+# "eng" is deprecated in Android Q
+LOCAL_MODULE_TAGS := optional
+else
 LOCAL_MODULE_TAGS := eng optional
+endif
 LOCAL_ARM_MODE := arm
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_PROPRIETARY_MODULE := true
@@ -235,18 +312,31 @@
         libutils \
         android.hardware.neuralnetworks@1.0 \
         android.hidl.allocator@1.0 \
-        android.hidl.memory@1.0 \
-        libOpenCL
-ifeq ($(PLATFORM_VERSION),9)
+        android.hidl.memory@1.0
+
+ifeq ($(P_OR_LATER),1)
 # Required to build the 1.0 version of the NN Driver on Android P and later versions,
 # as the 1.0 version of the NN API needs the 1.1 HAL headers to be included regardless.
 LOCAL_SHARED_LIBRARIES+= \
         android.hardware.neuralnetworks@1.1
 endif # PLATFORM_VERSION == 9
+ifeq ($(Q_OR_LATER),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libnativewindow \
+        libui \
+        libfmq \
+        libcutils \
+        android.hardware.neuralnetworks@1.2
+endif # PLATFORM_VERSION == Q
+
+ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libOpenCL
+endif
 
 include $(BUILD_EXECUTABLE)
 
-ifeq ($(PLATFORM_VERSION),9)
+ifeq ($(P_OR_LATER),1)
 # The following target is available starting from Android P
 
 #####################################################
@@ -256,7 +346,12 @@
 
 LOCAL_MODULE := android.hardware.neuralnetworks@1.1-service-armnn
 LOCAL_INIT_RC := android.hardware.neuralnetworks@1.1-service-armnn.rc
+ifeq ($(Q_OR_LATER),1)
+# "eng" is deprecated in Android Q
+LOCAL_MODULE_TAGS := optional
+else
 LOCAL_MODULE_TAGS := eng optional
+endif
 LOCAL_ARM_MODE := arm
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_PROPRIETARY_MODULE := true
@@ -303,8 +398,21 @@
         android.hardware.neuralnetworks@1.0 \
         android.hardware.neuralnetworks@1.1 \
         android.hidl.allocator@1.0 \
-        android.hidl.memory@1.0 \
+        android.hidl.memory@1.0
+
+ifeq ($(Q_OR_LATER),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libnativewindow \
+        libui \
+        libfmq \
+        libcutils \
+        android.hardware.neuralnetworks@1.2
+endif # PLATFORM_VERSION == Q
+
+ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
+LOCAL_SHARED_LIBRARIES+= \
         libOpenCL
+endif
 
 include $(BUILD_EXECUTABLE)
 
diff --git a/ArmnnDevice.cpp b/ArmnnDevice.cpp
index c96798a..a03d9cc 100644
--- a/ArmnnDevice.cpp
+++ b/ArmnnDevice.cpp
@@ -51,10 +51,11 @@
         SetMinimumLogSeverity(base::INFO);
     }
 
+    armnn::IRuntime::CreationOptions runtimeOptions;
+
 #if defined(ARMCOMPUTECL_ENABLED)
     try
     {
-        armnn::IRuntime::CreationOptions options;
         if (!m_Options.GetClTunedParametersFile().empty())
         {
             m_ClTunedParameters = armnn::IGpuAccTunedParameters::Create(m_Options.GetClTunedParametersMode(),
@@ -69,18 +70,17 @@
                 ALOGW("ArmnnDevice: Failed to load CL tuned parameters file '%s': %s",
                       m_Options.GetClTunedParametersFile().c_str(), error.what());
             }
-            options.m_GpuAccTunedParameters = m_ClTunedParameters;
+            runtimeOptions.m_GpuAccTunedParameters = m_ClTunedParameters;
         }
-
-        options.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled();
-
-        m_Runtime = armnn::IRuntime::Create(options);
     }
     catch (const armnn::ClRuntimeUnavailableException& error)
     {
         ALOGE("ArmnnDevice: Failed to setup CL runtime: %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)
diff --git a/Utils.hpp b/Utils.hpp
index e55d8f8..42fef3f 100644
--- a/Utils.hpp
+++ b/Utils.hpp
@@ -29,12 +29,12 @@
 class UnsupportedOperand: public std::runtime_error
 {
 public:
-    UnsupportedOperand(const OperandType type)
+    UnsupportedOperand(const V1_0::OperandType type)
         : std::runtime_error("Operand type is unsupported")
         , m_type(type)
     {}
 
-    OperandType m_type;
+    V1_0::OperandType m_type;
 };
 
 /// Swizzles tensor data in @a input according to the dimension mappings.
diff --git a/androidnn.go b/androidnn.go
new file mode 100644
index 0000000..aa83b1a
--- /dev/null
+++ b/androidnn.go
@@ -0,0 +1,44 @@
+//
+// Copyright © 2017 ARM Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+package armnn_nn_driver
+
+import (
+    "android/soong/android"
+    "android/soong/cc"
+)
+
+func globalFlags(ctx android.BaseContext) []string {
+    var cppflags []string
+
+    if ctx.AConfig().PlatformVersionName() == "Q"  {
+        cppflags = append(cppflags, "-fno-addrsig")
+    }
+
+    return cppflags
+}
+
+func armnnNNDriverDefaults(ctx android.LoadHookContext) {
+        type props struct {
+                Cppflags []string
+        }
+
+        p := &props{}
+        p.Cppflags = globalFlags(ctx)
+
+        ctx.AppendProperties(p)
+}
+
+func init() {
+
+  android.RegisterModuleType("armnn_nn_driver_defaults", armnnNNDriverDefaultsFactory)
+}
+
+func armnnNNDriverDefaultsFactory() android.Module {
+
+   module := cc.DefaultsFactory()
+   android.AddLoadHook(module, armnnNNDriverDefaults)
+   return module
+}
diff --git a/test/1.1/Mean.cpp b/test/1.1/Mean.cpp
index 4ebb8cf..7d48243 100644
--- a/test/1.1/Mean.cpp
+++ b/test/1.1/Mean.cpp
@@ -32,7 +32,7 @@
 
     V1_1::Model model = {};
     AddInputOperand (model, input.GetDimensions());
-    AddTensorOperand(model, axisDimensions, const_cast<int32_t*>(axisValues), OperandType::TENSOR_INT32);
+    AddTensorOperand(model, axisDimensions, const_cast<int32_t*>(axisValues), V1_0::OperandType::TENSOR_INT32);
     AddIntOperand   (model, keepDims);
     AddOutputOperand(model, expectedOutput.GetDimensions());
 
@@ -42,7 +42,7 @@
     model.operations[0].outputs            = hidl_vec<uint32_t>{ 3 };
     model.relaxComputationFloat32toFloat16 = fp16Enabled;
 
-    android::sp<IPreparedModel> preparedModel = PrepareModel(model, *driver);
+    android::sp<V1_0::IPreparedModel> preparedModel = PrepareModel(model, *driver);
 
     // The request's memory pools will follow the same order as the inputs
     DataLocation inLoc    = {};
diff --git a/test/1.1/Transpose.cpp b/test/1.1/Transpose.cpp
index a052143..6dc3e0e 100644
--- a/test/1.1/Transpose.cpp
+++ b/test/1.1/Transpose.cpp
@@ -30,7 +30,7 @@
     V1_1::Model model = {};
 
     AddInputOperand(model,inputs.GetDimensions());
-    AddTensorOperand(model, hidl_vec<uint32_t>{4}, perm, OperandType::TENSOR_INT32);
+    AddTensorOperand(model, hidl_vec<uint32_t>{4}, perm, V1_0::OperandType::TENSOR_INT32);
     AddOutputOperand(model, expectedOutputTensor.GetDimensions());
 
     model.operations.resize(1);
@@ -38,7 +38,7 @@
     model.operations[0].inputs  = hidl_vec<uint32_t>{0, 1};
     model.operations[0].outputs = hidl_vec<uint32_t>{2};
 
-    android::sp<IPreparedModel> preparedModel = PrepareModel(model, *driver);
+    android::sp<V1_0::IPreparedModel> preparedModel = PrepareModel(model, *driver);
 
     // the request's memory pools will follow the same order as
     // the inputs
diff --git a/test/Android.mk b/test/Android.mk
index 87f0b63..820cfd6 100644
--- a/test/Android.mk
+++ b/test/Android.mk
@@ -18,7 +18,12 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := armnn-driver-tests@1.0
+ifeq ($(PLATFORM_VERSION),Q)
+# "eng" is deprecated in Android Q
+LOCAL_MODULE_TAGS := optional
+else
 LOCAL_MODULE_TAGS := eng optional
+endif
 LOCAL_ARM_MODE := arm
 LOCAL_PROPRIETARY_MODULE := true
 # Mark source files as dependent on Android.mk
@@ -36,7 +41,8 @@
         -Werror \
         -O0 \
         -UNDEBUG
-ifeq ($(PLATFORM_VERSION),9)
+
+ifeq ($(P_OR_LATER),1)
 # Required to build with the changes made to the Android ML framework starting from Android P,
 # regardless of the HAL version used for the build.
 LOCAL_CFLAGS+= \
@@ -78,18 +84,32 @@
         libutils \
         android.hardware.neuralnetworks@1.0 \
         android.hidl.allocator@1.0 \
-        android.hidl.memory@1.0 \
-        libOpenCL
-ifeq ($(PLATFORM_VERSION),9)
+        android.hidl.memory@1.0
+
+ifeq ($(P_OR_LATER),1)
 # Required to build the 1.0 version of the NN Driver on Android P and later versions,
 # as the 1.0 version of the NN API needs the 1.1 HAL headers to be included regardless.
 LOCAL_SHARED_LIBRARIES+= \
         android.hardware.neuralnetworks@1.1
 endif # PLATFORM_VERSION == 9
 
+ifeq ($(Q_OR_LATER),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libnativewindow \
+        libui \
+        libfmq \
+        libcutils \
+        android.hardware.neuralnetworks@1.2
+endif # PLATFORM_VERSION == Q
+
+ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libOpenCL
+endif
+
 include $(BUILD_EXECUTABLE)
 
-ifeq ($(PLATFORM_VERSION),9)
+ifeq ($(P_OR_LATER),1)
 # The following target is available starting from Android P
 
 ##########################
@@ -98,7 +118,13 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := armnn-driver-tests@1.1
+ifeq ($(PLATFORM_VERSION),Q)
+# "eng" is deprecated in Android Q
+LOCAL_MODULE_TAGS := optional
+else
 LOCAL_MODULE_TAGS := eng optional
+endif
+#PRODUCT_PACKAGES_ENG := libarmnn
 LOCAL_ARM_MODE := arm
 LOCAL_PROPRIETARY_MODULE := true
 # Mark source files as dependent on Android.mk
@@ -157,8 +183,21 @@
         android.hardware.neuralnetworks@1.0 \
         android.hardware.neuralnetworks@1.1 \
         android.hidl.allocator@1.0 \
-        android.hidl.memory@1.0 \
+        android.hidl.memory@1.0
+
+ifeq ($(Q_OR_LATER),1)
+LOCAL_SHARED_LIBRARIES+= \
+        libnativewindow \
+        libui \
+        libfmq \
+        libcutils \
+        android.hardware.neuralnetworks@1.2
+endif # PLATFORM_VERSION == Q
+
+ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
+LOCAL_SHARED_LIBRARIES+= \
         libOpenCL
+endif
 
 include $(BUILD_EXECUTABLE)