xref: /aosp_15_r20/external/libvpx/test/convolve_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <tuple>
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "./vp9_rtcd.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_common.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_filter.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_dsp_common.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_filter.h"
27*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
28*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
29*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/vpx_timer.h"
30*fb1b10abSAndroid Build Coastguard Worker 
31*fb1b10abSAndroid Build Coastguard Worker namespace {
32*fb1b10abSAndroid Build Coastguard Worker 
33*fb1b10abSAndroid Build Coastguard Worker static const unsigned int kMaxDimension = 64;
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker typedef void (*ConvolveFunc)(const uint8_t *src, ptrdiff_t src_stride,
36*fb1b10abSAndroid Build Coastguard Worker                              uint8_t *dst, ptrdiff_t dst_stride,
37*fb1b10abSAndroid Build Coastguard Worker                              const InterpKernel *filter, int x0_q4,
38*fb1b10abSAndroid Build Coastguard Worker                              int x_step_q4, int y0_q4, int y_step_q4, int w,
39*fb1b10abSAndroid Build Coastguard Worker                              int h);
40*fb1b10abSAndroid Build Coastguard Worker 
41*fb1b10abSAndroid Build Coastguard Worker typedef void (*WrapperFilterBlock2d8Func)(
42*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *src_ptr, const unsigned int src_stride,
43*fb1b10abSAndroid Build Coastguard Worker     const int16_t *hfilter, const int16_t *vfilter, uint8_t *dst_ptr,
44*fb1b10abSAndroid Build Coastguard Worker     unsigned int dst_stride, unsigned int output_width,
45*fb1b10abSAndroid Build Coastguard Worker     unsigned int output_height, int use_highbd);
46*fb1b10abSAndroid Build Coastguard Worker 
47*fb1b10abSAndroid Build Coastguard Worker struct ConvolveFunctions {
ConvolveFunctions__anon7a986e190111::ConvolveFunctions48*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunctions(ConvolveFunc copy, ConvolveFunc avg, ConvolveFunc h8,
49*fb1b10abSAndroid Build Coastguard Worker                     ConvolveFunc h8_avg, ConvolveFunc v8, ConvolveFunc v8_avg,
50*fb1b10abSAndroid Build Coastguard Worker                     ConvolveFunc hv8, ConvolveFunc hv8_avg, ConvolveFunc sh8,
51*fb1b10abSAndroid Build Coastguard Worker                     ConvolveFunc sh8_avg, ConvolveFunc sv8,
52*fb1b10abSAndroid Build Coastguard Worker                     ConvolveFunc sv8_avg, ConvolveFunc shv8,
53*fb1b10abSAndroid Build Coastguard Worker                     ConvolveFunc shv8_avg, int bd)
54*fb1b10abSAndroid Build Coastguard Worker       : use_highbd_(bd) {
55*fb1b10abSAndroid Build Coastguard Worker     copy_[0] = copy;
56*fb1b10abSAndroid Build Coastguard Worker     copy_[1] = avg;
57*fb1b10abSAndroid Build Coastguard Worker     h8_[0] = h8;
58*fb1b10abSAndroid Build Coastguard Worker     h8_[1] = h8_avg;
59*fb1b10abSAndroid Build Coastguard Worker     v8_[0] = v8;
60*fb1b10abSAndroid Build Coastguard Worker     v8_[1] = v8_avg;
61*fb1b10abSAndroid Build Coastguard Worker     hv8_[0] = hv8;
62*fb1b10abSAndroid Build Coastguard Worker     hv8_[1] = hv8_avg;
63*fb1b10abSAndroid Build Coastguard Worker     sh8_[0] = sh8;
64*fb1b10abSAndroid Build Coastguard Worker     sh8_[1] = sh8_avg;
65*fb1b10abSAndroid Build Coastguard Worker     sv8_[0] = sv8;
66*fb1b10abSAndroid Build Coastguard Worker     sv8_[1] = sv8_avg;
67*fb1b10abSAndroid Build Coastguard Worker     shv8_[0] = shv8;
68*fb1b10abSAndroid Build Coastguard Worker     shv8_[1] = shv8_avg;
69*fb1b10abSAndroid Build Coastguard Worker   }
70*fb1b10abSAndroid Build Coastguard Worker 
71*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc copy_[2];
72*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc h8_[2];
73*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc v8_[2];
74*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc hv8_[2];
75*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc sh8_[2];   // scaled horiz
76*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc sv8_[2];   // scaled vert
77*fb1b10abSAndroid Build Coastguard Worker   ConvolveFunc shv8_[2];  // scaled horiz/vert
78*fb1b10abSAndroid Build Coastguard Worker   int use_highbd_;  // 0 if high bitdepth not used, else the actual bit depth.
79*fb1b10abSAndroid Build Coastguard Worker };
80*fb1b10abSAndroid Build Coastguard Worker 
81*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, int, const ConvolveFunctions *> ConvolveParam;
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker #define ALL_SIZES(convolve_fn)                                            \
84*fb1b10abSAndroid Build Coastguard Worker   make_tuple(4, 4, &convolve_fn), make_tuple(8, 4, &convolve_fn),         \
85*fb1b10abSAndroid Build Coastguard Worker       make_tuple(4, 8, &convolve_fn), make_tuple(8, 8, &convolve_fn),     \
86*fb1b10abSAndroid Build Coastguard Worker       make_tuple(16, 8, &convolve_fn), make_tuple(8, 16, &convolve_fn),   \
87*fb1b10abSAndroid Build Coastguard Worker       make_tuple(16, 16, &convolve_fn), make_tuple(32, 16, &convolve_fn), \
88*fb1b10abSAndroid Build Coastguard Worker       make_tuple(16, 32, &convolve_fn), make_tuple(32, 32, &convolve_fn), \
89*fb1b10abSAndroid Build Coastguard Worker       make_tuple(64, 32, &convolve_fn), make_tuple(32, 64, &convolve_fn), \
90*fb1b10abSAndroid Build Coastguard Worker       make_tuple(64, 64, &convolve_fn)
91*fb1b10abSAndroid Build Coastguard Worker 
92*fb1b10abSAndroid Build Coastguard Worker // Reference 8-tap subpixel filter, slightly modified to fit into this test.
93*fb1b10abSAndroid Build Coastguard Worker #define VP9_FILTER_WEIGHT 128
94*fb1b10abSAndroid Build Coastguard Worker #define VP9_FILTER_SHIFT 7
clip_pixel(int x)95*fb1b10abSAndroid Build Coastguard Worker uint8_t clip_pixel(int x) { return x < 0 ? 0 : x > 255 ? 255 : x; }
96*fb1b10abSAndroid Build Coastguard Worker 
filter_block2d_8_c(const uint8_t * src_ptr,const unsigned int src_stride,const int16_t * hfilter,const int16_t * vfilter,uint8_t * dst_ptr,unsigned int dst_stride,unsigned int output_width,unsigned int output_height)97*fb1b10abSAndroid Build Coastguard Worker void filter_block2d_8_c(const uint8_t *src_ptr, const unsigned int src_stride,
98*fb1b10abSAndroid Build Coastguard Worker                         const int16_t *hfilter, const int16_t *vfilter,
99*fb1b10abSAndroid Build Coastguard Worker                         uint8_t *dst_ptr, unsigned int dst_stride,
100*fb1b10abSAndroid Build Coastguard Worker                         unsigned int output_width, unsigned int output_height) {
101*fb1b10abSAndroid Build Coastguard Worker   // Between passes, we use an intermediate buffer whose height is extended to
102*fb1b10abSAndroid Build Coastguard Worker   // have enough horizontally filtered values as input for the vertical pass.
103*fb1b10abSAndroid Build Coastguard Worker   // This buffer is allocated to be big enough for the largest block type we
104*fb1b10abSAndroid Build Coastguard Worker   // support.
105*fb1b10abSAndroid Build Coastguard Worker   const int kInterp_Extend = 4;
106*fb1b10abSAndroid Build Coastguard Worker   const unsigned int intermediate_height =
107*fb1b10abSAndroid Build Coastguard Worker       (kInterp_Extend - 1) + output_height + kInterp_Extend;
108*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
109*fb1b10abSAndroid Build Coastguard Worker 
110*fb1b10abSAndroid Build Coastguard Worker   // Size of intermediate_buffer is max_intermediate_height * filter_max_width,
111*fb1b10abSAndroid Build Coastguard Worker   // where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
112*fb1b10abSAndroid Build Coastguard Worker   //                                 + kInterp_Extend
113*fb1b10abSAndroid Build Coastguard Worker   //                               = 3 + 16 + 4
114*fb1b10abSAndroid Build Coastguard Worker   //                               = 23
115*fb1b10abSAndroid Build Coastguard Worker   // and filter_max_width          = 16
116*fb1b10abSAndroid Build Coastguard Worker   //
117*fb1b10abSAndroid Build Coastguard Worker   uint8_t intermediate_buffer[71 * kMaxDimension];
118*fb1b10abSAndroid Build Coastguard Worker   vp9_zero(intermediate_buffer);
119*fb1b10abSAndroid Build Coastguard Worker   const int intermediate_next_stride =
120*fb1b10abSAndroid Build Coastguard Worker       1 - static_cast<int>(intermediate_height * output_width);
121*fb1b10abSAndroid Build Coastguard Worker 
122*fb1b10abSAndroid Build Coastguard Worker   // Horizontal pass (src -> transposed intermediate).
123*fb1b10abSAndroid Build Coastguard Worker   uint8_t *output_ptr = intermediate_buffer;
124*fb1b10abSAndroid Build Coastguard Worker   const int src_next_row_stride = src_stride - output_width;
125*fb1b10abSAndroid Build Coastguard Worker   src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
126*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < intermediate_height; ++i) {
127*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
128*fb1b10abSAndroid Build Coastguard Worker       // Apply filter...
129*fb1b10abSAndroid Build Coastguard Worker       const int temp = (src_ptr[0] * hfilter[0]) + (src_ptr[1] * hfilter[1]) +
130*fb1b10abSAndroid Build Coastguard Worker                        (src_ptr[2] * hfilter[2]) + (src_ptr[3] * hfilter[3]) +
131*fb1b10abSAndroid Build Coastguard Worker                        (src_ptr[4] * hfilter[4]) + (src_ptr[5] * hfilter[5]) +
132*fb1b10abSAndroid Build Coastguard Worker                        (src_ptr[6] * hfilter[6]) + (src_ptr[7] * hfilter[7]) +
133*fb1b10abSAndroid Build Coastguard Worker                        (VP9_FILTER_WEIGHT >> 1);  // Rounding
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker       // Normalize back to 0-255...
136*fb1b10abSAndroid Build Coastguard Worker       *output_ptr = clip_pixel(temp >> VP9_FILTER_SHIFT);
137*fb1b10abSAndroid Build Coastguard Worker       ++src_ptr;
138*fb1b10abSAndroid Build Coastguard Worker       output_ptr += intermediate_height;
139*fb1b10abSAndroid Build Coastguard Worker     }
140*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_next_row_stride;
141*fb1b10abSAndroid Build Coastguard Worker     output_ptr += intermediate_next_stride;
142*fb1b10abSAndroid Build Coastguard Worker   }
143*fb1b10abSAndroid Build Coastguard Worker 
144*fb1b10abSAndroid Build Coastguard Worker   // Vertical pass (transposed intermediate -> dst).
145*fb1b10abSAndroid Build Coastguard Worker   src_ptr = intermediate_buffer;
146*fb1b10abSAndroid Build Coastguard Worker   const int dst_next_row_stride = dst_stride - output_width;
147*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
148*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
149*fb1b10abSAndroid Build Coastguard Worker       // Apply filter...
150*fb1b10abSAndroid Build Coastguard Worker       const int temp = (src_ptr[0] * vfilter[0]) + (src_ptr[1] * vfilter[1]) +
151*fb1b10abSAndroid Build Coastguard Worker                        (src_ptr[2] * vfilter[2]) + (src_ptr[3] * vfilter[3]) +
152*fb1b10abSAndroid Build Coastguard Worker                        (src_ptr[4] * vfilter[4]) + (src_ptr[5] * vfilter[5]) +
153*fb1b10abSAndroid Build Coastguard Worker                        (src_ptr[6] * vfilter[6]) + (src_ptr[7] * vfilter[7]) +
154*fb1b10abSAndroid Build Coastguard Worker                        (VP9_FILTER_WEIGHT >> 1);  // Rounding
155*fb1b10abSAndroid Build Coastguard Worker 
156*fb1b10abSAndroid Build Coastguard Worker       // Normalize back to 0-255...
157*fb1b10abSAndroid Build Coastguard Worker       *dst_ptr++ = clip_pixel(temp >> VP9_FILTER_SHIFT);
158*fb1b10abSAndroid Build Coastguard Worker       src_ptr += intermediate_height;
159*fb1b10abSAndroid Build Coastguard Worker     }
160*fb1b10abSAndroid Build Coastguard Worker     src_ptr += intermediate_next_stride;
161*fb1b10abSAndroid Build Coastguard Worker     dst_ptr += dst_next_row_stride;
162*fb1b10abSAndroid Build Coastguard Worker   }
163*fb1b10abSAndroid Build Coastguard Worker }
164*fb1b10abSAndroid Build Coastguard Worker 
block2d_average_c(uint8_t * src,unsigned int src_stride,uint8_t * output_ptr,unsigned int output_stride,unsigned int output_width,unsigned int output_height)165*fb1b10abSAndroid Build Coastguard Worker void block2d_average_c(uint8_t *src, unsigned int src_stride,
166*fb1b10abSAndroid Build Coastguard Worker                        uint8_t *output_ptr, unsigned int output_stride,
167*fb1b10abSAndroid Build Coastguard Worker                        unsigned int output_width, unsigned int output_height) {
168*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
169*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
170*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
171*fb1b10abSAndroid Build Coastguard Worker       output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
172*fb1b10abSAndroid Build Coastguard Worker     }
173*fb1b10abSAndroid Build Coastguard Worker     output_ptr += output_stride;
174*fb1b10abSAndroid Build Coastguard Worker   }
175*fb1b10abSAndroid Build Coastguard Worker }
176*fb1b10abSAndroid Build Coastguard Worker 
filter_average_block2d_8_c(const uint8_t * src_ptr,const unsigned int src_stride,const int16_t * hfilter,const int16_t * vfilter,uint8_t * dst_ptr,unsigned int dst_stride,unsigned int output_width,unsigned int output_height)177*fb1b10abSAndroid Build Coastguard Worker void filter_average_block2d_8_c(const uint8_t *src_ptr,
178*fb1b10abSAndroid Build Coastguard Worker                                 const unsigned int src_stride,
179*fb1b10abSAndroid Build Coastguard Worker                                 const int16_t *hfilter, const int16_t *vfilter,
180*fb1b10abSAndroid Build Coastguard Worker                                 uint8_t *dst_ptr, unsigned int dst_stride,
181*fb1b10abSAndroid Build Coastguard Worker                                 unsigned int output_width,
182*fb1b10abSAndroid Build Coastguard Worker                                 unsigned int output_height) {
183*fb1b10abSAndroid Build Coastguard Worker   uint8_t tmp[kMaxDimension * kMaxDimension];
184*fb1b10abSAndroid Build Coastguard Worker 
185*fb1b10abSAndroid Build Coastguard Worker   assert(output_width <= kMaxDimension);
186*fb1b10abSAndroid Build Coastguard Worker   assert(output_height <= kMaxDimension);
187*fb1b10abSAndroid Build Coastguard Worker   filter_block2d_8_c(src_ptr, src_stride, hfilter, vfilter, tmp, 64,
188*fb1b10abSAndroid Build Coastguard Worker                      output_width, output_height);
189*fb1b10abSAndroid Build Coastguard Worker   block2d_average_c(tmp, 64, dst_ptr, dst_stride, output_width, output_height);
190*fb1b10abSAndroid Build Coastguard Worker }
191*fb1b10abSAndroid Build Coastguard Worker 
192*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
highbd_filter_block2d_8_c(const uint16_t * src_ptr,const unsigned int src_stride,const int16_t * hfilter,const int16_t * vfilter,uint16_t * dst_ptr,unsigned int dst_stride,unsigned int output_width,unsigned int output_height,int bd)193*fb1b10abSAndroid Build Coastguard Worker void highbd_filter_block2d_8_c(const uint16_t *src_ptr,
194*fb1b10abSAndroid Build Coastguard Worker                                const unsigned int src_stride,
195*fb1b10abSAndroid Build Coastguard Worker                                const int16_t *hfilter, const int16_t *vfilter,
196*fb1b10abSAndroid Build Coastguard Worker                                uint16_t *dst_ptr, unsigned int dst_stride,
197*fb1b10abSAndroid Build Coastguard Worker                                unsigned int output_width,
198*fb1b10abSAndroid Build Coastguard Worker                                unsigned int output_height, int bd) {
199*fb1b10abSAndroid Build Coastguard Worker   // Between passes, we use an intermediate buffer whose height is extended to
200*fb1b10abSAndroid Build Coastguard Worker   // have enough horizontally filtered values as input for the vertical pass.
201*fb1b10abSAndroid Build Coastguard Worker   // This buffer is allocated to be big enough for the largest block type we
202*fb1b10abSAndroid Build Coastguard Worker   // support.
203*fb1b10abSAndroid Build Coastguard Worker   const int kInterp_Extend = 4;
204*fb1b10abSAndroid Build Coastguard Worker   const unsigned int intermediate_height =
205*fb1b10abSAndroid Build Coastguard Worker       (kInterp_Extend - 1) + output_height + kInterp_Extend;
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker   /* Size of intermediate_buffer is max_intermediate_height * filter_max_width,
208*fb1b10abSAndroid Build Coastguard Worker    * where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
209*fb1b10abSAndroid Build Coastguard Worker    *                                 + kInterp_Extend
210*fb1b10abSAndroid Build Coastguard Worker    *                               = 3 + 16 + 4
211*fb1b10abSAndroid Build Coastguard Worker    *                               = 23
212*fb1b10abSAndroid Build Coastguard Worker    * and filter_max_width = 16
213*fb1b10abSAndroid Build Coastguard Worker    */
214*fb1b10abSAndroid Build Coastguard Worker   uint16_t intermediate_buffer[71 * kMaxDimension];
215*fb1b10abSAndroid Build Coastguard Worker   const int intermediate_next_stride =
216*fb1b10abSAndroid Build Coastguard Worker       1 - static_cast<int>(intermediate_height * output_width);
217*fb1b10abSAndroid Build Coastguard Worker 
218*fb1b10abSAndroid Build Coastguard Worker   vp9_zero(intermediate_buffer);
219*fb1b10abSAndroid Build Coastguard Worker 
220*fb1b10abSAndroid Build Coastguard Worker   // Horizontal pass (src -> transposed intermediate).
221*fb1b10abSAndroid Build Coastguard Worker   {
222*fb1b10abSAndroid Build Coastguard Worker     uint16_t *output_ptr = intermediate_buffer;
223*fb1b10abSAndroid Build Coastguard Worker     const int src_next_row_stride = src_stride - output_width;
224*fb1b10abSAndroid Build Coastguard Worker     unsigned int i, j;
225*fb1b10abSAndroid Build Coastguard Worker     src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
226*fb1b10abSAndroid Build Coastguard Worker     for (i = 0; i < intermediate_height; ++i) {
227*fb1b10abSAndroid Build Coastguard Worker       for (j = 0; j < output_width; ++j) {
228*fb1b10abSAndroid Build Coastguard Worker         // Apply filter...
229*fb1b10abSAndroid Build Coastguard Worker         const int temp = (src_ptr[0] * hfilter[0]) + (src_ptr[1] * hfilter[1]) +
230*fb1b10abSAndroid Build Coastguard Worker                          (src_ptr[2] * hfilter[2]) + (src_ptr[3] * hfilter[3]) +
231*fb1b10abSAndroid Build Coastguard Worker                          (src_ptr[4] * hfilter[4]) + (src_ptr[5] * hfilter[5]) +
232*fb1b10abSAndroid Build Coastguard Worker                          (src_ptr[6] * hfilter[6]) + (src_ptr[7] * hfilter[7]) +
233*fb1b10abSAndroid Build Coastguard Worker                          (VP9_FILTER_WEIGHT >> 1);  // Rounding
234*fb1b10abSAndroid Build Coastguard Worker 
235*fb1b10abSAndroid Build Coastguard Worker         // Normalize back to 0-255...
236*fb1b10abSAndroid Build Coastguard Worker         *output_ptr = clip_pixel_highbd(temp >> VP9_FILTER_SHIFT, bd);
237*fb1b10abSAndroid Build Coastguard Worker         ++src_ptr;
238*fb1b10abSAndroid Build Coastguard Worker         output_ptr += intermediate_height;
239*fb1b10abSAndroid Build Coastguard Worker       }
240*fb1b10abSAndroid Build Coastguard Worker       src_ptr += src_next_row_stride;
241*fb1b10abSAndroid Build Coastguard Worker       output_ptr += intermediate_next_stride;
242*fb1b10abSAndroid Build Coastguard Worker     }
243*fb1b10abSAndroid Build Coastguard Worker   }
244*fb1b10abSAndroid Build Coastguard Worker 
245*fb1b10abSAndroid Build Coastguard Worker   // Vertical pass (transposed intermediate -> dst).
246*fb1b10abSAndroid Build Coastguard Worker   {
247*fb1b10abSAndroid Build Coastguard Worker     src_ptr = intermediate_buffer;
248*fb1b10abSAndroid Build Coastguard Worker     const int dst_next_row_stride = dst_stride - output_width;
249*fb1b10abSAndroid Build Coastguard Worker     unsigned int i, j;
250*fb1b10abSAndroid Build Coastguard Worker     for (i = 0; i < output_height; ++i) {
251*fb1b10abSAndroid Build Coastguard Worker       for (j = 0; j < output_width; ++j) {
252*fb1b10abSAndroid Build Coastguard Worker         // Apply filter...
253*fb1b10abSAndroid Build Coastguard Worker         const int temp = (src_ptr[0] * vfilter[0]) + (src_ptr[1] * vfilter[1]) +
254*fb1b10abSAndroid Build Coastguard Worker                          (src_ptr[2] * vfilter[2]) + (src_ptr[3] * vfilter[3]) +
255*fb1b10abSAndroid Build Coastguard Worker                          (src_ptr[4] * vfilter[4]) + (src_ptr[5] * vfilter[5]) +
256*fb1b10abSAndroid Build Coastguard Worker                          (src_ptr[6] * vfilter[6]) + (src_ptr[7] * vfilter[7]) +
257*fb1b10abSAndroid Build Coastguard Worker                          (VP9_FILTER_WEIGHT >> 1);  // Rounding
258*fb1b10abSAndroid Build Coastguard Worker 
259*fb1b10abSAndroid Build Coastguard Worker         // Normalize back to 0-255...
260*fb1b10abSAndroid Build Coastguard Worker         *dst_ptr++ = clip_pixel_highbd(temp >> VP9_FILTER_SHIFT, bd);
261*fb1b10abSAndroid Build Coastguard Worker         src_ptr += intermediate_height;
262*fb1b10abSAndroid Build Coastguard Worker       }
263*fb1b10abSAndroid Build Coastguard Worker       src_ptr += intermediate_next_stride;
264*fb1b10abSAndroid Build Coastguard Worker       dst_ptr += dst_next_row_stride;
265*fb1b10abSAndroid Build Coastguard Worker     }
266*fb1b10abSAndroid Build Coastguard Worker   }
267*fb1b10abSAndroid Build Coastguard Worker }
268*fb1b10abSAndroid Build Coastguard Worker 
highbd_block2d_average_c(uint16_t * src,unsigned int src_stride,uint16_t * output_ptr,unsigned int output_stride,unsigned int output_width,unsigned int output_height)269*fb1b10abSAndroid Build Coastguard Worker void highbd_block2d_average_c(uint16_t *src, unsigned int src_stride,
270*fb1b10abSAndroid Build Coastguard Worker                               uint16_t *output_ptr, unsigned int output_stride,
271*fb1b10abSAndroid Build Coastguard Worker                               unsigned int output_width,
272*fb1b10abSAndroid Build Coastguard Worker                               unsigned int output_height) {
273*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
274*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
275*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
276*fb1b10abSAndroid Build Coastguard Worker       output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
277*fb1b10abSAndroid Build Coastguard Worker     }
278*fb1b10abSAndroid Build Coastguard Worker     output_ptr += output_stride;
279*fb1b10abSAndroid Build Coastguard Worker   }
280*fb1b10abSAndroid Build Coastguard Worker }
281*fb1b10abSAndroid Build Coastguard Worker 
highbd_filter_average_block2d_8_c(const uint16_t * src_ptr,const unsigned int src_stride,const int16_t * hfilter,const int16_t * vfilter,uint16_t * dst_ptr,unsigned int dst_stride,unsigned int output_width,unsigned int output_height,int bd)282*fb1b10abSAndroid Build Coastguard Worker void highbd_filter_average_block2d_8_c(
283*fb1b10abSAndroid Build Coastguard Worker     const uint16_t *src_ptr, const unsigned int src_stride,
284*fb1b10abSAndroid Build Coastguard Worker     const int16_t *hfilter, const int16_t *vfilter, uint16_t *dst_ptr,
285*fb1b10abSAndroid Build Coastguard Worker     unsigned int dst_stride, unsigned int output_width,
286*fb1b10abSAndroid Build Coastguard Worker     unsigned int output_height, int bd) {
287*fb1b10abSAndroid Build Coastguard Worker   uint16_t tmp[kMaxDimension * kMaxDimension];
288*fb1b10abSAndroid Build Coastguard Worker 
289*fb1b10abSAndroid Build Coastguard Worker   assert(output_width <= kMaxDimension);
290*fb1b10abSAndroid Build Coastguard Worker   assert(output_height <= kMaxDimension);
291*fb1b10abSAndroid Build Coastguard Worker   highbd_filter_block2d_8_c(src_ptr, src_stride, hfilter, vfilter, tmp, 64,
292*fb1b10abSAndroid Build Coastguard Worker                             output_width, output_height, bd);
293*fb1b10abSAndroid Build Coastguard Worker   highbd_block2d_average_c(tmp, 64, dst_ptr, dst_stride, output_width,
294*fb1b10abSAndroid Build Coastguard Worker                            output_height);
295*fb1b10abSAndroid Build Coastguard Worker }
296*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
297*fb1b10abSAndroid Build Coastguard Worker 
wrapper_filter_average_block2d_8_c(const uint8_t * src_ptr,const unsigned int src_stride,const int16_t * hfilter,const int16_t * vfilter,uint8_t * dst_ptr,unsigned int dst_stride,unsigned int output_width,unsigned int output_height,int use_highbd)298*fb1b10abSAndroid Build Coastguard Worker void wrapper_filter_average_block2d_8_c(
299*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *src_ptr, const unsigned int src_stride,
300*fb1b10abSAndroid Build Coastguard Worker     const int16_t *hfilter, const int16_t *vfilter, uint8_t *dst_ptr,
301*fb1b10abSAndroid Build Coastguard Worker     unsigned int dst_stride, unsigned int output_width,
302*fb1b10abSAndroid Build Coastguard Worker     unsigned int output_height, int use_highbd) {
303*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
304*fb1b10abSAndroid Build Coastguard Worker   if (use_highbd == 0) {
305*fb1b10abSAndroid Build Coastguard Worker     filter_average_block2d_8_c(src_ptr, src_stride, hfilter, vfilter, dst_ptr,
306*fb1b10abSAndroid Build Coastguard Worker                                dst_stride, output_width, output_height);
307*fb1b10abSAndroid Build Coastguard Worker   } else {
308*fb1b10abSAndroid Build Coastguard Worker     highbd_filter_average_block2d_8_c(CAST_TO_SHORTPTR(src_ptr), src_stride,
309*fb1b10abSAndroid Build Coastguard Worker                                       hfilter, vfilter,
310*fb1b10abSAndroid Build Coastguard Worker                                       CAST_TO_SHORTPTR(dst_ptr), dst_stride,
311*fb1b10abSAndroid Build Coastguard Worker                                       output_width, output_height, use_highbd);
312*fb1b10abSAndroid Build Coastguard Worker   }
313*fb1b10abSAndroid Build Coastguard Worker #else
314*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(0, use_highbd);
315*fb1b10abSAndroid Build Coastguard Worker   filter_average_block2d_8_c(src_ptr, src_stride, hfilter, vfilter, dst_ptr,
316*fb1b10abSAndroid Build Coastguard Worker                              dst_stride, output_width, output_height);
317*fb1b10abSAndroid Build Coastguard Worker #endif
318*fb1b10abSAndroid Build Coastguard Worker }
319*fb1b10abSAndroid Build Coastguard Worker 
wrapper_filter_block2d_8_c(const uint8_t * src_ptr,const unsigned int src_stride,const int16_t * hfilter,const int16_t * vfilter,uint8_t * dst_ptr,unsigned int dst_stride,unsigned int output_width,unsigned int output_height,int use_highbd)320*fb1b10abSAndroid Build Coastguard Worker void wrapper_filter_block2d_8_c(const uint8_t *src_ptr,
321*fb1b10abSAndroid Build Coastguard Worker                                 const unsigned int src_stride,
322*fb1b10abSAndroid Build Coastguard Worker                                 const int16_t *hfilter, const int16_t *vfilter,
323*fb1b10abSAndroid Build Coastguard Worker                                 uint8_t *dst_ptr, unsigned int dst_stride,
324*fb1b10abSAndroid Build Coastguard Worker                                 unsigned int output_width,
325*fb1b10abSAndroid Build Coastguard Worker                                 unsigned int output_height, int use_highbd) {
326*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
327*fb1b10abSAndroid Build Coastguard Worker   if (use_highbd == 0) {
328*fb1b10abSAndroid Build Coastguard Worker     filter_block2d_8_c(src_ptr, src_stride, hfilter, vfilter, dst_ptr,
329*fb1b10abSAndroid Build Coastguard Worker                        dst_stride, output_width, output_height);
330*fb1b10abSAndroid Build Coastguard Worker   } else {
331*fb1b10abSAndroid Build Coastguard Worker     highbd_filter_block2d_8_c(CAST_TO_SHORTPTR(src_ptr), src_stride, hfilter,
332*fb1b10abSAndroid Build Coastguard Worker                               vfilter, CAST_TO_SHORTPTR(dst_ptr), dst_stride,
333*fb1b10abSAndroid Build Coastguard Worker                               output_width, output_height, use_highbd);
334*fb1b10abSAndroid Build Coastguard Worker   }
335*fb1b10abSAndroid Build Coastguard Worker #else
336*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(0, use_highbd);
337*fb1b10abSAndroid Build Coastguard Worker   filter_block2d_8_c(src_ptr, src_stride, hfilter, vfilter, dst_ptr, dst_stride,
338*fb1b10abSAndroid Build Coastguard Worker                      output_width, output_height);
339*fb1b10abSAndroid Build Coastguard Worker #endif
340*fb1b10abSAndroid Build Coastguard Worker }
341*fb1b10abSAndroid Build Coastguard Worker 
342*fb1b10abSAndroid Build Coastguard Worker class ConvolveTest : public ::testing::TestWithParam<ConvolveParam> {
343*fb1b10abSAndroid Build Coastguard Worker  public:
SetUpTestSuite()344*fb1b10abSAndroid Build Coastguard Worker   static void SetUpTestSuite() {
345*fb1b10abSAndroid Build Coastguard Worker     // Force input_ to be unaligned, output to be 16 byte aligned.
346*fb1b10abSAndroid Build Coastguard Worker     input_ = reinterpret_cast<uint8_t *>(
347*fb1b10abSAndroid Build Coastguard Worker                  vpx_memalign(kDataAlignment, kInputBufferSize + 1)) +
348*fb1b10abSAndroid Build Coastguard Worker              1;
349*fb1b10abSAndroid Build Coastguard Worker     output_ = reinterpret_cast<uint8_t *>(
350*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(kDataAlignment, kOutputBufferSize));
351*fb1b10abSAndroid Build Coastguard Worker     output_ref_ = reinterpret_cast<uint8_t *>(
352*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(kDataAlignment, kOutputBufferSize));
353*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
354*fb1b10abSAndroid Build Coastguard Worker     input16_ = reinterpret_cast<uint16_t *>(vpx_memalign(
355*fb1b10abSAndroid Build Coastguard Worker                    kDataAlignment, (kInputBufferSize + 1) * sizeof(uint16_t))) +
356*fb1b10abSAndroid Build Coastguard Worker                1;
357*fb1b10abSAndroid Build Coastguard Worker     output16_ = reinterpret_cast<uint16_t *>(
358*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t)));
359*fb1b10abSAndroid Build Coastguard Worker     output16_ref_ = reinterpret_cast<uint16_t *>(
360*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t)));
361*fb1b10abSAndroid Build Coastguard Worker #endif
362*fb1b10abSAndroid Build Coastguard Worker   }
363*fb1b10abSAndroid Build Coastguard Worker 
TearDown()364*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override { libvpx_test::ClearSystemState(); }
365*fb1b10abSAndroid Build Coastguard Worker 
TearDownTestSuite()366*fb1b10abSAndroid Build Coastguard Worker   static void TearDownTestSuite() {
367*fb1b10abSAndroid Build Coastguard Worker     vpx_free(input_ - 1);
368*fb1b10abSAndroid Build Coastguard Worker     input_ = nullptr;
369*fb1b10abSAndroid Build Coastguard Worker     vpx_free(output_);
370*fb1b10abSAndroid Build Coastguard Worker     output_ = nullptr;
371*fb1b10abSAndroid Build Coastguard Worker     vpx_free(output_ref_);
372*fb1b10abSAndroid Build Coastguard Worker     output_ref_ = nullptr;
373*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
374*fb1b10abSAndroid Build Coastguard Worker     vpx_free(input16_ - 1);
375*fb1b10abSAndroid Build Coastguard Worker     input16_ = nullptr;
376*fb1b10abSAndroid Build Coastguard Worker     vpx_free(output16_);
377*fb1b10abSAndroid Build Coastguard Worker     output16_ = nullptr;
378*fb1b10abSAndroid Build Coastguard Worker     vpx_free(output16_ref_);
379*fb1b10abSAndroid Build Coastguard Worker     output16_ref_ = nullptr;
380*fb1b10abSAndroid Build Coastguard Worker #endif
381*fb1b10abSAndroid Build Coastguard Worker   }
382*fb1b10abSAndroid Build Coastguard Worker 
383*fb1b10abSAndroid Build Coastguard Worker  protected:
384*fb1b10abSAndroid Build Coastguard Worker   static const int kDataAlignment = 16;
385*fb1b10abSAndroid Build Coastguard Worker   static const int kOuterBlockSize = 256;
386*fb1b10abSAndroid Build Coastguard Worker   static const int kInputStride = kOuterBlockSize;
387*fb1b10abSAndroid Build Coastguard Worker   static const int kOutputStride = kOuterBlockSize;
388*fb1b10abSAndroid Build Coastguard Worker   static const int kInputBufferSize = kOuterBlockSize * kOuterBlockSize;
389*fb1b10abSAndroid Build Coastguard Worker   static const int kOutputBufferSize = kOuterBlockSize * kOuterBlockSize;
390*fb1b10abSAndroid Build Coastguard Worker 
Width() const391*fb1b10abSAndroid Build Coastguard Worker   int Width() const { return GET_PARAM(0); }
Height() const392*fb1b10abSAndroid Build Coastguard Worker   int Height() const { return GET_PARAM(1); }
BorderLeft() const393*fb1b10abSAndroid Build Coastguard Worker   int BorderLeft() const {
394*fb1b10abSAndroid Build Coastguard Worker     const int center = (kOuterBlockSize - Width()) / 2;
395*fb1b10abSAndroid Build Coastguard Worker     return (center + (kDataAlignment - 1)) & ~(kDataAlignment - 1);
396*fb1b10abSAndroid Build Coastguard Worker   }
BorderTop() const397*fb1b10abSAndroid Build Coastguard Worker   int BorderTop() const { return (kOuterBlockSize - Height()) / 2; }
398*fb1b10abSAndroid Build Coastguard Worker 
IsIndexInBorder(int i)399*fb1b10abSAndroid Build Coastguard Worker   bool IsIndexInBorder(int i) {
400*fb1b10abSAndroid Build Coastguard Worker     return (i < BorderTop() * kOuterBlockSize ||
401*fb1b10abSAndroid Build Coastguard Worker             i >= (BorderTop() + Height()) * kOuterBlockSize ||
402*fb1b10abSAndroid Build Coastguard Worker             i % kOuterBlockSize < BorderLeft() ||
403*fb1b10abSAndroid Build Coastguard Worker             i % kOuterBlockSize >= (BorderLeft() + Width()));
404*fb1b10abSAndroid Build Coastguard Worker   }
405*fb1b10abSAndroid Build Coastguard Worker 
SetUp()406*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
407*fb1b10abSAndroid Build Coastguard Worker     UUT_ = GET_PARAM(2);
408*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
409*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ != 0) {
410*fb1b10abSAndroid Build Coastguard Worker       mask_ = (1 << UUT_->use_highbd_) - 1;
411*fb1b10abSAndroid Build Coastguard Worker     } else {
412*fb1b10abSAndroid Build Coastguard Worker       mask_ = 255;
413*fb1b10abSAndroid Build Coastguard Worker     }
414*fb1b10abSAndroid Build Coastguard Worker #endif
415*fb1b10abSAndroid Build Coastguard Worker     /* Set up guard blocks for an inner block centered in the outer block */
416*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < kOutputBufferSize; ++i) {
417*fb1b10abSAndroid Build Coastguard Worker       if (IsIndexInBorder(i)) {
418*fb1b10abSAndroid Build Coastguard Worker         output_[i] = 255;
419*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
420*fb1b10abSAndroid Build Coastguard Worker         output16_[i] = mask_;
421*fb1b10abSAndroid Build Coastguard Worker #endif
422*fb1b10abSAndroid Build Coastguard Worker       } else {
423*fb1b10abSAndroid Build Coastguard Worker         output_[i] = 0;
424*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
425*fb1b10abSAndroid Build Coastguard Worker         output16_[i] = 0;
426*fb1b10abSAndroid Build Coastguard Worker #endif
427*fb1b10abSAndroid Build Coastguard Worker       }
428*fb1b10abSAndroid Build Coastguard Worker     }
429*fb1b10abSAndroid Build Coastguard Worker 
430*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::ACMRandom prng;
431*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < kInputBufferSize; ++i) {
432*fb1b10abSAndroid Build Coastguard Worker       if (i & 1) {
433*fb1b10abSAndroid Build Coastguard Worker         input_[i] = 255;
434*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
435*fb1b10abSAndroid Build Coastguard Worker         input16_[i] = mask_;
436*fb1b10abSAndroid Build Coastguard Worker #endif
437*fb1b10abSAndroid Build Coastguard Worker       } else {
438*fb1b10abSAndroid Build Coastguard Worker         input_[i] = prng.Rand8Extremes();
439*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
440*fb1b10abSAndroid Build Coastguard Worker         input16_[i] = prng.Rand16() & mask_;
441*fb1b10abSAndroid Build Coastguard Worker #endif
442*fb1b10abSAndroid Build Coastguard Worker       }
443*fb1b10abSAndroid Build Coastguard Worker     }
444*fb1b10abSAndroid Build Coastguard Worker   }
445*fb1b10abSAndroid Build Coastguard Worker 
SetConstantInput(int value)446*fb1b10abSAndroid Build Coastguard Worker   void SetConstantInput(int value) {
447*fb1b10abSAndroid Build Coastguard Worker     memset(input_, value, kInputBufferSize);
448*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
449*fb1b10abSAndroid Build Coastguard Worker     vpx_memset16(input16_, value, kInputBufferSize);
450*fb1b10abSAndroid Build Coastguard Worker #endif
451*fb1b10abSAndroid Build Coastguard Worker   }
452*fb1b10abSAndroid Build Coastguard Worker 
CopyOutputToRef()453*fb1b10abSAndroid Build Coastguard Worker   void CopyOutputToRef() {
454*fb1b10abSAndroid Build Coastguard Worker     memcpy(output_ref_, output_, kOutputBufferSize);
455*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
456*fb1b10abSAndroid Build Coastguard Worker     memcpy(output16_ref_, output16_,
457*fb1b10abSAndroid Build Coastguard Worker            kOutputBufferSize * sizeof(output16_ref_[0]));
458*fb1b10abSAndroid Build Coastguard Worker #endif
459*fb1b10abSAndroid Build Coastguard Worker   }
460*fb1b10abSAndroid Build Coastguard Worker 
CheckGuardBlocks()461*fb1b10abSAndroid Build Coastguard Worker   void CheckGuardBlocks() {
462*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < kOutputBufferSize; ++i) {
463*fb1b10abSAndroid Build Coastguard Worker       if (IsIndexInBorder(i)) {
464*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(255, output_[i]);
465*fb1b10abSAndroid Build Coastguard Worker       }
466*fb1b10abSAndroid Build Coastguard Worker     }
467*fb1b10abSAndroid Build Coastguard Worker   }
468*fb1b10abSAndroid Build Coastguard Worker 
input() const469*fb1b10abSAndroid Build Coastguard Worker   uint8_t *input() const {
470*fb1b10abSAndroid Build Coastguard Worker     const int offset = BorderTop() * kOuterBlockSize + BorderLeft();
471*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
472*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ == 0) {
473*fb1b10abSAndroid Build Coastguard Worker       return input_ + offset;
474*fb1b10abSAndroid Build Coastguard Worker     } else {
475*fb1b10abSAndroid Build Coastguard Worker       return CAST_TO_BYTEPTR(input16_ + offset);
476*fb1b10abSAndroid Build Coastguard Worker     }
477*fb1b10abSAndroid Build Coastguard Worker #else
478*fb1b10abSAndroid Build Coastguard Worker     return input_ + offset;
479*fb1b10abSAndroid Build Coastguard Worker #endif
480*fb1b10abSAndroid Build Coastguard Worker   }
481*fb1b10abSAndroid Build Coastguard Worker 
output() const482*fb1b10abSAndroid Build Coastguard Worker   uint8_t *output() const {
483*fb1b10abSAndroid Build Coastguard Worker     const int offset = BorderTop() * kOuterBlockSize + BorderLeft();
484*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
485*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ == 0) {
486*fb1b10abSAndroid Build Coastguard Worker       return output_ + offset;
487*fb1b10abSAndroid Build Coastguard Worker     } else {
488*fb1b10abSAndroid Build Coastguard Worker       return CAST_TO_BYTEPTR(output16_ + offset);
489*fb1b10abSAndroid Build Coastguard Worker     }
490*fb1b10abSAndroid Build Coastguard Worker #else
491*fb1b10abSAndroid Build Coastguard Worker     return output_ + offset;
492*fb1b10abSAndroid Build Coastguard Worker #endif
493*fb1b10abSAndroid Build Coastguard Worker   }
494*fb1b10abSAndroid Build Coastguard Worker 
output_ref() const495*fb1b10abSAndroid Build Coastguard Worker   uint8_t *output_ref() const {
496*fb1b10abSAndroid Build Coastguard Worker     const int offset = BorderTop() * kOuterBlockSize + BorderLeft();
497*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
498*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ == 0) {
499*fb1b10abSAndroid Build Coastguard Worker       return output_ref_ + offset;
500*fb1b10abSAndroid Build Coastguard Worker     } else {
501*fb1b10abSAndroid Build Coastguard Worker       return CAST_TO_BYTEPTR(output16_ref_ + offset);
502*fb1b10abSAndroid Build Coastguard Worker     }
503*fb1b10abSAndroid Build Coastguard Worker #else
504*fb1b10abSAndroid Build Coastguard Worker     return output_ref_ + offset;
505*fb1b10abSAndroid Build Coastguard Worker #endif
506*fb1b10abSAndroid Build Coastguard Worker   }
507*fb1b10abSAndroid Build Coastguard Worker 
lookup(uint8_t * list,int index) const508*fb1b10abSAndroid Build Coastguard Worker   uint16_t lookup(uint8_t *list, int index) const {
509*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
510*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ == 0) {
511*fb1b10abSAndroid Build Coastguard Worker       return list[index];
512*fb1b10abSAndroid Build Coastguard Worker     } else {
513*fb1b10abSAndroid Build Coastguard Worker       return CAST_TO_SHORTPTR(list)[index];
514*fb1b10abSAndroid Build Coastguard Worker     }
515*fb1b10abSAndroid Build Coastguard Worker #else
516*fb1b10abSAndroid Build Coastguard Worker     return list[index];
517*fb1b10abSAndroid Build Coastguard Worker #endif
518*fb1b10abSAndroid Build Coastguard Worker   }
519*fb1b10abSAndroid Build Coastguard Worker 
assign_val(uint8_t * list,int index,uint16_t val) const520*fb1b10abSAndroid Build Coastguard Worker   void assign_val(uint8_t *list, int index, uint16_t val) const {
521*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
522*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ == 0) {
523*fb1b10abSAndroid Build Coastguard Worker       list[index] = (uint8_t)val;
524*fb1b10abSAndroid Build Coastguard Worker     } else {
525*fb1b10abSAndroid Build Coastguard Worker       CAST_TO_SHORTPTR(list)[index] = val;
526*fb1b10abSAndroid Build Coastguard Worker     }
527*fb1b10abSAndroid Build Coastguard Worker #else
528*fb1b10abSAndroid Build Coastguard Worker     list[index] = (uint8_t)val;
529*fb1b10abSAndroid Build Coastguard Worker #endif
530*fb1b10abSAndroid Build Coastguard Worker   }
531*fb1b10abSAndroid Build Coastguard Worker 
532*fb1b10abSAndroid Build Coastguard Worker   const ConvolveFunctions *UUT_;
533*fb1b10abSAndroid Build Coastguard Worker   static uint8_t *input_;
534*fb1b10abSAndroid Build Coastguard Worker   static uint8_t *output_;
535*fb1b10abSAndroid Build Coastguard Worker   static uint8_t *output_ref_;
536*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
537*fb1b10abSAndroid Build Coastguard Worker   static uint16_t *input16_;
538*fb1b10abSAndroid Build Coastguard Worker   static uint16_t *output16_;
539*fb1b10abSAndroid Build Coastguard Worker   static uint16_t *output16_ref_;
540*fb1b10abSAndroid Build Coastguard Worker   int mask_;
541*fb1b10abSAndroid Build Coastguard Worker #endif
542*fb1b10abSAndroid Build Coastguard Worker };
543*fb1b10abSAndroid Build Coastguard Worker 
544*fb1b10abSAndroid Build Coastguard Worker uint8_t *ConvolveTest::input_ = nullptr;
545*fb1b10abSAndroid Build Coastguard Worker uint8_t *ConvolveTest::output_ = nullptr;
546*fb1b10abSAndroid Build Coastguard Worker uint8_t *ConvolveTest::output_ref_ = nullptr;
547*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
548*fb1b10abSAndroid Build Coastguard Worker uint16_t *ConvolveTest::input16_ = nullptr;
549*fb1b10abSAndroid Build Coastguard Worker uint16_t *ConvolveTest::output16_ = nullptr;
550*fb1b10abSAndroid Build Coastguard Worker uint16_t *ConvolveTest::output16_ref_ = nullptr;
551*fb1b10abSAndroid Build Coastguard Worker #endif
552*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,GuardBlocks)553*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, GuardBlocks) { CheckGuardBlocks(); }
554*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_Copy_Speed)555*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_Copy_Speed) {
556*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
557*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
558*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
559*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
560*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
561*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
562*fb1b10abSAndroid Build Coastguard Worker 
563*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
564*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
565*fb1b10abSAndroid Build Coastguard Worker     UUT_->copy_[0](in, kInputStride, out, kOutputStride, nullptr, 0, 0, 0, 0,
566*fb1b10abSAndroid Build Coastguard Worker                    width, height);
567*fb1b10abSAndroid Build Coastguard Worker   }
568*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
569*fb1b10abSAndroid Build Coastguard Worker 
570*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
571*fb1b10abSAndroid Build Coastguard Worker   printf("convolve_copy_%dx%d_%d: %d us\n", width, height,
572*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
573*fb1b10abSAndroid Build Coastguard Worker }
574*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_Avg_Speed)575*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_Avg_Speed) {
576*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
577*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
578*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
579*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
580*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
581*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
582*fb1b10abSAndroid Build Coastguard Worker 
583*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
584*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
585*fb1b10abSAndroid Build Coastguard Worker     UUT_->copy_[1](in, kInputStride, out, kOutputStride, nullptr, 0, 0, 0, 0,
586*fb1b10abSAndroid Build Coastguard Worker                    width, height);
587*fb1b10abSAndroid Build Coastguard Worker   }
588*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
589*fb1b10abSAndroid Build Coastguard Worker 
590*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
591*fb1b10abSAndroid Build Coastguard Worker   printf("convolve_avg_%dx%d_%d: %d us\n", width, height,
592*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
593*fb1b10abSAndroid Build Coastguard Worker }
594*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_Scale_Speed)595*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_Scale_Speed) {
596*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
597*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
598*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const eighttap = vp9_filter_kernels[EIGHTTAP];
599*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
600*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
601*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
602*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
603*fb1b10abSAndroid Build Coastguard Worker 
604*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
605*fb1b10abSAndroid Build Coastguard Worker 
606*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
607*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
608*fb1b10abSAndroid Build Coastguard Worker     UUT_->shv8_[0](in, kInputStride, out, kOutputStride, eighttap, 8, 16, 8, 16,
609*fb1b10abSAndroid Build Coastguard Worker                    width, height);
610*fb1b10abSAndroid Build Coastguard Worker   }
611*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
612*fb1b10abSAndroid Build Coastguard Worker 
613*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
614*fb1b10abSAndroid Build Coastguard Worker   printf("convolve_scale_%dx%d_%d: %d us\n", width, height,
615*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
616*fb1b10abSAndroid Build Coastguard Worker }
617*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_8Tap_Speed)618*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_8Tap_Speed) {
619*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
620*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
621*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const eighttap = vp9_filter_kernels[EIGHTTAP_SHARP];
622*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
623*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
624*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
625*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
626*fb1b10abSAndroid Build Coastguard Worker 
627*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
628*fb1b10abSAndroid Build Coastguard Worker 
629*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
630*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
631*fb1b10abSAndroid Build Coastguard Worker     UUT_->hv8_[0](in, kInputStride, out, kOutputStride, eighttap, 8, 16, 8, 16,
632*fb1b10abSAndroid Build Coastguard Worker                   width, height);
633*fb1b10abSAndroid Build Coastguard Worker   }
634*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
635*fb1b10abSAndroid Build Coastguard Worker 
636*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
637*fb1b10abSAndroid Build Coastguard Worker   printf("convolve8_%dx%d_%d: %d us\n", width, height,
638*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
639*fb1b10abSAndroid Build Coastguard Worker }
640*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_8Tap_Horiz_Speed)641*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_8Tap_Horiz_Speed) {
642*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
643*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
644*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const eighttap = vp9_filter_kernels[EIGHTTAP_SHARP];
645*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
646*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
647*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
648*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
649*fb1b10abSAndroid Build Coastguard Worker 
650*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
651*fb1b10abSAndroid Build Coastguard Worker 
652*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
653*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
654*fb1b10abSAndroid Build Coastguard Worker     UUT_->h8_[0](in, kInputStride, out, kOutputStride, eighttap, 8, 16, 8, 16,
655*fb1b10abSAndroid Build Coastguard Worker                  width, height);
656*fb1b10abSAndroid Build Coastguard Worker   }
657*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
658*fb1b10abSAndroid Build Coastguard Worker 
659*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
660*fb1b10abSAndroid Build Coastguard Worker   printf("convolve8_horiz_%dx%d_%d: %d us\n", width, height,
661*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
662*fb1b10abSAndroid Build Coastguard Worker }
663*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_8Tap_Vert_Speed)664*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_8Tap_Vert_Speed) {
665*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
666*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
667*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const eighttap = vp9_filter_kernels[EIGHTTAP_SHARP];
668*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
669*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
670*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
671*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
672*fb1b10abSAndroid Build Coastguard Worker 
673*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
674*fb1b10abSAndroid Build Coastguard Worker 
675*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
676*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
677*fb1b10abSAndroid Build Coastguard Worker     UUT_->v8_[0](in, kInputStride, out, kOutputStride, eighttap, 8, 16, 8, 16,
678*fb1b10abSAndroid Build Coastguard Worker                  width, height);
679*fb1b10abSAndroid Build Coastguard Worker   }
680*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
681*fb1b10abSAndroid Build Coastguard Worker 
682*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
683*fb1b10abSAndroid Build Coastguard Worker   printf("convolve8_vert_%dx%d_%d: %d us\n", width, height,
684*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
685*fb1b10abSAndroid Build Coastguard Worker }
686*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_4Tap_Speed)687*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_4Tap_Speed) {
688*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
689*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
690*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const fourtap = vp9_filter_kernels[FOURTAP];
691*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
692*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
693*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
694*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
695*fb1b10abSAndroid Build Coastguard Worker 
696*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
697*fb1b10abSAndroid Build Coastguard Worker 
698*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
699*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
700*fb1b10abSAndroid Build Coastguard Worker     UUT_->hv8_[0](in, kInputStride, out, kOutputStride, fourtap, 8, 16, 8, 16,
701*fb1b10abSAndroid Build Coastguard Worker                   width, height);
702*fb1b10abSAndroid Build Coastguard Worker   }
703*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
704*fb1b10abSAndroid Build Coastguard Worker 
705*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
706*fb1b10abSAndroid Build Coastguard Worker   printf("convolve4_%dx%d_%d: %d us\n", width, height,
707*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
708*fb1b10abSAndroid Build Coastguard Worker }
709*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_4Tap_Horiz_Speed)710*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_4Tap_Horiz_Speed) {
711*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
712*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
713*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const fourtap = vp9_filter_kernels[FOURTAP];
714*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
715*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
716*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
717*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
718*fb1b10abSAndroid Build Coastguard Worker 
719*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
720*fb1b10abSAndroid Build Coastguard Worker 
721*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
722*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
723*fb1b10abSAndroid Build Coastguard Worker     UUT_->h8_[0](in, kInputStride, out, kOutputStride, fourtap, 8, 16, 8, 16,
724*fb1b10abSAndroid Build Coastguard Worker                  width, height);
725*fb1b10abSAndroid Build Coastguard Worker   }
726*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
727*fb1b10abSAndroid Build Coastguard Worker 
728*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
729*fb1b10abSAndroid Build Coastguard Worker   printf("convolve4_horiz_%dx%d_%d: %d us\n", width, height,
730*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
731*fb1b10abSAndroid Build Coastguard Worker }
732*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,DISABLED_4Tap_Vert_Speed)733*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_4Tap_Vert_Speed) {
734*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
735*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
736*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const fourtap = vp9_filter_kernels[FOURTAP];
737*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
738*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
739*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
740*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
741*fb1b10abSAndroid Build Coastguard Worker 
742*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
743*fb1b10abSAndroid Build Coastguard Worker 
744*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
745*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
746*fb1b10abSAndroid Build Coastguard Worker     UUT_->v8_[0](in, kInputStride, out, kOutputStride, fourtap, 8, 16, 8, 16,
747*fb1b10abSAndroid Build Coastguard Worker                  width, height);
748*fb1b10abSAndroid Build Coastguard Worker   }
749*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
750*fb1b10abSAndroid Build Coastguard Worker 
751*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
752*fb1b10abSAndroid Build Coastguard Worker   printf("convolve4_vert_%dx%d_%d: %d us\n", width, height,
753*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
754*fb1b10abSAndroid Build Coastguard Worker }
TEST_P(ConvolveTest,DISABLED_8Tap_Avg_Speed)755*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, DISABLED_8Tap_Avg_Speed) {
756*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const in = input();
757*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
758*fb1b10abSAndroid Build Coastguard Worker   const InterpKernel *const eighttap = vp9_filter_kernels[EIGHTTAP_SHARP];
759*fb1b10abSAndroid Build Coastguard Worker   const int kNumTests = 5000000;
760*fb1b10abSAndroid Build Coastguard Worker   const int width = Width();
761*fb1b10abSAndroid Build Coastguard Worker   const int height = Height();
762*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer timer;
763*fb1b10abSAndroid Build Coastguard Worker 
764*fb1b10abSAndroid Build Coastguard Worker   SetConstantInput(127);
765*fb1b10abSAndroid Build Coastguard Worker 
766*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_start(&timer);
767*fb1b10abSAndroid Build Coastguard Worker   for (int n = 0; n < kNumTests; ++n) {
768*fb1b10abSAndroid Build Coastguard Worker     UUT_->hv8_[1](in, kInputStride, out, kOutputStride, eighttap, 8, 16, 8, 16,
769*fb1b10abSAndroid Build Coastguard Worker                   width, height);
770*fb1b10abSAndroid Build Coastguard Worker   }
771*fb1b10abSAndroid Build Coastguard Worker   vpx_usec_timer_mark(&timer);
772*fb1b10abSAndroid Build Coastguard Worker 
773*fb1b10abSAndroid Build Coastguard Worker   const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
774*fb1b10abSAndroid Build Coastguard Worker   printf("convolve8_avg_%dx%d_%d: %d us\n", width, height,
775*fb1b10abSAndroid Build Coastguard Worker          UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time);
776*fb1b10abSAndroid Build Coastguard Worker }
777*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,Copy)778*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, Copy) {
779*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
780*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
781*fb1b10abSAndroid Build Coastguard Worker 
782*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT_->copy_[0](in, kInputStride, out, kOutputStride,
783*fb1b10abSAndroid Build Coastguard Worker                                           nullptr, 0, 0, 0, 0, Width(),
784*fb1b10abSAndroid Build Coastguard Worker                                           Height()));
785*fb1b10abSAndroid Build Coastguard Worker 
786*fb1b10abSAndroid Build Coastguard Worker   CheckGuardBlocks();
787*fb1b10abSAndroid Build Coastguard Worker 
788*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
789*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x)
790*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(lookup(out, y * kOutputStride + x),
791*fb1b10abSAndroid Build Coastguard Worker                 lookup(in, y * kInputStride + x))
792*fb1b10abSAndroid Build Coastguard Worker           << "(" << x << "," << y << ")";
793*fb1b10abSAndroid Build Coastguard Worker   }
794*fb1b10abSAndroid Build Coastguard Worker }
795*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,Avg)796*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, Avg) {
797*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
798*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
799*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out_ref = output_ref();
800*fb1b10abSAndroid Build Coastguard Worker   CopyOutputToRef();
801*fb1b10abSAndroid Build Coastguard Worker 
802*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT_->copy_[1](in, kInputStride, out, kOutputStride,
803*fb1b10abSAndroid Build Coastguard Worker                                           nullptr, 0, 0, 0, 0, Width(),
804*fb1b10abSAndroid Build Coastguard Worker                                           Height()));
805*fb1b10abSAndroid Build Coastguard Worker 
806*fb1b10abSAndroid Build Coastguard Worker   CheckGuardBlocks();
807*fb1b10abSAndroid Build Coastguard Worker 
808*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
809*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x)
810*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(lookup(out, y * kOutputStride + x),
811*fb1b10abSAndroid Build Coastguard Worker                 ROUND_POWER_OF_TWO(lookup(in, y * kInputStride + x) +
812*fb1b10abSAndroid Build Coastguard Worker                                        lookup(out_ref, y * kOutputStride + x),
813*fb1b10abSAndroid Build Coastguard Worker                                    1))
814*fb1b10abSAndroid Build Coastguard Worker           << "(" << x << "," << y << ")";
815*fb1b10abSAndroid Build Coastguard Worker   }
816*fb1b10abSAndroid Build Coastguard Worker }
817*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,CopyHoriz)818*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, CopyHoriz) {
819*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
820*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
821*fb1b10abSAndroid Build Coastguard Worker 
822*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT_->sh8_[0](in, kInputStride, out, kOutputStride,
823*fb1b10abSAndroid Build Coastguard Worker                                          vp9_filter_kernels[0], 0, 16, 0, 16,
824*fb1b10abSAndroid Build Coastguard Worker                                          Width(), Height()));
825*fb1b10abSAndroid Build Coastguard Worker 
826*fb1b10abSAndroid Build Coastguard Worker   CheckGuardBlocks();
827*fb1b10abSAndroid Build Coastguard Worker 
828*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
829*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x)
830*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(lookup(out, y * kOutputStride + x),
831*fb1b10abSAndroid Build Coastguard Worker                 lookup(in, y * kInputStride + x))
832*fb1b10abSAndroid Build Coastguard Worker           << "(" << x << "," << y << ")";
833*fb1b10abSAndroid Build Coastguard Worker   }
834*fb1b10abSAndroid Build Coastguard Worker }
835*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,CopyVert)836*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, CopyVert) {
837*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
838*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
839*fb1b10abSAndroid Build Coastguard Worker 
840*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT_->sv8_[0](in, kInputStride, out, kOutputStride,
841*fb1b10abSAndroid Build Coastguard Worker                                          vp9_filter_kernels[0], 0, 16, 0, 16,
842*fb1b10abSAndroid Build Coastguard Worker                                          Width(), Height()));
843*fb1b10abSAndroid Build Coastguard Worker 
844*fb1b10abSAndroid Build Coastguard Worker   CheckGuardBlocks();
845*fb1b10abSAndroid Build Coastguard Worker 
846*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
847*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x)
848*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(lookup(out, y * kOutputStride + x),
849*fb1b10abSAndroid Build Coastguard Worker                 lookup(in, y * kInputStride + x))
850*fb1b10abSAndroid Build Coastguard Worker           << "(" << x << "," << y << ")";
851*fb1b10abSAndroid Build Coastguard Worker   }
852*fb1b10abSAndroid Build Coastguard Worker }
853*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,Copy2D)854*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, Copy2D) {
855*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
856*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
857*fb1b10abSAndroid Build Coastguard Worker 
858*fb1b10abSAndroid Build Coastguard Worker   ASM_REGISTER_STATE_CHECK(UUT_->shv8_[0](in, kInputStride, out, kOutputStride,
859*fb1b10abSAndroid Build Coastguard Worker                                           vp9_filter_kernels[0], 0, 16, 0, 16,
860*fb1b10abSAndroid Build Coastguard Worker                                           Width(), Height()));
861*fb1b10abSAndroid Build Coastguard Worker 
862*fb1b10abSAndroid Build Coastguard Worker   CheckGuardBlocks();
863*fb1b10abSAndroid Build Coastguard Worker 
864*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
865*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x)
866*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(lookup(out, y * kOutputStride + x),
867*fb1b10abSAndroid Build Coastguard Worker                 lookup(in, y * kInputStride + x))
868*fb1b10abSAndroid Build Coastguard Worker           << "(" << x << "," << y << ")";
869*fb1b10abSAndroid Build Coastguard Worker   }
870*fb1b10abSAndroid Build Coastguard Worker }
871*fb1b10abSAndroid Build Coastguard Worker 
872*fb1b10abSAndroid Build Coastguard Worker const int kNumFilterBanks = 5;
873*fb1b10abSAndroid Build Coastguard Worker const int kNumFilters = 16;
874*fb1b10abSAndroid Build Coastguard Worker 
TEST(ConvolveTest,FiltersWontSaturateWhenAddedPairwise)875*fb1b10abSAndroid Build Coastguard Worker TEST(ConvolveTest, FiltersWontSaturateWhenAddedPairwise) {
876*fb1b10abSAndroid Build Coastguard Worker   for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
877*fb1b10abSAndroid Build Coastguard Worker     const InterpKernel *filters =
878*fb1b10abSAndroid Build Coastguard Worker         vp9_filter_kernels[static_cast<INTERP_FILTER>(filter_bank)];
879*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < kNumFilters; i++) {
880*fb1b10abSAndroid Build Coastguard Worker       const int p0 = filters[i][0] + filters[i][1];
881*fb1b10abSAndroid Build Coastguard Worker       const int p1 = filters[i][2] + filters[i][3];
882*fb1b10abSAndroid Build Coastguard Worker       const int p2 = filters[i][4] + filters[i][5];
883*fb1b10abSAndroid Build Coastguard Worker       const int p3 = filters[i][6] + filters[i][7];
884*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p0, 128);
885*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p1, 128);
886*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p2, 128);
887*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p3, 128);
888*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p0 + p3, 128);
889*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p0 + p3 + p1, 128);
890*fb1b10abSAndroid Build Coastguard Worker       EXPECT_LE(p0 + p3 + p1 + p2, 128);
891*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(p0 + p1 + p2 + p3, 128);
892*fb1b10abSAndroid Build Coastguard Worker     }
893*fb1b10abSAndroid Build Coastguard Worker   }
894*fb1b10abSAndroid Build Coastguard Worker }
895*fb1b10abSAndroid Build Coastguard Worker 
896*fb1b10abSAndroid Build Coastguard Worker const WrapperFilterBlock2d8Func wrapper_filter_block2d_8[2] = {
897*fb1b10abSAndroid Build Coastguard Worker   wrapper_filter_block2d_8_c, wrapper_filter_average_block2d_8_c
898*fb1b10abSAndroid Build Coastguard Worker };
899*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,MatchesReferenceSubpixelFilter)900*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, MatchesReferenceSubpixelFilter) {
901*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < 2; ++i) {
902*fb1b10abSAndroid Build Coastguard Worker     uint8_t *const in = input();
903*fb1b10abSAndroid Build Coastguard Worker     uint8_t *const out = output();
904*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
905*fb1b10abSAndroid Build Coastguard Worker     uint8_t ref8[kOutputStride * kMaxDimension];
906*fb1b10abSAndroid Build Coastguard Worker     uint16_t ref16[kOutputStride * kMaxDimension];
907*fb1b10abSAndroid Build Coastguard Worker     uint8_t *ref;
908*fb1b10abSAndroid Build Coastguard Worker     if (UUT_->use_highbd_ == 0) {
909*fb1b10abSAndroid Build Coastguard Worker       ref = ref8;
910*fb1b10abSAndroid Build Coastguard Worker     } else {
911*fb1b10abSAndroid Build Coastguard Worker       ref = CAST_TO_BYTEPTR(ref16);
912*fb1b10abSAndroid Build Coastguard Worker     }
913*fb1b10abSAndroid Build Coastguard Worker #else
914*fb1b10abSAndroid Build Coastguard Worker     uint8_t ref[kOutputStride * kMaxDimension];
915*fb1b10abSAndroid Build Coastguard Worker #endif
916*fb1b10abSAndroid Build Coastguard Worker 
917*fb1b10abSAndroid Build Coastguard Worker     // Populate ref and out with some random data
918*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::ACMRandom prng;
919*fb1b10abSAndroid Build Coastguard Worker     for (int y = 0; y < Height(); ++y) {
920*fb1b10abSAndroid Build Coastguard Worker       for (int x = 0; x < Width(); ++x) {
921*fb1b10abSAndroid Build Coastguard Worker         uint16_t r;
922*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
923*fb1b10abSAndroid Build Coastguard Worker         if (UUT_->use_highbd_ == 0 || UUT_->use_highbd_ == 8) {
924*fb1b10abSAndroid Build Coastguard Worker           r = prng.Rand8Extremes();
925*fb1b10abSAndroid Build Coastguard Worker         } else {
926*fb1b10abSAndroid Build Coastguard Worker           r = prng.Rand16() & mask_;
927*fb1b10abSAndroid Build Coastguard Worker         }
928*fb1b10abSAndroid Build Coastguard Worker #else
929*fb1b10abSAndroid Build Coastguard Worker         r = prng.Rand8Extremes();
930*fb1b10abSAndroid Build Coastguard Worker #endif
931*fb1b10abSAndroid Build Coastguard Worker 
932*fb1b10abSAndroid Build Coastguard Worker         assign_val(out, y * kOutputStride + x, r);
933*fb1b10abSAndroid Build Coastguard Worker         assign_val(ref, y * kOutputStride + x, r);
934*fb1b10abSAndroid Build Coastguard Worker       }
935*fb1b10abSAndroid Build Coastguard Worker     }
936*fb1b10abSAndroid Build Coastguard Worker 
937*fb1b10abSAndroid Build Coastguard Worker     for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
938*fb1b10abSAndroid Build Coastguard Worker       const InterpKernel *filters =
939*fb1b10abSAndroid Build Coastguard Worker           vp9_filter_kernels[static_cast<INTERP_FILTER>(filter_bank)];
940*fb1b10abSAndroid Build Coastguard Worker 
941*fb1b10abSAndroid Build Coastguard Worker       for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
942*fb1b10abSAndroid Build Coastguard Worker         for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
943*fb1b10abSAndroid Build Coastguard Worker           wrapper_filter_block2d_8[i](in, kInputStride, filters[filter_x],
944*fb1b10abSAndroid Build Coastguard Worker                                       filters[filter_y], ref, kOutputStride,
945*fb1b10abSAndroid Build Coastguard Worker                                       Width(), Height(), UUT_->use_highbd_);
946*fb1b10abSAndroid Build Coastguard Worker 
947*fb1b10abSAndroid Build Coastguard Worker           if (filter_x && filter_y)
948*fb1b10abSAndroid Build Coastguard Worker             ASM_REGISTER_STATE_CHECK(
949*fb1b10abSAndroid Build Coastguard Worker                 UUT_->hv8_[i](in, kInputStride, out, kOutputStride, filters,
950*fb1b10abSAndroid Build Coastguard Worker                               filter_x, 16, filter_y, 16, Width(), Height()));
951*fb1b10abSAndroid Build Coastguard Worker           else if (filter_y)
952*fb1b10abSAndroid Build Coastguard Worker             ASM_REGISTER_STATE_CHECK(
953*fb1b10abSAndroid Build Coastguard Worker                 UUT_->v8_[i](in, kInputStride, out, kOutputStride, filters, 0,
954*fb1b10abSAndroid Build Coastguard Worker                              16, filter_y, 16, Width(), Height()));
955*fb1b10abSAndroid Build Coastguard Worker           else if (filter_x)
956*fb1b10abSAndroid Build Coastguard Worker             ASM_REGISTER_STATE_CHECK(
957*fb1b10abSAndroid Build Coastguard Worker                 UUT_->h8_[i](in, kInputStride, out, kOutputStride, filters,
958*fb1b10abSAndroid Build Coastguard Worker                              filter_x, 16, 0, 16, Width(), Height()));
959*fb1b10abSAndroid Build Coastguard Worker           else
960*fb1b10abSAndroid Build Coastguard Worker             ASM_REGISTER_STATE_CHECK(
961*fb1b10abSAndroid Build Coastguard Worker                 UUT_->copy_[i](in, kInputStride, out, kOutputStride, nullptr, 0,
962*fb1b10abSAndroid Build Coastguard Worker                                0, 0, 0, Width(), Height()));
963*fb1b10abSAndroid Build Coastguard Worker 
964*fb1b10abSAndroid Build Coastguard Worker           CheckGuardBlocks();
965*fb1b10abSAndroid Build Coastguard Worker 
966*fb1b10abSAndroid Build Coastguard Worker           for (int y = 0; y < Height(); ++y) {
967*fb1b10abSAndroid Build Coastguard Worker             for (int x = 0; x < Width(); ++x)
968*fb1b10abSAndroid Build Coastguard Worker               ASSERT_EQ(lookup(ref, y * kOutputStride + x),
969*fb1b10abSAndroid Build Coastguard Worker                         lookup(out, y * kOutputStride + x))
970*fb1b10abSAndroid Build Coastguard Worker                   << "mismatch at (" << x << "," << y << "), "
971*fb1b10abSAndroid Build Coastguard Worker                   << "filters (" << filter_bank << "," << filter_x << ","
972*fb1b10abSAndroid Build Coastguard Worker                   << filter_y << ")";
973*fb1b10abSAndroid Build Coastguard Worker           }
974*fb1b10abSAndroid Build Coastguard Worker         }
975*fb1b10abSAndroid Build Coastguard Worker       }
976*fb1b10abSAndroid Build Coastguard Worker     }
977*fb1b10abSAndroid Build Coastguard Worker   }
978*fb1b10abSAndroid Build Coastguard Worker }
979*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,FilterExtremes)980*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, FilterExtremes) {
981*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
982*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
983*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
984*fb1b10abSAndroid Build Coastguard Worker   uint8_t ref8[kOutputStride * kMaxDimension];
985*fb1b10abSAndroid Build Coastguard Worker   uint16_t ref16[kOutputStride * kMaxDimension];
986*fb1b10abSAndroid Build Coastguard Worker   uint8_t *ref;
987*fb1b10abSAndroid Build Coastguard Worker   if (UUT_->use_highbd_ == 0) {
988*fb1b10abSAndroid Build Coastguard Worker     ref = ref8;
989*fb1b10abSAndroid Build Coastguard Worker   } else {
990*fb1b10abSAndroid Build Coastguard Worker     ref = CAST_TO_BYTEPTR(ref16);
991*fb1b10abSAndroid Build Coastguard Worker   }
992*fb1b10abSAndroid Build Coastguard Worker #else
993*fb1b10abSAndroid Build Coastguard Worker   uint8_t ref[kOutputStride * kMaxDimension];
994*fb1b10abSAndroid Build Coastguard Worker #endif
995*fb1b10abSAndroid Build Coastguard Worker 
996*fb1b10abSAndroid Build Coastguard Worker   // Populate ref and out with some random data
997*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::ACMRandom prng;
998*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
999*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x) {
1000*fb1b10abSAndroid Build Coastguard Worker       uint16_t r;
1001*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1002*fb1b10abSAndroid Build Coastguard Worker       if (UUT_->use_highbd_ == 0 || UUT_->use_highbd_ == 8) {
1003*fb1b10abSAndroid Build Coastguard Worker         r = prng.Rand8Extremes();
1004*fb1b10abSAndroid Build Coastguard Worker       } else {
1005*fb1b10abSAndroid Build Coastguard Worker         r = prng.Rand16() & mask_;
1006*fb1b10abSAndroid Build Coastguard Worker       }
1007*fb1b10abSAndroid Build Coastguard Worker #else
1008*fb1b10abSAndroid Build Coastguard Worker       r = prng.Rand8Extremes();
1009*fb1b10abSAndroid Build Coastguard Worker #endif
1010*fb1b10abSAndroid Build Coastguard Worker       assign_val(out, y * kOutputStride + x, r);
1011*fb1b10abSAndroid Build Coastguard Worker       assign_val(ref, y * kOutputStride + x, r);
1012*fb1b10abSAndroid Build Coastguard Worker     }
1013*fb1b10abSAndroid Build Coastguard Worker   }
1014*fb1b10abSAndroid Build Coastguard Worker 
1015*fb1b10abSAndroid Build Coastguard Worker   for (int axis = 0; axis < 2; axis++) {
1016*fb1b10abSAndroid Build Coastguard Worker     int seed_val = 0;
1017*fb1b10abSAndroid Build Coastguard Worker     while (seed_val < 256) {
1018*fb1b10abSAndroid Build Coastguard Worker       for (int y = 0; y < 8; ++y) {
1019*fb1b10abSAndroid Build Coastguard Worker         for (int x = 0; x < 8; ++x) {
1020*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1021*fb1b10abSAndroid Build Coastguard Worker           assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1,
1022*fb1b10abSAndroid Build Coastguard Worker                      ((seed_val >> (axis ? y : x)) & 1) * mask_);
1023*fb1b10abSAndroid Build Coastguard Worker #else
1024*fb1b10abSAndroid Build Coastguard Worker           assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1,
1025*fb1b10abSAndroid Build Coastguard Worker                      ((seed_val >> (axis ? y : x)) & 1) * 255);
1026*fb1b10abSAndroid Build Coastguard Worker #endif
1027*fb1b10abSAndroid Build Coastguard Worker           if (axis) seed_val++;
1028*fb1b10abSAndroid Build Coastguard Worker         }
1029*fb1b10abSAndroid Build Coastguard Worker         if (axis) {
1030*fb1b10abSAndroid Build Coastguard Worker           seed_val -= 8;
1031*fb1b10abSAndroid Build Coastguard Worker         } else {
1032*fb1b10abSAndroid Build Coastguard Worker           seed_val++;
1033*fb1b10abSAndroid Build Coastguard Worker         }
1034*fb1b10abSAndroid Build Coastguard Worker       }
1035*fb1b10abSAndroid Build Coastguard Worker       if (axis) seed_val += 8;
1036*fb1b10abSAndroid Build Coastguard Worker 
1037*fb1b10abSAndroid Build Coastguard Worker       for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
1038*fb1b10abSAndroid Build Coastguard Worker         const InterpKernel *filters =
1039*fb1b10abSAndroid Build Coastguard Worker             vp9_filter_kernels[static_cast<INTERP_FILTER>(filter_bank)];
1040*fb1b10abSAndroid Build Coastguard Worker         for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
1041*fb1b10abSAndroid Build Coastguard Worker           for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
1042*fb1b10abSAndroid Build Coastguard Worker             wrapper_filter_block2d_8_c(in, kInputStride, filters[filter_x],
1043*fb1b10abSAndroid Build Coastguard Worker                                        filters[filter_y], ref, kOutputStride,
1044*fb1b10abSAndroid Build Coastguard Worker                                        Width(), Height(), UUT_->use_highbd_);
1045*fb1b10abSAndroid Build Coastguard Worker             if (filter_x && filter_y)
1046*fb1b10abSAndroid Build Coastguard Worker               ASM_REGISTER_STATE_CHECK(
1047*fb1b10abSAndroid Build Coastguard Worker                   UUT_->hv8_[0](in, kInputStride, out, kOutputStride, filters,
1048*fb1b10abSAndroid Build Coastguard Worker                                 filter_x, 16, filter_y, 16, Width(), Height()));
1049*fb1b10abSAndroid Build Coastguard Worker             else if (filter_y)
1050*fb1b10abSAndroid Build Coastguard Worker               ASM_REGISTER_STATE_CHECK(
1051*fb1b10abSAndroid Build Coastguard Worker                   UUT_->v8_[0](in, kInputStride, out, kOutputStride, filters, 0,
1052*fb1b10abSAndroid Build Coastguard Worker                                16, filter_y, 16, Width(), Height()));
1053*fb1b10abSAndroid Build Coastguard Worker             else if (filter_x)
1054*fb1b10abSAndroid Build Coastguard Worker               ASM_REGISTER_STATE_CHECK(
1055*fb1b10abSAndroid Build Coastguard Worker                   UUT_->h8_[0](in, kInputStride, out, kOutputStride, filters,
1056*fb1b10abSAndroid Build Coastguard Worker                                filter_x, 16, 0, 16, Width(), Height()));
1057*fb1b10abSAndroid Build Coastguard Worker             else
1058*fb1b10abSAndroid Build Coastguard Worker               ASM_REGISTER_STATE_CHECK(
1059*fb1b10abSAndroid Build Coastguard Worker                   UUT_->copy_[0](in, kInputStride, out, kOutputStride, nullptr,
1060*fb1b10abSAndroid Build Coastguard Worker                                  0, 0, 0, 0, Width(), Height()));
1061*fb1b10abSAndroid Build Coastguard Worker 
1062*fb1b10abSAndroid Build Coastguard Worker             for (int y = 0; y < Height(); ++y) {
1063*fb1b10abSAndroid Build Coastguard Worker               for (int x = 0; x < Width(); ++x)
1064*fb1b10abSAndroid Build Coastguard Worker                 ASSERT_EQ(lookup(ref, y * kOutputStride + x),
1065*fb1b10abSAndroid Build Coastguard Worker                           lookup(out, y * kOutputStride + x))
1066*fb1b10abSAndroid Build Coastguard Worker                     << "mismatch at (" << x << "," << y << "), "
1067*fb1b10abSAndroid Build Coastguard Worker                     << "filters (" << filter_bank << "," << filter_x << ","
1068*fb1b10abSAndroid Build Coastguard Worker                     << filter_y << ")";
1069*fb1b10abSAndroid Build Coastguard Worker             }
1070*fb1b10abSAndroid Build Coastguard Worker           }
1071*fb1b10abSAndroid Build Coastguard Worker         }
1072*fb1b10abSAndroid Build Coastguard Worker       }
1073*fb1b10abSAndroid Build Coastguard Worker     }
1074*fb1b10abSAndroid Build Coastguard Worker   }
1075*fb1b10abSAndroid Build Coastguard Worker }
1076*fb1b10abSAndroid Build Coastguard Worker 
1077*fb1b10abSAndroid Build Coastguard Worker /* This test exercises that enough rows and columns are filtered with every
1078*fb1b10abSAndroid Build Coastguard Worker    possible initial fractional positions and scaling steps. */
1079*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_VP9_HIGHBITDEPTH
1080*fb1b10abSAndroid Build Coastguard Worker static const ConvolveFunc scaled_2d_c_funcs[2] = { vpx_scaled_2d_c,
1081*fb1b10abSAndroid Build Coastguard Worker                                                    vpx_scaled_avg_2d_c };
1082*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ConvolveTest,CheckScalingFiltering)1083*fb1b10abSAndroid Build Coastguard Worker TEST_P(ConvolveTest, CheckScalingFiltering) {
1084*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const in = input();
1085*fb1b10abSAndroid Build Coastguard Worker   uint8_t *const out = output();
1086*fb1b10abSAndroid Build Coastguard Worker   uint8_t ref[kOutputStride * kMaxDimension];
1087*fb1b10abSAndroid Build Coastguard Worker 
1088*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::ACMRandom prng;
1089*fb1b10abSAndroid Build Coastguard Worker   for (int y = 0; y < Height(); ++y) {
1090*fb1b10abSAndroid Build Coastguard Worker     for (int x = 0; x < Width(); ++x) {
1091*fb1b10abSAndroid Build Coastguard Worker       const uint16_t r = prng.Rand8Extremes();
1092*fb1b10abSAndroid Build Coastguard Worker       assign_val(in, y * kInputStride + x, r);
1093*fb1b10abSAndroid Build Coastguard Worker     }
1094*fb1b10abSAndroid Build Coastguard Worker   }
1095*fb1b10abSAndroid Build Coastguard Worker 
1096*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < 2; ++i) {
1097*fb1b10abSAndroid Build Coastguard Worker     for (INTERP_FILTER filter_type = 0; filter_type < 4; ++filter_type) {
1098*fb1b10abSAndroid Build Coastguard Worker       const InterpKernel *const eighttap = vp9_filter_kernels[filter_type];
1099*fb1b10abSAndroid Build Coastguard Worker       for (int frac = 0; frac < 16; ++frac) {
1100*fb1b10abSAndroid Build Coastguard Worker         for (int step = 1; step <= 32; ++step) {
1101*fb1b10abSAndroid Build Coastguard Worker           /* Test the horizontal and vertical filters in combination. */
1102*fb1b10abSAndroid Build Coastguard Worker           scaled_2d_c_funcs[i](in, kInputStride, ref, kOutputStride, eighttap,
1103*fb1b10abSAndroid Build Coastguard Worker                                frac, step, frac, step, Width(), Height());
1104*fb1b10abSAndroid Build Coastguard Worker           ASM_REGISTER_STATE_CHECK(
1105*fb1b10abSAndroid Build Coastguard Worker               UUT_->shv8_[i](in, kInputStride, out, kOutputStride, eighttap,
1106*fb1b10abSAndroid Build Coastguard Worker                              frac, step, frac, step, Width(), Height()));
1107*fb1b10abSAndroid Build Coastguard Worker 
1108*fb1b10abSAndroid Build Coastguard Worker           CheckGuardBlocks();
1109*fb1b10abSAndroid Build Coastguard Worker 
1110*fb1b10abSAndroid Build Coastguard Worker           for (int y = 0; y < Height(); ++y) {
1111*fb1b10abSAndroid Build Coastguard Worker             for (int x = 0; x < Width(); ++x) {
1112*fb1b10abSAndroid Build Coastguard Worker               ASSERT_EQ(lookup(ref, y * kOutputStride + x),
1113*fb1b10abSAndroid Build Coastguard Worker                         lookup(out, y * kOutputStride + x))
1114*fb1b10abSAndroid Build Coastguard Worker                   << "x == " << x << ", y == " << y << ", frac == " << frac
1115*fb1b10abSAndroid Build Coastguard Worker                   << ", step == " << step;
1116*fb1b10abSAndroid Build Coastguard Worker             }
1117*fb1b10abSAndroid Build Coastguard Worker           }
1118*fb1b10abSAndroid Build Coastguard Worker         }
1119*fb1b10abSAndroid Build Coastguard Worker       }
1120*fb1b10abSAndroid Build Coastguard Worker     }
1121*fb1b10abSAndroid Build Coastguard Worker   }
1122*fb1b10abSAndroid Build Coastguard Worker }
1123*fb1b10abSAndroid Build Coastguard Worker #endif
1124*fb1b10abSAndroid Build Coastguard Worker 
1125*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
1126*fb1b10abSAndroid Build Coastguard Worker 
1127*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1128*fb1b10abSAndroid Build Coastguard Worker #define WRAP(func, bd)                                                       \
1129*fb1b10abSAndroid Build Coastguard Worker   void wrap_##func##_##bd(                                                   \
1130*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,                \
1131*fb1b10abSAndroid Build Coastguard Worker       ptrdiff_t dst_stride, const InterpKernel *filter, int x0_q4,           \
1132*fb1b10abSAndroid Build Coastguard Worker       int x_step_q4, int y0_q4, int y_step_q4, int w, int h) {               \
1133*fb1b10abSAndroid Build Coastguard Worker     vpx_highbd_##func(reinterpret_cast<const uint16_t *>(src), src_stride,   \
1134*fb1b10abSAndroid Build Coastguard Worker                       reinterpret_cast<uint16_t *>(dst), dst_stride, filter, \
1135*fb1b10abSAndroid Build Coastguard Worker                       x0_q4, x_step_q4, y0_q4, y_step_q4, w, h, bd);         \
1136*fb1b10abSAndroid Build Coastguard Worker   }
1137*fb1b10abSAndroid Build Coastguard Worker 
1138*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && VPX_ARCH_X86_64
1139*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_sse2, 8)
1140*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_sse2, 8)
1141*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_sse2, 10)
1142*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_sse2, 10)
1143*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_sse2, 12)
1144*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_sse2, 12)
1145*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_sse2, 8)
1146*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_sse2, 8)
1147*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_sse2, 8)
1148*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_sse2, 8)
1149*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_sse2, 8)
1150*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_sse2, 8)
1151*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_sse2, 10)
1152*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_sse2, 10)
1153*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_sse2, 10)
1154*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_sse2, 10)
1155*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_sse2, 10)
1156*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_sse2, 10)
1157*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_sse2, 12)
1158*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_sse2, 12)
1159*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_sse2, 12)
1160*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_sse2, 12)
1161*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_sse2, 12)
1162*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_sse2, 12)
1163*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2 && VPX_ARCH_X86_64
1164*fb1b10abSAndroid Build Coastguard Worker 
1165*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX2
1166*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_avx2, 8)
1167*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_avx2, 8)
1168*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_avx2, 8)
1169*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_avx2, 8)
1170*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_avx2, 8)
1171*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_avx2, 8)
1172*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avx2, 8)
1173*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_avx2, 8)
1174*fb1b10abSAndroid Build Coastguard Worker 
1175*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_avx2, 10)
1176*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_avx2, 10)
1177*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avx2, 10)
1178*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_avx2, 10)
1179*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_avx2, 10)
1180*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_avx2, 10)
1181*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_avx2, 10)
1182*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_avx2, 10)
1183*fb1b10abSAndroid Build Coastguard Worker 
1184*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_avx2, 12)
1185*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_avx2, 12)
1186*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avx2, 12)
1187*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_avx2, 12)
1188*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_avx2, 12)
1189*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_avx2, 12)
1190*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_avx2, 12)
1191*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_avx2, 12)
1192*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX2
1193*fb1b10abSAndroid Build Coastguard Worker 
1194*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
1195*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_neon, 8)
1196*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_neon, 8)
1197*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_neon, 10)
1198*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_neon, 10)
1199*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_neon, 12)
1200*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_neon, 12)
1201*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_neon, 8)
1202*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_neon, 8)
1203*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_neon, 8)
1204*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_neon, 8)
1205*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_neon, 8)
1206*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_neon, 8)
1207*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_neon, 10)
1208*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_neon, 10)
1209*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_neon, 10)
1210*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_neon, 10)
1211*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_neon, 10)
1212*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_neon, 10)
1213*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_neon, 12)
1214*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_neon, 12)
1215*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_neon, 12)
1216*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_neon, 12)
1217*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_neon, 12)
1218*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_neon, 12)
1219*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON
1220*fb1b10abSAndroid Build Coastguard Worker 
1221*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SVE
1222*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_sve, 8)
1223*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_sve, 8)
1224*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_sve, 10)
1225*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_sve, 10)
1226*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_sve, 12)
1227*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_sve, 12)
1228*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SVE
1229*fb1b10abSAndroid Build Coastguard Worker 
1230*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SVE2
1231*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_sve2, 8)
1232*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_sve2, 8)
1233*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_sve2, 8)
1234*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_sve2, 8)
1235*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_sve2, 10)
1236*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_sve2, 10)
1237*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_sve2, 10)
1238*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_sve2, 10)
1239*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_sve2, 12)
1240*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_sve2, 12)
1241*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_sve2, 12)
1242*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_sve2, 12)
1243*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SVE2
1244*fb1b10abSAndroid Build Coastguard Worker 
1245*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_c, 8)
1246*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_c, 8)
1247*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_c, 8)
1248*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_c, 8)
1249*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_c, 8)
1250*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_c, 8)
1251*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_c, 8)
1252*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_c, 8)
1253*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_c, 10)
1254*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_c, 10)
1255*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_c, 10)
1256*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_c, 10)
1257*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_c, 10)
1258*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_c, 10)
1259*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_c, 10)
1260*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_c, 10)
1261*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_copy_c, 12)
1262*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve_avg_c, 12)
1263*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_horiz_c, 12)
1264*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_horiz_c, 12)
1265*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_vert_c, 12)
1266*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_vert_c, 12)
1267*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_c, 12)
1268*fb1b10abSAndroid Build Coastguard Worker WRAP(convolve8_avg_c, 12)
1269*fb1b10abSAndroid Build Coastguard Worker #undef WRAP
1270*fb1b10abSAndroid Build Coastguard Worker 
1271*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_c(
1272*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_8, wrap_convolve_avg_c_8, wrap_convolve8_horiz_c_8,
1273*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_8, wrap_convolve8_vert_c_8,
1274*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8, wrap_convolve8_avg_c_8,
1275*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_c_8, wrap_convolve8_avg_horiz_c_8,
1276*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_8, wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8,
1277*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_8, 8);
1278*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve10_c(
1279*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_10, wrap_convolve_avg_c_10, wrap_convolve8_horiz_c_10,
1280*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_10, wrap_convolve8_vert_c_10,
1281*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10, wrap_convolve8_avg_c_10,
1282*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_c_10, wrap_convolve8_avg_horiz_c_10,
1283*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_10, wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10,
1284*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_10, 10);
1285*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve12_c(
1286*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_12, wrap_convolve_avg_c_12, wrap_convolve8_horiz_c_12,
1287*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_12, wrap_convolve8_vert_c_12,
1288*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12, wrap_convolve8_avg_c_12,
1289*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_c_12, wrap_convolve8_avg_horiz_c_12,
1290*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_12, wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12,
1291*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_12, 12);
1292*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_c[] = { ALL_SIZES(convolve8_c),
1293*fb1b10abSAndroid Build Coastguard Worker                                            ALL_SIZES(convolve10_c),
1294*fb1b10abSAndroid Build Coastguard Worker                                            ALL_SIZES(convolve12_c) };
1295*fb1b10abSAndroid Build Coastguard Worker 
1296*fb1b10abSAndroid Build Coastguard Worker #else
1297*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_c(
1298*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_c, vpx_convolve_avg_c, vpx_convolve8_horiz_c,
1299*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_c, vpx_convolve8_vert_c, vpx_convolve8_avg_vert_c,
1300*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_c, vpx_convolve8_avg_c, vpx_scaled_horiz_c,
1301*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_horiz_c, vpx_scaled_vert_c, vpx_scaled_avg_vert_c,
1302*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1303*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_c[] = { ALL_SIZES(convolve8_c) };
1304*fb1b10abSAndroid Build Coastguard Worker #endif
1305*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, ConvolveTest,
1306*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_c));
1307*fb1b10abSAndroid Build Coastguard Worker 
1308*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && VPX_ARCH_X86_64
1309*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1310*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_sse2(
1311*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_sse2_8, wrap_convolve_avg_sse2_8,
1312*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sse2_8, wrap_convolve8_avg_horiz_sse2_8,
1313*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_sse2_8, wrap_convolve8_avg_vert_sse2_8,
1314*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_sse2_8, wrap_convolve8_avg_sse2_8,
1315*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sse2_8, wrap_convolve8_avg_horiz_sse2_8,
1316*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_sse2_8, wrap_convolve8_avg_vert_sse2_8,
1317*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_sse2_8, wrap_convolve8_avg_sse2_8, 8);
1318*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve10_sse2(
1319*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_sse2_10, wrap_convolve_avg_sse2_10,
1320*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sse2_10, wrap_convolve8_avg_horiz_sse2_10,
1321*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_sse2_10, wrap_convolve8_avg_vert_sse2_10,
1322*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_sse2_10, wrap_convolve8_avg_sse2_10,
1323*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sse2_10, wrap_convolve8_avg_horiz_sse2_10,
1324*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_sse2_10, wrap_convolve8_avg_vert_sse2_10,
1325*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_sse2_10, wrap_convolve8_avg_sse2_10, 10);
1326*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve12_sse2(
1327*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_sse2_12, wrap_convolve_avg_sse2_12,
1328*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sse2_12, wrap_convolve8_avg_horiz_sse2_12,
1329*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_sse2_12, wrap_convolve8_avg_vert_sse2_12,
1330*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_sse2_12, wrap_convolve8_avg_sse2_12,
1331*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sse2_12, wrap_convolve8_avg_horiz_sse2_12,
1332*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_sse2_12, wrap_convolve8_avg_vert_sse2_12,
1333*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_sse2_12, wrap_convolve8_avg_sse2_12, 12);
1334*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_sse2[] = { ALL_SIZES(convolve8_sse2),
1335*fb1b10abSAndroid Build Coastguard Worker                                               ALL_SIZES(convolve10_sse2),
1336*fb1b10abSAndroid Build Coastguard Worker                                               ALL_SIZES(convolve12_sse2) };
1337*fb1b10abSAndroid Build Coastguard Worker #else
1338*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_sse2(
1339*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_sse2, vpx_convolve_avg_sse2, vpx_convolve8_horiz_sse2,
1340*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_sse2, vpx_convolve8_vert_sse2,
1341*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_sse2, vpx_convolve8_sse2, vpx_convolve8_avg_sse2,
1342*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1343*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1344*fb1b10abSAndroid Build Coastguard Worker 
1345*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_sse2[] = { ALL_SIZES(convolve8_sse2) };
1346*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
1347*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSE2, ConvolveTest,
1348*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_sse2));
1349*fb1b10abSAndroid Build Coastguard Worker #endif
1350*fb1b10abSAndroid Build Coastguard Worker 
1351*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSSE3
1352*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_ssse3(
1353*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_c, vpx_convolve_avg_c, vpx_convolve8_horiz_ssse3,
1354*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_ssse3, vpx_convolve8_vert_ssse3,
1355*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_ssse3, vpx_convolve8_ssse3, vpx_convolve8_avg_ssse3,
1356*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1357*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_ssse3, vpx_scaled_avg_2d_c, 0);
1358*fb1b10abSAndroid Build Coastguard Worker 
1359*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve8_ssse3[] = { ALL_SIZES(convolve8_ssse3) };
1360*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, ConvolveTest,
1361*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve8_ssse3));
1362*fb1b10abSAndroid Build Coastguard Worker #endif
1363*fb1b10abSAndroid Build Coastguard Worker 
1364*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX2
1365*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1366*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_avx2(
1367*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_avx2_8, wrap_convolve_avg_avx2_8,
1368*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_avx2_8, wrap_convolve8_avg_horiz_avx2_8,
1369*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_avx2_8, wrap_convolve8_avg_vert_avx2_8,
1370*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avx2_8, wrap_convolve8_avg_avx2_8, wrap_convolve8_horiz_c_8,
1371*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_8, wrap_convolve8_vert_c_8,
1372*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8, wrap_convolve8_avg_c_8, 8);
1373*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve10_avx2(
1374*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_avx2_10, wrap_convolve_avg_avx2_10,
1375*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_avx2_10, wrap_convolve8_avg_horiz_avx2_10,
1376*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_avx2_10, wrap_convolve8_avg_vert_avx2_10,
1377*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avx2_10, wrap_convolve8_avg_avx2_10,
1378*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_c_10, wrap_convolve8_avg_horiz_c_10,
1379*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_10, wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10,
1380*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_10, 10);
1381*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve12_avx2(
1382*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_avx2_12, wrap_convolve_avg_avx2_12,
1383*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_avx2_12, wrap_convolve8_avg_horiz_avx2_12,
1384*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_avx2_12, wrap_convolve8_avg_vert_avx2_12,
1385*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avx2_12, wrap_convolve8_avg_avx2_12,
1386*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_c_12, wrap_convolve8_avg_horiz_c_12,
1387*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_12, wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12,
1388*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_12, 12);
1389*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve8_avx2[] = { ALL_SIZES(convolve8_avx2),
1390*fb1b10abSAndroid Build Coastguard Worker                                                ALL_SIZES(convolve10_avx2),
1391*fb1b10abSAndroid Build Coastguard Worker                                                ALL_SIZES(convolve12_avx2) };
1392*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, ConvolveTest,
1393*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve8_avx2));
1394*fb1b10abSAndroid Build Coastguard Worker #else   // !CONFIG_VP9_HIGHBITDEPTH
1395*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_avx2(
1396*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_c, vpx_convolve_avg_c, vpx_convolve8_horiz_avx2,
1397*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_avx2, vpx_convolve8_vert_avx2,
1398*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_avx2, vpx_convolve8_avx2, vpx_convolve8_avg_avx2,
1399*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1400*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1401*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve8_avx2[] = { ALL_SIZES(convolve8_avx2) };
1402*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, ConvolveTest,
1403*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve8_avx2));
1404*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
1405*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX2
1406*fb1b10abSAndroid Build Coastguard Worker 
1407*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
1408*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1409*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_neon(
1410*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_neon_8, wrap_convolve_avg_neon_8,
1411*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_neon_8, wrap_convolve8_avg_horiz_neon_8,
1412*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_neon_8, wrap_convolve8_avg_vert_neon_8,
1413*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_neon_8, wrap_convolve8_avg_neon_8,
1414*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_neon_8, wrap_convolve8_avg_horiz_neon_8,
1415*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_neon_8, wrap_convolve8_avg_vert_neon_8,
1416*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_neon_8, wrap_convolve8_avg_neon_8, 8);
1417*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve10_neon(
1418*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_neon_10, wrap_convolve_avg_neon_10,
1419*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_neon_10, wrap_convolve8_avg_horiz_neon_10,
1420*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_neon_10, wrap_convolve8_avg_vert_neon_10,
1421*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_neon_10, wrap_convolve8_avg_neon_10,
1422*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_neon_10, wrap_convolve8_avg_horiz_neon_10,
1423*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_neon_10, wrap_convolve8_avg_vert_neon_10,
1424*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_neon_10, wrap_convolve8_avg_neon_10, 10);
1425*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve12_neon(
1426*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_neon_12, wrap_convolve_avg_neon_12,
1427*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_neon_12, wrap_convolve8_avg_horiz_neon_12,
1428*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_neon_12, wrap_convolve8_avg_vert_neon_12,
1429*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_neon_12, wrap_convolve8_avg_neon_12,
1430*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_neon_12, wrap_convolve8_avg_horiz_neon_12,
1431*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_neon_12, wrap_convolve8_avg_vert_neon_12,
1432*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_neon_12, wrap_convolve8_avg_neon_12, 12);
1433*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_neon[] = { ALL_SIZES(convolve8_neon),
1434*fb1b10abSAndroid Build Coastguard Worker                                               ALL_SIZES(convolve10_neon),
1435*fb1b10abSAndroid Build Coastguard Worker                                               ALL_SIZES(convolve12_neon) };
1436*fb1b10abSAndroid Build Coastguard Worker #else
1437*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_neon(
1438*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_neon, vpx_convolve_avg_neon, vpx_convolve8_horiz_neon,
1439*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_neon, vpx_convolve8_vert_neon,
1440*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_neon, vpx_convolve8_neon, vpx_convolve8_avg_neon,
1441*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1442*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_neon, vpx_scaled_avg_2d_c, 0);
1443*fb1b10abSAndroid Build Coastguard Worker 
1444*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_neon[] = { ALL_SIZES(convolve8_neon) };
1445*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
1446*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, ConvolveTest,
1447*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_neon));
1448*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON
1449*fb1b10abSAndroid Build Coastguard Worker 
1450*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON_DOTPROD
1451*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_neon_dotprod(
1452*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_c, vpx_convolve_avg_c, vpx_convolve8_horiz_neon_dotprod,
1453*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_neon_dotprod, vpx_convolve8_vert_neon_dotprod,
1454*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_neon_dotprod, vpx_convolve8_neon_dotprod,
1455*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_neon_dotprod, vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c,
1456*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_vert_c, vpx_scaled_avg_vert_c, vpx_scaled_2d_c,
1457*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_2d_c, 0);
1458*fb1b10abSAndroid Build Coastguard Worker 
1459*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_neon_dotprod[] = { ALL_SIZES(
1460*fb1b10abSAndroid Build Coastguard Worker     convolve8_neon_dotprod) };
1461*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, ConvolveTest,
1462*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_neon_dotprod));
1463*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON_DOTPROD
1464*fb1b10abSAndroid Build Coastguard Worker 
1465*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SVE
1466*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1467*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_sve(
1468*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_8, wrap_convolve_avg_c_8, wrap_convolve8_horiz_sve_8,
1469*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_sve_8, wrap_convolve8_vert_c_8,
1470*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8, wrap_convolve8_avg_c_8,
1471*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_c_8, wrap_convolve8_avg_horiz_c_8,
1472*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_8, wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8,
1473*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_8, 8);
1474*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve10_sve(
1475*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_10, wrap_convolve_avg_c_10,
1476*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sve_10, wrap_convolve8_avg_horiz_sve_10,
1477*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_10, wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10,
1478*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_10, wrap_convolve8_horiz_c_10,
1479*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_10, wrap_convolve8_vert_c_10,
1480*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10, wrap_convolve8_avg_c_10,
1481*fb1b10abSAndroid Build Coastguard Worker     10);
1482*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve12_sve(
1483*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_12, wrap_convolve_avg_c_12,
1484*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_horiz_sve_12, wrap_convolve8_avg_horiz_sve_12,
1485*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_vert_c_12, wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12,
1486*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_c_12, wrap_convolve8_horiz_c_12,
1487*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_12, wrap_convolve8_vert_c_12,
1488*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12, wrap_convolve8_avg_c_12,
1489*fb1b10abSAndroid Build Coastguard Worker     12);
1490*fb1b10abSAndroid Build Coastguard Worker 
1491*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_sve[] = { ALL_SIZES(convolve8_sve),
1492*fb1b10abSAndroid Build Coastguard Worker                                              ALL_SIZES(convolve10_sve),
1493*fb1b10abSAndroid Build Coastguard Worker                                              ALL_SIZES(convolve12_sve) };
1494*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SVE, ConvolveTest,
1495*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_sve));
1496*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
1497*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SVE
1498*fb1b10abSAndroid Build Coastguard Worker 
1499*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SVE2
1500*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
1501*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_sve2(
1502*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_8, wrap_convolve_avg_c_8, wrap_convolve8_horiz_c_8,
1503*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_8, wrap_convolve8_vert_sve2_8,
1504*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_sve2_8, wrap_convolve8_sve2_8,
1505*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_sve2_8, wrap_convolve8_horiz_c_8,
1506*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_8, wrap_convolve8_vert_c_8,
1507*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_8, wrap_convolve8_c_8, wrap_convolve8_avg_c_8, 8);
1508*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve10_sve2(
1509*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_10, wrap_convolve_avg_c_10, wrap_convolve8_horiz_c_10,
1510*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_10, wrap_convolve8_vert_sve2_10,
1511*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_sve2_10, wrap_convolve8_sve2_10,
1512*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_sve2_10, wrap_convolve8_horiz_c_10,
1513*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_10, wrap_convolve8_vert_c_10,
1514*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_10, wrap_convolve8_c_10, wrap_convolve8_avg_c_10,
1515*fb1b10abSAndroid Build Coastguard Worker     10);
1516*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve12_sve2(
1517*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve_copy_c_12, wrap_convolve_avg_c_12, wrap_convolve8_horiz_c_12,
1518*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_12, wrap_convolve8_vert_sve2_12,
1519*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_sve2_12, wrap_convolve8_sve2_12,
1520*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_sve2_12, wrap_convolve8_horiz_c_12,
1521*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_horiz_c_12, wrap_convolve8_vert_c_12,
1522*fb1b10abSAndroid Build Coastguard Worker     wrap_convolve8_avg_vert_c_12, wrap_convolve8_c_12, wrap_convolve8_avg_c_12,
1523*fb1b10abSAndroid Build Coastguard Worker     12);
1524*fb1b10abSAndroid Build Coastguard Worker 
1525*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_sve2[] = { ALL_SIZES(convolve8_sve2),
1526*fb1b10abSAndroid Build Coastguard Worker                                               ALL_SIZES(convolve10_sve2),
1527*fb1b10abSAndroid Build Coastguard Worker                                               ALL_SIZES(convolve12_sve2) };
1528*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SVE2, ConvolveTest,
1529*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_sve2));
1530*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
1531*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SVE2
1532*fb1b10abSAndroid Build Coastguard Worker 
1533*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON_I8MM
1534*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_neon_i8mm(
1535*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_c, vpx_convolve_avg_c, vpx_convolve8_horiz_neon_i8mm,
1536*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_neon_i8mm, vpx_convolve8_vert_neon_i8mm,
1537*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_neon_i8mm, vpx_convolve8_neon_i8mm,
1538*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_neon_i8mm, vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c,
1539*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_vert_c, vpx_scaled_avg_vert_c, vpx_scaled_2d_c,
1540*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_2d_c, 0);
1541*fb1b10abSAndroid Build Coastguard Worker 
1542*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_neon_i8mm[] = { ALL_SIZES(
1543*fb1b10abSAndroid Build Coastguard Worker     convolve8_neon_i8mm) };
1544*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON_I8MM, ConvolveTest,
1545*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_neon_i8mm));
1546*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON_I8MM
1547*fb1b10abSAndroid Build Coastguard Worker 
1548*fb1b10abSAndroid Build Coastguard Worker #if HAVE_DSPR2
1549*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_dspr2(
1550*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_dspr2, vpx_convolve_avg_dspr2, vpx_convolve8_horiz_dspr2,
1551*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_dspr2, vpx_convolve8_vert_dspr2,
1552*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_dspr2, vpx_convolve8_dspr2, vpx_convolve8_avg_dspr2,
1553*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1554*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1555*fb1b10abSAndroid Build Coastguard Worker 
1556*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve8_dspr2[] = { ALL_SIZES(convolve8_dspr2) };
1557*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(DSPR2, ConvolveTest,
1558*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve8_dspr2));
1559*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_DSPR2
1560*fb1b10abSAndroid Build Coastguard Worker 
1561*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA
1562*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_msa(
1563*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_msa, vpx_convolve_avg_msa, vpx_convolve8_horiz_msa,
1564*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_msa, vpx_convolve8_vert_msa,
1565*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_msa, vpx_convolve8_msa, vpx_convolve8_avg_msa,
1566*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1567*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_msa, vpx_scaled_avg_2d_c, 0);
1568*fb1b10abSAndroid Build Coastguard Worker 
1569*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve8_msa[] = { ALL_SIZES(convolve8_msa) };
1570*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MSA, ConvolveTest,
1571*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve8_msa));
1572*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MSA
1573*fb1b10abSAndroid Build Coastguard Worker 
1574*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX
1575*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_lsx(
1576*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_lsx, vpx_convolve_avg_lsx, vpx_convolve8_horiz_lsx,
1577*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_lsx, vpx_convolve8_vert_lsx,
1578*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_lsx, vpx_convolve8_lsx, vpx_convolve8_avg_lsx,
1579*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1580*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1581*fb1b10abSAndroid Build Coastguard Worker 
1582*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve8_lsx[] = { ALL_SIZES(convolve8_lsx) };
1583*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LSX, ConvolveTest,
1584*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve8_lsx));
1585*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_LSX
1586*fb1b10abSAndroid Build Coastguard Worker 
1587*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX
1588*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_vsx(
1589*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_vsx, vpx_convolve_avg_vsx, vpx_convolve8_horiz_vsx,
1590*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_vsx, vpx_convolve8_vert_vsx,
1591*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_vsx, vpx_convolve8_vsx, vpx_convolve8_avg_vsx,
1592*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1593*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1594*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_vsx[] = { ALL_SIZES(convolve8_vsx) };
1595*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VSX, ConvolveTest,
1596*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_vsx));
1597*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX
1598*fb1b10abSAndroid Build Coastguard Worker 
1599*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MMI
1600*fb1b10abSAndroid Build Coastguard Worker const ConvolveFunctions convolve8_mmi(
1601*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve_copy_c, vpx_convolve_avg_mmi, vpx_convolve8_horiz_mmi,
1602*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_horiz_mmi, vpx_convolve8_vert_mmi,
1603*fb1b10abSAndroid Build Coastguard Worker     vpx_convolve8_avg_vert_mmi, vpx_convolve8_mmi, vpx_convolve8_avg_mmi,
1604*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_horiz_c, vpx_scaled_avg_horiz_c, vpx_scaled_vert_c,
1605*fb1b10abSAndroid Build Coastguard Worker     vpx_scaled_avg_vert_c, vpx_scaled_2d_c, vpx_scaled_avg_2d_c, 0);
1606*fb1b10abSAndroid Build Coastguard Worker const ConvolveParam kArrayConvolve_mmi[] = { ALL_SIZES(convolve8_mmi) };
1607*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MMI, ConvolveTest,
1608*fb1b10abSAndroid Build Coastguard Worker                          ::testing::ValuesIn(kArrayConvolve_mmi));
1609*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MMI
1610*fb1b10abSAndroid Build Coastguard Worker }  // namespace
1611