rsCpuCore.h revision f5ef8df639ba6363aa5d546e57ce872d04144cb6
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
35f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Samsextern bool gArchUseSIMD;
36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
37709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* InvokeFunc_t)(void);
38709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* ForEachFunc_t)(void);
39709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
41709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptImpl;
42709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl;
43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
44709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct ScriptTLSStructRec {
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    android::renderscript::Context * mContext;
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const android::renderscript::Script * mScript;
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl *mImpl;
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} ScriptTLSStruct;
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
50709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct {
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsForEachStubParamStruct fep;
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReferenceImpl *rsc;
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl *script;
55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ForEachFunc_t kernel;
57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t sig;
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const Allocation * ain;
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Allocation * aout;
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t mSliceSize;
62709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    volatile int mSliceNum;
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool isThreadable;
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t xStart;
66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t xEnd;
67709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t yStart;
68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t yEnd;
69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t zStart;
70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t zEnd;
71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t arrayStart;
72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t arrayEnd;
73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} MTLaunchStruct;
74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
76709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
77709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
78709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl : public RsdCpuReference {
79709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual ~RsdCpuReferenceImpl();
81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReferenceImpl(Context *);
82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
83709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void lockMutex();
84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void unlockMutex();
85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t);
87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void setPriority(int32_t priority);
88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void launchThreads(WorkerCallback_t cbk, void *data);
89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    static void * helperThreadProc(void *vrsc);
90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc);
91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context * getContext() {return mRSC;}
93c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams    uint32_t getThreadCount() const {
94c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams        return mWorkers.mCount + 1;
95c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams    }
96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void launchThreads(const Allocation * ain, Allocation * aout,
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       const RsScriptCall *sc, MTLaunchStruct *mtls);
99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScript * createScript(const ScriptC *s,
101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     char const *resName, char const *cacheDir,
102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint8_t const *bitcode, size_t bitcodeSize,
103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint32_t flags);
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScript * createIntrinsic(const Script *s,
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        RsScriptIntrinsicID iid, Element *e);
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg);
107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const RsdCpuReference::CpuSymbol *symLookup(const char *);
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuReference::CpuScript * lookupScript(const Script *s) {
111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return mScriptLookupFn(mRSC, s);
112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
114cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB
115f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    void setLinkRuntimeCallback(
116f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines            bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) {
117f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines        mLinkRuntimeCallback = pLinkRuntimeCallback;
118f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    }
119f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() {
120f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines        return mLinkRuntimeCallback;
121f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    }
1221d476620399d54774e4fd386c1d23cc583d49522Stephen Hines
1231d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) {
1241d476620399d54774e4fd386c1d23cc583d49522Stephen Hines        mSelectRTCallback = pSelectRTCallback;
1251d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    }
1261d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    RSSelectRTCallback getSelectRTCallback() {
1271d476620399d54774e4fd386c1d23cc583d49522Stephen Hines        return mSelectRTCallback;
1281d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    }
129cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif
130f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    virtual bool getInForEach() { return mInForEach; }
131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
132709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Context *mRSC;
134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t version_major;
135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t version_minor;
136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //bool mHasGraphics;
137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool mInForEach;
138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
139709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    struct Workers {
140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        volatile int mRunningCount;
141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        volatile int mLaunchCount;
142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        uint32_t mCount;
143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        pthread_t *mThreadId;
144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        pid_t *mNativeThreadId;
145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Signal mCompleteSignal;
146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Signal *mLaunchSignals;
147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        WorkerCallback_t mLaunchCallback;
148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        void *mLaunchData;
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    };
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    Workers mWorkers;
151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bool mExit;
152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    sym_lookup_t mSymLookupFn;
153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script_lookup_t mScriptLookupFn;
154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ScriptTLSStruct mTlsStruct;
156f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines
157cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB
158f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines    bcc::RSLinkRuntimeCallback mLinkRuntimeCallback;
1591d476620399d54774e4fd386c1d23cc583d49522Stephen Hines    RSSelectRTCallback mSelectRTCallback;
160cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif
161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams};
162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
163709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
165709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
166709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif
168