rsClosure.cpp revision bd0af2d161e36e52e6782ccb2d15dd5a36467704
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,
15bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni                            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,
25ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        fieldIDs_length, (const ScriptFieldID**)fieldIDs, (const void**)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,
35eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni                                  const uintptr_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,
40eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        fieldIDs_length, (const ScriptFieldID**)fieldIDs, (const void**)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,
471ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni                       uintptr_t value, size_t size) {
48eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ((Closure*)closure)->setArg(index, (const void*)value, size);
491ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}
501ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
511ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid rsi_ClosureSetGlobal(Context* rsc, RsClosure closure,
521ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni                          RsScriptFieldID fieldID, uintptr_t value,
531ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni                          size_t size) {
54eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ((Closure*)closure)->setGlobal((const ScriptFieldID*)fieldID,
55eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni                                   (const void*)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,
631ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni                 const void** 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];
76ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    memcpy(mArgs, values, sizeof(const void*) * mNumArg);
771ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
78ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    for (; i < (size_t)numValues; i++) {
79ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        rsAssert(fieldIDs[i] != nullptr);
80ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        mGlobals[fieldIDs[i]] = make_pair(values[i], sizes[i]);
81ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    }
821ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
83ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    for (i = 0; i < mNumArg; i++) {
84ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        const Closure* dep = depClosures[i];
85ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        if (dep != nullptr) {
86ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni            auto mapping = mArgDeps[dep];
87ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni            if (mapping == nullptr) {
88bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni                mapping = new Map<int, ObjectBaseRef<ScriptFieldID>>();
89ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni                mArgDeps[dep] = mapping;
90ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni            }
91bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni            (*mapping)[i].set(const_cast<ScriptFieldID*>(depFieldIDs[i]));
92ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        }
931ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni    }
94ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni
95ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    for (; i < (size_t)numValues; i++) {
96ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        const Closure* dep = depClosures[i];
97ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        if (dep != nullptr) {
98ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni            auto mapping = mGlobalDeps[dep];
99ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni            if (mapping == nullptr) {
100bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni                mapping = new Map<const ScriptFieldID*,
101bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni                                  ObjectBaseRef<ScriptFieldID>>();
102ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni                mGlobalDeps[dep] = mapping;
103ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni            }
104bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni            fieldIDs[i]->incSysRef();
105bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni            (*mapping)[fieldIDs[i]].set(const_cast<ScriptFieldID*>(depFieldIDs[i]));
106ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        }
1071ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni    }
1081ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}
1091ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
110eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiClosure::Closure(Context* context, const ScriptInvokeID* invokeID,
111eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni                 const void* params, const size_t paramLength,
112eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni                 const size_t numValues, const ScriptFieldID** fieldIDs,
113bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni                 const void** values, const int* sizes) :
114062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    ObjectBase(context), mContext(context), mFunctionID((IDBase*)invokeID), mIsKernel(false),
115bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni    mArgs(nullptr), mNumArg(0),
116eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    mReturnValue(nullptr), mParams(params), mParamLength(paramLength) {
117eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    for (size_t i = 0; i < numValues; i++) {
118ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni        mGlobals[fieldIDs[i]] = make_pair(values[i], sizes[i]);
119eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    }
120eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni}
121eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
1221ffd86b448d78366190c540f98f8b6d641cdb6cfYang NiClosure::~Closure() {
123eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    for (const auto& p : mArgDeps) {
124eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        auto map = p.second;
125eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        delete p.second;
1261ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni    }
1271ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
128eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    for (const auto& p : mGlobalDeps) {
129eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        auto map = p.second;
130eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        for (const auto& p1 : *map) {
131bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni            p1.first->decSysRef();
132eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        }
133eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        delete p.second;
1341ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni    }
1351ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
136ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    delete[] mArgs;
1371ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}
1381ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
1391ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid Closure::setArg(const uint32_t index, const void* value, const size_t size) {
140eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    mArgs[index] = value;
1411ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}
1421ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
1431ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nivoid Closure::setGlobal(const ScriptFieldID* fieldID, const void* value,
144bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni                        const int size) {
145ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    mGlobals[fieldID] = make_pair(value, size);
1461ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}
1471ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
1481ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}  // namespace renderscript
1491ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}  // namespace android
150