enable synchronous mode (functional)

Change-Id: I613610013e7e4d1623620ab94d2d25d8a1bd82b3
Bug: 5972398
diff --git a/rsContext.cpp b/rsContext.cpp
index 221d572..80021d5 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -250,7 +250,9 @@
     Context *rsc = static_cast<Context *>(vrsc);
 #ifndef ANDROID_RS_SERIALIZE
     rsc->mNativeThreadId = gettid();
-    setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY);
+    if (!rsc->isSynchronous()) {
+        setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY);
+    }
     rsc->mThreadPriority = ANDROID_PRIORITY_DISPLAY;
 #endif //ANDROID_RS_SERIALIZE
     rsc->props.mLogTimes = getProp("debug.rs.profile") != 0;
@@ -318,6 +320,11 @@
     }
 
     rsc->mRunning = true;
+
+    if (rsc->isSynchronous()) {
+        return NULL;
+    }
+
     if (!rsc->mIsGraphicsContext) {
         while (!rsc->mExit) {
             rsc->mIO.playCoreCommands(rsc, -1);
@@ -442,17 +449,15 @@
     mIsContextLite = false;
     memset(&watchdog, 0, sizeof(watchdog));
     mForceCpu = false;
-}
-
-Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc) {
-    return createContext(dev, sc, false);
+    mSynchronous = false;
 }
 
 Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc,
-                                 bool forceCpu) {
+                                 bool forceCpu, bool synchronous) {
     Context * rsc = new Context();
 
     rsc->mForceCpu = forceCpu;
+    rsc->mSynchronous = synchronous;
 
     if (!rsc->initContext(dev, sc)) {
         delete rsc;
@@ -500,22 +505,25 @@
 
     timerInit();
     timerSet(RS_TIMER_INTERNAL);
+    if (mSynchronous) {
+        threadProc(this);
+    } else {
+        status = pthread_create(&mThreadId, &threadAttr, threadProc, this);
+        if (status) {
+            ALOGE("Failed to start rs context thread.");
+            return false;
+        }
+        while (!mRunning && (mError == RS_ERROR_NONE)) {
+            usleep(100);
+        }
 
-    status = pthread_create(&mThreadId, &threadAttr, threadProc, this);
-    if (status) {
-        ALOGE("Failed to start rs context thread.");
-        return false;
-    }
-    while (!mRunning && (mError == RS_ERROR_NONE)) {
-        usleep(100);
-    }
+        if (mError != RS_ERROR_NONE) {
+            ALOGE("Errors during thread init");
+            return false;
+        }
 
-    if (mError != RS_ERROR_NONE) {
-        ALOGE("Errors during thread init");
-        return false;
+        pthread_attr_destroy(&threadAttr);
     }
-
-    pthread_attr_destroy(&threadAttr);
     return true;
 }
 
@@ -817,14 +825,15 @@
 
 RsContext rsContextCreate(RsDevice vdev, uint32_t version,
                           uint32_t sdkVersion) {
-    return rsContextCreate(vdev, version, sdkVersion, false);
+    return rsContextCreate(vdev, version, sdkVersion, false, false);
 }
 
 RsContext rsContextCreate(RsDevice vdev, uint32_t version,
-                          uint32_t sdkVersion, bool forceCpu) {
+                          uint32_t sdkVersion, bool forceCpu,
+                          bool synchronous) {
     ALOGV("rsContextCreate dev=%p", vdev);
     Device * dev = static_cast<Device *>(vdev);
-    Context *rsc = Context::createContext(dev, NULL, forceCpu);
+    Context *rsc = Context::createContext(dev, NULL, forceCpu, synchronous);
     if (rsc) {
         rsc->setTargetSdkVersion(sdkVersion);
     }