rsCppStructs.h revision 2c7206e7e19c23fdaa2dd5843f0597624a5e7341
1/*
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
24#include <rs.h>
25
26namespace android {
27namespace renderscriptCpp {
28
29typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
30typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
31
32class RS;
33class BaseObj;
34class Element;
35class Type;
36class Allocation;
37class Script;
38class ScriptC;
39
40class RS : public android::LightRefBase<RS> {
41
42 public:
43    RS();
44    virtual ~RS();
45
46    bool init() { return init(false); }
47    bool init(bool forceCpu);
48
49    void setErrorHandler(ErrorHandlerFunc_t func);
50    ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
51
52    void setMessageHandler(MessageHandlerFunc_t func);
53    MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
54
55    void throwError(const char *err) const;
56
57    RsContext getContext() { return mContext; }
58
59 private:
60    bool init(int targetApi, bool forceCpu);
61    static void * threadProc(void *);
62
63    static bool gInitialized;
64    static pthread_mutex_t gInitMutex;
65
66    pthread_t mMessageThreadId;
67    pid_t mNativeMessageThreadId;
68    bool mMessageRun;
69
70    RsDevice mDev;
71    RsContext mContext;
72
73    ErrorHandlerFunc_t mErrorFunc;
74    MessageHandlerFunc_t mMessageFunc;
75
76    struct {
77        Element *U8;
78        Element *I8;
79        Element *U16;
80        Element *I16;
81        Element *U32;
82        Element *I32;
83        Element *U64;
84        Element *I64;
85        Element *F32;
86        Element *F64;
87        Element *BOOLEAN;
88
89        Element *ELEMENT;
90        Element *TYPE;
91        Element *ALLOCATION;
92        Element *SAMPLER;
93        Element *SCRIPT;
94        Element *MESH;
95        Element *PROGRAM_FRAGMENT;
96        Element *PROGRAM_VERTEX;
97        Element *PROGRAM_RASTER;
98        Element *PROGRAM_STORE;
99
100        Element *A_8;
101        Element *RGB_565;
102        Element *RGB_888;
103        Element *RGBA_5551;
104        Element *RGBA_4444;
105        Element *RGBA_8888;
106
107        Element *FLOAT_2;
108        Element *FLOAT_3;
109        Element *FLOAT_4;
110
111        Element *DOUBLE_2;
112        Element *DOUBLE_3;
113        Element *DOUBLE_4;
114
115        Element *UCHAR_2;
116        Element *UCHAR_3;
117        Element *UCHAR_4;
118
119        Element *CHAR_2;
120        Element *CHAR_3;
121        Element *CHAR_4;
122
123        Element *USHORT_2;
124        Element *USHORT_3;
125        Element *USHORT_4;
126
127        Element *SHORT_2;
128        Element *SHORT_3;
129        Element *SHORT_4;
130
131        Element *UINT_2;
132        Element *UINT_3;
133        Element *UINT_4;
134
135        Element *INT_2;
136        Element *INT_3;
137        Element *INT_4;
138
139        Element *ULONG_2;
140        Element *ULONG_3;
141        Element *ULONG_4;
142
143        Element *LONG_2;
144        Element *LONG_3;
145        Element *LONG_4;
146
147        Element *MATRIX_4X4;
148        Element *MATRIX_3X3;
149        Element *MATRIX_2X2;
150    } mElements;
151
152};
153
154class BaseObj : public android::LightRefBase<BaseObj> {
155protected:
156    void *mID;
157    sp<RS> mRS;
158    String8 mName;
159
160    BaseObj(void *id, sp<RS> rs);
161    void checkValid();
162
163    static void * getObjID(sp<const BaseObj> o);
164
165public:
166
167    void * getID() const;
168    virtual ~BaseObj();
169    virtual void updateFromNative();
170    virtual bool equals(const BaseObj *obj);
171};
172
173
174class Allocation : public BaseObj {
175protected:
176    android::sp<const Type> mType;
177    uint32_t mUsage;
178    android::sp<Allocation> mAdaptedAllocation;
179
180    bool mConstrainedLOD;
181    bool mConstrainedFace;
182    bool mConstrainedY;
183    bool mConstrainedZ;
184    bool mReadAllowed;
185    bool mWriteAllowed;
186    uint32_t mSelectedY;
187    uint32_t mSelectedZ;
188    uint32_t mSelectedLOD;
189    RsAllocationCubemapFace mSelectedFace;
190
191    uint32_t mCurrentDimX;
192    uint32_t mCurrentDimY;
193    uint32_t mCurrentDimZ;
194    uint32_t mCurrentCount;
195
196    void * getIDSafe() const;
197    void updateCacheInfo(sp<const Type> t);
198
199    Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
200
201    void validateIsInt32();
202    void validateIsInt16();
203    void validateIsInt8();
204    void validateIsFloat32();
205    void validateIsObject();
206
207    virtual void updateFromNative();
208
209    void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
210
211public:
212    android::sp<const Type> getType() {
213        return mType;
214    }
215
216    void syncAll(RsAllocationUsageType srcLocation);
217    void ioSendOutput();
218    void ioGetInput();
219
220    void generateMipmaps();
221
222    void copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen);
223    void copy1DRangeToUnchecked(uint32_t off, size_t count, void *data, size_t dataLen);
224
225    void copy1DRangeFrom(uint32_t off, size_t count, const int32_t* d, size_t dataLen);
226    void copy1DRangeFrom(uint32_t off, size_t count, const int16_t* d, size_t dataLen);
227    void copy1DRangeFrom(uint32_t off, size_t count, const int8_t* d, size_t dataLen);
228    void copy1DRangeFrom(uint32_t off, size_t count, const float* d, size_t dataLen);
229    void copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff);
230
231    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
232                         const int32_t *data, size_t dataLen);
233    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
234                         const int16_t *data, size_t dataLen);
235    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
236                         const int8_t *data, size_t dataLen);
237    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
238                         const float *data, size_t dataLen);
239    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
240                         const Allocation *data, size_t dataLen,
241                         uint32_t dataXoff, uint32_t dataYoff);
242
243    void resize(int dimX);
244    void resize(int dimX, int dimY);
245
246    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
247                                   RsAllocationMipmapControl mips, uint32_t usage);
248    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
249                                   RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
250
251    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
252                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
253    static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
254                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
255
256};
257
258class Element : public BaseObj {
259public:
260    bool isComplex();
261    size_t getSubElementCount() {
262        return mVisibleElementMap.size();
263    }
264
265    sp<const Element> getSubElement(uint32_t index);
266    const char * getSubElementName(uint32_t index);
267    size_t getSubElementArraySize(uint32_t index);
268    uint32_t getSubElementOffsetBytes(uint32_t index);
269    RsDataType getDataType() const {
270        return mType;
271    }
272
273    RsDataKind getDataKind() const {
274        return mKind;
275    }
276
277    size_t getSizeBytes() const {
278        return mSizeBytes;
279    }
280
281    static sp<const Element> BOOLEAN(sp<RS> rs);
282    static sp<const Element> U8(sp<RS> rs);
283    static sp<const Element> I8(sp<RS> rs);
284    static sp<const Element> U16(sp<RS> rs);
285    static sp<const Element> I16(sp<RS> rs);
286    static sp<const Element> U32(sp<RS> rs);
287    static sp<const Element> I32(sp<RS> rs);
288    static sp<const Element> U64(sp<RS> rs);
289    static sp<const Element> I64(sp<RS> rs);
290    static sp<const Element> F32(sp<RS> rs);
291    static sp<const Element> F64(sp<RS> rs);
292    static sp<const Element> ELEMENT(sp<RS> rs);
293    static sp<const Element> TYPE(sp<RS> rs);
294    static sp<const Element> ALLOCATION(sp<RS> rs);
295    static sp<const Element> SAMPLER(sp<RS> rs);
296    static sp<const Element> SCRIPT(sp<RS> rs);
297    static sp<const Element> MESH(sp<RS> rs);
298    static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
299    static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
300    static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
301    static sp<const Element> PROGRAM_STORE(sp<RS> rs);
302
303    static sp<const Element> A_8(sp<RS> rs);
304    static sp<const Element> RGB_565(sp<RS> rs);
305    static sp<const Element> RGB_888(sp<RS> rs);
306    static sp<const Element> RGBA_5551(sp<RS> rs);
307    static sp<const Element> RGBA_4444(sp<RS> rs);
308    static sp<const Element> RGBA_8888(sp<RS> rs);
309
310    static sp<const Element> F32_2(sp<RS> rs);
311    static sp<const Element> F32_3(sp<RS> rs);
312    static sp<const Element> F32_4(sp<RS> rs);
313    static sp<const Element> F64_2(sp<RS> rs);
314    static sp<const Element> F64_3(sp<RS> rs);
315    static sp<const Element> F64_4(sp<RS> rs);
316    static sp<const Element> U8_2(sp<RS> rs);
317    static sp<const Element> U8_3(sp<RS> rs);
318    static sp<const Element> U8_4(sp<RS> rs);
319    static sp<const Element> I8_2(sp<RS> rs);
320    static sp<const Element> I8_3(sp<RS> rs);
321    static sp<const Element> I8_4(sp<RS> rs);
322    static sp<const Element> U16_2(sp<RS> rs);
323    static sp<const Element> U16_3(sp<RS> rs);
324    static sp<const Element> U16_4(sp<RS> rs);
325    static sp<const Element> I16_2(sp<RS> rs);
326    static sp<const Element> I16_3(sp<RS> rs);
327    static sp<const Element> I16_4(sp<RS> rs);
328    static sp<const Element> U32_2(sp<RS> rs);
329    static sp<const Element> U32_3(sp<RS> rs);
330    static sp<const Element> U32_4(sp<RS> rs);
331    static sp<const Element> I32_2(sp<RS> rs);
332    static sp<const Element> I32_3(sp<RS> rs);
333    static sp<const Element> I32_4(sp<RS> rs);
334    static sp<const Element> U64_2(sp<RS> rs);
335    static sp<const Element> U64_3(sp<RS> rs);
336    static sp<const Element> U64_4(sp<RS> rs);
337    static sp<const Element> I64_2(sp<RS> rs);
338    static sp<const Element> I64_3(sp<RS> rs);
339    static sp<const Element> I64_4(sp<RS> rs);
340    static sp<const Element> MATRIX_4X4(sp<RS> rs);
341    static sp<const Element> MATRIX_3X3(sp<RS> rs);
342    static sp<const Element> MATRIX_2X2(sp<RS> rs);
343
344    Element(void *id, sp<RS> rs,
345            android::Vector<sp<Element> > &elements,
346            android::Vector<android::String8> &elementNames,
347            android::Vector<uint32_t> &arraySizes);
348    Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
349    Element(sp<RS> rs);
350    virtual ~Element();
351
352    void updateFromNative();
353    static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
354    static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
355    static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
356    bool isCompatible(sp<const Element>e);
357
358    class Builder {
359    private:
360        sp<RS> mRS;
361        android::Vector<sp<Element> > mElements;
362        android::Vector<android::String8> mElementNames;
363        android::Vector<uint32_t> mArraySizes;
364        bool mSkipPadding;
365
366    public:
367        Builder(sp<RS> rs);
368        ~Builder();
369        void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1);
370        sp<const Element> create();
371    };
372
373private:
374    void updateVisibleSubElements();
375
376    android::Vector<sp</*const*/ Element> > mElements;
377    android::Vector<android::String8> mElementNames;
378    android::Vector<uint32_t> mArraySizes;
379    android::Vector<uint32_t> mVisibleElementMap;
380    android::Vector<uint32_t> mOffsetInBytes;
381
382    RsDataType mType;
383    RsDataKind mKind;
384    bool mNormalized;
385    size_t mSizeBytes;
386    size_t mVectorSize;
387};
388
389class FieldPacker {
390protected:
391    unsigned char* mData;
392    size_t mPos;
393    size_t mLen;
394
395public:
396    FieldPacker(size_t len)
397        : mPos(0),
398          mLen(len) {
399        mData = new unsigned char[len];
400    }
401
402    virtual ~FieldPacker() {
403        delete [] mData;
404    }
405
406    void align(size_t v) {
407        if ((v & (v - 1)) != 0) {
408            ALOGE("Non-power-of-two alignment: %zu", v);
409            return;
410        }
411
412        while ((mPos & (v - 1)) != 0) {
413            mData[mPos++] = 0;
414        }
415    }
416
417    void reset() {
418        mPos = 0;
419    }
420
421    void reset(size_t i) {
422        if (i >= mLen) {
423            ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
424            return;
425        }
426        mPos = i;
427    }
428
429    void skip(size_t i) {
430        size_t res = mPos + i;
431        if (res > mLen) {
432            ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
433            return;
434        }
435        mPos = res;
436    }
437
438    void* getData() const {
439        return mData;
440    }
441
442    size_t getLength() const {
443        return mLen;
444    }
445
446    template <typename T>
447    void add(T t) {
448        align(sizeof(t));
449        if (mPos + sizeof(t) <= mLen) {
450            memcpy(&mData[mPos], &t, sizeof(t));
451            mPos += sizeof(t);
452        }
453    }
454};
455
456class Type : public BaseObj {
457protected:
458    friend class Allocation;
459
460    uint32_t mDimX;
461    uint32_t mDimY;
462    uint32_t mDimZ;
463    bool mDimMipmaps;
464    bool mDimFaces;
465    size_t mElementCount;
466    sp<const Element> mElement;
467
468    void calcElementCount();
469    virtual void updateFromNative();
470
471public:
472
473    sp<const Element> getElement() const {
474        return mElement;
475    }
476
477    uint32_t getX() const {
478        return mDimX;
479    }
480
481    uint32_t getY() const {
482        return mDimY;
483    }
484
485    uint32_t getZ() const {
486        return mDimZ;
487    }
488
489    bool hasMipmaps() const {
490        return mDimMipmaps;
491    }
492
493    bool hasFaces() const {
494        return mDimFaces;
495    }
496
497    size_t getCount() const {
498        return mElementCount;
499    }
500
501    size_t getSizeBytes() const {
502        return mElementCount * mElement->getSizeBytes();
503    }
504
505    Type(void *id, sp<RS> rs);
506
507
508    class Builder {
509    protected:
510        sp<RS> mRS;
511        uint32_t mDimX;
512        uint32_t mDimY;
513        uint32_t mDimZ;
514        bool mDimMipmaps;
515        bool mDimFaces;
516        sp<const Element> mElement;
517
518    public:
519        Builder(sp<RS> rs, sp<const Element> e);
520
521        void setX(uint32_t value);
522        void setY(int value);
523        void setMipmaps(bool value);
524        void setFaces(bool value);
525        sp<const Type> create();
526    };
527
528};
529
530class Script : public BaseObj {
531private:
532
533protected:
534    Script(void *id, sp<RS> rs);
535    void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
536            const void *v, size_t) const;
537    void bindAllocation(sp<Allocation> va, uint32_t slot) const;
538    void setVar(uint32_t index, const void *, size_t len) const;
539    void setVar(uint32_t index, sp<const BaseObj> o) const;
540    void invoke(uint32_t slot, const void *v, size_t len) const;
541
542
543    void invoke(uint32_t slot) const {
544        invoke(slot, NULL, 0);
545    }
546    void setVar(uint32_t index, float v) const {
547        setVar(index, &v, sizeof(v));
548    }
549    void setVar(uint32_t index, double v) const {
550        setVar(index, &v, sizeof(v));
551    }
552    void setVar(uint32_t index, int32_t v) const {
553        setVar(index, &v, sizeof(v));
554    }
555    void setVar(uint32_t index, int64_t v) const {
556        setVar(index, &v, sizeof(v));
557    }
558    void setVar(uint32_t index, bool v) const {
559        setVar(index, &v, sizeof(v));
560    }
561
562public:
563    class FieldBase {
564    protected:
565        sp<const Element> mElement;
566        sp<Allocation> mAllocation;
567
568        void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
569
570    public:
571        sp<const Element> getElement() {
572            return mElement;
573        }
574
575        sp<const Type> getType() {
576            return mAllocation->getType();
577        }
578
579        sp<const Allocation> getAllocation() {
580            return mAllocation;
581        }
582
583        //void updateAllocation();
584    };
585};
586
587class ScriptC : public Script {
588protected:
589    ScriptC(sp<RS> rs,
590            const void *codeTxt, size_t codeLength,
591            const char *cachedName, size_t cachedNameLength,
592            const char *cacheDir, size_t cacheDirLength);
593
594};
595
596class ScriptIntrinsic : public Script {
597 protected:
598    ScriptIntrinsic(sp<RS> rs, int id, Element *e);
599};
600
601class ScriptIntrinsicBlend : public ScriptIntrinsic {
602 public:
603    ScriptIntrinsicBlend(sp<RS> rs, Element *e);
604    void blendClear(sp<Allocation> in, sp<Allocation> out);
605    void blendSrc(sp<Allocation> in, sp<Allocation> out);
606    void blendDst(sp<Allocation> in, sp<Allocation> out);
607    void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
608    void blendDstOver(sp<Allocation> in, sp<Allocation> out);
609    void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
610    void blendDstIn(sp<Allocation> in, sp<Allocation> out);
611    void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
612    void blendDstOut(sp<Allocation> in, sp<Allocation> out);
613    void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
614    void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
615    void blendXor(sp<Allocation> in, sp<Allocation> out);
616    void blendMultiply(sp<Allocation> in, sp<Allocation> out);
617    void blendAdd(sp<Allocation> in, sp<Allocation> out);
618    void blendSubtract(sp<Allocation> in, sp<Allocation> out);
619};
620
621class ScriptIntrinsicBlur : public ScriptIntrinsic {
622 public:
623    ScriptIntrinsicBlur(sp<RS> rs, Element *e);
624    void blur(sp<Allocation> in, sp<Allocation> out);
625    void setRadius(float radius);
626};
627
628}
629
630}
631
632#endif
633