diff options
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/RenderScript.h | 4 | ||||
-rw-r--r-- | libs/rs/driver/rsdBcc.cpp | 64 | ||||
-rw-r--r-- | libs/rs/driver/rsdProgram.cpp | 3 | ||||
-rw-r--r-- | libs/rs/driver/rsdShader.cpp | 18 | ||||
-rw-r--r-- | libs/rs/driver/rsdShader.h | 1 | ||||
-rw-r--r-- | libs/rs/rsContext.cpp | 11 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 4 | ||||
-rw-r--r-- | libs/rs/rsScriptC.cpp | 29 | ||||
-rw-r--r-- | libs/rs/rsScriptC.h | 7 |
9 files changed, 105 insertions, 36 deletions
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h index 535f713..3ba0123 100644 --- a/libs/rs/RenderScript.h +++ b/libs/rs/RenderScript.h @@ -52,8 +52,8 @@ void rsaElementGetSubElements(RsContext, RsElement, uint32_t *ids, const char ** RsDevice rsDeviceCreate(); void rsDeviceDestroy(RsDevice dev); void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value); -RsContext rsContextCreate(RsDevice dev, uint32_t version); -RsContext rsContextCreateGL(RsDevice dev, uint32_t version, RsSurfaceConfig sc, uint32_t dpi); +RsContext rsContextCreate(RsDevice dev, uint32_t version, uint32_t sdkVersion); +RsContext rsContextCreateGL(RsDevice dev, uint32_t version, uint32_t sdkVersion, RsSurfaceConfig sc, uint32_t dpi); #include "rsgApiFuncDecl.h" diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp index 86bec6e..fb2df37 100644 --- a/libs/rs/driver/rsdBcc.cpp +++ b/libs/rs/driver/rsdBcc.cpp @@ -19,7 +19,7 @@ #include "rsdBcc.h" #include "rsdRuntime.h" -#include <bcinfo/bcinfo.h> +#include <bcinfo/MetadataExtractor.h> #include "rsContext.h" #include "rsScriptC.h" @@ -40,7 +40,7 @@ struct DrvScript { BCCScriptRef mBccScript; - struct BCScriptMetadata *mScriptMetadata; + bcinfo::MetadataExtractor *ME; InvokeFunc_t *mInvokeFunctions; void ** mFieldAddress; @@ -71,7 +71,9 @@ bool rsdScriptInit(const Context *rsc, pthread_mutex_lock(&rsdgInitMutex); char *cachePath = NULL; - struct BCScriptMetadata *md = NULL; + size_t exportFuncCount = 0; + size_t exportVarCount = 0; + size_t objectSlotCount = 0; DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript)); if (drv == NULL) { @@ -84,13 +86,13 @@ bool rsdScriptInit(const Context *rsc, drv->mScriptText = bitcode; drv->mScriptTextLength = bitcodeSize; - md = bcinfoGetScriptMetadata((const char*)drv->mScriptText, - drv->mScriptTextLength, 0); - if (!md) { + + drv->ME = new bcinfo::MetadataExtractor((const char*)drv->mScriptText, + drv->mScriptTextLength); + if (!drv->ME->extract()) { LOGE("bcinfo: failed to read script metadata"); goto error; } - drv->mScriptMetadata = md; //LOGE("mBccScript %p", script->mBccScript); @@ -122,40 +124,41 @@ bool rsdScriptInit(const Context *rsc, drv->mRoot = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root")); drv->mInit = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, "init")); - if (md->exportFuncCount > 0) { - drv->mInvokeFunctions = (InvokeFunc_t*) calloc(md->exportFuncCount, + exportFuncCount = drv->ME->getExportFuncCount(); + if (exportFuncCount > 0) { + drv->mInvokeFunctions = (InvokeFunc_t*) calloc(exportFuncCount, sizeof(InvokeFunc_t)); - bccGetExportFuncList(drv->mBccScript, - md->exportFuncCount, + bccGetExportFuncList(drv->mBccScript, exportFuncCount, (void **) drv->mInvokeFunctions); } else { drv->mInvokeFunctions = NULL; } - if (md->exportVarCount > 0) { - drv->mFieldAddress = (void **) calloc(md->exportVarCount, - sizeof(void*)); - drv->mFieldIsObject = (bool *) calloc(md->exportVarCount, sizeof(bool)); - bccGetExportVarList(drv->mBccScript, - md->exportVarCount, + exportVarCount = drv->ME->getExportVarCount(); + if (exportVarCount > 0) { + drv->mFieldAddress = (void **) calloc(exportVarCount, sizeof(void*)); + drv->mFieldIsObject = (bool *) calloc(exportVarCount, sizeof(bool)); + bccGetExportVarList(drv->mBccScript, exportVarCount, (void **) drv->mFieldAddress); } else { drv->mFieldAddress = NULL; drv->mFieldIsObject = NULL; } - if (md->objectSlotCount) { - for (uint32_t ct=0; ct < md->objectSlotCount; ct++) { - drv->mFieldIsObject[md->objectSlotList[ct]] = true; + objectSlotCount = drv->ME->getObjectSlotCount(); + if (objectSlotCount > 0) { + const uint32_t *objectSlotList = drv->ME->getObjectSlotList(); + for (uint32_t ct=0; ct < objectSlotCount; ct++) { + drv->mFieldIsObject[objectSlotList[ct]] = true; } } // Copy info over to runtime - script->mHal.info.exportedFunctionCount = md->exportFuncCount; - script->mHal.info.exportedVariableCount = md->exportVarCount; - script->mHal.info.exportedPragmaCount = md->pragmaCount; - script->mHal.info.exportedPragmaKeyList = md->pragmaKeyList; - script->mHal.info.exportedPragmaValueList = md->pragmaValueList; + script->mHal.info.exportedFunctionCount = drv->ME->getExportFuncCount(); + script->mHal.info.exportedVariableCount = drv->ME->getExportVarCount(); + script->mHal.info.exportedPragmaCount = drv->ME->getPragmaCount(); + script->mHal.info.exportedPragmaKeyList = drv->ME->getPragmaKeyList(); + script->mHal.info.exportedPragmaValueList = drv->ME->getPragmaValueList(); script->mHal.info.root = drv->mRoot; pthread_mutex_unlock(&rsdgInitMutex); @@ -164,6 +167,10 @@ bool rsdScriptInit(const Context *rsc, error: pthread_mutex_unlock(&rsdgInitMutex); + if (drv->ME) { + delete drv->ME; + drv->ME = NULL; + } free(drv); return false; @@ -445,10 +452,10 @@ void rsdScriptSetGlobalObj(const Context *dc, const Script *script, uint32_t slo void rsdScriptDestroy(const Context *dc, Script *script) { DrvScript *drv = (DrvScript *)script->mHal.drv; - struct BCScriptMetadata *md = drv->mScriptMetadata; if (drv->mFieldAddress) { - for (size_t ct = 0; ct < md->exportVarCount; ct++) { + size_t exportVarCount = drv->ME->getExportVarCount(); + for (size_t ct = 0; ct < exportVarCount; ct++) { if (drv->mFieldIsObject[ct]) { // The field address can be NULL if the script-side has // optimized the corresponding global variable away. @@ -467,7 +474,8 @@ void rsdScriptDestroy(const Context *dc, Script *script) { drv->mInvokeFunctions = NULL; } - bcinfoReleaseScriptMetadata(&drv->mScriptMetadata); + delete drv->ME; + drv->ME = NULL; free(drv); script->mHal.drv = NULL; diff --git a/libs/rs/driver/rsdProgram.cpp b/libs/rs/driver/rsdProgram.cpp index 39b3805..27a6663 100644 --- a/libs/rs/driver/rsdProgram.cpp +++ b/libs/rs/driver/rsdProgram.cpp @@ -44,6 +44,9 @@ bool rsdProgramVertexInit(const Context *rsc, const ProgramVertex *pv, static void SyncProgramConstants(const Context *rsc, const Program *p) { for (uint32_t ct=0; ct < p->mHal.state.texturesCount; ct++) { const Allocation *a = p->mHal.state.textures[ct].get(); + if (!a) { + continue; + } DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv; if (drvAlloc->uploadDeferred) { rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT); diff --git a/libs/rs/driver/rsdShader.cpp b/libs/rs/driver/rsdShader.cpp index 15cc417..90fe4b2 100644 --- a/libs/rs/driver/rsdShader.cpp +++ b/libs/rs/driver/rsdShader.cpp @@ -48,6 +48,7 @@ RsdShader::~RsdShader() { delete[] mAttribNames; delete[] mUniformNames; delete[] mUniformArraySizes; + delete[] mTextureTargets; } void RsdShader::initMemberVars() { @@ -59,6 +60,7 @@ void RsdShader::initMemberVars() { mAttribNames = NULL; mUniformNames = NULL; mUniformArraySizes = NULL; + mTextureTargets = NULL; mIsValid = false; } @@ -81,6 +83,7 @@ void RsdShader::init() { mUniformArraySizes[uniformCount] = 1; uniformCount++; } + } String8 RsdShader::getGLSLInputString() const { @@ -141,8 +144,10 @@ void RsdShader::appendTextures() { for (uint32_t ct=0; ct < mRSProgram->mHal.state.texturesCount; ct++) { if (mRSProgram->mHal.state.textureTargets[ct] == RS_TEXTURE_2D) { snprintf(buf, sizeof(buf), "uniform sampler2D UNI_Tex%i;\n", ct); + mTextureTargets[ct] = GL_TEXTURE_2D; } else { snprintf(buf, sizeof(buf), "uniform samplerCube UNI_Tex%i;\n", ct); + mTextureTargets[ct] = GL_TEXTURE_CUBE_MAP; } mShader.append(buf); } @@ -400,9 +405,11 @@ void RsdShader::setupTextures(const Context *rsc, RsdShaderCache *sc) { for (uint32_t ct=0; ct < numTexturesToBind; ct++) { glActiveTexture(GL_TEXTURE0 + ct); + glUniform1i(sc->fragUniformSlot(mTextureUniformIndexStart + ct), ct); + if (!mRSProgram->mHal.state.textures[ct].get()) { - LOGE("No texture bound for shader id %u, texture unit %u", (uint)this, ct); - rsc->setError(RS_ERROR_BAD_SHADER, "No texture bound"); + // if nothing is bound, reset to default GL texture + glBindTexture(mTextureTargets[ct], 0); continue; } @@ -422,8 +429,6 @@ void RsdShader::setupTextures(const Context *rsc, RsdShaderCache *sc) { glTexParameteri(drvTex->glTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); rsdGLCheckError(rsc, "ProgramFragment::setup tex env"); } - - glUniform1i(sc->fragUniformSlot(mTextureUniformIndexStart + ct), ct); rsdGLCheckError(rsc, "ProgramFragment::setup uniforms"); } @@ -516,6 +521,11 @@ void RsdShader::initAttribAndUniformArray() { mUniformNames = new String8[mUniformCount]; mUniformArraySizes = new uint32_t[mUniformCount]; } + + mTextureCount = mRSProgram->mHal.state.texturesCount; + if (mTextureCount) { + mTextureTargets = new uint32_t[mTextureCount]; + } } void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths, uint32_t *count, const char *prefix) { diff --git a/libs/rs/driver/rsdShader.h b/libs/rs/driver/rsdShader.h index 63c4231..3f0d6ea 100644 --- a/libs/rs/driver/rsdShader.h +++ b/libs/rs/driver/rsdShader.h @@ -84,6 +84,7 @@ protected: uint32_t mType; uint32_t mTextureCount; + uint32_t *mTextureTargets; uint32_t mAttribCount; uint32_t mUniformCount; android::String8 *mAttribNames; diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index decd9f1..6a30b17 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -333,6 +333,7 @@ Context::Context() { mPaused = false; mObjHead = NULL; mError = RS_ERROR_NONE; + mTargetSdkVersion = 14; mDPI = 96; mIsContextLite = false; } @@ -678,19 +679,25 @@ void rsi_ContextDeinitToClient(Context *rsc) { } } -RsContext rsContextCreate(RsDevice vdev, uint32_t version) { +RsContext rsContextCreate(RsDevice vdev, uint32_t version, + uint32_t sdkVersion) { LOGV("rsContextCreate %p", vdev); Device * dev = static_cast<Device *>(vdev); Context *rsc = Context::createContext(dev, NULL); + if (rsc) { + rsc->setTargetSdkVersion(sdkVersion); + } return rsc; } RsContext rsContextCreateGL(RsDevice vdev, uint32_t version, - RsSurfaceConfig sc, uint32_t dpi) { + uint32_t sdkVersion, RsSurfaceConfig sc, + uint32_t dpi) { LOGV("rsContextCreateGL %p", vdev); Device * dev = static_cast<Device *>(vdev); Context *rsc = Context::createContext(dev, &sc); if (rsc) { + rsc->setTargetSdkVersion(sdkVersion); rsc->setDPI(dpi); } LOGV("rsContextCreateGL ret %p ", rsc); diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 309fe95..3c7a3d2 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -199,9 +199,13 @@ public: uint32_t getDPI() const {return mDPI;} void setDPI(uint32_t dpi) {mDPI = dpi;} + uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;} + void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;} + Device *mDev; protected: + uint32_t mTargetSdkVersion; uint32_t mDPI; uint32_t mWidth; uint32_t mHeight; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index e8b1014..dccf71f 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -19,6 +19,10 @@ #include "utils/Timers.h" #include "utils/StopWatch.h" +#ifndef ANDROID_RS_SERIALIZE +#include <bcinfo/BitcodeTranslator.h> +#endif + using namespace android; using namespace android::renderscript; @@ -28,9 +32,18 @@ using namespace android::renderscript; ScriptC * sc = (ScriptC *) tls->mScript ScriptC::ScriptC(Context *rsc) : Script(rsc) { +#ifndef ANDROID_RS_SERIALIZE + BT = NULL; +#endif } ScriptC::~ScriptC() { +#ifndef ANDROID_RS_SERIALIZE + if (BT) { + delete BT; + BT = NULL; + } +#endif mRSC->mHal.funcs.script.destroy(mRSC, this); } @@ -181,6 +194,22 @@ bool ScriptC::runCompiler(Context *rsc, size_t bitcodeLen) { //LOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen); +#ifndef ANDROID_RS_SERIALIZE + uint32_t sdkVersion = rsc->getTargetSdkVersion(); + if (BT) { + delete BT; + } + BT = new bcinfo::BitcodeTranslator((const char *)bitcode, bitcodeLen, + sdkVersion); + if (!BT->translate()) { + LOGE("Failed to translate bitcode from version: %u", sdkVersion); + delete BT; + BT = NULL; + return false; + } + bitcode = (const uint8_t *) BT->getTranslatedBitcode(); + bitcodeLen = BT->getTranslatedBitcodeSize(); +#endif rsc->mHal.funcs.script.init(rsc, this, resName, cacheDir, bitcode, bitcodeLen, 0); diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 5c191d9..c65a5bf 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -21,6 +21,9 @@ #include "RenderScriptEnv.h" +#ifndef ANDROID_RS_SERIALIZE +#include "bcinfo/BitcodeTranslator.h" +#endif // --------------------------------------------------------------------------- namespace android { @@ -61,6 +64,10 @@ public: void setupScript(Context *); void setupGLState(Context *); Script * setTLS(Script *); + private: +#ifndef ANDROID_RS_SERIALIZE + bcinfo::BitcodeTranslator *BT; +#endif }; class ScriptCState { |