rsContext.h revision c19ff0177a7a0dadfc01b1990f822354fdc95991
1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 2a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro * Copyright (C) 2011 The Android Open Source Project 3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Licensed under the Apache License, Version 2.0 (the "License"); 5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * you may not use this file except in compliance with the License. 6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * You may obtain a copy of the License at 7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * http://www.apache.org/licenses/LICENSE-2.0 9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Unless required by applicable law or agreed to in writing, software 11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * distributed under the License is distributed on an "AS IS" BASIS, 12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * See the License for the specific language governing permissions and 14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * limitations under the License. 15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifndef ANDROID_RS_CONTEXT_H 18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define ANDROID_RS_CONTEXT_H 19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsUtils.h" 21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsType.h" 22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsAllocation.h" 23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsMesh.h" 24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rs_hal.h" 26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifndef ANDROID_RS_SERIALIZE 28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsMutex.h" 29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsThreadIO.h" 30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsMatrix4x4.h" 31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsDevice.h" 32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsScriptC.h" 33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsAdapter.h" 34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsSampler.h" 35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsFont.h" 36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsProgramFragment.h" 37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsProgramStore.h" 38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsProgramRaster.h" 39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsProgramVertex.h" 40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsFBOCache.h" 41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsgApiStructs.h" 43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "rsLocklessFifo.h" 44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif // ANDROID_RS_SERIALIZE 46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroclass ANativeWindow; 48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// --------------------------------------------------------------------------- 50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaronamespace android { 51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaronamespace renderscript { 53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if 0 55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define CHECK_OBJ(o) { \ 56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro GET_TLS(); \ 57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \ 58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \ 59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } \ 60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define CHECK_OBJ_OR_NULL(o) { \ 62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro GET_TLS(); \ 63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \ 64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \ 65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } \ 66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else 68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define CHECK_OBJ(o) 69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define CHECK_OBJ_OR_NULL(o) 70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif 71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifndef ANDROID_RS_SERIALIZE 73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroclass Context { 75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaropublic: 76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct Hal { 77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro void * drv; 78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro RsdHalFunctions funcs; 80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro Hal mHal; 82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static Context * createContext(Device *, const RsSurfaceConfig *sc); 84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ~Context(); 85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static pthread_mutex_t gInitMutex; 87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // Library mutex (for providing thread-safe calls from the runtime) 88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static pthread_mutex_t gLibMutex; 89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro class PushState { 91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro public: 92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro PushState(Context *); 93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ~PushState(); 94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro private: 96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ObjectBaseRef<ProgramFragment> mFragment; 97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ObjectBaseRef<ProgramVertex> mVertex; 98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ObjectBaseRef<ProgramStore> mStore; 99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ObjectBaseRef<ProgramRaster> mRaster; 100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ObjectBaseRef<Font> mFont; 101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro Context *mRsc; 102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro RsSurfaceConfig mUserSurfaceConfig; 105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ElementState mStateElement; 107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro TypeState mStateType; 108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro SamplerState mStateSampler; 109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ProgramFragmentState mStateFragment; 110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ProgramStoreState mStateFragmentStore; 111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ProgramRasterState mStateRaster; 112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ProgramVertexState mStateVertex; 113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FontState mStateFont; 114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 115 ScriptCState mScriptC; 116 FBOCache mFBOCache; 117 118 void swapBuffers(); 119 void setRootScript(Script *); 120 void setProgramRaster(ProgramRaster *); 121 void setProgramVertex(ProgramVertex *); 122 void setProgramFragment(ProgramFragment *); 123 void setProgramStore(ProgramStore *); 124 void setFont(Font *); 125 126 void updateSurface(void *sur); 127 128 ProgramFragment * getProgramFragment() {return mFragment.get();} 129 ProgramStore * getProgramStore() {return mFragmentStore.get();} 130 ProgramRaster * getProgramRaster() {return mRaster.get();} 131 ProgramVertex * getProgramVertex() {return mVertex.get();} 132 Font * getFont() {return mFont.get();} 133 134 bool setupCheck(); 135 void setupProgramStore(); 136 137 void pause(); 138 void resume(); 139 void setSurface(uint32_t w, uint32_t h, ANativeWindow *sur); 140 void setPriority(int32_t p); 141 void destroyWorkerThreadResources(); 142 143 void assignName(ObjectBase *obj, const char *name, uint32_t len); 144 void removeName(ObjectBase *obj); 145 146 RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait); 147 RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait); 148 bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const; 149 uint32_t runScript(Script *s); 150 151 void initToClient(); 152 void deinitToClient(); 153 154 ProgramFragment * getDefaultProgramFragment() const { 155 return mStateFragment.mDefault.get(); 156 } 157 ProgramVertex * getDefaultProgramVertex() const { 158 return mStateVertex.mDefault.get(); 159 } 160 ProgramStore * getDefaultProgramStore() const { 161 return mStateFragmentStore.mDefault.get(); 162 } 163 ProgramRaster * getDefaultProgramRaster() const { 164 return mStateRaster.mDefault.get(); 165 } 166 Font* getDefaultFont() const { 167 return mStateFont.mDefault.get(); 168 } 169 170 uint32_t getWidth() const {return mWidth;} 171 uint32_t getHeight() const {return mHeight;} 172 173 mutable ThreadIO mIO; 174 175 // Timers 176 enum Timers { 177 RS_TIMER_IDLE, 178 RS_TIMER_INTERNAL, 179 RS_TIMER_SCRIPT, 180 RS_TIMER_CLEAR_SWAP, 181 _RS_TIMER_TOTAL 182 }; 183 uint64_t getTime() const; 184 void timerInit(); 185 void timerReset(); 186 void timerSet(Timers); 187 void timerPrint(); 188 void timerFrame(); 189 190 struct { 191 bool mLogTimes; 192 bool mLogScripts; 193 bool mLogObjects; 194 bool mLogShaders; 195 bool mLogShadersAttr; 196 bool mLogShadersUniforms; 197 bool mLogVisual; 198 } props; 199 200 void dumpDebug() const; 201 void setError(RsError e, const char *msg = NULL) const; 202 203 mutable const ObjectBase * mObjHead; 204 205 uint32_t getDPI() const {return mDPI;} 206 void setDPI(uint32_t dpi) {mDPI = dpi;} 207 208 Device *mDev; 209protected: 210 211 uint32_t mDPI; 212 uint32_t mWidth; 213 uint32_t mHeight; 214 int32_t mThreadPriority; 215 bool mIsGraphicsContext; 216 217 bool mRunning; 218 bool mExit; 219 bool mPaused; 220 mutable RsError mError; 221 222 pthread_t mThreadId; 223 pid_t mNativeThreadId; 224 225 ObjectBaseRef<Script> mRootScript; 226 ObjectBaseRef<ProgramFragment> mFragment; 227 ObjectBaseRef<ProgramVertex> mVertex; 228 ObjectBaseRef<ProgramStore> mFragmentStore; 229 ObjectBaseRef<ProgramRaster> mRaster; 230 ObjectBaseRef<Font> mFont; 231 232 void displayDebugStats(); 233 234private: 235 Context(); 236 bool initContext(Device *, const RsSurfaceConfig *sc); 237 238 239 bool initGLThread(); 240 void deinitEGL(); 241 242 uint32_t runRootScript(); 243 244 static void * threadProc(void *); 245 static void * helperThreadProc(void *); 246 247 ANativeWindow *mWndSurface; 248 249 Vector<ObjectBase *> mNames; 250 251 uint64_t mTimers[_RS_TIMER_TOTAL]; 252 Timers mTimerActive; 253 uint64_t mTimeLast; 254 uint64_t mTimeFrame; 255 uint64_t mTimeLastFrame; 256 uint32_t mTimeMSLastFrame; 257 uint32_t mTimeMSLastScript; 258 uint32_t mTimeMSLastSwap; 259 uint32_t mAverageFPSFrameCount; 260 uint64_t mAverageFPSStartTime; 261 uint32_t mAverageFPS; 262}; 263 264#else 265 266class Context { 267public: 268 Context() { 269 mObjHead = NULL; 270 } 271 ~Context() { 272 ObjectBase::zeroAllUserRef(this); 273 } 274 275 ElementState mStateElement; 276 TypeState mStateType; 277 278 struct { 279 bool mLogTimes; 280 bool mLogScripts; 281 bool mLogObjects; 282 bool mLogShaders; 283 bool mLogShadersAttr; 284 bool mLogShadersUniforms; 285 bool mLogVisual; 286 } props; 287 288 void setError(RsError e, const char *msg = NULL) { } 289 290 mutable const ObjectBase * mObjHead; 291 292protected: 293 294}; 295#endif //ANDROID_RS_SERIALIZE 296 297} // renderscript 298} // android 299#endif 300