Stale cache management to address a P1 bug # 3296131.
Change-Id: I593f35a91c4a14c055828f8989fe01b9e7790039
This commit is contained in:
@@ -417,9 +417,9 @@ public class RenderScript {
|
||||
synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
|
||||
rsnScriptCSetScript(mContext, script, offset, length);
|
||||
}
|
||||
native int rsnScriptCCreate(int con, String val, String cacheDir);
|
||||
synchronized int nScriptCCreate(String resName, String cacheDir) {
|
||||
return rsnScriptCCreate(mContext, resName, cacheDir);
|
||||
native int rsnScriptCCreate(int con, String packageName, String resName, String cacheDir);
|
||||
synchronized int nScriptCCreate(String packageName, String resName, String cacheDir) {
|
||||
return rsnScriptCCreate(mContext, packageName, resName, cacheDir);
|
||||
}
|
||||
|
||||
native void rsnSamplerBegin(int con);
|
||||
|
||||
@@ -77,8 +77,14 @@ public class ScriptC extends Script {
|
||||
|
||||
rs.nScriptCBegin();
|
||||
rs.nScriptCSetScript(pgm, 0, pgmLength);
|
||||
Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID));
|
||||
|
||||
// E.g, /system/apps/Fountain.apk
|
||||
String packageName = rs.getApplicationContext().getPackageResourcePath();
|
||||
// For res/raw/fountain.bc, it wil be /com.android.fountain:raw/fountain
|
||||
String resName = resources.getResourceName(resourceID);
|
||||
String cacheDir = rs.getApplicationContext().getCacheDir().toString();
|
||||
return rs.nScriptCCreate(resources.getResourceName(resourceID), cacheDir);
|
||||
|
||||
Log.v(TAG, "Create script for resource = " + resName);
|
||||
return rs.nScriptCCreate(packageName, resName, cacheDir);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -902,12 +902,14 @@ exit:
|
||||
}
|
||||
|
||||
static jint
|
||||
nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName, jstring cacheDir)
|
||||
nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring packageName, jstring resName, jstring cacheDir)
|
||||
{
|
||||
LOG_API("nScriptCCreate, con(%p)", con);
|
||||
const char* packageNameUTF = _env->GetStringUTFChars(packageName, NULL);
|
||||
const char* resNameUTF = _env->GetStringUTFChars(resName, NULL);
|
||||
const char* cacheDirUTF = _env->GetStringUTFChars(cacheDir, NULL);
|
||||
jint i = (jint)rsScriptCCreate(con, resNameUTF, cacheDirUTF);
|
||||
jint i = (jint)rsScriptCCreate(con, packageNameUTF, resNameUTF, cacheDirUTF);
|
||||
_env->ReleaseStringUTFChars(packageName, packageNameUTF);
|
||||
_env->ReleaseStringUTFChars(resName, resNameUTF);
|
||||
_env->ReleaseStringUTFChars(cacheDir, cacheDirUTF);
|
||||
return i;
|
||||
@@ -1301,7 +1303,7 @@ static JNINativeMethod methods[] = {
|
||||
|
||||
{"rsnScriptCBegin", "(I)V", (void*)nScriptCBegin },
|
||||
{"rsnScriptCSetScript", "(I[BII)V", (void*)nScriptCSetScript },
|
||||
{"rsnScriptCCreate", "(ILjava/lang/String;Ljava/lang/String;)I", (void*)nScriptCCreate },
|
||||
{"rsnScriptCCreate", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", (void*)nScriptCCreate },
|
||||
|
||||
{"rsnProgramStoreBegin", "(III)V", (void*)nProgramStoreBegin },
|
||||
{"rsnProgramStoreDepthFunc", "(II)V", (void*)nProgramStoreDepthFunc },
|
||||
|
||||
@@ -113,11 +113,11 @@ LOCAL_SRC_FILES:= \
|
||||
rsVertexArray.cpp
|
||||
|
||||
|
||||
LOCAL_SHARED_LIBRARIES += libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc
|
||||
LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := libft2 librslib_rt
|
||||
LOCAL_STATIC_LIBRARIES := libdex libft2 librslib_rt
|
||||
|
||||
LOCAL_C_INCLUDES += external/freetype/include
|
||||
LOCAL_C_INCLUDES += external/freetype/include external/zlib dalvik
|
||||
|
||||
LOCAL_LDLIBS := -lpthread -ldl
|
||||
LOCAL_MODULE:= libRS
|
||||
|
||||
@@ -321,6 +321,7 @@ ScriptCSetText {
|
||||
}
|
||||
|
||||
ScriptCCreate {
|
||||
param const char * packageName
|
||||
param const char * resName
|
||||
param const char * cacheDir
|
||||
ret RsScript
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
#include "../../compile/libbcc/include/bcc/bcc.h"
|
||||
#include "utils/Timers.h"
|
||||
#include "utils/StopWatch.h"
|
||||
extern "C" {
|
||||
#include "libdex/ZipArchive.h"
|
||||
}
|
||||
|
||||
#include <GLES/gl.h>
|
||||
#include <GLES/glext.h>
|
||||
@@ -402,7 +405,12 @@ 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, const char *resName, const char *cacheDir) {
|
||||
void ScriptCState::runCompiler(Context *rsc,
|
||||
ScriptC *s,
|
||||
long modWhen,
|
||||
long crc32,
|
||||
const char *resName,
|
||||
const char *cacheDir) {
|
||||
{
|
||||
s->mBccScript = bccCreateScript();
|
||||
s->mEnviroment.mIsThreadable = true;
|
||||
@@ -413,6 +421,8 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, co
|
||||
if (bccReadBC(s->mBccScript,
|
||||
s->mEnviroment.mScriptText,
|
||||
s->mEnviroment.mScriptTextLength,
|
||||
modWhen,
|
||||
crc32,
|
||||
resName,
|
||||
cacheDir) >= 0) {
|
||||
//bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size);
|
||||
@@ -424,6 +434,8 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, co
|
||||
bccReadBC(s->mBccScript,
|
||||
s->mEnviroment.mScriptText,
|
||||
s->mEnviroment.mScriptTextLength,
|
||||
modWhen,
|
||||
crc32,
|
||||
NULL,
|
||||
cacheDir);
|
||||
bccCompileBC(s->mBccScript);
|
||||
@@ -542,7 +554,11 @@ void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) {
|
||||
ss->mScript->mEnviroment.mScriptTextLength = len;
|
||||
}
|
||||
|
||||
RsScript rsi_ScriptCCreate(Context * rsc, const char *resName, const char *cacheDir)
|
||||
|
||||
RsScript rsi_ScriptCCreate(Context *rsc,
|
||||
const char *packageName,
|
||||
const char *resName,
|
||||
const char *cacheDir)
|
||||
{
|
||||
ScriptCState *ss = &rsc->mScriptC;
|
||||
|
||||
@@ -550,7 +566,34 @@ RsScript rsi_ScriptCCreate(Context * rsc, const char *resName, const char *cache
|
||||
ss->mScript.clear();
|
||||
s->incUserRef();
|
||||
|
||||
ss->runCompiler(rsc, s.get(), resName, cacheDir);
|
||||
// Open the apk and return the ZipArchive:
|
||||
// int dexZipOpenArchive(const char* fileName, ZipArchive* pArchive)
|
||||
ZipArchive archive;
|
||||
long modWhen;
|
||||
long crc32;
|
||||
if (!dexZipOpenArchive(packageName, &archive)) { // Success
|
||||
ZipEntry entry = dexZipFindEntry(&archive, resName);
|
||||
|
||||
int method;
|
||||
size_t uncompLen;
|
||||
size_t compLen;
|
||||
off_t offset;
|
||||
if (!dexZipGetEntryInfo(&archive,
|
||||
entry,
|
||||
&method,
|
||||
&uncompLen,
|
||||
&compLen,
|
||||
&offset,
|
||||
&modWhen,
|
||||
&crc32)) {
|
||||
} else {
|
||||
LOGI("Coudn't get entry info for the bitcode in an apk");
|
||||
}
|
||||
} else {
|
||||
LOGI("Couldn't open the archive and read the bitcode");
|
||||
}
|
||||
|
||||
ss->runCompiler(rsc, s.get(), modWhen, crc32, resName, cacheDir);
|
||||
ss->clear(rsc);
|
||||
return s.get();
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
void init(Context *rsc);
|
||||
|
||||
void clear(Context *rsc);
|
||||
void runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir);
|
||||
void runCompiler(Context *rsc, ScriptC *s, long modWhen, long crc32, const char *resName, const char *cacheDir);
|
||||
|
||||
struct SymbolTable_t {
|
||||
const char * mName;
|
||||
|
||||
Reference in New Issue
Block a user