Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2011 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 ANDROID_RS_CONTEXT_H
     18 #define ANDROID_RS_CONTEXT_H
     19 
     20 #include "rsUtils.h"
     21 #include "rs_hal.h"
     22 
     23 #include "rsThreadIO.h"
     24 #include "rsScriptC.h"
     25 #include "rsSampler.h"
     26 #include "rsFont.h"
     27 #include "rsPath.h"
     28 #include "rsProgramFragment.h"
     29 #include "rsProgramStore.h"
     30 #include "rsProgramRaster.h"
     31 #include "rsProgramVertex.h"
     32 #include "rsFBOCache.h"
     33 
     34 // ---------------------------------------------------------------------------
     35 namespace android {
     36 
     37 namespace renderscript {
     38 
     39 class Device;
     40 
     41 #if 0
     42 #define CHECK_OBJ(o) { \
     43     GET_TLS(); \
     44     if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
     45         ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
     46     } \
     47 }
     48 #define CHECK_OBJ_OR_NULL(o) { \
     49     GET_TLS(); \
     50     if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
     51         ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
     52     } \
     53 }
     54 #else
     55 #define CHECK_OBJ(o)
     56 #define CHECK_OBJ_OR_NULL(o)
     57 #endif
     58 
     59 class Context {
     60 public:
     61     struct Hal {
     62         void * drv;
     63 
     64         RsdHalFunctions funcs;
     65     };
     66     Hal mHal;
     67 
     68     static Context * createContext(Device *, const RsSurfaceConfig *sc);
     69     static Context * createContextLite();
     70     ~Context();
     71 
     72     static pthread_mutex_t gInitMutex;
     73     // Library mutex (for providing thread-safe calls from the runtime)
     74     static pthread_mutex_t gLibMutex;
     75 
     76     class PushState {
     77     public:
     78         PushState(Context *);
     79         ~PushState();
     80 
     81     private:
     82         ObjectBaseRef<ProgramFragment> mFragment;
     83         ObjectBaseRef<ProgramVertex> mVertex;
     84         ObjectBaseRef<ProgramStore> mStore;
     85         ObjectBaseRef<ProgramRaster> mRaster;
     86         ObjectBaseRef<Font> mFont;
     87         Context *mRsc;
     88     };
     89 
     90     RsSurfaceConfig mUserSurfaceConfig;
     91 
     92     ElementState mStateElement;
     93     TypeState mStateType;
     94     SamplerState mStateSampler;
     95     ProgramFragmentState mStateFragment;
     96     ProgramStoreState mStateFragmentStore;
     97     ProgramRasterState mStateRaster;
     98     ProgramVertexState mStateVertex;
     99     FontState mStateFont;
    100 
    101     ScriptCState mScriptC;
    102     FBOCache mFBOCache;
    103 
    104     void swapBuffers();
    105     void setRootScript(Script *);
    106     void setProgramRaster(ProgramRaster *);
    107     void setProgramVertex(ProgramVertex *);
    108     void setProgramFragment(ProgramFragment *);
    109     void setProgramStore(ProgramStore *);
    110     void setFont(Font *);
    111 
    112     void updateSurface(void *sur);
    113 
    114     ProgramFragment * getProgramFragment() {return mFragment.get();}
    115     ProgramStore * getProgramStore() {return mFragmentStore.get();}
    116     ProgramRaster * getProgramRaster() {return mRaster.get();}
    117     ProgramVertex * getProgramVertex() {return mVertex.get();}
    118     Font * getFont() {return mFont.get();}
    119 
    120     bool setupCheck();
    121     void setupProgramStore();
    122 
    123     void pause();
    124     void resume();
    125     void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur);
    126     void setPriority(int32_t p);
    127     void destroyWorkerThreadResources();
    128 
    129     void assignName(ObjectBase *obj, const char *name, uint32_t len);
    130     void removeName(ObjectBase *obj);
    131 
    132     RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID);
    133     RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
    134     bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
    135     uint32_t runScript(Script *s);
    136 
    137     void initToClient();
    138     void deinitToClient();
    139 
    140     ProgramFragment * getDefaultProgramFragment() const {
    141         return mStateFragment.mDefault.get();
    142     }
    143     ProgramVertex * getDefaultProgramVertex() const {
    144         return mStateVertex.mDefault.get();
    145     }
    146     ProgramStore * getDefaultProgramStore() const {
    147         return mStateFragmentStore.mDefault.get();
    148     }
    149     ProgramRaster * getDefaultProgramRaster() const {
    150         return mStateRaster.mDefault.get();
    151     }
    152     Font* getDefaultFont() const {
    153         return mStateFont.mDefault.get();
    154     }
    155 
    156     uint32_t getWidth() const {return mWidth;}
    157     uint32_t getHeight() const {return mHeight;}
    158 
    159     uint32_t getCurrentSurfaceWidth() const;
    160     uint32_t getCurrentSurfaceHeight() const;
    161 
    162     mutable ThreadIO mIO;
    163 
    164     // Timers
    165     enum Timers {
    166         RS_TIMER_IDLE,
    167         RS_TIMER_INTERNAL,
    168         RS_TIMER_SCRIPT,
    169         RS_TIMER_CLEAR_SWAP,
    170         _RS_TIMER_TOTAL
    171     };
    172     uint64_t getTime() const;
    173     void timerInit();
    174     void timerReset();
    175     void timerSet(Timers);
    176     void timerPrint();
    177     void timerFrame();
    178 
    179     struct {
    180         bool mLogTimes;
    181         bool mLogScripts;
    182         bool mLogObjects;
    183         bool mLogShaders;
    184         bool mLogShadersAttr;
    185         bool mLogShadersUniforms;
    186         bool mLogVisual;
    187         uint32_t mDebugMaxThreads;
    188     } props;
    189 
    190     mutable struct {
    191         bool inRoot;
    192         const char *command;
    193         const char *file;
    194         uint32_t line;
    195     } watchdog;
    196     static void printWatchdogInfo(void *ctx);
    197     void setWatchdogGL(const char *cmd, uint32_t line, const char *file) const {
    198         watchdog.command = cmd;
    199         watchdog.file = file;
    200         watchdog.line = line;
    201     }
    202 
    203     void dumpDebug() const;
    204     void setError(RsError e, const char *msg = NULL) const;
    205 
    206     mutable const ObjectBase * mObjHead;
    207 
    208     uint32_t getDPI() const {return mDPI;}
    209     void setDPI(uint32_t dpi) {mDPI = dpi;}
    210 
    211     uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;}
    212     void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;}
    213 
    214     Device *mDev;
    215 protected:
    216 
    217     uint32_t mTargetSdkVersion;
    218     uint32_t mDPI;
    219     uint32_t mWidth;
    220     uint32_t mHeight;
    221     int32_t mThreadPriority;
    222     bool mIsGraphicsContext;
    223 
    224     bool mRunning;
    225     bool mExit;
    226     bool mPaused;
    227     mutable RsError mError;
    228 
    229     pthread_t mThreadId;
    230     pid_t mNativeThreadId;
    231 
    232     ObjectBaseRef<Script> mRootScript;
    233     ObjectBaseRef<ProgramFragment> mFragment;
    234     ObjectBaseRef<ProgramVertex> mVertex;
    235     ObjectBaseRef<ProgramStore> mFragmentStore;
    236     ObjectBaseRef<ProgramRaster> mRaster;
    237     ObjectBaseRef<Font> mFont;
    238 
    239     void displayDebugStats();
    240 
    241 private:
    242     Context();
    243     bool initContext(Device *, const RsSurfaceConfig *sc);
    244 
    245 
    246     bool initGLThread();
    247     void deinitEGL();
    248 
    249     uint32_t runRootScript();
    250 
    251     static void * threadProc(void *);
    252     static void * helperThreadProc(void *);
    253 
    254     bool mHasSurface;
    255     bool mIsContextLite;
    256 
    257     Vector<ObjectBase *> mNames;
    258 
    259     uint64_t mTimers[_RS_TIMER_TOTAL];
    260     Timers mTimerActive;
    261     uint64_t mTimeLast;
    262     uint64_t mTimeFrame;
    263     uint64_t mTimeLastFrame;
    264     uint32_t mTimeMSLastFrame;
    265     uint32_t mTimeMSLastScript;
    266     uint32_t mTimeMSLastSwap;
    267     uint32_t mAverageFPSFrameCount;
    268     uint64_t mAverageFPSStartTime;
    269     uint32_t mAverageFPS;
    270 };
    271 
    272 } // renderscript
    273 } // android
    274 #endif
    275