summaryrefslogtreecommitdiff
path: root/rsClosure.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rsClosure.cpp')
-rw-r--r--rsClosure.cpp90
1 files changed, 57 insertions, 33 deletions
diff --git a/rsClosure.cpp b/rsClosure.cpp
index 8530fc16..7aa0acbf 100644
--- a/rsClosure.cpp
+++ b/rsClosure.cpp
@@ -27,20 +27,32 @@ RsClosure rsi_ClosureCreate(Context* context, RsScriptKernelID kernelID,
(const ScriptFieldID**)depFieldIDs));
}
+RsClosure rsi_InvokeClosureCreate(Context* context, RsScriptInvokeID invokeID,
+ const void* params, const size_t paramLength,
+ const RsScriptFieldID* fieldIDs, const size_t fieldIDs_length,
+ const uintptr_t* values, const size_t values_length,
+ const size_t* sizes, const size_t sizes_length) {
+ rsAssert(fieldIDs_length == values_length && values_length == sizes_length);
+ return (RsClosure)(new Closure(
+ context, (const ScriptInvokeID*)invokeID, params, paramLength,
+ fieldIDs_length, (const ScriptFieldID**)fieldIDs, (const void**)values,
+ sizes));
+}
+
void rsi_ClosureEval(Context* rsc, RsClosure closure) {
- ((Closure*)closure)->eval();
+ ((Closure*)closure)->eval();
}
void rsi_ClosureSetArg(Context* rsc, RsClosure closure, uint32_t index,
uintptr_t value, size_t size) {
- ((Closure*)closure)->setArg(index, (const void*)value, size);
+ ((Closure*)closure)->setArg(index, (const void*)value, size);
}
void rsi_ClosureSetGlobal(Context* rsc, RsClosure closure,
RsScriptFieldID fieldID, uintptr_t value,
size_t size) {
- ((Closure*)closure)->setGlobal((const ScriptFieldID*)fieldID,
- (const void*)value, size);
+ ((Closure*)closure)->setGlobal((const ScriptFieldID*)fieldID,
+ (const void*)value, size);
}
Closure::Closure(Context* context,
@@ -53,7 +65,8 @@ Closure::Closure(Context* context,
const Closure** depClosures,
const ScriptFieldID** depFieldIDs) :
ObjectBase(context), mContext(context), mKernelID((ScriptKernelID*)kernelID),
- mReturnValue(returnValue) {
+ mInvokeID(nullptr), mReturnValue(returnValue), mParams(nullptr),
+ mParamLength(0) {
size_t i;
for (i = 0; i < (size_t)numValues && fieldIDs[i] == nullptr; i++);
@@ -97,50 +110,61 @@ Closure::Closure(Context* context,
}
}
+Closure::Closure(Context* context, const ScriptInvokeID* invokeID,
+ const void* params, const size_t paramLength,
+ const size_t numValues, const ScriptFieldID** fieldIDs,
+ const void** values, const size_t* sizes) :
+ ObjectBase(context), mContext(context), mKernelID(nullptr), mInvokeID(invokeID),
+ mReturnValue(nullptr), mParams(params), mParamLength(paramLength) {
+ for (size_t i = 0; i < numValues; i++) {
+ mGlobals[fieldIDs[i]] = std::make_pair(values[i], sizes[i]);
+ }
+}
+
Closure::~Closure() {
- for (const auto& p : mArgDeps) {
- auto map = p.second;
- for (const auto& p1 : *map) {
- delete p1.second;
+ for (const auto& p : mArgDeps) {
+ auto map = p.second;
+ for (const auto& p1 : *map) {
+ delete p1.second;
+ }
+ delete p.second;
}
- delete p.second;
- }
- for (const auto& p : mGlobalDeps) {
- auto map = p.second;
- for (const auto& p1 : *map) {
- delete p1.first;
- delete p1.second;
+ for (const auto& p : mGlobalDeps) {
+ auto map = p.second;
+ for (const auto& p1 : *map) {
+ delete p1.first;
+ delete p1.second;
+ }
+ delete p.second;
}
- delete p.second;
- }
}
void Closure::eval() {
- Script *s = mKernelID->mScript;
-
- for (const auto& p : mGlobals) {
- const void* value = p.second.first;
- int size = p.second.second;
- // We use -1 size to indicate an ObjectBase rather than a primitive type
- if (size < 0) {
- s->setVarObj(p.first->mSlot, (ObjectBase*)value);
- } else {
- s->setVar(p.first->mSlot, (const void*)&value, size);
+ Script *s = mKernelID->mScript;
+
+ for (const auto& p : mGlobals) {
+ const void* value = p.second.first;
+ int size = p.second.second;
+ // We use -1 size to indicate an ObjectBase rather than a primitive type
+ if (size < 0) {
+ s->setVarObj(p.first->mSlot, (ObjectBase*)value);
+ } else {
+ s->setVar(p.first->mSlot, (const void*)&value, size);
+ }
}
- }
- s->runForEach(mContext, mKernelID->mSlot, (const Allocation **)(&mArgs[0]),
- mArgs.size(), mReturnValue, nullptr, 0, nullptr);
+ s->runForEach(mContext, mKernelID->mSlot, (const Allocation **)(&mArgs[0]),
+ mArgs.size(), mReturnValue, nullptr, 0, nullptr);
}
void Closure::setArg(const uint32_t index, const void* value, const size_t size) {
- mArgs[index] = value;
+ mArgs[index] = value;
}
void Closure::setGlobal(const ScriptFieldID* fieldID, const void* value,
const size_t size) {
- mGlobals[fieldID] = std::make_pair(value, size);
+ mGlobals[fieldID] = std::make_pair(value, size);
}
} // namespace renderscript