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