Implement named slots and convert script.addType to script.setType to remove ordering restrictions.
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 31bfc57..b98a48ab 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -142,10 +142,10 @@
native void nScriptSetClearDepth(int script, float depth);
native void nScriptSetClearStencil(int script, int stencil);
native void nScriptSetTimeZone(int script, byte[] timeZone);
+ native void nScriptSetType(int type, String name, int slot);
+ native void nScriptSetRoot(boolean isRoot);
native void nScriptCBegin();
- native void nScriptCAddType(int type);
- native void nScriptCSetRoot(boolean isRoot);
native void nScriptCSetScript(byte[] script, int offset, int length);
native int nScriptCCreate();
native void nScriptCAddDefineI32(String name, int value);
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 42c58ce..47479d8 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -20,6 +20,8 @@
* @hide
**/
public class Script extends BaseObj {
+ public static final int MAX_SLOT = 16;
+
boolean mIsRoot;
Type[] mTypes;
@@ -64,39 +66,36 @@
RenderScript mRS;
boolean mIsRoot = false;
Type[] mTypes;
- int mTypeCount;
+ String[] mNames;
Builder(RenderScript rs) {
mRS = rs;
- mTypes = new Type[4];
- mTypeCount = 0;
+ mTypes = new Type[MAX_SLOT];
+ mNames = new String[MAX_SLOT];
}
- public void addType(Type t) {
- if(mTypeCount >= mTypes.length) {
- Type[] nt = new Type[mTypeCount * 2];
- for(int ct=0; ct < mTypeCount; ct++) {
- nt[ct] = mTypes[ct];
- }
- mTypes = nt;
- }
- mTypes[mTypeCount] = t;
- mTypeCount++;
+ public void setType(Type t, int slot) {
+ mTypes[slot] = t;
+ mNames[slot] = null;
+ }
+
+ public void setType(Type t, String name, int slot) {
+ mTypes[slot] = t;
+ mNames[slot] = name;
}
void transferCreate() {
- mRS.nScriptCSetRoot(mIsRoot);
- for(int ct=0; ct < mTypeCount; ct++) {
- mRS.nScriptCAddType(mTypes[ct].mID);
+ mRS.nScriptSetRoot(mIsRoot);
+ for(int ct=0; ct < mTypes.length; ct++) {
+ if(mTypes[ct] != null) {
+ mRS.nScriptSetType(mTypes[ct].mID, mNames[ct], ct);
+ }
}
}
void transferObject(Script s) {
s.mIsRoot = mIsRoot;
- s.mTypes = new Type[mTypeCount];
- for(int ct=0; ct < mTypeCount; ct++) {
- s.mTypes[ct] = mTypes[ct];
- }
+ s.mTypes = mTypes;
}
public void setRoot(boolean r) {
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index d35d482..afb0e60 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -56,7 +56,7 @@
mRS.nTypeDestroy(mID);
}
- public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
+ public static Type createFromClass(RenderScript rs, Class c, int size) {
Element e = Element.createFromClass(rs, c);
Builder b = new Builder(rs, e);
b.add(Dimension.X, size);
@@ -91,10 +91,16 @@
rs.nTypeSetupFields(t, arTypes, arBits, fields);
}
t.mJavaClass = c;
+ return t;
+ }
+
+ public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
+ Type t = createFromClass(rs, c, size);
t.setName(scriptName);
return t;
}
+
public static class Builder {
RenderScript mRS;
Entry[] mEntries;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index ef0cf68..5780e02 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -824,6 +824,29 @@
}
}
+static void
+nScriptSetType(JNIEnv *_env, jobject _this, jint type, jstring _str, jint slot)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nScriptCAddType, con(%p), type(%p), slot(%i)", con, (RsType)type, slot);
+ const char* n = NULL;
+ if (_str) {
+ n = _env->GetStringUTFChars(_str, NULL);
+ }
+ rsScriptSetType((RsType)type, slot, n);
+ if (n) {
+ _env->ReleaseStringUTFChars(_str, n);
+ }
+}
+
+static void
+nScriptSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
+ rsScriptSetRoot(isRoot);
+}
+
// -----------------------------------
static void
@@ -835,22 +858,6 @@
}
static void
-nScriptCAddType(JNIEnv *_env, jobject _this, jint type)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nScriptCAddType, con(%p), type(%p)", con, (RsType)type);
- rsScriptCAddType((RsType)type);
-}
-
-static void
-nScriptCSetRoot(JNIEnv *_env, jobject _this, jboolean isRoot)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nScriptCSetRoot, con(%p), isRoot(%i)", con, isRoot);
- rsScriptCSetRoot(isRoot);
-}
-
-static void
nScriptCSetScript(JNIEnv *_env, jobject _this, jbyteArray scriptRef,
jint offset, jint length)
{
@@ -1374,10 +1381,10 @@
{"nScriptSetClearDepth", "(IF)V", (void*)nScriptSetClearDepth },
{"nScriptSetClearStencil", "(II)V", (void*)nScriptSetClearStencil },
{"nScriptSetTimeZone", "(I[B)V", (void*)nScriptSetTimeZone },
+{"nScriptSetType", "(ILjava/lang/String;I)V", (void*)nScriptSetType },
+{"nScriptSetRoot", "(Z)V", (void*)nScriptSetRoot },
{"nScriptCBegin", "()V", (void*)nScriptCBegin },
-{"nScriptCAddType", "(I)V", (void*)nScriptCAddType },
-{"nScriptCSetRoot", "(Z)V", (void*)nScriptCSetRoot },
{"nScriptCSetScript", "([BII)V", (void*)nScriptCSetScript },
{"nScriptCCreate", "()I", (void*)nScriptCCreate },
{"nScriptCAddDefineI32", "(Ljava/lang/String;I)V", (void*)nScriptCAddDefineI32 },