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,