rsdScriptGroup.cpp revision b801b949e286275b5d19a33135235ba68d3a19a9
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" 28dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 29dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsusing namespace android; 30dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsusing namespace android::renderscript; 31dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 32dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 33dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsbool rsdScriptGroupInit(const android::renderscript::Context *rsc, 34dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg) { 35dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams return true; 36dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 37dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 38dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupSetInput(const android::renderscript::Context *rsc, 39dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg, 40dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptKernelID *kid, 41dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams android::renderscript::Allocation *) { 42dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 43dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 44dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupSetOutput(const android::renderscript::Context *rsc, 45dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg, 46dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptKernelID *kid, 47dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams android::renderscript::Allocation *) { 48dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 49dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 50dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupExecute(const android::renderscript::Context *rsc, 51dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg) { 52dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 53dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Vector<Allocation *> ins; 54dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Vector<Allocation *> outs; 55dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Vector<const ScriptKernelID *> kernels; 56dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 57dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct=0; ct < sg->mNodes.size(); ct++) { 58dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams ScriptGroup::Node *n = sg->mNodes[ct]; 59bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams Script *s = n->mKernels[0]->mScript; 60bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams 61dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE("node %i, order %i, in %i out %i", (int)ct, n->mOrder, (int)n->mInputs.size(), (int)n->mOutputs.size()); 62dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 63bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams for (size_t ct2=0; ct2 < n->mInputs.size(); ct2++) { 64bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams if (n->mInputs[ct2]->mDstField->mScript) { 65bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams //ALOGE("field %p %zu", n->mInputs[ct2]->mDstField->mScript, n->mInputs[ct2]->mDstField->mSlot); 66bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams s->setSlot(n->mInputs[ct2]->mDstField->mSlot, n->mInputs[ct2]->mAlloc.get()); 67bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams } 68bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams } 69bd726b2159c14bd78d45f3157befcb733037f8d4Jason Sams 70dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct2=0; ct2 < n->mKernels.size(); ct2++) { 71dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const ScriptKernelID *k = n->mKernels[ct2]; 72dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Allocation *ain = NULL; 73dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Allocation *aout = NULL; 74dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 75dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < n->mInputs.size(); ct3++) { 76dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (n->mInputs[ct3]->mDstKernel.get() == k) { 77dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams ain = n->mInputs[ct3]->mAlloc.get(); 78dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" link in %p", ain); 79dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 80dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 81dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < sg->mInputs.size(); ct3++) { 82dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (sg->mInputs[ct3]->mKernel == k) { 83dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams ain = sg->mInputs[ct3]->mAlloc.get(); 84dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" io in %p", ain); 85dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 86dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 87dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 88dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < n->mOutputs.size(); ct3++) { 89dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (n->mOutputs[ct3]->mSource.get() == k) { 90dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams aout = n->mOutputs[ct3]->mAlloc.get(); 91dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" link out %p", aout); 92dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 93dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 94dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct3=0; ct3 < sg->mOutputs.size(); ct3++) { 95dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (sg->mOutputs[ct3]->mKernel == k) { 96dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams aout = sg->mOutputs[ct3]->mAlloc.get(); 97dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //ALOGE(" io out %p", aout); 98dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 99dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 100dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 101b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams if ((k->mHasKernelOutput == (aout != NULL)) && 102b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams (k->mHasKernelInput == (ain != NULL))) { 103b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams ins.add(ain); 104b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams outs.add(aout); 105b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams kernels.add(k); 106b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams } 107dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 108dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 109dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 110dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 111dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams RsdHal * dc = (RsdHal *)rsc->mHal.drv; 112dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams MTLaunchStruct mtls; 113dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams for (size_t ct=0; ct < ins.size(); ct++) { 114dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 115dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams Script *s = kernels[ct]->mScript; 116dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams DrvScript *drv = (DrvScript *)s->mHal.drv; 117dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams uint32_t slot = kernels[ct]->mSlot; 118dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 119dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams rsdScriptInvokeForEachMtlsSetup(rsc, ins[ct], outs[ct], NULL, 0, NULL, &mtls); 120dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams mtls.script = s; 121cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams mtls.fep.slot = slot; 122dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 123dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams if (drv->mIntrinsicID) { 124dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams mtls.kernel = (void (*)())drv->mIntrinsicFuncs.root; 125dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams mtls.fep.usr = drv->mIntrinsicData; 126dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } else { 127dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams mtls.kernel = reinterpret_cast<ForEachFunc_t>( 128dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams drv->mExecutable->getExportForeachFuncAddrs()[slot]); 129dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams rsAssert(mtls.kernel != NULL); 130dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams mtls.sig = drv->mExecutable->getInfo().getExportForeachFuncs()[slot].second; 131dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 132dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 133dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams// typedef void (*outer_foreach_t)( 134dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams // const android::renderscript::RsForEachStubParamStruct *, 135dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams // uint32_t x1, uint32_t x2, 136dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams // uint32_t instep, uint32_t outstep); 137dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams //outer_foreach_t fn = (outer_foreach_t) mtls->kernel; 138dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 139dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams rsdScriptLaunchThreads(rsc, s, slot, ins[ct], outs[ct], NULL, 0, NULL, &mtls); 140dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams } 141dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 142dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 143dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 144dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptGroupDestroy(const android::renderscript::Context *rsc, 145dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams const android::renderscript::ScriptGroup *sg) { 146dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams} 147dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 148dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams 149