Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 1 | /* |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 3 | * |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 4 | * This source code is subject to the terms of the BSD 2 Clause License and |
| 5 | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| 6 | * was not distributed with this source code in the LICENSE file, you can |
| 7 | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| 8 | * Media Patent License 1.0 was not distributed with this source code in the |
| 9 | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 10 | */ |
| 11 | |
Tom Finegan | 7a07ece | 2017-02-07 17:14:05 -0800 | [diff] [blame] | 12 | #include "third_party/googletest/src/googletest/include/gtest/gtest.h" |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 13 | |
| 14 | #include "test/function_equivalence_test.h" |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 15 | #include "test/register_state_check.h" |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 16 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 17 | #include "./aom_config.h" |
| 18 | #include "./aom_dsp_rtcd.h" |
| 19 | #include "aom/aom_integer.h" |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 20 | |
| 21 | #define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE) |
| 22 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 23 | using libaom_test::FunctionEquivalenceTest; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 24 | |
| 25 | namespace { |
| 26 | |
| 27 | static const int kIterations = 1000; |
| 28 | static const int kMaskMax = 64; |
| 29 | |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 30 | typedef unsigned int (*ObmcSadF)(const uint8_t *pre, int pre_stride, |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 31 | const int32_t *wsrc, const int32_t *mask); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 32 | typedef libaom_test::FuncParam<ObmcSadF> TestFuncs; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 33 | |
| 34 | //////////////////////////////////////////////////////////////////////////////// |
| 35 | // 8 bit |
| 36 | //////////////////////////////////////////////////////////////////////////////// |
| 37 | |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 38 | class ObmcSadTest : public FunctionEquivalenceTest<ObmcSadF> {}; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 39 | |
| 40 | TEST_P(ObmcSadTest, RandomValues) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 41 | DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 42 | DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); |
| 43 | DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); |
| 44 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 45 | for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 46 | const int pre_stride = rng_(MAX_SB_SIZE + 1); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 47 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 48 | for (int i = 0; i < MAX_SB_SQUARE; ++i) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 49 | pre[i] = rng_.Rand8(); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 50 | wsrc[i] = rng_.Rand8() * rng_(kMaskMax * kMaskMax + 1); |
| 51 | mask[i] = rng_(kMaskMax * kMaskMax + 1); |
| 52 | } |
| 53 | |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 54 | const unsigned int ref_res = params_.ref_func(pre, pre_stride, wsrc, mask); |
| 55 | unsigned int tst_res; |
| 56 | ASM_REGISTER_STATE_CHECK(tst_res = |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 57 | params_.tst_func(pre, pre_stride, wsrc, mask)); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 58 | |
| 59 | ASSERT_EQ(ref_res, tst_res); |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | TEST_P(ObmcSadTest, ExtremeValues) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 64 | DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 65 | DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); |
| 66 | DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); |
| 67 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 68 | for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 69 | const int pre_stride = iter; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 70 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 71 | for (int i = 0; i < MAX_SB_SQUARE; ++i) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 72 | pre[i] = UINT8_MAX; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 73 | wsrc[i] = UINT8_MAX * kMaskMax * kMaskMax; |
| 74 | mask[i] = kMaskMax * kMaskMax; |
| 75 | } |
| 76 | |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 77 | const unsigned int ref_res = params_.ref_func(pre, pre_stride, wsrc, mask); |
| 78 | unsigned int tst_res; |
| 79 | ASM_REGISTER_STATE_CHECK(tst_res = |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 80 | params_.tst_func(pre, pre_stride, wsrc, mask)); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 81 | |
| 82 | ASSERT_EQ(ref_res, tst_res); |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | #if HAVE_SSE4_1 |
| 87 | const ObmcSadTest::ParamType sse4_functions[] = { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 88 | TestFuncs(aom_obmc_sad128x128_c, aom_obmc_sad128x128_sse4_1), |
| 89 | TestFuncs(aom_obmc_sad128x64_c, aom_obmc_sad128x64_sse4_1), |
| 90 | TestFuncs(aom_obmc_sad64x128_c, aom_obmc_sad64x128_sse4_1), |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 91 | TestFuncs(aom_obmc_sad64x64_c, aom_obmc_sad64x64_sse4_1), |
| 92 | TestFuncs(aom_obmc_sad64x32_c, aom_obmc_sad64x32_sse4_1), |
| 93 | TestFuncs(aom_obmc_sad32x64_c, aom_obmc_sad32x64_sse4_1), |
| 94 | TestFuncs(aom_obmc_sad32x32_c, aom_obmc_sad32x32_sse4_1), |
| 95 | TestFuncs(aom_obmc_sad32x16_c, aom_obmc_sad32x16_sse4_1), |
| 96 | TestFuncs(aom_obmc_sad16x32_c, aom_obmc_sad16x32_sse4_1), |
| 97 | TestFuncs(aom_obmc_sad16x16_c, aom_obmc_sad16x16_sse4_1), |
| 98 | TestFuncs(aom_obmc_sad16x8_c, aom_obmc_sad16x8_sse4_1), |
| 99 | TestFuncs(aom_obmc_sad8x16_c, aom_obmc_sad8x16_sse4_1), |
| 100 | TestFuncs(aom_obmc_sad8x8_c, aom_obmc_sad8x8_sse4_1), |
| 101 | TestFuncs(aom_obmc_sad8x4_c, aom_obmc_sad8x4_sse4_1), |
| 102 | TestFuncs(aom_obmc_sad4x8_c, aom_obmc_sad4x8_sse4_1), |
| 103 | TestFuncs(aom_obmc_sad4x4_c, aom_obmc_sad4x4_sse4_1) |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 104 | }; |
| 105 | |
Yaowu Xu | 685039d | 2016-12-07 10:56:39 -0800 | [diff] [blame] | 106 | INSTANTIATE_TEST_CASE_P(SSE4_1, ObmcSadTest, |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 107 | ::testing::ValuesIn(sse4_functions)); |
| 108 | #endif // HAVE_SSE4_1 |
| 109 | |
| 110 | //////////////////////////////////////////////////////////////////////////////// |
| 111 | // High bit-depth |
| 112 | //////////////////////////////////////////////////////////////////////////////// |
| 113 | |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 114 | class ObmcSadHBDTest : public FunctionEquivalenceTest<ObmcSadF> {}; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 115 | |
| 116 | TEST_P(ObmcSadHBDTest, RandomValues) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 117 | DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 118 | DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); |
| 119 | DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); |
| 120 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 121 | for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 122 | const int pre_stride = rng_(MAX_SB_SIZE + 1); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 123 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 124 | for (int i = 0; i < MAX_SB_SQUARE; ++i) { |
| 125 | pre[i] = rng_(1 << 12); |
| 126 | wsrc[i] = rng_(1 << 12) * rng_(kMaskMax * kMaskMax + 1); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 127 | mask[i] = rng_(kMaskMax * kMaskMax + 1); |
| 128 | } |
| 129 | |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 130 | const unsigned int ref_res = |
| 131 | params_.ref_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask); |
| 132 | unsigned int tst_res; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 133 | ASM_REGISTER_STATE_CHECK( |
| 134 | tst_res = |
| 135 | params_.tst_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask)); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 136 | |
| 137 | ASSERT_EQ(ref_res, tst_res); |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | TEST_P(ObmcSadHBDTest, ExtremeValues) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 142 | DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 143 | DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); |
| 144 | DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); |
| 145 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 146 | for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 147 | const int pre_stride = iter; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 148 | |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 149 | for (int i = 0; i < MAX_SB_SQUARE; ++i) { |
Geza Lore | c804e0d | 2016-07-12 13:20:04 +0100 | [diff] [blame] | 150 | pre[i] = (1 << 12) - 1; |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 151 | wsrc[i] = ((1 << 12) - 1) * kMaskMax * kMaskMax; |
| 152 | mask[i] = kMaskMax * kMaskMax; |
| 153 | } |
| 154 | |
Geza Lore | a3f7ddc | 2016-07-12 15:26:36 +0100 | [diff] [blame] | 155 | const unsigned int ref_res = |
| 156 | params_.ref_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask); |
| 157 | unsigned int tst_res; |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 158 | ASM_REGISTER_STATE_CHECK( |
| 159 | tst_res = |
| 160 | params_.tst_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask)); |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 161 | |
| 162 | ASSERT_EQ(ref_res, tst_res); |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | #if HAVE_SSE4_1 |
| 167 | ObmcSadHBDTest::ParamType sse4_functions_hbd[] = { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 168 | TestFuncs(aom_highbd_obmc_sad128x128_c, aom_highbd_obmc_sad128x128_sse4_1), |
| 169 | TestFuncs(aom_highbd_obmc_sad128x64_c, aom_highbd_obmc_sad128x64_sse4_1), |
| 170 | TestFuncs(aom_highbd_obmc_sad64x128_c, aom_highbd_obmc_sad64x128_sse4_1), |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 171 | TestFuncs(aom_highbd_obmc_sad64x64_c, aom_highbd_obmc_sad64x64_sse4_1), |
| 172 | TestFuncs(aom_highbd_obmc_sad64x32_c, aom_highbd_obmc_sad64x32_sse4_1), |
| 173 | TestFuncs(aom_highbd_obmc_sad32x64_c, aom_highbd_obmc_sad32x64_sse4_1), |
| 174 | TestFuncs(aom_highbd_obmc_sad32x32_c, aom_highbd_obmc_sad32x32_sse4_1), |
| 175 | TestFuncs(aom_highbd_obmc_sad32x16_c, aom_highbd_obmc_sad32x16_sse4_1), |
| 176 | TestFuncs(aom_highbd_obmc_sad16x32_c, aom_highbd_obmc_sad16x32_sse4_1), |
| 177 | TestFuncs(aom_highbd_obmc_sad16x16_c, aom_highbd_obmc_sad16x16_sse4_1), |
| 178 | TestFuncs(aom_highbd_obmc_sad16x8_c, aom_highbd_obmc_sad16x8_sse4_1), |
| 179 | TestFuncs(aom_highbd_obmc_sad8x16_c, aom_highbd_obmc_sad8x16_sse4_1), |
| 180 | TestFuncs(aom_highbd_obmc_sad8x8_c, aom_highbd_obmc_sad8x8_sse4_1), |
| 181 | TestFuncs(aom_highbd_obmc_sad8x4_c, aom_highbd_obmc_sad8x4_sse4_1), |
| 182 | TestFuncs(aom_highbd_obmc_sad4x8_c, aom_highbd_obmc_sad4x8_sse4_1), |
| 183 | TestFuncs(aom_highbd_obmc_sad4x4_c, aom_highbd_obmc_sad4x4_sse4_1) |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 184 | }; |
| 185 | |
Yaowu Xu | 685039d | 2016-12-07 10:56:39 -0800 | [diff] [blame] | 186 | INSTANTIATE_TEST_CASE_P(SSE4_1, ObmcSadHBDTest, |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 187 | ::testing::ValuesIn(sse4_functions_hbd)); |
| 188 | #endif // HAVE_SSE4_1 |
Geza Lore | aacdf98 | 2016-07-05 13:36:25 +0100 | [diff] [blame] | 189 | } // namespace |