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 #include <string.h>
     23 
     24 #include "rsThreadIO.h"
     25 #include "rsScriptC.h"
     26 #include "rsScriptGroup.h"
     27 #include "rsSampler.h"
     28 
     29 #if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
     30 #define ATRACE_TAG ATRACE_TAG_RS
     31 #include "utils/Trace.h"
     32 #else
     33 #define ATRACE_ENABLED(...) false
     34 #define ATRACE_NAME(...)
     35 #define ATRACE_CALL(...)
     36 #endif
     37 
     38 #ifndef RS_COMPATIBILITY_LIB
     39 #include "rsFont.h"
     40 #include "rsProgramFragment.h"
     41 #include "rsProgramStore.h"
     42 #include "rsProgramRaster.h"
     43 #include "rsProgramVertex.h"
     44 #include "rsFBOCache.h"
     45 
     46 #endif
     47 
     48 /*
     49  * This is a pointer to the gDebuggerPresent global from libRS.so. The
     50  * debugger will use this to signal that it is attached, and thus the
     51  * driver can wait appropriately.
     52 */
     53 extern int *gInternalDebuggerPresent;
     54 
     55 // ---------------------------------------------------------------------------
     56 namespace android {
     57 
     58 namespace renderscript {
     59 
     60 class Device;
     61 
     62 #if 0
     63 #define CHECK_OBJ(o) { \
     64     GET_TLS(); \
     65     if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
     66         ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
     67     } \
     68 }
     69 #define CHECK_OBJ_OR_NULL(o) { \
     70     GET_TLS(); \
     71     if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
     72         ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
     73     } \
     74 }
     75 #else
     76 #define CHECK_OBJ(o)
     77 #define CHECK_OBJ_OR_NULL(o)
     78 #endif
     79 
     80 
     81 
     82 class Context {
     83 public:
     84     struct Hal {
     85         void * drv;
     86 
     87         RsdHalFunctions funcs;
     88         uint32_t flags;
     89     };
     90     Hal mHal;
     91 
     92     static Context * createContext(Device *, const RsSurfaceConfig *sc,
     93             RsContextType ct = RS_CONTEXT_TYPE_NORMAL,
     94             uint32_t flags = 0);
     95     static Context * createContextLite();
     96     ~Context();
     97 
     98     static pthread_mutex_t gMessageMutex;
     99     static pthread_mutex_t gInitMutex;
    100     // Library mutex (for providing thread-safe calls from the runtime)
    101     static pthread_mutex_t gLibMutex;
    102 
    103     class PushState {
    104     public:
    105         PushState(Context *);
    106         ~PushState();
    107 
    108     private:
    109 #ifndef RS_COMPATIBILITY_LIB
    110         ObjectBaseRef<ProgramFragment> mFragment;
    111         ObjectBaseRef<ProgramVertex> mVertex;
    112         ObjectBaseRef<ProgramStore> mStore;
    113         ObjectBaseRef<ProgramRaster> mRaster;
    114         ObjectBaseRef<Font> mFont;
    115 #endif
    116         Context *mRsc;
    117     };
    118 
    119     RsSurfaceConfig mUserSurfaceConfig;
    120 
    121     ElementState mStateElement;
    122     TypeState mStateType;
    123     SamplerState mStateSampler;
    124 
    125     bool isSynchronous() {return mSynchronous;}
    126     bool setupCheck();
    127 
    128 #ifndef RS_COMPATIBILITY_LIB
    129     FBOCache mFBOCache;
    130     ProgramFragmentState mStateFragment;
    131     ProgramStoreState mStateFragmentStore;
    132     ProgramRasterState mStateRaster;
    133     ProgramVertexState mStateVertex;
    134     FontState mStateFont;
    135 
    136 
    137     void swapBuffers();
    138     void setRootScript(Script *);
    139     void setProgramRaster(ProgramRaster *);
    140     void setProgramVertex(ProgramVertex *);
    141     void setProgramFragment(ProgramFragment *);
    142     void setProgramStore(ProgramStore *);
    143     void setFont(Font *);
    144 
    145     void updateSurface(void *sur);
    146 
    147     ProgramFragment * getProgramFragment() {return mFragment.get();}
    148     ProgramStore * getProgramStore() {return mFragmentStore.get();}
    149     ProgramRaster * getProgramRaster() {return mRaster.get();}
    150     ProgramVertex * getProgramVertex() {return mVertex.get();}
    151     Font * getFont() {return mFont.get();}
    152 
    153     void setupProgramStore();
    154 
    155     void pause();
    156     void resume();
    157     void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur);
    158 #endif
    159     void finish();
    160 
    161     void setPriority(int32_t p);
    162     void destroyWorkerThreadResources();
    163 
    164     void assignName(ObjectBase *obj, const char *name, uint32_t len);
    165     void removeName(ObjectBase *obj);
    166 
    167     RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID);
    168     RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
    169     bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
    170     uint32_t runScript(Script *s);
    171 
    172     void initToClient();
    173     void deinitToClient();
    174 
    175 #ifndef RS_COMPATIBILITY_LIB
    176     ProgramFragment * getDefaultProgramFragment() const {
    177         return mStateFragment.mDefault.get();
    178     }
    179     ProgramVertex * getDefaultProgramVertex() const {
    180         return mStateVertex.mDefault.get();
    181     }
    182     ProgramStore * getDefaultProgramStore() const {
    183         return mStateFragmentStore.mDefault.get();
    184     }
    185     ProgramRaster * getDefaultProgramRaster() const {
    186         return mStateRaster.mDefault.get();
    187     }
    188     Font* getDefaultFont() const {
    189         return mStateFont.mDefault.get();
    190     }
    191 
    192     uint32_t getWidth() const {return mWidth;}
    193     uint32_t getHeight() const {return mHeight;}
    194 
    195     uint32_t getCurrentSurfaceWidth() const;
    196     uint32_t getCurrentSurfaceHeight() const;
    197 
    198     void setWatchdogGL(const char *cmd, uint32_t line, const char *file) const {
    199         watchdog.command = cmd;
    200         watchdog.file = file;
    201         watchdog.line = line;
    202     }
    203 #endif
    204 
    205     mutable ThreadIO mIO;
    206 
    207     // Timers
    208     enum Timers {
    209         RS_TIMER_IDLE,
    210         RS_TIMER_INTERNAL,
    211         RS_TIMER_SCRIPT,
    212         RS_TIMER_CLEAR_SWAP,
    213         _RS_TIMER_TOTAL
    214     };
    215     uint64_t getTime() const;
    216     void timerInit();
    217     void timerReset();
    218     void timerSet(Timers);
    219     void timerPrint();
    220     void timerFrame();
    221 
    222     struct {
    223         bool mLogTimes;
    224         bool mLogScripts;
    225         bool mLogShaders;
    226         bool mLogShadersAttr;
    227         bool mLogShadersUniforms;
    228         bool mLogVisual;
    229         uint32_t mLogReduce;
    230         bool mDebugReduceSplitAccum;
    231         uint32_t mDebugMaxThreads;
    232     } props;
    233 
    234     mutable struct {
    235         bool inRoot;
    236         const char *command;
    237         const char *file;
    238         uint32_t line;
    239     } watchdog;
    240     static void printWatchdogInfo(void *ctx);
    241 
    242     void dumpDebug() const;
    243     void setError(RsError e, const char *msg = nullptr) const;
    244 
    245     mutable const ObjectBase * mObjHead;
    246 
    247     uint32_t getDPI() const {return mDPI;}
    248     void setDPI(uint32_t dpi) {mDPI = dpi;}
    249 
    250     uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;}
    251     void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;}
    252 
    253     RsContextType getContextType() const { return mContextType; }
    254     void setContextType(RsContextType ct) { mContextType = ct; }
    255 
    256     // Check for Fatal errors
    257     // Should be used to prevent work from being launched
    258     // which could take the process down.  Maximizes the chance
    259     // the process lives long enough to get the error to the developer
    260     bool hadFatalError() {return mFatalErrorOccured;}
    261 
    262     uint32_t getOptLevel() const { return mOptLevel; }
    263     void setOptLevel(uint32_t optLevel) { mOptLevel = optLevel; }
    264 
    265     Device *mDev;
    266 
    267 #ifdef RS_COMPATIBILITY_LIB
    268     void setNativeLibDir(const char * libDir, uint32_t length) {
    269         if (!hasSetNativeLibDir) {
    270             if (length <= PATH_MAX) {
    271                 memcpy(nativeLibDir, libDir, length);
    272                 nativeLibDir[length] = 0;
    273                 hasSetNativeLibDir = true;
    274             } else {
    275                 setError(RS_ERROR_BAD_VALUE, "Invalid path");
    276             }
    277         }
    278     }
    279     const char * getNativeLibDir() {
    280         return nativeLibDir;
    281     }
    282 #endif
    283 
    284     void setCacheDir(const char * cacheDir_arg, uint32_t length);
    285     const char * getCacheDir() {
    286         if (hasSetCacheDir) {
    287             return mCacheDir;
    288         }
    289         return nullptr;
    290     }
    291 
    292     // Returns the actual loaded driver's name (like "libRSDriver.so").
    293     const char * getDriverName() {
    294         return mDriverName;
    295     }
    296 
    297     // Set a new driver name, should be called from within
    298     // rsdHalInit in order to alter default behaviour.
    299     void setDriverName(const char * name) {
    300         if (!mDriverName) {
    301             mDriverName = name;
    302         }
    303     }
    304 
    305 
    306 protected:
    307 
    308     uint32_t mTargetSdkVersion;
    309     uint32_t mDPI;
    310     uint32_t mWidth;
    311     uint32_t mHeight;
    312     int32_t mThreadPriority;
    313     bool mIsGraphicsContext;
    314 
    315     bool mForceCpu;
    316 
    317     RsContextType mContextType;
    318     uint32_t mOptLevel;
    319 
    320     bool mRunning;
    321     bool mExit;
    322     bool mPaused;
    323     mutable bool mFatalErrorOccured;
    324     mutable RsError mError;
    325 
    326 
    327     pthread_t mThreadId;
    328     pid_t mNativeThreadId;
    329 
    330     ObjectBaseRef<Script> mRootScript;
    331 #ifndef RS_COMPATIBILITY_LIB
    332     ObjectBaseRef<ProgramFragment> mFragment;
    333     ObjectBaseRef<ProgramVertex> mVertex;
    334     ObjectBaseRef<ProgramStore> mFragmentStore;
    335     ObjectBaseRef<ProgramRaster> mRaster;
    336     ObjectBaseRef<Font> mFont;
    337 #endif
    338 
    339     void displayDebugStats();
    340 
    341 private:
    342     Context();
    343     bool initContext(Device *, const RsSurfaceConfig *sc);
    344     void waitForDebugger();
    345     bool mSynchronous;
    346     bool initGLThread();
    347     void deinitEGL();
    348 
    349     uint32_t runRootScript();
    350 
    351     bool loadRuntime(const char* filename);
    352     bool loadDriver(bool forceDefault);
    353     static void * threadProc(void *);
    354     static void * helperThreadProc(void *);
    355 
    356     bool mHasSurface;
    357     bool mIsContextLite;
    358 
    359     // This holds the name of the driver (like "libRSDriver.so").
    360     // Since this is always just a static string, we don't have to
    361     // allocate, copy, or free any memory here.
    362     const char* mDriverName;
    363 
    364     Vector<ObjectBase *> mNames;
    365 
    366     uint64_t mTimers[_RS_TIMER_TOTAL];
    367     Timers mTimerActive;
    368     uint64_t mTimeLast;
    369     uint64_t mTimeFrame;
    370     uint64_t mTimeLastFrame;
    371     uint32_t mTimeMSLastFrame;
    372     uint32_t mTimeMSLastScript;
    373     uint32_t mTimeMSLastSwap;
    374     uint32_t mAverageFPSFrameCount;
    375     uint64_t mAverageFPSStartTime;
    376     uint32_t mAverageFPS;
    377 #ifdef RS_COMPATIBILITY_LIB
    378     bool hasSetNativeLibDir = false;
    379     char nativeLibDir[PATH_MAX+1];
    380 #endif
    381     bool hasSetCacheDir = false;
    382     char mCacheDir[PATH_MAX+1];
    383 };
    384 
    385 void LF_ObjDestroy_handcode(const Context *rsc, RsAsyncVoidPtr objPtr);
    386 
    387 } // renderscript
    388 } // android
    389 #endif
    390