2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
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.
15 #include "third_party/googletest/src/googletest/include/gtest/gtest.h"
16 #include "test/acm_random.h"
17 #include "test/clear_system_state.h"
18 #include "test/register_state_check.h"
19 #include "test/util.h"
21 #include "config/aom_config.h"
22 #include "config/aom_dsp_rtcd.h"
24 #include "aom/aom_integer.h"
26 using libaom_test::ACMRandom
;
29 const int number_of_iterations
= 200;
31 typedef unsigned int (*MaskedSADFunc
)(const uint8_t *src
, int src_stride
,
32 const uint8_t *ref
, int ref_stride
,
33 const uint8_t *second_pred
,
34 const uint8_t *msk
, int msk_stride
,
36 typedef ::testing::tuple
<MaskedSADFunc
, MaskedSADFunc
> MaskedSADParam
;
38 class MaskedSADTest
: public ::testing::TestWithParam
<MaskedSADParam
> {
40 virtual ~MaskedSADTest() {}
41 virtual void SetUp() {
42 maskedSAD_op_
= GET_PARAM(0);
43 ref_maskedSAD_op_
= GET_PARAM(1);
46 virtual void TearDown() { libaom_test::ClearSystemState(); }
47 void runMaskedSADTest(int run_times
);
50 MaskedSADFunc maskedSAD_op_
;
51 MaskedSADFunc ref_maskedSAD_op_
;
53 void MaskedSADTest::runMaskedSADTest(int run_times
) {
54 unsigned int ref_ret
= 0, ret
= 1;
55 ACMRandom
rnd(ACMRandom::DeterministicSeed());
56 DECLARE_ALIGNED(16, uint8_t, src_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
57 DECLARE_ALIGNED(16, uint8_t, ref_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
58 DECLARE_ALIGNED(16, uint8_t, second_pred_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
59 DECLARE_ALIGNED(16, uint8_t, msk_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
61 int first_failure
= -1;
62 int src_stride
= MAX_SB_SIZE
;
63 int ref_stride
= MAX_SB_SIZE
;
64 int msk_stride
= MAX_SB_SIZE
;
65 const int iters
= run_times
== 1 ? number_of_iterations
: 1;
66 for (int i
= 0; i
< iters
; ++i
) {
67 for (int j
= 0; j
< MAX_SB_SIZE
* MAX_SB_SIZE
; j
++) {
68 src_ptr
[j
] = rnd
.Rand8();
69 ref_ptr
[j
] = rnd
.Rand8();
70 second_pred_ptr
[j
] = rnd
.Rand8();
71 msk_ptr
[j
] = ((rnd
.Rand8() & 0x7f) > 64) ? rnd
.Rand8() & 0x3f : 64;
72 assert(msk_ptr
[j
] <= 64);
75 for (int invert_mask
= 0; invert_mask
< 2; ++invert_mask
) {
77 aom_usec_timer_start(&timer
);
78 for (int repeat
= 0; repeat
< run_times
; ++repeat
) {
79 ref_ret
= ref_maskedSAD_op_(src_ptr
, src_stride
, ref_ptr
, ref_stride
,
80 second_pred_ptr
, msk_ptr
, msk_stride
,
83 aom_usec_timer_mark(&timer
);
84 const double time1
= static_cast<double>(aom_usec_timer_elapsed(&timer
));
85 aom_usec_timer_start(&timer
);
87 ASM_REGISTER_STATE_CHECK(ret
= maskedSAD_op_(src_ptr
, src_stride
,
89 second_pred_ptr
, msk_ptr
,
90 msk_stride
, invert_mask
));
92 for (int repeat
= 0; repeat
< run_times
; ++repeat
) {
94 maskedSAD_op_(src_ptr
, src_stride
, ref_ptr
, ref_stride
,
95 second_pred_ptr
, msk_ptr
, msk_stride
, invert_mask
);
98 aom_usec_timer_mark(&timer
);
99 const double time2
= static_cast<double>(aom_usec_timer_elapsed(&timer
));
100 if (run_times
> 10) {
101 printf("%7.2f/%7.2fns", time1
, time2
);
102 printf("(%3.2f)\n", time1
/ time2
);
104 if (ret
!= ref_ret
) {
106 if (first_failure
== -1) first_failure
= i
;
110 EXPECT_EQ(0, err_count
) << "Error: Masked SAD Test, output doesn't match. "
111 << "First failed at test case " << first_failure
;
114 TEST_P(MaskedSADTest
, OperationCheck
) { runMaskedSADTest(1); }
116 TEST_P(MaskedSADTest
, DISABLED_Speed
) { runMaskedSADTest(2000000); }
118 typedef unsigned int (*HighbdMaskedSADFunc
)(const uint8_t *src
, int src_stride
,
119 const uint8_t *ref
, int ref_stride
,
120 const uint8_t *second_pred
,
121 const uint8_t *msk
, int msk_stride
,
123 typedef ::testing::tuple
<HighbdMaskedSADFunc
, HighbdMaskedSADFunc
>
124 HighbdMaskedSADParam
;
126 class HighbdMaskedSADTest
127 : public ::testing::TestWithParam
<HighbdMaskedSADParam
> {
129 virtual ~HighbdMaskedSADTest() {}
130 virtual void SetUp() {
131 maskedSAD_op_
= GET_PARAM(0);
132 ref_maskedSAD_op_
= GET_PARAM(1);
135 virtual void TearDown() { libaom_test::ClearSystemState(); }
136 void runHighbdMaskedSADTest(int run_times
);
139 HighbdMaskedSADFunc maskedSAD_op_
;
140 HighbdMaskedSADFunc ref_maskedSAD_op_
;
142 void HighbdMaskedSADTest::runHighbdMaskedSADTest(int run_times
) {
143 unsigned int ref_ret
= 0, ret
= 1;
144 ACMRandom
rnd(ACMRandom::DeterministicSeed());
145 DECLARE_ALIGNED(16, uint16_t, src_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
146 DECLARE_ALIGNED(16, uint16_t, ref_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
147 DECLARE_ALIGNED(16, uint16_t, second_pred_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
148 DECLARE_ALIGNED(16, uint8_t, msk_ptr
[MAX_SB_SIZE
* MAX_SB_SIZE
]);
149 uint8_t *src8_ptr
= CONVERT_TO_BYTEPTR(src_ptr
);
150 uint8_t *ref8_ptr
= CONVERT_TO_BYTEPTR(ref_ptr
);
151 uint8_t *second_pred8_ptr
= CONVERT_TO_BYTEPTR(second_pred_ptr
);
153 int first_failure
= -1;
154 int src_stride
= MAX_SB_SIZE
;
155 int ref_stride
= MAX_SB_SIZE
;
156 int msk_stride
= MAX_SB_SIZE
;
157 const int iters
= run_times
== 1 ? number_of_iterations
: 1;
158 for (int i
= 0; i
< iters
; ++i
) {
159 for (int j
= 0; j
< MAX_SB_SIZE
* MAX_SB_SIZE
; j
++) {
160 src_ptr
[j
] = rnd
.Rand16() & 0xfff;
161 ref_ptr
[j
] = rnd
.Rand16() & 0xfff;
162 second_pred_ptr
[j
] = rnd
.Rand16() & 0xfff;
163 msk_ptr
[j
] = ((rnd
.Rand8() & 0x7f) > 64) ? rnd
.Rand8() & 0x3f : 64;
166 for (int invert_mask
= 0; invert_mask
< 2; ++invert_mask
) {
167 aom_usec_timer timer
;
168 aom_usec_timer_start(&timer
);
169 for (int repeat
= 0; repeat
< run_times
; ++repeat
) {
170 ref_ret
= ref_maskedSAD_op_(src8_ptr
, src_stride
, ref8_ptr
, ref_stride
,
171 second_pred8_ptr
, msk_ptr
, msk_stride
,
174 aom_usec_timer_mark(&timer
);
175 const double time1
= static_cast<double>(aom_usec_timer_elapsed(&timer
));
176 aom_usec_timer_start(&timer
);
177 if (run_times
== 1) {
178 ASM_REGISTER_STATE_CHECK(ret
= maskedSAD_op_(src8_ptr
, src_stride
,
179 ref8_ptr
, ref_stride
,
180 second_pred8_ptr
, msk_ptr
,
181 msk_stride
, invert_mask
));
183 for (int repeat
= 0; repeat
< run_times
; ++repeat
) {
185 maskedSAD_op_(src8_ptr
, src_stride
, ref8_ptr
, ref_stride
,
186 second_pred8_ptr
, msk_ptr
, msk_stride
, invert_mask
);
189 aom_usec_timer_mark(&timer
);
190 const double time2
= static_cast<double>(aom_usec_timer_elapsed(&timer
));
191 if (run_times
> 10) {
192 printf("%7.2f/%7.2fns", time1
, time2
);
193 printf("(%3.2f)\n", time1
/ time2
);
195 if (ret
!= ref_ret
) {
197 if (first_failure
== -1) first_failure
= i
;
201 EXPECT_EQ(0, err_count
)
202 << "Error: High BD Masked SAD Test, output doesn't match. "
203 << "First failed at test case " << first_failure
;
206 TEST_P(HighbdMaskedSADTest
, OperationCheck
) { runHighbdMaskedSADTest(1); }
208 TEST_P(HighbdMaskedSADTest
, DISABLED_Speed
) { runHighbdMaskedSADTest(1000000); }
210 using ::testing::make_tuple
;
213 const MaskedSADParam msad_test
[] = {
214 make_tuple(&aom_masked_sad4x4_ssse3
, &aom_masked_sad4x4_c
),
215 make_tuple(&aom_masked_sad4x8_ssse3
, &aom_masked_sad4x8_c
),
216 make_tuple(&aom_masked_sad8x4_ssse3
, &aom_masked_sad8x4_c
),
217 make_tuple(&aom_masked_sad8x8_ssse3
, &aom_masked_sad8x8_c
),
218 make_tuple(&aom_masked_sad8x16_ssse3
, &aom_masked_sad8x16_c
),
219 make_tuple(&aom_masked_sad16x8_ssse3
, &aom_masked_sad16x8_c
),
220 make_tuple(&aom_masked_sad16x16_ssse3
, &aom_masked_sad16x16_c
),
221 make_tuple(&aom_masked_sad16x32_ssse3
, &aom_masked_sad16x32_c
),
222 make_tuple(&aom_masked_sad32x16_ssse3
, &aom_masked_sad32x16_c
),
223 make_tuple(&aom_masked_sad32x32_ssse3
, &aom_masked_sad32x32_c
),
224 make_tuple(&aom_masked_sad32x64_ssse3
, &aom_masked_sad32x64_c
),
225 make_tuple(&aom_masked_sad64x32_ssse3
, &aom_masked_sad64x32_c
),
226 make_tuple(&aom_masked_sad64x64_ssse3
, &aom_masked_sad64x64_c
),
227 make_tuple(&aom_masked_sad64x128_ssse3
, &aom_masked_sad64x128_c
),
228 make_tuple(&aom_masked_sad128x64_ssse3
, &aom_masked_sad128x64_c
),
229 make_tuple(&aom_masked_sad128x128_ssse3
, &aom_masked_sad128x128_c
),
230 make_tuple(&aom_masked_sad4x16_ssse3
, &aom_masked_sad4x16_c
),
231 make_tuple(&aom_masked_sad16x4_ssse3
, &aom_masked_sad16x4_c
),
232 make_tuple(&aom_masked_sad8x32_ssse3
, &aom_masked_sad8x32_c
),
233 make_tuple(&aom_masked_sad32x8_ssse3
, &aom_masked_sad32x8_c
),
234 make_tuple(&aom_masked_sad16x64_ssse3
, &aom_masked_sad16x64_c
),
235 make_tuple(&aom_masked_sad64x16_ssse3
, &aom_masked_sad64x16_c
),
238 INSTANTIATE_TEST_CASE_P(SSSE3
, MaskedSADTest
, ::testing::ValuesIn(msad_test
));
240 const HighbdMaskedSADParam hbd_msad_test
[] = {
241 make_tuple(&aom_highbd_masked_sad4x4_ssse3
, &aom_highbd_masked_sad4x4_c
),
242 make_tuple(&aom_highbd_masked_sad4x8_ssse3
, &aom_highbd_masked_sad4x8_c
),
243 make_tuple(&aom_highbd_masked_sad8x4_ssse3
, &aom_highbd_masked_sad8x4_c
),
244 make_tuple(&aom_highbd_masked_sad8x8_ssse3
, &aom_highbd_masked_sad8x8_c
),
245 make_tuple(&aom_highbd_masked_sad8x16_ssse3
, &aom_highbd_masked_sad8x16_c
),
246 make_tuple(&aom_highbd_masked_sad16x8_ssse3
, &aom_highbd_masked_sad16x8_c
),
247 make_tuple(&aom_highbd_masked_sad16x16_ssse3
, &aom_highbd_masked_sad16x16_c
),
248 make_tuple(&aom_highbd_masked_sad16x32_ssse3
, &aom_highbd_masked_sad16x32_c
),
249 make_tuple(&aom_highbd_masked_sad32x16_ssse3
, &aom_highbd_masked_sad32x16_c
),
250 make_tuple(&aom_highbd_masked_sad32x32_ssse3
, &aom_highbd_masked_sad32x32_c
),
251 make_tuple(&aom_highbd_masked_sad32x64_ssse3
, &aom_highbd_masked_sad32x64_c
),
252 make_tuple(&aom_highbd_masked_sad64x32_ssse3
, &aom_highbd_masked_sad64x32_c
),
253 make_tuple(&aom_highbd_masked_sad64x64_ssse3
, &aom_highbd_masked_sad64x64_c
),
254 make_tuple(&aom_highbd_masked_sad64x128_ssse3
,
255 &aom_highbd_masked_sad64x128_c
),
256 make_tuple(&aom_highbd_masked_sad128x64_ssse3
,
257 &aom_highbd_masked_sad128x64_c
),
258 make_tuple(&aom_highbd_masked_sad128x128_ssse3
,
259 &aom_highbd_masked_sad128x128_c
),
260 make_tuple(&aom_highbd_masked_sad4x16_ssse3
, &aom_highbd_masked_sad4x16_c
),
261 make_tuple(&aom_highbd_masked_sad16x4_ssse3
, &aom_highbd_masked_sad16x4_c
),
262 make_tuple(&aom_highbd_masked_sad8x32_ssse3
, &aom_highbd_masked_sad8x32_c
),
263 make_tuple(&aom_highbd_masked_sad32x8_ssse3
, &aom_highbd_masked_sad32x8_c
),
264 make_tuple(&aom_highbd_masked_sad16x64_ssse3
, &aom_highbd_masked_sad16x64_c
),
265 make_tuple(&aom_highbd_masked_sad64x16_ssse3
, &aom_highbd_masked_sad64x16_c
),
268 INSTANTIATE_TEST_CASE_P(SSSE3
, HighbdMaskedSADTest
,
269 ::testing::ValuesIn(hbd_msad_test
));
273 const MaskedSADParam msad_avx2_test
[] = {
274 make_tuple(&aom_masked_sad4x4_avx2
, &aom_masked_sad4x4_ssse3
),
275 make_tuple(&aom_masked_sad4x8_avx2
, &aom_masked_sad4x8_ssse3
),
276 make_tuple(&aom_masked_sad8x4_avx2
, &aom_masked_sad8x4_ssse3
),
277 make_tuple(&aom_masked_sad8x8_avx2
, &aom_masked_sad8x8_ssse3
),
278 make_tuple(&aom_masked_sad8x16_avx2
, &aom_masked_sad8x16_ssse3
),
279 make_tuple(&aom_masked_sad16x8_avx2
, &aom_masked_sad16x8_ssse3
),
280 make_tuple(&aom_masked_sad16x16_avx2
, &aom_masked_sad16x16_ssse3
),
281 make_tuple(&aom_masked_sad16x32_avx2
, &aom_masked_sad16x32_ssse3
),
282 make_tuple(&aom_masked_sad32x16_avx2
, &aom_masked_sad32x16_ssse3
),
283 make_tuple(&aom_masked_sad32x32_avx2
, &aom_masked_sad32x32_ssse3
),
284 make_tuple(&aom_masked_sad32x64_avx2
, &aom_masked_sad32x64_ssse3
),
285 make_tuple(&aom_masked_sad64x32_avx2
, &aom_masked_sad64x32_ssse3
),
286 make_tuple(&aom_masked_sad64x64_avx2
, &aom_masked_sad64x64_ssse3
),
287 make_tuple(&aom_masked_sad64x128_avx2
, &aom_masked_sad64x128_ssse3
),
288 make_tuple(&aom_masked_sad128x64_avx2
, &aom_masked_sad128x64_ssse3
),
289 make_tuple(&aom_masked_sad128x128_avx2
, &aom_masked_sad128x128_ssse3
),
290 make_tuple(&aom_masked_sad4x16_avx2
, &aom_masked_sad4x16_ssse3
),
291 make_tuple(&aom_masked_sad16x4_avx2
, &aom_masked_sad16x4_ssse3
),
292 make_tuple(&aom_masked_sad8x32_avx2
, &aom_masked_sad8x32_ssse3
),
293 make_tuple(&aom_masked_sad32x8_avx2
, &aom_masked_sad32x8_ssse3
),
294 make_tuple(&aom_masked_sad16x64_avx2
, &aom_masked_sad16x64_ssse3
),
295 make_tuple(&aom_masked_sad64x16_avx2
, &aom_masked_sad64x16_ssse3
)
298 INSTANTIATE_TEST_CASE_P(AVX2
, MaskedSADTest
,
299 ::testing::ValuesIn(msad_avx2_test
));
301 const HighbdMaskedSADParam hbd_msad_avx2_test
[] = {
302 make_tuple(&aom_highbd_masked_sad4x4_avx2
, &aom_highbd_masked_sad4x4_ssse3
),
303 make_tuple(&aom_highbd_masked_sad4x8_avx2
, &aom_highbd_masked_sad4x8_ssse3
),
304 make_tuple(&aom_highbd_masked_sad8x4_avx2
, &aom_highbd_masked_sad8x4_ssse3
),
305 make_tuple(&aom_highbd_masked_sad8x8_avx2
, &aom_highbd_masked_sad8x8_ssse3
),
306 make_tuple(&aom_highbd_masked_sad8x16_avx2
, &aom_highbd_masked_sad8x16_ssse3
),
307 make_tuple(&aom_highbd_masked_sad16x8_avx2
, &aom_highbd_masked_sad16x8_ssse3
),
308 make_tuple(&aom_highbd_masked_sad16x16_avx2
,
309 &aom_highbd_masked_sad16x16_ssse3
),
310 make_tuple(&aom_highbd_masked_sad16x32_avx2
,
311 &aom_highbd_masked_sad16x32_ssse3
),
312 make_tuple(&aom_highbd_masked_sad32x16_avx2
,
313 &aom_highbd_masked_sad32x16_ssse3
),
314 make_tuple(&aom_highbd_masked_sad32x32_avx2
,
315 &aom_highbd_masked_sad32x32_ssse3
),
316 make_tuple(&aom_highbd_masked_sad32x64_avx2
,
317 &aom_highbd_masked_sad32x64_ssse3
),
318 make_tuple(&aom_highbd_masked_sad64x32_avx2
,
319 &aom_highbd_masked_sad64x32_ssse3
),
320 make_tuple(&aom_highbd_masked_sad64x64_avx2
,
321 &aom_highbd_masked_sad64x64_ssse3
),
322 make_tuple(&aom_highbd_masked_sad64x128_avx2
,
323 &aom_highbd_masked_sad64x128_ssse3
),
324 make_tuple(&aom_highbd_masked_sad128x64_avx2
,
325 &aom_highbd_masked_sad128x64_ssse3
),
326 make_tuple(&aom_highbd_masked_sad128x128_avx2
,
327 &aom_highbd_masked_sad128x128_ssse3
),
328 make_tuple(&aom_highbd_masked_sad4x16_avx2
, &aom_highbd_masked_sad4x16_ssse3
),
329 make_tuple(&aom_highbd_masked_sad16x4_avx2
, &aom_highbd_masked_sad16x4_ssse3
),
330 make_tuple(&aom_highbd_masked_sad8x32_avx2
, &aom_highbd_masked_sad8x32_ssse3
),
331 make_tuple(&aom_highbd_masked_sad32x8_avx2
, &aom_highbd_masked_sad32x8_ssse3
),
332 make_tuple(&aom_highbd_masked_sad16x64_avx2
,
333 &aom_highbd_masked_sad16x64_ssse3
),
334 make_tuple(&aom_highbd_masked_sad64x16_avx2
,
335 &aom_highbd_masked_sad64x16_ssse3
)
338 INSTANTIATE_TEST_CASE_P(AVX2
, HighbdMaskedSADTest
,
339 ::testing::ValuesIn(hbd_msad_avx2_test
));