rsCpuCore.h revision c44d6706868749abe37780fc28b2cc627ddcf269
185ec0d676297724f211213c7cb188839f1d3601bSteve McKay/*
285ec0d676297724f211213c7cb188839f1d3601bSteve McKay * Copyright (C) 2012 The Android Open Source Project
385ec0d676297724f211213c7cb188839f1d3601bSteve McKay *
485ec0d676297724f211213c7cb188839f1d3601bSteve McKay * Licensed under the Apache License, Version 2.0 (the "License");
585ec0d676297724f211213c7cb188839f1d3601bSteve McKay * you may not use this file except in compliance with the License.
685ec0d676297724f211213c7cb188839f1d3601bSteve McKay * You may obtain a copy of the License at
785ec0d676297724f211213c7cb188839f1d3601bSteve McKay *
885ec0d676297724f211213c7cb188839f1d3601bSteve McKay *      http://www.apache.org/licenses/LICENSE-2.0
985ec0d676297724f211213c7cb188839f1d3601bSteve McKay *
1085ec0d676297724f211213c7cb188839f1d3601bSteve McKay * Unless required by applicable law or agreed to in writing, software
1185ec0d676297724f211213c7cb188839f1d3601bSteve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1285ec0d676297724f211213c7cb188839f1d3601bSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385ec0d676297724f211213c7cb188839f1d3601bSteve McKay * See the License for the specific language governing permissions and
1485ec0d676297724f211213c7cb188839f1d3601bSteve McKay * limitations under the License.
1585ec0d676297724f211213c7cb188839f1d3601bSteve McKay */
1685ec0d676297724f211213c7cb188839f1d3601bSteve McKay
17ae84a18a1fa5dc020fd25a963cb0955c8c31bfefSteve McKay#ifndef RSD_CPU_CORE_H
1885ec0d676297724f211213c7cb188839f1d3601bSteve McKay#define RSD_CPU_CORE_H
1985ec0d676297724f211213c7cb188839f1d3601bSteve McKay
2085ec0d676297724f211213c7cb188839f1d3601bSteve McKay#include "rsd_cpu.h"
2185ec0d676297724f211213c7cb188839f1d3601bSteve McKay#include "rsSignal.h"
2285ec0d676297724f211213c7cb188839f1d3601bSteve McKay#include "rsContext.h"
238ff27d68c04b96f89076675de17cc268c433d5dcGarfield Tan#include "rsElement.h"
248ff27d68c04b96f89076675de17cc268c433d5dcGarfield Tan#include "rsScriptC.h"
2585ec0d676297724f211213c7cb188839f1d3601bSteve McKay
2685ec0d676297724f211213c7cb188839f1d3601bSteve McKaynamespace bcc {
2785ec0d676297724f211213c7cb188839f1d3601bSteve McKay    class BCCContext;
2885ec0d676297724f211213c7cb188839f1d3601bSteve McKay    class RSCompilerDriver;
29b6006b2ef723fdbb3fef3b4a350c8d363b127d0fSteve McKay    class RSExecutable;
3016e0c1fcf2be1ac7daafa6cb2c1c97d751ca3e66Steve McKay}
3185ec0d676297724f211213c7cb188839f1d3601bSteve McKay
3285ec0d676297724f211213c7cb188839f1d3601bSteve McKaynamespace android {
33b6006b2ef723fdbb3fef3b4a350c8d363b127d0fSteve McKaynamespace renderscript {
3485ec0d676297724f211213c7cb188839f1d3601bSteve McKay
3585ec0d676297724f211213c7cb188839f1d3601bSteve McKay
36b6006b2ef723fdbb3fef3b4a350c8d363b127d0fSteve McKaytypedef void (* InvokeFunc_t)(void);
3785ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef void (* ForEachFunc_t)(void);
3885ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
3985ec0d676297724f211213c7cb188839f1d3601bSteve McKay
4085ec0d676297724f211213c7cb188839f1d3601bSteve McKayclass RsdCpuScriptImpl;
4185ec0d676297724f211213c7cb188839f1d3601bSteve McKayclass RsdCpuReferenceImpl;
4285ec0d676297724f211213c7cb188839f1d3601bSteve McKay
4385ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef struct ScriptTLSStructRec {
4485ec0d676297724f211213c7cb188839f1d3601bSteve McKay    android::renderscript::Context * mContext;
4585ec0d676297724f211213c7cb188839f1d3601bSteve McKay    const android::renderscript::Script * mScript;
4685ec0d676297724f211213c7cb188839f1d3601bSteve McKay    RsdCpuScriptImpl *mImpl;
4785ec0d676297724f211213c7cb188839f1d3601bSteve McKay} ScriptTLSStruct;
4885ec0d676297724f211213c7cb188839f1d3601bSteve McKay
4985ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef struct {
5085ec0d676297724f211213c7cb188839f1d3601bSteve McKay    RsForEachStubParamStruct fep;
5185ec0d676297724f211213c7cb188839f1d3601bSteve McKay
5285ec0d676297724f211213c7cb188839f1d3601bSteve McKay    RsdCpuReferenceImpl *rsc;
5385ec0d676297724f211213c7cb188839f1d3601bSteve McKay    RsdCpuScriptImpl *script;
5485ec0d676297724f211213c7cb188839f1d3601bSteve McKay
5585ec0d676297724f211213c7cb188839f1d3601bSteve McKay    ForEachFunc_t kernel;
5685ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t sig;
5785ec0d676297724f211213c7cb188839f1d3601bSteve McKay    const Allocation * ain;
5885ec0d676297724f211213c7cb188839f1d3601bSteve McKay    Allocation * aout;
5985ec0d676297724f211213c7cb188839f1d3601bSteve McKay
6085ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t mSliceSize;
6185ec0d676297724f211213c7cb188839f1d3601bSteve McKay    volatile int mSliceNum;
6285ec0d676297724f211213c7cb188839f1d3601bSteve McKay    bool isThreadable;
6385ec0d676297724f211213c7cb188839f1d3601bSteve McKay
6485ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t xStart;
6585ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t xEnd;
6685ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t yStart;
6785ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t yEnd;
6885ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t zStart;
6985ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t zEnd;
7085ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t arrayStart;
7185ec0d676297724f211213c7cb188839f1d3601bSteve McKay    uint32_t arrayEnd;
7285ec0d676297724f211213c7cb188839f1d3601bSteve McKay} MTLaunchStruct;
7385ec0d676297724f211213c7cb188839f1d3601bSteve McKay
74
75
76
77class RsdCpuReferenceImpl : public RsdCpuReference {
78public:
79    virtual ~RsdCpuReferenceImpl();
80    RsdCpuReferenceImpl(Context *);
81
82    void lockMutex();
83    void unlockMutex();
84
85    bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t);
86    virtual void setPriority(int32_t priority);
87    virtual void launchThreads(WorkerCallback_t cbk, void *data);
88    static void * helperThreadProc(void *vrsc);
89    RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc);
90
91    Context * getContext() {return mRSC;}
92    uint32_t getThreadCount() const {
93        return mWorkers.mCount + 1;
94    }
95
96    void launchThreads(const Allocation * ain, Allocation * aout,
97                       const RsScriptCall *sc, MTLaunchStruct *mtls);
98
99    virtual CpuScript * createScript(const ScriptC *s,
100                                     char const *resName, char const *cacheDir,
101                                     uint8_t const *bitcode, size_t bitcodeSize,
102                                     uint32_t flags);
103    virtual CpuScript * createIntrinsic(const Script *s,
104                                        RsScriptIntrinsicID iid, Element *e);
105    virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg);
106
107    const RsdCpuReference::CpuSymbol *symLookup(const char *);
108
109    RsdCpuReference::CpuScript * lookupScript(const Script *s) {
110        return mScriptLookupFn(mRSC, s);
111    }
112
113
114protected:
115    Context *mRSC;
116    uint32_t version_major;
117    uint32_t version_minor;
118    //bool mHasGraphics;
119    bool mInForEach;
120
121    struct Workers {
122        volatile int mRunningCount;
123        volatile int mLaunchCount;
124        uint32_t mCount;
125        pthread_t *mThreadId;
126        pid_t *mNativeThreadId;
127        Signal mCompleteSignal;
128        Signal *mLaunchSignals;
129        WorkerCallback_t mLaunchCallback;
130        void *mLaunchData;
131    };
132    Workers mWorkers;
133    bool mExit;
134    sym_lookup_t mSymLookupFn;
135    script_lookup_t mScriptLookupFn;
136
137    ScriptTLSStruct mTlsStruct;
138};
139
140
141}
142}
143
144#endif
145