xref: /aosp_15_r20/frameworks/rs/cpu_ref/rsCpuIntrinsicBlend.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker 
18*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuIntrinsic.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuIntrinsicInlines.h"
20*e1eccf28SAndroid Build Coastguard Worker 
21*e1eccf28SAndroid Build Coastguard Worker namespace android {
22*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
23*e1eccf28SAndroid Build Coastguard Worker 
24*e1eccf28SAndroid Build Coastguard Worker 
25*e1eccf28SAndroid Build Coastguard Worker class RsdCpuScriptIntrinsicBlend : public RsdCpuScriptIntrinsic {
26*e1eccf28SAndroid Build Coastguard Worker public:
27*e1eccf28SAndroid Build Coastguard Worker     void populateScript(Script *) override;
28*e1eccf28SAndroid Build Coastguard Worker 
29*e1eccf28SAndroid Build Coastguard Worker     ~RsdCpuScriptIntrinsicBlend() override;
30*e1eccf28SAndroid Build Coastguard Worker     RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
31*e1eccf28SAndroid Build Coastguard Worker 
32*e1eccf28SAndroid Build Coastguard Worker protected:
33*e1eccf28SAndroid Build Coastguard Worker     static void kernel(const RsExpandKernelDriverInfo *info, uint32_t xstart,
34*e1eccf28SAndroid Build Coastguard Worker                        uint32_t xend, uint32_t outstep);
35*e1eccf28SAndroid Build Coastguard Worker };
36*e1eccf28SAndroid Build Coastguard Worker 
37*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
38*e1eccf28SAndroid Build Coastguard Worker } // namespace android
39*e1eccf28SAndroid Build Coastguard Worker 
40*e1eccf28SAndroid Build Coastguard Worker 
41*e1eccf28SAndroid Build Coastguard Worker enum {
42*e1eccf28SAndroid Build Coastguard Worker     BLEND_CLEAR = 0,
43*e1eccf28SAndroid Build Coastguard Worker     BLEND_SRC = 1,
44*e1eccf28SAndroid Build Coastguard Worker     BLEND_DST = 2,
45*e1eccf28SAndroid Build Coastguard Worker     BLEND_SRC_OVER = 3,
46*e1eccf28SAndroid Build Coastguard Worker     BLEND_DST_OVER = 4,
47*e1eccf28SAndroid Build Coastguard Worker     BLEND_SRC_IN = 5,
48*e1eccf28SAndroid Build Coastguard Worker     BLEND_DST_IN = 6,
49*e1eccf28SAndroid Build Coastguard Worker     BLEND_SRC_OUT = 7,
50*e1eccf28SAndroid Build Coastguard Worker     BLEND_DST_OUT = 8,
51*e1eccf28SAndroid Build Coastguard Worker     BLEND_SRC_ATOP = 9,
52*e1eccf28SAndroid Build Coastguard Worker     BLEND_DST_ATOP = 10,
53*e1eccf28SAndroid Build Coastguard Worker     BLEND_XOR = 11,
54*e1eccf28SAndroid Build Coastguard Worker 
55*e1eccf28SAndroid Build Coastguard Worker     BLEND_NORMAL = 12,
56*e1eccf28SAndroid Build Coastguard Worker     BLEND_AVERAGE = 13,
57*e1eccf28SAndroid Build Coastguard Worker     BLEND_MULTIPLY = 14,
58*e1eccf28SAndroid Build Coastguard Worker     BLEND_SCREEN = 15,
59*e1eccf28SAndroid Build Coastguard Worker     BLEND_DARKEN = 16,
60*e1eccf28SAndroid Build Coastguard Worker     BLEND_LIGHTEN = 17,
61*e1eccf28SAndroid Build Coastguard Worker     BLEND_OVERLAY = 18,
62*e1eccf28SAndroid Build Coastguard Worker     BLEND_HARDLIGHT = 19,
63*e1eccf28SAndroid Build Coastguard Worker     BLEND_SOFTLIGHT = 20,
64*e1eccf28SAndroid Build Coastguard Worker     BLEND_DIFFERENCE = 21,
65*e1eccf28SAndroid Build Coastguard Worker     BLEND_NEGATION = 22,
66*e1eccf28SAndroid Build Coastguard Worker     BLEND_EXCLUSION = 23,
67*e1eccf28SAndroid Build Coastguard Worker     BLEND_COLOR_DODGE = 24,
68*e1eccf28SAndroid Build Coastguard Worker     BLEND_INVERSE_COLOR_DODGE = 25,
69*e1eccf28SAndroid Build Coastguard Worker     BLEND_SOFT_DODGE = 26,
70*e1eccf28SAndroid Build Coastguard Worker     BLEND_COLOR_BURN = 27,
71*e1eccf28SAndroid Build Coastguard Worker     BLEND_INVERSE_COLOR_BURN = 28,
72*e1eccf28SAndroid Build Coastguard Worker     BLEND_SOFT_BURN = 29,
73*e1eccf28SAndroid Build Coastguard Worker     BLEND_REFLECT = 30,
74*e1eccf28SAndroid Build Coastguard Worker     BLEND_GLOW = 31,
75*e1eccf28SAndroid Build Coastguard Worker     BLEND_FREEZE = 32,
76*e1eccf28SAndroid Build Coastguard Worker     BLEND_HEAT = 33,
77*e1eccf28SAndroid Build Coastguard Worker     BLEND_ADD = 34,
78*e1eccf28SAndroid Build Coastguard Worker     BLEND_SUBTRACT = 35,
79*e1eccf28SAndroid Build Coastguard Worker     BLEND_STAMP = 36,
80*e1eccf28SAndroid Build Coastguard Worker     BLEND_RED = 37,
81*e1eccf28SAndroid Build Coastguard Worker     BLEND_GREEN = 38,
82*e1eccf28SAndroid Build Coastguard Worker     BLEND_BLUE = 39,
83*e1eccf28SAndroid Build Coastguard Worker     BLEND_HUE = 40,
84*e1eccf28SAndroid Build Coastguard Worker     BLEND_SATURATION = 41,
85*e1eccf28SAndroid Build Coastguard Worker     BLEND_COLOR = 42,
86*e1eccf28SAndroid Build Coastguard Worker     BLEND_LUMINOSITY = 43
87*e1eccf28SAndroid Build Coastguard Worker };
88*e1eccf28SAndroid Build Coastguard Worker 
89*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
90*e1eccf28SAndroid Build Coastguard Worker extern "C" int rsdIntrinsicBlend_K(uchar4 *out, uchar4 const *in, int slot,
91*e1eccf28SAndroid Build Coastguard Worker                     uint32_t xstart, uint32_t xend);
92*e1eccf28SAndroid Build Coastguard Worker #endif
93*e1eccf28SAndroid Build Coastguard Worker 
94*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_X86_HAVE_SSSE3)
95*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendSrcOver_K(void *dst, const void *src, uint32_t count8);
96*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendDstOver_K(void *dst, const void *src, uint32_t count8);
97*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendSrcIn_K(void *dst, const void *src, uint32_t count8);
98*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendDstIn_K(void *dst, const void *src, uint32_t count8);
99*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendSrcOut_K(void *dst, const void *src, uint32_t count8);
100*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendDstOut_K(void *dst, const void *src, uint32_t count8);
101*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendSrcAtop_K(void *dst, const void *src, uint32_t count8);
102*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendDstAtop_K(void *dst, const void *src, uint32_t count8);
103*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendXor_K(void *dst, const void *src, uint32_t count8);
104*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendMultiply_K(void *dst, const void *src, uint32_t count8);
105*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendAdd_K(void *dst, const void *src, uint32_t count8);
106*e1eccf28SAndroid Build Coastguard Worker extern void rsdIntrinsicBlendSub_K(void *dst, const void *src, uint32_t count8);
107*e1eccf28SAndroid Build Coastguard Worker #endif
108*e1eccf28SAndroid Build Coastguard Worker 
109*e1eccf28SAndroid Build Coastguard Worker namespace android {
110*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
111*e1eccf28SAndroid Build Coastguard Worker 
112*e1eccf28SAndroid Build Coastguard Worker // Convert vector to uchar4, clipping each value to 255.
113*e1eccf28SAndroid Build Coastguard Worker template <typename TI>
convertClipped(TI amount)114*e1eccf28SAndroid Build Coastguard Worker static inline uchar4 convertClipped(TI amount) {
115*e1eccf28SAndroid Build Coastguard Worker     return uchar4 { static_cast<uchar>(amount.x > 255 ? 255 : amount.x),
116*e1eccf28SAndroid Build Coastguard Worker                     static_cast<uchar>(amount.y > 255 ? 255 : amount.y),
117*e1eccf28SAndroid Build Coastguard Worker                     static_cast<uchar>(amount.z > 255 ? 255 : amount.z),
118*e1eccf28SAndroid Build Coastguard Worker                     static_cast<uchar>(amount.w > 255 ? 255 : amount.w)};
119*e1eccf28SAndroid Build Coastguard Worker }
120*e1eccf28SAndroid Build Coastguard Worker 
kernel(const RsExpandKernelDriverInfo * info,uint32_t xstart,uint32_t xend,uint32_t outstep)121*e1eccf28SAndroid Build Coastguard Worker void RsdCpuScriptIntrinsicBlend::kernel(const RsExpandKernelDriverInfo *info,
122*e1eccf28SAndroid Build Coastguard Worker                                         uint32_t xstart, uint32_t xend,
123*e1eccf28SAndroid Build Coastguard Worker                                         uint32_t outstep) {
124*e1eccf28SAndroid Build Coastguard Worker     // instep/outstep can be ignored--sizeof(uchar4) known at compile time
125*e1eccf28SAndroid Build Coastguard Worker     uchar4 *out = (uchar4 *)info->outPtr[0];
126*e1eccf28SAndroid Build Coastguard Worker     uchar4 *in = (uchar4 *)info->inPtr[0];
127*e1eccf28SAndroid Build Coastguard Worker     uint32_t x1 = xstart;
128*e1eccf28SAndroid Build Coastguard Worker     uint32_t x2 = xend;
129*e1eccf28SAndroid Build Coastguard Worker 
130*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
131*e1eccf28SAndroid Build Coastguard Worker     if (gArchUseSIMD) {
132*e1eccf28SAndroid Build Coastguard Worker         if (rsdIntrinsicBlend_K(out, in, info->slot, 0, x2 - x1) >= 0) {
133*e1eccf28SAndroid Build Coastguard Worker             return;
134*e1eccf28SAndroid Build Coastguard Worker         } else {
135*e1eccf28SAndroid Build Coastguard Worker             ALOGW("Intrinsic Blend failed to use SIMD for %d", info->slot);
136*e1eccf28SAndroid Build Coastguard Worker         }
137*e1eccf28SAndroid Build Coastguard Worker     }
138*e1eccf28SAndroid Build Coastguard Worker #endif
139*e1eccf28SAndroid Build Coastguard Worker     switch (info->slot) {
140*e1eccf28SAndroid Build Coastguard Worker     case BLEND_CLEAR:
141*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++) {
142*e1eccf28SAndroid Build Coastguard Worker             *out = 0;
143*e1eccf28SAndroid Build Coastguard Worker         }
144*e1eccf28SAndroid Build Coastguard Worker         break;
145*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SRC:
146*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
147*e1eccf28SAndroid Build Coastguard Worker           *out = *in;
148*e1eccf28SAndroid Build Coastguard Worker         }
149*e1eccf28SAndroid Build Coastguard Worker         break;
150*e1eccf28SAndroid Build Coastguard Worker     //BLEND_DST is a NOP
151*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DST:
152*e1eccf28SAndroid Build Coastguard Worker         break;
153*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SRC_OVER:
154*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
155*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
156*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
157*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
158*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendSrcOver_K(out, in, len);
159*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
160*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
161*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
162*e1eccf28SAndroid Build Coastguard Worker             }
163*e1eccf28SAndroid Build Coastguard Worker         }
164*e1eccf28SAndroid Build Coastguard Worker     #endif
165*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
166*e1eccf28SAndroid Build Coastguard Worker             ushort4 in_s = convert_ushort4(*in);
167*e1eccf28SAndroid Build Coastguard Worker             ushort4 out_s = convert_ushort4(*out);
168*e1eccf28SAndroid Build Coastguard Worker             in_s = in_s + ((out_s * (ushort4)(255 - in_s.w)) >> (ushort4)8);
169*e1eccf28SAndroid Build Coastguard Worker             *out = convertClipped(in_s);
170*e1eccf28SAndroid Build Coastguard Worker         }
171*e1eccf28SAndroid Build Coastguard Worker         break;
172*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DST_OVER:
173*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
174*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
175*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
176*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
177*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendDstOver_K(out, in, len);
178*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
179*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
180*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
181*e1eccf28SAndroid Build Coastguard Worker             }
182*e1eccf28SAndroid Build Coastguard Worker         }
183*e1eccf28SAndroid Build Coastguard Worker      #endif
184*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
185*e1eccf28SAndroid Build Coastguard Worker             ushort4 in_s = convert_ushort4(*in);
186*e1eccf28SAndroid Build Coastguard Worker             ushort4 out_s = convert_ushort4(*out);
187*e1eccf28SAndroid Build Coastguard Worker             in_s = out_s + ((in_s * (ushort4)(255 - out_s.w)) >> (ushort4)8);
188*e1eccf28SAndroid Build Coastguard Worker             *out = convertClipped(in_s);
189*e1eccf28SAndroid Build Coastguard Worker         }
190*e1eccf28SAndroid Build Coastguard Worker         break;
191*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SRC_IN:
192*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
193*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
194*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
195*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
196*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendSrcIn_K(out, in, len);
197*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
198*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
199*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
200*e1eccf28SAndroid Build Coastguard Worker             }
201*e1eccf28SAndroid Build Coastguard Worker         }
202*e1eccf28SAndroid Build Coastguard Worker     #endif
203*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
204*e1eccf28SAndroid Build Coastguard Worker             ushort4 in_s = convert_ushort4(*in);
205*e1eccf28SAndroid Build Coastguard Worker             in_s = (in_s * out->w) >> (ushort4)8;
206*e1eccf28SAndroid Build Coastguard Worker             *out = convert_uchar4(in_s);
207*e1eccf28SAndroid Build Coastguard Worker         }
208*e1eccf28SAndroid Build Coastguard Worker         break;
209*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DST_IN:
210*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
211*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
212*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
213*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
214*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendDstIn_K(out, in, len);
215*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
216*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
217*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
218*e1eccf28SAndroid Build Coastguard Worker             }
219*e1eccf28SAndroid Build Coastguard Worker         }
220*e1eccf28SAndroid Build Coastguard Worker      #endif
221*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
222*e1eccf28SAndroid Build Coastguard Worker             short4 out_s = convert_short4(*out);
223*e1eccf28SAndroid Build Coastguard Worker             out_s = (out_s * in->w) >> (short4)8;
224*e1eccf28SAndroid Build Coastguard Worker             *out = convert_uchar4(out_s);
225*e1eccf28SAndroid Build Coastguard Worker         }
226*e1eccf28SAndroid Build Coastguard Worker         break;
227*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SRC_OUT:
228*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
229*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
230*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
231*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
232*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendSrcOut_K(out, in, len);
233*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
234*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
235*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
236*e1eccf28SAndroid Build Coastguard Worker             }
237*e1eccf28SAndroid Build Coastguard Worker         }
238*e1eccf28SAndroid Build Coastguard Worker     #endif
239*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
240*e1eccf28SAndroid Build Coastguard Worker             short4 in_s = convert_short4(*in);
241*e1eccf28SAndroid Build Coastguard Worker             in_s = (in_s * (short4)(255 - out->w)) >> (short4)8;
242*e1eccf28SAndroid Build Coastguard Worker             *out = convert_uchar4(in_s);
243*e1eccf28SAndroid Build Coastguard Worker         }
244*e1eccf28SAndroid Build Coastguard Worker         break;
245*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DST_OUT:
246*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
247*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
248*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
249*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
250*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendDstOut_K(out, in, len);
251*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
252*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
253*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
254*e1eccf28SAndroid Build Coastguard Worker             }
255*e1eccf28SAndroid Build Coastguard Worker         }
256*e1eccf28SAndroid Build Coastguard Worker     #endif
257*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
258*e1eccf28SAndroid Build Coastguard Worker             short4 out_s = convert_short4(*out);
259*e1eccf28SAndroid Build Coastguard Worker             out_s = (out_s * (short4)(255 - in->w)) >> (short4)8;
260*e1eccf28SAndroid Build Coastguard Worker             *out = convert_uchar4(out_s);
261*e1eccf28SAndroid Build Coastguard Worker         }
262*e1eccf28SAndroid Build Coastguard Worker         break;
263*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SRC_ATOP:
264*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
265*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
266*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
267*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
268*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendSrcAtop_K(out, in, len);
269*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
270*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
271*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
272*e1eccf28SAndroid Build Coastguard Worker             }
273*e1eccf28SAndroid Build Coastguard Worker         }
274*e1eccf28SAndroid Build Coastguard Worker     #endif
275*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
276*e1eccf28SAndroid Build Coastguard Worker             // The max value the operation could produce before the shift
277*e1eccf28SAndroid Build Coastguard Worker             // is 255 * 255 + 255 * (255 - 0) = 130050, or 0x1FC02.
278*e1eccf28SAndroid Build Coastguard Worker             // That value does not fit in a ushort, so we use uint.
279*e1eccf28SAndroid Build Coastguard Worker             uint4 in_s = convert_uint4(*in);
280*e1eccf28SAndroid Build Coastguard Worker             uint4 out_s = convert_uint4(*out);
281*e1eccf28SAndroid Build Coastguard Worker             out_s.xyz = ((in_s.xyz * out_s.w) +
282*e1eccf28SAndroid Build Coastguard Worker               (out_s.xyz * ((uint3)255 - (uint3)in_s.w))) >> (uint3)8;
283*e1eccf28SAndroid Build Coastguard Worker             *out = convertClipped(out_s);
284*e1eccf28SAndroid Build Coastguard Worker         }
285*e1eccf28SAndroid Build Coastguard Worker         break;
286*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DST_ATOP:
287*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
288*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
289*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
290*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
291*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendDstAtop_K(out, in, len);
292*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
293*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
294*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
295*e1eccf28SAndroid Build Coastguard Worker             }
296*e1eccf28SAndroid Build Coastguard Worker         }
297*e1eccf28SAndroid Build Coastguard Worker      #endif
298*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
299*e1eccf28SAndroid Build Coastguard Worker             uint4 in_s = convert_uint4(*in);
300*e1eccf28SAndroid Build Coastguard Worker             uint4 out_s = convert_uint4(*out);
301*e1eccf28SAndroid Build Coastguard Worker             out_s.xyz = ((out_s.xyz * in_s.w) +
302*e1eccf28SAndroid Build Coastguard Worker               (in_s.xyz * ((uint3)255 - (uint3)out_s.w))) >> (uint3)8;
303*e1eccf28SAndroid Build Coastguard Worker             out_s.w = in_s.w;
304*e1eccf28SAndroid Build Coastguard Worker             *out = convertClipped(out_s);
305*e1eccf28SAndroid Build Coastguard Worker         }
306*e1eccf28SAndroid Build Coastguard Worker         break;
307*e1eccf28SAndroid Build Coastguard Worker     case BLEND_XOR:
308*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
309*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
310*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
311*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
312*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendXor_K(out, in, len);
313*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
314*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
315*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
316*e1eccf28SAndroid Build Coastguard Worker             }
317*e1eccf28SAndroid Build Coastguard Worker         }
318*e1eccf28SAndroid Build Coastguard Worker     #endif
319*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
320*e1eccf28SAndroid Build Coastguard Worker             *out = *in ^ *out;
321*e1eccf28SAndroid Build Coastguard Worker         }
322*e1eccf28SAndroid Build Coastguard Worker         break;
323*e1eccf28SAndroid Build Coastguard Worker     case BLEND_NORMAL:
324*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_NORMAL");
325*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
326*e1eccf28SAndroid Build Coastguard Worker         break;
327*e1eccf28SAndroid Build Coastguard Worker     case BLEND_AVERAGE:
328*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_AVERAGE");
329*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
330*e1eccf28SAndroid Build Coastguard Worker         break;
331*e1eccf28SAndroid Build Coastguard Worker     case BLEND_MULTIPLY:
332*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
333*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
334*e1eccf28SAndroid Build Coastguard Worker             if ((x1 + 8) < x2) {
335*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
336*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendMultiply_K(out, in, len);
337*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
338*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
339*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
340*e1eccf28SAndroid Build Coastguard Worker             }
341*e1eccf28SAndroid Build Coastguard Worker         }
342*e1eccf28SAndroid Build Coastguard Worker     #endif
343*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
344*e1eccf28SAndroid Build Coastguard Worker           *out = convert_uchar4((convert_short4(*in) * convert_short4(*out))
345*e1eccf28SAndroid Build Coastguard Worker                                 >> (short4)8);
346*e1eccf28SAndroid Build Coastguard Worker         }
347*e1eccf28SAndroid Build Coastguard Worker         break;
348*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SCREEN:
349*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_SCREEN");
350*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
351*e1eccf28SAndroid Build Coastguard Worker         break;
352*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DARKEN:
353*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_DARKEN");
354*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
355*e1eccf28SAndroid Build Coastguard Worker         break;
356*e1eccf28SAndroid Build Coastguard Worker     case BLEND_LIGHTEN:
357*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_LIGHTEN");
358*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
359*e1eccf28SAndroid Build Coastguard Worker         break;
360*e1eccf28SAndroid Build Coastguard Worker     case BLEND_OVERLAY:
361*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_OVERLAY");
362*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
363*e1eccf28SAndroid Build Coastguard Worker         break;
364*e1eccf28SAndroid Build Coastguard Worker     case BLEND_HARDLIGHT:
365*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_HARDLIGHT");
366*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
367*e1eccf28SAndroid Build Coastguard Worker         break;
368*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SOFTLIGHT:
369*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_SOFTLIGHT");
370*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
371*e1eccf28SAndroid Build Coastguard Worker         break;
372*e1eccf28SAndroid Build Coastguard Worker     case BLEND_DIFFERENCE:
373*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_DIFFERENCE");
374*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
375*e1eccf28SAndroid Build Coastguard Worker         break;
376*e1eccf28SAndroid Build Coastguard Worker     case BLEND_NEGATION:
377*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_NEGATION");
378*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
379*e1eccf28SAndroid Build Coastguard Worker         break;
380*e1eccf28SAndroid Build Coastguard Worker     case BLEND_EXCLUSION:
381*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_EXCLUSION");
382*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
383*e1eccf28SAndroid Build Coastguard Worker         break;
384*e1eccf28SAndroid Build Coastguard Worker     case BLEND_COLOR_DODGE:
385*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_DODGE");
386*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
387*e1eccf28SAndroid Build Coastguard Worker         break;
388*e1eccf28SAndroid Build Coastguard Worker     case BLEND_INVERSE_COLOR_DODGE:
389*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_DODGE");
390*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
391*e1eccf28SAndroid Build Coastguard Worker         break;
392*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SOFT_DODGE:
393*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_DODGE");
394*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
395*e1eccf28SAndroid Build Coastguard Worker         break;
396*e1eccf28SAndroid Build Coastguard Worker     case BLEND_COLOR_BURN:
397*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_BURN");
398*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
399*e1eccf28SAndroid Build Coastguard Worker         break;
400*e1eccf28SAndroid Build Coastguard Worker     case BLEND_INVERSE_COLOR_BURN:
401*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_BURN");
402*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
403*e1eccf28SAndroid Build Coastguard Worker         break;
404*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SOFT_BURN:
405*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_BURN");
406*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
407*e1eccf28SAndroid Build Coastguard Worker         break;
408*e1eccf28SAndroid Build Coastguard Worker     case BLEND_REFLECT:
409*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_REFLECT");
410*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
411*e1eccf28SAndroid Build Coastguard Worker         break;
412*e1eccf28SAndroid Build Coastguard Worker     case BLEND_GLOW:
413*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_GLOW");
414*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
415*e1eccf28SAndroid Build Coastguard Worker         break;
416*e1eccf28SAndroid Build Coastguard Worker     case BLEND_FREEZE:
417*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_FREEZE");
418*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
419*e1eccf28SAndroid Build Coastguard Worker         break;
420*e1eccf28SAndroid Build Coastguard Worker     case BLEND_HEAT:
421*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_HEAT");
422*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
423*e1eccf28SAndroid Build Coastguard Worker         break;
424*e1eccf28SAndroid Build Coastguard Worker     case BLEND_ADD:
425*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
426*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
427*e1eccf28SAndroid Build Coastguard Worker             if((x1 + 8) < x2) {
428*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
429*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendAdd_K(out, in, len);
430*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
431*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
432*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
433*e1eccf28SAndroid Build Coastguard Worker             }
434*e1eccf28SAndroid Build Coastguard Worker         }
435*e1eccf28SAndroid Build Coastguard Worker     #endif
436*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
437*e1eccf28SAndroid Build Coastguard Worker             uint32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w,
438*e1eccf28SAndroid Build Coastguard Worker                 oR = out->x, oG = out->y, oB = out->z, oA = out->w;
439*e1eccf28SAndroid Build Coastguard Worker             out->x = (oR + iR) > 255 ? 255 : oR + iR;
440*e1eccf28SAndroid Build Coastguard Worker             out->y = (oG + iG) > 255 ? 255 : oG + iG;
441*e1eccf28SAndroid Build Coastguard Worker             out->z = (oB + iB) > 255 ? 255 : oB + iB;
442*e1eccf28SAndroid Build Coastguard Worker             out->w = (oA + iA) > 255 ? 255 : oA + iA;
443*e1eccf28SAndroid Build Coastguard Worker         }
444*e1eccf28SAndroid Build Coastguard Worker         break;
445*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SUBTRACT:
446*e1eccf28SAndroid Build Coastguard Worker     #if defined(ARCH_X86_HAVE_SSSE3)
447*e1eccf28SAndroid Build Coastguard Worker         if (gArchUseSIMD) {
448*e1eccf28SAndroid Build Coastguard Worker             if((x1 + 8) < x2) {
449*e1eccf28SAndroid Build Coastguard Worker                 uint32_t len = (x2 - x1) >> 3;
450*e1eccf28SAndroid Build Coastguard Worker                 rsdIntrinsicBlendSub_K(out, in, len);
451*e1eccf28SAndroid Build Coastguard Worker                 x1 += len << 3;
452*e1eccf28SAndroid Build Coastguard Worker                 out += len << 3;
453*e1eccf28SAndroid Build Coastguard Worker                 in += len << 3;
454*e1eccf28SAndroid Build Coastguard Worker             }
455*e1eccf28SAndroid Build Coastguard Worker         }
456*e1eccf28SAndroid Build Coastguard Worker     #endif
457*e1eccf28SAndroid Build Coastguard Worker         for (;x1 < x2; x1++, out++, in++) {
458*e1eccf28SAndroid Build Coastguard Worker             int32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w,
459*e1eccf28SAndroid Build Coastguard Worker                 oR = out->x, oG = out->y, oB = out->z, oA = out->w;
460*e1eccf28SAndroid Build Coastguard Worker             out->x = (oR - iR) < 0 ? 0 : oR - iR;
461*e1eccf28SAndroid Build Coastguard Worker             out->y = (oG - iG) < 0 ? 0 : oG - iG;
462*e1eccf28SAndroid Build Coastguard Worker             out->z = (oB - iB) < 0 ? 0 : oB - iB;
463*e1eccf28SAndroid Build Coastguard Worker             out->w = (oA - iA) < 0 ? 0 : oA - iA;
464*e1eccf28SAndroid Build Coastguard Worker         }
465*e1eccf28SAndroid Build Coastguard Worker         break;
466*e1eccf28SAndroid Build Coastguard Worker     case BLEND_STAMP:
467*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_STAMP");
468*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
469*e1eccf28SAndroid Build Coastguard Worker         break;
470*e1eccf28SAndroid Build Coastguard Worker     case BLEND_RED:
471*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_RED");
472*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
473*e1eccf28SAndroid Build Coastguard Worker         break;
474*e1eccf28SAndroid Build Coastguard Worker     case BLEND_GREEN:
475*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_GREEN");
476*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
477*e1eccf28SAndroid Build Coastguard Worker         break;
478*e1eccf28SAndroid Build Coastguard Worker     case BLEND_BLUE:
479*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_BLUE");
480*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
481*e1eccf28SAndroid Build Coastguard Worker         break;
482*e1eccf28SAndroid Build Coastguard Worker     case BLEND_HUE:
483*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_HUE");
484*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
485*e1eccf28SAndroid Build Coastguard Worker         break;
486*e1eccf28SAndroid Build Coastguard Worker     case BLEND_SATURATION:
487*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_SATURATION");
488*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
489*e1eccf28SAndroid Build Coastguard Worker         break;
490*e1eccf28SAndroid Build Coastguard Worker     case BLEND_COLOR:
491*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_COLOR");
492*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
493*e1eccf28SAndroid Build Coastguard Worker         break;
494*e1eccf28SAndroid Build Coastguard Worker     case BLEND_LUMINOSITY:
495*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented blend intrinsic BLEND_LUMINOSITY");
496*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
497*e1eccf28SAndroid Build Coastguard Worker         break;
498*e1eccf28SAndroid Build Coastguard Worker 
499*e1eccf28SAndroid Build Coastguard Worker     default:
500*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Called unimplemented value %d", info->slot);
501*e1eccf28SAndroid Build Coastguard Worker         rsAssert(false);
502*e1eccf28SAndroid Build Coastguard Worker 
503*e1eccf28SAndroid Build Coastguard Worker     }
504*e1eccf28SAndroid Build Coastguard Worker }
505*e1eccf28SAndroid Build Coastguard Worker 
506*e1eccf28SAndroid Build Coastguard Worker 
RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl * ctx,const Script * s,const Element * e)507*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptIntrinsicBlend::RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx,
508*e1eccf28SAndroid Build Coastguard Worker                                                        const Script *s, const Element *e)
509*e1eccf28SAndroid Build Coastguard Worker             : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_BLEND) {
510*e1eccf28SAndroid Build Coastguard Worker 
511*e1eccf28SAndroid Build Coastguard Worker     mRootPtr = &kernel;
512*e1eccf28SAndroid Build Coastguard Worker }
513*e1eccf28SAndroid Build Coastguard Worker 
~RsdCpuScriptIntrinsicBlend()514*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptIntrinsicBlend::~RsdCpuScriptIntrinsicBlend() {
515*e1eccf28SAndroid Build Coastguard Worker }
516*e1eccf28SAndroid Build Coastguard Worker 
populateScript(Script * s)517*e1eccf28SAndroid Build Coastguard Worker void RsdCpuScriptIntrinsicBlend::populateScript(Script *s) {
518*e1eccf28SAndroid Build Coastguard Worker     s->mHal.info.exportedVariableCount = 0;
519*e1eccf28SAndroid Build Coastguard Worker }
520*e1eccf28SAndroid Build Coastguard Worker 
rsdIntrinsic_Blend(RsdCpuReferenceImpl * ctx,const Script * s,const Element * e)521*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptImpl * rsdIntrinsic_Blend(RsdCpuReferenceImpl *ctx,
522*e1eccf28SAndroid Build Coastguard Worker                                       const Script *s, const Element *e) {
523*e1eccf28SAndroid Build Coastguard Worker     return new RsdCpuScriptIntrinsicBlend(ctx, s, e);
524*e1eccf28SAndroid Build Coastguard Worker }
525*e1eccf28SAndroid Build Coastguard Worker 
526*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
527*e1eccf28SAndroid Build Coastguard Worker } // namespace android
528