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