xref: /aosp_15_r20/frameworks/rs/toolkit/Resize.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #include <math.h>
18*e1eccf28SAndroid Build Coastguard Worker 
19*e1eccf28SAndroid Build Coastguard Worker #include <cstdint>
20*e1eccf28SAndroid Build Coastguard Worker 
21*e1eccf28SAndroid Build Coastguard Worker #include "RenderScriptToolkit.h"
22*e1eccf28SAndroid Build Coastguard Worker #include "TaskProcessor.h"
23*e1eccf28SAndroid Build Coastguard Worker #include "Utils.h"
24*e1eccf28SAndroid Build Coastguard Worker 
25*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
26*e1eccf28SAndroid Build Coastguard Worker #include <stdint.h>
27*e1eccf28SAndroid Build Coastguard Worker #include <x86intrin.h>
28*e1eccf28SAndroid Build Coastguard Worker #include <xmmintrin.h>
29*e1eccf28SAndroid Build Coastguard Worker #endif
30*e1eccf28SAndroid Build Coastguard Worker 
31*e1eccf28SAndroid Build Coastguard Worker #define LOG_TAG "renderscript.toolkit.Resize"
32*e1eccf28SAndroid Build Coastguard Worker 
33*e1eccf28SAndroid Build Coastguard Worker namespace android {
34*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
35*e1eccf28SAndroid Build Coastguard Worker 
36*e1eccf28SAndroid Build Coastguard Worker class ResizeTask : public Task {
37*e1eccf28SAndroid Build Coastguard Worker     const uchar* mIn;
38*e1eccf28SAndroid Build Coastguard Worker     uchar* mOut;
39*e1eccf28SAndroid Build Coastguard Worker     float mScaleX;
40*e1eccf28SAndroid Build Coastguard Worker     float mScaleY;
41*e1eccf28SAndroid Build Coastguard Worker     size_t mInputSizeX;
42*e1eccf28SAndroid Build Coastguard Worker     size_t mInputSizeY;
43*e1eccf28SAndroid Build Coastguard Worker 
44*e1eccf28SAndroid Build Coastguard Worker     void kernelU1(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY);
45*e1eccf28SAndroid Build Coastguard Worker     void kernelU2(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY);
46*e1eccf28SAndroid Build Coastguard Worker     void kernelU4(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY);
47*e1eccf28SAndroid Build Coastguard Worker #ifdef ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
48*e1eccf28SAndroid Build Coastguard Worker     void kernelF1(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY);
49*e1eccf28SAndroid Build Coastguard Worker     void kernelF2(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY);
50*e1eccf28SAndroid Build Coastguard Worker     void kernelF4(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY);
51*e1eccf28SAndroid Build Coastguard Worker #endif  // ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
52*e1eccf28SAndroid Build Coastguard Worker 
53*e1eccf28SAndroid Build Coastguard Worker     // Process a 2D tile of the overall work. threadIndex identifies which thread does the work.
54*e1eccf28SAndroid Build Coastguard Worker     virtual void processData(int threadIndex, size_t startX, size_t startY, size_t endX,
55*e1eccf28SAndroid Build Coastguard Worker                              size_t endY) override;
56*e1eccf28SAndroid Build Coastguard Worker 
57*e1eccf28SAndroid Build Coastguard Worker    public:
ResizeTask(const uchar * input,uchar * output,size_t inputSizeX,size_t inputSizeY,size_t vectorSize,size_t outputSizeX,size_t outputSizeY,const Restriction * restriction)58*e1eccf28SAndroid Build Coastguard Worker     ResizeTask(const uchar* input, uchar* output, size_t inputSizeX, size_t inputSizeY,
59*e1eccf28SAndroid Build Coastguard Worker                size_t vectorSize, size_t outputSizeX, size_t outputSizeY,
60*e1eccf28SAndroid Build Coastguard Worker                const Restriction* restriction)
61*e1eccf28SAndroid Build Coastguard Worker         : Task{outputSizeX, outputSizeY, vectorSize, false, restriction},
62*e1eccf28SAndroid Build Coastguard Worker           mIn{input},
63*e1eccf28SAndroid Build Coastguard Worker           mOut{output},
64*e1eccf28SAndroid Build Coastguard Worker           mInputSizeX{inputSizeX},
65*e1eccf28SAndroid Build Coastguard Worker           mInputSizeY{inputSizeY} {
66*e1eccf28SAndroid Build Coastguard Worker         mScaleX = static_cast<float>(inputSizeX) / outputSizeX;
67*e1eccf28SAndroid Build Coastguard Worker         mScaleY = static_cast<float>(inputSizeY) / outputSizeY;
68*e1eccf28SAndroid Build Coastguard Worker     }
69*e1eccf28SAndroid Build Coastguard Worker };
70*e1eccf28SAndroid Build Coastguard Worker 
processData(int,size_t startX,size_t startY,size_t endX,size_t endY)71*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::processData(int /* threadIndex */, size_t startX, size_t startY, size_t endX,
72*e1eccf28SAndroid Build Coastguard Worker                              size_t endY) {
73*e1eccf28SAndroid Build Coastguard Worker     typedef void (ResizeTask::*KernelFunction)(uchar*, uint32_t, uint32_t, uint32_t);
74*e1eccf28SAndroid Build Coastguard Worker 
75*e1eccf28SAndroid Build Coastguard Worker     KernelFunction kernel;
76*e1eccf28SAndroid Build Coastguard Worker     switch (mVectorSize) {
77*e1eccf28SAndroid Build Coastguard Worker         case 4:
78*e1eccf28SAndroid Build Coastguard Worker             kernel = &ResizeTask::kernelU4;
79*e1eccf28SAndroid Build Coastguard Worker             break;
80*e1eccf28SAndroid Build Coastguard Worker         case 3:
81*e1eccf28SAndroid Build Coastguard Worker             kernel = &ResizeTask::kernelU4;
82*e1eccf28SAndroid Build Coastguard Worker             break;
83*e1eccf28SAndroid Build Coastguard Worker         case 2:
84*e1eccf28SAndroid Build Coastguard Worker             kernel = &ResizeTask::kernelU2;
85*e1eccf28SAndroid Build Coastguard Worker             break;
86*e1eccf28SAndroid Build Coastguard Worker         case 1:
87*e1eccf28SAndroid Build Coastguard Worker             kernel = &ResizeTask::kernelU1;
88*e1eccf28SAndroid Build Coastguard Worker             break;
89*e1eccf28SAndroid Build Coastguard Worker         default:
90*e1eccf28SAndroid Build Coastguard Worker             ALOGE("Bad vector size %zd", mVectorSize);
91*e1eccf28SAndroid Build Coastguard Worker     }
92*e1eccf28SAndroid Build Coastguard Worker 
93*e1eccf28SAndroid Build Coastguard Worker     for (size_t y = startY; y < endY; y++) {
94*e1eccf28SAndroid Build Coastguard Worker         size_t offset = (mSizeX * y + startX) * paddedSize(mVectorSize);
95*e1eccf28SAndroid Build Coastguard Worker         uchar* out = mOut + offset;
96*e1eccf28SAndroid Build Coastguard Worker         std::invoke(kernel, this, out, startX, endX, y);
97*e1eccf28SAndroid Build Coastguard Worker     }
98*e1eccf28SAndroid Build Coastguard Worker }
99*e1eccf28SAndroid Build Coastguard Worker 
cubicInterpolate(float4 p0,float4 p1,float4 p2,float4 p3,float x)100*e1eccf28SAndroid Build Coastguard Worker static float4 cubicInterpolate(float4 p0, float4 p1, float4 p2, float4 p3, float x) {
101*e1eccf28SAndroid Build Coastguard Worker     return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 + 4.f * p2 - p3
102*e1eccf28SAndroid Build Coastguard Worker             + x * (3.f * (p1 - p2) + p3 - p0)));
103*e1eccf28SAndroid Build Coastguard Worker }
104*e1eccf28SAndroid Build Coastguard Worker 
cubicInterpolate(float2 p0,float2 p1,float2 p2,float2 p3,float x)105*e1eccf28SAndroid Build Coastguard Worker static float2 cubicInterpolate(float2 p0,float2 p1,float2 p2,float2 p3, float x) {
106*e1eccf28SAndroid Build Coastguard Worker     return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 + 4.f * p2 - p3
107*e1eccf28SAndroid Build Coastguard Worker             + x * (3.f * (p1 - p2) + p3 - p0)));
108*e1eccf28SAndroid Build Coastguard Worker }
109*e1eccf28SAndroid Build Coastguard Worker 
110*e1eccf28SAndroid Build Coastguard Worker 
111*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
cubicInterpolate(float p0,float p1,float p2,float p3,float x)112*e1eccf28SAndroid Build Coastguard Worker static float cubicInterpolate(float p0,float p1,float p2,float p3 , float x) {
113*e1eccf28SAndroid Build Coastguard Worker    return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 +
114*e1eccf28SAndroid Build Coastguard Worker            _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(4.f), _mm_set1_ps(p2),_mm_set1_ps(p3)))
115*e1eccf28SAndroid Build Coastguard Worker            + x * (_mm_cvtss_f32(_mm_fmadd_ss (_mm_set1_ps(3.f),_mm_set1_ps(p1 - p2),
116*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(p3 - p0))))));
117*e1eccf28SAndroid Build Coastguard Worker 
118*e1eccf28SAndroid Build Coastguard Worker }
119*e1eccf28SAndroid Build Coastguard Worker #else
cubicInterpolate(float p0,float p1,float p2,float p3,float x)120*e1eccf28SAndroid Build Coastguard Worker static float cubicInterpolate(float p0,float p1,float p2,float p3 , float x) {
121*e1eccf28SAndroid Build Coastguard Worker     //ALOGI("CP, %f, %f, %f, %f, %f", p0, p1, p2, p3, x);
122*e1eccf28SAndroid Build Coastguard Worker     return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 + 4.f * p2 - p3
123*e1eccf28SAndroid Build Coastguard Worker             + x * (3.f * (p1 - p2) + p3 - p0)));
124*e1eccf28SAndroid Build Coastguard Worker }
125*e1eccf28SAndroid Build Coastguard Worker #endif
126*e1eccf28SAndroid Build Coastguard Worker 
OneBiCubic(const uchar4 * yp0,const uchar4 * yp1,const uchar4 * yp2,const uchar4 * yp3,float xf,float yf,int width)127*e1eccf28SAndroid Build Coastguard Worker static uchar4 OneBiCubic(const uchar4 *yp0, const uchar4 *yp1, const uchar4 *yp2, const uchar4 *yp3,
128*e1eccf28SAndroid Build Coastguard Worker                          float xf, float yf, int width) {
129*e1eccf28SAndroid Build Coastguard Worker     int startx = (int) floor(xf - 1);
130*e1eccf28SAndroid Build Coastguard Worker     xf = xf - floor(xf);
131*e1eccf28SAndroid Build Coastguard Worker     int maxx = width - 1;
132*e1eccf28SAndroid Build Coastguard Worker     int xs0 = std::max(0, startx + 0);
133*e1eccf28SAndroid Build Coastguard Worker     int xs1 = std::max(0, startx + 1);
134*e1eccf28SAndroid Build Coastguard Worker     int xs2 = std::min(maxx, startx + 2);
135*e1eccf28SAndroid Build Coastguard Worker     int xs3 = std::min(maxx, startx + 3);
136*e1eccf28SAndroid Build Coastguard Worker 
137*e1eccf28SAndroid Build Coastguard Worker     float4 p0  = cubicInterpolate(convert<float4>(yp0[xs0]),
138*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp0[xs1]),
139*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp0[xs2]),
140*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp0[xs3]), xf);
141*e1eccf28SAndroid Build Coastguard Worker 
142*e1eccf28SAndroid Build Coastguard Worker     float4 p1  = cubicInterpolate(convert<float4>(yp1[xs0]),
143*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp1[xs1]),
144*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp1[xs2]),
145*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp1[xs3]), xf);
146*e1eccf28SAndroid Build Coastguard Worker 
147*e1eccf28SAndroid Build Coastguard Worker     float4 p2  = cubicInterpolate(convert<float4>(yp2[xs0]),
148*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp2[xs1]),
149*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp2[xs2]),
150*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp2[xs3]), xf);
151*e1eccf28SAndroid Build Coastguard Worker 
152*e1eccf28SAndroid Build Coastguard Worker     float4 p3  = cubicInterpolate(convert<float4>(yp3[xs0]),
153*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp3[xs1]),
154*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp3[xs2]),
155*e1eccf28SAndroid Build Coastguard Worker                                   convert<float4>(yp3[xs3]), xf);
156*e1eccf28SAndroid Build Coastguard Worker 
157*e1eccf28SAndroid Build Coastguard Worker     float4 p  = cubicInterpolate(p0, p1, p2, p3, yf);
158*e1eccf28SAndroid Build Coastguard Worker     p = clamp(p + 0.5f, 0.f, 255.f);
159*e1eccf28SAndroid Build Coastguard Worker     return convert<uchar4>(p);
160*e1eccf28SAndroid Build Coastguard Worker }
161*e1eccf28SAndroid Build Coastguard Worker 
OneBiCubic(const uchar2 * yp0,const uchar2 * yp1,const uchar2 * yp2,const uchar2 * yp3,float xf,float yf,int width)162*e1eccf28SAndroid Build Coastguard Worker static uchar2 OneBiCubic(const uchar2 *yp0, const uchar2 *yp1, const uchar2 *yp2, const uchar2 *yp3,
163*e1eccf28SAndroid Build Coastguard Worker                          float xf, float yf, int width) {
164*e1eccf28SAndroid Build Coastguard Worker     int startx = (int) floor(xf - 1);
165*e1eccf28SAndroid Build Coastguard Worker     xf = xf - floor(xf);
166*e1eccf28SAndroid Build Coastguard Worker     int maxx = width - 1;
167*e1eccf28SAndroid Build Coastguard Worker     int xs0 = std::max(0, startx + 0);
168*e1eccf28SAndroid Build Coastguard Worker     int xs1 = std::max(0, startx + 1);
169*e1eccf28SAndroid Build Coastguard Worker     int xs2 = std::min(maxx, startx + 2);
170*e1eccf28SAndroid Build Coastguard Worker     int xs3 = std::min(maxx, startx + 3);
171*e1eccf28SAndroid Build Coastguard Worker 
172*e1eccf28SAndroid Build Coastguard Worker     float2 p0  = cubicInterpolate(convert<float2>(yp0[xs0]),
173*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp0[xs1]),
174*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp0[xs2]),
175*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp0[xs3]), xf);
176*e1eccf28SAndroid Build Coastguard Worker 
177*e1eccf28SAndroid Build Coastguard Worker     float2 p1  = cubicInterpolate(convert<float2>(yp1[xs0]),
178*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp1[xs1]),
179*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp1[xs2]),
180*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp1[xs3]), xf);
181*e1eccf28SAndroid Build Coastguard Worker 
182*e1eccf28SAndroid Build Coastguard Worker     float2 p2  = cubicInterpolate(convert<float2>(yp2[xs0]),
183*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp2[xs1]),
184*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp2[xs2]),
185*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp2[xs3]), xf);
186*e1eccf28SAndroid Build Coastguard Worker 
187*e1eccf28SAndroid Build Coastguard Worker     float2 p3  = cubicInterpolate(convert<float2>(yp3[xs0]),
188*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp3[xs1]),
189*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp3[xs2]),
190*e1eccf28SAndroid Build Coastguard Worker                                   convert<float2>(yp3[xs3]), xf);
191*e1eccf28SAndroid Build Coastguard Worker 
192*e1eccf28SAndroid Build Coastguard Worker     float2 p  = cubicInterpolate(p0, p1, p2, p3, yf);
193*e1eccf28SAndroid Build Coastguard Worker     p = clamp(p + 0.5f, 0.f, 255.f);
194*e1eccf28SAndroid Build Coastguard Worker     return convert<uchar2>(p);
195*e1eccf28SAndroid Build Coastguard Worker }
196*e1eccf28SAndroid Build Coastguard Worker 
OneBiCubic(const uchar * yp0,const uchar * yp1,const uchar * yp2,const uchar * yp3,float xf,float yf,int width)197*e1eccf28SAndroid Build Coastguard Worker static uchar OneBiCubic(const uchar *yp0, const uchar *yp1, const uchar *yp2, const uchar *yp3,
198*e1eccf28SAndroid Build Coastguard Worker                         float xf, float yf, int width) {
199*e1eccf28SAndroid Build Coastguard Worker     int startx = (int) floor(xf - 1);
200*e1eccf28SAndroid Build Coastguard Worker     xf = xf - floor(xf);
201*e1eccf28SAndroid Build Coastguard Worker     int maxx = width - 1;
202*e1eccf28SAndroid Build Coastguard Worker     int xs0 = std::max(0, startx + 0);
203*e1eccf28SAndroid Build Coastguard Worker     int xs1 = std::max(0, startx + 1);
204*e1eccf28SAndroid Build Coastguard Worker     int xs2 = std::min(maxx, startx + 2);
205*e1eccf28SAndroid Build Coastguard Worker     int xs3 = std::min(maxx, startx + 3);
206*e1eccf28SAndroid Build Coastguard Worker 
207*e1eccf28SAndroid Build Coastguard Worker     float p0  = cubicInterpolate((float)yp0[xs0], (float)yp0[xs1],
208*e1eccf28SAndroid Build Coastguard Worker                                  (float)yp0[xs2], (float)yp0[xs3], xf);
209*e1eccf28SAndroid Build Coastguard Worker     float p1  = cubicInterpolate((float)yp1[xs0], (float)yp1[xs1],
210*e1eccf28SAndroid Build Coastguard Worker                                  (float)yp1[xs2], (float)yp1[xs3], xf);
211*e1eccf28SAndroid Build Coastguard Worker     float p2  = cubicInterpolate((float)yp2[xs0], (float)yp2[xs1],
212*e1eccf28SAndroid Build Coastguard Worker                                  (float)yp2[xs2], (float)yp2[xs3], xf);
213*e1eccf28SAndroid Build Coastguard Worker     float p3  = cubicInterpolate((float)yp3[xs0], (float)yp3[xs1],
214*e1eccf28SAndroid Build Coastguard Worker                                  (float)yp3[xs2], (float)yp3[xs3], xf);
215*e1eccf28SAndroid Build Coastguard Worker 
216*e1eccf28SAndroid Build Coastguard Worker     float p  = cubicInterpolate(p0, p1, p2, p3, yf);
217*e1eccf28SAndroid Build Coastguard Worker     p = clamp(p + 0.5f, 0.f, 255.f);
218*e1eccf28SAndroid Build Coastguard Worker     //ALOGI("CUC,%f,%u", p, (uchar)p);
219*e1eccf28SAndroid Build Coastguard Worker     return (uchar)p;
220*e1eccf28SAndroid Build Coastguard Worker }
221*e1eccf28SAndroid Build Coastguard Worker 
222*e1eccf28SAndroid Build Coastguard Worker extern "C" uint64_t rsdIntrinsicResize_oscctl_K(uint32_t xinc);
223*e1eccf28SAndroid Build Coastguard Worker 
224*e1eccf28SAndroid Build Coastguard Worker extern "C" void rsdIntrinsicResizeB4_K(
225*e1eccf28SAndroid Build Coastguard Worker             uchar4 *dst,
226*e1eccf28SAndroid Build Coastguard Worker             size_t count,
227*e1eccf28SAndroid Build Coastguard Worker             uint32_t xf,
228*e1eccf28SAndroid Build Coastguard Worker             uint32_t xinc,
229*e1eccf28SAndroid Build Coastguard Worker             uchar4 const *srcn,
230*e1eccf28SAndroid Build Coastguard Worker             uchar4 const *src0,
231*e1eccf28SAndroid Build Coastguard Worker             uchar4 const *src1,
232*e1eccf28SAndroid Build Coastguard Worker             uchar4 const *src2,
233*e1eccf28SAndroid Build Coastguard Worker             size_t xclip,
234*e1eccf28SAndroid Build Coastguard Worker             size_t avail,
235*e1eccf28SAndroid Build Coastguard Worker             uint64_t osc_ctl,
236*e1eccf28SAndroid Build Coastguard Worker             int32_t const *yr);
237*e1eccf28SAndroid Build Coastguard Worker 
238*e1eccf28SAndroid Build Coastguard Worker extern "C" void rsdIntrinsicResizeB2_K(
239*e1eccf28SAndroid Build Coastguard Worker             uchar2 *dst,
240*e1eccf28SAndroid Build Coastguard Worker             size_t count,
241*e1eccf28SAndroid Build Coastguard Worker             uint32_t xf,
242*e1eccf28SAndroid Build Coastguard Worker             uint32_t xinc,
243*e1eccf28SAndroid Build Coastguard Worker             uchar2 const *srcn,
244*e1eccf28SAndroid Build Coastguard Worker             uchar2 const *src0,
245*e1eccf28SAndroid Build Coastguard Worker             uchar2 const *src1,
246*e1eccf28SAndroid Build Coastguard Worker             uchar2 const *src2,
247*e1eccf28SAndroid Build Coastguard Worker             size_t xclip,
248*e1eccf28SAndroid Build Coastguard Worker             size_t avail,
249*e1eccf28SAndroid Build Coastguard Worker             uint64_t osc_ctl,
250*e1eccf28SAndroid Build Coastguard Worker             int32_t const *yr);
251*e1eccf28SAndroid Build Coastguard Worker 
252*e1eccf28SAndroid Build Coastguard Worker extern "C" void rsdIntrinsicResizeB1_K(
253*e1eccf28SAndroid Build Coastguard Worker             uchar *dst,
254*e1eccf28SAndroid Build Coastguard Worker             size_t count,
255*e1eccf28SAndroid Build Coastguard Worker             uint32_t xf,
256*e1eccf28SAndroid Build Coastguard Worker             uint32_t xinc,
257*e1eccf28SAndroid Build Coastguard Worker             uchar const *srcn,
258*e1eccf28SAndroid Build Coastguard Worker             uchar const *src0,
259*e1eccf28SAndroid Build Coastguard Worker             uchar const *src1,
260*e1eccf28SAndroid Build Coastguard Worker             uchar const *src2,
261*e1eccf28SAndroid Build Coastguard Worker             size_t xclip,
262*e1eccf28SAndroid Build Coastguard Worker             size_t avail,
263*e1eccf28SAndroid Build Coastguard Worker             uint64_t osc_ctl,
264*e1eccf28SAndroid Build Coastguard Worker             int32_t const *yr);
265*e1eccf28SAndroid Build Coastguard Worker 
266*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
mkYCoeff(int32_t * yr,float yf)267*e1eccf28SAndroid Build Coastguard Worker static void mkYCoeff(int32_t *yr, float yf) {
268*e1eccf28SAndroid Build Coastguard Worker     int32_t yf1 = rint(yf * 0x10000);
269*e1eccf28SAndroid Build Coastguard Worker     int32_t yf2 = rint(yf * yf * 0x10000);
270*e1eccf28SAndroid Build Coastguard Worker     int32_t yf3 = rint(yf * yf * yf * 0x10000);
271*e1eccf28SAndroid Build Coastguard Worker 
272*e1eccf28SAndroid Build Coastguard Worker     yr[0] = -(2 * yf2 - yf3 - yf1) >> 1;
273*e1eccf28SAndroid Build Coastguard Worker     yr[1] = (3 * yf3 - 5 * yf2 + 0x20000) >> 1;
274*e1eccf28SAndroid Build Coastguard Worker     yr[2] = (-3 * yf3 + 4 * yf2 + yf1) >> 1;
275*e1eccf28SAndroid Build Coastguard Worker     yr[3] = -(yf3 - yf2) >> 1;
276*e1eccf28SAndroid Build Coastguard Worker }
277*e1eccf28SAndroid Build Coastguard Worker #endif
278*e1eccf28SAndroid Build Coastguard Worker 
279*e1eccf28SAndroid Build Coastguard Worker #ifdef ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
OneBiCubic(const float4 * yp0,const float4 * yp1,const float4 * yp2,const float4 * yp3,float xf,float yf,int width)280*e1eccf28SAndroid Build Coastguard Worker static float4 OneBiCubic(const float4 *yp0, const float4 *yp1, const float4 *yp2, const float4 *yp3,
281*e1eccf28SAndroid Build Coastguard Worker                          float xf, float yf, int width) {
282*e1eccf28SAndroid Build Coastguard Worker     int startx = (int) floor(xf - 1);
283*e1eccf28SAndroid Build Coastguard Worker     xf = xf - floor(xf);
284*e1eccf28SAndroid Build Coastguard Worker     int maxx = width - 1;
285*e1eccf28SAndroid Build Coastguard Worker     int xs0 = std::max(0, startx + 0);
286*e1eccf28SAndroid Build Coastguard Worker     int xs1 = std::max(0, startx + 1);
287*e1eccf28SAndroid Build Coastguard Worker     int xs2 = std::min(maxx, startx + 2);
288*e1eccf28SAndroid Build Coastguard Worker     int xs3 = std::min(maxx, startx + 3);
289*e1eccf28SAndroid Build Coastguard Worker 
290*e1eccf28SAndroid Build Coastguard Worker     float4 p0  = cubicInterpolate(yp0[xs0], yp0[xs1],
291*e1eccf28SAndroid Build Coastguard Worker                                   yp0[xs2], yp0[xs3], xf);
292*e1eccf28SAndroid Build Coastguard Worker     float4 p1  = cubicInterpolate(yp1[xs0], yp1[xs1],
293*e1eccf28SAndroid Build Coastguard Worker                                   yp1[xs2], yp1[xs3], xf);
294*e1eccf28SAndroid Build Coastguard Worker     float4 p2  = cubicInterpolate(yp2[xs0], yp2[xs1],
295*e1eccf28SAndroid Build Coastguard Worker                                   yp2[xs2], yp2[xs3], xf);
296*e1eccf28SAndroid Build Coastguard Worker     float4 p3  = cubicInterpolate(yp3[xs0], yp3[xs1],
297*e1eccf28SAndroid Build Coastguard Worker                                   yp3[xs2], yp3[xs3], xf);
298*e1eccf28SAndroid Build Coastguard Worker 
299*e1eccf28SAndroid Build Coastguard Worker     float4 p  = cubicInterpolate(p0, p1, p2, p3, yf);
300*e1eccf28SAndroid Build Coastguard Worker     return p;
301*e1eccf28SAndroid Build Coastguard Worker }
302*e1eccf28SAndroid Build Coastguard Worker 
OneBiCubic(const float2 * yp0,const float2 * yp1,const float2 * yp2,const float2 * yp3,float xf,float yf,int width)303*e1eccf28SAndroid Build Coastguard Worker static float2 OneBiCubic(const float2 *yp0, const float2 *yp1, const float2 *yp2, const float2 *yp3,
304*e1eccf28SAndroid Build Coastguard Worker                          float xf, float yf, int width) {
305*e1eccf28SAndroid Build Coastguard Worker     int startx = (int) floor(xf - 1);
306*e1eccf28SAndroid Build Coastguard Worker     xf = xf - floor(xf);
307*e1eccf28SAndroid Build Coastguard Worker     int maxx = width - 1;
308*e1eccf28SAndroid Build Coastguard Worker     int xs0 = std::max(0, startx + 0);
309*e1eccf28SAndroid Build Coastguard Worker     int xs1 = std::max(0, startx + 1);
310*e1eccf28SAndroid Build Coastguard Worker     int xs2 = std::min(maxx, startx + 2);
311*e1eccf28SAndroid Build Coastguard Worker     int xs3 = std::min(maxx, startx + 3);
312*e1eccf28SAndroid Build Coastguard Worker 
313*e1eccf28SAndroid Build Coastguard Worker     float2 p0  = cubicInterpolate(yp0[xs0], yp0[xs1],
314*e1eccf28SAndroid Build Coastguard Worker                                   yp0[xs2], yp0[xs3], xf);
315*e1eccf28SAndroid Build Coastguard Worker     float2 p1  = cubicInterpolate(yp1[xs0], yp1[xs1],
316*e1eccf28SAndroid Build Coastguard Worker                                   yp1[xs2], yp1[xs3], xf);
317*e1eccf28SAndroid Build Coastguard Worker     float2 p2  = cubicInterpolate(yp2[xs0], yp2[xs1],
318*e1eccf28SAndroid Build Coastguard Worker                                   yp2[xs2], yp2[xs3], xf);
319*e1eccf28SAndroid Build Coastguard Worker     float2 p3  = cubicInterpolate(yp3[xs0], yp3[xs1],
320*e1eccf28SAndroid Build Coastguard Worker                                   yp3[xs2], yp3[xs3], xf);
321*e1eccf28SAndroid Build Coastguard Worker 
322*e1eccf28SAndroid Build Coastguard Worker     float2 p  = cubicInterpolate(p0, p1, p2, p3, yf);
323*e1eccf28SAndroid Build Coastguard Worker     return p;
324*e1eccf28SAndroid Build Coastguard Worker }
325*e1eccf28SAndroid Build Coastguard Worker 
OneBiCubic(const float * yp0,const float * yp1,const float * yp2,const float * yp3,float xf,float yf,int width)326*e1eccf28SAndroid Build Coastguard Worker static float OneBiCubic(const float *yp0, const float *yp1, const float *yp2, const float *yp3,
327*e1eccf28SAndroid Build Coastguard Worker                         float xf, float yf, int width) {
328*e1eccf28SAndroid Build Coastguard Worker     int startx = (int) floor(xf - 1);
329*e1eccf28SAndroid Build Coastguard Worker     xf = xf - floor(xf);
330*e1eccf28SAndroid Build Coastguard Worker     int maxx = width - 1;
331*e1eccf28SAndroid Build Coastguard Worker     int xs0 = std::max(0, startx + 0);
332*e1eccf28SAndroid Build Coastguard Worker     int xs1 = std::max(0, startx + 1);
333*e1eccf28SAndroid Build Coastguard Worker     int xs2 = std::min(maxx, startx + 2);
334*e1eccf28SAndroid Build Coastguard Worker     int xs3 = std::min(maxx, startx + 3);
335*e1eccf28SAndroid Build Coastguard Worker 
336*e1eccf28SAndroid Build Coastguard Worker     float p0  = cubicInterpolate(yp0[xs0], yp0[xs1],
337*e1eccf28SAndroid Build Coastguard Worker                                  yp0[xs2], yp0[xs3], xf);
338*e1eccf28SAndroid Build Coastguard Worker     float p1  = cubicInterpolate(yp1[xs0], yp1[xs1],
339*e1eccf28SAndroid Build Coastguard Worker                                  yp1[xs2], yp1[xs3], xf);
340*e1eccf28SAndroid Build Coastguard Worker     float p2  = cubicInterpolate(yp2[xs0], yp2[xs1],
341*e1eccf28SAndroid Build Coastguard Worker                                  yp2[xs2], yp2[xs3], xf);
342*e1eccf28SAndroid Build Coastguard Worker     float p3  = cubicInterpolate(yp3[xs0], yp3[xs1],
343*e1eccf28SAndroid Build Coastguard Worker                                  yp3[xs2], yp3[xs3], xf);
344*e1eccf28SAndroid Build Coastguard Worker 
345*e1eccf28SAndroid Build Coastguard Worker     float p  = cubicInterpolate(p0, p1, p2, p3, yf);
346*e1eccf28SAndroid Build Coastguard Worker     return p;
347*e1eccf28SAndroid Build Coastguard Worker }
348*e1eccf28SAndroid Build Coastguard Worker #endif
349*e1eccf28SAndroid Build Coastguard Worker 
kernelU4(uchar * outPtr,uint32_t xstart,uint32_t xend,uint32_t currentY)350*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::kernelU4(uchar *outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY) {
351*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = mIn;
352*e1eccf28SAndroid Build Coastguard Worker     const int srcHeight = mInputSizeY;
353*e1eccf28SAndroid Build Coastguard Worker     const int srcWidth = mInputSizeX;
354*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = mInputSizeX * paddedSize(mVectorSize);
355*e1eccf28SAndroid Build Coastguard Worker 
356*e1eccf28SAndroid Build Coastguard Worker 
357*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
358*e1eccf28SAndroid Build Coastguard Worker     float yf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(currentY + 0.5f),
359*e1eccf28SAndroid Build Coastguard Worker                                           _mm_set1_ps(scaleY), _mm_set1_ps(0.5f)));
360*e1eccf28SAndroid Build Coastguard Worker #else
361*e1eccf28SAndroid Build Coastguard Worker     float yf = (currentY + 0.5f) * mScaleY - 0.5f;
362*e1eccf28SAndroid Build Coastguard Worker #endif
363*e1eccf28SAndroid Build Coastguard Worker 
364*e1eccf28SAndroid Build Coastguard Worker 
365*e1eccf28SAndroid Build Coastguard Worker     int starty = (int) floor(yf - 1);
366*e1eccf28SAndroid Build Coastguard Worker     yf = yf - floor(yf);
367*e1eccf28SAndroid Build Coastguard Worker     int maxy = srcHeight - 1;
368*e1eccf28SAndroid Build Coastguard Worker     int ys0 = std::max(0, starty + 0);
369*e1eccf28SAndroid Build Coastguard Worker     int ys1 = std::max(0, starty + 1);
370*e1eccf28SAndroid Build Coastguard Worker     int ys2 = std::min(maxy, starty + 2);
371*e1eccf28SAndroid Build Coastguard Worker     int ys3 = std::min(maxy, starty + 3);
372*e1eccf28SAndroid Build Coastguard Worker 
373*e1eccf28SAndroid Build Coastguard Worker     const uchar4 *yp0 = (const uchar4 *)(pin + stride * ys0);
374*e1eccf28SAndroid Build Coastguard Worker     const uchar4 *yp1 = (const uchar4 *)(pin + stride * ys1);
375*e1eccf28SAndroid Build Coastguard Worker     const uchar4 *yp2 = (const uchar4 *)(pin + stride * ys2);
376*e1eccf28SAndroid Build Coastguard Worker     const uchar4 *yp3 = (const uchar4 *)(pin + stride * ys3);
377*e1eccf28SAndroid Build Coastguard Worker 
378*e1eccf28SAndroid Build Coastguard Worker     uchar4 *out = ((uchar4 *)outPtr);
379*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
380*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
381*e1eccf28SAndroid Build Coastguard Worker 
382*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
383*e1eccf28SAndroid Build Coastguard Worker     if (mUsesSimd && x2 > x1 && mScaleX < 4.0f) {
384*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * mScaleX - 0.5f;
385*e1eccf28SAndroid Build Coastguard Worker         long xf16 = rint(xf * 0x10000);
386*e1eccf28SAndroid Build Coastguard Worker         uint32_t xinc16 = rint(mScaleX * 0x10000);
387*e1eccf28SAndroid Build Coastguard Worker 
388*e1eccf28SAndroid Build Coastguard Worker         int xoff = (xf16 >> 16) - 1;
389*e1eccf28SAndroid Build Coastguard Worker         int xclip = std::max(0, xoff) - xoff;
390*e1eccf28SAndroid Build Coastguard Worker         int len = x2 - x1;
391*e1eccf28SAndroid Build Coastguard Worker 
392*e1eccf28SAndroid Build Coastguard Worker         int32_t yr[4];
393*e1eccf28SAndroid Build Coastguard Worker         uint64_t osc_ctl = rsdIntrinsicResize_oscctl_K(xinc16);
394*e1eccf28SAndroid Build Coastguard Worker         mkYCoeff(yr, yf);
395*e1eccf28SAndroid Build Coastguard Worker 
396*e1eccf28SAndroid Build Coastguard Worker         xoff += xclip;
397*e1eccf28SAndroid Build Coastguard Worker 
398*e1eccf28SAndroid Build Coastguard Worker         rsdIntrinsicResizeB4_K(
399*e1eccf28SAndroid Build Coastguard Worker                 out, len,
400*e1eccf28SAndroid Build Coastguard Worker                 xf16 & 0xffff, xinc16,
401*e1eccf28SAndroid Build Coastguard Worker                 yp0 + xoff, yp1 + xoff, yp2 + xoff, yp3 + xoff,
402*e1eccf28SAndroid Build Coastguard Worker                 xclip, srcWidth - xoff + xclip,
403*e1eccf28SAndroid Build Coastguard Worker                 osc_ctl, yr);
404*e1eccf28SAndroid Build Coastguard Worker         out += len;
405*e1eccf28SAndroid Build Coastguard Worker         x1 += len;
406*e1eccf28SAndroid Build Coastguard Worker     }
407*e1eccf28SAndroid Build Coastguard Worker #endif
408*e1eccf28SAndroid Build Coastguard Worker 
409*e1eccf28SAndroid Build Coastguard Worker     while(x1 < x2) {
410*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
411*e1eccf28SAndroid Build Coastguard Worker         float xf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(x1 + 0.5f) , _mm_set1_ps(scaleX) ,
412*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(0.5f)));
413*e1eccf28SAndroid Build Coastguard Worker #else
414*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * mScaleX - 0.5f;
415*e1eccf28SAndroid Build Coastguard Worker #endif
416*e1eccf28SAndroid Build Coastguard Worker         *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
417*e1eccf28SAndroid Build Coastguard Worker         out++;
418*e1eccf28SAndroid Build Coastguard Worker         x1++;
419*e1eccf28SAndroid Build Coastguard Worker     }
420*e1eccf28SAndroid Build Coastguard Worker }
421*e1eccf28SAndroid Build Coastguard Worker 
kernelU2(uchar * outPtr,uint32_t xstart,uint32_t xend,uint32_t currentY)422*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::kernelU2(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY) {
423*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = mIn;
424*e1eccf28SAndroid Build Coastguard Worker     const int srcHeight = mInputSizeY;
425*e1eccf28SAndroid Build Coastguard Worker     const int srcWidth = mInputSizeX;
426*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = mInputSizeX * mVectorSize;
427*e1eccf28SAndroid Build Coastguard Worker 
428*e1eccf28SAndroid Build Coastguard Worker 
429*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
430*e1eccf28SAndroid Build Coastguard Worker     float yf = _mm_cvtss_f32(
431*e1eccf28SAndroid Build Coastguard Worker             _mm_fmsub_ss(_mm_set1_ps(currentY + 0.5f), _mm_set1_ps(scaleY), _mm_set1_ps(0.5f)));
432*e1eccf28SAndroid Build Coastguard Worker #else
433*e1eccf28SAndroid Build Coastguard Worker     float yf = (currentY + 0.5f) * mScaleY - 0.5f;
434*e1eccf28SAndroid Build Coastguard Worker #endif
435*e1eccf28SAndroid Build Coastguard Worker 
436*e1eccf28SAndroid Build Coastguard Worker     int starty = (int) floor(yf - 1);
437*e1eccf28SAndroid Build Coastguard Worker     yf = yf - floor(yf);
438*e1eccf28SAndroid Build Coastguard Worker     int maxy = srcHeight - 1;
439*e1eccf28SAndroid Build Coastguard Worker     int ys0 = std::max(0, starty + 0);
440*e1eccf28SAndroid Build Coastguard Worker     int ys1 = std::max(0, starty + 1);
441*e1eccf28SAndroid Build Coastguard Worker     int ys2 = std::min(maxy, starty + 2);
442*e1eccf28SAndroid Build Coastguard Worker     int ys3 = std::min(maxy, starty + 3);
443*e1eccf28SAndroid Build Coastguard Worker 
444*e1eccf28SAndroid Build Coastguard Worker     const uchar2 *yp0 = (const uchar2 *)(pin + stride * ys0);
445*e1eccf28SAndroid Build Coastguard Worker     const uchar2 *yp1 = (const uchar2 *)(pin + stride * ys1);
446*e1eccf28SAndroid Build Coastguard Worker     const uchar2 *yp2 = (const uchar2 *)(pin + stride * ys2);
447*e1eccf28SAndroid Build Coastguard Worker     const uchar2 *yp3 = (const uchar2 *)(pin + stride * ys3);
448*e1eccf28SAndroid Build Coastguard Worker 
449*e1eccf28SAndroid Build Coastguard Worker     uchar2 *out = ((uchar2 *)outPtr);
450*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
451*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
452*e1eccf28SAndroid Build Coastguard Worker 
453*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
454*e1eccf28SAndroid Build Coastguard Worker     if (mUsesSimd && x2 > x1 && mScaleX < 4.0f) {
455*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * mScaleX - 0.5f;
456*e1eccf28SAndroid Build Coastguard Worker         long xf16 = rint(xf * 0x10000);
457*e1eccf28SAndroid Build Coastguard Worker         uint32_t xinc16 = rint(mScaleX * 0x10000);
458*e1eccf28SAndroid Build Coastguard Worker 
459*e1eccf28SAndroid Build Coastguard Worker         int xoff = (xf16 >> 16) - 1;
460*e1eccf28SAndroid Build Coastguard Worker         int xclip = std::max(0, xoff) - xoff;
461*e1eccf28SAndroid Build Coastguard Worker         int len = x2 - x1;
462*e1eccf28SAndroid Build Coastguard Worker 
463*e1eccf28SAndroid Build Coastguard Worker         int32_t yr[4];
464*e1eccf28SAndroid Build Coastguard Worker         uint64_t osc_ctl = rsdIntrinsicResize_oscctl_K(xinc16);
465*e1eccf28SAndroid Build Coastguard Worker         mkYCoeff(yr, yf);
466*e1eccf28SAndroid Build Coastguard Worker 
467*e1eccf28SAndroid Build Coastguard Worker         xoff += xclip;
468*e1eccf28SAndroid Build Coastguard Worker 
469*e1eccf28SAndroid Build Coastguard Worker         rsdIntrinsicResizeB2_K(
470*e1eccf28SAndroid Build Coastguard Worker                 out, len,
471*e1eccf28SAndroid Build Coastguard Worker                 xf16 & 0xffff, xinc16,
472*e1eccf28SAndroid Build Coastguard Worker                 yp0 + xoff, yp1 + xoff, yp2 + xoff, yp3 + xoff,
473*e1eccf28SAndroid Build Coastguard Worker                 xclip, srcWidth - xoff + xclip,
474*e1eccf28SAndroid Build Coastguard Worker                 osc_ctl, yr);
475*e1eccf28SAndroid Build Coastguard Worker         out += len;
476*e1eccf28SAndroid Build Coastguard Worker         x1 += len;
477*e1eccf28SAndroid Build Coastguard Worker     }
478*e1eccf28SAndroid Build Coastguard Worker #endif
479*e1eccf28SAndroid Build Coastguard Worker 
480*e1eccf28SAndroid Build Coastguard Worker     while(x1 < x2) {
481*e1eccf28SAndroid Build Coastguard Worker 
482*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
483*e1eccf28SAndroid Build Coastguard Worker         float xf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(x1 + 0.5f) , _mm_set1_ps(scaleX) ,
484*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(0.5f)));
485*e1eccf28SAndroid Build Coastguard Worker #else
486*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * mScaleX - 0.5f;
487*e1eccf28SAndroid Build Coastguard Worker #endif
488*e1eccf28SAndroid Build Coastguard Worker         *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
489*e1eccf28SAndroid Build Coastguard Worker         out++;
490*e1eccf28SAndroid Build Coastguard Worker         x1++;
491*e1eccf28SAndroid Build Coastguard Worker     }
492*e1eccf28SAndroid Build Coastguard Worker }
493*e1eccf28SAndroid Build Coastguard Worker 
kernelU1(uchar * outPtr,uint32_t xstart,uint32_t xend,uint32_t currentY)494*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::kernelU1(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY) {
495*e1eccf28SAndroid Build Coastguard Worker     //ALOGI("TK kernelU1 xstart %u, xend %u, outstep %u", xstart, xend);
496*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = mIn;
497*e1eccf28SAndroid Build Coastguard Worker     const int srcHeight = mInputSizeY;
498*e1eccf28SAndroid Build Coastguard Worker     const int srcWidth = mInputSizeX;
499*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = mInputSizeX * mVectorSize;
500*e1eccf28SAndroid Build Coastguard Worker 
501*e1eccf28SAndroid Build Coastguard Worker     // ALOGI("Toolkit   ResizeU1 (%ux%u) by (%f,%f), xstart:%u to %u, stride %zu, out %p", srcWidth,
502*e1eccf28SAndroid Build Coastguard Worker     // srcHeight, scaleX, scaleY, xstart, xend, stride, outPtr);
503*e1eccf28SAndroid Build Coastguard Worker 
504*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
505*e1eccf28SAndroid Build Coastguard Worker     float yf = _mm_cvtss_f32(
506*e1eccf28SAndroid Build Coastguard Worker             _mm_fmsub_ss(_mm_set1_ps(currentY + 0.5f), _mm_set1_ps(scaleY), _mm_set1_ps(0.5f)));
507*e1eccf28SAndroid Build Coastguard Worker #else
508*e1eccf28SAndroid Build Coastguard Worker     float yf = (currentY + 0.5f) * mScaleY - 0.5f;
509*e1eccf28SAndroid Build Coastguard Worker #endif
510*e1eccf28SAndroid Build Coastguard Worker 
511*e1eccf28SAndroid Build Coastguard Worker     int starty = (int) floor(yf - 1);
512*e1eccf28SAndroid Build Coastguard Worker     yf = yf - floor(yf);
513*e1eccf28SAndroid Build Coastguard Worker     int maxy = srcHeight - 1;
514*e1eccf28SAndroid Build Coastguard Worker     int ys0 = std::max(0, starty + 0);
515*e1eccf28SAndroid Build Coastguard Worker     int ys1 = std::min(maxy, std::max(0, starty + 1));
516*e1eccf28SAndroid Build Coastguard Worker     int ys2 = std::min(maxy, starty + 2);
517*e1eccf28SAndroid Build Coastguard Worker     int ys3 = std::min(maxy, starty + 3);
518*e1eccf28SAndroid Build Coastguard Worker 
519*e1eccf28SAndroid Build Coastguard Worker     const uchar *yp0 = pin + stride * ys0;
520*e1eccf28SAndroid Build Coastguard Worker     const uchar *yp1 = pin + stride * ys1;
521*e1eccf28SAndroid Build Coastguard Worker     const uchar *yp2 = pin + stride * ys2;
522*e1eccf28SAndroid Build Coastguard Worker     const uchar *yp3 = pin + stride * ys3;
523*e1eccf28SAndroid Build Coastguard Worker 
524*e1eccf28SAndroid Build Coastguard Worker     uchar *out = ((uchar *)outPtr);
525*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
526*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
527*e1eccf28SAndroid Build Coastguard Worker 
528*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
529*e1eccf28SAndroid Build Coastguard Worker     if (mUsesSimd && x2 > x1 && mScaleX < 4.0f) {
530*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * mScaleX - 0.5f;
531*e1eccf28SAndroid Build Coastguard Worker         long xf16 = rint(xf * 0x10000);
532*e1eccf28SAndroid Build Coastguard Worker         uint32_t xinc16 = rint(mScaleX * 0x10000);
533*e1eccf28SAndroid Build Coastguard Worker 
534*e1eccf28SAndroid Build Coastguard Worker         int xoff = (xf16 >> 16) - 1;
535*e1eccf28SAndroid Build Coastguard Worker         int xclip = std::max(0, xoff) - xoff;
536*e1eccf28SAndroid Build Coastguard Worker         int len = x2 - x1;
537*e1eccf28SAndroid Build Coastguard Worker 
538*e1eccf28SAndroid Build Coastguard Worker         int32_t yr[4];
539*e1eccf28SAndroid Build Coastguard Worker         uint64_t osc_ctl = rsdIntrinsicResize_oscctl_K(xinc16);
540*e1eccf28SAndroid Build Coastguard Worker         mkYCoeff(yr, yf);
541*e1eccf28SAndroid Build Coastguard Worker 
542*e1eccf28SAndroid Build Coastguard Worker         // ALOGI("ys0 %d, ys1 %d, ys2 %d, ys3 %d, x1 %u, x2 %u, xf %f, xf16 %ld, xinc16 %u, xoff %d,
543*e1eccf28SAndroid Build Coastguard Worker         // xclip %d, len %d, osc_ctl %lu)",
544*e1eccf28SAndroid Build Coastguard Worker         //       ys0, ys1, ys2, ys3, x1, x2, xf, xf16, xinc16, xoff, xclip, len, (unsigned long)
545*e1eccf28SAndroid Build Coastguard Worker         //       osc_ctl);
546*e1eccf28SAndroid Build Coastguard Worker         // ALOGI("TK scaleX %f, xf %f, xf16 %ld, xinc16 %d, xoff %d, xclip %d, len %d", scaleX, xf,
547*e1eccf28SAndroid Build Coastguard Worker         // xf16, xinc16, xoff, xclip, len); ALOGI("TK xf16 & 0xffff %ld, ys0 %u, ys1 %u, ys2 %u, ys3
548*e1eccf28SAndroid Build Coastguard Worker         // %u, srcWidth - xoff + xclip %d", xf16 & 0xffff, ys0, ys1, ys2, ys3, srcWidth - xoff);
549*e1eccf28SAndroid Build Coastguard Worker 
550*e1eccf28SAndroid Build Coastguard Worker         xoff += xclip;
551*e1eccf28SAndroid Build Coastguard Worker 
552*e1eccf28SAndroid Build Coastguard Worker         rsdIntrinsicResizeB1_K(
553*e1eccf28SAndroid Build Coastguard Worker                 out, len,
554*e1eccf28SAndroid Build Coastguard Worker                 xf16 & 0xffff, xinc16,
555*e1eccf28SAndroid Build Coastguard Worker                 yp0 + xoff, yp1 + xoff, yp2 + xoff, yp3 + xoff,
556*e1eccf28SAndroid Build Coastguard Worker                 xclip, srcWidth - xoff + xclip,
557*e1eccf28SAndroid Build Coastguard Worker                 osc_ctl, yr);
558*e1eccf28SAndroid Build Coastguard Worker         out += len;
559*e1eccf28SAndroid Build Coastguard Worker         x1 += len;
560*e1eccf28SAndroid Build Coastguard Worker     }
561*e1eccf28SAndroid Build Coastguard Worker #endif
562*e1eccf28SAndroid Build Coastguard Worker 
563*e1eccf28SAndroid Build Coastguard Worker     while(x1 < x2) {
564*e1eccf28SAndroid Build Coastguard Worker 
565*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
566*e1eccf28SAndroid Build Coastguard Worker         float xf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(x1 + 0.5f) , _mm_set1_ps(scaleX) ,
567*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(0.5f)));
568*e1eccf28SAndroid Build Coastguard Worker #else
569*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * mScaleX - 0.5f;
570*e1eccf28SAndroid Build Coastguard Worker #endif
571*e1eccf28SAndroid Build Coastguard Worker 
572*e1eccf28SAndroid Build Coastguard Worker         *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
573*e1eccf28SAndroid Build Coastguard Worker         out++;
574*e1eccf28SAndroid Build Coastguard Worker         x1++;
575*e1eccf28SAndroid Build Coastguard Worker     }
576*e1eccf28SAndroid Build Coastguard Worker }
577*e1eccf28SAndroid Build Coastguard Worker 
578*e1eccf28SAndroid Build Coastguard Worker #ifdef ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
kernelF4(uchar * outPtr,uint32_t xstart,uint32_t xend,uint32_t currentY)579*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::kernelF4(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY) {
580*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = mIn;
581*e1eccf28SAndroid Build Coastguard Worker     const int srcHeight = inputSizeY;
582*e1eccf28SAndroid Build Coastguard Worker     const int srcWidth = inputSizeX;
583*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = sizeX * vectorSize;
584*e1eccf28SAndroid Build Coastguard Worker 
585*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
586*e1eccf28SAndroid Build Coastguard Worker     float yf = _mm_cvtss_f32(
587*e1eccf28SAndroid Build Coastguard Worker             _mm_fmsub_ss(_mm_set1_ps(currentY + 0.5f), _mm_set1_ps(scaleY), _mm_set1_ps(0.5f)));
588*e1eccf28SAndroid Build Coastguard Worker #else
589*e1eccf28SAndroid Build Coastguard Worker     float yf = (currentY + 0.5f) * scaleY - 0.5f;
590*e1eccf28SAndroid Build Coastguard Worker #endif
591*e1eccf28SAndroid Build Coastguard Worker 
592*e1eccf28SAndroid Build Coastguard Worker     int starty = (int) floor(yf - 1);
593*e1eccf28SAndroid Build Coastguard Worker     yf = yf - floor(yf);
594*e1eccf28SAndroid Build Coastguard Worker     int maxy = srcHeight - 1;
595*e1eccf28SAndroid Build Coastguard Worker     int ys0 = std::max(0, starty + 0);
596*e1eccf28SAndroid Build Coastguard Worker     int ys1 = std::max(0, starty + 1);
597*e1eccf28SAndroid Build Coastguard Worker     int ys2 = std::min(maxy, starty + 2);
598*e1eccf28SAndroid Build Coastguard Worker     int ys3 = std::min(maxy, starty + 3);
599*e1eccf28SAndroid Build Coastguard Worker 
600*e1eccf28SAndroid Build Coastguard Worker     const float4 *yp0 = (const float4 *)(pin + stride * ys0);
601*e1eccf28SAndroid Build Coastguard Worker     const float4 *yp1 = (const float4 *)(pin + stride * ys1);
602*e1eccf28SAndroid Build Coastguard Worker     const float4 *yp2 = (const float4 *)(pin + stride * ys2);
603*e1eccf28SAndroid Build Coastguard Worker     const float4 *yp3 = (const float4 *)(pin + stride * ys3);
604*e1eccf28SAndroid Build Coastguard Worker 
605*e1eccf28SAndroid Build Coastguard Worker     float4 *out = ((float4 *)outPtr);
606*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
607*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
608*e1eccf28SAndroid Build Coastguard Worker 
609*e1eccf28SAndroid Build Coastguard Worker     while(x1 < x2) {
610*e1eccf28SAndroid Build Coastguard Worker 
611*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
612*e1eccf28SAndroid Build Coastguard Worker         float xf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(x1 + 0.5f) , _mm_set1_ps(scaleX) ,
613*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(0.5f)));
614*e1eccf28SAndroid Build Coastguard Worker #else
615*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * scaleX - 0.5f;
616*e1eccf28SAndroid Build Coastguard Worker #endif
617*e1eccf28SAndroid Build Coastguard Worker 
618*e1eccf28SAndroid Build Coastguard Worker         *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
619*e1eccf28SAndroid Build Coastguard Worker         out++;
620*e1eccf28SAndroid Build Coastguard Worker         x1++;
621*e1eccf28SAndroid Build Coastguard Worker     }
622*e1eccf28SAndroid Build Coastguard Worker }
623*e1eccf28SAndroid Build Coastguard Worker 
kernelF2(uchar * outPtr,uint32_t xstart,uint32_t xend,uint32_t currentY)624*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::kernelF2(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY) {
625*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = mIn;
626*e1eccf28SAndroid Build Coastguard Worker     const int srcHeight = inputSizeY;
627*e1eccf28SAndroid Build Coastguard Worker     const int srcWidth = inputSizeX;
628*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = sizeX * vectorSize;
629*e1eccf28SAndroid Build Coastguard Worker 
630*e1eccf28SAndroid Build Coastguard Worker 
631*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
632*e1eccf28SAndroid Build Coastguard Worker     float yf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(currentY + 0.5f),
633*e1eccf28SAndroid Build Coastguard Worker                                           _mm_set1_ps(scaleY), _mm_set1_ps(0.5f)));
634*e1eccf28SAndroid Build Coastguard Worker #else
635*e1eccf28SAndroid Build Coastguard Worker     float yf = (currentY + 0.5f) * scaleY - 0.5f;
636*e1eccf28SAndroid Build Coastguard Worker #endif
637*e1eccf28SAndroid Build Coastguard Worker 
638*e1eccf28SAndroid Build Coastguard Worker     int starty = (int) floor(yf - 1);
639*e1eccf28SAndroid Build Coastguard Worker     yf = yf - floor(yf);
640*e1eccf28SAndroid Build Coastguard Worker     int maxy = srcHeight - 1;
641*e1eccf28SAndroid Build Coastguard Worker     int ys0 = std::max(0, starty + 0);
642*e1eccf28SAndroid Build Coastguard Worker     int ys1 = std::max(0, starty + 1);
643*e1eccf28SAndroid Build Coastguard Worker     int ys2 = std::min(maxy, starty + 2);
644*e1eccf28SAndroid Build Coastguard Worker     int ys3 = std::min(maxy, starty + 3);
645*e1eccf28SAndroid Build Coastguard Worker 
646*e1eccf28SAndroid Build Coastguard Worker     const float2 *yp0 = (const float2 *)(pin + stride * ys0);
647*e1eccf28SAndroid Build Coastguard Worker     const float2 *yp1 = (const float2 *)(pin + stride * ys1);
648*e1eccf28SAndroid Build Coastguard Worker     const float2 *yp2 = (const float2 *)(pin + stride * ys2);
649*e1eccf28SAndroid Build Coastguard Worker     const float2 *yp3 = (const float2 *)(pin + stride * ys3);
650*e1eccf28SAndroid Build Coastguard Worker 
651*e1eccf28SAndroid Build Coastguard Worker     float2 *out = ((float2 *)outPtr);
652*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
653*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
654*e1eccf28SAndroid Build Coastguard Worker 
655*e1eccf28SAndroid Build Coastguard Worker     while(x1 < x2) {
656*e1eccf28SAndroid Build Coastguard Worker 
657*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
658*e1eccf28SAndroid Build Coastguard Worker         float xf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(x1 + 0.5f) , _mm_set1_ps(scaleX) ,
659*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(0.5f)));
660*e1eccf28SAndroid Build Coastguard Worker #else
661*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * scaleX - 0.5f;
662*e1eccf28SAndroid Build Coastguard Worker #endif
663*e1eccf28SAndroid Build Coastguard Worker 
664*e1eccf28SAndroid Build Coastguard Worker         *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
665*e1eccf28SAndroid Build Coastguard Worker         out++;
666*e1eccf28SAndroid Build Coastguard Worker         x1++;
667*e1eccf28SAndroid Build Coastguard Worker     }
668*e1eccf28SAndroid Build Coastguard Worker }
669*e1eccf28SAndroid Build Coastguard Worker 
kernelF1(uchar * outPtr,uint32_t xstart,uint32_t xend,uint32_t currentY)670*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::kernelF1(uchar* outPtr, uint32_t xstart, uint32_t xend, uint32_t currentY) {
671*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = mIn;
672*e1eccf28SAndroid Build Coastguard Worker     const int srcHeight = inputSizeY;
673*e1eccf28SAndroid Build Coastguard Worker     const int srcWidth = inputSizeX;
674*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = sizeX * vectorSize;
675*e1eccf28SAndroid Build Coastguard Worker 
676*e1eccf28SAndroid Build Coastguard Worker 
677*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
678*e1eccf28SAndroid Build Coastguard Worker     float yf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(currentY + 0.5f),
679*e1eccf28SAndroid Build Coastguard Worker                                           _mm_set1_ps(scaleY), _mm_set1_ps(0.5f)));
680*e1eccf28SAndroid Build Coastguard Worker #else
681*e1eccf28SAndroid Build Coastguard Worker     float yf = (currentY + 0.5f) * scaleY - 0.5f;
682*e1eccf28SAndroid Build Coastguard Worker #endif
683*e1eccf28SAndroid Build Coastguard Worker 
684*e1eccf28SAndroid Build Coastguard Worker     int starty = (int) floor(yf - 1);
685*e1eccf28SAndroid Build Coastguard Worker     yf = yf - floor(yf);
686*e1eccf28SAndroid Build Coastguard Worker     int maxy = srcHeight - 1;
687*e1eccf28SAndroid Build Coastguard Worker     int ys0 = std::max(0, starty + 0);
688*e1eccf28SAndroid Build Coastguard Worker     int ys1 = std::max(0, starty + 1);
689*e1eccf28SAndroid Build Coastguard Worker     int ys2 = std::min(maxy, starty + 2);
690*e1eccf28SAndroid Build Coastguard Worker     int ys3 = std::min(maxy, starty + 3);
691*e1eccf28SAndroid Build Coastguard Worker 
692*e1eccf28SAndroid Build Coastguard Worker     const float *yp0 = (const float *)(pin + stride * ys0);
693*e1eccf28SAndroid Build Coastguard Worker     const float *yp1 = (const float *)(pin + stride * ys1);
694*e1eccf28SAndroid Build Coastguard Worker     const float *yp2 = (const float *)(pin + stride * ys2);
695*e1eccf28SAndroid Build Coastguard Worker     const float *yp3 = (const float *)(pin + stride * ys3);
696*e1eccf28SAndroid Build Coastguard Worker 
697*e1eccf28SAndroid Build Coastguard Worker     float *out = ((float *)outPtr);
698*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
699*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
700*e1eccf28SAndroid Build Coastguard Worker 
701*e1eccf28SAndroid Build Coastguard Worker     while(x1 < x2) {
702*e1eccf28SAndroid Build Coastguard Worker 
703*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_AVX2)
704*e1eccf28SAndroid Build Coastguard Worker         float xf = _mm_cvtss_f32(_mm_fmsub_ss(_mm_set1_ps(x1 + 0.5f) , _mm_set1_ps(scaleX) ,
705*e1eccf28SAndroid Build Coastguard Worker                                               _mm_set1_ps(0.5f)));
706*e1eccf28SAndroid Build Coastguard Worker #else
707*e1eccf28SAndroid Build Coastguard Worker         float xf = (x1 + 0.5f) * scaleX - 0.5f;
708*e1eccf28SAndroid Build Coastguard Worker #endif
709*e1eccf28SAndroid Build Coastguard Worker 
710*e1eccf28SAndroid Build Coastguard Worker         *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
711*e1eccf28SAndroid Build Coastguard Worker         out++;
712*e1eccf28SAndroid Build Coastguard Worker         x1++;
713*e1eccf28SAndroid Build Coastguard Worker     }
714*e1eccf28SAndroid Build Coastguard Worker }
715*e1eccf28SAndroid Build Coastguard Worker 
preLaunch(uint32_t slot,const RsScriptCall * sc)716*e1eccf28SAndroid Build Coastguard Worker void ResizeTask::preLaunch(uint32_t slot, const RsScriptCall *sc)
717*e1eccf28SAndroid Build Coastguard Worker {
718*e1eccf28SAndroid Build Coastguard Worker 
719*e1eccf28SAndroid Build Coastguard Worker     //check the data type to determine F or U.
720*e1eccf28SAndroid Build Coastguard Worker     if (mAlloc->getType()->getElement()->getType() == RS_TYPE_UNSIGNED_8) {
721*e1eccf28SAndroid Build Coastguard Worker         switch(mAlloc->getType()->getElement()->getVectorSize()) {
722*e1eccf28SAndroid Build Coastguard Worker         case 1:
723*e1eccf28SAndroid Build Coastguard Worker             mRootPtr = &kernelU1;
724*e1eccf28SAndroid Build Coastguard Worker             break;
725*e1eccf28SAndroid Build Coastguard Worker         case 2:
726*e1eccf28SAndroid Build Coastguard Worker             mRootPtr = &kernelU2;
727*e1eccf28SAndroid Build Coastguard Worker             break;
728*e1eccf28SAndroid Build Coastguard Worker         case 3:
729*e1eccf28SAndroid Build Coastguard Worker         case 4:
730*e1eccf28SAndroid Build Coastguard Worker             mRootPtr = &kernelU4;
731*e1eccf28SAndroid Build Coastguard Worker             break;
732*e1eccf28SAndroid Build Coastguard Worker         }
733*e1eccf28SAndroid Build Coastguard Worker     } else {
734*e1eccf28SAndroid Build Coastguard Worker         switch(mAlloc->getType()->getElement()->getVectorSize()) {
735*e1eccf28SAndroid Build Coastguard Worker         case 1:
736*e1eccf28SAndroid Build Coastguard Worker             mRootPtr = &kernelF1;
737*e1eccf28SAndroid Build Coastguard Worker             break;
738*e1eccf28SAndroid Build Coastguard Worker         case 2:
739*e1eccf28SAndroid Build Coastguard Worker             mRootPtr = &kernelF2;
740*e1eccf28SAndroid Build Coastguard Worker             break;
741*e1eccf28SAndroid Build Coastguard Worker         case 3:
742*e1eccf28SAndroid Build Coastguard Worker         case 4:
743*e1eccf28SAndroid Build Coastguard Worker             mRootPtr = &kernelF4;
744*e1eccf28SAndroid Build Coastguard Worker             break;
745*e1eccf28SAndroid Build Coastguard Worker         }
746*e1eccf28SAndroid Build Coastguard Worker     }
747*e1eccf28SAndroid Build Coastguard Worker }
748*e1eccf28SAndroid Build Coastguard Worker #endif  // ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
749*e1eccf28SAndroid Build Coastguard Worker 
resize(const uint8_t * input,uint8_t * output,size_t inputSizeX,size_t inputSizeY,size_t vectorSize,size_t outputSizeX,size_t outputSizeY,const Restriction * restriction)750*e1eccf28SAndroid Build Coastguard Worker void RenderScriptToolkit::resize(const uint8_t* input, uint8_t* output, size_t inputSizeX,
751*e1eccf28SAndroid Build Coastguard Worker                                  size_t inputSizeY, size_t vectorSize, size_t outputSizeX,
752*e1eccf28SAndroid Build Coastguard Worker                                  size_t outputSizeY, const Restriction* restriction) {
753*e1eccf28SAndroid Build Coastguard Worker #ifdef ANDROID_RENDERSCRIPT_TOOLKIT_VALIDATE
754*e1eccf28SAndroid Build Coastguard Worker     if (!validRestriction(LOG_TAG, outputSizeX, outputSizeY, restriction)) {
755*e1eccf28SAndroid Build Coastguard Worker         return;
756*e1eccf28SAndroid Build Coastguard Worker     }
757*e1eccf28SAndroid Build Coastguard Worker     if (vectorSize < 1 || vectorSize > 4) {
758*e1eccf28SAndroid Build Coastguard Worker         ALOGE("The vectorSize should be between 1 and 4. %zu provided.", vectorSize);
759*e1eccf28SAndroid Build Coastguard Worker         return;
760*e1eccf28SAndroid Build Coastguard Worker     }
761*e1eccf28SAndroid Build Coastguard Worker #endif
762*e1eccf28SAndroid Build Coastguard Worker 
763*e1eccf28SAndroid Build Coastguard Worker     ResizeTask task((const uchar*)input, (uchar*)output, inputSizeX, inputSizeY, vectorSize,
764*e1eccf28SAndroid Build Coastguard Worker                     outputSizeX, outputSizeY, restriction);
765*e1eccf28SAndroid Build Coastguard Worker     processor->doTask(&task);
766*e1eccf28SAndroid Build Coastguard Worker }
767*e1eccf28SAndroid Build Coastguard Worker 
768*e1eccf28SAndroid Build Coastguard Worker }  // namespace renderscript
769*e1eccf28SAndroid Build Coastguard Worker }  // namespace android
770