diff options
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/java/Balls/src/com/android/balls/BallsRS.java | 14 | ||||
-rw-r--r-- | libs/rs/java/Balls/src/com/android/balls/balls.rs | 9 | ||||
-rw-r--r-- | libs/rs/rs.spec | 1 | ||||
-rw-r--r-- | libs/rs/rsContext.cpp | 52 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 31 | ||||
-rw-r--r-- | libs/rs/rsFont.cpp | 26 | ||||
-rw-r--r-- | libs/rs/rsScriptC.cpp | 34 | ||||
-rw-r--r-- | libs/rs/rsScriptC.h | 5 | ||||
-rw-r--r-- | libs/rs/rsScriptC_LibGL.cpp | 16 |
9 files changed, 94 insertions, 94 deletions
diff --git a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java index 359f334..76c23b7 100644 --- a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java +++ b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java @@ -33,8 +33,6 @@ public class BallsRS { private ProgramFragment mPFLines; private ProgramFragment mPFPoints; private ProgramVertex mPV; - private ProgramRaster mPR; - private ProgramStore mPS; private ScriptField_Point mPoints; private ScriptField_Point mArcs; private ScriptField_VpConsts mVpConsts; @@ -48,12 +46,6 @@ public class BallsRS { mVpConsts.set(i, 0, true); } - private void createProgramRaster() { - ProgramRaster.Builder b = new ProgramRaster.Builder(mRS); - mPR = b.create(); - mScript.set_gPR(mPR); - } - private void createProgramVertex() { updateProjectionMatrices(); @@ -71,7 +63,7 @@ public class BallsRS { sb.addInput(mPoints.getElement()); ProgramVertex pvs = sb.create(); pvs.bindConstants(mVpConsts.getAllocation(), 0); - mScript.set_gPV(pvs); + mRS.contextBindProgramVertex(pvs); } private Allocation loadTexture(int id) { @@ -125,10 +117,8 @@ public class BallsRS { mScript.set_gPFLines(mPFLines); mScript.set_gPFPoints(mPFPoints); createProgramVertex(); - createProgramRaster(); - mPS = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS); - mScript.set_gPS(mPS); + mRS.contextBindProgramStore(ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS)); mPhysicsScript.set_gMinPos(new Float2(5, 5)); mPhysicsScript.set_gMaxPos(new Float2(width - 5, height - 5)); diff --git a/libs/rs/java/Balls/src/com/android/balls/balls.rs b/libs/rs/java/Balls/src/com/android/balls/balls.rs index bbd03cf..3edbe2d 100644 --- a/libs/rs/java/Balls/src/com/android/balls/balls.rs +++ b/libs/rs/java/Balls/src/com/android/balls/balls.rs @@ -4,13 +4,11 @@ #include "balls.rsh" -#pragma stateFragment(parent) +#pragma stateVertex(parent) +#pragma stateStore(parent) rs_program_fragment gPFPoints; rs_program_fragment gPFLines; -rs_program_vertex gPV; -rs_program_raster gPR; -rs_program_store gPS; rs_mesh partMesh; rs_mesh arcMesh; @@ -95,9 +93,6 @@ int root() { frame++; rsgBindProgramFragment(gPFLines); - rsgBindProgramVertex(gPV); - rsgBindProgramRaster(gPR); - rsgBindProgramStore(gPS); rsgDrawMesh(arcMesh, 0, 0, arcIdx); rsgBindProgramFragment(gPFPoints); rsgDrawMesh(partMesh); diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 76db14f..1b584c8 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -320,6 +320,7 @@ ScriptCSetText { } ScriptCCreate { + param const char * resName ret RsScript } diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 18bf9fa..143c4dc 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -262,21 +262,27 @@ void Context::deinitEGL() { } } +Context::PushState::PushState(Context *con) { + mRsc = con; + mFragment.set(con->getProgramFragment()); + mVertex.set(con->getProgramVertex()); + mStore.set(con->getProgramStore()); + mRaster.set(con->getProgramRaster()); +} + +Context::PushState::~PushState() { + mRsc->setProgramFragment(mFragment.get()); + mRsc->setProgramVertex(mVertex.get()); + mRsc->setProgramStore(mStore.get()); + mRsc->setProgramRaster(mRaster.get()); + mRsc->setFont(mFont.get()); +} + uint32_t Context::runScript(Script *s) { - ObjectBaseRef<ProgramFragment> frag(mFragment); - ObjectBaseRef<ProgramVertex> vtx(mVertex); - ObjectBaseRef<ProgramStore> store(mFragmentStore); - ObjectBaseRef<ProgramRaster> raster(mRaster); - ObjectBaseRef<Font> font(mFont); + PushState(this); uint32_t ret = s->run(this); - - mFragment.set(frag); - mVertex.set(vtx); - mFragmentStore.set(store); - mRaster.set(raster); - mFont.set(font); return ret; } @@ -441,13 +447,13 @@ void * Context::threadProc(void *vrsc) { rsc->mScriptC.init(rsc); if (rsc->mIsGraphicsContext) { rsc->mStateRaster.init(rsc); - rsc->setRaster(NULL); + rsc->setProgramRaster(NULL); rsc->mStateVertex.init(rsc); - rsc->setVertex(NULL); + rsc->setProgramVertex(NULL); rsc->mStateFragment.init(rsc); - rsc->setFragment(NULL); + rsc->setProgramFragment(NULL); rsc->mStateFragmentStore.init(rsc); - rsc->setFragmentStore(NULL); + rsc->setProgramStore(NULL); rsc->mStateFont.init(rsc); rsc->setFont(NULL); rsc->mStateVertexArray.init(rsc); @@ -753,7 +759,7 @@ void Context::setRootScript(Script *s) { mRootScript.set(s); } -void Context::setFragmentStore(ProgramStore *pfs) { +void Context::setProgramStore(ProgramStore *pfs) { rsAssert(mIsGraphicsContext); if (pfs == NULL) { mFragmentStore.set(mStateFragmentStore.mDefault); @@ -762,7 +768,7 @@ void Context::setFragmentStore(ProgramStore *pfs) { } } -void Context::setFragment(ProgramFragment *pf) { +void Context::setProgramFragment(ProgramFragment *pf) { rsAssert(mIsGraphicsContext); if (pf == NULL) { mFragment.set(mStateFragment.mDefault); @@ -771,7 +777,7 @@ void Context::setFragment(ProgramFragment *pf) { } } -void Context::setRaster(ProgramRaster *pr) { +void Context::setProgramRaster(ProgramRaster *pr) { rsAssert(mIsGraphicsContext); if (pr == NULL) { mRaster.set(mStateRaster.mDefault); @@ -780,7 +786,7 @@ void Context::setRaster(ProgramRaster *pr) { } } -void Context::setVertex(ProgramVertex *pv) { +void Context::setProgramVertex(ProgramVertex *pv) { rsAssert(mIsGraphicsContext); if (pv == NULL) { mVertex.set(mStateVertex.mDefault); @@ -951,22 +957,22 @@ void rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) { void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) { ProgramStore *pfs = static_cast<ProgramStore *>(vpfs); - rsc->setFragmentStore(pfs); + rsc->setProgramStore(pfs); } void rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) { ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); - rsc->setFragment(pf); + rsc->setProgramFragment(pf); } void rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) { ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); - rsc->setRaster(pr); + rsc->setProgramRaster(pr); } void rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) { ProgramVertex *pv = static_cast<ProgramVertex *>(vpv); - rsc->setVertex(pv); + rsc->setProgramVertex(pv); } void rsi_ContextBindFont(Context *rsc, RsFont vfont) { diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 6945342..c377c73 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -80,6 +80,21 @@ public: Context * mContext; Script * mScript; }; + + class PushState { + public: + PushState(Context *); + ~PushState(); + + private: + ObjectBaseRef<ProgramFragment> mFragment; + ObjectBaseRef<ProgramVertex> mVertex; + ObjectBaseRef<ProgramStore> mStore; + ObjectBaseRef<ProgramRaster> mRaster; + ObjectBaseRef<Font> mFont; + Context *mRsc; + }; + ScriptTLSStruct *mTlsStruct; RsSurfaceConfig mUserSurfaceConfig; @@ -101,18 +116,18 @@ public: void swapBuffers(); void setRootScript(Script *); - void setRaster(ProgramRaster *); - void setVertex(ProgramVertex *); - void setFragment(ProgramFragment *); - void setFragmentStore(ProgramStore *); + void setProgramRaster(ProgramRaster *); + void setProgramVertex(ProgramVertex *); + void setProgramFragment(ProgramFragment *); + void setProgramStore(ProgramStore *); void setFont(Font *); void updateSurface(void *sur); - const ProgramFragment * getFragment() {return mFragment.get();} - const ProgramStore * getFragmentStore() {return mFragmentStore.get();} - const ProgramRaster * getRaster() {return mRaster.get();} - const ProgramVertex * getVertex() {return mVertex.get();} + ProgramFragment * getProgramFragment() {return mFragment.get();} + ProgramStore * getProgramStore() {return mFragmentStore.get();} + ProgramRaster * getProgramRaster() {return mRaster.get();} + ProgramVertex * getProgramVertex() {return mVertex.get();} Font * getFont() {return mFont.get();} bool setupCheck(); diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp index 96e350d..e4d77b2 100644 --- a/libs/rs/rsFont.cpp +++ b/libs/rs/rsFont.cpp @@ -613,18 +613,12 @@ void FontState::checkInit() { } void FontState::issueDrawCommand() { + Context::PushState ps(mRSC); - ObjectBaseRef<const ProgramVertex> tmpV(mRSC->getVertex()); - mRSC->setVertex(mRSC->getDefaultProgramVertex()); - - ObjectBaseRef<const ProgramRaster> tmpR(mRSC->getRaster()); - mRSC->setRaster(mRSC->getDefaultProgramRaster()); - - ObjectBaseRef<const ProgramFragment> tmpF(mRSC->getFragment()); - mRSC->setFragment(mFontShaderF.get()); - - ObjectBaseRef<const ProgramStore> tmpPS(mRSC->getFragmentStore()); - mRSC->setFragmentStore(mFontProgramStore.get()); + mRSC->setProgramVertex(mRSC->getDefaultProgramVertex()); + mRSC->setProgramRaster(mRSC->getDefaultProgramRaster()); + mRSC->setProgramFragment(mFontShaderF.get()); + mRSC->setProgramStore(mFontProgramStore.get()); if (mConstantsDirty) { mFontShaderFConstant->data(mRSC, &mConstants, sizeof(mConstants)); @@ -632,10 +626,6 @@ void FontState::issueDrawCommand() { } if (!mRSC->setupCheck()) { - mRSC->setVertex((ProgramVertex *)tmpV.get()); - mRSC->setRaster((ProgramRaster *)tmpR.get()); - mRSC->setFragment((ProgramFragment *)tmpF.get()); - mRSC->setFragmentStore((ProgramStore *)tmpPS.get()); return; } @@ -651,12 +641,6 @@ void FontState::issueDrawCommand() { mIndexBuffer->uploadCheck(mRSC); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID()); glDrawElements(GL_TRIANGLES, mCurrentQuadIndex * 6, GL_UNSIGNED_SHORT, (uint16_t *)(0)); - - // Reset the state - mRSC->setVertex((ProgramVertex *)tmpV.get()); - mRSC->setRaster((ProgramRaster *)tmpR.get()); - mRSC->setFragment((ProgramFragment *)tmpF.get()); - mRSC->setFragmentStore((ProgramStore *)tmpPS.get()); } void FontState::appendMeshQuad(float x1, float y1, float z1, diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 072cc16..6587b51 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -104,16 +104,16 @@ Script * ScriptC::setTLS(Script *sc) { void ScriptC::setupGLState(Context *rsc) { if (mEnviroment.mFragmentStore.get()) { - rsc->setFragmentStore(mEnviroment.mFragmentStore.get()); + rsc->setProgramStore(mEnviroment.mFragmentStore.get()); } if (mEnviroment.mFragment.get()) { - rsc->setFragment(mEnviroment.mFragment.get()); + rsc->setProgramFragment(mEnviroment.mFragment.get()); } if (mEnviroment.mVertex.get()) { - rsc->setVertex(mEnviroment.mVertex.get()); + rsc->setProgramVertex(mEnviroment.mVertex.get()); } if (mEnviroment.mRaster.get()) { - rsc->setRaster(mEnviroment.mRaster.get()); + rsc->setProgramRaster(mEnviroment.mRaster.get()); } } @@ -232,6 +232,7 @@ void ScriptC::runForEach(Context *rsc, const RsScriptCall *sc) { MTLaunchStruct mtls; memset(&mtls, 0, sizeof(mtls)); + Context::PushState ps(rsc); if (ain) { mtls.dimX = ain->getType()->getDimX(); @@ -395,15 +396,25 @@ static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) { extern const char rs_runtime_lib_bc[]; extern unsigned rs_runtime_lib_bc_size; -void ScriptCState::runCompiler(Context *rsc, ScriptC *s) { +void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName) { { - StopWatch compileTimer("RenderScript compile time"); s->mBccScript = bccCreateScript(); s->mEnviroment.mIsThreadable = true; - bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength); - //bccLinkBitcode(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size); bccRegisterSymbolCallback(s->mBccScript, symbolLookup, s); - bccCompileScript(s->mBccScript); + // bccReadBC() reads in the BitCode, if no cache file corresponding to + // the resName is found. Otherwise, bccReadBC() returns a negative value + // and the "else" branch will be taken. + if (bccReadBC(s->mBccScript, + s->mEnviroment.mScriptText, + s->mEnviroment.mScriptTextLength, + resName) >= 0) { + //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size); + bccCompileBC(s->mBccScript); + } else { + // bccReadBC returns a neagative value: Didn't read any script, + // So, use cached binary instead + bccLoadBinary(s->mBccScript); + } bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot); bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit); } @@ -517,14 +528,15 @@ void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { ss->mScript->mEnviroment.mScriptTextLength = len; } -RsScript rsi_ScriptCCreate(Context * rsc) { +RsScript rsi_ScriptCCreate(Context * rsc, const char *resName) +{ ScriptCState *ss = &rsc->mScriptC; ObjectBaseRef<ScriptC> s(ss->mScript); ss->mScript.clear(); s->incUserRef(); - ss->runCompiler(rsc, s.get()); + ss->runCompiler(rsc, s.get(), resName); ss->clear(rsc); return s.get(); } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 7ca33ac..4f0dff3 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -81,7 +81,7 @@ public: void init(Context *rsc); void clear(Context *rsc); - void runCompiler(Context *rsc, ScriptC *s); + void runCompiler(Context *rsc, ScriptC *s, const char *resName); struct SymbolTable_t { const char * mName; @@ -98,6 +98,3 @@ public: } } #endif - - - diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp index ef1475c..0f84e4b 100644 --- a/libs/rs/rsScriptC_LibGL.cpp +++ b/libs/rs/rsScriptC_LibGL.cpp @@ -92,17 +92,17 @@ static void SC_bindProgramRaster(RsProgramRaster pv) { static void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->setProjectionMatrix(rsc, m); + rsc->getProgramVertex()->setProjectionMatrix(rsc, m); } static void SC_vpLoadModelMatrix(const rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->setModelviewMatrix(rsc, m); + rsc->getProgramVertex()->setModelviewMatrix(rsc, m); } static void SC_vpLoadTextureMatrix(const rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->setTextureMatrix(rsc, m); + rsc->getProgramVertex()->setTextureMatrix(rsc, m); } static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) { @@ -114,7 +114,7 @@ static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, static void SC_vpGetProjectionMatrix(rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->getProjectionMatrix(rsc, m); + rsc->getProgramVertex()->getProjectionMatrix(rsc, m); } ////////////////////////////////////////////////////////////////////////////// @@ -165,8 +165,8 @@ static void SC_drawQuad(float x1, float y1, float z1, static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) { GET_TLS(); - ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex()); - rsc->setVertex(rsc->getDefaultProgramVertex()); + ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); + rsc->setProgramVertex(rsc->getDefaultProgramVertex()); //rsc->setupCheck(); //GLint crop[4] = {0, h, w, -h}; @@ -177,7 +177,7 @@ static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h x+w, sh - y, z, x+w, sh - (y+h), z, x, sh - (y+h), z); - rsc->setVertex((ProgramVertex *)tmp.get()); + rsc->setProgramVertex((ProgramVertex *)tmp.get()); } /* static void SC_drawSprite(float x, float y, float z, float w, float h) @@ -271,7 +271,7 @@ static void SC_meshComputeBoundingBox(RsMesh vsm, static void SC_color(float r, float g, float b, float a) { GET_TLS(); - ProgramFragment *pf = (ProgramFragment *)rsc->getFragment(); + ProgramFragment *pf = (ProgramFragment *)rsc->getProgramFragment(); pf->setConstantColor(rsc, r, g, b, a); } |