1ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/*
2ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Copyright (C) 2011 The Android Open Source Project
3ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *
4ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * you may not use this file except in compliance with the License.
6ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * You may obtain a copy of the License at
7ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *
8ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *
10ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Unless required by applicable law or agreed to in writing, software
11ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * See the License for the specific language governing permissions and
14ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * limitations under the License.
15ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */
16ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
17ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsdCore.h"
18ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
19ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include <bcc/BCCContext.h>
20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include <bcc/Renderscript/RSCompilerDriver.h>
21ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include <bcc/Renderscript/RSExecutable.h>
22ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include <bcc/Renderscript/RSInfo.h>
23ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
24ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsScript.h"
25ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsScriptGroup.h"
26ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsdScriptGroup.h"
27ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsdBcc.h"
28ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
29ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsusing namespace android;
30ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsusing namespace android::renderscript;
31ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
32ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
33ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsbool rsdScriptGroupInit(const android::renderscript::Context *rsc,
34ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                        const android::renderscript::ScriptGroup *sg) {
35ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    return true;
36ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
37ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
38ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsvoid rsdScriptGroupSetInput(const android::renderscript::Context *rsc,
39ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                            const android::renderscript::ScriptGroup *sg,
40ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                            const android::renderscript::ScriptKernelID *kid,
41ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                            android::renderscript::Allocation *) {
42ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
43ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
44ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsvoid rsdScriptGroupSetOutput(const android::renderscript::Context *rsc,
45ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                             const android::renderscript::ScriptGroup *sg,
46ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                             const android::renderscript::ScriptKernelID *kid,
47ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                             android::renderscript::Allocation *) {
48ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
49ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
50ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsvoid rsdScriptGroupExecute(const android::renderscript::Context *rsc,
51ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           const android::renderscript::ScriptGroup *sg) {
52ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
53ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<Allocation *> ins;
54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<Allocation *> outs;
55ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<const ScriptKernelID *> kernels;
56ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
57ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    for (size_t ct=0; ct < sg->mNodes.size(); ct++) {
58ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ScriptGroup::Node *n = sg->mNodes[ct];
59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        //ALOGE("node %i, order %i, in %i out %i", (int)ct, n->mOrder, (int)n->mInputs.size(), (int)n->mOutputs.size());
60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        for (size_t ct2=0; ct2 < n->mKernels.size(); ct2++) {
62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            const ScriptKernelID *k = n->mKernels[ct2];
63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            Allocation *ain = NULL;
64ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            Allocation *aout = NULL;
65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            for (size_t ct3=0; ct3 < n->mInputs.size(); ct3++) {
67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                if (n->mInputs[ct3]->mDstKernel.get() == k) {
68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    ain = n->mInputs[ct3]->mAlloc.get();
69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    //ALOGE(" link in %p", ain);
70ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                }
71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            }
72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            for (size_t ct3=0; ct3 < sg->mInputs.size(); ct3++) {
73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                if (sg->mInputs[ct3]->mKernel == k) {
74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    ain = sg->mInputs[ct3]->mAlloc.get();
75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    //ALOGE(" io in %p", ain);
76ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                }
77ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            }
78ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
79ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            for (size_t ct3=0; ct3 < n->mOutputs.size(); ct3++) {
80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                if (n->mOutputs[ct3]->mSource.get() == k) {
81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    aout = n->mOutputs[ct3]->mAlloc.get();
82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    //ALOGE(" link out %p", aout);
83ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                }
84ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            }
85ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            for (size_t ct3=0; ct3 < sg->mOutputs.size(); ct3++) {
86ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                if (sg->mOutputs[ct3]->mKernel == k) {
87ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    aout = sg->mOutputs[ct3]->mAlloc.get();
88ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                    //ALOGE(" io out %p", aout);
89ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                }
90ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            }
91ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
92ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            ins.add(ain);
93ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            outs.add(aout);
94ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            kernels.add(k);
95ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
96ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
97ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
99ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    RsdHal * dc = (RsdHal *)rsc->mHal.drv;
100ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    MTLaunchStruct mtls;
101ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    for (size_t ct=0; ct < ins.size(); ct++) {
102ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
103ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Script *s = kernels[ct]->mScript;
104ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        DrvScript *drv = (DrvScript *)s->mHal.drv;
105ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        uint32_t slot = kernels[ct]->mSlot;
106ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
107ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        rsdScriptInvokeForEachMtlsSetup(rsc, ins[ct], outs[ct], NULL, 0, NULL, &mtls);
108ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        mtls.script = s;
109ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        mtls.fep.slot = slot;
110ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
111ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        if (drv->mIntrinsicID) {
112ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mtls.kernel = (void (*)())drv->mIntrinsicFuncs.root;
113ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mtls.fep.usr = drv->mIntrinsicData;
114ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        } else {
115ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    	    mtls.kernel = drv->mForEachFunctions[slot];
116ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            rsAssert(mtls.kernel != NULL);
117ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mtls.sig = drv->mForEachSignatures[slot];
118ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
119ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
120ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams//        typedef void (*outer_foreach_t)(
121ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams  //          const android::renderscript::RsForEachStubParamStruct *,
122ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    //        uint32_t x1, uint32_t x2,
123ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams      //      uint32_t instep, uint32_t outstep);
124ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        //outer_foreach_t fn = (outer_foreach_t) mtls->kernel;
125ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
126ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        rsdScriptLaunchThreads(rsc, s, slot, ins[ct], outs[ct], NULL, 0, NULL, &mtls);
127ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
128ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
129ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
130ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
131ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsvoid rsdScriptGroupDestroy(const android::renderscript::Context *rsc,
132ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           const android::renderscript::ScriptGroup *sg) {
133ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
134ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
135ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
136