diff options
Diffstat (limited to 'rs/java')
-rw-r--r-- | rs/java/android/renderscript/Allocation.java | 14 | ||||
-rw-r--r-- | rs/java/android/renderscript/Element.java | 30 | ||||
-rw-r--r-- | rs/java/android/renderscript/FieldPacker.java | 38 | ||||
-rw-r--r-- | rs/java/android/renderscript/Font.java | 8 | ||||
-rw-r--r-- | rs/java/android/renderscript/ProgramVertexFixedFunction.java | 3 | ||||
-rw-r--r-- | rs/java/android/renderscript/RenderScript.java | 7 | ||||
-rw-r--r-- | rs/java/android/renderscript/ScriptC.java | 33 |
7 files changed, 107 insertions, 26 deletions
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java index 2191b54..d9588e8 100644 --- a/rs/java/android/renderscript/Allocation.java +++ b/rs/java/android/renderscript/Allocation.java @@ -770,10 +770,11 @@ public class Allocation extends BaseObj { 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); @@ -797,16 +798,17 @@ public class Allocation extends BaseObj { } 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/rs/java/android/renderscript/Element.java b/rs/java/android/renderscript/Element.java index 55b671d..c6b5b0d 100644 --- a/rs/java/android/renderscript/Element.java +++ b/rs/java/android/renderscript/Element.java @@ -140,17 +140,17 @@ public class Element extends BaseObj { MATRIX_3X3 (17, 36), MATRIX_2X2 (18, 16), - RS_ELEMENT (1000, 4), - RS_TYPE (1001, 4), - RS_ALLOCATION (1002, 4), - RS_SAMPLER (1003, 4), - RS_SCRIPT (1004, 4), - RS_MESH (1005, 4), - RS_PROGRAM_FRAGMENT (1006, 4), - RS_PROGRAM_VERTEX (1007, 4), - RS_PROGRAM_RASTER (1008, 4), - RS_PROGRAM_STORE (1009, 4), - RS_FONT (1010, 4); + RS_ELEMENT (1000), + RS_TYPE (1001), + RS_ALLOCATION (1002), + RS_SAMPLER (1003), + RS_SCRIPT (1004), + RS_MESH (1005), + RS_PROGRAM_FRAGMENT (1006), + RS_PROGRAM_VERTEX (1007), + RS_PROGRAM_RASTER (1008), + RS_PROGRAM_STORE (1009), + RS_FONT (1010); int mID; int mSize; @@ -158,6 +158,14 @@ public class Element extends BaseObj { mID = id; mSize = size; } + + DataType(int id) { + mID = id; + mSize = 4; + if (RenderScript.sPointerSize == 8) { + mSize = 32; + } + } } /** diff --git a/rs/java/android/renderscript/FieldPacker.java b/rs/java/android/renderscript/FieldPacker.java index 723ab24..20b07e7 100644 --- a/rs/java/android/renderscript/FieldPacker.java +++ b/rs/java/android/renderscript/FieldPacker.java @@ -36,10 +36,15 @@ public class FieldPacker { } public FieldPacker(byte[] data) { - mPos = 0; + // Advance mPos to the end of the buffer, since we are copying in the + // full data input. + mPos = data.length; mLen = data.length; mData = data; mAlignment = new BitSet(); + // TODO: We should either have an actual FieldPacker copy constructor + // or drop support for computing alignment like this. As it stands, + // subAlign() can never work correctly for copied FieldPacker objects. } public void align(int v) { @@ -75,7 +80,7 @@ public class FieldPacker { mPos = 0; } public void reset(int i) { - if ((i < 0) || (i >= mLen)) { + if ((i < 0) || (i > mLen)) { throw new RSIllegalArgumentException("out of range argument: " + i); } mPos = i; @@ -231,10 +236,24 @@ public class FieldPacker { public void addObj(BaseObj obj) { if (obj != null) { - // FIXME: this is fine for 32-bit but needs a path for 64-bit - addI32((int)obj.getID(null)); + if (RenderScript.sPointerSize == 8) { + addI64(obj.getID(null)); + addI64(0); + addI64(0); + addI64(0); + } + else { + addI32((int)obj.getID(null)); + } } else { - addI32(0); + if (RenderScript.sPointerSize == 8) { + addI64(0); + addI64(0); + addI64(0); + addI64(0); + } else { + addI32(0); + } } } @@ -591,6 +610,15 @@ public class FieldPacker { return mData; } + /** + * Get the actual length used for the FieldPacker. + * + * @hide + */ + public int getPos() { + return mPos; + } + private final byte mData[]; private int mPos; private int mLen; diff --git a/rs/java/android/renderscript/Font.java b/rs/java/android/renderscript/Font.java index b22aeb7..4318b9d 100644 --- a/rs/java/android/renderscript/Font.java +++ b/rs/java/android/renderscript/Font.java @@ -111,10 +111,10 @@ public class Font extends BaseObj { FontFamily serifFamily = new FontFamily(); serifFamily.mNames = sSerifNames; - serifFamily.mNormalFileName = "DroidSerif-Regular.ttf"; - serifFamily.mBoldFileName = "DroidSerif-Bold.ttf"; - serifFamily.mItalicFileName = "DroidSerif-Italic.ttf"; - serifFamily.mBoldItalicFileName = "DroidSerif-BoldItalic.ttf"; + serifFamily.mNormalFileName = "NotoSerif-Regular.ttf"; + serifFamily.mBoldFileName = "NotoSerif-Bold.ttf"; + serifFamily.mItalicFileName = "NotoSerif-Italic.ttf"; + serifFamily.mBoldItalicFileName = "NotoSerif-BoldItalic.ttf"; addFamilyToMap(serifFamily); FontFamily monoFamily = new FontFamily(); diff --git a/rs/java/android/renderscript/ProgramVertexFixedFunction.java b/rs/java/android/renderscript/ProgramVertexFixedFunction.java index 5173af2..45840ae 100644 --- a/rs/java/android/renderscript/ProgramVertexFixedFunction.java +++ b/rs/java/android/renderscript/ProgramVertexFixedFunction.java @@ -245,6 +245,9 @@ public class ProgramVertexFixedFunction extends ProgramVertex { for(int i = 0; i < 16; i ++) { mIOBuffer.addF32(m.mMat[i]); } + // Reset the buffer back to the end, since we want to flush all of + // the contents back (and not just what we wrote now). + mIOBuffer.reset(mIOBuffer.getData().length); mAlloc.setFromFieldPacker(0, mIOBuffer); } diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java index c748c1b..44de480 100644 --- a/rs/java/android/renderscript/RenderScript.java +++ b/rs/java/android/renderscript/RenderScript.java @@ -82,6 +82,12 @@ public class RenderScript { */ public static final int CREATE_FLAG_LOW_POWER = 0x0004; + /* + * Detect the bitness of the VM to allow FieldPacker to do the right thing. + */ + static native int rsnSystemGetPointerSize(); + static int sPointerSize; + static { sInitialized = false; if (!SystemProperties.getBoolean("config.disable_renderscript", false)) { @@ -99,6 +105,7 @@ public class RenderScript { System.loadLibrary("rs_jni"); _nInit(); sInitialized = true; + sPointerSize = rsnSystemGetPointerSize(); } catch (UnsatisfiedLinkError e) { Log.e(LOG_TAG, "Error loading RS jni library: " + e); throw new RSRuntimeException("Error loading RS jni library: " + e); diff --git a/rs/java/android/renderscript/ScriptC.java b/rs/java/android/renderscript/ScriptC.java index 9e76f52..3176e28 100644 --- a/rs/java/android/renderscript/ScriptC.java +++ b/rs/java/android/renderscript/ScriptC.java @@ -67,6 +67,26 @@ public class ScriptC extends Script { } /** + * Only intended for use by the generated derived classes. + * + * @param rs + * @hide + */ + protected ScriptC(RenderScript rs, String resName, byte[] bitcode32, byte[] bitcode64) { + super(0, rs); + long id = 0; + if (RenderScript.sPointerSize == 4) { + id = internalStringCreate(rs, resName, bitcode32); + } else { + id = internalStringCreate(rs, resName, bitcode64); + } + if (id == 0) { + throw new RSRuntimeException("Loading of ScriptC script failed."); + } + setID(id); + } + + /** * Name of the file that holds the object cache. */ private static final String CACHE_PATH = "com.android.renderscript.cache"; @@ -113,4 +133,17 @@ public class ScriptC extends Script { // Log.v(TAG, "Create script for resource = " + resName); return rs.nScriptCCreate(resName, mCachePath, pgm, pgmLength); } + + private static synchronized long internalStringCreate(RenderScript rs, String resName, byte[] bitcode) { + // Create the RS cache path if we haven't done so already. + if (mCachePath == null) { + File f = new File(rs.mCacheDir, CACHE_PATH); + mCachePath = f.getAbsolutePath(); + f.mkdirs(); + } + // Log.v(TAG, "Create script for resource = " + resName); + return rs.nScriptCCreate(resName, mCachePath, bitcode, bitcode.length); + } + + } |