Home | History | Annotate | Download | only in renderscript
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.renderscript;
     18 
     19 import java.lang.reflect.Field;
     20 
     21 /**
     22  * @hide
     23  *
     24  **/
     25 public class Element extends BaseObj {
     26     int mSize;
     27     Element[] mElements;
     28     String[] mElementNames;
     29 
     30     DataType mType;
     31     DataKind mKind;
     32     boolean mNormalized;
     33     int mVectorSize;
     34 
     35     int getSizeBytes() {return mSize;}
     36 
     37     public enum DataType {
     38         //FLOAT_16 (1, 2),
     39         FLOAT_32 (2, 4),
     40         //FLOAT_64 (3, 8),
     41         SIGNED_8 (4, 1),
     42         SIGNED_16 (5, 2),
     43         SIGNED_32 (6, 4),
     44         //SIGNED_64 (7, 8),
     45         UNSIGNED_8 (8, 1),
     46         UNSIGNED_16 (9, 2),
     47         UNSIGNED_32 (10, 4),
     48         //UNSIGNED_64 (11, 8),
     49 
     50         UNSIGNED_5_6_5 (12, 2),
     51         UNSIGNED_5_5_5_1 (13, 2),
     52         UNSIGNED_4_4_4_4 (14, 2),
     53 
     54         RS_ELEMENT (15, 4),
     55         RS_TYPE (16, 4),
     56         RS_ALLOCATION (17, 4),
     57         RS_SAMPLER (18, 4),
     58         RS_SCRIPT (19, 4),
     59         RS_MESH (20, 4),
     60         RS_PROGRAM_FRAGMENT (21, 4),
     61         RS_PROGRAM_VERTEX (22, 4),
     62         RS_PROGRAM_RASTER (23, 4),
     63         RS_PROGRAM_STORE (24, 4);
     64 
     65         int mID;
     66         int mSize;
     67         DataType(int id, int size) {
     68             mID = id;
     69             mSize = size;
     70         }
     71     }
     72 
     73     public enum DataKind {
     74         USER (0),
     75         COLOR (1),
     76         POSITION (2),
     77         TEXTURE (3),
     78         NORMAL (4),
     79         INDEX (5),
     80         POINT_SIZE(6),
     81 
     82         PIXEL_L (7),
     83         PIXEL_A (8),
     84         PIXEL_LA (9),
     85         PIXEL_RGB (10),
     86         PIXEL_RGBA (11);
     87 
     88         int mID;
     89         DataKind(int id) {
     90             mID = id;
     91         }
     92     }
     93 
     94     public static Element USER_U8(RenderScript rs) {
     95         if(rs.mElement_USER_U8 == null) {
     96             rs.mElement_USER_U8 = createUser(rs, DataType.UNSIGNED_8);
     97         }
     98         return rs.mElement_USER_U8;
     99     }
    100 
    101     public static Element USER_I8(RenderScript rs) {
    102         if(rs.mElement_USER_I8 == null) {
    103             rs.mElement_USER_I8 = createUser(rs, DataType.SIGNED_8);
    104         }
    105         return rs.mElement_USER_I8;
    106     }
    107 
    108     public static Element USER_U32(RenderScript rs) {
    109         if(rs.mElement_USER_U32 == null) {
    110             rs.mElement_USER_U32 = createUser(rs, DataType.UNSIGNED_32);
    111         }
    112         return rs.mElement_USER_U32;
    113     }
    114 
    115     public static Element USER_I32(RenderScript rs) {
    116         if(rs.mElement_USER_I32 == null) {
    117             rs.mElement_USER_I32 = createUser(rs, DataType.SIGNED_32);
    118         }
    119         return rs.mElement_USER_I32;
    120     }
    121 
    122     public static Element USER_F32(RenderScript rs) {
    123         if(rs.mElement_USER_F32 == null) {
    124             rs.mElement_USER_F32 = createUser(rs, DataType.FLOAT_32);
    125         }
    126         return rs.mElement_USER_F32;
    127     }
    128 
    129     public static Element A_8(RenderScript rs) {
    130         if(rs.mElement_A_8 == null) {
    131             rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
    132         }
    133         return rs.mElement_A_8;
    134     }
    135 
    136     public static Element RGB_565(RenderScript rs) {
    137         if(rs.mElement_RGB_565 == null) {
    138             rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
    139         }
    140         return rs.mElement_RGB_565;
    141     }
    142 
    143     public static Element RGB_888(RenderScript rs) {
    144         if(rs.mElement_RGB_888 == null) {
    145             rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
    146         }
    147         return rs.mElement_RGB_888;
    148     }
    149 
    150     public static Element RGBA_5551(RenderScript rs) {
    151         if(rs.mElement_RGBA_5551 == null) {
    152             rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
    153         }
    154         return rs.mElement_RGBA_5551;
    155     }
    156 
    157     public static Element RGBA_4444(RenderScript rs) {
    158         if(rs.mElement_RGBA_4444 == null) {
    159             rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
    160         }
    161         return rs.mElement_RGBA_4444;
    162     }
    163 
    164     public static Element RGBA_8888(RenderScript rs) {
    165         if(rs.mElement_RGBA_8888 == null) {
    166             rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
    167         }
    168         return rs.mElement_RGBA_8888;
    169     }
    170 
    171     public static Element INDEX_16(RenderScript rs) {
    172         if(rs.mElement_INDEX_16 == null) {
    173             rs.mElement_INDEX_16 = createIndex(rs);
    174         }
    175         return rs.mElement_INDEX_16;
    176     }
    177 
    178     public static Element ATTRIB_POSITION_2(RenderScript rs) {
    179         if(rs.mElement_POSITION_2 == null) {
    180             rs.mElement_POSITION_2 = createAttrib(rs, DataType.FLOAT_32, DataKind.POSITION, 2);
    181         }
    182         return rs.mElement_POSITION_2;
    183     }
    184 
    185     public static Element ATTRIB_POSITION_3(RenderScript rs) {
    186         if(rs.mElement_POSITION_3 == null) {
    187             rs.mElement_POSITION_3 = createAttrib(rs, DataType.FLOAT_32, DataKind.POSITION, 3);
    188         }
    189         return rs.mElement_POSITION_3;
    190     }
    191 
    192     public static Element ATTRIB_TEXTURE_2(RenderScript rs) {
    193         if(rs.mElement_TEXTURE_2 == null) {
    194             rs.mElement_TEXTURE_2 = createAttrib(rs, DataType.FLOAT_32, DataKind.TEXTURE, 2);
    195         }
    196         return rs.mElement_TEXTURE_2;
    197     }
    198 
    199     public static Element ATTRIB_NORMAL_3(RenderScript rs) {
    200         if(rs.mElement_NORMAL_3 == null) {
    201             rs.mElement_NORMAL_3 = createAttrib(rs, DataType.FLOAT_32, DataKind.NORMAL, 3);
    202         }
    203         return rs.mElement_NORMAL_3;
    204     }
    205 
    206     public static Element ATTRIB_COLOR_U8_4(RenderScript rs) {
    207         if(rs.mElement_COLOR_U8_4 == null) {
    208             rs.mElement_COLOR_U8_4 = createAttrib(rs, DataType.UNSIGNED_8, DataKind.COLOR, 4);
    209         }
    210         return rs.mElement_COLOR_U8_4;
    211     }
    212 
    213     public static Element ATTRIB_COLOR_F32_4(RenderScript rs) {
    214         if(rs.mElement_COLOR_F32_4 == null) {
    215             rs.mElement_COLOR_F32_4 = createAttrib(rs, DataType.FLOAT_32, DataKind.COLOR, 4);
    216         }
    217         return rs.mElement_COLOR_F32_4;
    218     }
    219 
    220     Element(RenderScript rs, Element[] e, String[] n) {
    221         super(rs);
    222         mSize = 0;
    223         mElements = e;
    224         mElementNames = n;
    225         int[] ids = new int[mElements.length];
    226         for (int ct = 0; ct < mElements.length; ct++ ) {
    227             mSize += mElements[ct].mSize;
    228             ids[ct] = mElements[ct].mID;
    229         }
    230         mID = rs.nElementCreate2(ids, mElementNames);
    231     }
    232 
    233     Element(RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
    234         super(rs);
    235         mSize = dt.mSize * size;
    236         mType = dt;
    237         mKind = dk;
    238         mNormalized = norm;
    239         mVectorSize = size;
    240         mID = rs.nElementCreate(dt.mID, dk.mID, norm, size);
    241     }
    242 
    243     public void destroy() throws IllegalStateException {
    244         super.destroy();
    245     }
    246 
    247     public static Element createFromClass(RenderScript rs, Class c) {
    248         rs.validate();
    249         Field[] fields = c.getFields();
    250         Builder b = new Builder(rs);
    251 
    252         for(Field f: fields) {
    253             Class fc = f.getType();
    254             if(fc == int.class) {
    255                 b.add(createUser(rs, DataType.SIGNED_32), f.getName());
    256             } else if(fc == short.class) {
    257                 b.add(createUser(rs, DataType.SIGNED_16), f.getName());
    258             } else if(fc == byte.class) {
    259                 b.add(createUser(rs, DataType.SIGNED_8), f.getName());
    260             } else if(fc == float.class) {
    261                 b.add(createUser(rs, DataType.FLOAT_32), f.getName());
    262             } else {
    263                 throw new IllegalArgumentException("Unkown field type");
    264             }
    265         }
    266         return b.create();
    267     }
    268 
    269 
    270     /////////////////////////////////////////
    271     public static Element createUser(RenderScript rs, DataType dt) {
    272         return new Element(rs, dt, DataKind.USER, false, 1);
    273     }
    274 
    275     public static Element createVector(RenderScript rs, DataType dt, int size) {
    276         if (size < 2 || size > 4) {
    277             throw new IllegalArgumentException("Bad size");
    278         }
    279         return new Element(rs, dt, DataKind.USER, false, size);
    280     }
    281 
    282     public static Element createIndex(RenderScript rs) {
    283         return new Element(rs, DataType.UNSIGNED_16, DataKind.INDEX, false, 1);
    284     }
    285 
    286     public static Element createAttrib(RenderScript rs, DataType dt, DataKind dk, int size) {
    287         if (!(dt == DataType.FLOAT_32 ||
    288               dt == DataType.UNSIGNED_8 ||
    289               dt == DataType.UNSIGNED_16 ||
    290               dt == DataType.UNSIGNED_32 ||
    291               dt == DataType.SIGNED_8 ||
    292               dt == DataType.SIGNED_16 ||
    293               dt == DataType.SIGNED_32)) {
    294             throw new IllegalArgumentException("Unsupported DataType");
    295         }
    296 
    297         if (!(dk == DataKind.COLOR ||
    298               dk == DataKind.POSITION ||
    299               dk == DataKind.TEXTURE ||
    300               dk == DataKind.NORMAL ||
    301               dk == DataKind.POINT_SIZE ||
    302               dk == DataKind.USER)) {
    303             throw new IllegalArgumentException("Unsupported DataKind");
    304         }
    305 
    306         if (dk == DataKind.COLOR &&
    307             ((dt != DataType.FLOAT_32 && dt != DataType.UNSIGNED_8) ||
    308              size < 3 || size > 4)) {
    309             throw new IllegalArgumentException("Bad combo");
    310         }
    311         if (dk == DataKind.POSITION && (size < 1 || size > 4)) {
    312             throw new IllegalArgumentException("Bad combo");
    313         }
    314         if (dk == DataKind.TEXTURE &&
    315             (dt != DataType.FLOAT_32 || size < 1 || size > 4)) {
    316             throw new IllegalArgumentException("Bad combo");
    317         }
    318         if (dk == DataKind.NORMAL &&
    319             (dt != DataType.FLOAT_32 || size != 3)) {
    320             throw new IllegalArgumentException("Bad combo");
    321         }
    322         if (dk == DataKind.POINT_SIZE &&
    323             (dt != DataType.FLOAT_32 || size != 1)) {
    324             throw new IllegalArgumentException("Bad combo");
    325         }
    326 
    327         boolean norm = false;
    328         if (dk == DataKind.COLOR && dt == DataType.UNSIGNED_8) {
    329             norm = true;
    330         }
    331 
    332         return new Element(rs, dt, dk, norm, size);
    333     }
    334 
    335     public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
    336         if (!(dk == DataKind.PIXEL_L ||
    337               dk == DataKind.PIXEL_A ||
    338               dk == DataKind.PIXEL_LA ||
    339               dk == DataKind.PIXEL_RGB ||
    340               dk == DataKind.PIXEL_RGBA)) {
    341             throw new IllegalArgumentException("Unsupported DataKind");
    342         }
    343         if (!(dt == DataType.UNSIGNED_8 ||
    344               dt == DataType.UNSIGNED_5_6_5 ||
    345               dt == DataType.UNSIGNED_4_4_4_4 ||
    346               dt == DataType.UNSIGNED_5_5_5_1)) {
    347             throw new IllegalArgumentException("Unsupported DataType");
    348         }
    349         if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
    350             throw new IllegalArgumentException("Bad kind and type combo");
    351         }
    352         if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
    353             throw new IllegalArgumentException("Bad kind and type combo");
    354         }
    355         if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
    356             throw new IllegalArgumentException("Bad kind and type combo");
    357         }
    358 
    359         int size = 1;
    360         if (dk == DataKind.PIXEL_LA) {
    361             size = 2;
    362         }
    363         if (dk == DataKind.PIXEL_RGB) {
    364             size = 3;
    365         }
    366         if (dk == DataKind.PIXEL_RGBA) {
    367             size = 4;
    368         }
    369 
    370         return new Element(rs, dt, dk, true, size);
    371     }
    372 
    373     public static class Builder {
    374         RenderScript mRS;
    375         Element[] mElements;
    376         String[] mElementNames;
    377         int mCount;
    378 
    379         public Builder(RenderScript rs) {
    380             mRS = rs;
    381             mCount = 0;
    382             mElements = new Element[8];
    383             mElementNames = new String[8];
    384         }
    385 
    386         public void add(Element element, String name) {
    387             if(mCount == mElements.length) {
    388                 Element[] e = new Element[mCount + 8];
    389                 String[] s = new String[mCount + 8];
    390                 System.arraycopy(mElements, 0, e, 0, mCount);
    391                 System.arraycopy(mElementNames, 0, s, 0, mCount);
    392                 mElements = e;
    393                 mElementNames = s;
    394             }
    395             mElements[mCount] = element;
    396             mElementNames[mCount] = name;
    397             mCount++;
    398         }
    399 
    400         public Element create() {
    401             mRS.validate();
    402             Element[] ein = new Element[mCount];
    403             String[] sin = new String[mCount];
    404             java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
    405             java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
    406             return new Element(mRS, ein, sin);
    407         }
    408     }
    409 
    410     static void initPredefined(RenderScript rs) {
    411         int a8 = rs.nElementCreate(DataType.UNSIGNED_8.mID,
    412                                    DataKind.PIXEL_A.mID, true, 1);
    413         int rgba4444 = rs.nElementCreate(DataType.UNSIGNED_4_4_4_4.mID,
    414                                          DataKind.PIXEL_RGBA.mID, true, 4);
    415         int rgba8888 = rs.nElementCreate(DataType.UNSIGNED_8.mID,
    416                                          DataKind.PIXEL_RGBA.mID, true, 4);
    417         int rgb565 = rs.nElementCreate(DataType.UNSIGNED_5_6_5.mID,
    418                                        DataKind.PIXEL_RGB.mID, true, 3);
    419         rs.nInitElements(a8, rgba4444, rgba8888, rgb565);
    420     }
    421 }
    422 
    423