| // |
| // Copyright © 2020-2021 Arm Ltd. All rights reserved. |
| // SPDX-License-Identifier: MIT |
| // |
| |
| package arm_compute_library_nn_driver |
| |
| import ( |
| "android/soong/android" |
| "android/soong/cc" |
| "strings" |
| ) |
| |
| func isVersionAtLeast(version_name string, target_version int) bool { |
| name_map := map[string]int { |
| "L": 5, "5": 5, |
| "M": 6, "6": 6, |
| "N": 7, "7": 7, |
| "O": 8, "8": 8, |
| "P": 9, "9": 9, |
| "Q": 10, "10": 10, |
| "R": 11, "11": 11, |
| "S": 12, "12": 12, |
| "T": 13, "13": 13, |
| } |
| if _, ok := name_map[version_name]; ok { |
| return name_map[version_name] >= target_version |
| } else { |
| return false |
| } |
| } |
| |
| func globalFlags(ctx android.BaseContext) []string { |
| var cppflags []string |
| |
| if ctx.AConfig().PlatformVersionName() == "Q" || ctx.AConfig().PlatformVersionName() == "10" || |
| ctx.AConfig().PlatformVersionName() == "R" || ctx.AConfig().PlatformVersionName() == "11" || |
| ctx.AConfig().PlatformVersionName() == "S" || ctx.AConfig().PlatformVersionName() == "12" { |
| cppflags = append(cppflags, "-fno-addrsig") |
| } |
| |
| if ctx.AConfig().PlatformVersionName() == "R" || ctx.AConfig().PlatformVersionName() == "11" { |
| for _, a := range ctx.DeviceConfig().Arches() { |
| theArch := a.ArchType.String() |
| if theArch == "armv8-2a" { |
| cppflags = append(cppflags, "-march=armv8.2-a+fp16") |
| cppflags = append(cppflags, "-DARM_COMPUTE_ENABLE_FP16") |
| } |
| } |
| } |
| |
| // Since Android T, the underlying NDK stops supporting system assembler like GAS, in favor of integrated assembler |
| // However for Android < Android T we still want to suppress integrated assembler for backward compatibility |
| if ! isVersionAtLeast(ctx.AConfig().PlatformVersionName(), 13) { |
| cppflags = append(cppflags, "-no-integrated-as") |
| } |
| |
| data_types := strings.Split(ctx.AConfig().GetenvWithDefault("COMPUTE_LIB_DATA_TYPE", "ALL"), ",") |
| |
| for _, x := range data_types { |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "INTEGER" { |
| cppflags = append(cppflags, "-DENABLE_INTEGER_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QASYMM8" { |
| cppflags = append(cppflags, "-DENABLE_QASYMM8_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QASYMM8_SIGNED" { |
| cppflags = append(cppflags, "-DENABLE_QASYMM8_SIGNED_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QASYMM16" { |
| cppflags = append(cppflags, "-DENABLE_QASYMM16_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QSYMM16" { |
| cppflags = append(cppflags, "-DENABLE_QSYMM16_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "FP16" { |
| cppflags = append(cppflags, "-DENABLE_FP16_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "FP32" { |
| cppflags = append(cppflags, "-DENABLE_FP32_KERNELS") |
| } |
| } |
| |
| data_layouts := strings.Split(ctx.AConfig().GetenvWithDefault("COMPUTE_LIB_DATA_LAYOUT", "ALL"), ",") |
| |
| for _, x := range data_layouts { |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "NHWC" { |
| cppflags = append(cppflags, "-DENABLE_NHWC_KERNELS") |
| } |
| if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "NCHW" { |
| cppflags = append(cppflags, "-DENABLE_NCHW_KERNELS") |
| } |
| } |
| |
| cppflags = append(cppflags, "-DARM_COMPUTE_CPU_ENABLED") |
| cppflags = append(cppflags, "-DARM_COMPUTE_OPENCL_ENABLED") |
| |
| return cppflags |
| } |
| |
| func clframeworkNNDriverDefaults(ctx android.LoadHookContext) { |
| type props struct { |
| Cppflags []string |
| } |
| |
| p := &props{} |
| p.Cppflags = globalFlags(ctx) |
| |
| ctx.AppendProperties(p) |
| } |
| |
| func init() { |
| |
| android.RegisterModuleType("arm_compute_library_defaults", clframeworkNNDriverDefaultsFactory) |
| } |
| |
| func clframeworkNNDriverDefaultsFactory() android.Module { |
| |
| module := cc.DefaultsFactory() |
| android.AddLoadHook(module, clframeworkNNDriverDefaults) |
| return module |
| } |