Merge change 3601
* changes: 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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -57,21 +57,34 @@ void Context::initEGL()
|
||||
eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight);
|
||||
}
|
||||
|
||||
bool Context::runScript(Script *s)
|
||||
{
|
||||
ObjectBaseRef<ProgramFragment> frag(mFragment);
|
||||
ObjectBaseRef<ProgramVertex> vtx(mVertex);
|
||||
ObjectBaseRef<ProgramFragmentStore> 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);
|
||||
|
||||
@@ -103,11 +103,16 @@ protected:
|
||||
ObjectBaseRef<ProgramVertex> mVertex;
|
||||
ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
|
||||
|
||||
ProgramFragment * mDefaultFragment;
|
||||
ProgramVertex * mDefaultVertex;
|
||||
ProgramFragmentStore * mDefaultFragmentStore;
|
||||
|
||||
private:
|
||||
Context();
|
||||
|
||||
void initEGL();
|
||||
|
||||
bool runScript(Script *s);
|
||||
bool runRootScript();
|
||||
|
||||
static void * threadProc(void *);
|
||||
|
||||
@@ -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 &) {};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ public:
|
||||
ACCscript* mAccScript;
|
||||
|
||||
ScriptC::Program_t mProgram;
|
||||
ScriptC::Enviroment_t mEnviroment;
|
||||
Script::Enviroment_t mEnviroment;
|
||||
|
||||
Vector<const Type *> mConstantBufferTypes;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user