1*e1eccf28SAndroid Build Coastguard Worker /* 2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project 3*e1eccf28SAndroid Build Coastguard Worker * 4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e1eccf28SAndroid Build Coastguard Worker * 8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e1eccf28SAndroid Build Coastguard Worker * 10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License. 15*e1eccf28SAndroid Build Coastguard Worker */ 16*e1eccf28SAndroid Build Coastguard Worker 17*e1eccf28SAndroid Build Coastguard Worker #ifndef RSD_CPU_H 18*e1eccf28SAndroid Build Coastguard Worker #define RSD_CPU_H 19*e1eccf28SAndroid Build Coastguard Worker 20*e1eccf28SAndroid Build Coastguard Worker #include "rsInternalDefines.h" 21*e1eccf28SAndroid Build Coastguard Worker 22*e1eccf28SAndroid Build Coastguard Worker typedef const char* (*RSSelectRTCallback) (const char*, size_t); 23*e1eccf28SAndroid Build Coastguard Worker 24*e1eccf28SAndroid Build Coastguard Worker namespace android { 25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript { 26*e1eccf28SAndroid Build Coastguard Worker 27*e1eccf28SAndroid Build Coastguard Worker class Allocation; 28*e1eccf28SAndroid Build Coastguard Worker class Context; 29*e1eccf28SAndroid Build Coastguard Worker class Element; 30*e1eccf28SAndroid Build Coastguard Worker class ObjectBase; 31*e1eccf28SAndroid Build Coastguard Worker class ScriptC; 32*e1eccf28SAndroid Build Coastguard Worker class Script; 33*e1eccf28SAndroid Build Coastguard Worker class ScriptGroupBase; 34*e1eccf28SAndroid Build Coastguard Worker class ScriptKernelID; 35*e1eccf28SAndroid Build Coastguard Worker 36*e1eccf28SAndroid Build Coastguard Worker class RsdCpuReference { 37*e1eccf28SAndroid Build Coastguard Worker public: 38*e1eccf28SAndroid Build Coastguard Worker struct CpuSymbol { 39*e1eccf28SAndroid Build Coastguard Worker const char * name; 40*e1eccf28SAndroid Build Coastguard Worker void * fnPtr; 41*e1eccf28SAndroid Build Coastguard Worker bool threadable; 42*e1eccf28SAndroid Build Coastguard Worker }; 43*e1eccf28SAndroid Build Coastguard Worker 44*e1eccf28SAndroid Build Coastguard Worker typedef const CpuSymbol * (* sym_lookup_t)(Context *, const char *name); 45*e1eccf28SAndroid Build Coastguard Worker 46*e1eccf28SAndroid Build Coastguard Worker struct CpuTls { 47*e1eccf28SAndroid Build Coastguard Worker Context *rsc; 48*e1eccf28SAndroid Build Coastguard Worker const ScriptC * sc; 49*e1eccf28SAndroid Build Coastguard Worker }; 50*e1eccf28SAndroid Build Coastguard Worker 51*e1eccf28SAndroid Build Coastguard Worker class CpuScript { 52*e1eccf28SAndroid Build Coastguard Worker public: 53*e1eccf28SAndroid Build Coastguard Worker virtual void populateScript(Script *) = 0; 54*e1eccf28SAndroid Build Coastguard Worker virtual void invokeFunction(uint32_t slot, const void *params, size_t paramLength) = 0; 55*e1eccf28SAndroid Build Coastguard Worker virtual int invokeRoot() = 0; 56*e1eccf28SAndroid Build Coastguard Worker 57*e1eccf28SAndroid Build Coastguard Worker virtual void invokeForEach(uint32_t slot, 58*e1eccf28SAndroid Build Coastguard Worker const Allocation ** ains, 59*e1eccf28SAndroid Build Coastguard Worker uint32_t inLen, 60*e1eccf28SAndroid Build Coastguard Worker Allocation * aout, 61*e1eccf28SAndroid Build Coastguard Worker const void * usr, 62*e1eccf28SAndroid Build Coastguard Worker uint32_t usrLen, 63*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall *sc) = 0; 64*e1eccf28SAndroid Build Coastguard Worker 65*e1eccf28SAndroid Build Coastguard Worker virtual void invokeReduce(uint32_t slot, 66*e1eccf28SAndroid Build Coastguard Worker const Allocation ** ains, uint32_t inLen, 67*e1eccf28SAndroid Build Coastguard Worker Allocation *aout, 68*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall *sc) = 0; 69*e1eccf28SAndroid Build Coastguard Worker 70*e1eccf28SAndroid Build Coastguard Worker virtual void invokeInit() = 0; 71*e1eccf28SAndroid Build Coastguard Worker virtual void invokeFreeChildren() = 0; 72*e1eccf28SAndroid Build Coastguard Worker 73*e1eccf28SAndroid Build Coastguard Worker virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength) = 0; 74*e1eccf28SAndroid Build Coastguard Worker virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength) = 0; 75*e1eccf28SAndroid Build Coastguard Worker virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, 76*e1eccf28SAndroid Build Coastguard Worker const Element *e, const uint32_t *dims, size_t dimLength) = 0; 77*e1eccf28SAndroid Build Coastguard Worker virtual void setGlobalBind(uint32_t slot, Allocation *data) = 0; 78*e1eccf28SAndroid Build Coastguard Worker virtual void setGlobalObj(uint32_t slot, ObjectBase *obj) = 0; 79*e1eccf28SAndroid Build Coastguard Worker 80*e1eccf28SAndroid Build Coastguard Worker virtual Allocation * getAllocationForPointer(const void *ptr) const = 0; 81*e1eccf28SAndroid Build Coastguard Worker 82*e1eccf28SAndroid Build Coastguard Worker // Returns number of global variables in this Script (may be 0 if 83*e1eccf28SAndroid Build Coastguard Worker // compiler is not configured to emit this information). 84*e1eccf28SAndroid Build Coastguard Worker virtual int getGlobalEntries() const = 0; 85*e1eccf28SAndroid Build Coastguard Worker // Returns the name of the global variable at index i. 86*e1eccf28SAndroid Build Coastguard Worker virtual const char * getGlobalName(int i) const = 0; 87*e1eccf28SAndroid Build Coastguard Worker // Returns the CPU address of the global variable at index i. 88*e1eccf28SAndroid Build Coastguard Worker virtual const void * getGlobalAddress(int i) const = 0; 89*e1eccf28SAndroid Build Coastguard Worker // Returns the size (in bytes) of the global variable at index i. 90*e1eccf28SAndroid Build Coastguard Worker virtual size_t getGlobalSize(int i) const = 0; 91*e1eccf28SAndroid Build Coastguard Worker // Returns the properties of the global variable at index i. 92*e1eccf28SAndroid Build Coastguard Worker virtual uint32_t getGlobalProperties(int i) const = 0; 93*e1eccf28SAndroid Build Coastguard Worker ~CpuScript()94*e1eccf28SAndroid Build Coastguard Worker virtual ~CpuScript() {} 95*e1eccf28SAndroid Build Coastguard Worker }; 96*e1eccf28SAndroid Build Coastguard Worker typedef CpuScript * (* script_lookup_t)(Context *, const Script *s); 97*e1eccf28SAndroid Build Coastguard Worker 98*e1eccf28SAndroid Build Coastguard Worker class CpuScriptGroupBase { 99*e1eccf28SAndroid Build Coastguard Worker public: 100*e1eccf28SAndroid Build Coastguard Worker virtual void execute() = 0; ~CpuScriptGroupBase()101*e1eccf28SAndroid Build Coastguard Worker virtual ~CpuScriptGroupBase() {} 102*e1eccf28SAndroid Build Coastguard Worker }; 103*e1eccf28SAndroid Build Coastguard Worker 104*e1eccf28SAndroid Build Coastguard Worker class CpuScriptGroup : public CpuScriptGroupBase { 105*e1eccf28SAndroid Build Coastguard Worker public: 106*e1eccf28SAndroid Build Coastguard Worker virtual void setInput(const ScriptKernelID *kid, Allocation *) = 0; 107*e1eccf28SAndroid Build Coastguard Worker virtual void setOutput(const ScriptKernelID *kid, Allocation *) = 0; ~CpuScriptGroup()108*e1eccf28SAndroid Build Coastguard Worker ~CpuScriptGroup() override {}; 109*e1eccf28SAndroid Build Coastguard Worker }; 110*e1eccf28SAndroid Build Coastguard Worker 111*e1eccf28SAndroid Build Coastguard Worker class CpuScriptGroup2 : public CpuScriptGroupBase { 112*e1eccf28SAndroid Build Coastguard Worker public: ~CpuScriptGroup2()113*e1eccf28SAndroid Build Coastguard Worker ~CpuScriptGroup2() override {} 114*e1eccf28SAndroid Build Coastguard Worker }; 115*e1eccf28SAndroid Build Coastguard Worker 116*e1eccf28SAndroid Build Coastguard Worker static Context * getTlsContext(); 117*e1eccf28SAndroid Build Coastguard Worker static const Script * getTlsScript(); 118*e1eccf28SAndroid Build Coastguard Worker static pthread_key_t getThreadTLSKey(); 119*e1eccf28SAndroid Build Coastguard Worker 120*e1eccf28SAndroid Build Coastguard Worker static RsdCpuReference * create(Context *c, uint32_t version_major, 121*e1eccf28SAndroid Build Coastguard Worker uint32_t version_minor, sym_lookup_t lfn, script_lookup_t slfn 122*e1eccf28SAndroid Build Coastguard Worker , RSSelectRTCallback pSelectRTCallback = nullptr, 123*e1eccf28SAndroid Build Coastguard Worker const char *pBccPluginName = nullptr 124*e1eccf28SAndroid Build Coastguard Worker ); 125*e1eccf28SAndroid Build Coastguard Worker virtual ~RsdCpuReference(); 126*e1eccf28SAndroid Build Coastguard Worker virtual void setPriority(int32_t priority) = 0; 127*e1eccf28SAndroid Build Coastguard Worker 128*e1eccf28SAndroid Build Coastguard Worker virtual CpuScript * createScript(const ScriptC *s, char const *resName, char const *cacheDir, 129*e1eccf28SAndroid Build Coastguard Worker uint8_t const *bitcode, size_t bitcodeSize, 130*e1eccf28SAndroid Build Coastguard Worker uint32_t flags) = 0; 131*e1eccf28SAndroid Build Coastguard Worker virtual CpuScript * createIntrinsic(const Script *s, RsScriptIntrinsicID iid, Element *e) = 0; 132*e1eccf28SAndroid Build Coastguard Worker virtual void* createScriptGroup(const ScriptGroupBase *sg) = 0; 133*e1eccf28SAndroid Build Coastguard Worker virtual bool getInKernel() = 0; // Is a parallel kernel execution underway? 134*e1eccf28SAndroid Build Coastguard Worker 135*e1eccf28SAndroid Build Coastguard Worker // Set to true if we should embed global variable information in the code. 136*e1eccf28SAndroid Build Coastguard Worker virtual void setEmbedGlobalInfo(bool v) = 0; 137*e1eccf28SAndroid Build Coastguard Worker 138*e1eccf28SAndroid Build Coastguard Worker // Returns true if we should embed global variable information in the code. 139*e1eccf28SAndroid Build Coastguard Worker virtual bool getEmbedGlobalInfo() const = 0; 140*e1eccf28SAndroid Build Coastguard Worker 141*e1eccf28SAndroid Build Coastguard Worker // Set to true if we should skip constant (immutable) global variables when 142*e1eccf28SAndroid Build Coastguard Worker // potentially embedding information about globals. 143*e1eccf28SAndroid Build Coastguard Worker virtual void setEmbedGlobalInfoSkipConstant(bool v) = 0; 144*e1eccf28SAndroid Build Coastguard Worker 145*e1eccf28SAndroid Build Coastguard Worker // Returns true if we should skip constant (immutable) global variables when 146*e1eccf28SAndroid Build Coastguard Worker // potentially embedding information about globals. 147*e1eccf28SAndroid Build Coastguard Worker virtual bool getEmbedGlobalInfoSkipConstant() const = 0; 148*e1eccf28SAndroid Build Coastguard Worker }; 149*e1eccf28SAndroid Build Coastguard Worker 150*e1eccf28SAndroid Build Coastguard Worker 151*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript 152*e1eccf28SAndroid Build Coastguard Worker } // namespace android 153*e1eccf28SAndroid Build Coastguard Worker 154*e1eccf28SAndroid Build Coastguard Worker #endif 155