rsClosure.cpp revision fef0cd45027f235126d4fb62bda5ea9037450d9c
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