/*
 * 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 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
