rsCpuCore.h revision b7d9c80c98fc96aa7c638e3124be24f13a6436b2
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
26709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace bcc {
27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    class BCCContext;
28709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    class RSCompilerDriver;
29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    class RSExecutable;
30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
32709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
33709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
36709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* InvokeFunc_t)(void);
37709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* ForEachFunc_t)(void);
38709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
40709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptImpl;
41709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl;
42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
43709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct ScriptTLSStructRec {
44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    android::renderscript::Context * mContext;
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const android::renderscript::Script * mScript;
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl *mImpl;
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} ScriptTLSStruct;
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
49709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct {
50709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsForEachStubParamStruct fep;
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReferenceImpl *rsc;
53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl *script;
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ForEachFunc_t kernel;
56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t sig;
57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const Allocation * ain;
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Allocation * aout;
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t mSliceSize;
61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    volatile int mSliceNum;
62709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool isThreadable;
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t xStart;
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t xEnd;
66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t yStart;
67709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t yEnd;
68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t zStart;
69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t zEnd;
70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t arrayStart;
71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t arrayEnd;
72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} MTLaunchStruct;
73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
76709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
77709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl : public RsdCpuReference {
78709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual ~RsdCpuReferenceImpl();
80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReferenceImpl(Context *);
81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void lockMutex();
83709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void unlockMutex();
84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t);
86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void setPriority(int32_t priority);
87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void launchThreads(WorkerCallback_t cbk, void *data);
88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    static void * helperThreadProc(void *vrsc);
89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc);
90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context * getContext() {return mRSC;}
92c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams    uint32_t getThreadCount() const {
93c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams        return mWorkers.mCount + 1;
94c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams    }
95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void launchThreads(const Allocation * ain, Allocation * aout,
97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       const RsScriptCall *sc, MTLaunchStruct *mtls);
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScript * createScript(const ScriptC *s,
100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     char const *resName, char const *cacheDir,
101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint8_t const *bitcode, size_t bitcodeSize,
102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint32_t flags);
103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScript * createIntrinsic(const Script *s,
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        RsScriptIntrinsicID iid, Element *e);
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg);
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const RsdCpuReference::CpuSymbol *symLookup(const char *);
108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript * lookupScript(const Script *s) {
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return mScriptLookupFn(mRSC, s);
111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
113cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB
114f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    void setLinkRuntimeCallback(
115f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines            bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) {
116f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines        mLinkRuntimeCallback = pLinkRuntimeCallback;
117f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    }
118f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() {
119f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines        return mLinkRuntimeCallback;
120f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    }
1211d476620399d54774e4fd386c1d23cc583d49522Stephen Hines
1221d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) {
1231d476620399d54774e4fd386c1d23cc583d49522Stephen Hines        mSelectRTCallback = pSelectRTCallback;
1241d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    }
1251d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    RSSelectRTCallback getSelectRTCallback() {
1261d476620399d54774e4fd386c1d23cc583d49522Stephen Hines        return mSelectRTCallback;
1271d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    }
128b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines
129b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    virtual void setSetupCompilerCallback(
130b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines            RSSetupCompilerCallback pSetupCompilerCallback) {
131b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines        mSetupCompilerCallback = pSetupCompilerCallback;
132b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    }
133b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    virtual RSSetupCompilerCallback getSetupCompilerCallback() const {
134b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines        return mSetupCompilerCallback;
135b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    }
136cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif
137f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    virtual bool getInForEach() { return mInForEach; }
138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
139709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *mRSC;
141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t version_major;
142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t version_minor;
143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //bool mHasGraphics;
144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool mInForEach;
145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    struct Workers {
147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        volatile int mRunningCount;
148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        volatile int mLaunchCount;
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        uint32_t mCount;
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        pthread_t *mThreadId;
151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        pid_t *mNativeThreadId;
152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Signal mCompleteSignal;
153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Signal *mLaunchSignals;
154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        WorkerCallback_t mLaunchCallback;
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        void *mLaunchData;
156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    };
157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Workers mWorkers;
158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool mExit;
159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    sym_lookup_t mSymLookupFn;
160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script_lookup_t mScriptLookupFn;
161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ScriptTLSStruct mTlsStruct;
163f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines
164cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB
165f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    bcc::RSLinkRuntimeCallback mLinkRuntimeCallback;
1661d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    RSSelectRTCallback mSelectRTCallback;
167b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines    RSSetupCompilerCallback mSetupCompilerCallback;
168cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif
169709a0978ae141198018ca9769f8d96292a8928e6Jason Sams};
170709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
171709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
173709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
174709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
175709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif
176