Separate CPU driver impl from reference driver.

Change-Id: Ifb484edda665959b81d7b1f890d108bfa20a535d
diff --git a/driver/rsdCore.cpp b/driver/rsdCore.cpp
index caa5aa7..7f4060a 100644
--- a/driver/rsdCore.cpp
+++ b/driver/rsdCore.cpp
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+#include "../cpu_ref/rsd_cpu.h"
+
 #include "rsdCore.h"
 #include "rsdAllocation.h"
 #include "rsdBcc.h"
@@ -154,71 +156,10 @@
 
 };
 
-pthread_key_t rsdgThreadTLSKey = 0;
-uint32_t rsdgThreadTLSKeyCount = 0;
-pthread_mutex_t rsdgInitMutex = PTHREAD_MUTEX_INITIALIZER;
+extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name);
 
-
-static void * HelperThreadProc(void *vrsc) {
-    Context *rsc = static_cast<Context *>(vrsc);
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-
-    uint32_t idx = (uint32_t)android_atomic_inc(&dc->mWorkers.mLaunchCount);
-
-    //ALOGV("RS helperThread starting %p idx=%i", rsc, idx);
-
-    dc->mWorkers.mLaunchSignals[idx].init();
-    dc->mWorkers.mNativeThreadId[idx] = gettid();
-
-    int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
-    if (status) {
-        ALOGE("pthread_setspecific %i", status);
-    }
-
-#if 0
-    typedef struct {uint64_t bits[1024 / 64]; } cpu_set_t;
-    cpu_set_t cpuset;
-    memset(&cpuset, 0, sizeof(cpuset));
-    cpuset.bits[idx / 64] |= 1ULL << (idx % 64);
-    int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx],
-              sizeof(cpuset), &cpuset);
-    ALOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret));
-#endif
-
-    while (!dc->mExit) {
-        dc->mWorkers.mLaunchSignals[idx].wait();
-        if (dc->mWorkers.mLaunchCallback) {
-            // idx +1 is used because the calling thread is always worker 0.
-            dc->mWorkers.mLaunchCallback(dc->mWorkers.mLaunchData, idx+1);
-        }
-        android_atomic_dec(&dc->mWorkers.mRunningCount);
-        dc->mWorkers.mCompleteSignal.set();
-    }
-
-    //ALOGV("RS helperThread exited %p idx=%i", rsc, idx);
-    return NULL;
-}
-
-void rsdLaunchThreads(Context *rsc, WorkerCallback_t cbk, void *data) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    dc->mWorkers.mLaunchData = data;
-    dc->mWorkers.mLaunchCallback = cbk;
-    android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
-    for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
-        dc->mWorkers.mLaunchSignals[ct].set();
-    }
-
-    // We use the calling thread as one of the workers so we can start without
-    // the delay of the thread wakeup.
-    if (dc->mWorkers.mLaunchCallback) {
-       dc->mWorkers.mLaunchCallback(dc->mWorkers.mLaunchData, 0);
-    }
-
-    while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) {
-        dc->mWorkers.mCompleteSignal.wait();
-    }
+static RsdCpuReference::CpuScript * LookupScript(Context *, const Script *s) {
+    return (RsdCpuReference::CpuScript *)s->mHal.drv;
 }
 
 extern "C" bool rsdHalInit(RsContext c, uint32_t version_major,
@@ -233,76 +174,23 @@
     }
     rsc->mHal.drv = dc;
 
-    pthread_mutex_lock(&rsdgInitMutex);
-    if (!rsdgThreadTLSKeyCount) {
-        int status = pthread_key_create(&rsdgThreadTLSKey, NULL);
-        if (status) {
-            ALOGE("Failed to init thread tls key.");
-            pthread_mutex_unlock(&rsdgInitMutex);
-            return false;
-        }
-    }
-    rsdgThreadTLSKeyCount++;
-    pthread_mutex_unlock(&rsdgInitMutex);
-
-    dc->mTlsStruct.mContext = rsc;
-    dc->mTlsStruct.mScript = NULL;
-    int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
-    if (status) {
-        ALOGE("pthread_setspecific %i", status);
-    }
-
-
-    int cpu = sysconf(_SC_NPROCESSORS_ONLN);
-    if(rsc->props.mDebugMaxThreads) {
-        cpu = rsc->props.mDebugMaxThreads;
-    }
-    if (cpu < 2) {
-        cpu = 0;
-    }
-    ALOGV("%p Launching thread(s), CPUs %i", rsc, cpu);
-
-    // Subtract one from the cpu count because we also use the command thread as a worker.
-    dc->mWorkers.mCount = (uint32_t)(cpu - 1);
-    dc->mWorkers.mThreadId = (pthread_t *) calloc(dc->mWorkers.mCount, sizeof(pthread_t));
-    dc->mWorkers.mNativeThreadId = (pid_t *) calloc(dc->mWorkers.mCount, sizeof(pid_t));
-    dc->mWorkers.mLaunchSignals = new Signal[dc->mWorkers.mCount];
-    dc->mWorkers.mLaunchCallback = NULL;
-
-    dc->mWorkers.mCompleteSignal.init();
-
-    android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
-    android_atomic_release_store(0, &dc->mWorkers.mLaunchCount);
-
-    pthread_attr_t threadAttr;
-    status = pthread_attr_init(&threadAttr);
-    if (status) {
-        ALOGE("Failed to init thread attribute.");
+    dc->mCpuRef = RsdCpuReference::create((Context *)c, version_major, version_minor,
+                                          &rsdLookupRuntimeStub, &LookupScript);
+    if (!dc->mCpuRef) {
+        ALOGE("RsdCpuReference::create for driver hal failed.");
+        free(dc);
         return false;
     }
 
-    for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) {
-        status = pthread_create(&dc->mWorkers.mThreadId[ct], &threadAttr, HelperThreadProc, rsc);
-        if (status) {
-            dc->mWorkers.mCount = ct;
-            ALOGE("Created fewer than expected number of RS threads.");
-            break;
-        }
-    }
-    while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) {
-        usleep(100);
-    }
-
-    pthread_attr_destroy(&threadAttr);
     return true;
 }
 
 
 void SetPriority(const Context *rsc, int32_t priority) {
     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) {
-        setpriority(PRIO_PROCESS, dc->mWorkers.mNativeThreadId[ct], priority);
-    }
+
+    dc->mCpuRef->setPriority(priority);
+
     if (dc->mHasGraphics) {
         rsdGLSetPriority(rsc, priority);
     }
@@ -310,27 +198,7 @@
 
 void Shutdown(Context *rsc) {
     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    dc->mExit = true;
-    dc->mWorkers.mLaunchData = NULL;
-    dc->mWorkers.mLaunchCallback = NULL;
-    android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
-    for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
-        dc->mWorkers.mLaunchSignals[ct].set();
-    }
-    void *res;
-    for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
-        pthread_join(dc->mWorkers.mThreadId[ct], &res);
-    }
-    rsAssert(android_atomic_acquire_load(&dc->mWorkers.mRunningCount) == 0);
-
-    // Global structure cleanup.
-    pthread_mutex_lock(&rsdgInitMutex);
-    --rsdgThreadTLSKeyCount;
-    if (!rsdgThreadTLSKeyCount) {
-        pthread_key_delete(rsdgThreadTLSKey);
-    }
-    pthread_mutex_unlock(&rsdgInitMutex);
-
+    delete dc->mCpuRef;
+    rsc->mHal.drv = NULL;
 }