| Index: source/libvpx/test/lpf_8_test.cc
|
| ===================================================================
|
| --- source/libvpx/test/lpf_8_test.cc (revision 293588)
|
| +++ source/libvpx/test/lpf_8_test.cc (working copy)
|
| @@ -21,6 +21,7 @@
|
| #include "./vpx_config.h"
|
| #include "./vp9_rtcd.h"
|
| #include "vp9/common/vp9_entropy.h"
|
| +#include "vp9/common/vp9_loopfilter.h"
|
| #include "vpx/vpx_integer.h"
|
|
|
| using libvpx_test::ACMRandom;
|
| @@ -106,6 +107,36 @@
|
| #endif // CONFIG_VP9_HIGHBITDEPTH
|
| #endif // HAVE_SSE2
|
|
|
| +#if HAVE_NEON_ASM
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| +// No neon high bitdepth functions.
|
| +#else
|
| +void wrapper_vertical_16_neon(uint8_t *s, int p, const uint8_t *blimit,
|
| + const uint8_t *limit, const uint8_t *thresh,
|
| + int count) {
|
| + vp9_lpf_vertical_16_neon(s, p, blimit, limit, thresh);
|
| +}
|
| +
|
| +void wrapper_vertical_16_c(uint8_t *s, int p, const uint8_t *blimit,
|
| + const uint8_t *limit, const uint8_t *thresh,
|
| + int count) {
|
| + vp9_lpf_vertical_16_c(s, p, blimit, limit, thresh);
|
| +}
|
| +
|
| +void wrapper_vertical_16_dual_neon(uint8_t *s, int p, const uint8_t *blimit,
|
| + const uint8_t *limit, const uint8_t *thresh,
|
| + int count) {
|
| + vp9_lpf_vertical_16_dual_neon(s, p, blimit, limit, thresh);
|
| +}
|
| +
|
| +void wrapper_vertical_16_dual_c(uint8_t *s, int p, const uint8_t *blimit,
|
| + const uint8_t *limit, const uint8_t *thresh,
|
| + int count) {
|
| + vp9_lpf_vertical_16_dual_c(s, p, blimit, limit, thresh);
|
| +}
|
| +#endif // CONFIG_VP9_HIGHBITDEPTH
|
| +#endif // HAVE_NEON_ASM
|
| +
|
| class Loop8Test6Param : public ::testing::TestWithParam<loop8_param_t> {
|
| public:
|
| virtual ~Loop8Test6Param() {}
|
| @@ -159,12 +190,12 @@
|
| int first_failure = -1;
|
| for (int i = 0; i < count_test_block; ++i) {
|
| int err_count = 0;
|
| - uint8_t tmp = rnd.Rand8();
|
| + uint8_t tmp = static_cast<uint8_t>(rnd(3 * MAX_LOOP_FILTER + 4));
|
| DECLARE_ALIGNED(16, const uint8_t, blimit[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(MAX_LOOP_FILTER));
|
| DECLARE_ALIGNED(16, const uint8_t, limit[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| @@ -243,14 +274,27 @@
|
| #endif // CONFIG_VP9_HIGHBITDEPTH
|
| int err_count_total = 0;
|
| int first_failure = -1;
|
| +
|
| + // NOTE: The code in vp9_loopfilter.c:update_sharpness computes mblim as a
|
| + // function of sharpness_lvl and the loopfilter lvl as:
|
| + // block_inside_limit = lvl >> ((sharpness_lvl > 0) + (sharpness_lvl > 4));
|
| + // ...
|
| + // vpx_memset(lfi->lfthr[lvl].mblim, (2 * (lvl + 2) + block_inside_limit),
|
| + // SIMD_WIDTH);
|
| + // This means that the largest value for mblim will occur when sharpness_lvl
|
| + // is equal to 0, and lvl is equal to its greatest value (MAX_LOOP_FILTER).
|
| + // In this case block_inside_limit will be equal to MAX_LOOP_FILTER and
|
| + // therefore mblim will be equal to (2 * (lvl + 2) + block_inside_limit) =
|
| + // 2 * (MAX_LOOP_FILTER + 2) + MAX_LOOP_FILTER = 3 * MAX_LOOP_FILTER + 4
|
| +
|
| for (int i = 0; i < count_test_block; ++i) {
|
| int err_count = 0;
|
| - uint8_t tmp = rnd.Rand8();
|
| + uint8_t tmp = static_cast<uint8_t>(rnd(3 * MAX_LOOP_FILTER + 4));
|
| DECLARE_ALIGNED(16, const uint8_t, blimit[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(MAX_LOOP_FILTER));
|
| DECLARE_ALIGNED(16, const uint8_t, limit[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| @@ -304,12 +348,12 @@
|
| int first_failure = -1;
|
| for (int i = 0; i < count_test_block; ++i) {
|
| int err_count = 0;
|
| - uint8_t tmp = rnd.Rand8();
|
| + uint8_t tmp = static_cast<uint8_t>(rnd(3 * MAX_LOOP_FILTER + 4));
|
| DECLARE_ALIGNED(16, const uint8_t, blimit0[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(MAX_LOOP_FILTER));
|
| DECLARE_ALIGNED(16, const uint8_t, limit0[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| @@ -319,12 +363,12 @@
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(3 * MAX_LOOP_FILTER + 4));
|
| DECLARE_ALIGNED(16, const uint8_t, blimit1[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(MAX_LOOP_FILTER));
|
| DECLARE_ALIGNED(16, const uint8_t, limit1[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| @@ -406,12 +450,12 @@
|
| int first_failure = -1;
|
| for (int i = 0; i < count_test_block; ++i) {
|
| int err_count = 0;
|
| - uint8_t tmp = rnd.Rand8();
|
| + uint8_t tmp = static_cast<uint8_t>(rnd(3 * MAX_LOOP_FILTER + 4));
|
| DECLARE_ALIGNED(16, const uint8_t, blimit0[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(MAX_LOOP_FILTER));
|
| DECLARE_ALIGNED(16, const uint8_t, limit0[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| @@ -421,12 +465,12 @@
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(3 * MAX_LOOP_FILTER + 4));
|
| DECLARE_ALIGNED(16, const uint8_t, blimit1[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| };
|
| - tmp = rnd.Rand8();
|
| + tmp = static_cast<uint8_t>(rnd(MAX_LOOP_FILTER));
|
| DECLARE_ALIGNED(16, const uint8_t, limit1[16]) = {
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp,
|
| tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp
|
| @@ -519,10 +563,8 @@
|
| make_tuple(&wrapper_vertical_16_dual_sse2,
|
| &wrapper_vertical_16_dual_c, 12)));
|
| #else
|
| -// TODO(peter.derivaz): re-enable after these handle the expanded range [0, 255]
|
| -// returned from Rand8().
|
| INSTANTIATE_TEST_CASE_P(
|
| - DISABLED_SSE2, Loop8Test6Param,
|
| + SSE2, Loop8Test6Param,
|
| ::testing::Values(
|
| make_tuple(&vp9_lpf_horizontal_8_sse2, &vp9_lpf_horizontal_8_c, 8),
|
| make_tuple(&vp9_lpf_horizontal_16_sse2, &vp9_lpf_horizontal_16_c, 8),
|
| @@ -532,10 +574,8 @@
|
| #endif
|
|
|
| #if HAVE_AVX2 && (!CONFIG_VP9_HIGHBITDEPTH)
|
| -// TODO(peter.derivaz): re-enable after these handle the expanded range [0, 255]
|
| -// returned from Rand8().
|
| INSTANTIATE_TEST_CASE_P(
|
| - DISABLED_AVX2, Loop8Test6Param,
|
| + AVX2, Loop8Test6Param,
|
| ::testing::Values(
|
| make_tuple(&vp9_lpf_horizontal_16_avx2, &vp9_lpf_horizontal_16_c, 8)));
|
| #endif
|
| @@ -570,10 +610,8 @@
|
| make_tuple(&vp9_highbd_lpf_vertical_8_dual_sse2,
|
| &vp9_highbd_lpf_vertical_8_dual_c, 12)));
|
| #else
|
| -// TODO(peter.derivaz): re-enable after these handle the expanded range [0, 255]
|
| -// returned from Rand8().
|
| INSTANTIATE_TEST_CASE_P(
|
| - DISABLED_SSE2, Loop8Test9Param,
|
| + SSE2, Loop8Test9Param,
|
| ::testing::Values(
|
| make_tuple(&vp9_lpf_horizontal_4_dual_sse2,
|
| &vp9_lpf_horizontal_4_dual_c, 8),
|
| @@ -586,4 +624,45 @@
|
| #endif // CONFIG_VP9_HIGHBITDEPTH
|
| #endif
|
|
|
| +#if HAVE_NEON
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| +// No neon high bitdepth functions.
|
| +#else
|
| +INSTANTIATE_TEST_CASE_P(
|
| + NEON, Loop8Test6Param,
|
| + ::testing::Values(
|
| +#if HAVE_NEON_ASM
|
| +// Using #if inside the macro is unsupported on MSVS but the tests are not
|
| +// currently built for MSVS with ARM and NEON.
|
| + make_tuple(&vp9_lpf_horizontal_16_neon,
|
| + &vp9_lpf_horizontal_16_c, 8),
|
| + make_tuple(&wrapper_vertical_16_neon,
|
| + &wrapper_vertical_16_c, 8),
|
| + make_tuple(&wrapper_vertical_16_dual_neon,
|
| + &wrapper_vertical_16_dual_c, 8),
|
| + make_tuple(&vp9_lpf_horizontal_8_neon,
|
| + &vp9_lpf_horizontal_8_c, 8),
|
| + make_tuple(&vp9_lpf_vertical_8_neon,
|
| + &vp9_lpf_vertical_8_c, 8),
|
| +#endif // HAVE_NEON_ASM
|
| + make_tuple(&vp9_lpf_horizontal_4_neon,
|
| + &vp9_lpf_horizontal_4_c, 8),
|
| + make_tuple(&vp9_lpf_vertical_4_neon,
|
| + &vp9_lpf_vertical_4_c, 8)));
|
| +INSTANTIATE_TEST_CASE_P(
|
| + NEON, Loop8Test9Param,
|
| + ::testing::Values(
|
| +#if HAVE_NEON_ASM
|
| + make_tuple(&vp9_lpf_horizontal_8_dual_neon,
|
| + &vp9_lpf_horizontal_8_dual_c, 8),
|
| + make_tuple(&vp9_lpf_vertical_8_dual_neon,
|
| + &vp9_lpf_vertical_8_dual_c, 8),
|
| +#endif // HAVE_NEON_ASM
|
| + make_tuple(&vp9_lpf_horizontal_4_dual_neon,
|
| + &vp9_lpf_horizontal_4_dual_c, 8),
|
| + make_tuple(&vp9_lpf_vertical_4_dual_neon,
|
| + &vp9_lpf_vertical_4_dual_c, 8)));
|
| +#endif // CONFIG_VP9_HIGHBITDEPTH
|
| +#endif // HAVE_NEON
|
| +
|
| } // namespace
|
|
|