diff options
author | Jason Sams <rjsams@android.com> | 2009-12-23 14:35:29 -0800 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2009-12-23 14:35:29 -0800 |
commit | 718cd1f322ee5b62b6a49cb36195bcb18a5ab711 (patch) | |
tree | f2f8c9db5a8141eafa2f1547634d7586fdc6ef04 /graphics/java | |
parent | ceedafacdb87307234c84196a12eeb6e657d6220 (diff) | |
download | frameworks_base-718cd1f322ee5b62b6a49cb36195bcb18a5ab711.zip frameworks_base-718cd1f322ee5b62b6a49cb36195bcb18a5ab711.tar.gz frameworks_base-718cd1f322ee5b62b6a49cb36195bcb18a5ab711.tar.bz2 |
Element restructuring. Add support for new basic Element types including the RS objects and vectors(2-4). In theory this paves the way for maintaining type info for RS objects, passing elements for GLSL uiforms/attribs/varyings, and supporting nested structures.
This will break some apps, checkings for other projects will follow to unbreak them.
Diffstat (limited to 'graphics/java')
-rw-r--r-- | graphics/java/android/renderscript/Allocation.java | 19 | ||||
-rw-r--r-- | graphics/java/android/renderscript/BaseObj.java | 1 | ||||
-rw-r--r-- | graphics/java/android/renderscript/Element.java | 557 | ||||
-rw-r--r-- | graphics/java/android/renderscript/ProgramVertex.java | 2 | ||||
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 20 | ||||
-rw-r--r-- | graphics/java/android/renderscript/SimpleMesh.java | 28 | ||||
-rw-r--r-- | graphics/java/android/renderscript/Type.java | 8 |
7 files changed, 294 insertions, 341 deletions
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java index b6ac14a..880e459 100644 --- a/graphics/java/android/renderscript/Allocation.java +++ b/graphics/java/android/renderscript/Allocation.java @@ -171,9 +171,10 @@ public class Allocation extends BaseObj { public Adapter1D createAdapter1D() { mRS.validate(); int id = mRS.nAdapter1DCreate(); - if (id != 0) { - mRS.nAdapter1DBindAllocation(id, mID); + if(id == 0) { + throw new IllegalStateException("allocation failed."); } + mRS.nAdapter1DBindAllocation(id, mID); return new Adapter1D(id, mRS); } @@ -213,9 +214,10 @@ public class Allocation extends BaseObj { public Adapter2D createAdapter2D() { mRS.validate(); int id = mRS.nAdapter2DCreate(); - if (id != 0) { - mRS.nAdapter2DBindAllocation(id, mID); + if(id == 0) { + throw new IllegalStateException("allocation failed."); } + mRS.nAdapter2DBindAllocation(id, mID); return new Adapter2D(id, mRS); } @@ -258,6 +260,9 @@ public class Allocation extends BaseObj { rs.validate(); int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b); + if(id == 0) { + throw new IllegalStateException("Load failed."); + } return new Allocation(id, rs, null); } @@ -266,6 +271,9 @@ public class Allocation extends BaseObj { rs.validate(); int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b); + if(id == 0) { + throw new IllegalStateException("Load failed."); + } return new Allocation(id, rs, null); } @@ -282,6 +290,9 @@ public class Allocation extends BaseObj { int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips, asset); + if(allocationId == 0) { + throw new IllegalStateException("Load failed."); + } return new Allocation(allocationId, rs, null); } catch (Exception e) { // Ignore diff --git a/graphics/java/android/renderscript/BaseObj.java b/graphics/java/android/renderscript/BaseObj.java index e802ec5..002fc78 100644 --- a/graphics/java/android/renderscript/BaseObj.java +++ b/graphics/java/android/renderscript/BaseObj.java @@ -25,6 +25,7 @@ import android.util.Log; class BaseObj { BaseObj(RenderScript rs) { + rs.validate(); mRS = rs; mID = 0; mDestroyed = false; diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java index ee9b098..66b1ccb 100644 --- a/graphics/java/android/renderscript/Element.java +++ b/graphics/java/android/renderscript/Element.java @@ -24,259 +24,220 @@ import java.lang.reflect.Field; **/ public class Element extends BaseObj { int mSize; - Entry[] mEntries; + Element[] mElements; + String[] mElementNames; - int getSizeBytes() { - return mSize; - } - int getComponentCount() { - return mEntries.length; - } - Element.DataType getComponentDataType(int num) { - return mEntries[num].mType; - } - Element.DataKind getComponentDataKind(int num) { - return mEntries[num].mKind; - } - boolean getComponentIsNormalized(int num) { - return mEntries[num].mIsNormalized; - } - int getComponentBits(int num) { - return mEntries[num].mBits; - } - String getComponentName(int num) { - return mEntries[num].mName; + DataType mType; + DataKind mKind; + boolean mNormalized; + int mVectorSize; + + int getSizeBytes() {return mSize;} + + public enum DataType { + //FLOAT_16 (1, 2), + FLOAT_32 (2, 4), + //FLOAT_64 (3, 8), + SIGNED_8 (4, 1), + SIGNED_16 (5, 2), + SIGNED_32 (6, 4), + //SIGNED_64 (7, 8), + UNSIGNED_8 (8, 1), + UNSIGNED_16 (9, 2), + UNSIGNED_32 (10, 4), + //UNSIGNED_64 (11, 8), + + UNSIGNED_5_6_5 (12, 2), + UNSIGNED_5_5_5_1 (13, 2), + UNSIGNED_4_4_4_4 (14, 2), + + RS_ELEMENT (15, 4), + RS_TYPE (16, 4), + RS_ALLOCATION (17, 4), + RS_SAMPLER (18, 4), + RS_SCRIPT (19, 4), + RS_MESH (20, 4), + RS_PROGRAM_FRAGMENT (21, 4), + RS_PROGRAM_VERTEX (22, 4), + RS_PROGRAM_RASTER (23, 4), + RS_PROGRAM_STORE (24, 4); + + int mID; + int mSize; + DataType(int id, int size) { + mID = id; + mSize = size; + } } - static class Entry { - //Element mElement; - Element.DataType mType; - Element.DataKind mKind; - boolean mIsNormalized; - int mBits; - String mName; - - //Entry(Element e, int bits) { - //mElement = e; - //int mBits = bits; - //} - - Entry(DataType dt, DataKind dk, boolean isNorm, int bits, String name) { - mType = dt; - mKind = dk; - mIsNormalized = isNorm; - mBits = bits; - mName = name; + public enum DataKind { + USER (0), + COLOR (1), + POSITION (2), + TEXTURE (3), + NORMAL (4), + INDEX (5), + POINT_SIZE(6), + + PIXEL_L (7), + PIXEL_A (8), + PIXEL_LA (9), + PIXEL_RGB (10), + PIXEL_RGBA (11); + + int mID; + DataKind(int id) { + mID = id; } } public static Element USER_U8(RenderScript rs) { if(rs.mElement_USER_U8 == null) { - rs.mElement_USER_U8 = new Element(rs, 1); - rs.mElement_USER_U8.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 8, null); - rs.mElement_USER_U8.init(); + rs.mElement_USER_U8 = createUser(rs, DataType.UNSIGNED_8); } return rs.mElement_USER_U8; } public static Element USER_I8(RenderScript rs) { if(rs.mElement_USER_I8 == null) { - rs.mElement_USER_I8 = new Element(rs, 1); - rs.mElement_USER_I8.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 8, null); - rs.mElement_USER_I8.init(); + rs.mElement_USER_I8 = createUser(rs, DataType.SIGNED_8); } return rs.mElement_USER_I8; } - public static Element USER_U16(RenderScript rs) { - if(rs.mElement_USER_U16 == null) { - rs.mElement_USER_U16 = new Element(rs, 1); - rs.mElement_USER_U16.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 16, null); - rs.mElement_USER_U16.init(); - } - return rs.mElement_USER_U16; - } - - public static Element USER_I16(RenderScript rs) { - if(rs.mElement_USER_I16 == null) { - rs.mElement_USER_I16 = new Element(rs, 1); - rs.mElement_USER_I16.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 16, null); - rs.mElement_USER_I16.init(); - } - return rs.mElement_USER_I16; - } - public static Element USER_U32(RenderScript rs) { if(rs.mElement_USER_U32 == null) { - rs.mElement_USER_U32 = new Element(rs, 1); - rs.mElement_USER_U32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 32, null); - rs.mElement_USER_U32.init(); + rs.mElement_USER_U32 = createUser(rs, DataType.UNSIGNED_32); } return rs.mElement_USER_U32; } public static Element USER_I32(RenderScript rs) { if(rs.mElement_USER_I32 == null) { - rs.mElement_USER_I32 = new Element(rs, 1); - rs.mElement_USER_I32.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 32, null); - rs.mElement_USER_I32.init(); + rs.mElement_USER_I32 = createUser(rs, DataType.SIGNED_32); } return rs.mElement_USER_I32; } public static Element USER_F32(RenderScript rs) { - if(rs.mElement_USER_FLOAT == null) { - rs.mElement_USER_FLOAT = new Element(rs, 1); - rs.mElement_USER_FLOAT.mEntries[0] = new Entry(DataType.FLOAT, DataKind.USER, false, 32, null); - rs.mElement_USER_FLOAT.init(); + if(rs.mElement_USER_F32 == null) { + rs.mElement_USER_F32 = createUser(rs, DataType.FLOAT_32); } - return rs.mElement_USER_FLOAT; + return rs.mElement_USER_F32; } public static Element A_8(RenderScript rs) { if(rs.mElement_A_8 == null) { - rs.mElement_A_8 = new Element(rs, 1); - rs.mElement_A_8.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 8, "a"); - rs.mElement_A_8.init(); + rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A); } return rs.mElement_A_8; } public static Element RGB_565(RenderScript rs) { if(rs.mElement_RGB_565 == null) { - rs.mElement_RGB_565 = new Element(rs, 3); - rs.mElement_RGB_565.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 5, "r"); - rs.mElement_RGB_565.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 6, "g"); - rs.mElement_RGB_565.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 5, "b"); - rs.mElement_RGB_565.init(); + rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB); } return rs.mElement_RGB_565; } public static Element RGB_888(RenderScript rs) { if(rs.mElement_RGB_888 == null) { - rs.mElement_RGB_888 = new Element(rs, 3); - rs.mElement_RGB_888.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 8, "r"); - rs.mElement_RGB_888.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 8, "g"); - rs.mElement_RGB_888.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 8, "b"); - rs.mElement_RGB_888.init(); + rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB); } return rs.mElement_RGB_888; } public static Element RGBA_5551(RenderScript rs) { if(rs.mElement_RGBA_5551 == null) { - rs.mElement_RGBA_5551 = new Element(rs, 4); - rs.mElement_RGBA_5551.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 5, "r"); - rs.mElement_RGBA_5551.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 5, "g"); - rs.mElement_RGBA_5551.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 5, "b"); - rs.mElement_RGBA_5551.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 1, "a"); - rs.mElement_RGBA_5551.init(); + rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA); } return rs.mElement_RGBA_5551; } public static Element RGBA_4444(RenderScript rs) { if(rs.mElement_RGBA_4444 == null) { - rs.mElement_RGBA_4444 = new Element(rs, 4); - rs.mElement_RGBA_4444.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 4, "r"); - rs.mElement_RGBA_4444.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 4, "g"); - rs.mElement_RGBA_4444.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 4, "b"); - rs.mElement_RGBA_4444.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 4, "a"); - rs.mElement_RGBA_4444.init(); + rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA); } return rs.mElement_RGBA_4444; } public static Element RGBA_8888(RenderScript rs) { if(rs.mElement_RGBA_8888 == null) { - rs.mElement_RGBA_8888 = new Element(rs, 4); - rs.mElement_RGBA_8888.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 8, "r"); - rs.mElement_RGBA_8888.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 8, "g"); - rs.mElement_RGBA_8888.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 8, "b"); - rs.mElement_RGBA_8888.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 8, "a"); - rs.mElement_RGBA_8888.init(); + rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA); } return rs.mElement_RGBA_8888; } public static Element INDEX_16(RenderScript rs) { if(rs.mElement_INDEX_16 == null) { - rs.mElement_INDEX_16 = new Element(rs, 1); - rs.mElement_INDEX_16.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.INDEX, false, 16, "index"); - rs.mElement_INDEX_16.init(); + rs.mElement_INDEX_16 = createIndex(rs); } return rs.mElement_INDEX_16; } - public static Element XY_F32(RenderScript rs) { - if(rs.mElement_XY_F32 == null) { - rs.mElement_XY_F32 = new Element(rs, 2); - rs.mElement_XY_F32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.X, false, 32, "x"); - rs.mElement_XY_F32.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.Y, false, 32, "y"); - rs.mElement_XY_F32.init(); + public static Element ATTRIB_POSITION_2(RenderScript rs) { + if(rs.mElement_POSITION_2 == null) { + rs.mElement_POSITION_2 = createAttrib(rs, DataType.FLOAT_32, DataKind.POSITION, 2); } - return rs.mElement_XY_F32; + return rs.mElement_POSITION_2; } - public static Element XYZ_F32(RenderScript rs) { - if(rs.mElement_XYZ_F32 == null) { - rs.mElement_XYZ_F32 = new Element(rs, 3); - rs.mElement_XYZ_F32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.X, false, 32, "x"); - rs.mElement_XYZ_F32.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.Y, false, 32, "y"); - rs.mElement_XYZ_F32.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.Z, false, 32, "z"); - rs.mElement_XYZ_F32.init(); + public static Element ATTRIB_POSITION_3(RenderScript rs) { + if(rs.mElement_POSITION_3 == null) { + rs.mElement_POSITION_3 = createAttrib(rs, DataType.FLOAT_32, DataKind.POSITION, 3); } - return rs.mElement_XYZ_F32; + return rs.mElement_POSITION_3; } - static void initPredefined(RenderScript rs) { - rs.nInitElements(A_8(rs).mID, RGBA_4444(rs).mID, RGBA_8888(rs).mID, RGB_565(rs).mID); + public static Element ATTRIB_TEXTURE_2(RenderScript rs) { + if(rs.mElement_TEXTURE_2 == null) { + rs.mElement_TEXTURE_2 = createAttrib(rs, DataType.FLOAT_32, DataKind.TEXTURE, 2); + } + return rs.mElement_TEXTURE_2; } - public enum DataType { - FLOAT (0), - UNSIGNED (1), - SIGNED (2); - - int mID; - DataType(int id) { - mID = id; + public static Element ATTRIB_NORMAL_3(RenderScript rs) { + if(rs.mElement_NORMAL_3 == null) { + rs.mElement_NORMAL_3 = createAttrib(rs, DataType.FLOAT_32, DataKind.NORMAL, 3); } + return rs.mElement_NORMAL_3; } - public enum DataKind { - USER (0), - RED (1), - GREEN (2), - BLUE (3), - ALPHA (4), - LUMINANCE (5), - INTENSITY (6), - X (7), - Y (8), - Z (9), - W (10), - S (11), - T (12), - Q (13), - R (14), - NX (15), - NY (16), - NZ (17), - INDEX (18), - POINT_SIZE(19); + public static Element ATTRIB_COLOR_U8_4(RenderScript rs) { + if(rs.mElement_COLOR_U8_4 == null) { + rs.mElement_COLOR_U8_4 = createAttrib(rs, DataType.UNSIGNED_8, DataKind.COLOR, 4); + } + return rs.mElement_COLOR_U8_4; + } - int mID; - DataKind(int id) { - mID = id; + public static Element ATTRIB_COLOR_F32_4(RenderScript rs) { + if(rs.mElement_COLOR_F32_4 == null) { + rs.mElement_COLOR_F32_4 = createAttrib(rs, DataType.FLOAT_32, DataKind.COLOR, 4); } + return rs.mElement_COLOR_F32_4; } - Element(RenderScript rs, int count) { + Element(RenderScript rs, Element[] e, String[] n) { super(rs); mSize = 0; - mEntries = new Entry[count]; + mElements = e; + mElementNames = n; + int[] ids = new int[mElements.length]; + for (int ct = 0; ct < mElements.length; ct++ ) { + mSize += mElements[ct].mSize; + ids[ct] = mElements[ct].mID; + } + mID = rs.nElementCreate2(ids, mElementNames); + } + + Element(RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) { + super(rs); + mSize = dt.mSize * size; + mType = dt; + mKind = dk; + mNormalized = norm; + mVectorSize = size; + mID = rs.nElementCreate(dt.mID, dk.mID, norm, size); } public void destroy() throws IllegalStateException { @@ -291,13 +252,13 @@ public class Element extends BaseObj { for(Field f: fields) { Class fc = f.getType(); if(fc == int.class) { - b.add(Element.DataType.SIGNED, Element.DataKind.USER, false, 32, f.getName()); + b.add(createUser(rs, DataType.SIGNED_32), f.getName()); } else if(fc == short.class) { - b.add(Element.DataType.SIGNED, Element.DataKind.USER, false, 16, f.getName()); + b.add(createUser(rs, DataType.SIGNED_16), f.getName()); } else if(fc == byte.class) { - b.add(Element.DataType.SIGNED, Element.DataKind.USER, false, 8, f.getName()); + b.add(createUser(rs, DataType.SIGNED_8), f.getName()); } else if(fc == float.class) { - b.add(Element.DataType.FLOAT, Element.DataKind.USER, false, 32, f.getName()); + b.add(createUser(rs, DataType.FLOAT_32), f.getName()); } else { throw new IllegalArgumentException("Unkown field type"); } @@ -305,193 +266,161 @@ public class Element extends BaseObj { return b.create(); } - static synchronized void internalCreate(RenderScript rs, Element e) { - rs.nElementBegin(); - int bits = 0; - for (int ct=0; ct < e.mEntries.length; ct++) { - Entry en = e.mEntries[ct]; - //if(en.mElement != null) { - //rs.nElementAdd(en.mElement.mID); - //} else - { - rs.nElementAdd(en.mKind.mID, en.mType.mID, en.mIsNormalized, en.mBits, en.mName); - bits += en.mBits; - } - } - e.mID = rs.nElementCreate(); - e.mSize = (bits + 7) >> 3; - } - void init() { - mRS.validate(); - internalCreate(mRS, this); + ///////////////////////////////////////// + public static Element createUser(RenderScript rs, DataType dt) { + //android.util.Log.e("rs", "createUser " + dt.mID); + return new Element(rs, dt, DataKind.USER, false, 1); } - - public static class Builder { - RenderScript mRS; - Entry[] mEntries; - int mEntryCount; - - public Builder(RenderScript rs) { - mRS = rs; - mEntryCount = 0; - mEntries = new Entry[8]; - } - - void addEntry(Entry e) { - if(mEntries.length >= mEntryCount) { - Entry[] en = new Entry[mEntryCount + 8]; - System.arraycopy(mEntries, 0, en, 0, mEntries.length); - mEntries = en; - } - mEntries[mEntryCount] = e; - mEntryCount++; + public static Element createVector(RenderScript rs, DataType dt, int size) { + //android.util.Log.e("rs", "createVector " + dt.mID + ", " + size); + if (size < 2 || size > 4) { + throw new IllegalArgumentException("Bad size"); } + return new Element(rs, dt, DataKind.USER, false, size); + } - //public Builder add(Element e) throws IllegalArgumentException { - //Entry en = new Entry(e, e.mSize * 8); - //addEntry(en); - //return this; - //} + public static Element createIndex(RenderScript rs) { + android.util.Log.e("rs", "createIndex "); + return new Element(rs, DataType.UNSIGNED_16, DataKind.INDEX, false, 1); + } - public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits, String name) { - Entry en = new Entry(dt, dk, isNormalized, bits, name); - addEntry(en); - return this; + public static Element createAttrib(RenderScript rs, DataType dt, DataKind dk, int size) { + android.util.Log.e("rs", "createAttrib " + dt.mID + ", " + dk.mID + ", " + size); + if (!(dt == DataType.FLOAT_32 || + dt == DataType.UNSIGNED_8 || + dt == DataType.UNSIGNED_16 || + dt == DataType.UNSIGNED_32 || + dt == DataType.SIGNED_8 || + dt == DataType.SIGNED_16 || + dt == DataType.SIGNED_32)) { + throw new IllegalArgumentException("Unsupported DataType"); } - public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits) { - add(dt, dk, isNormalized, bits, null); - return this; + if (!(dk == DataKind.COLOR || + dk == DataKind.POSITION || + dk == DataKind.TEXTURE || + dk == DataKind.NORMAL || + dk == DataKind.POINT_SIZE)) { + throw new IllegalArgumentException("Unsupported DataKind"); } - public Builder addFloat(Element.DataKind dk) { - add(DataType.FLOAT, dk, false, 32, null); - return this; + if (dk == DataKind.COLOR && + ((dt != DataType.FLOAT_32 && dt != DataType.UNSIGNED_8) || + size < 3 || size > 4)) { + throw new IllegalArgumentException("Bad combo"); } - - public Builder addFloat(Element.DataKind dk, String name) { - add(DataType.FLOAT, dk, false, 32, name); - return this; + if (dk == DataKind.POSITION && (size < 1 || size > 4)) { + throw new IllegalArgumentException("Bad combo"); } - - public Builder addFloatXY() { - add(DataType.FLOAT, DataKind.X, false, 32, null); - add(DataType.FLOAT, DataKind.Y, false, 32, null); - return this; + if (dk == DataKind.TEXTURE && + (dt != DataType.FLOAT_32 || size < 1 || size > 4)) { + throw new IllegalArgumentException("Bad combo"); } - - public Builder addFloatXY(String prefix) { - add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x"); - add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y"); - return this; + if (dk == DataKind.NORMAL && + (dt != DataType.FLOAT_32 || size != 3)) { + throw new IllegalArgumentException("Bad combo"); } - - public Builder addFloatXYZ() { - add(DataType.FLOAT, DataKind.X, false, 32, null); - add(DataType.FLOAT, DataKind.Y, false, 32, null); - add(DataType.FLOAT, DataKind.Z, false, 32, null); - return this; + if (dk == DataKind.POINT_SIZE && + (dt != DataType.FLOAT_32 || size != 1)) { + throw new IllegalArgumentException("Bad combo"); } - public Builder addFloatXYZ(String prefix) { - add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x"); - add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y"); - add(DataType.FLOAT, DataKind.Z, false, 32, prefix + "z"); - return this; + boolean norm = false; + if (dk == DataKind.COLOR && dt == DataType.UNSIGNED_8) { + norm = true; } - public Builder addFloatST() { - add(DataType.FLOAT, DataKind.S, false, 32, null); - add(DataType.FLOAT, DataKind.T, false, 32, null); - return this; - } + return new Element(rs, dt, dk, norm, size); + } - public Builder addFloatST(String prefix) { - add(DataType.FLOAT, DataKind.S, false, 32, prefix + "s"); - add(DataType.FLOAT, DataKind.T, false, 32, prefix + "t"); - return this; + public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) { + android.util.Log.e("rs", "createPixel " + dt.mID + ", " + dk.mID); + if (!(dk == DataKind.PIXEL_L || + dk == DataKind.PIXEL_A || + dk == DataKind.PIXEL_LA || + dk == DataKind.PIXEL_RGB || + dk == DataKind.PIXEL_RGBA)) { + throw new IllegalArgumentException("Unsupported DataKind"); } - - public Builder addFloatNorm() { - add(DataType.FLOAT, DataKind.NX, false, 32, null); - add(DataType.FLOAT, DataKind.NY, false, 32, null); - add(DataType.FLOAT, DataKind.NZ, false, 32, null); - return this; + if (!(dt == DataType.UNSIGNED_8 || + dt == DataType.UNSIGNED_5_6_5 || + dt == DataType.UNSIGNED_4_4_4_4 || + dt == DataType.UNSIGNED_5_5_5_1)) { + throw new IllegalArgumentException("Unsupported DataType"); } - - public Builder addFloatNorm(String prefix) { - add(DataType.FLOAT, DataKind.NX, false, 32, prefix + "nx"); - add(DataType.FLOAT, DataKind.NY, false, 32, prefix + "ny"); - add(DataType.FLOAT, DataKind.NZ, false, 32, prefix + "nz"); - return this; + if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) { + throw new IllegalArgumentException("Bad kind and type combo"); } - - public Builder addFloatPointSize() { - add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, null); - return this; + if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) { + throw new IllegalArgumentException("Bad kind and type combo"); } - - public Builder addFloatPointSize(String prefix) { - add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, prefix + "pointSize"); - return this; + if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) { + throw new IllegalArgumentException("Bad kind and type combo"); } - public Builder addFloatRGB() { - add(DataType.FLOAT, DataKind.RED, false, 32, null); - add(DataType.FLOAT, DataKind.GREEN, false, 32, null); - add(DataType.FLOAT, DataKind.BLUE, false, 32, null); - return this; + int size = 1; + if (dk == DataKind.PIXEL_LA) { + size = 2; } - - public Builder addFloatRGB(String prefix) { - add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "r"); - add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "g"); - add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "b"); - return this; + if (dk == DataKind.PIXEL_RGB) { + size = 3; } - - public Builder addFloatRGBA() { - add(DataType.FLOAT, DataKind.RED, false, 32, null); - add(DataType.FLOAT, DataKind.GREEN, false, 32, null); - add(DataType.FLOAT, DataKind.BLUE, false, 32, null); - add(DataType.FLOAT, DataKind.ALPHA, false, 32, null); - return this; + if (dk == DataKind.PIXEL_RGBA) { + size = 4; } - public Builder addFloatRGBA(String prefix) { - add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "r"); - add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "g"); - add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "b"); - add(DataType.FLOAT, DataKind.ALPHA, false, 32, prefix + "a"); - return this; - } + return new Element(rs, dt, dk, true, size); + } - public Builder addUNorm8RGBA() { - add(DataType.UNSIGNED, DataKind.RED, true, 8, null); - add(DataType.UNSIGNED, DataKind.GREEN, true, 8, null); - add(DataType.UNSIGNED, DataKind.BLUE, true, 8, null); - add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, null); - return this; - } + public static class Builder { + RenderScript mRS; + Element[] mElements; + String[] mElementNames; + int mCount; - public Builder addUNorm8RGBA(String prefix) { - add(DataType.UNSIGNED, DataKind.RED, true, 8, prefix + "r"); - add(DataType.UNSIGNED, DataKind.GREEN, true, 8, prefix + "g"); - add(DataType.UNSIGNED, DataKind.BLUE, true, 8, prefix + "b"); - add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, prefix + "a"); - return this; + public Builder(RenderScript rs) { + mRS = rs; + mCount = 0; + mElements = new Element[8]; + mElementNames = new String[8]; + } + + public void add(Element element, String name) { + if(mCount == mElements.length) { + Element[] e = new Element[mCount + 8]; + String[] s = new String[mCount + 8]; + System.arraycopy(mElements, 0, e, 0, mCount); + System.arraycopy(mElementNames, 0, s, 0, mCount); + mElements = e; + mElementNames = s; + } + mElements[mCount] = element; + mElementNames[mCount] = name; + mCount++; } public Element create() { mRS.validate(); - Element e = new Element(mRS, mEntryCount); - java.lang.System.arraycopy(mEntries, 0, e.mEntries, 0, mEntryCount); - e.init(); - return e; + Element[] ein = new Element[mCount]; + String[] sin = new String[mCount]; + java.lang.System.arraycopy(mElements, 0, ein, 0, mCount); + java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount); + return new Element(mRS, ein, sin); } } + static void initPredefined(RenderScript rs) { + int a8 = rs.nElementCreate(DataType.UNSIGNED_8.mID, + DataKind.PIXEL_A.mID, true, 1); + int rgba4444 = rs.nElementCreate(DataType.UNSIGNED_4_4_4_4.mID, + DataKind.PIXEL_RGBA.mID, true, 4); + int rgba8888 = rs.nElementCreate(DataType.UNSIGNED_8.mID, + DataKind.PIXEL_RGBA.mID, true, 4); + int rgb565 = rs.nElementCreate(DataType.UNSIGNED_5_6_5.mID, + DataKind.PIXEL_RGB.mID, true, 3); + rs.nInitElements(a8, rgba4444, rgba8888, rgb565); + } } diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java index 101f030..84f6f2d 100644 --- a/graphics/java/android/renderscript/ProgramVertex.java +++ b/graphics/java/android/renderscript/ProgramVertex.java @@ -107,7 +107,7 @@ public class ProgramVertex extends Program { mProjection = new Matrix(); mTexture = new Matrix(); - mAlloc = Allocation.createSized(rs, Element.USER_F32(rs), 48); + mAlloc = Allocation.createSized(rs, Element.createUser(rs, Element.DataType.FLOAT_32), 48); mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat); mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat); mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat); diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 6574219..cc97a8f 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -89,9 +89,9 @@ public class RenderScript { native void nObjDestroyOOB(int id); native int nFileOpen(byte[] name); - native void nElementBegin(); - native void nElementAdd(int kind, int type, boolean norm, int bits, String s); - native int nElementCreate(); + + native int nElementCreate(int type, int kind, boolean norm, int vecSize); + native int nElementCreate2(int[] elements, String[] names); native void nTypeBegin(int elementID); native void nTypeAdd(int dim, int val); @@ -198,14 +198,13 @@ public class RenderScript { private Surface mSurface; private MessageThread mMessageThread; - Element mElement_USER_U8; Element mElement_USER_I8; Element mElement_USER_U16; Element mElement_USER_I16; Element mElement_USER_U32; Element mElement_USER_I32; - Element mElement_USER_FLOAT; + Element mElement_USER_F32; Element mElement_A_8; Element mElement_RGB_565; @@ -215,9 +214,12 @@ public class RenderScript { Element mElement_RGBA_8888; Element mElement_INDEX_16; - Element mElement_XY_F32; - Element mElement_XYZ_F32; - + Element mElement_POSITION_2; + Element mElement_POSITION_3; + Element mElement_TEXTURE_2; + Element mElement_NORMAL_3; + Element mElement_COLOR_U8_4; + Element mElement_COLOR_F32_4; /////////////////////////////////////////////////////////////////////////////////// // @@ -303,9 +305,9 @@ public class RenderScript { nDeviceSetConfig(mDev, 0, 1); } mContext = nContextCreate(mDev, 0, useDepth); - Element.initPredefined(this); mMessageThread = new MessageThread(this); mMessageThread.start(); + Element.initPredefined(this); } public void contextSetSurface(int w, int h, Surface sur) { diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java index f45074e..8589a3e 100644 --- a/graphics/java/android/renderscript/SimpleMesh.java +++ b/graphics/java/android/renderscript/SimpleMesh.java @@ -313,28 +313,38 @@ public class SimpleMesh extends BaseObj { public SimpleMesh create() { Element.Builder b = new Element.Builder(mRS); int floatCount = mVtxSize; - if (mVtxSize == 2) { - b.addFloatXY(); - } else { - b.addFloatXYZ(); - } + b.add(Element.createAttrib(mRS, + Element.DataType.FLOAT_32, + Element.DataKind.POSITION, + mVtxSize), "position"); if ((mFlags & COLOR) != 0) { floatCount += 4; - b.addFloatRGBA(); + b.add(Element.createAttrib(mRS, + Element.DataType.FLOAT_32, + Element.DataKind.COLOR, + 4), "color"); } if ((mFlags & TEXTURE_0) != 0) { floatCount += 2; - b.addFloatST(); + b.add(Element.createAttrib(mRS, + Element.DataType.FLOAT_32, + Element.DataKind.TEXTURE, + 2), "texture"); } if ((mFlags & NORMAL) != 0) { floatCount += 3; - b.addFloatNorm(); + b.add(Element.createAttrib(mRS, + Element.DataType.FLOAT_32, + Element.DataKind.NORMAL, + 3), "normal"); } mElement = b.create(); + android.util.Log.e("rs", "sm create size=" + (mVtxCount / floatCount) + ", count=" + mVtxCount); + Builder smb = new Builder(mRS); smb.addVertexType(mElement, mVtxCount / floatCount); - smb.setIndexType(Element.INDEX_16(mRS), mIndexCount); + smb.setIndexType(Element.createIndex(mRS), mIndexCount); smb.setPrimitive(Primitive.TRIANGLE); SimpleMesh sm = smb.create(); diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java index ad4cf6b..8e59a31 100644 --- a/graphics/java/android/renderscript/Type.java +++ b/graphics/java/android/renderscript/Type.java @@ -122,16 +122,16 @@ public class Type extends BaseObj { Field f = fields[ct]; Class fc = f.getType(); if(fc == int.class) { - arTypes[ct] = Element.DataType.SIGNED.mID; + arTypes[ct] = Element.DataType.SIGNED_32.mID; arBits[ct] = 32; } else if(fc == short.class) { - arTypes[ct] = Element.DataType.SIGNED.mID; + arTypes[ct] = Element.DataType.SIGNED_16.mID; arBits[ct] = 16; } else if(fc == byte.class) { - arTypes[ct] = Element.DataType.SIGNED.mID; + arTypes[ct] = Element.DataType.SIGNED_8.mID; arBits[ct] = 8; } else if(fc == float.class) { - arTypes[ct] = Element.DataType.FLOAT.mID; + arTypes[ct] = Element.DataType.FLOAT_32.mID; arBits[ct] = 32; } else { throw new IllegalArgumentException("Unkown field type"); |