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