From da423d8479a2cefb456a03d7dc550e74e473acf4 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Tue, 9 Jun 2009 12:15:30 -0700 Subject: [PATCH] checkpoint pragma support. Includes more cleanup of script enviroment storage to keep the env settings in the base and only the per language state in ScriptC. --- libs/rs/java/Fountain/res/raw/fountain.c | 7 ++ libs/rs/rsContext.cpp | 23 +++- libs/rs/rsContext.h | 5 + libs/rs/rsObjectBase.h | 13 ++- libs/rs/rsScript.h | 36 ++++++- libs/rs/rsScriptC.cpp | 131 +++++++++++++++++++++++ libs/rs/rsScriptC.h | 2 +- 7 files changed, 204 insertions(+), 13 deletions(-) diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c index 8b473abb73601..5055c3959e2a5 100644 --- a/libs/rs/java/Fountain/res/raw/fountain.c +++ b/libs/rs/java/Fountain/res/raw/fountain.c @@ -1,5 +1,12 @@ // Fountain test script +#pragma version(1) +#pragma stateVertex(orthoWindow) +#pragma stateRaster(flat) +#pragma stateFragment(color) +#pragma stateStore(parent) + + int main(void* con, int ft, int launchID) { int count, touch, x, y, rate, maxLife, lifeShift; int life; diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 6a47de132f99a..82d64992efcdb 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -57,21 +57,34 @@ void Context::initEGL() eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight); } +bool Context::runScript(Script *s) +{ + ObjectBaseRef frag(mFragment); + ObjectBaseRef vtx(mVertex); + ObjectBaseRef store(mFragmentStore); + + + + return true; + +} + + bool Context::runRootScript() { - rsAssert(mRootScript->mIsRoot); + rsAssert(mRootScript->mEnviroment.mIsRoot); glColor4f(1,1,1,1); glEnable(GL_LIGHT0); - glViewport(0, 0, 320, 480); - float aspectH = 480.f / 320.f; + glViewport(0, 0, mWidth, mHeight); - if(mRootScript->mIsOrtho) { + if(mRootScript->mEnviroment.mIsOrtho) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrthof(0, 320, 480, 0, 0, 1); + glOrthof(0, mWidth, mHeight, 0, 0, 1); glMatrixMode(GL_MODELVIEW); } else { + float aspectH = ((float)mWidth) / mHeight; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustumf(-1, 1, -aspectH, aspectH, 1, 100); diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 64717e42b71a4..929c0f9b82f95 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -103,11 +103,16 @@ protected: ObjectBaseRef mVertex; ObjectBaseRef mFragmentStore; + ProgramFragment * mDefaultFragment; + ProgramVertex * mDefaultVertex; + ProgramFragmentStore * mDefaultFragmentStore; + private: Context(); void initEGL(); + bool runScript(Script *s); bool runRootScript(); static void * threadProc(void *); diff --git a/libs/rs/rsObjectBase.h b/libs/rs/rsObjectBase.h index 7761e49fc1bbc..ca7acda5a92d8 100644 --- a/libs/rs/rsObjectBase.h +++ b/libs/rs/rsObjectBase.h @@ -47,6 +47,16 @@ public: mRef = NULL; } + ObjectBaseRef(const ObjectBaseRef &ref) { + mRef = ref.get(); + mRef->incRef(); + } + + ObjectBaseRef(T *ref) { + mRef = ref; + ref->incRef(); + } + ~ObjectBaseRef() { clear(); } @@ -77,9 +87,6 @@ public: protected: T * mRef; -private: - ObjectBaseRef(const ObjectBaseRef &) {}; - }; diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h index efe52ad867a59..25a21c1a19b6a 100644 --- a/libs/rs/rsScript.h +++ b/libs/rs/rsScript.h @@ -40,10 +40,38 @@ public: float mClearDepth; uint32_t mClearStencil; - bool mUseStateVertex; - bool mUseStateRaster; - bool mUseStateFragment; - bool mUseStateStore; + enum StateVertex { + VTX_ORTHO_WINDOW, + VTX_ORTHO_NORMALIZED, + VTX_PROJECTION, + VTX_PARENT + }; + StateVertex mStateVertex; + + enum StateRaster { + RASTER_FLAT, + RASTER_SMOOTH, + RASTER_PARENT + }; + StateRaster mStateRaster; + + enum StateFragment { + FRAGMENT_COLOR, + FRAGMENT_TEX_REPLACE, + FRAGMENT_TEX_MODULATE, + FRAGMENT_PARENT + }; + StateFragment mStateFragment; + + enum StateFragmentStore { + FRAGMENT_STORE_ALWAYS_REPLACE, + FRAGMENT_STORE_ALWAYS_BLEND, + FRAGMENT_STORE_DEPTH_LESS_REPLACE, + FRAGMENT_STORE_DEPTH_LESS_BLEND, + FRAGMENT_STORE_PARENT + }; + StateFragmentStore mStateFragmentStore; + }; Enviroment_t mEnviroment; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 91b743cffc7d3..49d787297d1b1 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -434,6 +434,136 @@ void ScriptCState::runCompiler() accScriptSource(mAccScript, 1, 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]); + + // Start with defaults + mEnviroment.mStateVertex = + Script::Enviroment_t::VTX_ORTHO_WINDOW; + mEnviroment.mStateRaster = + Script::Enviroment_t::RASTER_FLAT; + mEnviroment.mStateFragment = + Script::Enviroment_t::FRAGMENT_COLOR; + mEnviroment.mStateFragmentStore = + Script::Enviroment_t::FRAGMENT_STORE_ALWAYS_REPLACE; + + 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")) { + if (!strcmp(str[ct+1], "orthoWindow")) { + mEnviroment.mStateVertex = + Script::Enviroment_t::VTX_ORTHO_WINDOW; + continue; + } + if (!strcmp(str[ct+1], "orthoNormalized")) { + mEnviroment.mStateVertex = + Script::Enviroment_t::VTX_ORTHO_NORMALIZED; + continue; + } + if (!strcmp(str[ct+1], "projection")) { + mEnviroment.mStateVertex = + Script::Enviroment_t::VTX_PROJECTION; + continue; + } + if (!strcmp(str[ct+1], "parent")) { + mEnviroment.mStateVertex = + Script::Enviroment_t::VTX_PARENT; + continue; + } + LOGE("Unreconized value %s passed to stateVertex", str[ct+1]); + } + + if (!strcmp(str[ct], "stateRaster")) { + if (!strcmp(str[ct+1], "flat")) { + mEnviroment.mStateRaster = + Script::Enviroment_t::RASTER_FLAT; + continue; + } + if (!strcmp(str[ct+1], "smooth")) { + mEnviroment.mStateRaster = + Script::Enviroment_t::RASTER_SMOOTH; + continue; + } + if (!strcmp(str[ct+1], "parent")) { + mEnviroment.mStateRaster = + Script::Enviroment_t::RASTER_PARENT; + continue; + } + LOGE("Unreconized value %s passed to stateRaster", str[ct+1]); + } + + if (!strcmp(str[ct], "stateFragment")) { + if (!strcmp(str[ct+1], "color")) { + mEnviroment.mStateFragment = + Script::Enviroment_t::FRAGMENT_COLOR; + continue; + } + if (!strcmp(str[ct+1], "texReplace")) { + mEnviroment.mStateFragment = + Script::Enviroment_t::FRAGMENT_TEX_REPLACE; + continue; + } + if (!strcmp(str[ct+1], "texModulate")) { + mEnviroment.mStateFragment = + Script::Enviroment_t::FRAGMENT_TEX_MODULATE; + continue; + } + if (!strcmp(str[ct+1], "parent")) { + mEnviroment.mStateFragment = + Script::Enviroment_t::FRAGMENT_PARENT; + continue; + } + LOGE("Unreconized value %s passed to stateFragment", str[ct+1]); + } + + if (!strcmp(str[ct], "stateFragmentStore")) { + if (!strcmp(str[ct+1], "alwaysReplace")) { + mEnviroment.mStateFragmentStore = + Script::Enviroment_t::FRAGMENT_STORE_ALWAYS_REPLACE; + continue; + } + if (!strcmp(str[ct+1], "alwaysBlend")) { + mEnviroment.mStateFragmentStore = + Script::Enviroment_t::FRAGMENT_STORE_ALWAYS_BLEND; + continue; + } + if (!strcmp(str[ct+1], "depthLessReplace")) { + mEnviroment.mStateFragmentStore = + Script::Enviroment_t::FRAGMENT_STORE_DEPTH_LESS_REPLACE; + continue; + } + if (!strcmp(str[ct+1], "depthLessBlend")) { + mEnviroment.mStateFragmentStore = + Script::Enviroment_t::FRAGMENT_STORE_DEPTH_LESS_BLEND; + 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 { @@ -511,6 +641,7 @@ RsScript rsi_ScriptCCreate(Context * rsc) s->mEnviroment = ss->mEnviroment; s->mProgram = ss->mProgram; ss->clear(); + return s; } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 892d21e7539e4..d178c86ebd80d 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -69,7 +69,7 @@ public: ACCscript* mAccScript; ScriptC::Program_t mProgram; - ScriptC::Enviroment_t mEnviroment; + Script::Enviroment_t mEnviroment; Vector mConstantBufferTypes;