diff options
author | Stephen Hines <srhines@google.com> | 2014-07-08 21:18:17 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-07-07 17:50:18 +0000 |
commit | 70a3c558645f8e693ce37577fdd61b8d1fd4ed9a (patch) | |
tree | 0ab4a6ca4bd807cdc56609404dd71b0cebe73666 | |
parent | 912700fca8e02fe93fca7d95ef22472f77349ffe (diff) | |
parent | 949610653fdf55dd2cb3c846047e6aa2c6d73f0d (diff) | |
download | frameworks_base-70a3c558645f8e693ce37577fdd61b8d1fd4ed9a.zip frameworks_base-70a3c558645f8e693ce37577fdd61b8d1fd4ed9a.tar.gz frameworks_base-70a3c558645f8e693ce37577fdd61b8d1fd4ed9a.tar.bz2 |
Merge "Adds support for multi-input kernels to Frameworks/Base/RS."
8 files changed, 173 insertions, 10 deletions
diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java index bbe5c49..f2b1380 100644 --- a/rs/java/android/renderscript/RenderScript.java +++ b/rs/java/android/renderscript/RenderScript.java @@ -615,6 +615,29 @@ public class RenderScript { } } + /** + * Multi-input code. + * + */ + + // @hide + native void rsnScriptForEachMultiClipped(long con, long id, int slot, long[] ains, long aout, byte[] params, + int xstart, int xend, int ystart, int yend, int zstart, int zend); + // @hide + native void rsnScriptForEachMultiClipped(long con, long id, int slot, long[] ains, long aout, + int xstart, int xend, int ystart, int yend, int zstart, int zend); + + // @hide + synchronized void nScriptForEachMultiClipped(long id, int slot, long[] ains, long aout, byte[] params, + int xstart, int xend, int ystart, int yend, int zstart, int zend) { + validate(); + if (params == null) { + rsnScriptForEachMultiClipped(mContext, id, slot, ains, aout, xstart, xend, ystart, yend, zstart, zend); + } else { + rsnScriptForEachMultiClipped(mContext, id, slot, ains, aout, params, xstart, xend, ystart, yend, zstart, zend); + } + } + native void rsnScriptInvokeV(long con, long id, int slot, byte[] params); synchronized void nScriptInvokeV(long id, int slot, byte[] params) { validate(); diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java index 0e46f94..c49ef94 100644 --- a/rs/java/android/renderscript/Script.java +++ b/rs/java/android/renderscript/Script.java @@ -182,6 +182,54 @@ public class Script extends BaseObj { mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend); } + /** + * Only intended for use by generated reflected code. + * + * @hide + */ + protected void forEach(int slot, Allocation[] ains, Allocation aout, FieldPacker v) { + forEach(slot, ains, aout, v, new LaunchOptions()); + } + + /** + * Only intended for use by generated reflected code. + * + * @hide + */ + protected void forEach(int slot, Allocation[] ains, Allocation aout, FieldPacker v, LaunchOptions sc) { + mRS.validate(); + + for (Allocation ain : ains) { + mRS.validateObject(ain); + } + + mRS.validateObject(aout); + if (ains == null && aout == null) { + throw new RSIllegalArgumentException( + "At least one of ain or aout is required to be non-null."); + } + + if (sc == null) { + forEach(slot, ains, aout, v); + return; + } + + long[] in_ids = new long[ains.length]; + for (int index = 0; index < ains.length; ++index) { + in_ids[index] = ains[index].getID(mRS); + } + + long out_id = 0; + if (aout != null) { + out_id = aout.getID(mRS); + } + byte[] params = null; + if (v != null) { + params = v.getData(); + } + mRS.nScriptForEachMultiClipped(getID(mRS), slot, in_ids, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend); + } + Script(long id, RenderScript rs) { super(id, rs); } @@ -477,4 +525,3 @@ public class Script extends BaseObj { } } - diff --git a/rs/java/android/renderscript/ScriptIntrinsicBlur.java b/rs/java/android/renderscript/ScriptIntrinsicBlur.java index d1a6fed..c153712 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicBlur.java +++ b/rs/java/android/renderscript/ScriptIntrinsicBlur.java @@ -88,7 +88,7 @@ public final class ScriptIntrinsicBlur extends ScriptIntrinsic { * type. */ public void forEach(Allocation aout) { - forEach(0, null, aout, null); + forEach(0, (Allocation) null, aout, null); } /** @@ -109,4 +109,3 @@ public final class ScriptIntrinsicBlur extends ScriptIntrinsic { return createFieldID(1, null); } } - diff --git a/rs/java/android/renderscript/ScriptIntrinsicConvolve3x3.java b/rs/java/android/renderscript/ScriptIntrinsicConvolve3x3.java index 25f3ee8..586930c 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicConvolve3x3.java +++ b/rs/java/android/renderscript/ScriptIntrinsicConvolve3x3.java @@ -108,7 +108,7 @@ public final class ScriptIntrinsicConvolve3x3 extends ScriptIntrinsic { * type. */ public void forEach(Allocation aout) { - forEach(0, null, aout, null); + forEach(0, (Allocation) null, aout, null); } /** @@ -130,4 +130,3 @@ public final class ScriptIntrinsicConvolve3x3 extends ScriptIntrinsic { } } - diff --git a/rs/java/android/renderscript/ScriptIntrinsicConvolve5x5.java b/rs/java/android/renderscript/ScriptIntrinsicConvolve5x5.java index 71ea4cb..aebafc2 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicConvolve5x5.java +++ b/rs/java/android/renderscript/ScriptIntrinsicConvolve5x5.java @@ -109,7 +109,7 @@ public final class ScriptIntrinsicConvolve5x5 extends ScriptIntrinsic { * type. */ public void forEach(Allocation aout) { - forEach(0, null, aout, null); + forEach(0, (Allocation) null, aout, null); } /** @@ -130,4 +130,3 @@ public final class ScriptIntrinsicConvolve5x5 extends ScriptIntrinsic { return createFieldID(1, null); } } - diff --git a/rs/java/android/renderscript/ScriptIntrinsicResize.java b/rs/java/android/renderscript/ScriptIntrinsicResize.java index cc37120..816029f 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicResize.java +++ b/rs/java/android/renderscript/ScriptIntrinsicResize.java @@ -96,7 +96,7 @@ public final class ScriptIntrinsicResize extends ScriptIntrinsic { * @param opt LaunchOptions for clipping */ public void forEach_bicubic(Allocation aout, Script.LaunchOptions opt) { - forEach(0, null, aout, null, opt); + forEach(0, (Allocation) null, aout, null, opt); } /** @@ -110,4 +110,3 @@ public final class ScriptIntrinsicResize extends ScriptIntrinsic { } - diff --git a/rs/java/android/renderscript/ScriptIntrinsicYuvToRGB.java b/rs/java/android/renderscript/ScriptIntrinsicYuvToRGB.java index f942982..e64c911 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicYuvToRGB.java +++ b/rs/java/android/renderscript/ScriptIntrinsicYuvToRGB.java @@ -66,7 +66,7 @@ public final class ScriptIntrinsicYuvToRGB extends ScriptIntrinsic { * type. */ public void forEach(Allocation aout) { - forEach(0, null, aout, null); + forEach(0, (Allocation) null, aout, null); } /** diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index 5fe631b..7133a21 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -1154,6 +1154,101 @@ nScriptForEachClippedV(JNIEnv *_env, jobject _this, jlong con, _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT); } +static void +nScriptForEachMultiClipped(JNIEnv *_env, jobject _this, jlong con, + jlong script, jint slot, jlongArray ains, jlong aout, + jint xstart, jint xend, + jint ystart, jint yend, jint zstart, jint zend) +{ + LOG_API("nScriptForEachMultiClipped, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); + + jint in_len = _env->GetArrayLength(ains); + jlong* in_ptr = _env->GetLongArrayElements(ains, NULL); + + RsAllocation *in_allocs = NULL; + + if (sizeof(RsAllocation) == sizeof(jlong)) { + in_allocs = (RsAllocation*)in_ptr; + + } else { + // Convert from 64-bit jlong types to the native pointer type. + + in_allocs = new RsAllocation[in_len]; + + for (int index = in_len; --index >= 0;) { + in_allocs[index] = (RsAllocation)in_ptr[index]; + } + } + + RsScriptCall sc; + sc.xStart = xstart; + sc.xEnd = xend; + sc.yStart = ystart; + sc.yEnd = yend; + sc.zStart = zstart; + sc.zEnd = zend; + sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE; + sc.arrayStart = 0; + sc.arrayEnd = 0; + + rsScriptForEachMulti((RsContext)con, (RsScript)script, slot, in_allocs, in_len, (RsAllocation)aout, NULL, 0, &sc, sizeof(sc)); + + if (sizeof(RsAllocation) != sizeof(jlong)) { + delete[] in_allocs; + } + + _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT); +} + +static void +nScriptForEachMultiClippedV(JNIEnv *_env, jobject _this, jlong con, + jlong script, jint slot, jlongArray ains, jlong aout, + jbyteArray params, jint xstart, jint xend, + jint ystart, jint yend, jint zstart, jint zend) +{ + LOG_API("nScriptForEachMultiClippedV, con(%p), s(%p), slot(%i)", (RsContext)con, (void *)script, slot); + + jint in_len = _env->GetArrayLength(ains); + jlong* in_ptr = _env->GetLongArrayElements(ains, NULL); + + RsAllocation *in_allocs = NULL; + + if (sizeof(RsAllocation) == sizeof(jlong)) { + in_allocs = (RsAllocation*)in_ptr; + + } else { + // Convert from 64-bit jlong types to the native pointer type. + + in_allocs = new RsAllocation[in_len]; + + for (int index = in_len; --index >= 0;) { + in_allocs[index] = (RsAllocation)in_ptr[index]; + } + } + + jint param_len = _env->GetArrayLength(params); + jbyte* param_ptr = _env->GetByteArrayElements(params, NULL); + + RsScriptCall sc; + sc.xStart = xstart; + sc.xEnd = xend; + sc.yStart = ystart; + sc.yEnd = yend; + sc.zStart = zstart; + sc.zEnd = zend; + sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE; + sc.arrayStart = 0; + sc.arrayEnd = 0; + rsScriptForEachMulti((RsContext)con, (RsScript)script, slot, in_allocs, in_len, (RsAllocation)aout, param_ptr, param_len, &sc, sizeof(sc)); + + if (sizeof(RsAllocation) != sizeof(jlong)) { + delete[] in_allocs; + } + + _env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT); + _env->ReleaseByteArrayElements(params, param_ptr, JNI_ABORT); +} + // ----------------------------------- static jlong @@ -1669,6 +1764,8 @@ static JNINativeMethod methods[] = { {"rsnScriptForEach", "(JJIJJ[B)V", (void*)nScriptForEachV }, {"rsnScriptForEachClipped", "(JJIJJIIIIII)V", (void*)nScriptForEachClipped }, {"rsnScriptForEachClipped", "(JJIJJ[BIIIIII)V", (void*)nScriptForEachClippedV }, +{"rsnScriptForEachMultiClipped", "(JJI[JJIIIIII)V", (void*)nScriptForEachMultiClipped }, +{"rsnScriptForEachMultiClipped", "(JJI[JJ[BIIIIII)V", (void*)nScriptForEachMultiClippedV }, {"rsnScriptSetVarI", "(JJII)V", (void*)nScriptSetVarI }, {"rsnScriptGetVarI", "(JJI)I", (void*)nScriptGetVarI }, {"rsnScriptSetVarJ", "(JJIJ)V", (void*)nScriptSetVarJ }, |