aboutsummaryrefslogtreecommitdiff
path: root/renderscript-toolkit/src/main/cpp/Utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'renderscript-toolkit/src/main/cpp/Utils.cpp')
-rw-r--r--renderscript-toolkit/src/main/cpp/Utils.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/renderscript-toolkit/src/main/cpp/Utils.cpp b/renderscript-toolkit/src/main/cpp/Utils.cpp
new file mode 100644
index 0000000..f1b33ba
--- /dev/null
+++ b/renderscript-toolkit/src/main/cpp/Utils.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils.h"
+
+#include <cpu-features.h>
+
+#include "RenderScriptToolkit.h"
+
+namespace renderscript {
+
+#define LOG_TAG "renderscript.toolkit.Utils"
+
+bool cpuSupportsSimd() {
+ AndroidCpuFamily family = android_getCpuFamily();
+ uint64_t features = android_getCpuFeatures();
+
+ if (family == ANDROID_CPU_FAMILY_ARM && (features & ANDROID_CPU_ARM_FEATURE_NEON)) {
+ // ALOGI("Arm with Neon");
+ return true;
+ } else if (family == ANDROID_CPU_FAMILY_ARM64 && (features & ANDROID_CPU_ARM64_FEATURE_ASIMD)) {
+ // ALOGI("Arm64 with ASIMD");
+ return true;
+ } else if ((family == ANDROID_CPU_FAMILY_X86 || family == ANDROID_CPU_FAMILY_X86_64) &&
+ (features & ANDROID_CPU_X86_FEATURE_SSSE3)) {
+ // ALOGI("x86* with SSE3");
+ return true;
+ }
+ // ALOGI("Not simd");
+ return false;
+}
+
+#ifdef ANDROID_RENDERSCRIPT_TOOLKIT_VALIDATE
+bool validRestriction(const char* tag, size_t sizeX, size_t sizeY, const Restriction* restriction) {
+ if (restriction == nullptr) {
+ return true;
+ }
+ if (restriction->startX >= sizeX || restriction->endX > sizeX) {
+ ALOGE("%s. sizeX should be greater than restriction->startX and greater or equal to "
+ "restriction->endX. %zu, %zu, and %zu were provided respectively.",
+ tag, sizeX, restriction->startX, restriction->endY);
+ return false;
+ }
+ if (restriction->startY >= sizeY && restriction->endY > sizeY) {
+ ALOGE("%s. sizeY should be greater than restriction->startY and greater or equal to "
+ "restriction->endY. %zu, %zu, and %zu were provided respectively.",
+ tag, sizeY, restriction->startY, restriction->endY);
+ return false;
+ }
+ if (restriction->startX >= restriction->endX) {
+ ALOGE("%s. Restriction startX should be less than endX. "
+ "%zu and %zu were provided respectively.",
+ tag, restriction->startX, restriction->endX);
+ return false;
+ }
+ if (restriction->startY >= restriction->endY) {
+ ALOGE("%s. Restriction startY should be less than endY. "
+ "%zu and %zu were provided respectively.",
+ tag, restriction->startY, restriction->endY);
+ return false;
+ }
+ return true;
+}
+#endif
+
+} // namespace renderscript