summaryrefslogtreecommitdiffstats
path: root/libs/rs/rsScriptC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/rs/rsScriptC.cpp')
-rw-r--r--libs/rs/rsScriptC.cpp154
1 files changed, 123 insertions, 31 deletions
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 36019ab..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;
@@ -27,7 +28,7 @@ using namespace android::renderscript;
ScriptC::ScriptC()
{
mAccScript = NULL;
- mScript = NULL;
+ memset(&mProgram, 0, sizeof(mProgram));
}
ScriptC::~ScriptC()
@@ -390,7 +391,15 @@ static rsc_FunctionTable scriptCPtrTable = {
bool ScriptC::run(Context *rsc, uint32_t launchID)
{
Env e = {rsc, this};
- return mScript(&e, &scriptCPtrTable, launchID) != 0;
+
+ if (mEnviroment.mFragmentStore.get()) {
+ rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
+ }
+ if (mEnviroment.mFragment.get()) {
+ rsc->setFragment(mEnviroment.mFragment.get());
+ }
+
+ return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
}
ScriptCState::ScriptCState()
@@ -407,17 +416,96 @@ ScriptCState::~ScriptCState()
void ScriptCState::clear()
{
+ memset(&mProgram, 0, sizeof(mProgram));
+
mConstantBufferTypes.clear();
- mClearColor[0] = 0;
- mClearColor[1] = 0;
- mClearColor[2] = 0;
- mClearColor[3] = 1;
- mClearDepth = 1;
- mClearStencil = 0;
+
+ memset(&mEnviroment, 0, sizeof(mEnviroment));
+ mEnviroment.mClearColor[0] = 0;
+ mEnviroment.mClearColor[1] = 0;
+ mEnviroment.mClearColor[2] = 0;
+ mEnviroment.mClearColor[3] = 1;
+ mEnviroment.mClearDepth = 1;
+ mEnviroment.mClearStencil = 0;
+ mEnviroment.mIsRoot = false;
+ mEnviroment.mIsOrtho = true;
+
mAccScript = NULL;
- mScript = NULL;
- mIsRoot = false;
- mIsOrtho = true;
+
+}
+
+
+void ScriptCState::runCompiler(Context *rsc)
+{
+ mAccScript = accCreateScript();
+ String8 tmp;
+
+ 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;
+ ACCchar * str[pragmaMax];
+ accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
+
+ for (int ct=0; ct < pragmaCount; ct+=2) {
+ LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
+
+ if (!strcmp(str[ct], "version")) {
+ continue;
+
+ }
+
+
+ if (!strcmp(str[ct], "stateVertex")) {
+ LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
+ }
+
+ if (!strcmp(str[ct], "stateRaster")) {
+ LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
+ }
+
+ if (!strcmp(str[ct], "stateFragment")) {
+ ProgramFragment * pf =
+ (ProgramFragment *)rsc->lookupName(str[ct+1]);
+ if (pf != NULL) {
+ mEnviroment.mFragment.set(pf);
+ continue;
+ }
+ LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
+ }
+
+ if (!strcmp(str[ct], "stateFragmentStore")) {
+ ProgramFragmentStore * pfs =
+ (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
+ if (pfs != NULL) {
+ mEnviroment.mFragmentStore.set(pfs);
+ continue;
+ }
+
+ if (!strcmp(str[ct+1], "parent")) {
+ //mEnviroment.mStateFragmentStore =
+ //Script::Enviroment_t::FRAGMENT_STORE_PARENT;
+ continue;
+ }
+ LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
+ }
+
+ }
+
+
+ } else {
+ // Deal with an error.
+ }
+
}
namespace android {
@@ -432,22 +520,22 @@ void rsi_ScriptCBegin(Context * rsc)
void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->mClearColor[0] = r;
- ss->mClearColor[1] = g;
- ss->mClearColor[2] = b;
- ss->mClearColor[3] = a;
+ ss->mEnviroment.mClearColor[0] = r;
+ ss->mEnviroment.mClearColor[1] = g;
+ ss->mEnviroment.mClearColor[2] = b;
+ ss->mEnviroment.mClearColor[3] = a;
}
void rsi_ScriptCSetClearDepth(Context * rsc, float v)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->mClearDepth = v;
+ ss->mEnviroment.mClearDepth = v;
}
void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->mClearStencil = v;
+ ss->mEnviroment.mClearStencil = v;
}
void rsi_ScriptCAddType(Context * rsc, RsType vt)
@@ -456,41 +544,45 @@ void rsi_ScriptCAddType(Context * rsc, RsType vt)
ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
}
-void rsi_ScriptCSetScript(Context * rsc, void* accScript, void *vp)
+void rsi_ScriptCSetScript(Context * rsc, void *vp)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->mAccScript = reinterpret_cast<ACCscript*>(accScript);
- ss->mScript = reinterpret_cast<rsc_RunScript>(vp);
+ ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
}
void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->mIsRoot = isRoot;
+ ss->mEnviroment.mIsRoot = isRoot;
}
void rsi_ScriptCSetOrtho(Context * rsc, bool isOrtho)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->mIsOrtho = isOrtho;
+ ss->mEnviroment.mIsOrtho = isOrtho;
}
+void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
+{
+ ScriptCState *ss = &rsc->mScriptC;
+ ss->mProgram.mScriptText = text;
+ ss->mProgram.mScriptTextLength = len;
+}
+
+
RsScript rsi_ScriptCCreate(Context * rsc)
{
ScriptCState *ss = &rsc->mScriptC;
+ ss->runCompiler(rsc);
+
ScriptC *s = new ScriptC();
+ s->incRef();
s->mAccScript = ss->mAccScript;
ss->mAccScript = NULL;
- s->mScript = ss->mScript;
- s->mClearColor[0] = ss->mClearColor[0];
- s->mClearColor[1] = ss->mClearColor[1];
- s->mClearColor[2] = ss->mClearColor[2];
- s->mClearColor[3] = ss->mClearColor[3];
- s->mClearDepth = ss->mClearDepth;
- s->mClearStencil = ss->mClearStencil;
- s->mIsRoot = ss->mIsRoot;
- s->mIsOrtho = ss->mIsOrtho;
+ s->mEnviroment = ss->mEnviroment;
+ s->mProgram = ss->mProgram;
+ ss->clear();
return s;
}