Type.java revision 768bc02d815a94ad29146f1ed60c847d1af118cc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.renderscript; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Field; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert/** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **/ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Type extends BaseObj { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mDimX; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mDimY; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mDimZ; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDimLOD; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDimFaces; 31112d339673c379b71a989bd33b73648aafe58ce1Jesse Wilson int mElementCount; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Element mElement; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNativeCache; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class mJavaClass; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getX() { 39761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert return mDimX; 40963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 41963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public int getY() { 42963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert return mDimY; 43963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 44761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert public int getZ() { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDimZ; 46c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat } 47963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public boolean getLOD() { 48c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat return mDimLOD; 49761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert } 50c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat public boolean getFaces() { 519fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert return mDimFaces; 52c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat } 539fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert public int getElementCount() { 54761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert return mElementCount; 557bcbd511731e13b9f2778e6aa6c633417d266f5eMarco Nelissen } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert void calcElementCount() { 58c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat boolean hasLod = getLOD(); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = getX(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = getY(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int z = getZ(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int faces = 1; 63963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert if(getFaces()) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project faces = 6; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(x == 0) { 679fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert x = 1; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert if(y == 0) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = 1; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert if(z == 0) { 73a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert z = 1; 74a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert } 75a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert 76963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert int count = x * y * z * faces; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(hasLod && (x > 1) && (y > 1) && (z > 1)) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(x > 1) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x >>= 1; 80963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 81963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert if(y > 1) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y >>= 1; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert if(z > 1) { 85761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert z >>= 1; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += x * y * z * faces; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert mElementCount = count; 91963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 92963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 93963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 94963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert Type(int id, RenderScript rs) { 95963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert super(rs); 96963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert mID = id; 97a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert mNativeCache = 0; 98761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert } 99761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert 100761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert protected void finalize() throws Throwable { 101761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert if(mNativeCache != 0) { 102761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert mRS.nTypeFinalDestroy(this); 103761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert mNativeCache = 0; 104761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert } 105761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert super.finalize(); 106761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert } 107761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert 108761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert public static Type createFromClass(RenderScript rs, Class c, int size) { 109761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert Element e = Element.createFromClass(rs, c); 110761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert Builder b = new Builder(rs, e); 111761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert b.add(Dimension.X, size); 112761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert Type t = b.create(); 113761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert e.destroy(); 114761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert 115761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert // native fields 116761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert { 117761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert Field[] fields = c.getFields(); 118761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert int[] arTypes = new int[fields.length]; 119761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert int[] arBits = new int[fields.length]; 120761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert 121761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert for(int ct=0; ct < fields.length; ct++) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Field f = fields[ct]; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class fc = f.getType(); 124761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert if(fc == int.class) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arTypes[ct] = Element.DataType.SIGNED.mID; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arBits[ct] = 32; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if(fc == short.class) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arTypes[ct] = Element.DataType.SIGNED.mID; 129112d339673c379b71a989bd33b73648aafe58ce1Jesse Wilson arBits[ct] = 16; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if(fc == byte.class) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arTypes[ct] = Element.DataType.SIGNED.mID; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arBits[ct] = 8; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if(fc == float.class) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arTypes[ct] = Element.DataType.FLOAT.mID; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arBits[ct] = 32; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Unkown field type"); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rs.nTypeSetupFields(t, arTypes, arBits, fields); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mJavaClass = c; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type t = createFromClass(rs, c, size); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.setName(scriptName); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Builder { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RenderScript mRS; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Entry[] mEntries; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mEntryCount; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Element mElement; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Entry { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Dimension mDim; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mValue; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Builder(RenderScript rs, Element e) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRS = rs; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEntries = new Entry[4]; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mElement = e; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void add(Dimension d, int value) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(mEntries.length >= mEntryCount) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Entry[] en = new Entry[mEntryCount + 8]; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(mEntries, 0, en, 0, mEntries.length); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEntries = en; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEntries[mEntryCount] = new Entry(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEntries[mEntryCount].mDim = d; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEntries[mEntryCount].mValue = value; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEntryCount++; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static synchronized Type internalCreate(RenderScript rs, Builder b) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rs.nTypeBegin(b.mElement.mID); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ct=0; ct < b.mEntryCount; ct++) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Entry en = b.mEntries[ct]; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rs.nTypeAdd(en.mDim.mID, en.mValue); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = rs.nTypeCreate(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Type(id, rs); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 191761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Type create() { 193112d339673c379b71a989bd33b73648aafe58ce1Jesse Wilson Type t = internalCreate(mRS, this); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mElement = mElement; 195761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert 196761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert for(int ct=0; ct < mEntryCount; ct++) { 197761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert if(mEntries[ct].mDim == Dimension.X) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mDimX = mEntries[ct].mValue; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(mEntries[ct].mDim == Dimension.Y) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mDimY = mEntries[ct].mValue; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(mEntries[ct].mDim == Dimension.Z) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mDimZ = mEntries[ct].mValue; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(mEntries[ct].mDim == Dimension.LOD) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mDimLOD = mEntries[ct].mValue != 0; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(mEntries[ct].mDim == Dimension.FACE) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mDimFaces = mEntries[ct].mValue != 0; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.calcElementCount(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 215761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 219761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert