2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #include "./vpx_config.h"
12 #include "./vpx_dsp_rtcd.h"
13 #include "test/acm_random.h"
14 #include "test/bench.h"
15 #include "test/buffer.h"
16 #include "test/clear_system_state.h"
17 #include "test/register_state_check.h"
18 #include "third_party/googletest/src/include/gtest/gtest.h"
19 #include "vpx/vpx_integer.h"
20 #include "vpx_mem/vpx_mem.h"
22 using libvpx_test::ACMRandom;
23 using libvpx_test::Buffer;
25 typedef void (*VpxPostProcDownAndAcrossMbRowFunc)(
26 unsigned char *src_ptr, unsigned char *dst_ptr, int src_pixels_per_line,
27 int dst_pixels_per_line, int cols, unsigned char *flimit, int size);
29 typedef void (*VpxMbPostProcAcrossIpFunc)(unsigned char *src, int pitch,
30 int rows, int cols, int flimit);
32 typedef void (*VpxMbPostProcDownFunc)(unsigned char *dst, int pitch, int rows,
33 int cols, int flimit);
36 // Compute the filter level used in post proc from the loop filter strength
40 x = 50 + (x - 50) * 10 / 8;
44 class VpxPostProcDownAndAcrossMbRowTest
45 : public AbstractBench,
46 public ::testing::TestWithParam<VpxPostProcDownAndAcrossMbRowFunc> {
48 VpxPostProcDownAndAcrossMbRowTest()
49 : mb_post_proc_down_and_across_(GetParam()) {}
50 virtual void TearDown() { libvpx_test::ClearSystemState(); }
55 const VpxPostProcDownAndAcrossMbRowFunc mb_post_proc_down_and_across_;
56 // Size of the underlying data block that will be filtered.
59 Buffer<uint8_t> *src_image_;
60 Buffer<uint8_t> *dst_image_;
64 void VpxPostProcDownAndAcrossMbRowTest::Run() {
65 mb_post_proc_down_and_across_(
66 src_image_->TopLeftPixel(), dst_image_->TopLeftPixel(),
67 src_image_->stride(), dst_image_->stride(), block_width_, flimits_, 16);
70 // Test routine for the VPx post-processing function
71 // vpx_post_proc_down_and_across_mb_row_c.
73 TEST_P(VpxPostProcDownAndAcrossMbRowTest, CheckFilterOutput) {
74 // Size of the underlying data block that will be filtered.
78 // 5-tap filter needs 2 padding rows above and below the block in the input.
79 Buffer<uint8_t> src_image = Buffer<uint8_t>(block_width_, block_height_, 2);
80 ASSERT_TRUE(src_image.Init());
82 // Filter extends output block by 8 samples at left and right edges.
83 // Though the left padding is only 8 bytes, the assembly code tries to
84 // read 16 bytes before the pointer.
85 Buffer<uint8_t> dst_image =
86 Buffer<uint8_t>(block_width_, block_height_, 8, 16, 8, 8);
87 ASSERT_TRUE(dst_image.Init());
89 flimits_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_width_));
90 (void)memset(flimits_, 255, block_width_);
92 // Initialize pixels in the input:
93 // block pixels to value 1,
94 // border pixels to value 10.
95 src_image.SetPadding(10);
98 // Initialize pixels in the output to 99.
101 ASM_REGISTER_STATE_CHECK(mb_post_proc_down_and_across_(
102 src_image.TopLeftPixel(), dst_image.TopLeftPixel(), src_image.stride(),
103 dst_image.stride(), block_width_, flimits_, 16));
105 static const uint8_t kExpectedOutput[] = { 4, 3, 1, 1, 1, 1, 1, 1,
106 1, 1, 1, 1, 1, 1, 3, 4 };
108 uint8_t *pixel_ptr = dst_image.TopLeftPixel();
109 for (int i = 0; i < block_height_; ++i) {
110 for (int j = 0; j < block_width_; ++j) {
111 ASSERT_EQ(kExpectedOutput[i], pixel_ptr[j])
112 << "at (" << i << ", " << j << ")";
114 pixel_ptr += dst_image.stride();
120 TEST_P(VpxPostProcDownAndAcrossMbRowTest, CheckCvsAssembly) {
121 // Size of the underlying data block that will be filtered.
122 // Y blocks are always a multiple of 16 wide and exactly 16 high. U and V
123 // blocks are always a multiple of 8 wide and exactly 8 high.
127 // 5-tap filter needs 2 padding rows above and below the block in the input.
128 // SSE2 reads in blocks of 16. Pad an extra 8 in case the width is not %16.
129 Buffer<uint8_t> src_image =
130 Buffer<uint8_t>(block_width_, block_height_, 2, 2, 10, 2);
131 ASSERT_TRUE(src_image.Init());
133 // Filter extends output block by 8 samples at left and right edges.
134 // Though the left padding is only 8 bytes, there is 'above' padding as well
135 // so when the assembly code tries to read 16 bytes before the pointer it is
137 // SSE2 reads in blocks of 16. Pad an extra 8 in case the width is not %16.
138 Buffer<uint8_t> dst_image =
139 Buffer<uint8_t>(block_width_, block_height_, 8, 8, 16, 8);
140 ASSERT_TRUE(dst_image.Init());
141 Buffer<uint8_t> dst_image_ref =
142 Buffer<uint8_t>(block_width_, block_height_, 8);
143 ASSERT_TRUE(dst_image_ref.Init());
145 // Filter values are set in blocks of 16 for Y and 8 for U/V. Each macroblock
146 // can have a different filter. SSE2 assembly reads flimits in blocks of 16 so
147 // it must be padded out.
148 const int flimits_width = block_width_ % 16 ? block_width_ + 8 : block_width_;
149 flimits_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, flimits_width));
152 rnd.Reset(ACMRandom::DeterministicSeed());
153 // Initialize pixels in the input:
154 // block pixels to random values.
155 // border pixels to value 10.
156 src_image.SetPadding(10);
157 src_image.Set(&rnd, &ACMRandom::Rand8);
159 for (int blocks = 0; blocks < block_width_; blocks += 8) {
160 (void)memset(flimits_, 0, sizeof(*flimits_) * flimits_width);
162 for (int f = 0; f < 255; f++) {
163 (void)memset(flimits_ + blocks, f, sizeof(*flimits_) * 8);
165 dst_image_ref.Set(0);
167 vpx_post_proc_down_and_across_mb_row_c(
168 src_image.TopLeftPixel(), dst_image_ref.TopLeftPixel(),
169 src_image.stride(), dst_image_ref.stride(), block_width_, flimits_,
171 ASM_REGISTER_STATE_CHECK(mb_post_proc_down_and_across_(
172 src_image.TopLeftPixel(), dst_image.TopLeftPixel(),
173 src_image.stride(), dst_image.stride(), block_width_, flimits_,
176 ASSERT_TRUE(dst_image.CheckValues(dst_image_ref));
183 TEST_P(VpxPostProcDownAndAcrossMbRowTest, DISABLED_Speed) {
184 // Size of the underlying data block that will be filtered.
188 // 5-tap filter needs 2 padding rows above and below the block in the input.
189 Buffer<uint8_t> src_image = Buffer<uint8_t>(block_width_, block_height_, 2);
190 ASSERT_TRUE(src_image.Init());
191 this->src_image_ = &src_image;
193 // Filter extends output block by 8 samples at left and right edges.
194 // Though the left padding is only 8 bytes, the assembly code tries to
195 // read 16 bytes before the pointer.
196 Buffer<uint8_t> dst_image =
197 Buffer<uint8_t>(block_width_, block_height_, 8, 16, 8, 8);
198 ASSERT_TRUE(dst_image.Init());
199 this->dst_image_ = &dst_image;
201 flimits_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_width_));
202 (void)memset(flimits_, 255, block_width_);
204 // Initialize pixels in the input:
205 // block pixels to value 1,
206 // border pixels to value 10.
207 src_image.SetPadding(10);
210 // Initialize pixels in the output to 99.
213 RunNTimes(INT16_MAX);
214 PrintMedian("16x16");
219 class VpxMbPostProcAcrossIpTest
220 : public AbstractBench,
221 public ::testing::TestWithParam<VpxMbPostProcAcrossIpFunc> {
223 VpxMbPostProcAcrossIpTest()
224 : rows_(16), cols_(16), mb_post_proc_across_ip_(GetParam()),
225 src_(Buffer<uint8_t>(rows_, cols_, 8, 8, 17, 8)) {}
226 virtual void TearDown() { libvpx_test::ClearSystemState(); }
231 void SetCols(unsigned char *s, int rows, int cols, int src_width) {
232 for (int r = 0; r < rows; r++) {
233 for (int c = 0; c < cols; c++) {
240 void RunComparison(const unsigned char *expected_output, unsigned char *src_c,
241 int rows, int cols, int src_pitch) {
242 for (int r = 0; r < rows; r++) {
243 for (int c = 0; c < cols; c++) {
244 ASSERT_EQ(expected_output[c], src_c[c])
245 << "at (" << r << ", " << c << ")";
251 void RunFilterLevel(unsigned char *s, int rows, int cols, int src_width,
252 int filter_level, const unsigned char *expected_output) {
253 ASM_REGISTER_STATE_CHECK(
254 GetParam()(s, src_width, rows, cols, filter_level));
255 RunComparison(expected_output, s, rows, cols, src_width);
260 const VpxMbPostProcAcrossIpFunc mb_post_proc_across_ip_;
261 Buffer<uint8_t> src_;
264 void VpxMbPostProcAcrossIpTest::Run() {
265 mb_post_proc_across_ip_(src_.TopLeftPixel(), src_.stride(), rows_, cols_,
269 TEST_P(VpxMbPostProcAcrossIpTest, CheckLowFilterOutput) {
270 ASSERT_TRUE(src_.Init());
272 SetCols(src_.TopLeftPixel(), rows_, cols_, src_.stride());
274 Buffer<uint8_t> expected_output = Buffer<uint8_t>(cols_, rows_, 0);
275 ASSERT_TRUE(expected_output.Init());
276 SetCols(expected_output.TopLeftPixel(), rows_, cols_,
277 expected_output.stride());
279 RunFilterLevel(src_.TopLeftPixel(), rows_, cols_, src_.stride(), q2mbl(0),
280 expected_output.TopLeftPixel());
283 TEST_P(VpxMbPostProcAcrossIpTest, CheckMediumFilterOutput) {
284 ASSERT_TRUE(src_.Init());
286 SetCols(src_.TopLeftPixel(), rows_, cols_, src_.stride());
288 static const unsigned char kExpectedOutput[] = {
289 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 13
292 RunFilterLevel(src_.TopLeftPixel(), rows_, cols_, src_.stride(), q2mbl(70),
296 TEST_P(VpxMbPostProcAcrossIpTest, CheckHighFilterOutput) {
297 ASSERT_TRUE(src_.Init());
299 SetCols(src_.TopLeftPixel(), rows_, cols_, src_.stride());
301 static const unsigned char kExpectedOutput[] = {
302 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 13
305 RunFilterLevel(src_.TopLeftPixel(), rows_, cols_, src_.stride(), INT_MAX,
308 SetCols(src_.TopLeftPixel(), rows_, cols_, src_.stride());
310 RunFilterLevel(src_.TopLeftPixel(), rows_, cols_, src_.stride(), q2mbl(100),
314 TEST_P(VpxMbPostProcAcrossIpTest, CheckCvsAssembly) {
315 Buffer<uint8_t> c_mem = Buffer<uint8_t>(cols_, rows_, 8, 8, 17, 8);
316 ASSERT_TRUE(c_mem.Init());
317 Buffer<uint8_t> asm_mem = Buffer<uint8_t>(cols_, rows_, 8, 8, 17, 8);
318 ASSERT_TRUE(asm_mem.Init());
320 // When level >= 100, the filter behaves the same as the level = INT_MAX
321 // When level < 20, it behaves the same as the level = 0
322 for (int level = 0; level < 100; level++) {
323 c_mem.SetPadding(10);
324 asm_mem.SetPadding(10);
325 SetCols(c_mem.TopLeftPixel(), rows_, cols_, c_mem.stride());
326 SetCols(asm_mem.TopLeftPixel(), rows_, cols_, asm_mem.stride());
328 vpx_mbpost_proc_across_ip_c(c_mem.TopLeftPixel(), c_mem.stride(), rows_,
329 cols_, q2mbl(level));
330 ASM_REGISTER_STATE_CHECK(GetParam()(
331 asm_mem.TopLeftPixel(), asm_mem.stride(), rows_, cols_, q2mbl(level)));
333 ASSERT_TRUE(asm_mem.CheckValues(c_mem));
337 TEST_P(VpxMbPostProcAcrossIpTest, DISABLED_Speed) {
338 ASSERT_TRUE(src_.Init());
341 SetCols(src_.TopLeftPixel(), rows_, cols_, src_.stride());
344 PrintMedian("16x16");
347 class VpxMbPostProcDownTest
348 : public AbstractBench,
349 public ::testing::TestWithParam<VpxMbPostProcDownFunc> {
351 VpxMbPostProcDownTest()
352 : rows_(16), cols_(16), mb_post_proc_down_(GetParam()),
353 src_c_(Buffer<uint8_t>(rows_, cols_, 8, 8, 8, 17)) {}
355 virtual void TearDown() { libvpx_test::ClearSystemState(); }
360 void SetRows(unsigned char *src_c, int rows, int cols, int src_width) {
361 for (int r = 0; r < rows; r++) {
362 memset(src_c, r, cols);
367 void RunComparison(const unsigned char *expected_output, unsigned char *src_c,
368 int rows, int cols, int src_pitch) {
369 for (int r = 0; r < rows; r++) {
370 for (int c = 0; c < cols; c++) {
371 ASSERT_EQ(expected_output[r * rows + c], src_c[c])
372 << "at (" << r << ", " << c << ")";
378 void RunFilterLevel(unsigned char *s, int rows, int cols, int src_width,
379 int filter_level, const unsigned char *expected_output) {
380 ASM_REGISTER_STATE_CHECK(
381 mb_post_proc_down_(s, src_width, rows, cols, filter_level));
382 RunComparison(expected_output, s, rows, cols, src_width);
387 const VpxMbPostProcDownFunc mb_post_proc_down_;
388 Buffer<uint8_t> src_c_;
391 void VpxMbPostProcDownTest::Run() {
392 mb_post_proc_down_(src_c_.TopLeftPixel(), src_c_.stride(), rows_, cols_,
396 TEST_P(VpxMbPostProcDownTest, CheckHighFilterOutput) {
397 ASSERT_TRUE(src_c_.Init());
398 src_c_.SetPadding(10);
400 SetRows(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride());
402 static const unsigned char kExpectedOutput[] = {
403 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2,
404 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3,
405 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 4, 4, 3, 3, 3,
406 4, 4, 3, 4, 4, 3, 3, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4,
407 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
408 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
409 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
410 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 9,
411 9, 8, 9, 9, 8, 8, 8, 9, 9, 10, 10, 9, 9, 9, 10, 10, 9, 10, 10,
412 9, 9, 9, 10, 10, 10, 11, 10, 10, 10, 11, 10, 11, 10, 11, 10, 10, 10, 11,
413 10, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 11, 11, 12, 11, 12,
414 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 12,
415 13, 12, 13, 12, 12, 12, 13, 12, 13, 12, 13, 12, 13, 13, 13, 14, 13, 13, 13,
416 13, 13, 13, 13, 14, 13, 13, 13, 13
419 RunFilterLevel(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride(), INT_MAX,
422 src_c_.SetPadding(10);
423 SetRows(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride());
424 RunFilterLevel(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride(),
425 q2mbl(100), kExpectedOutput);
428 TEST_P(VpxMbPostProcDownTest, CheckMediumFilterOutput) {
429 ASSERT_TRUE(src_c_.Init());
430 src_c_.SetPadding(10);
432 SetRows(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride());
434 static const unsigned char kExpectedOutput[] = {
435 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2,
436 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
437 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
438 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
439 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
440 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
441 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
442 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
443 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
444 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
445 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13,
446 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 13, 12,
447 13, 12, 13, 12, 12, 12, 13, 12, 13, 12, 13, 12, 13, 13, 13, 14, 13, 13, 13,
448 13, 13, 13, 13, 14, 13, 13, 13, 13
451 RunFilterLevel(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride(),
452 q2mbl(70), kExpectedOutput);
455 TEST_P(VpxMbPostProcDownTest, CheckLowFilterOutput) {
456 ASSERT_TRUE(src_c_.Init());
457 src_c_.SetPadding(10);
459 SetRows(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride());
461 unsigned char *expected_output = new unsigned char[rows_ * cols_];
462 ASSERT_NE(expected_output, nullptr);
463 SetRows(expected_output, rows_, cols_, cols_);
465 RunFilterLevel(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride(), q2mbl(0),
468 delete[] expected_output;
471 TEST_P(VpxMbPostProcDownTest, CheckCvsAssembly) {
473 rnd.Reset(ACMRandom::DeterministicSeed());
475 ASSERT_TRUE(src_c_.Init());
476 Buffer<uint8_t> src_asm = Buffer<uint8_t>(cols_, rows_, 8, 8, 8, 17);
477 ASSERT_TRUE(src_asm.Init());
479 for (int level = 0; level < 100; level++) {
480 src_c_.SetPadding(10);
481 src_asm.SetPadding(10);
482 src_c_.Set(&rnd, &ACMRandom::Rand8);
483 src_asm.CopyFrom(src_c_);
485 vpx_mbpost_proc_down_c(src_c_.TopLeftPixel(), src_c_.stride(), rows_, cols_,
487 ASM_REGISTER_STATE_CHECK(mb_post_proc_down_(
488 src_asm.TopLeftPixel(), src_asm.stride(), rows_, cols_, q2mbl(level)));
489 ASSERT_TRUE(src_asm.CheckValues(src_c_));
491 src_c_.SetPadding(10);
492 src_asm.SetPadding(10);
493 src_c_.Set(&rnd, &ACMRandom::Rand8Extremes);
494 src_asm.CopyFrom(src_c_);
496 vpx_mbpost_proc_down_c(src_c_.TopLeftPixel(), src_c_.stride(), rows_, cols_,
498 ASM_REGISTER_STATE_CHECK(mb_post_proc_down_(
499 src_asm.TopLeftPixel(), src_asm.stride(), rows_, cols_, q2mbl(level)));
500 ASSERT_TRUE(src_asm.CheckValues(src_c_));
504 TEST_P(VpxMbPostProcDownTest, DISABLED_Speed) {
505 ASSERT_TRUE(src_c_.Init());
506 src_c_.SetPadding(10);
508 SetRows(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride());
511 PrintMedian("16x16");
514 INSTANTIATE_TEST_SUITE_P(
515 C, VpxPostProcDownAndAcrossMbRowTest,
516 ::testing::Values(vpx_post_proc_down_and_across_mb_row_c));
518 INSTANTIATE_TEST_SUITE_P(C, VpxMbPostProcAcrossIpTest,
519 ::testing::Values(vpx_mbpost_proc_across_ip_c));
521 INSTANTIATE_TEST_SUITE_P(C, VpxMbPostProcDownTest,
522 ::testing::Values(vpx_mbpost_proc_down_c));
525 INSTANTIATE_TEST_SUITE_P(
526 SSE2, VpxPostProcDownAndAcrossMbRowTest,
527 ::testing::Values(vpx_post_proc_down_and_across_mb_row_sse2));
529 INSTANTIATE_TEST_SUITE_P(SSE2, VpxMbPostProcAcrossIpTest,
530 ::testing::Values(vpx_mbpost_proc_across_ip_sse2));
532 INSTANTIATE_TEST_SUITE_P(SSE2, VpxMbPostProcDownTest,
533 ::testing::Values(vpx_mbpost_proc_down_sse2));
537 INSTANTIATE_TEST_SUITE_P(
538 NEON, VpxPostProcDownAndAcrossMbRowTest,
539 ::testing::Values(vpx_post_proc_down_and_across_mb_row_neon));
541 INSTANTIATE_TEST_SUITE_P(NEON, VpxMbPostProcAcrossIpTest,
542 ::testing::Values(vpx_mbpost_proc_across_ip_neon));
544 INSTANTIATE_TEST_SUITE_P(NEON, VpxMbPostProcDownTest,
545 ::testing::Values(vpx_mbpost_proc_down_neon));
549 INSTANTIATE_TEST_SUITE_P(
550 MSA, VpxPostProcDownAndAcrossMbRowTest,
551 ::testing::Values(vpx_post_proc_down_and_across_mb_row_msa));
553 INSTANTIATE_TEST_SUITE_P(MSA, VpxMbPostProcAcrossIpTest,
554 ::testing::Values(vpx_mbpost_proc_across_ip_msa));
556 INSTANTIATE_TEST_SUITE_P(MSA, VpxMbPostProcDownTest,
557 ::testing::Values(vpx_mbpost_proc_down_msa));
561 INSTANTIATE_TEST_SUITE_P(
562 VSX, VpxPostProcDownAndAcrossMbRowTest,
563 ::testing::Values(vpx_post_proc_down_and_across_mb_row_vsx));
565 INSTANTIATE_TEST_SUITE_P(VSX, VpxMbPostProcAcrossIpTest,
566 ::testing::Values(vpx_mbpost_proc_across_ip_vsx));
568 INSTANTIATE_TEST_SUITE_P(VSX, VpxMbPostProcDownTest,
569 ::testing::Values(vpx_mbpost_proc_down_vsx));