Snap for 10447354 from 8814c20857e51230867e2a52f347413cd1364e06 to mainline-wifi-release

Change-Id: Ic79ebd662bce43301c87a1dfab779545fa5c3e69
diff --git a/build_and_run_benchmark.sh b/build_and_run_benchmark.sh
index 4e889ff..19206b0 100755
--- a/build_and_run_benchmark.sh
+++ b/build_and_run_benchmark.sh
@@ -7,9 +7,9 @@
 # which is not logged.
 
 if [[ "$OSTYPE" == "darwin"* ]]; then
-  OPTS="$(getopt f:rbsm:x -- "$*")"
+  OPTS="$(getopt f:rbsm:xn: -- "$*")"
 else
-  OPTS="$(getopt -o f:rbsm:x -l filter-driver:,include-nnapi-reference,nnapi-reference-only,skip-build,use-nnapi-sl,filter-model,extract-nnapi-sl -- "$@")"
+  OPTS="$(getopt -o f:rbsm:xn: -l filter-driver:,include-nnapi-reference,nnapi-reference-only,skip-build,use-nnapi-sl,filter-model,extract-nnapi-sl,nnapi-sl-vendor -- "$@")"
 fi
 
 if [ $? -ne 0 ]; then
@@ -20,6 +20,7 @@
     echo " -b : skip build and installation of tests"
     echo " -s : use NNAPI Support Library drivers (embedded in the benchmark APK unless -x is specified)"
     echo " -x : extract NNAPI Support Library drivers from the APK"
+    echo " -n <nnapi-sl-vendor> : Optional, specify which SL driver vendor is used (qc/mtk/arm), default: qc"
     echo " -m <regex> : to filter the models used in the tests"
   else
     echo " -f <regex> | --filter-driver <regex> : to run crash tests only on the drivers (ignoring nnapi-reference) matching the specified regular expression"
@@ -28,6 +29,7 @@
     echo " -b | --skip-build : skip build and installation of tests"
     echo " -s | --use-nnapi-sl : use NNAPI Support Library drivers (embedded in the benchmark APK unless -x is specified)"
     echo " -x | --extract-nnapi-sl : extract NNAPI Support Library drivers from the APK"
+    echo " -n <nnapi-sl-vendor> : Optional, specify which SL driver vendor is used (qc/mtk/arm), default: qc"
     echo " -m <regex> : to filter the models used in the tests"
   fi
   exit
@@ -75,6 +77,10 @@
       mkdir sl_prebuilt/assets
       ls sl_prebuilt/ 2>/dev/null | grep '.so'  >sl_prebuilt/assets/sl_prebuilt_filelist.txt
       ;;
+    -n|--nnapi-sl-vendor)
+      NNAPI_SL_VENDOR=$2
+      shift 2
+      ;;
     --)
       shift
       break
@@ -172,6 +178,10 @@
       echo "================================================================"
       mv $SL_PREBUILT/Android.bp.template $SL_PREBUILT/Android.bp
     fi
+    if [[ -z "$NNAPI_SL_VENDOR" ]]; then
+      NNAPI_SL_VENDOR="qc"
+    fi
+    NNAPI_SL_FILTER_OPT+=" -e nnApiSupportLibraryVendor $NNAPI_SL_VENDOR"
   fi
 
   # Build and install benchmark app
@@ -272,7 +282,7 @@
   LOGDIR=$(mktemp -d)/mlts-logs
   HOST_CSV=$LOGDIR/benchmark.csv
   RESULT_HTML=$LOGDIR/result.html
-  DEVICE_CSV=/sdcard/mlts_benchmark.csv
+  DEVICE_CSV=/storage/emulated/0/mlts_benchmark.csv
 
   mkdir -p $LOGDIR
   echo Creating logs in $LOGDIR
diff --git a/jni/Android.bp b/jni/Android.bp
index 1dc575c..d24a989 100644
--- a/jni/Android.bp
+++ b/jni/Android.bp
@@ -65,7 +65,6 @@
 
 cc_library {
     name: "librandom_graph_test_jni",
-    defaults: ["neuralnetworks_float16"],
     srcs: [
         "random_graph_test_jni.cpp",
     ],
@@ -124,4 +123,4 @@
     strip: {
         keep_symbols: true,
     },
-}
\ No newline at end of file
+}
diff --git a/jni/run_tflite.cpp b/jni/run_tflite.cpp
index 360a9ca..46d4eec 100644
--- a/jni/run_tflite.cpp
+++ b/jni/run_tflite.cpp
@@ -180,7 +180,7 @@
       }
       mTfliteNnapiDelegate =
           nnApiSl
-              ? std::make_unique<tflite::StatefulNnApiDelegate>(nnApiSl, nnapi_options)
+              ? std::make_unique<tflite::StatefulNnApiDelegate>(nnApiSl->getFL5(), nnapi_options)
               : std::make_unique<tflite::StatefulNnApiDelegate>(nnapi_options);
       int delegationStatus = mTfliteInterpreter->ModifyGraphWithDelegate(mTfliteNnapiDelegate.get());
       *nnapiErrno = mTfliteNnapiDelegate->GetNnApiErrno();
@@ -476,7 +476,7 @@
                             "NNAPI SL is null pointer when running compilation caching benchmark.");
         return false;
       }
-      delegate = std::make_unique<tflite::StatefulNnApiDelegate>(mNnApiSl, nnapi_options);
+      delegate = std::make_unique<tflite::StatefulNnApiDelegate>(mNnApiSl->getFL5(), nnapi_options);
     } else {
       delegate = std::make_unique<tflite::StatefulNnApiDelegate>(nnapi_options);
     }
diff --git a/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java b/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java
index 0bdac1f..83875d6 100644
--- a/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java
+++ b/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java
@@ -166,6 +166,7 @@
             mProcessor.setNnApiAcceleratorName(acceleratorName);
             mProcessor.setUseNnApiSupportLibrary(NNTestBase.shouldUseNnApiSupportLibrary());
             mProcessor.setExtractNnApiSupportLibrary(NNTestBase.shouldExtractNnApiSupportLibrary());
+            mProcessor.setNnApiSupportLibraryVendor(NNTestBase.getNnApiSupportLibraryVendor());
             mTestModelEntry = testModelEntry;
         }
 
diff --git a/src/com/android/nn/benchmark/app/BenchmarkTestBase.java b/src/com/android/nn/benchmark/app/BenchmarkTestBase.java
index 294e439..10c4254 100644
--- a/src/com/android/nn/benchmark/app/BenchmarkTestBase.java
+++ b/src/com/android/nn/benchmark/app/BenchmarkTestBase.java
@@ -95,9 +95,11 @@
         if (useNNApi) {
             final boolean useNnApiSupportLibrary = NNTestBase.shouldUseNnApiSupportLibrary();
             final boolean extractNnApiSupportLibrary = NNTestBase.shouldExtractNnApiSupportLibrary();
+            final String nnApiSupportLibraryVendor = NNTestBase.getNnApiSupportLibraryVendor();
             Log.i(NNBenchmark.TAG, "Configuring usage of NNAPI SL to " + useNnApiSupportLibrary);
             mActivity.setUseNnApiSupportLibrary(useNnApiSupportLibrary);
             mActivity.setExtractNnApiSupportLibrary(extractNnApiSupportLibrary);
+            mActivity.setNnApiSupportLibraryVendor(nnApiSupportLibraryVendor);
         }
     }
 
diff --git a/src/com/android/nn/benchmark/app/NNBenchmark.java b/src/com/android/nn/benchmark/app/NNBenchmark.java
index a0e6f28..93c1ec8 100644
--- a/src/com/android/nn/benchmark/app/NNBenchmark.java
+++ b/src/com/android/nn/benchmark/app/NNBenchmark.java
@@ -50,6 +50,7 @@
 
     private boolean mUseNnApiSupportLibrary = false;
     private boolean mExtractNnApiSupportLibrary = false;
+    private String mNnApiSupportLibraryVendor = "";
 
     private Processor mProcessor;
     private final ExecutorService executorService = Executors.newSingleThreadExecutor();
@@ -85,6 +86,11 @@
         mProcessor.setUseNnApiSupportLibrary(mUseNnApiSupportLibrary);
     }
 
+    public void setNnApiSupportLibraryVendor(String value) {
+        mNnApiSupportLibraryVendor = value;
+        mProcessor.setNnApiSupportLibraryVendor(mNnApiSupportLibraryVendor);
+    }
+
     public void setExtractNnApiSupportLibrary(boolean value) {
         mExtractNnApiSupportLibrary = value;
         mProcessor.setExtractNnApiSupportLibrary(value);
@@ -145,6 +151,7 @@
             mProcessor.setTfLiteBackend(!i.getBooleanExtra(EXTRA_DISABLE_NNAPI, false) ? TfLiteBackend.NNAPI : TfLiteBackend.CPU);
             mProcessor.setMaxRunIterations(i.getIntExtra(EXTRA_MAX_ITERATIONS, 0));
             mProcessor.setUseNnApiSupportLibrary(mUseNnApiSupportLibrary);
+            mProcessor.setNnApiSupportLibraryVendor(mNnApiSupportLibraryVendor);
             mProcessor.setExtractNnApiSupportLibrary(mExtractNnApiSupportLibrary);
             executorService.submit(mProcessor);
         } else {
diff --git a/src/com/android/nn/benchmark/core/BenchmarkException.java b/src/com/android/nn/benchmark/core/BenchmarkException.java
index a4383dd..2149b5e 100644
--- a/src/com/android/nn/benchmark/core/BenchmarkException.java
+++ b/src/com/android/nn/benchmark/core/BenchmarkException.java
@@ -20,4 +20,4 @@
     public BenchmarkException(String message) {
         super(message);
     }
-};
+}
diff --git a/src/com/android/nn/benchmark/core/NNTestBase.java b/src/com/android/nn/benchmark/core/NNTestBase.java
index fe0bddd..6ad84b8 100644
--- a/src/com/android/nn/benchmark/core/NNTestBase.java
+++ b/src/com/android/nn/benchmark/core/NNTestBase.java
@@ -26,6 +26,8 @@
 import android.util.Pair;
 import android.widget.TextView;
 import androidx.test.InstrumentationRegistry;
+import com.android.nn.benchmark.core.sl.ArmSupportLibraryDriverHandler;
+import com.android.nn.benchmark.core.sl.MediaTekSupportLibraryDriverHandler;
 import com.android.nn.benchmark.core.sl.QualcommSupportLibraryDriverHandler;
 import com.android.nn.benchmark.core.sl.SupportLibraryDriverHandler;
 import java.io.BufferedReader;
@@ -38,6 +40,8 @@
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.function.Supplier;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Optional;
 import java.util.Random;
@@ -150,9 +154,11 @@
     // from the library.
     private boolean mUseNnApiSupportLibrary = false;
     private boolean mExtractNnApiSupportLibrary = false;
+    private String mNnApiSupportLibraryVendor = "";
 
     static final String USE_NNAPI_SL_PROPERTY = "useNnApiSupportLibrary";
     static final String EXTRACT_NNAPI_SL_PROPERTY = "extractNnApiSupportLibrary";
+    static final String NNAPI_SL_VENDOR = "nnApiSupportLibraryVendor";
 
     private static boolean getBooleanTestParameter(String key, boolean defaultValue) {
       // All instrumentation arguments are passed as String so I have to convert the value here.
@@ -168,6 +174,10 @@
         return getBooleanTestParameter(EXTRACT_NNAPI_SL_PROPERTY, false);
     }
 
+    public static String getNnApiSupportLibraryVendor() {
+        return InstrumentationRegistry.getArguments().getString(NNAPI_SL_VENDOR);
+    }
+
     public NNTestBase(String modelName, String modelFile, int[] inputShape,
             InferenceInOutSequence.FromAssets[] inputOutputAssets,
             InferenceInOutSequence.FromDataset[] inputOutputDatasets,
@@ -210,6 +220,7 @@
 
     public  void setUseNnApiSupportLibrary(boolean value) {mUseNnApiSupportLibrary = value;}
     public  void setExtractNnApiSupportLibrary(boolean value) {mExtractNnApiSupportLibrary = value;}
+    public  void setNnApiSupportLibraryVendor(String value) {mNnApiSupportLibraryVendor = value;}
 
     public void setNNApiDeviceName(String value) {
         if (mTfLiteBackend != TfLiteBackend.NNAPI) {
@@ -226,9 +237,18 @@
         mContext = ipcxt;
         long nnApiLibHandle = 0;
         if (mUseNnApiSupportLibrary) {
-          // TODO: support different drivers providers maybe with a flag
-          QualcommSupportLibraryDriverHandler qcSlhandler = new QualcommSupportLibraryDriverHandler();
-          nnApiLibHandle = qcSlhandler.getOrLoadNnApiSlHandle(mContext, mExtractNnApiSupportLibrary);
+          HashMap<String, Supplier<SupportLibraryDriverHandler>> vendors = new HashMap<>();
+          vendors.put("qc", () -> new QualcommSupportLibraryDriverHandler());
+          vendors.put("arm", () -> new ArmSupportLibraryDriverHandler());
+          vendors.put("mtk", () -> new MediaTekSupportLibraryDriverHandler());
+          Supplier<SupportLibraryDriverHandler> vendor = vendors.get(mNnApiSupportLibraryVendor);
+          if (vendor == null) {
+              throw new NnApiDelegationFailure(String
+                  .format("NNAPI SL vendor is invalid '%s', expected one of %s.",
+                      mNnApiSupportLibraryVendor, vendors.keySet().toString()));
+          }
+          SupportLibraryDriverHandler slHandler = vendor.get();
+          nnApiLibHandle = slHandler.getOrLoadNnApiSlHandle(mContext, mExtractNnApiSupportLibrary);
           if (nnApiLibHandle == 0) {
             Log.e(TAG, String
                 .format("Unable to find NNAPI SL entry point '%s' in embedded libraries path.",
diff --git a/src/com/android/nn/benchmark/core/Processor.java b/src/com/android/nn/benchmark/core/Processor.java
index 87a4455..1955b26 100644
--- a/src/com/android/nn/benchmark/core/Processor.java
+++ b/src/com/android/nn/benchmark/core/Processor.java
@@ -77,6 +77,7 @@
 
     private boolean mUseNnApiSupportLibrary;
     private boolean mExtractNnApiSupportLibrary;
+    private String mNnApiSupportLibraryVendor;
 
     public Processor(Context context, Processor.Callback callback, int[] testList) {
         mContext = context;
@@ -94,6 +95,7 @@
         mModelFilterRegex = null;
         mUseNnApiSupportLibrary = false;
         mExtractNnApiSupportLibrary = false;
+        mNnApiSupportLibraryVendor = "";
     }
 
     public void setUseNNApi(boolean useNNApi) {
@@ -142,6 +144,7 @@
 
     public void setUseNnApiSupportLibrary(boolean value) { mUseNnApiSupportLibrary = value; }
     public void setExtractNnApiSupportLibrary(boolean value) { mExtractNnApiSupportLibrary = value; }
+    public void setNnApiSupportLibraryVendor(String value) { mNnApiSupportLibraryVendor = value; }
 
     public void enableCompilationCachingBenchmarks(
             float warmupTimeSeconds, float runTimeSeconds, int maxIterations) {
@@ -183,7 +186,8 @@
                 /*enableIntermediateTensorsDump=*/false,
                 /*mmapModel=*/ false,
                 NNTestBase.shouldUseNnApiSupportLibrary(),
-                NNTestBase.shouldExtractNnApiSupportLibrary()
+                NNTestBase.shouldExtractNnApiSupportLibrary(),
+                NNTestBase.getNnApiSupportLibraryVendor()
             )) {
             tb.setNNApiDeviceName(acceleratorName);
             return tb.setupModel(context);
@@ -210,7 +214,7 @@
             oldTestBase.destroy();
         }
         NNTestBase tb = t.createNNTestBase(mBackend, /*enableIntermediateTensorsDump=*/false,
-            mMmapModel, mUseNnApiSupportLibrary, mExtractNnApiSupportLibrary);
+            mMmapModel, mUseNnApiSupportLibrary, mExtractNnApiSupportLibrary, mNnApiSupportLibraryVendor);
         if (mBackend == TfLiteBackend.NNAPI) {
             tb.setNNApiDeviceName(mAcceleratorName);
         }
diff --git a/src/com/android/nn/benchmark/core/TestModels.java b/src/com/android/nn/benchmark/core/TestModels.java
index d91e013..99eac1b 100644
--- a/src/com/android/nn/benchmark/core/TestModels.java
+++ b/src/com/android/nn/benchmark/core/TestModels.java
@@ -82,24 +82,25 @@
 
         public NNTestBase createNNTestBase(TfLiteBackend tfLiteBackend, boolean enableIntermediateTensorsDump) {
             return createNNTestBase(tfLiteBackend, enableIntermediateTensorsDump, /*mmapModel=*/false,
-                /*useNnApiSl=*/false, /*extractNnApiSl=*/false);
+                /*useNnApiSl=*/false, /*extractNnApiSl=*/false, /*nnApiSlVendor=*/"");
         }
 
         // Used by CTS tests.
         public NNTestBase createNNTestBase(boolean useNNAPI, boolean enableIntermediateTensorsDump) {
             TfLiteBackend tfLiteBackend = useNNAPI ? TfLiteBackend.NNAPI : TfLiteBackend.CPU;
             return createNNTestBase(tfLiteBackend, enableIntermediateTensorsDump,
-                /*mmapModel=*/false, /*useNnApiSl=*/false, /*extractNnApiSl=*/false);
+                /*mmapModel=*/false, /*useNnApiSl=*/false, /*extractNnApiSl=*/false, /*nnApiSlVendor=*/"");
         }
 
         public NNTestBase createNNTestBase(TfLiteBackend tfLiteBackend, boolean enableIntermediateTensorsDump,
-                boolean mmapModel, boolean useNnApiSl, boolean extractNnApiSl) {
+                boolean mmapModel, boolean useNnApiSl, boolean extractNnApiSl, String nnApiSlVendor) {
             NNTestBase test = createNNTestBase();
             test.setTfLiteBackend(tfLiteBackend);
             test.enableIntermediateTensorsDump(enableIntermediateTensorsDump);
             test.setMmapModel(mmapModel);
             test.setUseNnApiSupportLibrary(useNnApiSl);
             test.setExtractNnApiSupportLibrary(extractNnApiSl);
+            test.setNnApiSupportLibraryVendor(nnApiSlVendor);
             return test;
         }
 
diff --git a/src/com/android/nn/benchmark/core/UnsupportedSdkException.java b/src/com/android/nn/benchmark/core/UnsupportedSdkException.java
index f232ee2..350431b 100644
--- a/src/com/android/nn/benchmark/core/UnsupportedSdkException.java
+++ b/src/com/android/nn/benchmark/core/UnsupportedSdkException.java
@@ -20,4 +20,4 @@
   public UnsupportedSdkException(String message) {
     super(message);
   }
-};
+}
diff --git a/src/com/android/nn/benchmark/core/sl/ArmSupportLibraryDriverHandler.java b/src/com/android/nn/benchmark/core/sl/ArmSupportLibraryDriverHandler.java
new file mode 100644
index 0000000..a8d2514
--- /dev/null
+++ b/src/com/android/nn/benchmark/core/sl/ArmSupportLibraryDriverHandler.java
@@ -0,0 +1,30 @@
+package com.android.nn.benchmark.core.sl;
+
+import android.content.Context;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.util.Log;
+import java.io.IOException;
+
+public class ArmSupportLibraryDriverHandler extends SupportLibraryDriverHandler {
+  // This environment variable is required by Arm SL driver, and is used to control
+  // different options. It is fully documented in ArmNN repository.
+  private static final String ARM_OPTIONS_VAR = "ARMNN_SL_OPTIONS";
+  // Arm SL Options:
+  // -v : Verbose logging
+  // -c GpuAcc : Use GPU backend (rather than CPU)
+  private static final String ARM_OPTIONS_VAR_VALUE = "-v -c GpuAcc";
+
+  @Override
+  public void prepareDriver(Context context, String nnSupportLibFilePath) throws IOException {
+    Log.i(TAG, "Preparing Arm NNAPI SL");
+    try {
+      Os.setenv(ARM_OPTIONS_VAR, ARM_OPTIONS_VAR_VALUE, /*overwrite=*/true);
+      Log.i(TAG, String.format("Overwritten system env variable %s with %s",
+        ARM_OPTIONS_VAR, ARM_OPTIONS_VAR_VALUE));
+    } catch (ErrnoException errnoException) {
+      throw new IOException(String.format("Unable to overwrite system env variable %s with %s",
+        ARM_OPTIONS_VAR, ARM_OPTIONS_VAR_VALUE), errnoException);
+    }
+  }
+}
diff --git a/src/com/android/nn/benchmark/core/sl/MediaTekSupportLibraryDriverHandler.java b/src/com/android/nn/benchmark/core/sl/MediaTekSupportLibraryDriverHandler.java
new file mode 100644
index 0000000..d4376f8
--- /dev/null
+++ b/src/com/android/nn/benchmark/core/sl/MediaTekSupportLibraryDriverHandler.java
@@ -0,0 +1,10 @@
+package com.android.nn.benchmark.core.sl;
+
+import android.content.Context;
+
+public class MediaTekSupportLibraryDriverHandler extends SupportLibraryDriverHandler {
+  @Override
+  public void prepareDriver(Context context, String nnSupportLibFilePath) {
+    // MediaTek SL driver has no specific preparation needed
+  }
+}
diff --git a/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java b/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java
index 438384a..22d7f16 100644
--- a/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java
+++ b/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java
@@ -96,7 +96,8 @@
                     try (NNTestBase testBase = modelEntry.createNNTestBase(
                             backend, /*enableIntermediateTensorsDump*/true, /*mmapModel*/false,
                         NNTestBase.shouldUseNnApiSupportLibrary(),
-                        NNTestBase.shouldExtractNnApiSupportLibrary())) {
+                        NNTestBase.shouldExtractNnApiSupportLibrary(),
+                        NNTestBase.getNnApiSupportLibraryVendor())) {
                         testBase.setupModel(this);
                         File outputDir = new File(getFilesDir() + "/" + DUMP_DIR +
                                 "/" + modelName, useNNAPIDir);