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