rsCpuIntrinsicResize.cpp revision 80ef693674f69c0343c41564e30f80e7fb513b60
139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams/*
239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * Copyright (C) 2014 The Android Open Source Project
339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams *
439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * you may not use this file except in compliance with the License.
639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * You may obtain a copy of the License at
739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams *
839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams *
1039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * Unless required by applicable law or agreed to in writing, software
1139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * See the License for the specific language governing permissions and
1439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams * limitations under the License.
1539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams */
1639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
1739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
1839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams#include "rsCpuIntrinsic.h"
1939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams#include "rsCpuIntrinsicInlines.h"
2039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
2139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsusing namespace android;
2239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsusing namespace android::renderscript;
2339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
2439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsnamespace android {
2539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsnamespace renderscript {
2639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
2739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
2839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsclass RsdCpuScriptIntrinsicResize : public RsdCpuScriptIntrinsic {
2939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samspublic:
3039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    virtual void populateScript(Script *);
3139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    virtual void invokeFreeChildren();
3239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
3339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    virtual void setGlobalObj(uint32_t slot, ObjectBase *data);
3439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
3539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    virtual ~RsdCpuScriptIntrinsicResize();
3639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    RsdCpuScriptIntrinsicResize(RsdCpuReferenceImpl *ctx, const Script *s, const Element *);
3739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
3839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    virtual void preLaunch(uint32_t slot, const Allocation * ain,
3939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                           Allocation * aout, const void * usr,
4039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                           uint32_t usrLen, const RsScriptCall *sc);
4139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
4239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float scaleX;
4339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float scaleY;
4439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
4539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsprotected:
4639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    ObjectBaseRef<const Allocation> mAlloc;
4739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    ObjectBaseRef<const Element> mElement;
4839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
4980ef693674f69c0343c41564e30f80e7fb513b60Chris Wailes    static void kernelU1(const RsExpandKernelParams *p,
5039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         uint32_t xstart, uint32_t xend,
5139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         uint32_t instep, uint32_t outstep);
5280ef693674f69c0343c41564e30f80e7fb513b60Chris Wailes    static void kernelU2(const RsExpandKernelParams *p,
5339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         uint32_t xstart, uint32_t xend,
5439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         uint32_t instep, uint32_t outstep);
5580ef693674f69c0343c41564e30f80e7fb513b60Chris Wailes    static void kernelU4(const RsExpandKernelParams *p,
5639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         uint32_t xstart, uint32_t xend,
5739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         uint32_t instep, uint32_t outstep);
5839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams};
5939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
6039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
6139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
6239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
6339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
6439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsvoid RsdCpuScriptIntrinsicResize::setGlobalObj(uint32_t slot, ObjectBase *data) {
6539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    rsAssert(slot == 0);
6639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    mAlloc.set(static_cast<Allocation *>(data));
6739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
6839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
6939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
7039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsextern "C" void rsdIntrinsicConvolve3x3_K(void *dst, const void *y0, const void *y1,
7139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                          const void *y2, const short *coef, uint32_t count);
7239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
7339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsstatic float4 cubicInterpolate(float4 p0,float4 p1,float4 p2,float4 p3, float x) {
7439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 + 4.f * p2 - p3
7539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams            + x * (3.f * (p1 - p2) + p3 - p0)));
7639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
7739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
7839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsstatic float2 cubicInterpolate(float2 p0,float2 p1,float2 p2,float2 p3, float x) {
7939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 + 4.f * p2 - p3
8039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams            + x * (3.f * (p1 - p2) + p3 - p0)));
8139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
8239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
8339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsstatic float cubicInterpolate(float p0,float p1,float p2,float p3 , float x) {
8439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return p1 + 0.5f * x * (p2 - p0 + x * (2.f * p0 - 5.f * p1 + 4.f * p2 - p3
8539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams            + x * (3.f * (p1 - p2) + p3 - p0)));
8639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
8739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
8839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsstatic uchar4 OneBiCubic(const uchar4 *yp0, const uchar4 *yp1, const uchar4 *yp2, const uchar4 *yp3,
8939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         float xf, float yf, int width) {
9039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int startx = (int) floor(xf - 2);
9139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    xf = xf - floor(xf);
9239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int maxx = width - 1;
9339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs0 = rsMax(0, startx + 0);
9439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs1 = rsMax(0, startx + 1);
9539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs2 = rsMin(maxx, startx + 2);
9639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs3 = rsMin(maxx, startx + 3);
9739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
9839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float4 p0  = cubicInterpolate(convert_float4(yp0[xs0]),
9939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp0[xs1]),
10039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp0[xs2]),
10139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp0[xs3]), xf);
10239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
10339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float4 p1  = cubicInterpolate(convert_float4(yp1[xs0]),
10439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp1[xs1]),
10539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp1[xs2]),
10639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp1[xs3]), xf);
10739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
10839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float4 p2  = cubicInterpolate(convert_float4(yp2[xs0]),
10939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp2[xs1]),
11039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp2[xs2]),
11139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp2[xs3]), xf);
11239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
11339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float4 p3  = cubicInterpolate(convert_float4(yp3[xs0]),
11439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp3[xs1]),
11539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp3[xs2]),
11639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float4(yp3[xs3]), xf);
11739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
11839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float4 p  = cubicInterpolate(p0, p1, p2, p3, yf);
11939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    p = clamp(p, 0.f, 255.f);
12039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return convert_uchar4(p);
12139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
12239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
12339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsstatic uchar2 OneBiCubic(const uchar2 *yp0, const uchar2 *yp1, const uchar2 *yp2, const uchar2 *yp3,
12439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                         float xf, float yf, int width) {
12539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int startx = (int) floor(xf - 2);
12639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    xf = xf - floor(xf);
12739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int maxx = width - 1;
12839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs0 = rsMax(0, startx + 0);
12939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs1 = rsMax(0, startx + 1);
13039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs2 = rsMin(maxx, startx + 2);
13139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs3 = rsMin(maxx, startx + 3);
13239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
13339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float2 p0  = cubicInterpolate(convert_float2(yp0[xs0]),
13439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp0[xs1]),
13539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp0[xs2]),
13639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp0[xs3]), xf);
13739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
13839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float2 p1  = cubicInterpolate(convert_float2(yp1[xs0]),
13939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp1[xs1]),
14039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp1[xs2]),
14139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp1[xs3]), xf);
14239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
14339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float2 p2  = cubicInterpolate(convert_float2(yp2[xs0]),
14439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp2[xs1]),
14539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp2[xs2]),
14639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp2[xs3]), xf);
14739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
14839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float2 p3  = cubicInterpolate(convert_float2(yp3[xs0]),
14939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp3[xs1]),
15039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp3[xs2]),
15139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                  convert_float2(yp3[xs3]), xf);
15239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
15339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float2 p  = cubicInterpolate(p0, p1, p2, p3, yf);
15439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    p = clamp(p, 0.f, 255.f);
15539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return convert_uchar2(p);
15639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
15739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
15839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsstatic uchar OneBiCubic(const uchar *yp0, const uchar *yp1, const uchar *yp2, const uchar *yp3,
15939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                        float xf, float yf, int width) {
16039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int startx = (int) floor(xf - 2);
16139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    xf = xf - floor(xf);
16239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int maxx = width - 1;
16339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs0 = rsMax(0, startx + 0);
16439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs1 = rsMax(0, startx + 1);
16539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs2 = rsMin(maxx, startx + 2);
16639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int xs3 = rsMin(maxx, startx + 3);
16739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
16839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float p0  = cubicInterpolate((float)yp0[xs0], (float)yp0[xs1],
16939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                 (float)yp0[xs2], (float)yp0[xs3], xf);
17039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float p1  = cubicInterpolate((float)yp1[xs0], (float)yp1[xs1],
17139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                 (float)yp1[xs2], (float)yp1[xs3], xf);
17239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float p2  = cubicInterpolate((float)yp2[xs0], (float)yp2[xs1],
17339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                 (float)yp2[xs2], (float)yp2[xs3], xf);
17439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float p3  = cubicInterpolate((float)yp3[xs0], (float)yp3[xs1],
17539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                 (float)yp3[xs2], (float)yp3[xs3], xf);
17639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
17739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float p  = cubicInterpolate(p0, p1, p2, p3, yf);
17839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    p = clamp(p, 0.f, 255.f);
17939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return (uchar)p;
18039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
18139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
18280ef693674f69c0343c41564e30f80e7fb513b60Chris Wailesvoid RsdCpuScriptIntrinsicResize::kernelU4(const RsExpandKernelParams *p,
18339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                                uint32_t xstart, uint32_t xend,
18439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                                uint32_t instep, uint32_t outstep) {
18539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    RsdCpuScriptIntrinsicResize *cp = (RsdCpuScriptIntrinsicResize *)p->usr;
18639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
18739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    if (!cp->mAlloc.get()) {
18839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        ALOGE("Resize executed without input, skipping");
18939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        return;
19039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
19139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *pin = (const uchar *)cp->mAlloc->mHal.drvState.lod[0].mallocPtr;
19239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const int srcHeight = cp->mAlloc->mHal.drvState.lod[0].dimY;
19339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const int srcWidth = cp->mAlloc->mHal.drvState.lod[0].dimX;
19439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const size_t stride = cp->mAlloc->mHal.drvState.lod[0].stride;
19539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
19639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float yf = p->y * cp->scaleY;
19739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int starty = (int) floor(yf - 2);
19839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    yf = yf - floor(yf);
19939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int maxy = srcHeight - 1;
20039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys0 = rsMax(0, starty + 0);
20139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys1 = rsMax(0, starty + 1);
20239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys2 = rsMin(maxy, starty + 2);
20339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys3 = rsMin(maxy, starty + 3);
20439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
20539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar4 *yp0 = (const uchar4 *)(pin + stride * ys0);
20639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar4 *yp1 = (const uchar4 *)(pin + stride * ys1);
20739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar4 *yp2 = (const uchar4 *)(pin + stride * ys2);
20839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar4 *yp3 = (const uchar4 *)(pin + stride * ys3);
20939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
21039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uchar4 *out = ((uchar4 *)p->out) + xstart;
21139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uint32_t x1 = xstart;
21239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uint32_t x2 = xend;
21339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
21439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    while(x1 < x2) {
21539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        float xf = x1 * cp->scaleX;
21639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
21739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        out++;
21839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        x1++;
21939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
22039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
22139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
22280ef693674f69c0343c41564e30f80e7fb513b60Chris Wailesvoid RsdCpuScriptIntrinsicResize::kernelU2(const RsExpandKernelParams *p,
22339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                                uint32_t xstart, uint32_t xend,
22439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                                uint32_t instep, uint32_t outstep) {
22539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    RsdCpuScriptIntrinsicResize *cp = (RsdCpuScriptIntrinsicResize *)p->usr;
22639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
22739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    if (!cp->mAlloc.get()) {
22839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        ALOGE("Resize executed without input, skipping");
22939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        return;
23039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
23139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *pin = (const uchar *)cp->mAlloc->mHal.drvState.lod[0].mallocPtr;
23239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const int srcHeight = cp->mAlloc->mHal.drvState.lod[0].dimY;
23339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const int srcWidth = cp->mAlloc->mHal.drvState.lod[0].dimX;
23439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const size_t stride = cp->mAlloc->mHal.drvState.lod[0].stride;
23539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
23639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float yf = p->y * cp->scaleY;
23739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int starty = (int) floor(yf - 2);
23839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    yf = yf - floor(yf);
23939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int maxy = srcHeight - 1;
24039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys0 = rsMax(0, starty + 0);
24139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys1 = rsMax(0, starty + 1);
24239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys2 = rsMin(maxy, starty + 2);
24339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys3 = rsMin(maxy, starty + 3);
24439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
24539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar2 *yp0 = (const uchar2 *)(pin + stride * ys0);
24639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar2 *yp1 = (const uchar2 *)(pin + stride * ys1);
24739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar2 *yp2 = (const uchar2 *)(pin + stride * ys2);
24839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar2 *yp3 = (const uchar2 *)(pin + stride * ys3);
24939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
25039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uchar2 *out = ((uchar2 *)p->out) + xstart;
25139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uint32_t x1 = xstart;
25239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uint32_t x2 = xend;
25339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
25439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    while(x1 < x2) {
25539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        float xf = x1 * cp->scaleX;
25639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
25739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        out++;
25839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        x1++;
25939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
26039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
26139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
26280ef693674f69c0343c41564e30f80e7fb513b60Chris Wailesvoid RsdCpuScriptIntrinsicResize::kernelU1(const RsExpandKernelParams *p,
26339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                                uint32_t xstart, uint32_t xend,
26439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                                uint32_t instep, uint32_t outstep) {
26539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    RsdCpuScriptIntrinsicResize *cp = (RsdCpuScriptIntrinsicResize *)p->usr;
26639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
26739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    if (!cp->mAlloc.get()) {
26839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        ALOGE("Resize executed without input, skipping");
26939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        return;
27039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
27139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *pin = (const uchar *)cp->mAlloc->mHal.drvState.lod[0].mallocPtr;
27239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const int srcHeight = cp->mAlloc->mHal.drvState.lod[0].dimY;
27339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const int srcWidth = cp->mAlloc->mHal.drvState.lod[0].dimX;
27439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const size_t stride = cp->mAlloc->mHal.drvState.lod[0].stride;
27539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
27639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    float yf = p->y * cp->scaleY;
27739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int starty = (int) floor(yf - 2);
27839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    yf = yf - floor(yf);
27939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int maxy = srcHeight - 1;
28039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys0 = rsMax(0, starty + 0);
28139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys1 = rsMax(0, starty + 1);
28239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys2 = rsMin(maxy, starty + 2);
28339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    int ys3 = rsMin(maxy, starty + 3);
28439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
28539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *yp0 = pin + stride * ys0;
28639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *yp1 = pin + stride * ys1;
28739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *yp2 = pin + stride * ys2;
28839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uchar *yp3 = pin + stride * ys3;
28939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
29039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uchar *out = ((uchar *)p->out) + xstart;
29139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uint32_t x1 = xstart;
29239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    uint32_t x2 = xend;
29339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
29439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    while(x1 < x2) {
29539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        float xf = x1 * cp->scaleX;
29639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        *out = OneBiCubic(yp0, yp1, yp2, yp3, xf, yf, srcWidth);
29739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        out++;
29839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        x1++;
29939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
30039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
30139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
30239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason SamsRsdCpuScriptIntrinsicResize::RsdCpuScriptIntrinsicResize (
30339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams            RsdCpuReferenceImpl *ctx, const Script *s, const Element *e)
30439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_RESIZE) {
30539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
30639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
30739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
30839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason SamsRsdCpuScriptIntrinsicResize::~RsdCpuScriptIntrinsicResize() {
30939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
31039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
31139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsvoid RsdCpuScriptIntrinsicResize::preLaunch(uint32_t slot, const Allocation * ain,
31239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                            Allocation * aout, const void * usr,
31339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams                                            uint32_t usrLen, const RsScriptCall *sc)
31439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams{
31539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    if (!mAlloc.get()) {
31639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        ALOGE("Resize executed without input, skipping");
31739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        return;
31839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
31939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uint32_t srcHeight = mAlloc->mHal.drvState.lod[0].dimY;
32039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const uint32_t srcWidth = mAlloc->mHal.drvState.lod[0].dimX;
32139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    const size_t stride = mAlloc->mHal.drvState.lod[0].stride;
32239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
32339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    switch(mAlloc->getType()->getElement()->getVectorSize()) {
32439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    case 1:
32539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        mRootPtr = &kernelU1;
32639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        break;
32739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    case 2:
32839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        mRootPtr = &kernelU2;
32939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        break;
33039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    case 3:
33139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    case 4:
33239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        mRootPtr = &kernelU4;
33339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams        break;
33439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    }
33539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
33639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    scaleX = (float)srcWidth / aout->mHal.drvState.lod[0].dimX;
33739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    scaleY = (float)srcHeight / aout->mHal.drvState.lod[0].dimY;
33839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
33939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
34039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
34139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsvoid RsdCpuScriptIntrinsicResize::populateScript(Script *s) {
34239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    s->mHal.info.exportedVariableCount = 1;
34339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
34439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
34539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Samsvoid RsdCpuScriptIntrinsicResize::invokeFreeChildren() {
34639ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    mAlloc.clear();
34739ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
34839ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
34939ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
35039ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason SamsRsdCpuScriptImpl * rsdIntrinsic_Resize(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e) {
35139ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
35239ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams    return new RsdCpuScriptIntrinsicResize(ctx, s, e);
35339ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams}
35439ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
35539ab94aafb7f0916a7f6e345ee1fa0f5ff3bbacdJason Sams
356