diff options
Diffstat (limited to 'rsClosure.cpp')
-rw-r--r-- | rsClosure.cpp | 90 |
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 |