am 1004f0d0: am 3cab30a1: Merge "Create compat FieldPacker.getPos() to get the actual amount of data used for FP."
* commit '1004f0d0310eac235fa2c81d88ac8688628788ca':
Create compat FieldPacker.getPos() to get the actual amount of data used for FP.
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java b/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
index 8b17aab..eec493c 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
@@ -643,10 +643,11 @@
mRS.validate();
int eSize = mType.mElement.getBytesSize();
final byte[] data = fp.getData();
+ int data_length = fp.getPos();
- int count = data.length / eSize;
- if ((eSize * count) != data.length) {
- throw new RSIllegalArgumentException("Field packer length " + data.length +
+ int count = data_length / eSize;
+ if ((eSize * count) != data_length) {
+ throw new RSIllegalArgumentException("Field packer length " + data_length +
" not divisible by element size " + eSize + ".");
}
copy1DRangeFromUnchecked(xoff, count, data);
@@ -670,16 +671,17 @@
}
final byte[] data = fp.getData();
+ int data_length = fp.getPos();
int eSize = mType.mElement.mElements[component_number].getBytesSize();
eSize *= mType.mElement.mArraySizes[component_number];
- if (data.length != eSize) {
- throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
+ if (data_length != eSize) {
+ throw new RSIllegalArgumentException("Field packer sizelength " + data_length +
" does not match component size " + eSize + ".");
}
mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD,
- component_number, data, data.length);
+ component_number, data, data_length);
}
private void data1DChecks(int off, int count, int len, int dataSize) {
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java b/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java
index f3eb0da..2ae7edf 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java
@@ -195,8 +195,15 @@
public void setFromFieldPacker(int xoff, FieldPacker fp) {
try {
+ // Must construct actual FieldPacker from scratch, since we don't
+ // know how many bytes were actually used.
+ byte[] data = fp.getData();
+ int fp_length = fp.getPos();
android.renderscript.FieldPacker nfp =
- new android.renderscript.FieldPacker(fp.getData());
+ new android.renderscript.FieldPacker(fp_length);
+ for (int i = 0; i < fp_length; i++) {
+ nfp.addI8(data[i]);
+ }
mN.setFromFieldPacker(xoff, nfp);
} catch (android.renderscript.RSRuntimeException e) {
throw ExceptionThunker.convertException(e);
@@ -204,8 +211,15 @@
}
public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
try {
+ // Must construct actual FieldPacker from scratch, since we don't
+ // know how many bytes were actually used.
+ byte[] data = fp.getData();
+ int fp_length = fp.getPos();
android.renderscript.FieldPacker nfp =
- new android.renderscript.FieldPacker(fp.getData());
+ new android.renderscript.FieldPacker(fp_length);
+ for (int i = 0; i < fp_length; i++) {
+ nfp.addI8(data[i]);
+ }
mN.setFromFieldPacker(xoff, component_number, nfp);
} catch (android.renderscript.RSRuntimeException e) {
throw ExceptionThunker.convertException(e);
@@ -495,4 +509,4 @@
}
}
-}
\ No newline at end of file
+}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
index ffdb66f..1e54631 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
@@ -544,6 +544,13 @@
return mData;
}
+ public int getPos() {
+ if (RenderScript.shouldThunk()) {
+ return mN.getPos();
+ }
+ return mPos;
+ }
+
private final byte mData[];
private int mPos;
private int mLen;
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java
index 3e990f6..fe021e1 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java
@@ -30,65 +30,83 @@
**/
public class FieldPackerThunker {
private android.renderscript.FieldPacker mN;
+ private int mPos;
public FieldPackerThunker(int len) {
mN = new android.renderscript.FieldPacker(len);
+ mPos = 0;
}
void align(int v) {
mN.align(v);
+ while ((mPos & (v - 1)) != 0) {
+ mPos++;
+ }
}
void reset() {
mN.reset();
+ mPos = 0;
}
void reset(int i) {
mN.reset(i);
+ mPos = i;
}
public void skip(int i) {
mN.skip(i);
+ mPos += i;
}
public void addI8(byte v) {
mN.addI8(v);
+ mPos++;
}
public void addI16(short v) {
mN.addI16(v);
+ mPos += 2;
}
public void addI32(int v) {
mN.addI32(v);
+ mPos += 4;
}
public void addI64(long v) {
mN.addI64(v);
+ mPos += 8;
}
public void addU8(short v) {
mN.addU8(v);
+ mPos++;
}
public void addU16(int v) {
mN.addU16(v);
+ mPos += 2;
}
public void addU32(long v) {
mN.addU32(v);
+ mPos += 4;
}
public void addU64(long v) {
mN.addU64(v);
+ mPos += 8;
}
public void addF32(float v) {
mN.addF32(v);
+ mPos += 4;
}
public void addF64(double v) {
mN.addF64(v);
+ mPos += 8;
}
public void addObj(BaseObj obj) {
@@ -97,127 +115,167 @@
} else {
mN.addObj(null);
}
+ mPos += 4; // Compat lib only works in 32-bit mode, so objects are 4 bytes.
}
public void addF32(Float2 v) {
mN.addF32(new android.renderscript.Float2(v.x, v.y));
+ mPos += 8;
}
public void addF32(Float3 v) {
mN.addF32(new android.renderscript.Float3(v.x, v.y, v.z));
+ mPos += 12;
}
public void addF32(Float4 v) {
mN.addF32(new android.renderscript.Float4(v.x, v.y, v.z, v.w));
+ mPos += 16;
}
public void addF64(Double2 v) {
mN.addF64(new android.renderscript.Double2(v.x, v.y));
+ mPos += 16;
}
public void addF64(Double3 v) {
mN.addF64(new android.renderscript.Double3(v.x, v.y, v.z));
+ mPos += 24;
}
public void addF64(Double4 v) {
mN.addF64(new android.renderscript.Double4(v.x, v.y, v.z, v.w));
+ mPos += 32;
}
public void addI8(Byte2 v) {
mN.addI8(new android.renderscript.Byte2(v.x, v.y));
+ mPos += 2;
}
public void addI8(Byte3 v) {
mN.addI8(new android.renderscript.Byte3(v.x, v.y, v.z));
+ mPos += 3;
}
public void addI8(Byte4 v) {
mN.addI8(new android.renderscript.Byte4(v.x, v.y, v.z, v.w));
+ mPos += 4;
}
public void addU8(Short2 v) {
mN.addU8(new android.renderscript.Short2(v.x, v.y));
+ mPos += 2;
}
public void addU8(Short3 v) {
mN.addU8(new android.renderscript.Short3(v.x, v.y, v.z));
+ mPos += 3;
}
public void addU8(Short4 v) {
mN.addU8(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
+ mPos += 4;
}
public void addI16(Short2 v) {
mN.addI16(new android.renderscript.Short2(v.x, v.y));
+ mPos += 4;
}
public void addI16(Short3 v) {
mN.addI16(new android.renderscript.Short3(v.x, v.y, v.z));
+ mPos += 6;
}
public void addI16(Short4 v) {
mN.addI16(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
+ mPos += 8;
}
public void addU16(Int2 v) {
mN.addU16(new android.renderscript.Int2(v.x, v.y));
+ mPos += 4;
}
public void addU16(Int3 v) {
mN.addU16(new android.renderscript.Int3(v.x, v.y, v.z));
+ mPos += 6;
}
public void addU16(Int4 v) {
mN.addU16(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
+ mPos += 8;
}
public void addI32(Int2 v) {
mN.addI32(new android.renderscript.Int2(v.x, v.y));
+ mPos += 8;
}
public void addI32(Int3 v) {
mN.addI32(new android.renderscript.Int3(v.x, v.y, v.z));
+ mPos += 12;
}
public void addI32(Int4 v) {
mN.addI32(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
+ mPos += 16;
}
public void addU32(Long2 v) {
mN.addU32(new android.renderscript.Long2(v.x, v.y));
+ mPos += 8;
}
public void addU32(Long3 v) {
mN.addU32(new android.renderscript.Long3(v.x, v.y, v.z));
+ mPos += 12;
}
public void addU32(Long4 v) {
mN.addU32(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
+ mPos += 16;
}
public void addI64(Long2 v) {
mN.addI64(new android.renderscript.Long2(v.x, v.y));
+ mPos += 16;
}
public void addI64(Long3 v) {
mN.addI64(new android.renderscript.Long3(v.x, v.y, v.z));
+ mPos += 24;
}
public void addI64(Long4 v) {
mN.addI64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
+ mPos += 32;
}
public void addU64(Long2 v) {
mN.addU64(new android.renderscript.Long2(v.x, v.y));
+ mPos += 16;
}
public void addU64(Long3 v) {
mN.addU64(new android.renderscript.Long3(v.x, v.y, v.z));
+ mPos += 24;
}
public void addU64(Long4 v) {
mN.addU64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
+ mPos += 32;
}
public void addMatrix(Matrix4f v) {
mN.addMatrix(new android.renderscript.Matrix4f(v.getArray()));
+ mPos += (4 * 4 * 4);
}
public void addMatrix(Matrix3f v) {
mN.addMatrix(new android.renderscript.Matrix3f(v.getArray()));
+ mPos += (3 * 3 * 4);
}
public void addMatrix(Matrix2f v) {
mN.addMatrix(new android.renderscript.Matrix2f(v.getArray()));
+ mPos += (2 * 2 * 4);
}
public void addBoolean(boolean v) {
mN.addBoolean(v);
+ mPos++;
}
public final byte[] getData() {
return mN.getData();
}
+
+ // We must compute our own mPos, since this API is not available in older target APIs.
+ public int getPos() {
+ return mPos;
+ }
}