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_ELEMENT_H__
18#define __ANDROID_ELEMENT_H__
19
20#include <rs.h>
21#include "RenderScript.h"
22#include "BaseObj.h"
23
24namespace android {
25namespace renderscriptCpp {
26
27class Element : public BaseObj {
28public:
29    /**
30     * Return if a element is too complex for use as a data source for a Mesh or
31     * a Program.
32     *
33     * @return boolean
34     */
35    bool isComplex();
36
37    /**
38    * @hide
39    * @return number of sub-elements in this element
40    */
41    size_t getSubElementCount() {
42        return mVisibleElementMap.size();
43    }
44
45    /**
46    * @hide
47    * @param index index of the sub-element to return
48    * @return sub-element in this element at given index
49    */
50    sp<const Element> getSubElement(uint32_t index);
51
52    /**
53    * @hide
54    * @param index index of the sub-element
55    * @return sub-element in this element at given index
56    */
57    const char * getSubElementName(uint32_t index);
58
59    /**
60    * @hide
61    * @param index index of the sub-element
62    * @return array size of sub-element in this element at given index
63    */
64    size_t getSubElementArraySize(uint32_t index);
65
66    /**
67    * @hide
68    * @param index index of the sub-element
69    * @return offset in bytes of sub-element in this element at given index
70    */
71    uint32_t getSubElementOffsetBytes(uint32_t index);
72
73    /**
74    * @hide
75    * @return element data type
76    */
77    RsDataType getDataType() const {
78        return mType;
79    }
80
81    /**
82    * @hide
83    * @return element data kind
84    */
85    RsDataKind getDataKind() const {
86        return mKind;
87    }
88
89    size_t getSizeBytes() const {
90        return mSizeBytes;
91    }
92
93
94    static sp<const Element> BOOLEAN(RenderScript *rs);
95    static sp<const Element> U8(RenderScript *rs);
96    static sp<const Element> I8(RenderScript *rs);
97    static sp<const Element> U16(RenderScript *rs);
98    static sp<const Element> I16(RenderScript *rs);
99    static sp<const Element> U32(RenderScript *rs);
100    static sp<const Element> I32(RenderScript *rs);
101    static sp<const Element> U64(RenderScript *rs);
102    static sp<const Element> I64(RenderScript *rs);
103    static sp<const Element> F32(RenderScript *rs);
104    static sp<const Element> F64(RenderScript *rs);
105    static sp<const Element> ELEMENT(RenderScript *rs);
106    static sp<const Element> TYPE(RenderScript *rs);
107    static sp<const Element> ALLOCATION(RenderScript *rs);
108    static sp<const Element> SAMPLER(RenderScript *rs);
109    static sp<const Element> SCRIPT(RenderScript *rs);
110    static sp<const Element> MESH(RenderScript *rs);
111    static sp<const Element> PROGRAM_FRAGMENT(RenderScript *rs);
112    static sp<const Element> PROGRAM_VERTEX(RenderScript *rs);
113    static sp<const Element> PROGRAM_RASTER(RenderScript *rs);
114    static sp<const Element> PROGRAM_STORE(RenderScript *rs);
115
116    static sp<const Element> A_8(RenderScript *rs);
117    static sp<const Element> RGB_565(RenderScript *rs);
118    static sp<const Element> RGB_888(RenderScript *rs);
119    static sp<const Element> RGBA_5551(RenderScript *rs);
120    static sp<const Element> RGBA_4444(RenderScript *rs);
121    static sp<const Element> RGBA_8888(RenderScript *rs);
122
123    static sp<const Element> F32_2(RenderScript *rs);
124    static sp<const Element> F32_3(RenderScript *rs);
125    static sp<const Element> F32_4(RenderScript *rs);
126    static sp<const Element> F64_2(RenderScript *rs);
127    static sp<const Element> F64_3(RenderScript *rs);
128    static sp<const Element> F64_4(RenderScript *rs);
129    static sp<const Element> U8_2(RenderScript *rs);
130    static sp<const Element> U8_3(RenderScript *rs);
131    static sp<const Element> U8_4(RenderScript *rs);
132    static sp<const Element> I8_2(RenderScript *rs);
133    static sp<const Element> I8_3(RenderScript *rs);
134    static sp<const Element> I8_4(RenderScript *rs);
135    static sp<const Element> U16_2(RenderScript *rs);
136    static sp<const Element> U16_3(RenderScript *rs);
137    static sp<const Element> U16_4(RenderScript *rs);
138    static sp<const Element> I16_2(RenderScript *rs);
139    static sp<const Element> I16_3(RenderScript *rs);
140    static sp<const Element> I16_4(RenderScript *rs);
141    static sp<const Element> U32_2(RenderScript *rs);
142    static sp<const Element> U32_3(RenderScript *rs);
143    static sp<const Element> U32_4(RenderScript *rs);
144    static sp<const Element> I32_2(RenderScript *rs);
145    static sp<const Element> I32_3(RenderScript *rs);
146    static sp<const Element> I32_4(RenderScript *rs);
147    static sp<const Element> U64_2(RenderScript *rs);
148    static sp<const Element> U64_3(RenderScript *rs);
149    static sp<const Element> U64_4(RenderScript *rs);
150    static sp<const Element> I64_2(RenderScript *rs);
151    static sp<const Element> I64_3(RenderScript *rs);
152    static sp<const Element> I64_4(RenderScript *rs);
153    static sp<const Element> MATRIX_4X4(RenderScript *rs);
154    static sp<const Element> MATRIX_3X3(RenderScript *rs);
155    static sp<const Element> MATRIX_2X2(RenderScript *rs);
156
157    Element(void *id, RenderScript *rs,
158            android::Vector<sp</*const*/ Element> > &elements,
159            android::Vector<android::String8> &elementNames,
160            android::Vector<uint32_t> &arraySizes);
161    Element(void *id, RenderScript *rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
162    Element(RenderScript *rs);
163    virtual ~Element();
164
165    void updateFromNative();
166    static sp<const Element> createUser(RenderScript *rs, RsDataType dt);
167    static sp<const Element> createVector(RenderScript *rs, RsDataType dt, uint32_t size);
168    static sp<const Element> createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk);
169    bool isCompatible(sp<const Element>e);
170
171    class Builder {
172    private:
173        RenderScript *mRS;
174        android::Vector<sp</*const*/ Element> > mElements;
175        android::Vector<android::String8> mElementNames;
176        android::Vector<uint32_t> mArraySizes;
177        bool mSkipPadding;
178
179    public:
180        Builder(RenderScript *rs);
181        ~Builder();
182        void add(sp</*const*/ Element>, android::String8 &name, uint32_t arraySize = 1);
183        sp<const Element> create();
184    };
185
186private:
187    void updateVisibleSubElements();
188
189    android::Vector<sp</*const*/ Element> > mElements;
190    android::Vector<android::String8> mElementNames;
191    android::Vector<uint32_t> mArraySizes;
192    android::Vector<uint32_t> mVisibleElementMap;
193    android::Vector<uint32_t> mOffsetInBytes;
194
195    RsDataType mType;
196    RsDataKind mKind;
197    bool mNormalized;
198    size_t mSizeBytes;
199    size_t mVectorSize;
200};
201
202}
203}
204#endif
205