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