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