rsCpuIntrinsicBlur.cpp revision 709a0978ae141198018ca9769f8d96292a8928e6
1d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams/* 2d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Copyright (C) 2012 The Android Open Source Project 3d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * 4d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * you may not use this file except in compliance with the License. 6d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * You may obtain a copy of the License at 7d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * 8d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * 10d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Unless required by applicable law or agreed to in writing, software 11d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * See the License for the specific language governing permissions and 14d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * limitations under the License. 15d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams */ 16d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsic.h" 18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsicInlines.h" 19d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 20d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsusing namespace android; 21d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsusing namespace android::renderscript; 22d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 23709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android { 24709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript { 25709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 26709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 27709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicBlur : public RsdCpuScriptIntrinsic { 28709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic: 29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void populateScript(Script *); 30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void invokeFreeChildren(); 31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength); 33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void setGlobalObj(uint32_t slot, ObjectBase *data); 34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual ~RsdCpuScriptIntrinsicBlur(); 36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptIntrinsicBlur(RsdCpuReferenceImpl *ctx, const Script *s); 37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 38709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 39d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float fp[104]; 40d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams short ip[104]; 41d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float radius; 42d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams int iradius; 43d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams ObjectBaseRef<Allocation> alloc; 44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams static void kernel(const RsForEachStubParamStruct *p, 46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xstart, uint32_t xend, 47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t instep, uint32_t outstep); 48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void ComputeGaussianWeights(); 49d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams}; 50d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 55709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlur::ComputeGaussianWeights() { 56d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // Compute gaussian weights for the blur 57d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // e is the euler's number 58d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float e = 2.718281828459045f; 59d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float pi = 3.1415926535897932f; 60d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 ) 61d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // x is of the form [-radius .. 0 .. radius] 62d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // and sigma varies with radius. 63d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // Based on some experimental radius values and sigma's 64d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // we approximately fit sigma = f(radius) as 65d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // sigma = radius * 0.4 + 0.6 66d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // The larger the radius gets, the more our gaussian blur 67d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // will resemble a box blur since with large sigma 68d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // the gaussian curve begins to lose its shape 69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams float sigma = 0.4f * radius + 0.6f; 70d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 71d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // Now compute the coefficients. We will store some redundant values to save 72d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams // some math during the blur calculations precompute some values 73d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float coeff1 = 1.0f / (sqrtf(2.0f * pi) * sigma); 74d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float coeff2 = - 1.0f / (2.0f * sigma * sigma); 75d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 76d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float normalizeFactor = 0.0f; 77d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float floatR = 0.0f; 78d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams int r; 79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams iradius = (float)ceil(radius) + 0.5f; 80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (r = -iradius; r <= iradius; r ++) { 81d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams floatR = (float)r; 82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams fp[r + iradius] = coeff1 * powf(e, floatR * floatR * coeff2); 83709a0978ae141198018ca9769f8d96292a8928e6Jason Sams normalizeFactor += fp[r + iradius]; 84d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 85d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 86d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams //Now we need to normalize the weights because all our coefficients need to add up to one 87d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams normalizeFactor = 1.0f / normalizeFactor; 88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (r = -iradius; r <= iradius; r ++) { 89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams fp[r + iradius] *= normalizeFactor; 90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ip[r + iradius] = (short)(ip[r + iradius] * 32768); 91d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 92d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 93d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 94709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlur::setGlobalObj(uint32_t slot, ObjectBase *data) { 95d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams rsAssert(slot == 1); 96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams alloc.set(static_cast<Allocation *>(data)); 97d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 98d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 99709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlur::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) { 100d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams rsAssert(slot == 0); 101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams radius = ((const float *)data)[0]; 102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ComputeGaussianWeights(); 103d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 104d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 105d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 106d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 107d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic void OneV(const RsForEachStubParamStruct *p, float4 *out, int32_t x, int32_t y, 108d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar *ptrIn, int iStride, const float* gPtr, int iradius) { 109d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 110d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar *pi = ptrIn + x*4; 111d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 112d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float4 blurredPixel = 0; 113d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams for (int r = -iradius; r <= iradius; r ++) { 114d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams int validY = rsMax((y + r), 0); 115d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams validY = rsMin(validY, (int)(p->dimY - 1)); 116d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar4 *pvy = (const uchar4 *)&pi[validY * iStride]; 117d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float4 pf = convert_float4(pvy[0]); 118d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams blurredPixel += pf * gPtr[0]; 119d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams gPtr++; 120d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 121d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 122d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams out->xyzw = blurredPixel; 123d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 124d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 125e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Samsextern "C" void rsdIntrinsicBlurVF_K(void *dst, const void *pin, int stride, const void *gptr, int rct, int x1, int x2); 126e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Samsextern "C" void rsdIntrinsicBlurHF_K(void *dst, const void *pin, const void *gptr, int rct, int x1, int x2); 127e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams 128e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Samsstatic void OneVF(float4 *out, 129e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams const uchar *ptrIn, int iStride, const float* gPtr, int ct, 130e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams int x1, int x2) { 131e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams 132e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams#if defined(ARCH_ARM_HAVE_NEON) 1332207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams { 1342207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams int t = (x2 - x1); 1352207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams t &= ~1; 1362207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams if(t) { 1372207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams rsdIntrinsicBlurVF_K(out, ptrIn, iStride, gPtr, ct, x1, x1 + t); 1382207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams } 1392207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams x1 += t; 1402207ab7e0f2d28382fe61ff002ddd58c4fa3fb99Jason Sams } 141e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams#endif 142e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams 143e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams while(x2 > x1) { 1442e5ef66f7d88e2f85bbc4f97edf1ed0b6edbaac7Tim Murray const uchar *pi = ptrIn; 145e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams float4 blurredPixel = 0; 146e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams const float* gp = gPtr; 147e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams 148e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams for (int r = 0; r < ct; r++) { 149e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams float4 pf = convert_float4(((const uchar4 *)pi)[0]); 150e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams blurredPixel += pf * gp[0]; 151e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams pi += iStride; 152e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams gp++; 153e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams } 154e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams out->xyzw = blurredPixel; 155e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams x1++; 156e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams out++; 157e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams } 158e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams} 159e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams 160d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic void OneH(const RsForEachStubParamStruct *p, uchar4 *out, int32_t x, 161d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const float4 *ptrIn, const float* gPtr, int iradius) { 162d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 163d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float4 blurredPixel = 0; 164d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams for (int r = -iradius; r <= iradius; r ++) { 165d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams int validX = rsMax((x + r), 0); 166d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams validX = rsMin(validX, (int)(p->dimX - 1)); 167d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float4 pf = ptrIn[validX]; 168d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams blurredPixel += pf * gPtr[0]; 169d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams gPtr++; 170d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 171d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 172d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams out->xyzw = convert_uchar4(blurredPixel); 173d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 174d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 175d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 176709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlur::kernel(const RsForEachStubParamStruct *p, 177709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xstart, uint32_t xend, 178709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t instep, uint32_t outstep) { 179d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float buf[4 * 2048]; 180709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptIntrinsicBlur *cp = (RsdCpuScriptIntrinsicBlur *)p->usr; 181b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams if (!cp->alloc.get()) { 182b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams ALOGE("Blur executed without input, skipping"); 183b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams return; 184b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams } 185709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const uchar *pin = (const uchar *)cp->alloc->mHal.drvState.lod[0].mallocPtr; 186709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const size_t stride = cp->alloc->mHal.drvState.lod[0].stride; 187d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 188d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uchar4 *out = (uchar4 *)p->out; 189d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uint32_t x1 = xstart; 190d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uint32_t x2 = xend; 191d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 192d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams float4 *fout = (float4 *)buf; 193e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams int y = p->y; 194e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams if ((y > cp->iradius) && (y < ((int)p->dimY - cp->iradius))) { 195709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const uchar *pi = pin + (y - cp->iradius) * stride; 196709a0978ae141198018ca9769f8d96292a8928e6Jason Sams OneVF(fout, pi, stride, cp->fp, cp->iradius * 2 + 1, x1, x2); 197e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams } else { 198e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams while(x2 > x1) { 199709a0978ae141198018ca9769f8d96292a8928e6Jason Sams OneV(p, fout, x1, y, pin, stride, cp->fp, cp->iradius); 200e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams fout++; 201e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams x1++; 202e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams } 203d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 204d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 205d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams x1 = xstart; 206e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams while ((x1 < (uint32_t)cp->iradius) && (x1 < x2)) { 207e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams OneH(p, out, x1, (float4 *)buf, cp->fp, cp->iradius); 208e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams out++; 209e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams x1++; 210e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams } 211e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams#if defined(ARCH_ARM_HAVE_NEON) 212e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams if ((x1 + cp->iradius) < x2) { 213e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams rsdIntrinsicBlurHF_K(out, ((float4 *)buf) - cp->iradius, cp->fp, cp->iradius * 2 + 1, x1, x2 - cp->iradius); 214e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams out += (x2 - cp->iradius) - x1; 215e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams x1 = x2 - cp->iradius; 216e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams } 217e78e514f3f209e594767e8ebc64f5df4be5b0b41Jason Sams#endif 218d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams while(x2 > x1) { 219d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams OneH(p, out, x1, (float4 *)buf, cp->fp, cp->iradius); 220d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams out++; 221d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams x1++; 222d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 223d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 224d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 225d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 226709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicBlur::RsdCpuScriptIntrinsicBlur(RsdCpuReferenceImpl *ctx, const Script *s) 227709a0978ae141198018ca9769f8d96292a8928e6Jason Sams : RsdCpuScriptIntrinsic(ctx, s, RS_SCRIPT_INTRINSIC_ID_BLUR) { 228709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 229709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootPtr = &kernel; 230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams radius = 5; 231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ComputeGaussianWeights(); 232709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 233709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 234709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicBlur::~RsdCpuScriptIntrinsicBlur() { 235709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 237709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlur::populateScript(Script *s) { 238709a0978ae141198018ca9769f8d96292a8928e6Jason Sams s->mHal.info.exportedVariableCount = 2; 239709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 240709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 241709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlur::invokeFreeChildren() { 242709a0978ae141198018ca9769f8d96292a8928e6Jason Sams alloc.clear(); 243709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 244709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 245d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 246709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl * rsdIntrinsic_Blur(RsdCpuReferenceImpl *ctx, const Script *s) { 247d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 248709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return new RsdCpuScriptIntrinsicBlur(ctx, s); 249d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 250d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 251d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 252