blob: 67df2027078864b05865cf2354fd187a34f88709 [file] [log] [blame]
Tim Murray84bf2b82012-10-31 16:03:16 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_RSCPPSTRUCTS_H
18#define ANDROID_RSCPPSTRUCTS_H
19
20#include <utils/String8.h>
21#include <utils/Vector.h>
22#include "utils/RefBase.h"
23
Tim Murray96267c22013-02-12 11:25:12 -080024// Every row in an RS allocation is guaranteed to be aligned by this amount
25// Every row in a user-backed allocation must be aligned by this amount
26#define RS_CPU_ALLOCATION_ALIGNMENT 16
27
Tim Murray84bf2b82012-10-31 16:03:16 -070028namespace android {
Tim Murray9eb7f4b2012-11-16 14:02:18 -080029namespace RSC {
Tim Murray84bf2b82012-10-31 16:03:16 -070030
31typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
32typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
33
34class RS;
35class BaseObj;
36class Element;
37class Type;
38class Allocation;
39class Script;
40class ScriptC;
41
42class RS : public android::LightRefBase<RS> {
43
44 public:
45 RS();
46 virtual ~RS();
47
Tim Murray4d252d62012-11-29 14:37:59 -080048 bool init(bool forceCpu = false, bool synchronous = false);
Tim Murray84bf2b82012-10-31 16:03:16 -070049
50 void setErrorHandler(ErrorHandlerFunc_t func);
51 ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
52
53 void setMessageHandler(MessageHandlerFunc_t func);
54 MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
55
56 void throwError(const char *err) const;
57
58 RsContext getContext() { return mContext; }
59
Tim Murraybaca6c32012-11-14 16:51:46 -080060 void finish();
61
Tim Murray84bf2b82012-10-31 16:03:16 -070062 private:
Tim Murray4d252d62012-11-29 14:37:59 -080063 bool init(int targetApi, bool forceCpu, bool synchronous);
Tim Murray84bf2b82012-10-31 16:03:16 -070064 static void * threadProc(void *);
65
66 static bool gInitialized;
67 static pthread_mutex_t gInitMutex;
68
69 pthread_t mMessageThreadId;
70 pid_t mNativeMessageThreadId;
71 bool mMessageRun;
72
73 RsDevice mDev;
74 RsContext mContext;
75
76 ErrorHandlerFunc_t mErrorFunc;
77 MessageHandlerFunc_t mMessageFunc;
78
79 struct {
80 Element *U8;
81 Element *I8;
82 Element *U16;
83 Element *I16;
84 Element *U32;
85 Element *I32;
86 Element *U64;
87 Element *I64;
88 Element *F32;
89 Element *F64;
90 Element *BOOLEAN;
91
92 Element *ELEMENT;
93 Element *TYPE;
94 Element *ALLOCATION;
95 Element *SAMPLER;
96 Element *SCRIPT;
97 Element *MESH;
98 Element *PROGRAM_FRAGMENT;
99 Element *PROGRAM_VERTEX;
100 Element *PROGRAM_RASTER;
101 Element *PROGRAM_STORE;
102
103 Element *A_8;
104 Element *RGB_565;
105 Element *RGB_888;
106 Element *RGBA_5551;
107 Element *RGBA_4444;
108 Element *RGBA_8888;
109
110 Element *FLOAT_2;
111 Element *FLOAT_3;
112 Element *FLOAT_4;
113
114 Element *DOUBLE_2;
115 Element *DOUBLE_3;
116 Element *DOUBLE_4;
117
118 Element *UCHAR_2;
119 Element *UCHAR_3;
120 Element *UCHAR_4;
121
122 Element *CHAR_2;
123 Element *CHAR_3;
124 Element *CHAR_4;
125
126 Element *USHORT_2;
127 Element *USHORT_3;
128 Element *USHORT_4;
129
130 Element *SHORT_2;
131 Element *SHORT_3;
132 Element *SHORT_4;
133
134 Element *UINT_2;
135 Element *UINT_3;
136 Element *UINT_4;
137
138 Element *INT_2;
139 Element *INT_3;
140 Element *INT_4;
141
142 Element *ULONG_2;
143 Element *ULONG_3;
144 Element *ULONG_4;
145
146 Element *LONG_2;
147 Element *LONG_3;
148 Element *LONG_4;
149
150 Element *MATRIX_4X4;
151 Element *MATRIX_3X3;
152 Element *MATRIX_2X2;
153 } mElements;
154
155};
156
157class BaseObj : public android::LightRefBase<BaseObj> {
158protected:
159 void *mID;
160 sp<RS> mRS;
161 String8 mName;
162
163 BaseObj(void *id, sp<RS> rs);
164 void checkValid();
165
166 static void * getObjID(sp<const BaseObj> o);
167
168public:
169
170 void * getID() const;
171 virtual ~BaseObj();
172 virtual void updateFromNative();
173 virtual bool equals(const BaseObj *obj);
174};
175
176
177class Allocation : public BaseObj {
178protected:
179 android::sp<const Type> mType;
180 uint32_t mUsage;
181 android::sp<Allocation> mAdaptedAllocation;
182
183 bool mConstrainedLOD;
184 bool mConstrainedFace;
185 bool mConstrainedY;
186 bool mConstrainedZ;
187 bool mReadAllowed;
188 bool mWriteAllowed;
189 uint32_t mSelectedY;
190 uint32_t mSelectedZ;
191 uint32_t mSelectedLOD;
192 RsAllocationCubemapFace mSelectedFace;
193
194 uint32_t mCurrentDimX;
195 uint32_t mCurrentDimY;
196 uint32_t mCurrentDimZ;
197 uint32_t mCurrentCount;
198
199 void * getIDSafe() const;
200 void updateCacheInfo(sp<const Type> t);
201
202 Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
203
204 void validateIsInt32();
205 void validateIsInt16();
206 void validateIsInt8();
207 void validateIsFloat32();
208 void validateIsObject();
209
210 virtual void updateFromNative();
211
212 void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
213
214public:
215 android::sp<const Type> getType() {
216 return mType;
217 }
218
219 void syncAll(RsAllocationUsageType srcLocation);
220 void ioSendOutput();
221 void ioGetInput();
222
223 void generateMipmaps();
Tim Murray509ea5c2012-11-13 11:56:40 -0800224
Tim Murray0b93e302012-11-15 14:56:54 -0800225 void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
Tim Murraya4cbc2b2012-11-14 17:18:08 -0800226 void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
Tim Murray84bf2b82012-10-31 16:03:16 -0700227
Tim Murray0b93e302012-11-15 14:56:54 -0800228 void copy1DRangeTo(uint32_t off, size_t count, void *data);
229
230 void copy1DFrom(const void* data);
231 void copy1DTo(void* data);
Tim Murraya4cbc2b2012-11-14 17:18:08 -0800232
Tim Murray84bf2b82012-10-31 16:03:16 -0700233 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
Tim Murray0b93e302012-11-15 14:56:54 -0800234 const void *data);
Tim Murray7b3e3092012-11-16 13:32:24 -0800235
236 void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
237 void *data);
238
Tim Murray0b93e302012-11-15 14:56:54 -0800239 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
240 sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
Tim Murray84bf2b82012-10-31 16:03:16 -0700241
Tim Murray358747a2012-11-26 13:52:04 -0800242 void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
243 const void *data, size_t stride);
244 void copy2DStridedFrom(const void *data, size_t stride);
245
246 void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
247 void *data, size_t stride);
248 void copy2DStridedTo(void *data, size_t stride);
249
Tim Murray84bf2b82012-10-31 16:03:16 -0700250 void resize(int dimX);
251 void resize(int dimX, int dimY);
252
253 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
254 RsAllocationMipmapControl mips, uint32_t usage);
255 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
256 RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
257
258 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
259 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
260 static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
261 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
Tim Murray684726c2012-11-14 11:57:42 -0800262 static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
263 size_t x, size_t y,
264 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
265
Tim Murray84bf2b82012-10-31 16:03:16 -0700266
267};
268
269class Element : public BaseObj {
270public:
271 bool isComplex();
272 size_t getSubElementCount() {
273 return mVisibleElementMap.size();
274 }
275
276 sp<const Element> getSubElement(uint32_t index);
277 const char * getSubElementName(uint32_t index);
278 size_t getSubElementArraySize(uint32_t index);
279 uint32_t getSubElementOffsetBytes(uint32_t index);
280 RsDataType getDataType() const {
281 return mType;
282 }
283
284 RsDataKind getDataKind() const {
285 return mKind;
286 }
287
288 size_t getSizeBytes() const {
289 return mSizeBytes;
290 }
291
292 static sp<const Element> BOOLEAN(sp<RS> rs);
293 static sp<const Element> U8(sp<RS> rs);
294 static sp<const Element> I8(sp<RS> rs);
295 static sp<const Element> U16(sp<RS> rs);
296 static sp<const Element> I16(sp<RS> rs);
297 static sp<const Element> U32(sp<RS> rs);
298 static sp<const Element> I32(sp<RS> rs);
299 static sp<const Element> U64(sp<RS> rs);
300 static sp<const Element> I64(sp<RS> rs);
301 static sp<const Element> F32(sp<RS> rs);
302 static sp<const Element> F64(sp<RS> rs);
303 static sp<const Element> ELEMENT(sp<RS> rs);
304 static sp<const Element> TYPE(sp<RS> rs);
305 static sp<const Element> ALLOCATION(sp<RS> rs);
306 static sp<const Element> SAMPLER(sp<RS> rs);
307 static sp<const Element> SCRIPT(sp<RS> rs);
308 static sp<const Element> MESH(sp<RS> rs);
309 static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
310 static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
311 static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
312 static sp<const Element> PROGRAM_STORE(sp<RS> rs);
313
314 static sp<const Element> A_8(sp<RS> rs);
315 static sp<const Element> RGB_565(sp<RS> rs);
316 static sp<const Element> RGB_888(sp<RS> rs);
317 static sp<const Element> RGBA_5551(sp<RS> rs);
318 static sp<const Element> RGBA_4444(sp<RS> rs);
319 static sp<const Element> RGBA_8888(sp<RS> rs);
320
321 static sp<const Element> F32_2(sp<RS> rs);
322 static sp<const Element> F32_3(sp<RS> rs);
323 static sp<const Element> F32_4(sp<RS> rs);
324 static sp<const Element> F64_2(sp<RS> rs);
325 static sp<const Element> F64_3(sp<RS> rs);
326 static sp<const Element> F64_4(sp<RS> rs);
327 static sp<const Element> U8_2(sp<RS> rs);
328 static sp<const Element> U8_3(sp<RS> rs);
329 static sp<const Element> U8_4(sp<RS> rs);
330 static sp<const Element> I8_2(sp<RS> rs);
331 static sp<const Element> I8_3(sp<RS> rs);
332 static sp<const Element> I8_4(sp<RS> rs);
333 static sp<const Element> U16_2(sp<RS> rs);
334 static sp<const Element> U16_3(sp<RS> rs);
335 static sp<const Element> U16_4(sp<RS> rs);
336 static sp<const Element> I16_2(sp<RS> rs);
337 static sp<const Element> I16_3(sp<RS> rs);
338 static sp<const Element> I16_4(sp<RS> rs);
339 static sp<const Element> U32_2(sp<RS> rs);
340 static sp<const Element> U32_3(sp<RS> rs);
341 static sp<const Element> U32_4(sp<RS> rs);
342 static sp<const Element> I32_2(sp<RS> rs);
343 static sp<const Element> I32_3(sp<RS> rs);
344 static sp<const Element> I32_4(sp<RS> rs);
345 static sp<const Element> U64_2(sp<RS> rs);
346 static sp<const Element> U64_3(sp<RS> rs);
347 static sp<const Element> U64_4(sp<RS> rs);
348 static sp<const Element> I64_2(sp<RS> rs);
349 static sp<const Element> I64_3(sp<RS> rs);
350 static sp<const Element> I64_4(sp<RS> rs);
351 static sp<const Element> MATRIX_4X4(sp<RS> rs);
352 static sp<const Element> MATRIX_3X3(sp<RS> rs);
353 static sp<const Element> MATRIX_2X2(sp<RS> rs);
354
355 Element(void *id, sp<RS> rs,
356 android::Vector<sp<Element> > &elements,
357 android::Vector<android::String8> &elementNames,
358 android::Vector<uint32_t> &arraySizes);
359 Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
360 Element(sp<RS> rs);
361 virtual ~Element();
362
363 void updateFromNative();
364 static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
365 static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
366 static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
367 bool isCompatible(sp<const Element>e);
368
369 class Builder {
370 private:
371 sp<RS> mRS;
372 android::Vector<sp<Element> > mElements;
373 android::Vector<android::String8> mElementNames;
374 android::Vector<uint32_t> mArraySizes;
375 bool mSkipPadding;
376
377 public:
378 Builder(sp<RS> rs);
379 ~Builder();
380 void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1);
381 sp<const Element> create();
382 };
383
384private:
385 void updateVisibleSubElements();
386
387 android::Vector<sp</*const*/ Element> > mElements;
388 android::Vector<android::String8> mElementNames;
389 android::Vector<uint32_t> mArraySizes;
390 android::Vector<uint32_t> mVisibleElementMap;
391 android::Vector<uint32_t> mOffsetInBytes;
392
393 RsDataType mType;
394 RsDataKind mKind;
395 bool mNormalized;
396 size_t mSizeBytes;
397 size_t mVectorSize;
398};
399
Stephen Hines2c7206e2012-11-14 19:47:01 -0800400class FieldPacker {
401protected:
402 unsigned char* mData;
403 size_t mPos;
404 size_t mLen;
405
406public:
407 FieldPacker(size_t len)
408 : mPos(0),
409 mLen(len) {
410 mData = new unsigned char[len];
411 }
412
413 virtual ~FieldPacker() {
414 delete [] mData;
415 }
416
417 void align(size_t v) {
418 if ((v & (v - 1)) != 0) {
419 ALOGE("Non-power-of-two alignment: %zu", v);
420 return;
421 }
422
423 while ((mPos & (v - 1)) != 0) {
424 mData[mPos++] = 0;
425 }
426 }
427
428 void reset() {
429 mPos = 0;
430 }
431
432 void reset(size_t i) {
433 if (i >= mLen) {
434 ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
435 return;
436 }
437 mPos = i;
438 }
439
440 void skip(size_t i) {
441 size_t res = mPos + i;
442 if (res > mLen) {
443 ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
444 return;
445 }
446 mPos = res;
447 }
448
449 void* getData() const {
450 return mData;
451 }
452
453 size_t getLength() const {
454 return mLen;
455 }
456
457 template <typename T>
458 void add(T t) {
459 align(sizeof(t));
460 if (mPos + sizeof(t) <= mLen) {
461 memcpy(&mData[mPos], &t, sizeof(t));
462 mPos += sizeof(t);
463 }
464 }
Stephen Hines43514cd2012-11-16 14:33:47 -0800465
466 /*
467 void add(rs_matrix4x4 m) {
468 for (size_t i = 0; i < 16; i++) {
469 add(m.m[i]);
470 }
471 }
472
473 void add(rs_matrix3x3 m) {
474 for (size_t i = 0; i < 9; i++) {
475 add(m.m[i]);
476 }
477 }
478
479 void add(rs_matrix2x2 m) {
480 for (size_t i = 0; i < 4; i++) {
481 add(m.m[i]);
482 }
483 }
484 */
485
486 void add(BaseObj* obj) {
487 if (obj != NULL) {
488 add((uint32_t) (uintptr_t) obj->getID());
489 } else {
490 add((uint32_t) 0);
491 }
492 }
Stephen Hines2c7206e2012-11-14 19:47:01 -0800493};
494
Tim Murray84bf2b82012-10-31 16:03:16 -0700495class Type : public BaseObj {
496protected:
497 friend class Allocation;
498
499 uint32_t mDimX;
500 uint32_t mDimY;
501 uint32_t mDimZ;
502 bool mDimMipmaps;
503 bool mDimFaces;
504 size_t mElementCount;
505 sp<const Element> mElement;
506
507 void calcElementCount();
508 virtual void updateFromNative();
509
510public:
511
512 sp<const Element> getElement() const {
513 return mElement;
514 }
515
516 uint32_t getX() const {
517 return mDimX;
518 }
519
520 uint32_t getY() const {
521 return mDimY;
522 }
523
524 uint32_t getZ() const {
525 return mDimZ;
526 }
527
528 bool hasMipmaps() const {
529 return mDimMipmaps;
530 }
531
532 bool hasFaces() const {
533 return mDimFaces;
534 }
535
536 size_t getCount() const {
537 return mElementCount;
538 }
539
540 size_t getSizeBytes() const {
541 return mElementCount * mElement->getSizeBytes();
542 }
543
544 Type(void *id, sp<RS> rs);
545
Tim Murray96267c22013-02-12 11:25:12 -0800546 static sp<const Type> create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ);
Tim Murray84bf2b82012-10-31 16:03:16 -0700547
548 class Builder {
549 protected:
550 sp<RS> mRS;
551 uint32_t mDimX;
552 uint32_t mDimY;
553 uint32_t mDimZ;
554 bool mDimMipmaps;
555 bool mDimFaces;
556 sp<const Element> mElement;
557
558 public:
559 Builder(sp<RS> rs, sp<const Element> e);
560
561 void setX(uint32_t value);
562 void setY(int value);
563 void setMipmaps(bool value);
564 void setFaces(bool value);
565 sp<const Type> create();
566 };
567
568};
569
570class Script : public BaseObj {
571private:
572
573protected:
574 Script(void *id, sp<RS> rs);
575 void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
576 const void *v, size_t) const;
577 void bindAllocation(sp<Allocation> va, uint32_t slot) const;
578 void setVar(uint32_t index, const void *, size_t len) const;
579 void setVar(uint32_t index, sp<const BaseObj> o) const;
580 void invoke(uint32_t slot, const void *v, size_t len) const;
581
582
583 void invoke(uint32_t slot) const {
584 invoke(slot, NULL, 0);
585 }
586 void setVar(uint32_t index, float v) const {
587 setVar(index, &v, sizeof(v));
588 }
589 void setVar(uint32_t index, double v) const {
590 setVar(index, &v, sizeof(v));
591 }
592 void setVar(uint32_t index, int32_t v) const {
593 setVar(index, &v, sizeof(v));
594 }
595 void setVar(uint32_t index, int64_t v) const {
596 setVar(index, &v, sizeof(v));
597 }
598 void setVar(uint32_t index, bool v) const {
599 setVar(index, &v, sizeof(v));
600 }
601
602public:
603 class FieldBase {
604 protected:
605 sp<const Element> mElement;
606 sp<Allocation> mAllocation;
607
608 void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
609
610 public:
611 sp<const Element> getElement() {
612 return mElement;
613 }
614
615 sp<const Type> getType() {
616 return mAllocation->getType();
617 }
618
619 sp<const Allocation> getAllocation() {
620 return mAllocation;
621 }
622
623 //void updateAllocation();
624 };
625};
626
627class ScriptC : public Script {
628protected:
629 ScriptC(sp<RS> rs,
630 const void *codeTxt, size_t codeLength,
631 const char *cachedName, size_t cachedNameLength,
632 const char *cacheDir, size_t cacheDirLength);
633
634};
635
Tim Murray7f0d5682012-11-08 16:35:24 -0800636class ScriptIntrinsic : public Script {
637 protected:
Tim Murray3cd44af2012-11-14 11:25:27 -0800638 ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
Tim Murray7f0d5682012-11-08 16:35:24 -0800639};
640
641class ScriptIntrinsicBlend : public ScriptIntrinsic {
642 public:
Tim Murray3cd44af2012-11-14 11:25:27 -0800643 ScriptIntrinsicBlend(sp<RS> rs, sp <const Element> e);
Tim Murray7f0d5682012-11-08 16:35:24 -0800644 void blendClear(sp<Allocation> in, sp<Allocation> out);
645 void blendSrc(sp<Allocation> in, sp<Allocation> out);
646 void blendDst(sp<Allocation> in, sp<Allocation> out);
647 void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
648 void blendDstOver(sp<Allocation> in, sp<Allocation> out);
649 void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
650 void blendDstIn(sp<Allocation> in, sp<Allocation> out);
651 void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
652 void blendDstOut(sp<Allocation> in, sp<Allocation> out);
653 void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
654 void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
655 void blendXor(sp<Allocation> in, sp<Allocation> out);
656 void blendMultiply(sp<Allocation> in, sp<Allocation> out);
657 void blendAdd(sp<Allocation> in, sp<Allocation> out);
658 void blendSubtract(sp<Allocation> in, sp<Allocation> out);
659};
Tim Murray84bf2b82012-10-31 16:03:16 -0700660
Tim Murray8f1e60c2012-11-13 12:25:11 -0800661class ScriptIntrinsicBlur : public ScriptIntrinsic {
662 public:
Tim Murray3cd44af2012-11-14 11:25:27 -0800663 ScriptIntrinsicBlur(sp<RS> rs, sp <const Element> e);
Tim Murray8f1e60c2012-11-13 12:25:11 -0800664 void blur(sp<Allocation> in, sp<Allocation> out);
665 void setRadius(float radius);
666};
667
Tim Murray84bf2b82012-10-31 16:03:16 -0700668}
Tim Murray7f0d5682012-11-08 16:35:24 -0800669
Tim Murray84bf2b82012-10-31 16:03:16 -0700670}
671
672#endif