1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2012 The Android Open Source Project
3709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
4709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * you may not use this file except in compliance with the License.
6709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * You may obtain a copy of the License at
7709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
8709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
10709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Unless required by applicable law or agreed to in writing, software
11709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * See the License for the specific language governing permissions and
14709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * limitations under the License.
15709a0978ae141198018ca9769f8d96292a8928e6Jason Sams */
16709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#ifndef RSD_CPU_CORE_H
18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#define RSD_CPU_CORE_H
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
20709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsd_cpu.h"
21709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsSignal.h"
22709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsContext.h"
23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsElement.h"
24709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsScriptC.h"
25709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
26005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines#include <string>
27005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines
28709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace bcc {
29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    class BCCContext;
30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    class RSCompilerDriver;
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    class RSExecutable;
32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
34709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
35709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
37cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailestypedef struct {
384b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes  uint32_t eStride;
394b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes  uint32_t yStride;
404b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes} StridePair;
414b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
424b3c34e6833e39bc89c2128002806b654b8e623dChris Wailestypedef struct {
43cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    const void *in;
44cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    void *out;
45cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    const void *usr;
46cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t usrLen;
47cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t x;
48cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t y;
49cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t z;
50cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t lod;
51cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    RsAllocationCubemapFace face;
52cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t ar[16];
534b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
544b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    const void **ins;
554b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    uint32_t *eStrideIns;
564b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
57cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t lid;
58cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes
59cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t dimX;
60cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t dimY;
61cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t dimZ;
62cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t dimArray;
63cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes
64cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    const uint8_t *ptrIn;
65cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint8_t *ptrOut;
66cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t eStrideIn;
67cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t eStrideOut;
68cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t yStrideIn;
69cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t yStrideOut;
70cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes    uint32_t slot;
714b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
724b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    const uint8_t** ptrIns;
734b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    StridePair* inStrides;
74cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes} RsForEachStubParamStruct;
75cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes
76f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Samsextern bool gArchUseSIMD;
77709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
78709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* InvokeFunc_t)(void);
79709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* ForEachFunc_t)(void);
80709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
82709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptImpl;
83709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl;
84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
85709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct ScriptTLSStructRec {
86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    android::renderscript::Context * mContext;
87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const android::renderscript::Script * mScript;
88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl *mImpl;
89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} ScriptTLSStruct;
90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
91709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct {
92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsForEachStubParamStruct fep;
93709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
94709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReferenceImpl *rsc;
95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl *script;
96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ForEachFunc_t kernel;
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t sig;
99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const Allocation * ain;
100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Allocation * aout;
101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t mSliceSize;
103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    volatile int mSliceNum;
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool isThreadable;
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t xStart;
107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t xEnd;
108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t yStart;
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t yEnd;
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t zStart;
111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t zEnd;
112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t arrayStart;
113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t arrayEnd;
1144b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
1154b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    // Multi-input data.
1164b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    const Allocation ** ains;
117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} MTLaunchStruct;
118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
119709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
122709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl : public RsdCpuReference {
123709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
124709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual ~RsdCpuReferenceImpl();
125709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReferenceImpl(Context *);
126709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
127709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void lockMutex();
128709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void unlockMutex();
129709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t);
131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void setPriority(int32_t priority);
132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void launchThreads(WorkerCallback_t cbk, void *data);
133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    static void * helperThreadProc(void *vrsc);
134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc);
135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context * getContext() {return mRSC;}
137c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams    uint32_t getThreadCount() const {
138c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams        return mWorkers.mCount + 1;
139c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams    }
140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void launchThreads(const Allocation * ain, Allocation * aout,
142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       const RsScriptCall *sc, MTLaunchStruct *mtls);
143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
1444b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    void launchThreads(const Allocation** ains, uint32_t inLen, Allocation* aout,
1454b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                       const RsScriptCall* sc, MTLaunchStruct* mtls);
1464b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScript * createScript(const ScriptC *s,
148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     char const *resName, char const *cacheDir,
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint8_t const *bitcode, size_t bitcodeSize,
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint32_t flags);
151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScript * createIntrinsic(const Script *s,
152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        RsScriptIntrinsicID iid, Element *e);
153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg);
154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const RsdCpuReference::CpuSymbol *symLookup(const char *);
156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript * lookupScript(const Script *s) {
158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return mScriptLookupFn(mRSC, s);
159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
161cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB
162f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    void setLinkRuntimeCallback(
163f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines            bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) {
164f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines        mLinkRuntimeCallback = pLinkRuntimeCallback;
165f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    }
166f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() {
167f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines        return mLinkRuntimeCallback;
168f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    }
1691d476620399d54774e4fd386c1d23cc583d49522Stephen Hines
1701d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) {
1711d476620399d54774e4fd386c1d23cc583d49522Stephen Hines        mSelectRTCallback = pSelectRTCallback;
1721d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    }
1731d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    RSSelectRTCallback getSelectRTCallback() {
1741d476620399d54774e4fd386c1d23cc583d49522Stephen Hines        return mSelectRTCallback;
1751d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    }
176b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines
177b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    virtual void setSetupCompilerCallback(
178b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines            RSSetupCompilerCallback pSetupCompilerCallback) {
179b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines        mSetupCompilerCallback = pSetupCompilerCallback;
180b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    }
181b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    virtual RSSetupCompilerCallback getSetupCompilerCallback() const {
182b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines        return mSetupCompilerCallback;
183b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    }
184005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines
185005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines    virtual void setBccPluginName(const char *name) {
186005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines        mBccPluginName.assign(name);
187005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines    }
188005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines    virtual const char *getBccPluginName() const {
189005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines        return mBccPluginName.c_str();
190005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines    }
191cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif
192f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    virtual bool getInForEach() { return mInForEach; }
193709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
194709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
195709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *mRSC;
196709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t version_major;
197709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t version_minor;
198709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //bool mHasGraphics;
199709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool mInForEach;
200709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
201709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    struct Workers {
202709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        volatile int mRunningCount;
203709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        volatile int mLaunchCount;
204709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        uint32_t mCount;
205709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        pthread_t *mThreadId;
206709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        pid_t *mNativeThreadId;
207709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Signal mCompleteSignal;
208709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Signal *mLaunchSignals;
209709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        WorkerCallback_t mLaunchCallback;
210709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        void *mLaunchData;
211709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    };
212709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Workers mWorkers;
213709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool mExit;
214709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    sym_lookup_t mSymLookupFn;
215709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script_lookup_t mScriptLookupFn;
216709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
217709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ScriptTLSStruct mTlsStruct;
218f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines
219cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB
220f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    bcc::RSLinkRuntimeCallback mLinkRuntimeCallback;
2211d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    RSSelectRTCallback mSelectRTCallback;
222b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    RSSetupCompilerCallback mSetupCompilerCallback;
223005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines    std::string mBccPluginName;
224cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif
225709a0978ae141198018ca9769f8d96292a8928e6Jason Sams};
226709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
227709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
228709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
229709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif
232