Loading rs/java/android/renderscript/FieldPacker.java +61 −164 Original line number Diff line number Diff line Loading @@ -47,6 +47,15 @@ public class FieldPacker { // subAlign() can never work correctly for copied FieldPacker objects. } static FieldPacker createFromArray(Object[] args) { FieldPacker fp = new FieldPacker(RenderScript.sPointerSize * 8); for (Object arg : args) { fp.addSafely(arg); } fp.resize(fp.mPos); return fp; } public void align(int v) { if ((v <= 0) || ((v & (v - 1)) != 0)) { throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v); Loading Loading @@ -618,294 +627,182 @@ public class FieldPacker { return mPos; } private static void addToPack(FieldPacker fp, Object obj) { private void add(Object obj) { if (obj instanceof Boolean) { fp.addBoolean(((Boolean)obj).booleanValue()); addBoolean((Boolean)obj); return; } if (obj instanceof Byte) { fp.addI8(((Byte)obj).byteValue()); addI8((Byte)obj); return; } if (obj instanceof Short) { fp.addI16(((Short)obj).shortValue()); addI16((Short)obj); return; } if (obj instanceof Integer) { fp.addI32(((Integer)obj).intValue()); addI32((Integer)obj); return; } if (obj instanceof Long) { fp.addI64(((Long)obj).longValue()); addI64((Long)obj); return; } if (obj instanceof Float) { fp.addF32(((Float)obj).floatValue()); addF32((Float)obj); return; } if (obj instanceof Double) { fp.addF64(((Double)obj).doubleValue()); addF64((Double)obj); return; } if (obj instanceof Byte2) { fp.addI8((Byte2)obj); addI8((Byte2)obj); return; } if (obj instanceof Byte3) { fp.addI8((Byte3)obj); addI8((Byte3)obj); return; } if (obj instanceof Byte4) { fp.addI8((Byte4)obj); addI8((Byte4)obj); return; } if (obj instanceof Short2) { fp.addI16((Short2)obj); addI16((Short2)obj); return; } if (obj instanceof Short3) { fp.addI16((Short3)obj); addI16((Short3)obj); return; } if (obj instanceof Short4) { fp.addI16((Short4)obj); addI16((Short4)obj); return; } if (obj instanceof Int2) { fp.addI32((Int2)obj); addI32((Int2)obj); return; } if (obj instanceof Int3) { fp.addI32((Int3)obj); addI32((Int3)obj); return; } if (obj instanceof Int4) { fp.addI32((Int4)obj); addI32((Int4)obj); return; } if (obj instanceof Long2) { fp.addI64((Long2)obj); addI64((Long2)obj); return; } if (obj instanceof Long3) { fp.addI64((Long3)obj); addI64((Long3)obj); return; } if (obj instanceof Long4) { fp.addI64((Long4)obj); addI64((Long4)obj); return; } if (obj instanceof Float2) { fp.addF32((Float2)obj); addF32((Float2)obj); return; } if (obj instanceof Float3) { fp.addF32((Float3)obj); addF32((Float3)obj); return; } if (obj instanceof Float4) { fp.addF32((Float4)obj); addF32((Float4)obj); return; } if (obj instanceof Double2) { fp.addF64((Double2)obj); addF64((Double2)obj); return; } if (obj instanceof Double3) { fp.addF64((Double3)obj); addF64((Double3)obj); return; } if (obj instanceof Double4) { fp.addF64((Double4)obj); addF64((Double4)obj); return; } if (obj instanceof Matrix2f) { fp.addMatrix((Matrix2f)obj); addMatrix((Matrix2f)obj); return; } if (obj instanceof Matrix3f) { fp.addMatrix((Matrix3f)obj); addMatrix((Matrix3f)obj); return; } if (obj instanceof Matrix4f) { fp.addMatrix((Matrix4f)obj); addMatrix((Matrix4f)obj); return; } if (obj instanceof BaseObj) { fp.addObj((BaseObj)obj); addObj((BaseObj)obj); return; } } private static int getPackedSize(Object obj) { if (obj instanceof Boolean) { return 1; } if (obj instanceof Byte) { return 1; } if (obj instanceof Short) { return 2; } if (obj instanceof Integer) { return 4; } if (obj instanceof Long) { return 8; } if (obj instanceof Float) { return 4; } if (obj instanceof Double) { return 8; } if (obj instanceof Byte2) { return 2; } if (obj instanceof Byte3) { return 3; } if (obj instanceof Byte4) { return 4; } if (obj instanceof Short2) { return 4; } if (obj instanceof Short3) { return 6; } if (obj instanceof Short4) { return 8; } if (obj instanceof Int2) { return 8; } if (obj instanceof Int3) { return 12; } if (obj instanceof Int4) { return 16; } if (obj instanceof Long2) { return 16; } if (obj instanceof Long3) { return 24; } if (obj instanceof Long4) { return 32; } if (obj instanceof Float2) { return 8; } if (obj instanceof Float3) { return 12; } if (obj instanceof Float4) { return 16; } if (obj instanceof Double2) { return 16; } if (obj instanceof Double3) { return 24; } if (obj instanceof Double4) { return 32; } if (obj instanceof Matrix2f) { return 16; } if (obj instanceof Matrix3f) { return 36; } if (obj instanceof Matrix4f) { return 64; } if (obj instanceof BaseObj) { if (RenderScript.sPointerSize == 8) { return 32; } else { return 4; } private boolean resize(int newSize) { if (newSize == mLen) { return false; } return 0; byte[] newData = new byte[newSize]; System.arraycopy(mData, 0, newData, 0, mPos); mData = newData; mLen = newSize; return true; } static FieldPacker createFieldPack(Object[] args) { int len = 0; for (Object arg : args) { len += getPackedSize(arg); private void addSafely(Object obj) { boolean retry; final int oldPos = mPos; do { retry = false; try { add(obj); } catch (ArrayIndexOutOfBoundsException e) { mPos = oldPos; resize(mLen * 2); retry = true; } FieldPacker fp = new FieldPacker(len); for (Object arg : args) { addToPack(fp, arg); } return fp; } while (retry); } private final byte mData[]; private byte mData[]; private int mPos; private int mLen; private BitSet mAlignment; } rs/java/android/renderscript/ScriptGroup2.java +1 −1 Original line number Diff line number Diff line Loading @@ -112,7 +112,7 @@ public class ScriptGroup2 extends BaseObj { public Closure(RenderScript rs, Script.InvokeID invokeID, Object[] args, Map<Script.FieldID, Object> globals) { super(0, rs); mFP = FieldPacker.createFieldPack(args); mFP = FieldPacker.createFromArray(args); mArgs = args; mBindings = globals; Loading Loading
rs/java/android/renderscript/FieldPacker.java +61 −164 Original line number Diff line number Diff line Loading @@ -47,6 +47,15 @@ public class FieldPacker { // subAlign() can never work correctly for copied FieldPacker objects. } static FieldPacker createFromArray(Object[] args) { FieldPacker fp = new FieldPacker(RenderScript.sPointerSize * 8); for (Object arg : args) { fp.addSafely(arg); } fp.resize(fp.mPos); return fp; } public void align(int v) { if ((v <= 0) || ((v & (v - 1)) != 0)) { throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v); Loading Loading @@ -618,294 +627,182 @@ public class FieldPacker { return mPos; } private static void addToPack(FieldPacker fp, Object obj) { private void add(Object obj) { if (obj instanceof Boolean) { fp.addBoolean(((Boolean)obj).booleanValue()); addBoolean((Boolean)obj); return; } if (obj instanceof Byte) { fp.addI8(((Byte)obj).byteValue()); addI8((Byte)obj); return; } if (obj instanceof Short) { fp.addI16(((Short)obj).shortValue()); addI16((Short)obj); return; } if (obj instanceof Integer) { fp.addI32(((Integer)obj).intValue()); addI32((Integer)obj); return; } if (obj instanceof Long) { fp.addI64(((Long)obj).longValue()); addI64((Long)obj); return; } if (obj instanceof Float) { fp.addF32(((Float)obj).floatValue()); addF32((Float)obj); return; } if (obj instanceof Double) { fp.addF64(((Double)obj).doubleValue()); addF64((Double)obj); return; } if (obj instanceof Byte2) { fp.addI8((Byte2)obj); addI8((Byte2)obj); return; } if (obj instanceof Byte3) { fp.addI8((Byte3)obj); addI8((Byte3)obj); return; } if (obj instanceof Byte4) { fp.addI8((Byte4)obj); addI8((Byte4)obj); return; } if (obj instanceof Short2) { fp.addI16((Short2)obj); addI16((Short2)obj); return; } if (obj instanceof Short3) { fp.addI16((Short3)obj); addI16((Short3)obj); return; } if (obj instanceof Short4) { fp.addI16((Short4)obj); addI16((Short4)obj); return; } if (obj instanceof Int2) { fp.addI32((Int2)obj); addI32((Int2)obj); return; } if (obj instanceof Int3) { fp.addI32((Int3)obj); addI32((Int3)obj); return; } if (obj instanceof Int4) { fp.addI32((Int4)obj); addI32((Int4)obj); return; } if (obj instanceof Long2) { fp.addI64((Long2)obj); addI64((Long2)obj); return; } if (obj instanceof Long3) { fp.addI64((Long3)obj); addI64((Long3)obj); return; } if (obj instanceof Long4) { fp.addI64((Long4)obj); addI64((Long4)obj); return; } if (obj instanceof Float2) { fp.addF32((Float2)obj); addF32((Float2)obj); return; } if (obj instanceof Float3) { fp.addF32((Float3)obj); addF32((Float3)obj); return; } if (obj instanceof Float4) { fp.addF32((Float4)obj); addF32((Float4)obj); return; } if (obj instanceof Double2) { fp.addF64((Double2)obj); addF64((Double2)obj); return; } if (obj instanceof Double3) { fp.addF64((Double3)obj); addF64((Double3)obj); return; } if (obj instanceof Double4) { fp.addF64((Double4)obj); addF64((Double4)obj); return; } if (obj instanceof Matrix2f) { fp.addMatrix((Matrix2f)obj); addMatrix((Matrix2f)obj); return; } if (obj instanceof Matrix3f) { fp.addMatrix((Matrix3f)obj); addMatrix((Matrix3f)obj); return; } if (obj instanceof Matrix4f) { fp.addMatrix((Matrix4f)obj); addMatrix((Matrix4f)obj); return; } if (obj instanceof BaseObj) { fp.addObj((BaseObj)obj); addObj((BaseObj)obj); return; } } private static int getPackedSize(Object obj) { if (obj instanceof Boolean) { return 1; } if (obj instanceof Byte) { return 1; } if (obj instanceof Short) { return 2; } if (obj instanceof Integer) { return 4; } if (obj instanceof Long) { return 8; } if (obj instanceof Float) { return 4; } if (obj instanceof Double) { return 8; } if (obj instanceof Byte2) { return 2; } if (obj instanceof Byte3) { return 3; } if (obj instanceof Byte4) { return 4; } if (obj instanceof Short2) { return 4; } if (obj instanceof Short3) { return 6; } if (obj instanceof Short4) { return 8; } if (obj instanceof Int2) { return 8; } if (obj instanceof Int3) { return 12; } if (obj instanceof Int4) { return 16; } if (obj instanceof Long2) { return 16; } if (obj instanceof Long3) { return 24; } if (obj instanceof Long4) { return 32; } if (obj instanceof Float2) { return 8; } if (obj instanceof Float3) { return 12; } if (obj instanceof Float4) { return 16; } if (obj instanceof Double2) { return 16; } if (obj instanceof Double3) { return 24; } if (obj instanceof Double4) { return 32; } if (obj instanceof Matrix2f) { return 16; } if (obj instanceof Matrix3f) { return 36; } if (obj instanceof Matrix4f) { return 64; } if (obj instanceof BaseObj) { if (RenderScript.sPointerSize == 8) { return 32; } else { return 4; } private boolean resize(int newSize) { if (newSize == mLen) { return false; } return 0; byte[] newData = new byte[newSize]; System.arraycopy(mData, 0, newData, 0, mPos); mData = newData; mLen = newSize; return true; } static FieldPacker createFieldPack(Object[] args) { int len = 0; for (Object arg : args) { len += getPackedSize(arg); private void addSafely(Object obj) { boolean retry; final int oldPos = mPos; do { retry = false; try { add(obj); } catch (ArrayIndexOutOfBoundsException e) { mPos = oldPos; resize(mLen * 2); retry = true; } FieldPacker fp = new FieldPacker(len); for (Object arg : args) { addToPack(fp, arg); } return fp; } while (retry); } private final byte mData[]; private byte mData[]; private int mPos; private int mLen; private BitSet mAlignment; }
rs/java/android/renderscript/ScriptGroup2.java +1 −1 Original line number Diff line number Diff line Loading @@ -112,7 +112,7 @@ public class ScriptGroup2 extends BaseObj { public Closure(RenderScript rs, Script.InvokeID invokeID, Object[] args, Map<Script.FieldID, Object> globals) { super(0, rs); mFP = FieldPacker.createFieldPack(args); mFP = FieldPacker.createFromArray(args); mArgs = args; mBindings = globals; Loading