summaryrefslogtreecommitdiffstats
path: root/graphics
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-08-25 14:31:48 -0700
committerJason Sams <rjsams@android.com>2010-08-25 14:41:20 -0700
commit1d45c47975ab2a8cef6db5a8976276de31e1e8d0 (patch)
tree1db2203004e52f51e4f0296adf4d4c332ea3dd56 /graphics
parent7462fc738fdaa5095d42f6176940c7111a2a54ac (diff)
downloadframeworks_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.java47
-rw-r--r--graphics/java/android/renderscript/FieldPacker.java18
-rw-r--r--graphics/java/android/renderscript/RenderScript.java25
-rw-r--r--graphics/jni/android_renderscript_RenderScript.cpp3
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;