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