release-request-33b11ddd-d658-45bf-bdb2-acceb024fe39-for-git_oc-release-4042766 snap-temp-L87400000067730042
Change-Id: I708ccefbca48539d8931bece986a94b64225ad98
diff --git a/rsApiStubs.cpp b/rsApiStubs.cpp
index 28f1b1e..855c69f 100644
--- a/rsApiStubs.cpp
+++ b/rsApiStubs.cpp
@@ -109,12 +109,43 @@
*/
extern "C" int gDebuggerPresent = 0;
-// Context
+namespace{
+// Use reflection to query the default cache dir.
+std::string queryCacheDir() {
+ std::string cacheDir;
+ // First check if we have JavaVM running in this process.
+ if (android::AndroidRuntime::getJavaVM()) {
+ JNIEnv* env = android::AndroidRuntime::getJNIEnv();
+ if (env) {
+ jclass cacheDirClass = env->FindClass("android/renderscript/RenderScriptCacheDir");
+ jfieldID cacheDirID = env->GetStaticFieldID(cacheDirClass, "mCacheDir", "Ljava/io/File;");
+ jobject cache_dir = env->GetStaticObjectField(cacheDirClass, cacheDirID);
-// Mutex for locking reflection operation.
-static std::mutex reflectionMutex;
-// The defaultCacheDir will be reused if set, instead of query JNI.
-static std::string defaultCacheDir;
+ if (cache_dir) {
+ jclass fileClass = env->FindClass("java/io/File");
+ jmethodID getPath = env->GetMethodID(fileClass, "getPath", "()Ljava/lang/String;");
+ jstring path_string = (jstring)env->CallObjectMethod(cache_dir, getPath);
+ const char *path_chars = env->GetStringUTFChars(path_string, NULL);
+
+ ALOGD("Successfully queried cache dir: %s", path_chars);
+ cacheDir = std::string(path_chars);
+ env->ReleaseStringUTFChars(path_string, path_chars);
+ } else {
+ ALOGD("Cache dir not initialized");
+ }
+ } else {
+ ALOGD("Failed to query the default cache dir.");
+ }
+ } else {
+ ALOGD("Non JavaVM found in the process.");
+ }
+
+ return cacheDir;
+}
+}
+
+
+// Context
extern "C" RsContext rsContextCreate(RsDevice vdev, uint32_t version, uint32_t sdkVersion,
RsContextType ct, uint32_t flags)
{
@@ -123,8 +154,29 @@
return nullptr;
}
- RsHidlAdaptation& instance = RsHidlAdaptation::GetInstance();
- RsContext context = instance.GetEntryFuncs()->ContextCreate(vdev, version, sdkVersion, ct, flags);
+ RsContext context;
+ RsContextWrapper *ctxWrapper;
+
+ if (flags & RS_CONTEXT_LOW_LATENCY) {
+ // Use CPU path for LOW_LATENCY context.
+ RsFallbackAdaptation& instance = RsFallbackAdaptation::GetInstance();
+ context = instance.GetEntryFuncs()->ContextCreate(vdev, version, sdkVersion, ct, flags);
+ ctxWrapper = new RsContextWrapper{context, instance.GetEntryFuncs()};
+ } else {
+ RsHidlAdaptation& instance = RsHidlAdaptation::GetInstance();
+ context = instance.GetEntryFuncs()->ContextCreate(vdev, version, sdkVersion, ct, flags);
+ ctxWrapper = new RsContextWrapper{context, instance.GetEntryFuncs()};
+
+ static std::string defaultCacheDir = queryCacheDir();
+ if (defaultCacheDir.size() > 0) {
+ ALOGD("Setting cache dir: %s", defaultCacheDir.c_str());
+ rsContextSetCacheDir(ctxWrapper,
+ defaultCacheDir.c_str(),
+ defaultCacheDir.size());
+ }
+ }
+
+
// Wait for debugger to attach if RS_CONTEXT_WAIT_FOR_ATTACH flag set.
if (flags & RS_CONTEXT_WAIT_FOR_ATTACH) {
while (!gDebuggerPresent) {
@@ -132,50 +184,9 @@
}
}
- RsContextWrapper *ctxWrapper = new RsContextWrapper{context, instance.GetEntryFuncs()};
// Lock contextMap when adding new entries.
- {
- std::unique_lock<std::mutex> lock(contextMapMutex);
- contextMap.insert(std::make_pair(context, ctxWrapper));
- }
-
- std::unique_lock<std::mutex> lock(reflectionMutex);
- if (defaultCacheDir.size() == 0) {
- // Use reflection to query the default cache dir.
- // First check if we have JavaVM running in this process.
- if (android::AndroidRuntime::getJavaVM()) {
- JNIEnv* env = android::AndroidRuntime::getJNIEnv();
- if (env) {
- jclass cacheDirClass = env->FindClass("android/renderscript/RenderScriptCacheDir");
- jfieldID cacheDirID = env->GetStaticFieldID(cacheDirClass, "mCacheDir", "Ljava/io/File;");
- jobject cache_dir = env->GetStaticObjectField(cacheDirClass, cacheDirID);
-
- if (cache_dir) {
- jclass fileClass = env->FindClass("java/io/File");
- jmethodID getPath = env->GetMethodID(fileClass, "getPath", "()Ljava/lang/String;");
- jstring path_string = (jstring)env->CallObjectMethod(cache_dir, getPath);
- const char *path_chars = env->GetStringUTFChars(path_string, NULL);
-
- ALOGD("Successfully queried cache dir: %s", path_chars);
- defaultCacheDir = std::string(path_chars);
- env->ReleaseStringUTFChars(path_string, path_chars);
- } else {
- ALOGD("Cache dir not initialized");
- }
- } else {
- ALOGD("Failed to query the default cache dir.");
- }
- } else {
- ALOGD("Non JavaVM found in the process.");
- }
- }
-
- if (defaultCacheDir.size() > 0) {
- ALOGD("Setting cache dir: %s", defaultCacheDir.c_str());
- rsContextSetCacheDir(ctxWrapper,
- defaultCacheDir.c_str(),
- defaultCacheDir.size());
- }
+ std::unique_lock<std::mutex> lock(contextMapMutex);
+ contextMap.insert(std::make_pair(context, ctxWrapper));
return (RsContext) ctxWrapper;
}