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