/* * 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 #include "RenderScriptToolkit.h" namespace android { 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 } // namespace android