rsCpuScript.h revision 45e753a46e587c69b3b0d0c5138e88715a24a29a
1/*
2 * Copyright (C) 2011-2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef RSD_BCC_H
18#define RSD_BCC_H
19
20#include <rs_hal.h>
21#include <rsRuntime.h>
22
23#ifndef RS_COMPATIBILITY_LIB
24#include <vector>
25#include <utility>
26#endif
27
28#include "rsCpuCore.h"
29
30namespace bcc {
31    class BCCContext;
32    class RSCompilerDriver;
33}
34
35namespace bcinfo {
36    class MetadataExtractor;
37}
38
39namespace android {
40namespace renderscript {
41
42
43
44class RsdCpuScriptImpl : public RsdCpuReferenceImpl::CpuScript {
45public:
46    typedef void (*outer_foreach_t)(
47        const RsExpandKernelParams *,
48        uint32_t x1, uint32_t x2,
49        uint32_t outstep);
50
51    typedef void (* InvokeFunc_t)(void);
52    typedef void (* ForEachFunc_t)(void);
53    typedef int (* RootFunc_t)(void);
54#ifdef RS_COMPATIBILITY_LIB
55    typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
56#endif
57
58    bool init(char const *resName, char const *cacheDir,
59              uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags,
60              char const *bccPluginName = nullptr);
61    virtual void populateScript(Script *);
62
63    virtual void invokeFunction(uint32_t slot, const void *params, size_t paramLength);
64    virtual int invokeRoot();
65    virtual void preLaunch(uint32_t slot, const Allocation ** ains,
66                           uint32_t inLen, Allocation * aout, const void * usr,
67                           uint32_t usrLen, const RsScriptCall *sc);
68    virtual void postLaunch(uint32_t slot, const Allocation ** ains,
69                            uint32_t inLen, Allocation * aout,
70                            const void * usr, uint32_t usrLen,
71                            const RsScriptCall *sc);
72
73    virtual void invokeForEach(uint32_t slot,
74                               const Allocation ** ains,
75                               uint32_t inLen,
76                               Allocation* aout,
77                               const void* usr,
78                               uint32_t usrLen,
79                               const RsScriptCall* sc);
80
81    virtual void invokeInit();
82    virtual void invokeFreeChildren();
83
84    virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength);
85    virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength);
86    virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
87                                  const Element *e, const uint32_t *dims, size_t dimLength);
88    virtual void setGlobalBind(uint32_t slot, Allocation *data);
89    virtual void setGlobalObj(uint32_t slot, ObjectBase *data);
90
91
92    virtual ~RsdCpuScriptImpl();
93    RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s);
94
95    const Script * getScript() {return mScript;}
96
97    void forEachMtlsSetup(const Allocation ** ains, uint32_t inLen,
98                          Allocation * aout, const void * usr, uint32_t usrLen,
99                          const RsScriptCall *sc, MTLaunchStruct *mtls);
100
101    virtual void forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls);
102
103
104    const RsdCpuReference::CpuSymbol * lookupSymbolMath(const char *sym);
105    static void * lookupRuntimeStub(void* pContext, char const* name);
106
107    virtual Allocation * getAllocationForPointer(const void *ptr) const;
108    bool storeRSInfoFromSO();
109
110protected:
111    RsdCpuReferenceImpl *mCtx;
112    const Script *mScript;
113    void *mScriptSO;
114
115#ifndef RS_COMPATIBILITY_LIB
116    // Returns the path to the core library we'll use.
117    const char* findCoreLib(const bcinfo::MetadataExtractor& bitCodeMetaData, const char* bitcode,
118                            size_t bitcodeSize);
119
120    bcc::RSCompilerDriver *mCompilerDriver;
121#endif
122
123    RootFunc_t mRoot;
124    RootFunc_t mRootExpand;
125    InvokeFunc_t mInit;
126    InvokeFunc_t mFreeChildren;
127    InvokeFunc_t *mInvokeFunctions;
128    ForEachFunc_t *mForEachFunctions;
129
130    void **mFieldAddress;
131    bool *mFieldIsObject;
132    uint32_t *mForEachSignatures;
133
134    size_t mExportedVariableCount;
135    size_t mExportedFunctionCount;
136
137    Allocation **mBoundAllocs;
138    void * mIntrinsicData;
139    bool mIsThreadable;
140};
141
142Allocation * rsdScriptGetAllocationForPointer(
143                        const Context *dc,
144                        const Script *script,
145                        const void *);
146
147
148
149}
150}
151
152#endif
153