rsCpuScript.h revision d9bae689c1b8c3f2ed1a5f2b374dc9393584b8dd
14b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines/* 24b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * Copyright (C) 2011-2012 The Android Open Source Project 34b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * 44b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 54b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * you may not use this file except in compliance with the License. 64b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * You may obtain a copy of the License at 74b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * 84b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 94b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * 104b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * Unless required by applicable law or agreed to in writing, software 114b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 124b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * See the License for the specific language governing permissions and 144b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines * limitations under the License. 154b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines */ 164b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines 174b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#ifndef RSD_BCC_H 184b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#define RSD_BCC_H 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <rs_hal.h> 214b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#include <rsRuntime.h> 224b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines 23be27482cdeaf08576bc39b72a15d35d13014a636Logan#ifndef RS_COMPATIBILITY_LIB 244b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#include <utility> 254b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#endif 264b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines 274b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#include "rsCpuCore.h" 286e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines 294b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines#include <vector> 30292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 314b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hinesnamespace bcc { 324b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines class BCCContext; 33e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines class RSCompilerDriver; 344b32ffdfc1ac766f8932e7effbcdf7484e804a8eStephen Hines} 35f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines 361bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hinesnamespace bcinfo { 371bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines class MetadataExtractor; 38f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines} 391bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines 401bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hinesnamespace android { 411bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hinesnamespace renderscript { 42f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines 431bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hinesclass ScriptExecutable { 441bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines public: 451bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines ScriptExecutable(Context* RSContext, 461bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<void*>& fieldAddress, 471bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<bool>& fieldIsObject, 481bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<InvokeFunc_t>& invokeFunctions, 491bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<ForEachFunc_t>& forEachFunctions, 501bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<uint32_t>& forEachSignatures) : mRS(RSContext) { 511bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines mFieldAddress.swap(fieldAddress); 521bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines mFieldIsObject.swap(fieldIsObject); 531bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines mInvokeFunctions.swap(invokeFunctions); 541bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines mForEachFunctions.swap(forEachFunctions); 551bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines mForEachSignatures.swap(forEachSignatures); 561bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines } 571bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines 581bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines ~ScriptExecutable() { 591bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines for (size_t i = 0; i < mFieldAddress.size(); ++i) { 601bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines if (mFieldIsObject[i]) { 611bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines if (mFieldAddress[i] != nullptr) { 626e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines rs_object_base *obj_addr = 636e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines reinterpret_cast<rs_object_base *>(mFieldAddress[i]); 641bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines rsrClearObject(mRS, obj_addr); 651bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines } 666e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines } 676e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines } 681bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines } 69e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 701bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines static ScriptExecutable* 711bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines createFromSharedObject(Context* RSContext, void* sharedObj); 721bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines 731bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines size_t getExportedVariableCount() const { return mFieldAddress.size(); } 741bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines size_t getExportedFunctionCount() const { return mInvokeFunctions.size(); } 751bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines size_t getExportedForEachCount() const { return mForEachFunctions.size(); } 766e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines 776e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines void* getFieldAddress(int slot) const { return mFieldAddress[slot]; } 781bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines bool getFieldIsObject(int slot) const { return mFieldIsObject[slot]; } 791bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines InvokeFunc_t getInvokeFunction(int slot) const { return mInvokeFunctions[slot]; } 801bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines ForEachFunc_t getForEachFunction(int slot) const { return mForEachFunctions[slot]; } 811bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines uint32_t getForEachSignature(int slot) const { return mForEachSignatures[slot]; } 821bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines 836e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines private: 841bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<void*> mFieldAddress; 851bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<bool> mFieldIsObject; 861bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<InvokeFunc_t> mInvokeFunctions; 871bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<ForEachFunc_t> mForEachFunctions; 881bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines std::vector<uint32_t> mForEachSignatures; 891bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines 901bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines Context* mRS; 914464d825c11349068f2917f9ebee86b721423f3cStephen Hines}; 924464d825c11349068f2917f9ebee86b721423f3cStephen Hines 93292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hinesclass RsdCpuScriptImpl : public RsdCpuReferenceImpl::CpuScript { 94292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hinespublic: 95292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines typedef void (*outer_foreach_t)( 96d5f9d6c8b6944dfc30d4fea68479c2fcc250a62cStephen Hines const RsExpandKernelParams *, 97292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines uint32_t x1, uint32_t x2, 981bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines uint32_t outstep); 99292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 100292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines typedef void (* InvokeFunc_t)(void); 1011bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines typedef void (* ForEachFunc_t)(void); 102292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines typedef int (* RootFunc_t)(void); 103292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#ifdef RS_COMPATIBILITY_LIB 104292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 105292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#endif 1061bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines 107292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines bool init(char const *resName, char const *cacheDir, 1081bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags, 109292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines char const *bccPluginName = nullptr); 110292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void populateScript(Script *); 111292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 112292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void invokeFunction(uint32_t slot, const void *params, size_t paramLength); 113292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual int invokeRoot(); 1141bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines virtual void preLaunch(uint32_t slot, const Allocation ** ains, 115292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines uint32_t inLen, Allocation * aout, const void * usr, 1161bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines uint32_t usrLen, const RsScriptCall *sc); 117292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void postLaunch(uint32_t slot, const Allocation ** ains, 1181bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines uint32_t inLen, Allocation * aout, 1191bdd4978caabcdc9489bdcb7f1cd6087340699e8Stephen Hines const void * usr, uint32_t usrLen, 120292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const RsScriptCall *sc); 121e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines 122292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void invokeForEach(uint32_t slot, 123292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const Allocation ** ains, 124292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines uint32_t inLen, 125e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines Allocation* aout, 126292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const void* usr, 127292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines uint32_t usrLen, 128292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const RsScriptCall* sc); 129e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines 130e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines virtual void invokeInit(); 131e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines virtual void invokeFreeChildren(); 132292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 133292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength); 134292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength); 135292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, 136292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const Element *e, const uint32_t *dims, size_t dimLength); 137292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void setGlobalBind(uint32_t slot, Allocation *data); 138292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void setGlobalObj(uint32_t slot, ObjectBase *data); 139292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 140e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines 141e79fb5ec220e20bd04cd6f6059cbc9748181ce21Stephen Hines virtual ~RsdCpuScriptImpl(); 142292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s); 143c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines 144292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const Script * getScript() {return mScript;} 145292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 146292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines void forEachMtlsSetup(const Allocation ** ains, uint32_t inLen, 147292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines Allocation * aout, const void * usr, uint32_t usrLen, 148292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const RsScriptCall *sc, MTLaunchStruct *mtls); 149292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 150292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual void forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls); 151292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 152c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines 153292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const RsdCpuReference::CpuSymbol * lookupSymbolMath(const char *sym); 154c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines static void * lookupRuntimeStub(void* pContext, char const* name); 155292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 156292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines virtual Allocation * getAllocationForPointer(const void *ptr) const; 157292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines bool storeRSInfoFromSO(); 158292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 159292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hinesprotected: 160292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines RsdCpuReferenceImpl *mCtx; 161292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines const Script *mScript; 162c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines void *mScriptSO; 163c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines 164c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines#ifndef RS_COMPATIBILITY_LIB 165c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines // Returns the path to the core library we'll use. 166c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines const char* findCoreLib(const bcinfo::MetadataExtractor& bitCodeMetaData, const char* bitcode, 167c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines size_t bitcodeSize); 168c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines 169c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines bcc::RSCompilerDriver *mCompilerDriver; 170c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines#endif 171c202d2d64fe0172bcc3999b515a14d3d88532420Stephen Hines 172a883ce325281796dc7cc8fcf973a7ccd47a9a17eStephen Hines RootFunc_t mRoot; 173a883ce325281796dc7cc8fcf973a7ccd47a9a17eStephen Hines RootFunc_t mRootExpand; 1744464d825c11349068f2917f9ebee86b721423f3cStephen Hines InvokeFunc_t mInit; 1754464d825c11349068f2917f9ebee86b721423f3cStephen Hines InvokeFunc_t mFreeChildren; 1764464d825c11349068f2917f9ebee86b721423f3cStephen Hines ScriptExecutable* mScriptExec; 1774464d825c11349068f2917f9ebee86b721423f3cStephen Hines 178292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines Allocation **mBoundAllocs; 179292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines void * mIntrinsicData; 180292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines bool mIsThreadable; 181292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines}; 182292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 183292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen HinesAllocation * rsdScriptGetAllocationForPointer( 1844464d825c11349068f2917f9ebee86b721423f3cStephen Hines const Context *dc, 1854464d825c11349068f2917f9ebee86b721423f3cStephen Hines const Script *script, 186d0b5edd02be5f09c1d8d211f4a06b031a7b66510Stephen Hines const void *); 187292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 188292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 189292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 190292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines} 191292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 192292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines} 193292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines 194292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#endif 195292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines