summaryrefslogtreecommitdiffstats
path: root/graphics
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-09-15 15:40:09 -0400
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-09-15 15:40:09 -0400
commitffa18dfac0b5e9e665897c9b1c107cb4268006b2 (patch)
treef3d1411810769fcb85531a8cb36ae76cc08a1885 /graphics
parent0ae011b6f6d709d840f60f25df2046c9545a10a2 (diff)
parent5f43fd289abbd5380b6068766daf721b555d0053 (diff)
downloadframeworks_base-ffa18dfac0b5e9e665897c9b1c107cb4268006b2.zip
frameworks_base-ffa18dfac0b5e9e665897c9b1c107cb4268006b2.tar.gz
frameworks_base-ffa18dfac0b5e9e665897c9b1c107cb4268006b2.tar.bz2
Merge change 25100 into eclair
* changes: Implement Object readback.
Diffstat (limited to 'graphics')
-rw-r--r--graphics/java/android/renderscript/Allocation.java4
-rw-r--r--graphics/java/android/renderscript/RenderScript.java1
-rw-r--r--graphics/jni/android_renderscript_RenderScript.cpp71
3 files changed, 72 insertions, 4 deletions
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 7749ad3..30c81ab 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -113,6 +113,10 @@ public class Allocation extends BaseObj {
mRS.nAllocationSubDataFromObject(mID, mType, 0, o);
}
+ public void read(Object o) {
+ mRS.nAllocationSubReadFromObject(mID, mType, 0, o);
+ }
+
public void subData(int offset, Object o) {
mRS.nAllocationSubDataFromObject(mID, mType, offset, o);
}
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 6f5b67e..89db4fa 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -106,6 +106,7 @@ public class RenderScript {
native void nAllocationRead(int id, int[] d);
native void nAllocationRead(int id, float[] d);
native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o);
+ native void nAllocationSubReadFromObject(int id, Type t, int offset, Object o);
native void nTriangleMeshBegin(int vertex, int index);
native void nTriangleMeshAddVertex_XY (float x, float y);
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index a94ccb1..90b5958 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -253,10 +253,39 @@ static void * SF_LoadFloat(JNIEnv *_env, jobject _obj, jfieldID _field, void *bu
return ((uint8_t *)buffer) + 4;
}
+static void * SF_SaveInt(JNIEnv *_env, jobject _obj, jfieldID _field, void *buffer)
+{
+ LOGE("Save Int");
+ _env->SetIntField(_obj, _field, ((int32_t *)buffer)[0]);
+ return ((uint8_t *)buffer) + 4;
+}
+
+static void * SF_SaveShort(JNIEnv *_env, jobject _obj, jfieldID _field, void *buffer)
+{
+ LOGE("Save Short");
+ _env->SetShortField(_obj, _field, ((int16_t *)buffer)[0]);
+ return ((uint8_t *)buffer) + 2;
+}
+
+static void * SF_SaveByte(JNIEnv *_env, jobject _obj, jfieldID _field, void *buffer)
+{
+ LOGE("Save Byte");
+ _env->SetByteField(_obj, _field, ((int8_t *)buffer)[0]);
+ return ((uint8_t *)buffer) + 1;
+}
+
+static void * SF_SaveFloat(JNIEnv *_env, jobject _obj, jfieldID _field, void *buffer)
+{
+ LOGE("Save Float");
+ _env->SetFloatField(_obj, _field, ((float *)buffer)[0]);
+ return ((uint8_t *)buffer) + 4;
+}
+
struct TypeFieldCache {
jfieldID field;
int bits;
void * (*ptr)(JNIEnv *, jobject, jfieldID, void *buffer);
+ void * (*readPtr)(JNIEnv *, jobject, jfieldID, void *buffer);
};
struct TypeCache {
@@ -296,13 +325,23 @@ nTypeSetupFields(JNIEnv *_env, jobject _this, jobject _type, jintArray _types, j
switch(fType[ct]) {
case RS_TYPE_FLOAT:
tfc[ct].ptr = SF_LoadFloat;
+ tfc[ct].readPtr = SF_SaveFloat;
break;
case RS_TYPE_UNSIGNED:
case RS_TYPE_SIGNED:
switch(tfc[ct].bits) {
- case 32: tfc[ct].ptr = SF_LoadInt; break;
- case 16: tfc[ct].ptr = SF_LoadShort; break;
- case 8: tfc[ct].ptr = SF_LoadByte; break;
+ case 32:
+ tfc[ct].ptr = SF_LoadInt;
+ tfc[ct].readPtr = SF_SaveInt;
+ break;
+ case 16:
+ tfc[ct].ptr = SF_LoadShort;
+ tfc[ct].readPtr = SF_SaveShort;
+ break;
+ case 8:
+ tfc[ct].ptr = SF_LoadByte;
+ tfc[ct].readPtr = SF_SaveByte;
+ break;
}
break;
}
@@ -545,7 +584,30 @@ nAllocationSubDataFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _t
buf = tfc->ptr(_env, _o, tfc->field, buf);
}
rsAllocation1DSubData(con, (RsAllocation)alloc, offset, 1, bufAlloc, tc->size);
- const uint32_t * tmp = (const uint32_t *)bufAlloc;
+ free(bufAlloc);
+}
+
+static void
+nAllocationSubReadFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _type, jint offset, jobject _o)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nAllocationReadFromObject con(%p), alloc(%p)", con, (RsAllocation)alloc);
+
+ assert(offset == 0);
+
+ const TypeCache *tc = (TypeCache *)_env->GetIntField(_type, gTypeNativeCache);
+
+ void * bufAlloc = malloc(tc->size);
+ void * buf = bufAlloc;
+ rsAllocationRead(con, (RsAllocation)alloc, bufAlloc);
+
+ LOGE("size %i, ", tc->size);
+
+ for (int ct=0; ct < tc->fieldCount; ct++) {
+ const TypeFieldCache *tfc = &tc->fields[ct];
+ LOGE("ct=%i, buf=%p", ct, buf);
+ buf = tfc->readPtr(_env, _o, tfc->field, buf);
+ }
free(bufAlloc);
}
@@ -1270,6 +1332,7 @@ static JNINativeMethod methods[] = {
{"nAllocationRead", "(I[I)V", (void*)nAllocationRead_i },
{"nAllocationRead", "(I[F)V", (void*)nAllocationRead_f },
{"nAllocationSubDataFromObject", "(ILandroid/renderscript/Type;ILjava/lang/Object;)V", (void*)nAllocationSubDataFromObject },
+{"nAllocationSubReadFromObject", "(ILandroid/renderscript/Type;ILjava/lang/Object;)V", (void*)nAllocationSubReadFromObject },
{"nTriangleMeshBegin", "(II)V", (void*)nTriangleMeshBegin },
{"nTriangleMeshAddVertex_XY", "(FF)V", (void*)nTriangleMeshAddVertex_XY },