Fix bug with bad conversion of java strings to C strings for object names. Update test app to test object defines.
diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c
index afb2fb3..e7920fd 100644
--- a/libs/rs/java/Fountain/res/raw/fountain.c
+++ b/libs/rs/java/Fountain/res/raw/fountain.c
@@ -37,7 +37,7 @@
//contextBindProgramFragment(con, loadI32(con, 0, 7));
drawRect(con, 0, 256, 0, 512);
- contextBindProgramFragment(con, loadI32(con, 0, 6));
+ contextBindProgramFragment(con, NAMED_PgmFragParts);
if (touch) {
newPart = loadI32(con, 2, 0);
@@ -106,6 +106,6 @@
}
}
- drawTriangleArray(con, loadI32(con, 0, 5), drawCount);
+ drawTriangleArray(con, NAMED_PartBuffer, drawCount);
return 1;
}
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
index f8b488a..46f6fca 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
@@ -68,6 +68,7 @@
mIntAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, 10);
mPartAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, partCount * 3 * 3);
+ mPartAlloc.setName("PartBuffer");
mVertAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, partCount * 5 + 1);
{
@@ -97,7 +98,6 @@
mRS.programFragmentBegin(null, null);
mPF = mRS.programFragmentCreate();
mPF.setName("PgmFragParts");
- //mRS.contextBindProgramFragment(mPF);
mRS.programFragmentBegin(null, null);
mRS.programFragmentSetTexEnable(0, true);
@@ -113,8 +113,6 @@
mParams[3] = 0;
mParams[4] = 0;
mParams[5] = mPartAlloc.getID();
- mParams[6] = mPF.getID();
- mParams[7] = mPF2.getID();
mIntAlloc.data(mParams);
int t2[] = new int[partCount * 4*3];
diff --git a/libs/rs/jni/RenderScript_jni.cpp b/libs/rs/jni/RenderScript_jni.cpp
index dcd6e2f..fd19d88 100644
--- a/libs/rs/jni/RenderScript_jni.cpp
+++ b/libs/rs/jni/RenderScript_jni.cpp
@@ -70,7 +70,7 @@
jint len = _env->GetArrayLength(str);
jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
- rsAssignName((void *)obj, (const char *)cptr);
+ rsAssignName((void *)obj, (const char *)cptr, len);
_env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
}
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index b7eaed1..74445d3 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -19,6 +19,7 @@
AssignName {
param void *obj
param const char *name
+ param size_t len
}
ElementBegin {
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index ffd03d5..266c455 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -17,7 +17,7 @@
#include "rsDevice.h"
#include "rsContext.h"
#include "rsThreadIO.h"
-
+#include "utils/String8.h"
using namespace android;
using namespace android::renderscript;
@@ -246,10 +246,10 @@
pv->setupGL();
}
-void Context::assignName(ObjectBase *obj, const char *name)
+void Context::assignName(ObjectBase *obj, const char *name, uint32_t len)
{
rsAssert(!obj->getName());
- obj->setName(name);
+ obj->setName(name, len);
mNames.add(obj);
}
@@ -273,6 +273,19 @@
return NULL;
}
+void Context::appendNameDefines(String8 *str) const
+{
+ char buf[256];
+ for (size_t ct=0; ct < mNames.size(); ct++) {
+ str->append("#define NAMED_");
+ str->append(mNames[ct]->getName());
+ str->append(" ");
+ sprintf(buf, "%i\n", (int)mNames[ct]);
+ str->append(buf);
+ }
+}
+
+
///////////////////////////////////////////////////////////////////////////////////////////
//
@@ -316,10 +329,10 @@
rsc->setVertex(pv);
}
-void rsi_AssignName(Context *rsc, void * obj, const char *name)
+void rsi_AssignName(Context *rsc, void * obj, const char *name, uint32_t len)
{
ObjectBase *ob = static_cast<ObjectBase *>(obj);
- rsc->assignName(ob, name);
+ rsc->assignName(ob, name, len);
}
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 184740f..21ae8c5 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -76,9 +76,10 @@
void setupCheck();
- void assignName(ObjectBase *obj, const char *name);
+ void assignName(ObjectBase *obj, const char *name, uint32_t len);
void removeName(ObjectBase *obj);
ObjectBase * lookupName(const char *name) const;
+ void appendNameDefines(String8 *str) const;
protected:
Device *mDev;
diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp
index 8660818..8f5232a 100644
--- a/libs/rs/rsObjectBase.cpp
+++ b/libs/rs/rsObjectBase.cpp
@@ -56,3 +56,15 @@
strcpy(mName, name);
}
}
+
+void ObjectBase::setName(const char *name, uint32_t len)
+{
+ delete mName;
+ mName = NULL;
+ if (name) {
+ mName = new char[len + 1];
+ memcpy(mName, name, len);
+ mName[len] = 0;
+ }
+}
+
diff --git a/libs/rs/rsObjectBase.h b/libs/rs/rsObjectBase.h
index 4c52e9c..b2c3338 100644
--- a/libs/rs/rsObjectBase.h
+++ b/libs/rs/rsObjectBase.h
@@ -37,6 +37,7 @@
return mName;
}
void setName(const char *);
+ void setName(const char *, uint32_t len);
private:
char * mName;
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index ae58e5f..d29eb9f 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -19,6 +19,7 @@
#include "rsMatrix.h"
#include "acc/acc.h"
+#include "utils/String8.h"
using namespace android;
using namespace android::renderscript;
@@ -433,17 +434,22 @@
}
+
void ScriptCState::runCompiler(Context *rsc)
{
mAccScript = accCreateScript();
+ String8 tmp;
- const char* scriptSource[] = {mProgram.mScriptText};
- int scriptLength[] = {mProgram.mScriptTextLength} ;
- accScriptSource(mAccScript, 1, scriptSource, scriptLength);
+ rsc->appendNameDefines(&tmp);
+
+ const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
+ int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
+ accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
accCompileScript(mAccScript);
accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
rsAssert(mProgram.mScript);
+
if (mProgram.mScript) {
const static int pragmaMax = 16;
ACCsizei pragmaCount;