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