/*
 *  Copyright (c) 2016 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "third_party/googletest/src/include/gtest/gtest.h"
#include "test/acm_random.h"

#include "test/function_equivalence_test.h"
#include "test/register_state_check.h"

#include "./vpx_config.h"
#include "./vpx_dsp_rtcd.h"
#include "vpx/vpx_integer.h"

#define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE)

using libvpx_test::ACMRandom;
using libvpx_test::FunctionEquivalenceTest;

namespace {

static const int kIterations = 1000;
static const int kMaskMax = 64;

typedef unsigned int (*ObmcVarF)(const uint8_t *pre, int pre_stride,
                                 const int32_t *wsrc, const int32_t *mask,
                                 unsigned int *sse);
typedef libvpx_test::FuncParam<ObmcVarF> TestFuncs;

////////////////////////////////////////////////////////////////////////////////
// 8 bit
////////////////////////////////////////////////////////////////////////////////

class ObmcVarianceTest : public FunctionEquivalenceTest<ObmcVarF> {};

TEST_P(ObmcVarianceTest, RandomValues) {
  DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]);

  for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) {
    const int pre_stride = this->rng_(MAX_SB_SIZE + 1);

    for (int i = 0; i < MAX_SB_SQUARE; ++i) {
      pre[i] = this->rng_.Rand8();
      wsrc[i] = this->rng_.Rand8() * this->rng_(kMaskMax * kMaskMax + 1);
      mask[i] = this->rng_(kMaskMax * kMaskMax + 1);
    }

    unsigned int ref_sse, tst_sse;
    const unsigned int ref_res =
        params_.ref_func(pre, pre_stride, wsrc, mask, &ref_sse);
    unsigned int tst_res;
    ASM_REGISTER_STATE_CHECK(
        tst_res = params_.tst_func(pre, pre_stride, wsrc, mask, &tst_sse));

    ASSERT_EQ(ref_res, tst_res);
    ASSERT_EQ(ref_sse, tst_sse);
  }
}

TEST_P(ObmcVarianceTest, ExtremeValues) {
  DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]);

  for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) {
    const int pre_stride = iter;

    for (int i = 0; i < MAX_SB_SQUARE; ++i) {
      pre[i] = UINT8_MAX;
      wsrc[i] = UINT8_MAX * kMaskMax * kMaskMax;
      mask[i] = kMaskMax * kMaskMax;
    }

    unsigned int ref_sse, tst_sse;
    const unsigned int ref_res =
        params_.ref_func(pre, pre_stride, wsrc, mask, &ref_sse);
    unsigned int tst_res;
    ASM_REGISTER_STATE_CHECK(
        tst_res = params_.tst_func(pre, pre_stride, wsrc, mask, &tst_sse));

    ASSERT_EQ(ref_res, tst_res);
    ASSERT_EQ(ref_sse, tst_sse);
  }
}

#if HAVE_SSE4_1
const ObmcVarianceTest::ParamType sse4_functions[] = {
#if CONFIG_EXT_PARTITION
  TestFuncs(vpx_obmc_variance128x128_c, vpx_obmc_variance128x128_sse4_1),
  TestFuncs(vpx_obmc_variance128x64_c, vpx_obmc_variance128x64_sse4_1),
  TestFuncs(vpx_obmc_variance64x128_c, vpx_obmc_variance64x128_sse4_1),
#endif  // CONFIG_EXT_PARTITION
  TestFuncs(vpx_obmc_variance64x64_c, vpx_obmc_variance64x64_sse4_1),
  TestFuncs(vpx_obmc_variance64x32_c, vpx_obmc_variance64x32_sse4_1),
  TestFuncs(vpx_obmc_variance32x64_c, vpx_obmc_variance32x64_sse4_1),
  TestFuncs(vpx_obmc_variance32x32_c, vpx_obmc_variance32x32_sse4_1),
  TestFuncs(vpx_obmc_variance32x16_c, vpx_obmc_variance32x16_sse4_1),
  TestFuncs(vpx_obmc_variance16x32_c, vpx_obmc_variance16x32_sse4_1),
  TestFuncs(vpx_obmc_variance16x16_c, vpx_obmc_variance16x16_sse4_1),
  TestFuncs(vpx_obmc_variance16x8_c, vpx_obmc_variance16x8_sse4_1),
  TestFuncs(vpx_obmc_variance8x16_c, vpx_obmc_variance8x16_sse4_1),
  TestFuncs(vpx_obmc_variance8x8_c, vpx_obmc_variance8x8_sse4_1),
  TestFuncs(vpx_obmc_variance8x4_c, vpx_obmc_variance8x4_sse4_1),
  TestFuncs(vpx_obmc_variance4x8_c, vpx_obmc_variance4x8_sse4_1),
  TestFuncs(vpx_obmc_variance4x4_c, vpx_obmc_variance4x4_sse4_1)
};

INSTANTIATE_TEST_CASE_P(SSE4_1_C_COMPARE, ObmcVarianceTest,
                        ::testing::ValuesIn(sse4_functions));
#endif  // HAVE_SSE4_1

////////////////////////////////////////////////////////////////////////////////
// High bit-depth
////////////////////////////////////////////////////////////////////////////////

#if CONFIG_VP9_HIGHBITDEPTH
class ObmcVarianceHBDTest : public FunctionEquivalenceTest<ObmcVarF> {};

TEST_P(ObmcVarianceHBDTest, RandomValues) {
  DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]);

  for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) {
    const int pre_stride = this->rng_(MAX_SB_SIZE + 1);

    for (int i = 0; i < MAX_SB_SQUARE; ++i) {
      pre[i] = this->rng_(1 << params_.bit_depth);
      wsrc[i] = this->rng_(1 << params_.bit_depth) *
                this->rng_(kMaskMax * kMaskMax + 1);
      mask[i] = this->rng_(kMaskMax * kMaskMax + 1);
    }

    unsigned int ref_sse, tst_sse;
    const unsigned int ref_res = params_.ref_func(
        CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask, &ref_sse);
    unsigned int tst_res;
    ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(CONVERT_TO_BYTEPTR(pre),
                                                        pre_stride, wsrc, mask,
                                                        &tst_sse));

    ASSERT_EQ(ref_res, tst_res);
    ASSERT_EQ(ref_sse, tst_sse);
  }
}

TEST_P(ObmcVarianceHBDTest, ExtremeValues) {
  DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]);
  DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]);

  for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) {
    const int pre_stride = iter;

    for (int i = 0; i < MAX_SB_SQUARE; ++i) {
      pre[i] = (1 << params_.bit_depth) - 1;
      wsrc[i] = ((1 << params_.bit_depth) - 1) * kMaskMax * kMaskMax;
      mask[i] = kMaskMax * kMaskMax;
    }

    unsigned int ref_sse, tst_sse;
    const unsigned int ref_res = params_.ref_func(
        CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask, &ref_sse);
    unsigned int tst_res;
    ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(CONVERT_TO_BYTEPTR(pre),
                                                        pre_stride, wsrc, mask,
                                                        &tst_sse));

    ASSERT_EQ(ref_res, tst_res);
    ASSERT_EQ(ref_sse, tst_sse);
  }
}

#if HAVE_SSE4_1
ObmcVarianceHBDTest::ParamType sse4_functions_hbd[] = {
#if CONFIG_EXT_PARTITION
  TestFuncs(vpx_highbd_obmc_variance128x128_c,
            vpx_highbd_obmc_variance128x128_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance128x64_c,
            vpx_highbd_obmc_variance128x64_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance64x128_c,
            vpx_highbd_obmc_variance64x128_sse4_1, 8),
#endif  // CONFIG_EXT_PARTITION
  TestFuncs(vpx_highbd_obmc_variance64x64_c,
            vpx_highbd_obmc_variance64x64_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance64x32_c,
            vpx_highbd_obmc_variance64x32_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance32x64_c,
            vpx_highbd_obmc_variance32x64_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance32x32_c,
            vpx_highbd_obmc_variance32x32_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance32x16_c,
            vpx_highbd_obmc_variance32x16_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance16x32_c,
            vpx_highbd_obmc_variance16x32_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance16x16_c,
            vpx_highbd_obmc_variance16x16_sse4_1, 8),
  TestFuncs(vpx_highbd_obmc_variance16x8_c, vpx_highbd_obmc_variance16x8_sse4_1,
            8),
  TestFuncs(vpx_highbd_obmc_variance8x16_c, vpx_highbd_obmc_variance8x16_sse4_1,
            8),
  TestFuncs(vpx_highbd_obmc_variance8x8_c, vpx_highbd_obmc_variance8x8_sse4_1,
            8),
  TestFuncs(vpx_highbd_obmc_variance8x4_c, vpx_highbd_obmc_variance8x4_sse4_1,
            8),
  TestFuncs(vpx_highbd_obmc_variance4x8_c, vpx_highbd_obmc_variance4x8_sse4_1,
            8),
  TestFuncs(vpx_highbd_obmc_variance4x4_c, vpx_highbd_obmc_variance4x4_sse4_1,
            8),
#if CONFIG_EXT_PARTITION
  TestFuncs(vpx_highbd_10_obmc_variance128x128_c,
            vpx_highbd_10_obmc_variance128x128_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance128x64_c,
            vpx_highbd_10_obmc_variance128x64_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance64x128_c,
            vpx_highbd_10_obmc_variance64x128_sse4_1, 10),
#endif  // CONFIG_EXT_PARTITION
  TestFuncs(vpx_highbd_10_obmc_variance64x64_c,
            vpx_highbd_10_obmc_variance64x64_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance64x32_c,
            vpx_highbd_10_obmc_variance64x32_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance32x64_c,
            vpx_highbd_10_obmc_variance32x64_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance32x32_c,
            vpx_highbd_10_obmc_variance32x32_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance32x16_c,
            vpx_highbd_10_obmc_variance32x16_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance16x32_c,
            vpx_highbd_10_obmc_variance16x32_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance16x16_c,
            vpx_highbd_10_obmc_variance16x16_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance16x8_c,
            vpx_highbd_10_obmc_variance16x8_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance8x16_c,
            vpx_highbd_10_obmc_variance8x16_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance8x8_c,
            vpx_highbd_10_obmc_variance8x8_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance8x4_c,
            vpx_highbd_10_obmc_variance8x4_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance4x8_c,
            vpx_highbd_10_obmc_variance4x8_sse4_1, 10),
  TestFuncs(vpx_highbd_10_obmc_variance4x4_c,
            vpx_highbd_10_obmc_variance4x4_sse4_1, 10),
#if CONFIG_EXT_PARTITION
  TestFuncs(vpx_highbd_12_obmc_variance128x128_c,
            vpx_highbd_12_obmc_variance128x128_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance128x64_c,
            vpx_highbd_12_obmc_variance128x64_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance64x128_c,
            vpx_highbd_12_obmc_variance64x128_sse4_1, 12),
#endif  // CONFIG_EXT_PARTITION
  TestFuncs(vpx_highbd_12_obmc_variance64x64_c,
            vpx_highbd_12_obmc_variance64x64_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance64x32_c,
            vpx_highbd_12_obmc_variance64x32_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance32x64_c,
            vpx_highbd_12_obmc_variance32x64_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance32x32_c,
            vpx_highbd_12_obmc_variance32x32_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance32x16_c,
            vpx_highbd_12_obmc_variance32x16_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance16x32_c,
            vpx_highbd_12_obmc_variance16x32_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance16x16_c,
            vpx_highbd_12_obmc_variance16x16_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance16x8_c,
            vpx_highbd_12_obmc_variance16x8_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance8x16_c,
            vpx_highbd_12_obmc_variance8x16_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance8x8_c,
            vpx_highbd_12_obmc_variance8x8_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance8x4_c,
            vpx_highbd_12_obmc_variance8x4_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance4x8_c,
            vpx_highbd_12_obmc_variance4x8_sse4_1, 12),
  TestFuncs(vpx_highbd_12_obmc_variance4x4_c,
            vpx_highbd_12_obmc_variance4x4_sse4_1, 12)
};

INSTANTIATE_TEST_CASE_P(SSE4_1_C_COMPARE, ObmcVarianceHBDTest,
                        ::testing::ValuesIn(sse4_functions_hbd));
#endif  // HAVE_SSE4_1
#endif  // CONFIG_VP9_HIGHBITDEPTH
}  // namespace
