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, 14fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int64_t* values, size_t values_length, 15fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int* sizes, size_t sizes_length, 161ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsClosure* depClosures, size_t depClosures_length, 171ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni RsScriptFieldID* depFieldIDs, 181ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni size_t depFieldIDs_length) { 19ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni rsAssert(fieldIDs_length == values_length && values_length == sizes_length && 20ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni sizes_length == depClosures_length && 21ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni depClosures_length == depFieldIDs_length); 22ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni 23bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni Closure* c = new Closure( 24ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni context, (const ScriptKernelID*)kernelID, (Allocation*)returnValue, 25fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni fieldIDs_length, (const ScriptFieldID**)fieldIDs, values, 26ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni sizes, (const Closure**)depClosures, 27bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni (const ScriptFieldID**)depFieldIDs); 28bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni c->incUserRef(); 29bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni return static_cast<RsClosure>(c); 301ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 311ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 32eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiRsClosure rsi_InvokeClosureCreate(Context* context, RsScriptInvokeID invokeID, 33eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const void* params, const size_t paramLength, 34eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const RsScriptFieldID* fieldIDs, const size_t fieldIDs_length, 35fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int64_t* values, const size_t values_length, 36bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni const int* sizes, const size_t sizes_length) { 37eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni rsAssert(fieldIDs_length == values_length && values_length == sizes_length); 38bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni Closure* c = new Closure( 39eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni context, (const ScriptInvokeID*)invokeID, params, paramLength, 40fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni fieldIDs_length, (const ScriptFieldID**)fieldIDs, values, 41bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni sizes); 42bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni c->incUserRef(); 43bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni return static_cast<RsClosure>(c); 44eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni} 45eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 461ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid rsi_ClosureSetArg(Context* rsc, RsClosure closure, uint32_t index, 47fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni uintptr_t value, int size) { 48eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni ((Closure*)closure)->setArg(index, (const void*)value, size); 491ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 501ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 511ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid rsi_ClosureSetGlobal(Context* rsc, RsClosure closure, 52fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni RsScriptFieldID fieldID, int64_t value, 53fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni int size) { 54eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni ((Closure*)closure)->setGlobal((const ScriptFieldID*)fieldID, 55fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni value, size); 561ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 571ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 581ffd86b448d78366190c540f98f8b6d641cdb6cfYang NiClosure::Closure(Context* context, 591ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ScriptKernelID* kernelID, 601ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni Allocation* returnValue, 611ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const int numValues, 621ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ScriptFieldID** fieldIDs, 63fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int64_t* values, 64bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni const int* sizes, 651ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const Closure** depClosures, 661ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni const ScriptFieldID** depFieldIDs) : 67062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni ObjectBase(context), mContext(context), mFunctionID((IDBase*)kernelID), 68062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mIsKernel(true), mReturnValue(returnValue), mParams(nullptr), 69eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni mParamLength(0) { 70ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni size_t i; 711ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 72ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni for (i = 0; i < (size_t)numValues && fieldIDs[i] == nullptr; i++); 731ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 74ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mNumArg = i; 75ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mArgs = new const void*[mNumArg]; 76fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni for (size_t j = 0; j < mNumArg; j++) { 77fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni mArgs[j] = (const void*)values[j]; 78fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni } 791ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 80ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni for (; i < (size_t)numValues; i++) { 81ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni rsAssert(fieldIDs[i] != nullptr); 82ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mGlobals[fieldIDs[i]] = make_pair(values[i], sizes[i]); 83ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni } 841ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 85ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni for (i = 0; i < mNumArg; i++) { 86ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni const Closure* dep = depClosures[i]; 87ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni if (dep != nullptr) { 88ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni auto mapping = mArgDeps[dep]; 89ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni if (mapping == nullptr) { 90bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni mapping = new Map<int, ObjectBaseRef<ScriptFieldID>>(); 91ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mArgDeps[dep] = mapping; 92ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni } 93bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni (*mapping)[i].set(const_cast<ScriptFieldID*>(depFieldIDs[i])); 94ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni } 951ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 96ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni 97ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni for (; i < (size_t)numValues; i++) { 98ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni const Closure* dep = depClosures[i]; 99ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni if (dep != nullptr) { 100ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni auto mapping = mGlobalDeps[dep]; 101ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni if (mapping == nullptr) { 102bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni mapping = new Map<const ScriptFieldID*, 103bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni ObjectBaseRef<ScriptFieldID>>(); 104ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mGlobalDeps[dep] = mapping; 105ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni } 106bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni fieldIDs[i]->incSysRef(); 107bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni (*mapping)[fieldIDs[i]].set(const_cast<ScriptFieldID*>(depFieldIDs[i])); 108ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni } 1091ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1101ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1111ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 112eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiClosure::Closure(Context* context, const ScriptInvokeID* invokeID, 113eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const void* params, const size_t paramLength, 114eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const size_t numValues, const ScriptFieldID** fieldIDs, 115fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int64_t* values, const int* sizes) : 116062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni ObjectBase(context), mContext(context), mFunctionID((IDBase*)invokeID), mIsKernel(false), 117bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni mArgs(nullptr), mNumArg(0), 11899bd4a4614d03e02bb4e07db15c7af5a736211a0Yang Ni mReturnValue(nullptr), mParamLength(paramLength) { 11999bd4a4614d03e02bb4e07db15c7af5a736211a0Yang Ni mParams = new uint8_t[mParamLength]; 12099bd4a4614d03e02bb4e07db15c7af5a736211a0Yang Ni memcpy(mParams, params, mParamLength); 121eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni for (size_t i = 0; i < numValues; i++) { 122ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mGlobals[fieldIDs[i]] = make_pair(values[i], sizes[i]); 123eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni } 124eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni} 125eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 1261ffd86b448d78366190c540f98f8b6d641cdb6cfYang NiClosure::~Closure() { 127eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni for (const auto& p : mArgDeps) { 128eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni auto map = p.second; 129eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni delete p.second; 1301ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1311ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 132eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni for (const auto& p : mGlobalDeps) { 133eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni auto map = p.second; 134eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni for (const auto& p1 : *map) { 135bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni p1.first->decSysRef(); 136eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni } 137eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni delete p.second; 1381ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni } 1391ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 140ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni delete[] mArgs; 14199bd4a4614d03e02bb4e07db15c7af5a736211a0Yang Ni delete[] mParams; 1421ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1431ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 144fef0cd45027f235126d4fb62bda5ea9037450d9cYang Nivoid Closure::setArg(const uint32_t index, const void* value, const int size) { 145eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni mArgs[index] = value; 1461ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1471ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 148fef0cd45027f235126d4fb62bda5ea9037450d9cYang Nivoid Closure::setGlobal(const ScriptFieldID* fieldID, const int64_t value, 149bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni const int size) { 150ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni mGlobals[fieldID] = make_pair(value, size); 1511ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} 1521ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 1531ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} // namespace renderscript 1541ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} // namespace android 155