diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java index 0cafdd715106a..8e69f562336b5 100644 --- a/graphics/java/android/renderscript/Allocation.java +++ b/graphics/java/android/renderscript/Allocation.java @@ -1262,7 +1262,7 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo"); validateIsInt8(); mRS.validate(); - mRS.nAllocationRead(getID(mRS), d); + mRS.nAllocationRead(getID(mRS), d, Element.DataType.SIGNED_8); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1277,7 +1277,7 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo"); validateIsInt16(); mRS.validate(); - mRS.nAllocationRead(getID(mRS), d); + mRS.nAllocationRead(getID(mRS), d, Element.DataType.SIGNED_16); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1292,7 +1292,7 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo"); validateIsInt32(); mRS.validate(); - mRS.nAllocationRead(getID(mRS), d); + mRS.nAllocationRead(getID(mRS), d, Element.DataType.SIGNED_32); Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1307,7 +1307,7 @@ public class Allocation extends BaseObj { Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo"); validateIsFloat32(); mRS.validate(); - mRS.nAllocationRead(getID(mRS), d); + mRS.nAllocationRead(getID(mRS), d, Element.DataType.FLOAT_32); Trace.traceEnd(RenderScript.TRACE_TAG); } diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index da0cfeb5357c3..322a0457a77e0 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -425,6 +425,7 @@ public class RenderScript { validate(); rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID); } + native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b); synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) { validate(); @@ -457,26 +458,28 @@ public class RenderScript { rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID); } - native void rsnAllocationRead(int con, int id, byte[] d); - synchronized void nAllocationRead(int id, byte[] d) { + native void rsnAllocationRead(int con, int id, Object d, int dt); + synchronized void nAllocationRead(int id, Object d, Element.DataType dt) { validate(); - rsnAllocationRead(mContext, id, d); + rsnAllocationRead(mContext, id, d, dt.mID); } - native void rsnAllocationRead(int con, int id, short[] d); - synchronized void nAllocationRead(int id, short[] d) { + + native void rsnAllocationRead1D(int con, int id, int off, int mip, int count, Object d, + int sizeBytes, int dt); + synchronized void nAllocationRead1D(int id, int off, int mip, int count, Object d, + int sizeBytes, Element.DataType dt) { validate(); - rsnAllocationRead(mContext, id, d); + rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID); } - native void rsnAllocationRead(int con, int id, int[] d); - synchronized void nAllocationRead(int id, int[] d) { + + native void rsnAllocationRead2D(int con, int id, int xoff, int yoff, int mip, int face, + int w, int h, Object d, int sizeBytes, int dt); + synchronized void nAllocationRead2D(int id, int xoff, int yoff, int mip, int face, + int w, int h, Object d, int sizeBytes, Element.DataType dt) { validate(); - rsnAllocationRead(mContext, id, d); - } - native void rsnAllocationRead(int con, int id, float[] d); - synchronized void nAllocationRead(int id, float[] d) { - validate(); - rsnAllocationRead(mContext, id, d); + rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID); } + native int rsnAllocationGetType(int con, int id); synchronized int nAllocationGetType(int id) { validate(); diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index e56df0a28db8d..10d042c5fe8ee 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -53,16 +53,19 @@ using namespace android; #define PER_ARRAY_TYPE(flag, fnc, ...) { \ jint len = 0; \ void *ptr = NULL; \ + size_t typeBytes = 0; \ switch(dataType) { \ case RS_TYPE_FLOAT_32: \ len = _env->GetArrayLength((jfloatArray)data); \ ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \ + typeBytes = 4; \ fnc(__VA_ARGS__); \ _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, JNI_ABORT); \ return; \ case RS_TYPE_FLOAT_64: \ len = _env->GetArrayLength((jdoubleArray)data); \ ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \ + typeBytes = 8; \ fnc(__VA_ARGS__); \ _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, JNI_ABORT);\ return; \ @@ -70,6 +73,7 @@ using namespace android; case RS_TYPE_UNSIGNED_8: \ len = _env->GetArrayLength((jbyteArray)data); \ ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \ + typeBytes = 1; \ fnc(__VA_ARGS__); \ _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, JNI_ABORT); \ return; \ @@ -77,6 +81,7 @@ using namespace android; case RS_TYPE_UNSIGNED_16: \ len = _env->GetArrayLength((jshortArray)data); \ ptr = _env->GetShortArrayElements((jshortArray)data, flag); \ + typeBytes = 2; \ fnc(__VA_ARGS__); \ _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, JNI_ABORT); \ return; \ @@ -84,6 +89,7 @@ using namespace android; case RS_TYPE_UNSIGNED_32: \ len = _env->GetArrayLength((jintArray)data); \ ptr = _env->GetIntArrayElements((jintArray)data, flag); \ + typeBytes = 4; \ fnc(__VA_ARGS__); \ _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, JNI_ABORT); \ return; \ @@ -91,6 +97,7 @@ using namespace android; case RS_TYPE_UNSIGNED_64: \ len = _env->GetArrayLength((jlongArray)data); \ ptr = _env->GetLongArrayElements((jlongArray)data, flag); \ + typeBytes = 8; \ fnc(__VA_ARGS__); \ _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, JNI_ABORT); \ return; \ @@ -742,48 +749,34 @@ nAllocationData3D_alloc(JNIEnv *_env, jobject _this, RsContext con, srcXoff, srcYoff, srcZoff, srcMip); } + static void -nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data) +nAllocationRead(JNIEnv *_env, jobject _this, RsContext con, jint _alloc, jobject data, int dataType) { - jint len = _env->GetArrayLength(data); - LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); - jint *ptr = _env->GetIntArrayElements(data, NULL); - jsize length = _env->GetArrayLength(data); - rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(int)); - _env->ReleaseIntArrayElements(data, ptr, 0); + RsAllocation *alloc = (RsAllocation *)_alloc; + LOG_API("nAllocationRead, con(%p), alloc(%p)", con, (RsAllocation)alloc); + PER_ARRAY_TYPE(0, rsAllocationRead, con, alloc, ptr, len * typeBytes); } static void -nAllocationRead_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jshortArray data) +nAllocationRead1D(JNIEnv *_env, jobject _this, RsContext con, jint _alloc, jint offset, jint lod, + jint count, jobject data, int sizeBytes, int dataType) { - jint len = _env->GetArrayLength(data); - LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); - jshort *ptr = _env->GetShortArrayElements(data, NULL); - jsize length = _env->GetArrayLength(data); - rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(short)); - _env->ReleaseShortArrayElements(data, ptr, 0); + RsAllocation *alloc = (RsAllocation *)_alloc; + LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i), dataType(%i)", + con, alloc, offset, count, len, sizeBytes, dataType); + PER_ARRAY_TYPE(0, rsAllocation1DRead, con, alloc, offset, lod, count, ptr, sizeBytes); } static void -nAllocationRead_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jbyteArray data) +nAllocationRead2D(JNIEnv *_env, jobject _this, RsContext con, jint _alloc, jint xoff, jint yoff, jint lod, jint _face, + jint w, jint h, jobject data, int sizeBytes, int dataType) { - jint len = _env->GetArrayLength(data); - LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); - jbyte *ptr = _env->GetByteArrayElements(data, NULL); - jsize length = _env->GetArrayLength(data); - rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(char)); - _env->ReleaseByteArrayElements(data, ptr, 0); -} - -static void -nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data) -{ - jint len = _env->GetArrayLength(data); - LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len); - jfloat *ptr = _env->GetFloatArrayElements(data, NULL); - jsize length = _env->GetArrayLength(data); - rsAllocationRead(con, (RsAllocation)alloc, ptr, length * sizeof(float)); - _env->ReleaseFloatArrayElements(data, ptr, 0); + RsAllocation *alloc = (RsAllocation *)_alloc; + RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; + LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)", + con, alloc, xoff, yoff, w, h, sizeBytes, dataType); + PER_ARRAY_TYPE(0, rsAllocation2DRead, con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); } static jint @@ -1572,10 +1565,9 @@ static JNINativeMethod methods[] = { {"rsnAllocationData2D", "(IIIIIIIIIIIII)V", (void*)nAllocationData2D_alloc }, {"rsnAllocationData3D", "(IIIIIIIIILjava/lang/Object;II)V", (void*)nAllocationData3D }, {"rsnAllocationData3D", "(IIIIIIIIIIIIII)V", (void*)nAllocationData3D_alloc }, -{"rsnAllocationRead", "(II[I)V", (void*)nAllocationRead_i }, -{"rsnAllocationRead", "(II[S)V", (void*)nAllocationRead_s }, -{"rsnAllocationRead", "(II[B)V", (void*)nAllocationRead_b }, -{"rsnAllocationRead", "(II[F)V", (void*)nAllocationRead_f }, +{"rsnAllocationRead", "(IILjava/lang/Object;I)V", (void*)nAllocationRead }, +{"rsnAllocationRead1D", "(IIIIILjava/lang/Object;II)V", (void*)nAllocationRead1D }, +{"rsnAllocationRead2D", "(IIIIIIIILjava/lang/Object;II)V", (void*)nAllocationRead2D }, {"rsnAllocationGetType", "(II)I", (void*)nAllocationGetType}, {"rsnAllocationResize1D", "(III)V", (void*)nAllocationResize1D }, {"rsnAllocationGenerateMipmaps", "(II)V", (void*)nAllocationGenerateMipmaps },