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