1bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/*
2ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
3bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
4bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * you may not use this file except in compliance with the License.
6bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * You may obtain a copy of the License at
7bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
8bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
10bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Unless required by applicable law or agreed to in writing, software
11bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * See the License for the specific language governing permissions and
14bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * limitations under the License.
15bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */
16bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "../cpu_ref/rsd_cpu.h"
18bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsdCore.h"
20689821f178503af951a3d9dd558ef8eace6537cdStephen Hines
21dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdBcc.h"
22dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdAllocation.h"
23dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
24bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsContext.h"
252980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines#include "rsElement.h"
26bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsScriptC.h"
27bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
28e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Allocation;
29e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Context;
30e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Element;
31e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::ObjectBase;
32e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::RsdCpuReference;
33e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Script;
34e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::ScriptC;
35e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::rs_script;
3683c451a4ef4388e002482e383d488ca9b7b7600dJason Sams
37bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsbool rsdScriptInit(const Context *rsc,
38bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     ScriptC *script,
39bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     char const *resName,
40bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     char const *cacheDir,
41bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     uint8_t const *bitcode,
42bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     size_t bitcodeSize,
4387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                     uint32_t flags) {
44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
45f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    RsdCpuReference::CpuScript * cs =
46f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes        dc->mCpuRef->createScript(script, resName, cacheDir, bitcode,
47f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                  bitcodeSize, flags);
4844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (cs == nullptr) {
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return false;
50709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.drv = cs;
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->populateScript(script);
53bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    return true;
54bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
55bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
56f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailesbool rsdInitIntrinsic(const Context *rsc, Script *s, RsScriptIntrinsicID iid,
57f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                      Element *e) {
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript * cs = dc->mCpuRef->createIntrinsic(s, iid, e);
6044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (cs == nullptr) {
61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return false;
628eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    }
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.drv = cs;
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->populateScript(s);
658eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    return true;
66cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams}
67cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
68dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptInvokeForEach(const Context *rsc,
69dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            Script *s,
70dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            uint32_t slot,
71dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const Allocation * ain,
72dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            Allocation * aout,
73dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const void * usr,
74099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                            size_t usrLen,
75dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const RsScriptCall *sc) {
76dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
7744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (ain == nullptr) {
7844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        rsdScriptInvokeForEachMulti(rsc, s, slot, nullptr, 0, aout, usr, usrLen,
79f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                    sc);
80f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    } else {
81f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes        const Allocation *ains[1] = {ain};
82f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes
83f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes        rsdScriptInvokeForEachMulti(rsc, s, slot, ains, 1, aout, usr, usrLen,
84f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                    sc);
85f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    }
86dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
87dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
884b3c34e6833e39bc89c2128002806b654b8e623dChris Wailesvoid rsdScriptInvokeForEachMulti(const Context *rsc,
894b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 Script *s,
904b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 uint32_t slot,
914b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 const Allocation ** ains,
924b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 size_t inLen,
934b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 Allocation * aout,
944b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 const void * usr,
954b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 size_t usrLen,
964b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                 const RsScriptCall *sc) {
974b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
984b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
99f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    cs->invokeForEach(slot, ains, inLen, aout, usr, usrLen, sc);
1004b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes}
1014b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
102cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
103709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint rsdScriptInvokeRoot(const Context *dc, Script *s) {
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return cs->invokeRoot();
106bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
107bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
108709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptInvokeInit(const Context *dc, Script *s) {
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->invokeInit();
111bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
112bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
113709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptInvokeFreeChildren(const Context *dc, Script *s) {
114709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->invokeFreeChildren();
1164ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines}
117bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
118709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptInvokeFunction(const Context *dc, Script *s,
119bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                            uint32_t slot,
120bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                            const void *params,
121bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                            size_t paramLength) {
122709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
123709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->invokeFunction(slot, params, paramLength);
124bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
125bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
12614ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Walavoid rsdScriptInvokeReduce(const Context *dc, Script *s,
12714ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                           uint32_t slot,
128ae2ec3febedfc29376b9104413fb4042028f1265David Gross                           const Allocation ** ains, size_t inLen,
12914ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                           Allocation *aout,
13014ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                           const RsScriptCall *sc) {
13114ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
132ae2ec3febedfc29376b9104413fb4042028f1265David Gross    cs->invokeReduce(slot, ains, inLen, aout, sc);
1336c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross}
1346c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
135709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptSetGlobalVar(const Context *dc, const Script *s,
136bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                           uint32_t slot, void *data, size_t dataLength) {
137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->setGlobalVar(slot, data, dataLength);
139bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
140bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
1419c64239ebbfa4170190ede812e69150035e008e0Tim Murrayvoid rsdScriptGetGlobalVar(const Context *dc, const Script *s,
1429c64239ebbfa4170190ede812e69150035e008e0Tim Murray                           uint32_t slot, void *data, size_t dataLength) {
1439c64239ebbfa4170190ede812e69150035e008e0Tim Murray    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
1449c64239ebbfa4170190ede812e69150035e008e0Tim Murray    cs->getGlobalVar(slot, data, dataLength);
1459c64239ebbfa4170190ede812e69150035e008e0Tim Murray}
1469c64239ebbfa4170190ede812e69150035e008e0Tim Murray
1479c64239ebbfa4170190ede812e69150035e008e0Tim Murray
148709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptSetGlobalVarWithElemDims(const Context *dc, const Script *s,
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                       uint32_t slot, void *data, size_t dataLength,
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                       const android::renderscript::Element *elem,
151ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines                                       const uint32_t *dims, size_t dimLength) {
152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->setGlobalVarWithElemDims(slot, data, dataLength, elem, dims, dimLength);
1542980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines}
1552980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
156709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptSetGlobalBind(const Context *dc, const Script *s, uint32_t slot, Allocation *data) {
157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->setGlobalBind(slot, data);
159bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
160bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
161709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptSetGlobalObj(const Context *dc, const Script *s, uint32_t slot, ObjectBase *data) {
162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
163709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    cs->setGlobalObj(slot, data);
164bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
165bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
166709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsdScriptDestroy(const Context *dc, Script *s) {
167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)s->mHal.drv;
168709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    delete cs;
16944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    s->mHal.drv = nullptr;
170bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
171807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
173807fdc4b6f3fb893015ee136565d6151bb2332d3Jason SamsAllocation * rsdScriptGetAllocationForPointer(const android::renderscript::Context *dc,
174807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                              const android::renderscript::Script *sc,
175807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                              const void *ptr) {
176709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript *cs = (RsdCpuReference::CpuScript *)sc->mHal.drv;
177709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return cs->getAllocationForPointer(ptr);
178807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams}
179a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
180a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid rsdScriptUpdateCachedObject(const Context *rsc,
181a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams                                 const Script *script,
182a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams                                 rs_script *obj)
183a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams{
184a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    obj->p = script;
185a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#ifdef __LP64__
186700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    obj->unused1 = nullptr;
187700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    obj->unused2 = nullptr;
188700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung    obj->unused3 = nullptr;
189a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#endif
190a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams}
191