xref: /aosp_15_r20/frameworks/rs/rsClosure.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker #include "rsClosure.h"
2*e1eccf28SAndroid Build Coastguard Worker 
3*e1eccf28SAndroid Build Coastguard Worker #include "cpu_ref/rsCpuCore.h"
4*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h" // XXX: necessary to avoid compiler error on rsScript.h below
5*e1eccf28SAndroid Build Coastguard Worker #include "rsScript.h"
6*e1eccf28SAndroid Build Coastguard Worker #include "rsType.h"
7*e1eccf28SAndroid Build Coastguard Worker 
8*e1eccf28SAndroid Build Coastguard Worker namespace android {
9*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
10*e1eccf28SAndroid Build Coastguard Worker 
rsi_ClosureCreate(Context * context,RsScriptKernelID kernelID,RsAllocation returnValue,RsScriptFieldID * fieldIDs,size_t fieldIDs_length,const int64_t * values,size_t values_length,const int * sizes,size_t sizes_length,RsClosure * depClosures,size_t depClosures_length,RsScriptFieldID * depFieldIDs,size_t depFieldIDs_length)11*e1eccf28SAndroid Build Coastguard Worker RsClosure rsi_ClosureCreate(Context* context, RsScriptKernelID kernelID,
12*e1eccf28SAndroid Build Coastguard Worker                             RsAllocation returnValue,
13*e1eccf28SAndroid Build Coastguard Worker                             RsScriptFieldID* fieldIDs, size_t fieldIDs_length,
14*e1eccf28SAndroid Build Coastguard Worker                             const int64_t* values, size_t values_length,
15*e1eccf28SAndroid Build Coastguard Worker                             const int* sizes, size_t sizes_length,
16*e1eccf28SAndroid Build Coastguard Worker                             RsClosure* depClosures, size_t depClosures_length,
17*e1eccf28SAndroid Build Coastguard Worker                             RsScriptFieldID* depFieldIDs,
18*e1eccf28SAndroid Build Coastguard Worker                             size_t depFieldIDs_length) {
19*e1eccf28SAndroid Build Coastguard Worker     rsAssert(fieldIDs_length == values_length && values_length == sizes_length &&
20*e1eccf28SAndroid Build Coastguard Worker              sizes_length == depClosures_length &&
21*e1eccf28SAndroid Build Coastguard Worker              depClosures_length == depFieldIDs_length);
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker     Closure* c = new Closure(
24*e1eccf28SAndroid Build Coastguard Worker         context, (const ScriptKernelID*)kernelID, (Allocation*)returnValue,
25*e1eccf28SAndroid Build Coastguard Worker         fieldIDs_length, (const ScriptFieldID**)fieldIDs, values,
26*e1eccf28SAndroid Build Coastguard Worker         sizes, (const Closure**)depClosures,
27*e1eccf28SAndroid Build Coastguard Worker         (const ScriptFieldID**)depFieldIDs);
28*e1eccf28SAndroid Build Coastguard Worker     c->incUserRef();
29*e1eccf28SAndroid Build Coastguard Worker     return static_cast<RsClosure>(c);
30*e1eccf28SAndroid Build Coastguard Worker }
31*e1eccf28SAndroid Build Coastguard Worker 
rsi_InvokeClosureCreate(Context * context,RsScriptInvokeID invokeID,const void * params,const size_t paramLength,const RsScriptFieldID * fieldIDs,const size_t fieldIDs_length,const int64_t * values,const size_t values_length,const int * sizes,const size_t sizes_length)32*e1eccf28SAndroid Build Coastguard Worker RsClosure rsi_InvokeClosureCreate(Context* context, RsScriptInvokeID invokeID,
33*e1eccf28SAndroid Build Coastguard Worker                                   const void* params, const size_t paramLength,
34*e1eccf28SAndroid Build Coastguard Worker                                   const RsScriptFieldID* fieldIDs, const size_t fieldIDs_length,
35*e1eccf28SAndroid Build Coastguard Worker                                   const int64_t* values, const size_t values_length,
36*e1eccf28SAndroid Build Coastguard Worker                                   const int* sizes, const size_t sizes_length) {
37*e1eccf28SAndroid Build Coastguard Worker     rsAssert(fieldIDs_length == values_length && values_length == sizes_length);
38*e1eccf28SAndroid Build Coastguard Worker     Closure* c = new Closure(
39*e1eccf28SAndroid Build Coastguard Worker         context, (const ScriptInvokeID*)invokeID, params, paramLength,
40*e1eccf28SAndroid Build Coastguard Worker         fieldIDs_length, (const ScriptFieldID**)fieldIDs, values,
41*e1eccf28SAndroid Build Coastguard Worker         sizes);
42*e1eccf28SAndroid Build Coastguard Worker     c->incUserRef();
43*e1eccf28SAndroid Build Coastguard Worker     return static_cast<RsClosure>(c);
44*e1eccf28SAndroid Build Coastguard Worker }
45*e1eccf28SAndroid Build Coastguard Worker 
rsi_ClosureSetArg(Context * rsc,RsClosure closure,uint32_t index,uintptr_t value,int size)46*e1eccf28SAndroid Build Coastguard Worker void rsi_ClosureSetArg(Context* rsc, RsClosure closure, uint32_t index,
47*e1eccf28SAndroid Build Coastguard Worker                        uintptr_t value, int size) {
48*e1eccf28SAndroid Build Coastguard Worker     ((Closure*)closure)->setArg(index, (const void*)value, size);
49*e1eccf28SAndroid Build Coastguard Worker }
50*e1eccf28SAndroid Build Coastguard Worker 
rsi_ClosureSetGlobal(Context * rsc,RsClosure closure,RsScriptFieldID fieldID,int64_t value,int size)51*e1eccf28SAndroid Build Coastguard Worker void rsi_ClosureSetGlobal(Context* rsc, RsClosure closure,
52*e1eccf28SAndroid Build Coastguard Worker                           RsScriptFieldID fieldID, int64_t value,
53*e1eccf28SAndroid Build Coastguard Worker                           int size) {
54*e1eccf28SAndroid Build Coastguard Worker     ((Closure*)closure)->setGlobal((const ScriptFieldID*)fieldID,
55*e1eccf28SAndroid Build Coastguard Worker                                    value, size);
56*e1eccf28SAndroid Build Coastguard Worker }
57*e1eccf28SAndroid Build Coastguard Worker 
Closure(Context * context,const ScriptKernelID * kernelID,Allocation * returnValue,const int numValues,const ScriptFieldID ** fieldIDs,const int64_t * values,const int * sizes,const Closure ** depClosures,const ScriptFieldID ** depFieldIDs)58*e1eccf28SAndroid Build Coastguard Worker Closure::Closure(Context* context,
59*e1eccf28SAndroid Build Coastguard Worker                  const ScriptKernelID* kernelID,
60*e1eccf28SAndroid Build Coastguard Worker                  Allocation* returnValue,
61*e1eccf28SAndroid Build Coastguard Worker                  const int numValues,
62*e1eccf28SAndroid Build Coastguard Worker                  const ScriptFieldID** fieldIDs,
63*e1eccf28SAndroid Build Coastguard Worker                  const int64_t* values,
64*e1eccf28SAndroid Build Coastguard Worker                  const int* sizes,
65*e1eccf28SAndroid Build Coastguard Worker                  const Closure** depClosures,
66*e1eccf28SAndroid Build Coastguard Worker                  const ScriptFieldID** depFieldIDs) :
67*e1eccf28SAndroid Build Coastguard Worker     ObjectBase(context), mContext(context), mFunctionID((IDBase*)kernelID),
68*e1eccf28SAndroid Build Coastguard Worker     mIsKernel(true), mReturnValue(returnValue), mParams(nullptr),
69*e1eccf28SAndroid Build Coastguard Worker     mParamLength(0) {
70*e1eccf28SAndroid Build Coastguard Worker     size_t i;
71*e1eccf28SAndroid Build Coastguard Worker 
72*e1eccf28SAndroid Build Coastguard Worker     for (i = 0; i < (size_t)numValues && fieldIDs[i] == nullptr; i++);
73*e1eccf28SAndroid Build Coastguard Worker 
74*e1eccf28SAndroid Build Coastguard Worker     mNumArg = i;
75*e1eccf28SAndroid Build Coastguard Worker     mArgs = new const void*[mNumArg];
76*e1eccf28SAndroid Build Coastguard Worker     for (size_t j = 0; j < mNumArg; j++) {
77*e1eccf28SAndroid Build Coastguard Worker         mArgs[j] = (const void*)values[j];
78*e1eccf28SAndroid Build Coastguard Worker     }
79*e1eccf28SAndroid Build Coastguard Worker 
80*e1eccf28SAndroid Build Coastguard Worker     for (; i < (size_t)numValues; i++) {
81*e1eccf28SAndroid Build Coastguard Worker         rsAssert(fieldIDs[i] != nullptr);
82*e1eccf28SAndroid Build Coastguard Worker         mGlobals[fieldIDs[i]] = make_pair(values[i], sizes[i]);
83*e1eccf28SAndroid Build Coastguard Worker     }
84*e1eccf28SAndroid Build Coastguard Worker 
85*e1eccf28SAndroid Build Coastguard Worker     for (i = 0; i < mNumArg; i++) {
86*e1eccf28SAndroid Build Coastguard Worker         const Closure* dep = depClosures[i];
87*e1eccf28SAndroid Build Coastguard Worker         if (dep != nullptr) {
88*e1eccf28SAndroid Build Coastguard Worker             auto mapping = mArgDeps[dep];
89*e1eccf28SAndroid Build Coastguard Worker             if (mapping == nullptr) {
90*e1eccf28SAndroid Build Coastguard Worker                 mapping = new Map<int, ObjectBaseRef<ScriptFieldID>>();
91*e1eccf28SAndroid Build Coastguard Worker                 mArgDeps[dep] = mapping;
92*e1eccf28SAndroid Build Coastguard Worker             }
93*e1eccf28SAndroid Build Coastguard Worker             (*mapping)[i].set(const_cast<ScriptFieldID*>(depFieldIDs[i]));
94*e1eccf28SAndroid Build Coastguard Worker         }
95*e1eccf28SAndroid Build Coastguard Worker     }
96*e1eccf28SAndroid Build Coastguard Worker 
97*e1eccf28SAndroid Build Coastguard Worker     for (; i < (size_t)numValues; i++) {
98*e1eccf28SAndroid Build Coastguard Worker         const Closure* dep = depClosures[i];
99*e1eccf28SAndroid Build Coastguard Worker         if (dep != nullptr) {
100*e1eccf28SAndroid Build Coastguard Worker             auto mapping = mGlobalDeps[dep];
101*e1eccf28SAndroid Build Coastguard Worker             if (mapping == nullptr) {
102*e1eccf28SAndroid Build Coastguard Worker                 mapping = new Map<const ScriptFieldID*,
103*e1eccf28SAndroid Build Coastguard Worker                                   ObjectBaseRef<ScriptFieldID>>();
104*e1eccf28SAndroid Build Coastguard Worker                 mGlobalDeps[dep] = mapping;
105*e1eccf28SAndroid Build Coastguard Worker             }
106*e1eccf28SAndroid Build Coastguard Worker             fieldIDs[i]->incSysRef();
107*e1eccf28SAndroid Build Coastguard Worker             (*mapping)[fieldIDs[i]].set(const_cast<ScriptFieldID*>(depFieldIDs[i]));
108*e1eccf28SAndroid Build Coastguard Worker         }
109*e1eccf28SAndroid Build Coastguard Worker     }
110*e1eccf28SAndroid Build Coastguard Worker }
111*e1eccf28SAndroid Build Coastguard Worker 
Closure(Context * context,const ScriptInvokeID * invokeID,const void * params,const size_t paramLength,const size_t numValues,const ScriptFieldID ** fieldIDs,const int64_t * values,const int * sizes)112*e1eccf28SAndroid Build Coastguard Worker Closure::Closure(Context* context, const ScriptInvokeID* invokeID,
113*e1eccf28SAndroid Build Coastguard Worker                  const void* params, const size_t paramLength,
114*e1eccf28SAndroid Build Coastguard Worker                  const size_t numValues, const ScriptFieldID** fieldIDs,
115*e1eccf28SAndroid Build Coastguard Worker                  const int64_t* values, const int* sizes) :
116*e1eccf28SAndroid Build Coastguard Worker     ObjectBase(context), mContext(context), mFunctionID((IDBase*)invokeID), mIsKernel(false),
117*e1eccf28SAndroid Build Coastguard Worker     mArgs(nullptr), mNumArg(0),
118*e1eccf28SAndroid Build Coastguard Worker     mReturnValue(nullptr), mParamLength(paramLength) {
119*e1eccf28SAndroid Build Coastguard Worker     mParams = new uint8_t[mParamLength];
120*e1eccf28SAndroid Build Coastguard Worker     memcpy(mParams, params, mParamLength);
121*e1eccf28SAndroid Build Coastguard Worker     for (size_t i = 0; i < numValues; i++) {
122*e1eccf28SAndroid Build Coastguard Worker         mGlobals[fieldIDs[i]] = make_pair(values[i], sizes[i]);
123*e1eccf28SAndroid Build Coastguard Worker     }
124*e1eccf28SAndroid Build Coastguard Worker }
125*e1eccf28SAndroid Build Coastguard Worker 
~Closure()126*e1eccf28SAndroid Build Coastguard Worker Closure::~Closure() {
127*e1eccf28SAndroid Build Coastguard Worker     for (const auto& p : mArgDeps) {
128*e1eccf28SAndroid Build Coastguard Worker         delete p.second;
129*e1eccf28SAndroid Build Coastguard Worker     }
130*e1eccf28SAndroid Build Coastguard Worker 
131*e1eccf28SAndroid Build Coastguard Worker     for (const auto& p : mGlobalDeps) {
132*e1eccf28SAndroid Build Coastguard Worker         auto map = p.second;
133*e1eccf28SAndroid Build Coastguard Worker         for (const auto& p1 : *map) {
134*e1eccf28SAndroid Build Coastguard Worker             p1.first->decSysRef();
135*e1eccf28SAndroid Build Coastguard Worker         }
136*e1eccf28SAndroid Build Coastguard Worker         delete p.second;
137*e1eccf28SAndroid Build Coastguard Worker     }
138*e1eccf28SAndroid Build Coastguard Worker 
139*e1eccf28SAndroid Build Coastguard Worker     delete[] mArgs;
140*e1eccf28SAndroid Build Coastguard Worker     delete[] mParams;
141*e1eccf28SAndroid Build Coastguard Worker }
142*e1eccf28SAndroid Build Coastguard Worker 
setArg(const uint32_t index,const void * value,const int size)143*e1eccf28SAndroid Build Coastguard Worker void Closure::setArg(const uint32_t index, const void* value, const int size) {
144*e1eccf28SAndroid Build Coastguard Worker     mArgs[index] = value;
145*e1eccf28SAndroid Build Coastguard Worker }
146*e1eccf28SAndroid Build Coastguard Worker 
setGlobal(const ScriptFieldID * fieldID,const int64_t value,const int size)147*e1eccf28SAndroid Build Coastguard Worker void Closure::setGlobal(const ScriptFieldID* fieldID, const int64_t value,
148*e1eccf28SAndroid Build Coastguard Worker                         const int size) {
149*e1eccf28SAndroid Build Coastguard Worker     mGlobals[fieldID] = make_pair(value, size);
150*e1eccf28SAndroid Build Coastguard Worker }
151*e1eccf28SAndroid Build Coastguard Worker 
152*e1eccf28SAndroid Build Coastguard Worker }  // namespace renderscript
153*e1eccf28SAndroid Build Coastguard Worker }  // namespace android
154