Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a914f340 authored by Shih-wei Liao's avatar Shih-wei Liao
Browse files

Add caching support of BCC binaries.

Change-Id: I1e75bb84d88319cb6f1bbe6d907cf6e8ed546142
parent 4daaeafd
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -402,9 +402,9 @@ public class RenderScript {
    synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
        rsnScriptCSetScript(mContext, script, offset, length);
    }
    native int  rsnScriptCCreate(int con);
    synchronized int nScriptCCreate() {
        return rsnScriptCCreate(mContext);
    native int  rsnScriptCCreate(int con, String val);
    synchronized int nScriptCCreate(String val) {
        return rsnScriptCCreate(mContext, val);
    }

    native void rsnSamplerBegin(int con);
@@ -814,6 +814,3 @@ public class RenderScript {
        return 0;
    }
}


+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ public class ScriptC extends Script {

        rs.nScriptCBegin();
        rs.nScriptCSetScript(pgm, 0, pgmLength);
        return rs.nScriptCCreate();
        Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID));
        return rs.nScriptCCreate(resources.getResourceName(resourceID));
    }
}
+4 −3
Original line number Diff line number Diff line
@@ -954,10 +954,11 @@ exit:
}

static jint
nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con)
nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName)
{
    LOG_API("nScriptCCreate, con(%p)", con);
    return (jint)rsScriptCCreate(con);
    const char* resNameUTF = _env->GetStringUTFChars(resName, NULL);
    return (jint)rsScriptCCreate(con, resNameUTF);
}

// ---------------------------------------------------------------------------
@@ -1346,7 +1347,7 @@ static JNINativeMethod methods[] = {

{"rsnScriptCBegin",                  "(I)V",                                  (void*)nScriptCBegin },
{"rsnScriptCSetScript",              "(I[BII)V",                              (void*)nScriptCSetScript },
{"rsnScriptCCreate",                 "(I)I",                                  (void*)nScriptCCreate },
{"rsnScriptCCreate",                 "(ILjava/lang/String;)I",                (void*)nScriptCCreate },

{"rsnProgramStoreBegin",             "(III)V",                                (void*)nProgramStoreBegin },
{"rsnProgramStoreDepthFunc",         "(II)V",                                 (void*)nProgramStoreDepthFunc },
+1 −0
Original line number Diff line number Diff line
@@ -320,6 +320,7 @@ ScriptCSetText {
	}

ScriptCCreate {
        param const char * resName
	ret RsScript
	}

+18 −7
Original line number Diff line number Diff line
@@ -396,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);
    }
@@ -518,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();
}
Loading