Merge "Add support for synchronous get()." into jb-mr2-dev
diff --git a/cpu_ref/rsCpuScript.cpp b/cpu_ref/rsCpuScript.cpp
index 77ea75c..0b8dff7 100644
--- a/cpu_ref/rsCpuScript.cpp
+++ b/cpu_ref/rsCpuScript.cpp
@@ -656,6 +656,24 @@
     memcpy(destPtr, data, dataLength);
 }
 
+void RsdCpuScriptImpl::getGlobalVar(uint32_t slot, void *data, size_t dataLength) {
+    //rsAssert(!script->mFieldIsObject[slot]);
+    //ALOGE("getGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
+
+#ifndef RS_COMPATIBILITY_LIB
+    int32_t *srcPtr = reinterpret_cast<int32_t *>(
+                          mExecutable->getExportVarAddrs()[slot]);
+#else
+    int32_t *srcPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]);
+#endif
+    if (!srcPtr) {
+        //ALOGV("Calling setVar on slot = %i which is null", slot);
+        return;
+    }
+    memcpy(data, srcPtr, dataLength);
+}
+
+
 void RsdCpuScriptImpl::setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
                                                 const Element *elem,
                                                 const size_t *dims, size_t dimLength) {
diff --git a/cpu_ref/rsCpuScript.h b/cpu_ref/rsCpuScript.h
index b9973c9..7d52507 100644
--- a/cpu_ref/rsCpuScript.h
+++ b/cpu_ref/rsCpuScript.h
@@ -62,6 +62,7 @@
     virtual void invokeFreeChildren();
 
     virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength);
+    virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength);
     virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
                                   const Element *e, const size_t *dims, size_t dimLength);
     virtual void setGlobalBind(uint32_t slot, Allocation *data);
diff --git a/cpu_ref/rsd_cpu.h b/cpu_ref/rsd_cpu.h
index 47984d9..d5642aa 100644
--- a/cpu_ref/rsd_cpu.h
+++ b/cpu_ref/rsd_cpu.h
@@ -75,6 +75,7 @@
         virtual void invokeFreeChildren() = 0;
 
         virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength) = 0;
+        virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength) = 0;
         virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
                                       const Element *e, const size_t *dims, size_t dimLength) = 0;
         virtual void setGlobalBind(uint32_t slot, Allocation *data) = 0;
diff --git a/driver/rsdBcc.cpp b/driver/rsdBcc.cpp
index 709d181..9252dbf 100644
--- a/driver/rsdBcc.cpp
+++ b/driver/rsdBcc.cpp
@@ -107,6 +107,13 @@
     cs->setGlobalVar(slot, data, dataLength);
 }
 
+void rsdScriptGetGlobalVar(const Context *dc, const Script *s,
+                           uint32_t slot, void *data, size_t dataLength) {
+    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
+    cs->getGlobalVar(slot, data, dataLength);
+}
+
+
 void rsdScriptSetGlobalVarWithElemDims(const Context *dc, const Script *s,
                                        uint32_t slot, void *data, size_t dataLength,
                                        const android::renderscript::Element *elem,
diff --git a/driver/rsdBcc.h b/driver/rsdBcc.h
index 7b1b06c..9a194cb 100644
--- a/driver/rsdBcc.h
+++ b/driver/rsdBcc.h
@@ -53,6 +53,9 @@
 void rsdScriptSetGlobalVar(const android::renderscript::Context *,
                            const android::renderscript::Script *,
                            uint32_t slot, void *data, size_t dataLen);
+void rsdScriptGetGlobalVar(const android::renderscript::Context *,
+                           const android::renderscript::Script *,
+                           uint32_t slot, void *data, size_t dataLen);
 void rsdScriptSetGlobalVarWithElemDims(const android::renderscript::Context *,
                                        const android::renderscript::Script *,
                                        uint32_t slot, void *data,
diff --git a/driver/rsdCore.cpp b/driver/rsdCore.cpp
index 9e55524..d69255b 100644
--- a/driver/rsdCore.cpp
+++ b/driver/rsdCore.cpp
@@ -78,6 +78,7 @@
         rsdScriptInvokeInit,
         rsdScriptInvokeFreeChildren,
         rsdScriptSetGlobalVar,
+        rsdScriptGetGlobalVar,
         rsdScriptSetGlobalVarWithElemDims,
         rsdScriptSetGlobalBind,
         rsdScriptSetGlobalObj,
diff --git a/rs.spec b/rs.spec
index 4836762..385622f 100644
--- a/rs.spec
+++ b/rs.spec
@@ -331,6 +331,13 @@
     param const void * data
     }
 
+ScriptGetVarV {
+    param RsScript s
+    param uint32_t slot
+    param void * data
+    sync
+    }
+
 ScriptSetVarVE {
     param RsScript s
     param uint32_t slot
diff --git a/rsScript.cpp b/rsScript.cpp
index a12505c..4e8ba1e 100644
--- a/rsScript.cpp
+++ b/rsScript.cpp
@@ -60,6 +60,15 @@
     mRSC->mHal.funcs.script.setGlobalVar(mRSC, this, slot, (void *)val, len);
 }
 
+void Script::getVar(uint32_t slot, const void *val, size_t len) {
+    //ALOGE("getVar %i %p %i", slot, val, len);
+    if (slot >= mHal.info.exportedVariableCount) {
+        ALOGE("Script::getVar unable to set allocation, invalid slot index");
+        return;
+    }
+    mRSC->mHal.funcs.script.getGlobalVar(mRSC, this, slot, (void *)val, len);
+}
+
 void Script::setVar(uint32_t slot, const void *val, size_t len, Element *e,
                     const size_t *dims, size_t dimLen) {
     if (slot >= mHal.info.exportedVariableCount) {
@@ -230,6 +239,11 @@
     s->setVar(slot, data, len);
 }
 
+void rsi_ScriptGetVarV(Context *rsc, RsScript vs, uint32_t slot, void *data, size_t len) {
+    Script *s = static_cast<Script *>(vs);
+    s->getVar(slot, data, len);
+}
+
 void rsi_ScriptSetVarVE(Context *rsc, RsScript vs, uint32_t slot,
                         const void *data, size_t len, RsElement ve,
                         const size_t *dims, size_t dimLen) {
diff --git a/rsScript.h b/rsScript.h
index b6173bb..a1360b5 100644
--- a/rsScript.h
+++ b/rsScript.h
@@ -99,6 +99,7 @@
 
     void setSlot(uint32_t slot, Allocation *a);
     void setVar(uint32_t slot, const void *val, size_t len);
+    void getVar(uint32_t slot, const void *val, size_t len);
     void setVar(uint32_t slot, const void *val, size_t len, Element *e,
                 const size_t *dims, size_t dimLen);
     void setVarObj(uint32_t slot, ObjectBase *val);
diff --git a/rs_hal.h b/rs_hal.h
index 1949a15..1ed26dc 100644
--- a/rs_hal.h
+++ b/rs_hal.h
@@ -121,6 +121,10 @@
                              uint32_t slot,
                              void *data,
                              size_t dataLength);
+        void (*getGlobalVar)(const Context *rsc, const Script *s,
+                             uint32_t slot,
+                             void *data,
+                             size_t dataLength);
         void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
                                          uint32_t slot,
                                          void *data,