rsdScriptGroup.cpp revision bee28c6b56d0c399402014cd58cea426da2b98c1
1dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams/* 2dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * Copyright (C) 2011 The Android Open Source Project 3dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * 4dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * you may not use this file except in compliance with the License. 6dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * You may obtain a copy of the License at 7dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * 8dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * 10dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * Unless required by applicable law or agreed to in writing, software 11dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * See the License for the specific language governing permissions and 14dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * limitations under the License. 15dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams */ 16dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 17dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdCore.h" 18dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 19dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include <bcc/BCCContext.h> 20dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include <bcc/Renderscript/RSCompilerDriver.h> 21dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include <bcc/Renderscript/RSExecutable.h> 22dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include <bcc/Renderscript/RSInfo.h> 23dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 24dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsScript.h" 25dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsScriptGroup.h" 26dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdScriptGroup.h" 27dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdBcc.h" 28bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams#include "rsdAllocation.h" 29dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 30dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsusing namespace android; 31dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsusing namespace android::renderscript; 32dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 33dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 34dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsbool rsdScriptGroupInit(const android::renderscript::Context *rsc, 35dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg) { 36dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams return true; 37dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 38dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 39dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupSetInput(const android::renderscript::Context *rsc, 40dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg, 41dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptKernelID *kid, 42dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams android::renderscript::Allocation *) { 43dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 44dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 45dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupSetOutput(const android::renderscript::Context *rsc, 46dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg, 47dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptKernelID *kid, 48dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams android::renderscript::Allocation *) { 49dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 50dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 51bee28c6b56d0c399402014cd58cea426da2b98c1Jason Samsstruct ScriptList { 52bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams size_t count; 53bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Allocation *const* ins; 54bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams bool const* inExts; 55bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Allocation *const* outs; 56bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams bool const* outExts; 57bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams const void *const* usrPtrs; 58bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams size_t const *usrSizes; 59bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams uint32_t const *sigs; 60bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams const void *const* fnPtrs; 61bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 62bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams const ScriptKernelID *const* kernels; 63bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams}; 64bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 65bee28c6b56d0c399402014cd58cea426da2b98c1Jason Samstypedef void (*ScriptGroupRootFunc_t)(const RsForEachStubParamStruct *p, 66bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams uint32_t xstart, uint32_t xend, 67bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams uint32_t instep, uint32_t outstep); 68bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 69bee28c6b56d0c399402014cd58cea426da2b98c1Jason Samsstatic void ScriptGroupRoot(const RsForEachStubParamStruct *p, 70bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams uint32_t xstart, uint32_t xend, 71bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams uint32_t instep, uint32_t outstep) { 72bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 73bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams const ScriptList *sl = (const ScriptList *)p->usr; 74bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams RsForEachStubParamStruct *mp = (RsForEachStubParamStruct *)p; 75bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams const void *oldUsr = p->usr; 76bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 77bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams for(size_t ct=0; ct < sl->count; ct++) { 78bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams ScriptGroupRootFunc_t func; 79bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams func = (ScriptGroupRootFunc_t)sl->fnPtrs[ct]; 80bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->usr = sl->usrPtrs[ct]; 81bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 82bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->ptrIn = NULL; 83bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->in = NULL; 84bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->ptrOut = NULL; 85bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->out = NULL; 86bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 87bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (sl->ins[ct]) { 88bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams DrvAllocation *drv = (DrvAllocation *)sl->ins[ct]->mHal.drv; 89bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->ptrIn = (const uint8_t *)drv->lod[0].mallocPtr; 90bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->in = mp->ptrIn; 91bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (sl->inExts[ct]) { 92bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->in = mp->ptrIn + drv->lod[0].stride * p->y; 93bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } else { 94bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (drv->lod[0].dimY > p->lid) { 95bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->in = mp->ptrIn + drv->lod[0].stride * p->lid; 96bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 97bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 98bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 99bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 100bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (sl->outs[ct]) { 101bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams DrvAllocation *drv = (DrvAllocation *)sl->outs[ct]->mHal.drv; 102bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->ptrOut = (uint8_t *)drv->lod[0].mallocPtr; 103bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->out = mp->ptrOut; 104bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (sl->outExts[ct]) { 105bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->out = mp->ptrOut + drv->lod[0].stride * p->y; 106bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } else { 107bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (drv->lod[0].dimY > p->lid) { 108bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->out = mp->ptrOut + drv->lod[0].stride * p->lid; 109bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 110bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 111bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 112bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 113bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams //ALOGE("kernel %i %p,%p %p,%p", ct, mp->ptrIn, mp->in, mp->ptrOut, mp->out); 114bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams func(p, xstart, xend, instep, outstep); 115bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 116bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams //ALOGE("script group root"); 117bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 118bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams //ConvolveParams *cp = (ConvolveParams *)p->usr; 119bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 120bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mp->usr = oldUsr; 121bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams} 122bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 123bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 124dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupExecute(const android::renderscript::Context *rsc, 125dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg) { 126dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 127dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Vector<Allocation *> ins; 128bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Vector<bool> inExts; 129dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Vector<Allocation *> outs; 130bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Vector<bool> outExts; 131dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Vector<const ScriptKernelID *> kernels; 132bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams bool fieldDep = false; 133dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 134dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct=0; ct < sg->mNodes.size(); ct++) { 135dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams ScriptGroup::Node *n = sg->mNodes[ct]; 136bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams Script *s = n->mKernels[0]->mScript; 137bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams 138dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE("node %i, order %i, in %i out %i", (int)ct, n->mOrder, (int)n->mInputs.size(), (int)n->mOutputs.size()); 139dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 140bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams for (size_t ct2=0; ct2 < n->mInputs.size(); ct2++) { 14115ff402e4728476054c7e2ecd1fe610e6e8d4e71Jason Sams if (n->mInputs[ct2]->mDstField.get() && n->mInputs[ct2]->mDstField->mScript) { 142bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams //ALOGE("field %p %zu", n->mInputs[ct2]->mDstField->mScript, n->mInputs[ct2]->mDstField->mSlot); 14378b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams s->setVarObj(n->mInputs[ct2]->mDstField->mSlot, n->mInputs[ct2]->mAlloc.get()); 144bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams } 145bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams } 146bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams 147dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct2=0; ct2 < n->mKernels.size(); ct2++) { 148dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const ScriptKernelID *k = n->mKernels[ct2]; 149dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Allocation *ain = NULL; 150dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Allocation *aout = NULL; 151bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams bool inExt = false; 152bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams bool outExt = false; 153dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 154dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < n->mInputs.size(); ct3++) { 155dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (n->mInputs[ct3]->mDstKernel.get() == k) { 156dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams ain = n->mInputs[ct3]->mAlloc.get(); 157dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" link in %p", ain); 158dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 159dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 160dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < sg->mInputs.size(); ct3++) { 161dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (sg->mInputs[ct3]->mKernel == k) { 162dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams ain = sg->mInputs[ct3]->mAlloc.get(); 163bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams inExt = true; 164dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" io in %p", ain); 165dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 166dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 167dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 168dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < n->mOutputs.size(); ct3++) { 169dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (n->mOutputs[ct3]->mSource.get() == k) { 170dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams aout = n->mOutputs[ct3]->mAlloc.get(); 171bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if(n->mOutputs[ct3]->mDstField.get() != NULL) { 172bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams fieldDep = true; 173bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 174dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" link out %p", aout); 175dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 176dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 177dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < sg->mOutputs.size(); ct3++) { 178dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (sg->mOutputs[ct3]->mKernel == k) { 179dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams aout = sg->mOutputs[ct3]->mAlloc.get(); 180bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams outExt = true; 181dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" io out %p", aout); 182dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 183dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 184dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 185b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams if ((k->mHasKernelOutput == (aout != NULL)) && 186b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams (k->mHasKernelInput == (ain != NULL))) { 187b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams ins.add(ain); 188bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams inExts.add(inExt); 189b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams outs.add(aout); 190bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams outExts.add(outExt); 191b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams kernels.add(k); 192b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams } 193dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 194dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 195dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 196dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 197dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams RsdHal * dc = (RsdHal *)rsc->mHal.drv; 198dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams MTLaunchStruct mtls; 199bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 200bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if(fieldDep) { 201bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams for (size_t ct=0; ct < ins.size(); ct++) { 202bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Script *s = kernels[ct]->mScript; 203bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams DrvScript *drv = (DrvScript *)s->mHal.drv; 204bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams uint32_t slot = kernels[ct]->mSlot; 205bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 206bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams rsdScriptInvokeForEachMtlsSetup(rsc, ins[ct], outs[ct], NULL, 0, NULL, &mtls); 207bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.script = s; 208bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 209bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (drv->mIntrinsicID) { 210bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.kernel = (void (*)())drv->mIntrinsicFuncs.root; 211bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.fep.usr = drv->mIntrinsicData; 212bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } else { 213bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.kernel = reinterpret_cast<ForEachFunc_t>( 214bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams drv->mExecutable->getExportForeachFuncAddrs()[slot]); 215bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams rsAssert(mtls.kernel != NULL); 216bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.sig = drv->mExecutable->getInfo().getExportForeachFuncs()[slot].second; 217bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 218bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 219bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams rsdScriptLaunchThreads(rsc, s->mHal.info.isThreadable, ins[ct], outs[ct], 220bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams NULL, 0, NULL, &mtls); 221dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 222bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } else { 223bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams ScriptList sl; 224bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.ins = ins.array(); 225bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.outs = outs.array(); 226bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.kernels = kernels.array(); 227bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.count = kernels.size(); 228dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 229bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Vector<const void *> usrPtrs; 230bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Vector<const void *> fnPtrs; 231bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Vector<uint32_t> sigs; 232bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams for (size_t ct=0; ct < kernels.size(); ct++) { 233bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams Script *s = kernels[ct]->mScript; 234bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams DrvScript *drv = (DrvScript *)s->mHal.drv; 235bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams 236bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams if (drv->mIntrinsicID) { 237bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams fnPtrs.add((void *)drv->mIntrinsicFuncs.root); 238bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams usrPtrs.add(drv->mIntrinsicData); 239bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sigs.add(0); 240bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } else { 241bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams int slot = kernels[ct]->mSlot; 242bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams fnPtrs.add((void *)drv->mExecutable->getExportForeachFuncAddrs()[slot]); 243bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams usrPtrs.add(NULL); 244bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sigs.add(drv->mExecutable->getInfo().getExportForeachFuncs()[slot].second); 245bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 246bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams } 247bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.sigs = sigs.array(); 248bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.usrPtrs = usrPtrs.array(); 249bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.fnPtrs = fnPtrs.array(); 250bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.inExts = inExts.array(); 251bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams sl.outExts = outExts.array(); 252dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 253bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams rsdScriptInvokeForEachMtlsSetup(rsc, ins[0], outs[0], NULL, 0, NULL, &mtls); 254bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.script = NULL; 255bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.kernel = (void (*)())&ScriptGroupRoot; 256bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams mtls.fep.usr = &sl; 257bee28c6b56d0c399402014cd58cea426da2b98c1Jason Sams rsdScriptLaunchThreads(rsc, true, ins[0], outs[0], NULL, 0, NULL, &mtls); 258dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 259dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 260dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 261dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 262dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupDestroy(const android::renderscript::Context *rsc, 263dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg) { 264dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 265dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 266dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 267