xref: /aosp_15_r20/frameworks/rs/driver/rsdBcc.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2011-2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #include "../cpu_ref/rsd_cpu.h"
18*e1eccf28SAndroid Build Coastguard Worker 
19*e1eccf28SAndroid Build Coastguard Worker #include "rsdCore.h"
20*e1eccf28SAndroid Build Coastguard Worker 
21*e1eccf28SAndroid Build Coastguard Worker #include "rsdBcc.h"
22*e1eccf28SAndroid Build Coastguard Worker #include "rsdAllocation.h"
23*e1eccf28SAndroid Build Coastguard Worker 
24*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
25*e1eccf28SAndroid Build Coastguard Worker #include "rsElement.h"
26*e1eccf28SAndroid Build Coastguard Worker #include "rsScriptC.h"
27*e1eccf28SAndroid Build Coastguard Worker 
28*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Allocation;
29*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Context;
30*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Element;
31*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ObjectBase;
32*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::RsdCpuReference;
33*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Script;
34*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ScriptC;
35*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rs_script;
36*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInit(const Context * rsc,ScriptC * script,char const * resName,char const * cacheDir,uint8_t const * bitcode,size_t bitcodeSize,uint32_t flags)37*e1eccf28SAndroid Build Coastguard Worker bool rsdScriptInit(const Context *rsc,
38*e1eccf28SAndroid Build Coastguard Worker                      ScriptC *script,
39*e1eccf28SAndroid Build Coastguard Worker                      char const *resName,
40*e1eccf28SAndroid Build Coastguard Worker                      char const *cacheDir,
41*e1eccf28SAndroid Build Coastguard Worker                      uint8_t const *bitcode,
42*e1eccf28SAndroid Build Coastguard Worker                      size_t bitcodeSize,
43*e1eccf28SAndroid Build Coastguard Worker                      uint32_t flags) {
44*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
45*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript * cs =
46*e1eccf28SAndroid Build Coastguard Worker         dc->mCpuRef->createScript(script, resName, cacheDir, bitcode,
47*e1eccf28SAndroid Build Coastguard Worker                                   bitcodeSize, flags);
48*e1eccf28SAndroid Build Coastguard Worker     if (cs == nullptr) {
49*e1eccf28SAndroid Build Coastguard Worker         return false;
50*e1eccf28SAndroid Build Coastguard Worker     }
51*e1eccf28SAndroid Build Coastguard Worker     script->mHal.drv = cs;
52*e1eccf28SAndroid Build Coastguard Worker     cs->populateScript(script);
53*e1eccf28SAndroid Build Coastguard Worker     return true;
54*e1eccf28SAndroid Build Coastguard Worker }
55*e1eccf28SAndroid Build Coastguard Worker 
rsdInitIntrinsic(const Context * rsc,Script * s,RsScriptIntrinsicID iid,Element * e)56*e1eccf28SAndroid Build Coastguard Worker bool rsdInitIntrinsic(const Context *rsc, Script *s, RsScriptIntrinsicID iid,
57*e1eccf28SAndroid Build Coastguard Worker                       Element *e) {
58*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
59*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript * cs = dc->mCpuRef->createIntrinsic(s, iid, e);
60*e1eccf28SAndroid Build Coastguard Worker     if (cs == nullptr) {
61*e1eccf28SAndroid Build Coastguard Worker         return false;
62*e1eccf28SAndroid Build Coastguard Worker     }
63*e1eccf28SAndroid Build Coastguard Worker     s->mHal.drv = cs;
64*e1eccf28SAndroid Build Coastguard Worker     cs->populateScript(s);
65*e1eccf28SAndroid Build Coastguard Worker     return true;
66*e1eccf28SAndroid Build Coastguard Worker }
67*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeForEach(const Context * rsc,Script * s,uint32_t slot,const Allocation * ain,Allocation * aout,const void * usr,size_t usrLen,const RsScriptCall * sc)68*e1eccf28SAndroid Build Coastguard Worker void rsdScriptInvokeForEach(const Context *rsc,
69*e1eccf28SAndroid Build Coastguard Worker                             Script *s,
70*e1eccf28SAndroid Build Coastguard Worker                             uint32_t slot,
71*e1eccf28SAndroid Build Coastguard Worker                             const Allocation * ain,
72*e1eccf28SAndroid Build Coastguard Worker                             Allocation * aout,
73*e1eccf28SAndroid Build Coastguard Worker                             const void * usr,
74*e1eccf28SAndroid Build Coastguard Worker                             size_t usrLen,
75*e1eccf28SAndroid Build Coastguard Worker                             const RsScriptCall *sc) {
76*e1eccf28SAndroid Build Coastguard Worker 
77*e1eccf28SAndroid Build Coastguard Worker     if (ain == nullptr) {
78*e1eccf28SAndroid Build Coastguard Worker         rsdScriptInvokeForEachMulti(rsc, s, slot, nullptr, 0, aout, usr, usrLen,
79*e1eccf28SAndroid Build Coastguard Worker                                     sc);
80*e1eccf28SAndroid Build Coastguard Worker     } else {
81*e1eccf28SAndroid Build Coastguard Worker         const Allocation *ains[1] = {ain};
82*e1eccf28SAndroid Build Coastguard Worker 
83*e1eccf28SAndroid Build Coastguard Worker         rsdScriptInvokeForEachMulti(rsc, s, slot, ains, 1, aout, usr, usrLen,
84*e1eccf28SAndroid Build Coastguard Worker                                     sc);
85*e1eccf28SAndroid Build Coastguard Worker     }
86*e1eccf28SAndroid Build Coastguard Worker }
87*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeForEachMulti(const Context * rsc,Script * s,uint32_t slot,const Allocation ** ains,size_t inLen,Allocation * aout,const void * usr,size_t usrLen,const RsScriptCall * sc)88*e1eccf28SAndroid Build Coastguard Worker void rsdScriptInvokeForEachMulti(const Context *rsc,
89*e1eccf28SAndroid Build Coastguard Worker                                  Script *s,
90*e1eccf28SAndroid Build Coastguard Worker                                  uint32_t slot,
91*e1eccf28SAndroid Build Coastguard Worker                                  const Allocation ** ains,
92*e1eccf28SAndroid Build Coastguard Worker                                  size_t inLen,
93*e1eccf28SAndroid Build Coastguard Worker                                  Allocation * aout,
94*e1eccf28SAndroid Build Coastguard Worker                                  const void * usr,
95*e1eccf28SAndroid Build Coastguard Worker                                  size_t usrLen,
96*e1eccf28SAndroid Build Coastguard Worker                                  const RsScriptCall *sc) {
97*e1eccf28SAndroid Build Coastguard Worker 
98*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
99*e1eccf28SAndroid Build Coastguard Worker     cs->invokeForEach(slot, ains, inLen, aout, usr, usrLen, sc);
100*e1eccf28SAndroid Build Coastguard Worker }
101*e1eccf28SAndroid Build Coastguard Worker 
102*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeRoot(const Context * dc,Script * s)103*e1eccf28SAndroid Build Coastguard Worker int rsdScriptInvokeRoot(const Context *dc, Script *s) {
104*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
105*e1eccf28SAndroid Build Coastguard Worker     return cs->invokeRoot();
106*e1eccf28SAndroid Build Coastguard Worker }
107*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeInit(const Context * dc,Script * s)108*e1eccf28SAndroid Build Coastguard Worker void rsdScriptInvokeInit(const Context *dc, Script *s) {
109*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
110*e1eccf28SAndroid Build Coastguard Worker     cs->invokeInit();
111*e1eccf28SAndroid Build Coastguard Worker }
112*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeFreeChildren(const Context * dc,Script * s)113*e1eccf28SAndroid Build Coastguard Worker void rsdScriptInvokeFreeChildren(const Context *dc, Script *s) {
114*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
115*e1eccf28SAndroid Build Coastguard Worker     cs->invokeFreeChildren();
116*e1eccf28SAndroid Build Coastguard Worker }
117*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeFunction(const Context * dc,Script * s,uint32_t slot,const void * params,size_t paramLength)118*e1eccf28SAndroid Build Coastguard Worker void rsdScriptInvokeFunction(const Context *dc, Script *s,
119*e1eccf28SAndroid Build Coastguard Worker                             uint32_t slot,
120*e1eccf28SAndroid Build Coastguard Worker                             const void *params,
121*e1eccf28SAndroid Build Coastguard Worker                             size_t paramLength) {
122*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
123*e1eccf28SAndroid Build Coastguard Worker     cs->invokeFunction(slot, params, paramLength);
124*e1eccf28SAndroid Build Coastguard Worker }
125*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptInvokeReduce(const Context * dc,Script * s,uint32_t slot,const Allocation ** ains,size_t inLen,Allocation * aout,const RsScriptCall * sc)126*e1eccf28SAndroid Build Coastguard Worker void rsdScriptInvokeReduce(const Context *dc, Script *s,
127*e1eccf28SAndroid Build Coastguard Worker                            uint32_t slot,
128*e1eccf28SAndroid Build Coastguard Worker                            const Allocation ** ains, size_t inLen,
129*e1eccf28SAndroid Build Coastguard Worker                            Allocation *aout,
130*e1eccf28SAndroid Build Coastguard Worker                            const RsScriptCall *sc) {
131*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
132*e1eccf28SAndroid Build Coastguard Worker     cs->invokeReduce(slot, ains, inLen, aout, sc);
133*e1eccf28SAndroid Build Coastguard Worker }
134*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptSetGlobalVar(const Context * dc,const Script * s,uint32_t slot,void * data,size_t dataLength)135*e1eccf28SAndroid Build Coastguard Worker void rsdScriptSetGlobalVar(const Context *dc, const Script *s,
136*e1eccf28SAndroid Build Coastguard Worker                            uint32_t slot, void *data, size_t dataLength) {
137*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
138*e1eccf28SAndroid Build Coastguard Worker     cs->setGlobalVar(slot, data, dataLength);
139*e1eccf28SAndroid Build Coastguard Worker }
140*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptGetGlobalVar(const Context * dc,const Script * s,uint32_t slot,void * data,size_t dataLength)141*e1eccf28SAndroid Build Coastguard Worker void rsdScriptGetGlobalVar(const Context *dc, const Script *s,
142*e1eccf28SAndroid Build Coastguard Worker                            uint32_t slot, void *data, size_t dataLength) {
143*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
144*e1eccf28SAndroid Build Coastguard Worker     cs->getGlobalVar(slot, data, dataLength);
145*e1eccf28SAndroid Build Coastguard Worker }
146*e1eccf28SAndroid Build Coastguard Worker 
147*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptSetGlobalVarWithElemDims(const Context * dc,const Script * s,uint32_t slot,void * data,size_t dataLength,const android::renderscript::Element * elem,const uint32_t * dims,size_t dimLength)148*e1eccf28SAndroid Build Coastguard Worker void rsdScriptSetGlobalVarWithElemDims(const Context *dc, const Script *s,
149*e1eccf28SAndroid Build Coastguard Worker                                        uint32_t slot, void *data, size_t dataLength,
150*e1eccf28SAndroid Build Coastguard Worker                                        const android::renderscript::Element *elem,
151*e1eccf28SAndroid Build Coastguard Worker                                        const uint32_t *dims, size_t dimLength) {
152*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
153*e1eccf28SAndroid Build Coastguard Worker     cs->setGlobalVarWithElemDims(slot, data, dataLength, elem, dims, dimLength);
154*e1eccf28SAndroid Build Coastguard Worker }
155*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptSetGlobalBind(const Context * dc,const Script * s,uint32_t slot,Allocation * data)156*e1eccf28SAndroid Build Coastguard Worker void rsdScriptSetGlobalBind(const Context *dc, const Script *s, uint32_t slot, Allocation *data) {
157*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
158*e1eccf28SAndroid Build Coastguard Worker     cs->setGlobalBind(slot, data);
159*e1eccf28SAndroid Build Coastguard Worker }
160*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptSetGlobalObj(const Context * dc,const Script * s,uint32_t slot,ObjectBase * data)161*e1eccf28SAndroid Build Coastguard Worker void rsdScriptSetGlobalObj(const Context *dc, const Script *s, uint32_t slot, ObjectBase *data) {
162*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
163*e1eccf28SAndroid Build Coastguard Worker     cs->setGlobalObj(slot, data);
164*e1eccf28SAndroid Build Coastguard Worker }
165*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptDestroy(const Context * dc,Script * s)166*e1eccf28SAndroid Build Coastguard Worker void rsdScriptDestroy(const Context *dc, Script *s) {
167*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
168*e1eccf28SAndroid Build Coastguard Worker     delete cs;
169*e1eccf28SAndroid Build Coastguard Worker     s->mHal.drv = nullptr;
170*e1eccf28SAndroid Build Coastguard Worker }
171*e1eccf28SAndroid Build Coastguard Worker 
172*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptGetAllocationForPointer(const android::renderscript::Context * dc,const android::renderscript::Script * sc,const void * ptr)173*e1eccf28SAndroid Build Coastguard Worker Allocation * rsdScriptGetAllocationForPointer(const android::renderscript::Context *dc,
174*e1eccf28SAndroid Build Coastguard Worker                                               const android::renderscript::Script *sc,
175*e1eccf28SAndroid Build Coastguard Worker                                               const void *ptr) {
176*e1eccf28SAndroid Build Coastguard Worker     RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)sc->mHal.drv;
177*e1eccf28SAndroid Build Coastguard Worker     return cs->getAllocationForPointer(ptr);
178*e1eccf28SAndroid Build Coastguard Worker }
179*e1eccf28SAndroid Build Coastguard Worker 
rsdScriptUpdateCachedObject(const Context * rsc,const Script * script,rs_script * obj)180*e1eccf28SAndroid Build Coastguard Worker void rsdScriptUpdateCachedObject(const Context *rsc,
181*e1eccf28SAndroid Build Coastguard Worker                                  const Script *script,
182*e1eccf28SAndroid Build Coastguard Worker                                  rs_script *obj)
183*e1eccf28SAndroid Build Coastguard Worker {
184*e1eccf28SAndroid Build Coastguard Worker     obj->p = script;
185*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
186*e1eccf28SAndroid Build Coastguard Worker     obj->unused1 = nullptr;
187*e1eccf28SAndroid Build Coastguard Worker     obj->unused2 = nullptr;
188*e1eccf28SAndroid Build Coastguard Worker     obj->unused3 = nullptr;
189*e1eccf28SAndroid Build Coastguard Worker #endif
190*e1eccf28SAndroid Build Coastguard Worker }
191