diff options
| author | 2009-08-09 23:01:04 -0700 | |
|---|---|---|
| committer | 2009-08-09 23:01:04 -0700 | |
| commit | 6307f0285ea3d6bb8cb1b28709a22b240e446fed (patch) | |
| tree | df569856a3bca1f6b9a1cf80442b931d473342d9 | |
| parent | 42431bc35e48c298260b33c7dea0dbc6f7f6e472 (diff) | |
| parent | d7b3774da62d3c70cc7e8cf549967a1c823501e6 (diff) | |
Merge change 20586
* changes:
Let java put #defines into renderscript
| -rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 4 | ||||
| -rw-r--r-- | graphics/java/android/renderscript/ScriptC.java | 33 | ||||
| -rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 43 | ||||
| -rw-r--r-- | libs/rs/rs.spec | 19 | ||||
| -rw-r--r-- | libs/rs/rsContext.cpp | 29 | ||||
| -rw-r--r-- | libs/rs/rsContext.h | 14 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.cpp | 39 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.h | 6 |
8 files changed, 176 insertions, 11 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 8fc5ad5d1018..9840bbb2379c 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -68,6 +68,8 @@ public class RenderScript { native void nContextBindProgramFragmentStore(int pfs); native void nContextBindProgramFragment(int pf); native void nContextBindProgramVertex(int pf); + native void nContextAddDefineI32(String name, int value); + native void nContextAddDefineF(String name, float value); native void nAssignName(int obj, byte[] name); native int nFileOpen(byte[] name); @@ -139,6 +141,8 @@ public class RenderScript { native void nScriptCSetRoot(boolean isRoot); native void nScriptCSetScript(byte[] script, int offset, int length); native int nScriptCCreate(); + native void nScriptCAddDefineI32(String name, int value); + native void nScriptCAddDefineF(String name, float value); native void nSamplerDestroy(int sampler); native void nSamplerBegin(); diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java index 0592f5d3c54c..0f231d645d32 100644 --- a/graphics/java/android/renderscript/ScriptC.java +++ b/graphics/java/android/renderscript/ScriptC.java @@ -16,11 +16,13 @@ package android.renderscript; -import java.io.IOException; -import java.io.InputStream; - import android.content.res.Resources; +import android.util.Log; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map.Entry; +import java.util.HashMap; /** * @hide @@ -30,12 +32,11 @@ public class ScriptC extends Script { super(id, rs); } - - - public static class Builder extends Script.Builder { byte[] mProgram; int mProgramLength; + HashMap<String,Integer> mIntDefines = new HashMap(); + HashMap<String,Float> mFloatDefines = new HashMap(); public Builder(RenderScript rs) { super(rs); @@ -63,7 +64,7 @@ public class ScriptC extends Script { } } - public void setScript(InputStream is) throws IOException { + public void setScript(InputStream is) throws IOException { byte[] buf = new byte[1024]; int currentPos = 0; while(true) { @@ -88,19 +89,33 @@ public class ScriptC extends Script { b.mRS.nScriptCBegin(); b.transferCreate(); - b.mRS.nScriptCSetScript(b.mProgram, 0, b.mProgramLength); + for (Entry<String,Integer> e: b.mIntDefines.entrySet()) { + b.mRS.nScriptCAddDefineI32(e.getKey(), e.getValue().intValue()); + } + for (Entry<String,Float> e: b.mFloatDefines.entrySet()) { + b.mRS.nScriptCAddDefineF(e.getKey(), e.getValue().floatValue()); + } + b.mRS.nScriptCSetScript(b.mProgram, 0, b.mProgramLength); int id = b.mRS.nScriptCCreate(); ScriptC obj = new ScriptC(id, b.mRS); b.transferObject(obj); + return obj; } + public void addDefine(String name, int value) { + mIntDefines.put(name, value); + } + + public void addDefine(String name, float value) { + mFloatDefines.put(name, value); + } + public ScriptC create() { return internalCreate(this); } } - } diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index 06525fc9a2c9..2c3a6cbfc22e 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -765,6 +765,26 @@ nScriptCCreate(JNIEnv *_env, jobject _this) return (jint)rsScriptCCreate(); } +static void +nScriptCAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value) +{ + RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); + const char* n = _env->GetStringUTFChars(name, NULL); + LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value); + rsScriptCSetDefineI32(n, value); + _env->ReleaseStringUTFChars(name, n); +} + +static void +nScriptCAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value) +{ + RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); + const char* n = _env->GetStringUTFChars(name, NULL); + LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value); + rsScriptCSetDefineF(n, value); + _env->ReleaseStringUTFChars(name, n); +} + // --------------------------------------------------------------------------- static void @@ -985,6 +1005,27 @@ nContextBindProgramVertex(JNIEnv *_env, jobject _this, jint pf) rsContextBindProgramVertex((RsProgramVertex)pf); } +static void +nContextAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value) +{ + RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); + const char* n = _env->GetStringUTFChars(name, NULL); + LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value); + rsContextSetDefineI32(n, value); + _env->ReleaseStringUTFChars(name, n); +} + +static void +nContextAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value) +{ + RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); + const char* n = _env->GetStringUTFChars(name, NULL); + LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value); + rsContextSetDefineF(n, value); + _env->ReleaseStringUTFChars(name, n); +} + + // --------------------------------------------------------------------------- static void @@ -1197,6 +1238,8 @@ static JNINativeMethod methods[] = { {"nScriptCSetRoot", "(Z)V", (void*)nScriptCSetRoot }, {"nScriptCSetScript", "([BII)V", (void*)nScriptCSetScript }, {"nScriptCCreate", "()I", (void*)nScriptCCreate }, +{"nScriptCAddDefineI32", "(Ljava/lang/String;I)V", (void*)nScriptCAddDefineI32 }, +{"nScriptCAddDefineF", "(Ljava/lang/String;F)V", (void*)nScriptCAddDefineF }, {"nProgramFragmentStoreBegin", "(II)V", (void*)nProgramFragmentStoreBegin }, {"nProgramFragmentStoreDepthFunc", "(I)V", (void*)nProgramFragmentStoreDepthFunc }, diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index e5d30e4eadba..b64483377178 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -16,6 +16,16 @@ ContextBindProgramVertex { param RsProgramVertex pgm } +ContextSetDefineF { + param const char* name + param float value + } + +ContextSetDefineI32 { + param const char* name + param int32_t value + } + AssignName { param void *obj param const char *name @@ -318,6 +328,15 @@ ScriptCCreate { ret RsScript } +ScriptCSetDefineF { + param const char* name + param float value + } + +ScriptCSetDefineI32 { + param const char* name + param int32_t value + } ProgramFragmentStoreBegin { param RsElement in diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 46bd892c5fb5..9de23b32f03d 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -331,6 +331,26 @@ void Context::appendNameDefines(String8 *str) const } } +void Context::appendVarDefines(String8 *str) const +{ + char buf[256]; + for (size_t ct=0; ct < mInt32Defines.size(); ct++) { + str->append("#define "); + str->append(mInt32Defines.keyAt(ct)); + str->append(" "); + sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct)); + str->append(buf); + + } + for (size_t ct=0; ct < mFloatDefines.size(); ct++) { + str->append("#define "); + str->append(mFloatDefines.keyAt(ct)); + str->append(" "); + sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct)); + str->append(buf); + } +} + /////////////////////////////////////////////////////////////////////////////////////////// // @@ -381,6 +401,15 @@ void rsi_AssignName(Context *rsc, void * obj, const char *name, uint32_t len) rsc->assignName(ob, name, len); } +void rsi_ContextSetDefineF(Context *rsc, const char* name, float value) +{ + rsc->addInt32Define(name, value); +} + +void rsi_ContextSetDefineI32(Context *rsc, const char* name, int32_t value) +{ + rsc->addFloatDefine(name, value); +} } } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 5d4146010966..799c443865f7 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -19,6 +19,8 @@ #include "rsUtils.h" +#include <utils/KeyedVector.h> +#include <utils/String8.h> #include <utils/Vector.h> #include <ui/Surface.h> @@ -93,7 +95,7 @@ public: void removeName(ObjectBase *obj); ObjectBase * lookupName(const char *name) const; void appendNameDefines(String8 *str) const; - + void appendVarDefines(String8 *str) const; ProgramFragment * getDefaultProgramFragment() const { return mStateFragment.mDefault.get(); @@ -105,6 +107,14 @@ public: return mStateFragmentStore.mDefault.get(); } + void addInt32Define(const char* name, int32_t value) { + mInt32Defines.add(String8(name), value); + } + + void addFloatDefine(const char* name, float value) { + mFloatDefines.add(String8(name), value); + } + protected: Device *mDev; @@ -143,6 +153,8 @@ private: Surface *mWndSurface; Vector<ObjectBase *> mNames; + KeyedVector<String8,int> mInt32Defines; + KeyedVector<String8,float> mFloatDefines; }; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index efe6ff7f49eb..3343db51af93 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -104,6 +104,8 @@ void ScriptCState::clear() mAccScript = NULL; + mInt32Defines.clear(); + mFloatDefines.clear(); } static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) @@ -123,6 +125,8 @@ void ScriptCState::runCompiler(Context *rsc) rsc->appendNameDefines(&tmp); appendDecls(&tmp); + rsc->appendVarDefines(&tmp); + appendVarDefines(&tmp); tmp.append("#line 1\n"); const char* scriptSource[] = {tmp.string(), mProgram.mScriptText}; @@ -138,7 +142,6 @@ void ScriptCState::runCompiler(Context *rsc) ACCsizei len; accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf); LOGE(buf); - } mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); @@ -215,9 +218,31 @@ void ScriptCState::runCompiler(Context *rsc) } else { // Deal with an error. } +} + +void ScriptCState::appendVarDefines(String8 *str) +{ + char buf[256]; + LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n", + mInt32Defines.size(), mFloatDefines.size()); + for (size_t ct=0; ct < mInt32Defines.size(); ct++) { + str->append("#define "); + str->append(mInt32Defines.keyAt(ct)); + str->append(" "); + sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct)); + str->append(buf); + } + for (size_t ct=0; ct < mFloatDefines.size(); ct++) { + str->append("#define "); + str->append(mFloatDefines.keyAt(ct)); + str->append(" "); + sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct)); + str->append(buf); + } } + namespace android { namespace renderscript { @@ -270,6 +295,18 @@ RsScript rsi_ScriptCCreate(Context * rsc) return s; } +void rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value) +{ + ScriptCState *ss = &rsc->mScriptC; + ss->mFloatDefines.add(String8(name), value); +} + +void rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value) +{ + ScriptCState *ss = &rsc->mScriptC; + ss->mInt32Defines.add(String8(name), value); +} + } } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 860b4d19e1ab..ad0e3ee13928 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -21,6 +21,8 @@ #include "RenderScriptEnv.h" +#include <utils/KeyedVector.h> + struct ACCscript; // --------------------------------------------------------------------------- @@ -70,6 +72,7 @@ public: void clear(); void runCompiler(Context *rsc); + void appendVarDefines(String8 *str); struct SymbolTable_t { const char * mName; @@ -80,6 +83,9 @@ public: static SymbolTable_t gSyms[]; static const SymbolTable_t * lookupSymbol(const char *); static void appendDecls(String8 *str); + + KeyedVector<String8,int> mInt32Defines; + KeyedVector<String8,float> mFloatDefines; }; |