rsClosure.cpp revision 1ffd86b448d78366190c540f98f8b6d641cdb6cf
11ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsClosure.h" 21ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 31ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "cpu_ref/rsCpuCore.h" 41ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsContext.h" // XXX: necessary to avoid compiler error on rsScript.h below 51ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsScript.h" 61ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsType.h" 71ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 81ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace android { 91ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace renderscript { 101ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 111ffd86b448d78366190c540f98f8b6d641cdb6cfYang NiRsClosure rsi_ClosureCreate(Context* context, RsScriptKernelID kernelID, 121ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsAllocation returnValue, 131ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsScriptFieldID* fieldIDs, size_t fieldIDs_length, 141ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni uintptr_t* values, size_t values_length, 151ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni size_t* sizes, size_t sizes_length, 161ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsClosure* depClosures, size_t depClosures_length, 171ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsScriptFieldID* depFieldIDs, 181ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni size_t depFieldIDs_length) { 191ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni rsAssert(fieldIDs_length == values_length && values_length == sizes_length && 201ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni sizes_length == depClosures_length && 211ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni depClosures_length == depFieldIDs_length); 221ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 231ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni return (RsClosure)(new Closure( 241ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni context, (const ScriptKernelID*)kernelID, (Allocation*)returnValue, 251ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni fieldIDs_length, (const ScriptFieldID**)fieldIDs, (const void**)values, 261ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni sizes, (const Closure**)depClosures, 271ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni (const ScriptFieldID**)depFieldIDs)); 281ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 291ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 301ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid rsi_ClosureEval(Context* rsc, RsClosure closure) { 311ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni ((Closure*)closure)->eval(); 321ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 331ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 341ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid rsi_ClosureSetArg(Context* rsc, RsClosure closure, uint32_t index, 351ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni uintptr_t value, size_t size) { 361ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni ((Closure*)closure)->setArg(index, (const void*)value, size); 371ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 381ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 391ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid rsi_ClosureSetGlobal(Context* rsc, RsClosure closure, 401ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsScriptFieldID fieldID, uintptr_t value, 411ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni size_t size) { 421ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni ((Closure*)closure)->setGlobal((const ScriptFieldID*)fieldID, 431ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni (const void*)value, size); 441ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 451ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 461ffd86b448d78366190c540f98f8b6d641cdb6cfYang NiClosure::Closure(Context* context, 471ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ScriptKernelID* kernelID, 481ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni Allocation* returnValue, 491ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const int numValues, 501ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ScriptFieldID** fieldIDs, 511ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const void** values, 521ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const size_t* sizes, 531ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const Closure** depClosures, 541ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ScriptFieldID** depFieldIDs) : 551ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni ObjectBase(context), mContext(context), mKernelID((ScriptKernelID*)kernelID), 561ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mReturnValue(returnValue) { 571ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni size_t i; 581ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 591ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (i = 0; i < (size_t)numValues && fieldIDs[i] == nullptr; i++); 601ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 611ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni vector<const void*> args(values, values + i); 621ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mArgs.swap(args); 631ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 641ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (; i < (size_t)numValues; i++) { 651ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mGlobals[fieldIDs[i]] = std::make_pair(values[i], sizes[i]); 661ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 671ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 681ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mDependences.insert(depClosures, depClosures + numValues); 691ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 701ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (i = 0; i < mArgs.size(); i++) { 711ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const Closure* dep = depClosures[i]; 721ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni if (dep != nullptr) { 731ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni auto mapping = mArgDeps[dep]; 741ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni if (mapping == nullptr) { 751ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mapping = new map<int, const ObjectBaseRef<ScriptFieldID>*>(); 761ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mArgDeps[dep] = mapping; 771ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 781ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni (*mapping)[i] = new ObjectBaseRef<ScriptFieldID>( 791ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const_cast<ScriptFieldID*>(depFieldIDs[i])); 801ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 811ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 821ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 831ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (; i < (size_t)numValues; i++) { 841ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const Closure* dep = depClosures[i]; 851ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni if (dep != nullptr) { 861ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni auto mapping = mGlobalDeps[dep]; 871ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni if (mapping == nullptr) { 881ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mapping = new map<const ObjectBaseRef<ScriptFieldID>*, 891ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ObjectBaseRef<ScriptFieldID>*>(); 901ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mGlobalDeps[dep] = mapping; 911ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 921ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni (*mapping)[new ObjectBaseRef<ScriptFieldID>( 931ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const_cast<ScriptFieldID*>(fieldIDs[i]))] = 941ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni new ObjectBaseRef<ScriptFieldID>( 951ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const_cast<ScriptFieldID*>(depFieldIDs[i])); 961ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 971ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 981ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 991ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1001ffd86b448d78366190c540f98f8b6d641cdb6cfYang NiClosure::~Closure() { 1011ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (const auto& p : mArgDeps) { 1021ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni auto map = p.second; 1031ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (const auto& p1 : *map) { 1041ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni delete p1.second; 1051ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1061ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni delete p.second; 1071ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1081ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1091ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (const auto& p : mGlobalDeps) { 1101ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni auto map = p.second; 1111ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (const auto& p1 : *map) { 1121ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni delete p1.first; 1131ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni delete p1.second; 1141ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1151ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni delete p.second; 1161ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1171ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1181ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1191ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid Closure::eval() { 1201ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni Script *s = mKernelID->mScript; 1211ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1221ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni for (const auto& p : mGlobals) { 1231ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const void* value = p.second.first; 1241ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni int size = p.second.second; 1251ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni // We use -1 size to indicate an ObjectBase rather than a primitive type 1261ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni if (size < 0) { 1271ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni s->setVarObj(p.first->mSlot, (ObjectBase*)value); 1281ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } else { 1291ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni s->setVar(p.first->mSlot, (const void*)&value, size); 1301ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1311ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1321ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1331ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni s->runForEach(mContext, mKernelID->mSlot, (const Allocation **)(&mArgs[0]), 1341ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mArgs.size(), mReturnValue, nullptr, 0, nullptr); 1351ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1361ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1371ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid Closure::setArg(const uint32_t index, const void* value, const size_t size) { 1381ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mArgs[index] = value; 1391ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1401ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1411ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid Closure::setGlobal(const ScriptFieldID* fieldID, const void* value, 1421ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const size_t size) { 1431ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni mGlobals[fieldID] = std::make_pair(value, size); 1441ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1451ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1461ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} // namespace renderscript 1471ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} // namespace android 148