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