diff options
author | Jason Sams <rjsams@android.com> | 2010-08-25 14:31:48 -0700 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2010-08-25 14:41:20 -0700 |
commit | 1d45c47975ab2a8cef6db5a8976276de31e1e8d0 (patch) | |
tree | 1db2203004e52f51e4f0296adf4d4c332ea3dd56 /graphics | |
parent | 7462fc738fdaa5095d42f6176940c7111a2a54ac (diff) | |
download | frameworks_base-1d45c47975ab2a8cef6db5a8976276de31e1e8d0.zip frameworks_base-1d45c47975ab2a8cef6db5a8976276de31e1e8d0.tar.gz frameworks_base-1d45c47975ab2a8cef6db5a8976276de31e1e8d0.tar.bz2 |
Add matrix component types.
Fix potental overflow in script -> java messages.
Change-Id: Ie6fd9dc376be4043fc938a1517106936937689c8
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/java/android/renderscript/Element.java | 47 | ||||
-rw-r--r-- | graphics/java/android/renderscript/FieldPacker.java | 18 | ||||
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 25 | ||||
-rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 3 |
4 files changed, 75 insertions, 18 deletions
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java index b811479..ed09f89 100644 --- a/graphics/java/android/renderscript/Element.java +++ b/graphics/java/android/renderscript/Element.java @@ -54,16 +54,20 @@ public class Element extends BaseObj { UNSIGNED_5_5_5_1 (14, 2), UNSIGNED_4_4_4_4 (15, 2), - RS_ELEMENT (16, 4), - RS_TYPE (17, 4), - RS_ALLOCATION (18, 4), - RS_SAMPLER (19, 4), - RS_SCRIPT (20, 4), - RS_MESH (21, 4), - RS_PROGRAM_FRAGMENT (22, 4), - RS_PROGRAM_VERTEX (23, 4), - RS_PROGRAM_RASTER (24, 4), - RS_PROGRAM_STORE (25, 4); + MATRIX_4X4 (16, 64), + 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); int mID; int mSize; @@ -285,6 +289,29 @@ public class Element extends BaseObj { return rs.mElement_UCHAR_4; } + public static Element MATRIX_4X4(RenderScript rs) { + if(rs.mElement_MATRIX_4X4 == null) { + rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4); + } + return rs.mElement_MATRIX_4X4; + } + public static Element MATRIX4X4(RenderScript rs) { + return MATRIX_4X4(rs); + } + + public static Element MATRIX_3X3(RenderScript rs) { + if(rs.mElement_MATRIX_3X3 == null) { + rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3); + } + return rs.mElement_MATRIX_4X4; + } + + public static Element MATRIX_2X2(RenderScript rs) { + if(rs.mElement_MATRIX_2X2 == null) { + rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2); + } + return rs.mElement_MATRIX_2X2; + } Element(int id, RenderScript rs, Element[] e, String[] n) { super(id, rs); diff --git a/graphics/java/android/renderscript/FieldPacker.java b/graphics/java/android/renderscript/FieldPacker.java index 24f0409..b6f88be 100644 --- a/graphics/java/android/renderscript/FieldPacker.java +++ b/graphics/java/android/renderscript/FieldPacker.java @@ -248,6 +248,24 @@ public class FieldPacker { addU32(v.w); } + public void addObj(Matrix4f v) { + for (int i=0; i < v.mMat.length; i++) { + addF32(v.mMat[i]); + } + } + + public void addObj(Matrix3f v) { + for (int i=0; i < v.mMat.length; i++) { + addF32(v.mMat[i]); + } + } + + public void addObj(Matrix2f v) { + for (int i=0; i < v.mMat.length; i++) { + addF32(v.mMat[i]); + } + } + public void addBoolean(boolean v) { addI8((byte)(v ? 1 : 0)); } diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index ab1d765..08ba7e2 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -542,6 +542,10 @@ public class RenderScript { Element mElement_FLOAT_4; Element mElement_UCHAR_4; + Element mElement_MATRIX_4X4; + Element mElement_MATRIX_3X3; + Element mElement_MATRIX_2X2; + Sampler mSampler_CLAMP_NEAREST; Sampler mSampler_CLAMP_LINEAR; Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR; @@ -614,15 +618,22 @@ public class RenderScript { int[] rbuf = new int[16]; mRS.nContextInitToClient(mRS.mContext); while(mRun) { + rbuf[0] = 0; int msg = mRS.nContextGetMessage(mRS.mContext, rbuf, true); if (msg == 0) { - // Should only happen during teardown. - // But we want to avoid starving other threads during - // teardown by yielding until the next line in the destructor - // can execute to set mRun = false - try { - sleep(1, 0); - } catch(InterruptedException e) { + // Can happen for two reasons + if (rbuf[0] > 0) { + // 1: Buffer needs to be enlarged. + rbuf = new int[rbuf[0] + 2]; + } else { + // 2: teardown. + // But we want to avoid starving other threads during + // teardown by yielding until the next line in the destructor + // can execute to set mRun = false + try { + sleep(1, 0); + } catch(InterruptedException e) { + } } } if(mRS.mMessageCallback != null) { diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index b2e8dd9..81f08e9 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -228,7 +228,8 @@ nContextGetMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data, j size_t receiveLen; int id = rsContextGetMessage(con, ptr, &receiveLen, len * 4, wait); if (!id && receiveLen) { - LOGE("message receive buffer too small. %i", receiveLen); + LOGV("message receive buffer too small. %i", receiveLen); + *ptr = (jint)receiveLen; } _env->ReleaseIntArrayElements(data, ptr, 0); return id; |