136e612a488511940b61f09803b270aa1c61b68e0Jason Sams/*
2dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams * Copyright (C) 2013 The Android Open Source Project
336e612a488511940b61f09803b270aa1c61b68e0Jason Sams *
436e612a488511940b61f09803b270aa1c61b68e0Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
536e612a488511940b61f09803b270aa1c61b68e0Jason Sams * you may not use this file except in compliance with the License.
636e612a488511940b61f09803b270aa1c61b68e0Jason Sams * You may obtain a copy of the License at
736e612a488511940b61f09803b270aa1c61b68e0Jason Sams *
836e612a488511940b61f09803b270aa1c61b68e0Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
936e612a488511940b61f09803b270aa1c61b68e0Jason Sams *
1036e612a488511940b61f09803b270aa1c61b68e0Jason Sams * Unless required by applicable law or agreed to in writing, software
1136e612a488511940b61f09803b270aa1c61b68e0Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1236e612a488511940b61f09803b270aa1c61b68e0Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1336e612a488511940b61f09803b270aa1c61b68e0Jason Sams * See the License for the specific language governing permissions and
1436e612a488511940b61f09803b270aa1c61b68e0Jason Sams * limitations under the License.
1536e612a488511940b61f09803b270aa1c61b68e0Jason Sams */
1636e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1736e612a488511940b61f09803b270aa1c61b68e0Jason Samspackage android.renderscript;
1836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
20c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>An Element represents one item within an {@link
21c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation}.  An Element is roughly equivalent to a C
22c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * type in a RenderScript kernel. Elements may be basic or complex. Some basic
23c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * elements are</p> <ul> <li>A single float value (equivalent to a float in a
24c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel)</li> <li>A four-element float vector (equivalent to a float4 in a
25c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel)</li> <li>An unsigned 32-bit integer (equivalent to an unsigned int in
26c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * a kernel)</li> <li>A single signed 8-bit integer (equivalent to a char in a
27c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel)</li> </ul> <p>A complex element is roughly equivalent to a C struct
28c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * and contains a number of basic or complex Elements. From Java code, a complex
29c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * element contains a list of sub-elements and names that represents a
30c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * particular data structure. Structs used in RS scripts are available to Java
31c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * code by using the {@code ScriptField_structname} class that is reflected from
32c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * a particular script.</p>
33a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
34c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>Basic Elements are comprised of a {@link
35c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Element.DataType} and a {@link
36c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Element.DataKind}. The DataType encodes C type
37c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * information of an Element, while the DataKind encodes how that Element should
38c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * be interpreted by a {@link android.renderscript.Sampler}. Note that {@link
39c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation} objects with DataKind {@link
40c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Element.DataKind#USER} cannot be used as input for a
41c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * {@link android.renderscript.Sampler}. In general, {@link
42c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation} objects that are intended for use with a
43c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * {@link android.renderscript.Sampler} should use bitmap-derived Elements such
44c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * as {@link android.renderscript.Element#RGBA_8888} or {@link
45c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript#Element.A_8}.</p>
463aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
473aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
483aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
49c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>For more information about creating an application that uses RenderScript, read the
50c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
513aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
5236e612a488511940b61f09803b270aa1c61b68e0Jason Sams **/
5336e612a488511940b61f09803b270aa1c61b68e0Jason Samspublic class Element extends BaseObj {
54ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    int mSize;
55718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    Element[] mElements;
56718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    String[] mElementNames;
5770d4e5024298f71edb3b04867e05568f5495b4ceJason Sams    int[] mArraySizes;
587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    int[] mOffsetInBytes;
59ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
603aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk    int[] mVisibleElementMap;
613aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
62718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    DataType mType;
63718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    DataKind mKind;
64718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    boolean mNormalized;
65718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int mVectorSize;
66718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
673aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk    private void updateVisibleSubElements() {
683aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mElements == null) {
693aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            return;
703aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        }
713aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
723aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        int noPaddingFieldCount = 0;
733aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        int fieldCount = mElementNames.length;
743aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        // Find out how many elements are not padding
753aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        for (int ct = 0; ct < fieldCount; ct ++) {
763aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            if (mElementNames[ct].charAt(0) != '#') {
773aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk                noPaddingFieldCount ++;
783aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            }
793aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        }
803aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        mVisibleElementMap = new int[noPaddingFieldCount];
813aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
823aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        // Make a map that points us at non-padding elements
833aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        for (int ct = 0, ctNoPadding = 0; ct < fieldCount; ct ++) {
843aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            if (mElementNames[ct].charAt(0) != '#') {
853aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk                mVisibleElementMap[ctNoPadding ++] = ct;
863aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            }
873aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        }
883aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk    }
893aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
909c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return element size in bytes
927d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
93918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    public int getBytesSize() {return mSize;}
94718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
96918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * Returns the number of vector components. 2 for float2, 4 for
97918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * float4, etc.
98fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk    * @return element vector size
99fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk    */
100fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk    public int getVectorSize() {return mVectorSize;}
101fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk
102a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
1039c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
104a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * DataType represents the basic type information for a basic element.  The
105f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * naming convention follows.  For numeric types it is FLOAT,
106f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
107f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * size of the data.  BOOLEAN is a true / false (1,0)
108f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * represented in an 8 bit container.  The UNSIGNED variants
109f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * with multiple bit definitions are for packed graphical data
110f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * formats and represent vectors with per vector member sizes
111f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * which are treated as a single unit for packing and alignment
112f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * purposes.
113a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
114a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * MATRIX the three matrix types contain FLOAT_32 elements and are treated
115a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * as 32 bits for alignment purposes.
116a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
117fb4f5cf614091f7876c6a895ad81f00b7837cd03Jason Sams     * RS_* objects:  opaque handles with implementation dependent
118fb4f5cf614091f7876c6a895ad81f00b7837cd03Jason Sams     * sizes.
119a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
120718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public enum DataType {
1213aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        NONE (0, 0),
122a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        FLOAT_16 (1, 2),
123718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        FLOAT_32 (2, 4),
12402f41705199336f808ece50d81585450e7f8f61fStephen Hines        FLOAT_64 (3, 8),
125718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_8 (4, 1),
126718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_16 (5, 2),
127718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_32 (6, 4),
128ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        SIGNED_64 (7, 8),
129718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_8 (8, 1),
130718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_16 (9, 2),
131718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_32 (10, 4),
13252d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        UNSIGNED_64 (11, 8),
133718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
134f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        BOOLEAN(12, 1),
135f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
136f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_5_6_5 (13, 2),
137f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_5_5_5_1 (14, 2),
138f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_4_4_4_4 (15, 2),
139f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
1401d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_4X4 (16, 64),
1411d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_3X3 (17, 36),
1421d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_2X2 (18, 16),
1431d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
144b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_ELEMENT (1000),
145b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_TYPE (1001),
146b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_ALLOCATION (1002),
147b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_SAMPLER (1003),
148b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_SCRIPT (1004),
149b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_MESH (1005),
150b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_PROGRAM_FRAGMENT (1006),
151b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_PROGRAM_VERTEX (1007),
152b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_PROGRAM_RASTER (1008),
153b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_PROGRAM_STORE (1009),
154b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        RS_FONT (1010);
155718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
156718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mID;
157718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mSize;
158718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        DataType(int id, int size) {
159718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mID = id;
160718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mSize = size;
161718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
162b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams
163b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        DataType(int id) {
164b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams            mID = id;
165b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams            mSize = 4;
166b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams            if (RenderScript.sPointerSize == 8) {
167b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams                mSize = 32;
168b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams            }
169b49dfeaea96375b3b8fc1921f8b891c340f0baf2Jason Sams        }
170768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
171768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
1729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
173a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * The special interpretation of the data if required.  This is primarly
174a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * useful for graphical data.  USER indicates no special interpretation is
175a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * expected.  PIXEL is used in conjunction with the standard data types for
176a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * representing texture formats.
177a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
178718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public enum DataKind {
179718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        USER (0),
180718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
181718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_L (7),
182718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_A (8),
183718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_LA (9),
184718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_RGB (10),
1858e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        PIXEL_RGBA (11),
1868140d7b0f62a6e5b54e318c959f2d501f7ee6784Jason Sams        PIXEL_DEPTH (12),
1878140d7b0f62a6e5b54e318c959f2d501f7ee6784Jason Sams        PIXEL_YUV(13);
188718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
189718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mID;
190718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        DataKind(int id) {
191718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mID = id;
192ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams        }
19336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
19436e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
196a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if a element is too complex for use as a data source for a Mesh or
197a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * a Program.
198a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
199a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
200a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
201c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams    public boolean isComplex() {
202c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        if (mElements == null) {
203c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            return false;
204c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        }
205c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        for (int ct=0; ct < mElements.length; ct++) {
206c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            if (mElements[ct].mElements != null) {
207c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams                return true;
208c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            }
209c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        }
210c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        return false;
211c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams    }
212c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams
2139c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
214918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * Elements could be simple, such as an int or a float, or a
215918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * structure with multiple sub elements, such as a collection of
216918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * floats, float2, float4. This function returns zero for simple
217918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * elements or the number of sub-elements otherwise.
2187d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return number of sub-elements in this element
2197d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2207d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public int getSubElementCount() {
2213aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2227d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            return 0;
2237d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2243aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mVisibleElementMap.length;
2257d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2267d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2279c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
228918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * For complex elements, this function will return the
229918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sub-element at index
2307d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element to return
2317d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return sub-element in this element at given index
2327d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2337d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Element getSubElement(int index) {
2343aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2357d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2367d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2373aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2387d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2397d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2403aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mElements[mVisibleElementMap[index]];
2417d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2427d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
244918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * For complex elements, this function will return the
245918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sub-element name at index
2467d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element
2477d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return sub-element in this element at given index
2487d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2497d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public String getSubElementName(int index) {
2503aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2527d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2533aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2547d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2557d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2563aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mElementNames[mVisibleElementMap[index]];
2577d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2599c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
260918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * For complex elements, some sub-elements could be statically
261918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sized arrays. This function will return the array size for
262918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sub-element at index
2637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element
2647d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return array size of sub-element in this element at given index
2657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2667d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public int getSubElementArraySize(int index) {
2673aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2703aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2717d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2733aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mArraySizes[mVisibleElementMap[index]];
2747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2769c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
277918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * This function specifies the location of a sub-element within
278918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * the element
2797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element
2807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return offset in bytes of sub-element in this element at given index
2817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public int getSubElementOffsetBytes(int index) {
2833aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2857d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2863aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2887d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2893aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mOffsetInBytes[mVisibleElementMap[index]];
2907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2929c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
293f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    * @return element data type
294f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    */
295f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    public DataType getDataType() {
296f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk        return mType;
297f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    }
298f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk
2999c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
300f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    * @return element data kind
301f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    */
302f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    public DataKind getDataKind() {
303f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk        return mKind;
304f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    }
305f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk
3069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
307a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single Boolean.
308a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
309a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
310a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
311a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
312a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
313f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    public static Element BOOLEAN(RenderScript rs) {
3146bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_BOOLEAN == null) {
3156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_BOOLEAN == null) {
3176bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_BOOLEAN = createUser(rs, DataType.BOOLEAN);
3186bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3196bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
320f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        }
321f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        return rs.mElement_BOOLEAN;
322f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    }
323f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
3249c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
325a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single UNSIGNED_8.
326a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
327a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
328a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
329a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
330a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
3318cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U8(RenderScript rs) {
3326bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_U8 == null) {
3336bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3346bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_U8 == null) {
3356bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_U8 = createUser(rs, DataType.UNSIGNED_8);
3366bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3376bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
3383c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3398cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_U8;
3403c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
341ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
3429c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
343a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single SIGNED_8.
344a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
345a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
346a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
347a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
348a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
3498cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element I8(RenderScript rs) {
3506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_I8 == null) {
3516bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3526bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_I8 == null) {
3536bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_I8 = createUser(rs, DataType.SIGNED_8);
3546bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3556bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
3563c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3578cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_I8;
3583c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3593c0dfbab807a459622aeade4940daddf482dec66Jason Sams
360e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    public static Element U16(RenderScript rs) {
3616bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_U16 == null) {
3626bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3636bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_U16 == null) {
3646bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_U16 = createUser(rs, DataType.UNSIGNED_16);
3656bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3666bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
367e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        }
368e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        return rs.mElement_U16;
369e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    }
370e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams
371e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    public static Element I16(RenderScript rs) {
3726bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_I16 == null) {
3736bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3746bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_I16 == null) {
3756bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_I16 = createUser(rs, DataType.SIGNED_16);
3766bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3776bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
378e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        }
379e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        return rs.mElement_I16;
380e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    }
381e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams
3828cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U32(RenderScript rs) {
3836bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_U32 == null) {
3846bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3856bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_U32 == null) {
3866bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_U32 = createUser(rs, DataType.UNSIGNED_32);
3876bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3886bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
3893c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3908cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_U32;
3913c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3923c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3938cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element I32(RenderScript rs) {
3946bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_I32 == null) {
3956bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
3966bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_I32 == null) {
3976bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_I32 = createUser(rs, DataType.SIGNED_32);
3986bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
3996bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
4003c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
4018cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_I32;
4023c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
4033c0dfbab807a459622aeade4940daddf482dec66Jason Sams
40452d836332f6aae74ed97fda1b53681f36710af64Stephen Hines    public static Element U64(RenderScript rs) {
4056bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_U64 == null) {
4066bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4076bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_U64 == null) {
4086bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_U64 = createUser(rs, DataType.UNSIGNED_64);
4096bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4106bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
41152d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        }
41252d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        return rs.mElement_U64;
41352d836332f6aae74ed97fda1b53681f36710af64Stephen Hines    }
41452d836332f6aae74ed97fda1b53681f36710af64Stephen Hines
415ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines    public static Element I64(RenderScript rs) {
4166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_I64 == null) {
4176bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4186bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_I64 == null) {
4196bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_I64 = createUser(rs, DataType.SIGNED_64);
4206bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4216bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
422ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        }
423ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        return rs.mElement_I64;
424ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines    }
425ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines
426a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    public static Element F16(RenderScript rs) {
4276bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_F16 == null) {
4286bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4296bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_F16 == null) {
4306bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_F16 = createUser(rs, DataType.FLOAT_16);
4316bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4326bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
433a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        }
434a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        return rs.mElement_F16;
435a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    }
436a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams
4378cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32(RenderScript rs) {
4386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_F32 == null) {
4396bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4406bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_F32 == null) {
4416bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_F32 = createUser(rs, DataType.FLOAT_32);
4426bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4436bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
4443c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
4458cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_F32;
4463c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
4473c0dfbab807a459622aeade4940daddf482dec66Jason Sams
44802f41705199336f808ece50d81585450e7f8f61fStephen Hines    public static Element F64(RenderScript rs) {
4496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_F64 == null) {
4506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4516bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_F64 == null) {
4526bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_F64 = createUser(rs, DataType.FLOAT_64);
4536bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4546bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
45502f41705199336f808ece50d81585450e7f8f61fStephen Hines        }
45602f41705199336f808ece50d81585450e7f8f61fStephen Hines        return rs.mElement_F64;
45702f41705199336f808ece50d81585450e7f8f61fStephen Hines    }
45802f41705199336f808ece50d81585450e7f8f61fStephen Hines
4598cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element ELEMENT(RenderScript rs) {
4606bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_ELEMENT == null) {
4616bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4626bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_ELEMENT == null) {
4636bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_ELEMENT = createUser(rs, DataType.RS_ELEMENT);
4646bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4656bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
466a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4678cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_ELEMENT;
468a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
469a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4708cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element TYPE(RenderScript rs) {
4716bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_TYPE == null) {
4726bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4736bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_TYPE == null) {
4746bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_TYPE = createUser(rs, DataType.RS_TYPE);
4756bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4766bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
477a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4788cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_TYPE;
479a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
480a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4818cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element ALLOCATION(RenderScript rs) {
4826bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_ALLOCATION == null) {
4836bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4846bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_ALLOCATION == null) {
4856bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_ALLOCATION = createUser(rs, DataType.RS_ALLOCATION);
4866bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4876bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
488a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4898cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_ALLOCATION;
490a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
491a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4928cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element SAMPLER(RenderScript rs) {
4936bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_SAMPLER == null) {
4946bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
4956bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_SAMPLER == null) {
4966bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_SAMPLER = createUser(rs, DataType.RS_SAMPLER);
4976bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
4986bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
499a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5008cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_SAMPLER;
501a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
502a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5038cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element SCRIPT(RenderScript rs) {
5046bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_SCRIPT == null) {
5056bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5066bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_SCRIPT == null) {
5076bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_SCRIPT = createUser(rs, DataType.RS_SCRIPT);
5086bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5096bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
510a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5118cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_SCRIPT;
512a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
513a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5148cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element MESH(RenderScript rs) {
5156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_MESH == null) {
5166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5176bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_MESH == null) {
5186bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_MESH = createUser(rs, DataType.RS_MESH);
5196bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5206bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
521a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5228cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_MESH;
523a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
524a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5258cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_FRAGMENT(RenderScript rs) {
5266bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_PROGRAM_FRAGMENT == null) {
5276bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5286bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_PROGRAM_FRAGMENT == null) {
5296bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_PROGRAM_FRAGMENT = createUser(rs, DataType.RS_PROGRAM_FRAGMENT);
5306bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5316bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
532a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5338cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_FRAGMENT;
534a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
535a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5368cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_VERTEX(RenderScript rs) {
5376bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_PROGRAM_VERTEX == null) {
5386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5396bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_PROGRAM_VERTEX == null) {
5406bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_PROGRAM_VERTEX = createUser(rs, DataType.RS_PROGRAM_VERTEX);
5416bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5426bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
543a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5448cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_VERTEX;
545a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
546a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5478cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_RASTER(RenderScript rs) {
5486bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_PROGRAM_RASTER == null) {
5496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_PROGRAM_RASTER == null) {
5516bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_PROGRAM_RASTER = createUser(rs, DataType.RS_PROGRAM_RASTER);
5526bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5536bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
554a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5558cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_RASTER;
556a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
557a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5588cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_STORE(RenderScript rs) {
5596bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_PROGRAM_STORE == null) {
5606bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5616bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_PROGRAM_STORE == null) {
5626bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_PROGRAM_STORE = createUser(rs, DataType.RS_PROGRAM_STORE);
5636bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5646bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
565a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
5668cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_STORE;
567a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
568a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
5693a2914132146f340511425d7f78540098606b512Stephen Hines    public static Element FONT(RenderScript rs) {
5706bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_FONT == null) {
5716bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5726bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_FONT == null) {
5736bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_FONT = createUser(rs, DataType.RS_FONT);
5746bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5756bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
5763a2914132146f340511425d7f78540098606b512Stephen Hines        }
5773a2914132146f340511425d7f78540098606b512Stephen Hines        return rs.mElement_FONT;
5783a2914132146f340511425d7f78540098606b512Stephen Hines    }
5793a2914132146f340511425d7f78540098606b512Stephen Hines
5803c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element A_8(RenderScript rs) {
5816bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_A_8 == null) {
5826bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5836bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_A_8 == null) {
5846bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
5856bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5866bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
5873c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5883c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_A_8;
5893c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
5903c0dfbab807a459622aeade4940daddf482dec66Jason Sams
5913c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGB_565(RenderScript rs) {
5926bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_RGB_565 == null) {
5936bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
5946bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_RGB_565 == null) {
5956bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
5966bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
5976bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
5983c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5993c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGB_565;
6003c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
6013c0dfbab807a459622aeade4940daddf482dec66Jason Sams
6023c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGB_888(RenderScript rs) {
6036bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_RGB_888 == null) {
6046bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6056bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_RGB_888 == null) {
6066bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
6076bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6086bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
6093c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
6103c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGB_888;
6113c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
6123c0dfbab807a459622aeade4940daddf482dec66Jason Sams
6133c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_5551(RenderScript rs) {
6146bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_RGBA_5551 == null) {
6156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_RGBA_5551 == null) {
6176bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
6186bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6196bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
6203c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
6213c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_5551;
6223c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
6233c0dfbab807a459622aeade4940daddf482dec66Jason Sams
6243c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_4444(RenderScript rs) {
6256bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_RGBA_4444 == null) {
6266bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6276bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_RGBA_4444 == null) {
6286bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
6296bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6306bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
6313c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
6323c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_4444;
6333c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
6343c0dfbab807a459622aeade4940daddf482dec66Jason Sams
6353c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_8888(RenderScript rs) {
6366bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_RGBA_8888 == null) {
6376bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_RGBA_8888 == null) {
6396bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
6406bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6416bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
6423c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
6433c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_8888;
6443c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
6453c0dfbab807a459622aeade4940daddf482dec66Jason Sams
646a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    public static Element F16_2(RenderScript rs) {
6476bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_HALF_2 == null) {
6486bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_HALF_2 == null) {
6506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_HALF_2 = createVector(rs, DataType.FLOAT_16, 2);
6516bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6526bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
653a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        }
654a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        return rs.mElement_HALF_2;
655a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    }
656a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams
657a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    public static Element F16_3(RenderScript rs) {
6586bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_HALF_3 == null) {
6596bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6606bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_HALF_3 == null) {
6616bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_HALF_3 = createVector(rs, DataType.FLOAT_16, 3);
6626bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6636bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
664a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        }
665a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        return rs.mElement_HALF_3;
666a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    }
667a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams
668a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    public static Element F16_4(RenderScript rs) {
6696bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_HALF_4 == null) {
6706bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6716bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_HALF_4 == null) {
6726bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_HALF_4 = createVector(rs, DataType.FLOAT_16, 4);
6736bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6746bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
675a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        }
676a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams        return rs.mElement_HALF_4;
677a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams    }
678a5835a2e5fdb98fdf03a223ddf7e082ba1020807Jason Sams
6798cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_2(RenderScript rs) {
6806bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_FLOAT_2 == null) {
6816bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6826bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_FLOAT_2 == null) {
6836bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_FLOAT_2 = createVector(rs, DataType.FLOAT_32, 2);
6846bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6856bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
6863c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
6878cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_2;
6883c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
6893c0dfbab807a459622aeade4940daddf482dec66Jason Sams
6908cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_3(RenderScript rs) {
6916bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_FLOAT_3 == null) {
6926bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
6936bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_FLOAT_3 == null) {
6946bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_FLOAT_3 = createVector(rs, DataType.FLOAT_32, 3);
6956bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
6966bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
6973c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
6988cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_3;
69936e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
70036e612a488511940b61f09803b270aa1c61b68e0Jason Sams
7018cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_4(RenderScript rs) {
7026bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_FLOAT_4 == null) {
7036bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7046bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_FLOAT_4 == null) {
7056bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_FLOAT_4 = createVector(rs, DataType.FLOAT_32, 4);
7066bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7076bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
708718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
7098cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_4;
7103c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
71136e612a488511940b61f09803b270aa1c61b68e0Jason Sams
712836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element F64_2(RenderScript rs) {
7136bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_DOUBLE_2 == null) {
7146bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_DOUBLE_2 == null) {
7166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_DOUBLE_2 = createVector(rs, DataType.FLOAT_64, 2);
7176bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7186bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
719836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
720836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_DOUBLE_2;
721836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
722836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
723836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element F64_3(RenderScript rs) {
7246bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_DOUBLE_3 == null) {
7256bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7266bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_DOUBLE_3 == null) {
7276bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_DOUBLE_3 = createVector(rs, DataType.FLOAT_64, 3);
7286bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7296bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
730836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
731836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_DOUBLE_3;
732836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
733836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
734836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element F64_4(RenderScript rs) {
7356bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_DOUBLE_4 == null) {
7366bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7376bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_DOUBLE_4 == null) {
7386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_DOUBLE_4 = createVector(rs, DataType.FLOAT_64, 4);
7396bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7406bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
741836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
742836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_DOUBLE_4;
743836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
744836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
745836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U8_2(RenderScript rs) {
7466bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_UCHAR_2 == null) {
7476bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7486bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_UCHAR_2 == null) {
7496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_UCHAR_2 = createVector(rs, DataType.UNSIGNED_8, 2);
7506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7516bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
752836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
753836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UCHAR_2;
754836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
755836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
756836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U8_3(RenderScript rs) {
7576bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_UCHAR_3 == null) {
7586bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7596bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_UCHAR_3 == null) {
7606bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_UCHAR_3 = createVector(rs, DataType.UNSIGNED_8, 3);
7616bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7626bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
763836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
764836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UCHAR_3;
765836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
766836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
7678cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U8_4(RenderScript rs) {
7686bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_UCHAR_4 == null) {
7696bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7706bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_UCHAR_4 == null) {
7716bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_UCHAR_4 = createVector(rs, DataType.UNSIGNED_8, 4);
7726bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7736bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
77436e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
7758cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_UCHAR_4;
77636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
77736e612a488511940b61f09803b270aa1c61b68e0Jason Sams
778836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I8_2(RenderScript rs) {
7796bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_CHAR_2 == null) {
7806bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7816bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_CHAR_2 == null) {
7826bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_CHAR_2 = createVector(rs, DataType.SIGNED_8, 2);
7836bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7846bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
785836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
786836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_CHAR_2;
787836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
788836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
789836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I8_3(RenderScript rs) {
7906bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_CHAR_3 == null) {
7916bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
7926bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_CHAR_3 == null) {
7936bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_CHAR_3 = createVector(rs, DataType.SIGNED_8, 3);
7946bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
7956bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
796836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
797836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_CHAR_3;
798836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
799836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
800836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I8_4(RenderScript rs) {
8016bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_CHAR_4 == null) {
8026bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8036bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_CHAR_4 == null) {
8046bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_CHAR_4 = createVector(rs, DataType.SIGNED_8, 4);
8056bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8066bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
807836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
808836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_CHAR_4;
809836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
810836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
811836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U16_2(RenderScript rs) {
8126bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_USHORT_2 == null) {
8136bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8146bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_USHORT_2 == null) {
8156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_USHORT_2 = createVector(rs, DataType.UNSIGNED_16, 2);
8166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8176bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
818836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
819836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_USHORT_2;
820836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
821836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
822836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U16_3(RenderScript rs) {
8236bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_USHORT_3 == null) {
8246bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8256bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_USHORT_3 == null) {
8266bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_USHORT_3 = createVector(rs, DataType.UNSIGNED_16, 3);
8276bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8286bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
829836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
830836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_USHORT_3;
831836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
832836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
833836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U16_4(RenderScript rs) {
8346bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_USHORT_4 == null) {
8356bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8366bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_USHORT_4 == null) {
8376bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_USHORT_4 = createVector(rs, DataType.UNSIGNED_16, 4);
8386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8396bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
840836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
841836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_USHORT_4;
842836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
843836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
844836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I16_2(RenderScript rs) {
8456bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_SHORT_2 == null) {
8466bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8476bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_SHORT_2 == null) {
8486bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_SHORT_2 = createVector(rs, DataType.SIGNED_16, 2);
8496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
851836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
852836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_SHORT_2;
853836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
854836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
855836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I16_3(RenderScript rs) {
8566bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_SHORT_3 == null) {
8576bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8586bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_SHORT_3 == null) {
8596bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_SHORT_3 = createVector(rs, DataType.SIGNED_16, 3);
8606bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8616bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
862836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
863836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_SHORT_3;
864836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
865836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
866836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I16_4(RenderScript rs) {
8676bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_SHORT_4 == null) {
8686bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8696bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_SHORT_4 == null) {
8706bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_SHORT_4 = createVector(rs, DataType.SIGNED_16, 4);
8716bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8726bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
873836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
874836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_SHORT_4;
875836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
876836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
877836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U32_2(RenderScript rs) {
8786bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_UINT_2 == null) {
8796bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8806bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_UINT_2 == null) {
8816bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_UINT_2 = createVector(rs, DataType.UNSIGNED_32, 2);
8826bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8836bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
884836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
885836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UINT_2;
886836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
887836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
888836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U32_3(RenderScript rs) {
8896bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_UINT_3 == null) {
8906bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
8916bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_UINT_3 == null) {
8926bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_UINT_3 = createVector(rs, DataType.UNSIGNED_32, 3);
8936bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
8946bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
895836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
896836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UINT_3;
897836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
898836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
899836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U32_4(RenderScript rs) {
9006bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_UINT_4 == null) {
9016bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9026bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_UINT_4 == null) {
9036bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_UINT_4 = createVector(rs, DataType.UNSIGNED_32, 4);
9046bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9056bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
906836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
907836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UINT_4;
908836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
909836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
910836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I32_2(RenderScript rs) {
9116bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_INT_2 == null) {
9126bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9136bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_INT_2 == null) {
9146bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_INT_2 = createVector(rs, DataType.SIGNED_32, 2);
9156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9166bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
917836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
918836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_INT_2;
919836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
920836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
921836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I32_3(RenderScript rs) {
9226bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_INT_3 == null) {
9236bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9246bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_INT_3 == null) {
9256bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_INT_3 = createVector(rs, DataType.SIGNED_32, 3);
9266bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9276bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
928836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
929836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_INT_3;
930836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
931836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
932836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I32_4(RenderScript rs) {
9336bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_INT_4 == null) {
9346bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9356bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_INT_4 == null) {
9366bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_INT_4 = createVector(rs, DataType.SIGNED_32, 4);
9376bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
939836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
940836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_INT_4;
941836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
942836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
943836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U64_2(RenderScript rs) {
9446bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_ULONG_2 == null) {
9456bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9466bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_ULONG_2 == null) {
9476bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_ULONG_2 = createVector(rs, DataType.UNSIGNED_64, 2);
9486bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
950836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
951836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_ULONG_2;
952836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
953836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
954836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U64_3(RenderScript rs) {
9556bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_ULONG_3 == null) {
9566bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9576bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_ULONG_3 == null) {
9586bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_ULONG_3 = createVector(rs, DataType.UNSIGNED_64, 3);
9596bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9606bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
961836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
962836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_ULONG_3;
963836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
964836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
965836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U64_4(RenderScript rs) {
9666bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_ULONG_4 == null) {
9676bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9686bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_ULONG_4 == null) {
9696bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_ULONG_4 = createVector(rs, DataType.UNSIGNED_64, 4);
9706bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9716bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
972836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
973836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_ULONG_4;
974836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
975836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
976836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I64_2(RenderScript rs) {
9776bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_LONG_2 == null) {
9786bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9796bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_LONG_2 == null) {
9806bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_LONG_2 = createVector(rs, DataType.SIGNED_64, 2);
9816bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9826bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
983836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
984836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_LONG_2;
985836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
986836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
987836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I64_3(RenderScript rs) {
9886bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_LONG_3 == null) {
9896bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
9906bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_LONG_3 == null) {
9916bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_LONG_3 = createVector(rs, DataType.SIGNED_64, 3);
9926bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
9936bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
994836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
995836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_LONG_3;
996836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
997836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
998836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I64_4(RenderScript rs) {
9996bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_LONG_4 == null) {
10006bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
10016bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_LONG_4 == null) {
10026bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_LONG_4 = createVector(rs, DataType.SIGNED_64, 4);
10036bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
10046bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
1005836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
1006836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_LONG_4;
1007836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
1008836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
1009932e78e9903342e3494983fd3463084caab4ba42Tim Murray    public static Element YUV(RenderScript rs) {
1010932e78e9903342e3494983fd3463084caab4ba42Tim Murray        if (rs.mElement_YUV == null) {
10116bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
10126bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_YUV == null) {
10136bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_YUV = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_YUV);
10146bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
10156bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
1016932e78e9903342e3494983fd3463084caab4ba42Tim Murray        }
1017932e78e9903342e3494983fd3463084caab4ba42Tim Murray        return rs.mElement_YUV;
1018932e78e9903342e3494983fd3463084caab4ba42Tim Murray    }
1019932e78e9903342e3494983fd3463084caab4ba42Tim Murray
10201d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_4X4(RenderScript rs) {
10216bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_MATRIX_4X4 == null) {
10226bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
10236bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_MATRIX_4X4 == null) {
10246bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
10256bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
10266bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
10271d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
10281d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return rs.mElement_MATRIX_4X4;
10291d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
103065c80f824711f084c4ece9204f543a7809534294Jason Sams
103165c80f824711f084c4ece9204f543a7809534294Jason Sams    /** @deprecated use MATRIX_4X4
103265c80f824711f084c4ece9204f543a7809534294Jason Sams    */
10331d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX4X4(RenderScript rs) {
10341d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return MATRIX_4X4(rs);
10351d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
10361d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
10371d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_3X3(RenderScript rs) {
10386bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_MATRIX_3X3 == null) {
10396bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
10406bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_MATRIX_3X3 == null) {
10416bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
10426bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
10436bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
10441d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
1045347697710d033036c533bd6cee409c4b4c19d437Alex Sakhartchouk        return rs.mElement_MATRIX_3X3;
10461d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
10471d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
10481d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_2X2(RenderScript rs) {
10496bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni        if (rs.mElement_MATRIX_2X2 == null) {
10506bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            synchronized (rs) {
10516bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                if (rs.mElement_MATRIX_2X2 == null) {
10526bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                    rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
10536bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni                }
10546bdfe0fc5c0845f91cf3ccad961d270ed2a49aa1Yang Ni            }
10551d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
10561d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return rs.mElement_MATRIX_2X2;
10571d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
105836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1059460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    Element(long id, RenderScript rs, Element[] e, String[] n, int[] as) {
10600de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
1061ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams        mSize = 0;
1062fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk        mVectorSize = 1;
1063718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mElements = e;
1064718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mElementNames = n;
106570d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        mArraySizes = as;
10663aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        mType = DataType.NONE;
10673aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        mKind = DataKind.USER;
10687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        mOffsetInBytes = new int[mElements.length];
1069718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        for (int ct = 0; ct < mElements.length; ct++ ) {
10707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mOffsetInBytes[ct] = mSize;
10719e401bcd88a0fdeea96f53cb776e5de7b5b084cbAlex Sakhartchouk            mSize += mElements[ct].mSize * mArraySizes[ct];
1072718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
10733aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        updateVisibleSubElements();
1074718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
1075718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
1076460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    Element(long id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
10770de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
1078252c07802f7039f15f723751162e64a6621e6998Jason Sams        if ((dt != DataType.UNSIGNED_5_6_5) &&
1079252c07802f7039f15f723751162e64a6621e6998Jason Sams            (dt != DataType.UNSIGNED_4_4_4_4) &&
1080252c07802f7039f15f723751162e64a6621e6998Jason Sams            (dt != DataType.UNSIGNED_5_5_5_1)) {
1081e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if (size == 3) {
1082e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSize = dt.mSize * 4;
1083e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            } else {
1084e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSize = dt.mSize * size;
1085e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            }
1086252c07802f7039f15f723751162e64a6621e6998Jason Sams        } else {
1087252c07802f7039f15f723751162e64a6621e6998Jason Sams            mSize = dt.mSize;
1088252c07802f7039f15f723751162e64a6621e6998Jason Sams        }
1089718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mType = dt;
1090718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mKind = dk;
1091718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mNormalized = norm;
1092718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mVectorSize = size;
109336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
109436e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1095460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    Element(long id, RenderScript rs) {
10960de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
1097dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1098dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1099dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
1100dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
110106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
1102dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1103dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
1104dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int[] dataBuffer = new int[5];
1105e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nElementGetNativeData(getID(mRS), dataBuffer);
11060de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk
11070de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mNormalized = dataBuffer[2] == 1 ? true : false;
11080de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mVectorSize = dataBuffer[3];
11090de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mSize = 0;
1110dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        for (DataType dt: DataType.values()) {
1111dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(dt.mID == dataBuffer[0]){
1112dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mType = dt;
11130de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mSize = mType.mSize * mVectorSize;
1114dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
1115dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
1116dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        for (DataKind dk: DataKind.values()) {
1117dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(dk.mID == dataBuffer[1]){
1118dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mKind = dk;
1119dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
1120dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
1121dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1122dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int numSubElements = dataBuffer[4];
1123dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(numSubElements > 0) {
1124dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElements = new Element[numSubElements];
1125dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElementNames = new String[numSubElements];
11267d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mArraySizes = new int[numSubElements];
11277d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mOffsetInBytes = new int[numSubElements];
1128dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11299807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] subElementIds = new long[numSubElements];
1130e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nElementGetSubElements(getID(mRS), subElementIds, mElementNames, mArraySizes);
1131dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            for(int i = 0; i < numSubElements; i ++) {
11320de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mElements[i] = new Element(subElementIds[i], mRS);
1133dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mElements[i].updateFromNative();
11347d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                mOffsetInBytes[i] = mSize;
11357d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                mSize += mElements[i].mSize * mArraySizes[i];
1136dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
1137dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
11383aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        updateVisibleSubElements();
1139dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
1140dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
11419c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1142a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a custom Element of the specified DataType.  The DataKind will be
1143a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * set to USER and the vector size to 1 indicating non-vector.
1144a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1145a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
1146a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
1147a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
1148a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1149bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    static Element createUser(RenderScript rs, DataType dt) {
11500de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        DataKind dk = DataKind.USER;
11510de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = false;
11520de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int vecSize = 1;
1153460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
11540de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, vecSize);
1155ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    }
1156ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
11579c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1158a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a custom vector element of the specified DataType and vector size.
11593beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * DataKind will be set to USER. Only primitive types (FLOAT_32, FLOAT_64,
11603beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, UNSIGNED_8, UNSIGNED_16,
11613beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * UNSIGNED_32, UNSIGNED_64, BOOLEAN) are supported.
1162a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1163a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
11643beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * @param dt The DataType for the new Element.
1165a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param size Vector size for the new Element.  Range 2-4 inclusive
1166a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *             supported.
1167a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1168a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
1169a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1170718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static Element createVector(RenderScript rs, DataType dt, int size) {
1171718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (size < 2 || size > 4) {
1172bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            throw new RSIllegalArgumentException("Vector size out of range 2-4.");
117336e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
11743beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines
11753beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        switch (dt) {
11763beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        // Support only primitive integer/float/boolean types as vectors.
117754371b4b095f3b15f0eceb7660eb320bbf34453fJason Sams        case FLOAT_16:
11783beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case FLOAT_32:
11793beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case FLOAT_64:
11803beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_8:
11813beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_16:
11823beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_32:
11833beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_64:
11843beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_8:
11853beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_16:
11863beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_32:
11873beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_64:
11883beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case BOOLEAN: {
11893beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            DataKind dk = DataKind.USER;
11903beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            boolean norm = false;
1191460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
11923beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            return new Element(id, rs, dt, dk, norm, size);
11933beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        }
11943beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines
11953beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        default: {
11963beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            throw new RSIllegalArgumentException("Cannot create vector of " +
11973beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines                "non-primitive type.");
11983beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        }
11993beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        }
1200718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
120136e612a488511940b61f09803b270aa1c61b68e0Jason Sams
12029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1203a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a new pixel Element type.  A matching DataType and DataKind must
1204a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * be provided.  The DataType and DataKind must contain the same number of
1205a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * components.  Vector size will be set to 1.
1206a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1207a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
1208a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
1209a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dk The DataKind to specify the mapping of each component in the
1210a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *           DataType.
1211a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1212a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
1213a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1214718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
1215718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (!(dk == DataKind.PIXEL_L ||
1216718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_A ||
1217718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_LA ||
1218718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_RGB ||
12198e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dk == DataKind.PIXEL_RGBA ||
1220dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams              dk == DataKind.PIXEL_DEPTH ||
1221dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams              dk == DataKind.PIXEL_YUV)) {
1222c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Unsupported DataKind");
122307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
1224718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (!(dt == DataType.UNSIGNED_8 ||
12258e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dt == DataType.UNSIGNED_16 ||
1226718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_5_6_5 ||
1227718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_4_4_4_4 ||
1228718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_5_5_5_1)) {
1229c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Unsupported DataType");
123007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
1231718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
1232c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
123307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
1234718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
1235c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
123625ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        }
1237718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
1238c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
123907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
12408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        if (dt == DataType.UNSIGNED_16 &&
12418e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            dk != DataKind.PIXEL_DEPTH) {
12428e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            throw new RSIllegalArgumentException("Bad kind and type combo");
12438e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
124407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
1245718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int size = 1;
12468e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        switch (dk) {
12478e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_LA:
1248718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 2;
12498e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
12508e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_RGB:
1251718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 3;
12528e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
12538e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_RGBA:
1254718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 4;
12558e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
12568e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_DEPTH:
12578e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            size = 2;
12588e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
1259334ea0c98f051b5a6b85bc616c93304651854298Jason Sams        }
1260334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
12610de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = true;
1262460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
12630de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, size);
1264718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
126507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
12669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1267f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * Check if the current Element is compatible with another Element.
1268f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * Primitive Elements are compatible if they share the same underlying
1269f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * size and type (i.e. U8 is compatible with A_8). User-defined Elements
1270f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * must be equal in order to be compatible. This requires strict name
1271f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * equivalence for all sub-Elements (in addition to structural equivalence).
1272f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     *
1273f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * @param e The Element to check compatibility with.
1274f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     *
1275f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * @return boolean true if the Elements are compatible, otherwise false.
1276f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     */
1277f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines    public boolean isCompatible(Element e) {
1278f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        // Try strict BaseObj equality to start with.
1279f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        if (this.equals(e)) {
1280f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines            return true;
1281f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        }
1282f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines
1283f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        // Ignore mKind because it is allowed to be different (user vs. pixel).
1284f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        // We also ignore mNormalized because it can be different. The mType
1285209481137147e64c72f1d5737085b17736931bdaStephen Hines        // field must not be NONE since we require name equivalence for
1286209481137147e64c72f1d5737085b17736931bdaStephen Hines        // all user-created Elements.
1287f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        return ((mSize == e.mSize) &&
1288209481137147e64c72f1d5737085b17736931bdaStephen Hines                (mType != DataType.NONE) &&
1289f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines                (mType == e.mType) &&
1290f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines                (mVectorSize == e.mVectorSize));
1291f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines    }
1292f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines
12939c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1294a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Builder class for producing complex elements with matching field and name
1295a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * pairs.  The builder starts empty.  The order in which elements are added
1296a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * is retained for the layout in memory.
1297a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1298a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1299718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static class Builder {
1300718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        RenderScript mRS;
1301718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        Element[] mElements;
1302718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        String[] mElementNames;
130370d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        int[] mArraySizes;
1304718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mCount;
1305e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk        int mSkipPadding;
1306334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
13079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1308a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create a builder object.
1309a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1310a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param rs
1311a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
1312718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        public Builder(RenderScript rs) {
1313718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mRS = rs;
1314718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mCount = 0;
1315718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElements = new Element[8];
1316718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElementNames = new String[8];
131770d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            mArraySizes = new int[8];
1318718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
1319718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
13209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1321a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add an array of elements to this element.
1322a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1323a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param element
1324a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param name
1325a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param arraySize
1326a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
1327bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder add(Element element, String name, int arraySize) {
132870d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            if (arraySize < 1) {
1329c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams                throw new RSIllegalArgumentException("Array size cannot be less than 1.");
133070d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            }
1331e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk
1332e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            // Skip padding fields after a vector 3 type.
1333e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if (mSkipPadding != 0) {
1334e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                if (name.startsWith("#padding_")) {
1335e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                    mSkipPadding = 0;
1336e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                    return this;
1337e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                }
1338e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            }
1339e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk
1340e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if (element.mVectorSize == 3) {
1341e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSkipPadding = 1;
1342e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            } else {
1343e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSkipPadding = 0;
1344e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            }
1345e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk
1346718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            if(mCount == mElements.length) {
1347718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                Element[] e = new Element[mCount + 8];
1348718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                String[] s = new String[mCount + 8];
134970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                int[] as = new int[mCount + 8];
1350718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                System.arraycopy(mElements, 0, e, 0, mCount);
1351718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                System.arraycopy(mElementNames, 0, s, 0, mCount);
135270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                System.arraycopy(mArraySizes, 0, as, 0, mCount);
1353718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                mElements = e;
1354718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                mElementNames = s;
135570d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                mArraySizes = as;
1356718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            }
1357718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElements[mCount] = element;
1358718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElementNames[mCount] = name;
135970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            mArraySizes[mCount] = arraySize;
1360718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mCount++;
1361bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
136207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
136307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
13649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1365a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add a single element to this Element.
1366a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1367a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param element
1368a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param name
1369a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
1370bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder add(Element element, String name) {
1371bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return add(element, name, 1);
137270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        }
137370d4e5024298f71edb3b04867e05568f5495b4ceJason Sams
13749c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1375a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create the element from this builder.
1376a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1377a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1378a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @return Element
1379a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
138022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Element create() {
1381771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
1382718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            Element[] ein = new Element[mCount];
1383718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            String[] sin = new String[mCount];
138470d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            int[] asin = new int[mCount];
1385718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
1386718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
138770d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
13880de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk
13899807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat            long[] ids = new long[ein.length];
13900de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            for (int ct = 0; ct < ein.length; ct++ ) {
13919807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat                ids[ct] = ein[ct].getID(mRS);
13920de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            }
1393460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = mRS.nElementCreate2(ids, sin, asin);
139470d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            return new Element(id, mRS, ein, sin, asin);
139536e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
139636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
139736e612a488511940b61f09803b270aa1c61b68e0Jason Sams}
139836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1399