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