diff options
| author | 2009-11-12 18:45:53 -0800 | |
|---|---|---|
| committer | 2009-11-13 13:53:39 -0800 | |
| commit | 9db3d07b9620b4269ab33f78604a36327e536ce1 (patch) | |
| tree | 41e294f34b9695187af098cd42167489fb0c8fb0 /libs/rs/rsContext.h | |
| parent | 6c63ee4fc4acae4bbbbd2a49e0a68206221f0de0 (diff) | |
eclair snapshot
Diffstat (limited to 'libs/rs/rsContext.h')
| -rw-r--r-- | libs/rs/rsContext.h | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h new file mode 100644 index 000000000000..bffc55b7cb8b --- /dev/null +++ b/libs/rs/rsContext.h @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_RS_CONTEXT_H +#define ANDROID_RS_CONTEXT_H + +#include "rsUtils.h" + +#include <ui/Surface.h> + +#include "rsThreadIO.h" +#include "rsType.h" +#include "rsMatrix.h" +#include "rsAllocation.h" +#include "rsSimpleMesh.h" +#include "rsMesh.h" +#include "rsDevice.h" +#include "rsScriptC.h" +#include "rsAllocation.h" +#include "rsAdapter.h" +#include "rsSampler.h" +#include "rsLight.h" +#include "rsProgramFragment.h" +#include "rsProgramFragmentStore.h" +#include "rsProgramRaster.h" +#include "rsProgramVertex.h" + +#include "rsgApiStructs.h" +#include "rsLocklessFifo.h" + + +// --------------------------------------------------------------------------- +namespace android { +namespace renderscript { + +class Context +{ +public: + Context(Device *, Surface *, bool useDepth); + ~Context(); + + static pthread_key_t gThreadTLSKey; + static uint32_t gThreadTLSKeyCount; + static uint32_t gGLContextCount; + static pthread_mutex_t gInitMutex; + + struct ScriptTLSStruct { + Context * mContext; + Script * mScript; + }; + + + //StructuredAllocationContext mStateAllocation; + ElementState mStateElement; + TypeState mStateType; + SamplerState mStateSampler; + ProgramFragmentState mStateFragment; + ProgramFragmentStoreState mStateFragmentStore; + ProgramRasterState mStateRaster; + ProgramVertexState mStateVertex; + LightState mStateLight; + + ScriptCState mScriptC; + + void swapBuffers(); + void setRootScript(Script *); + void setRaster(ProgramRaster *); + void setVertex(ProgramVertex *); + void setFragment(ProgramFragment *); + void setFragmentStore(ProgramFragmentStore *); + + void updateSurface(void *sur); + + const ProgramFragment * getFragment() {return mFragment.get();} + const ProgramFragmentStore * getFragmentStore() {return mFragmentStore.get();} + const ProgramRaster * getRaster() {return mRaster.get();} + const ProgramVertex * getVertex() {return mVertex.get();} + + void setupCheck(); + void allocationCheck(const Allocation *); + + void pause(); + void resume(); + void setSurface(Surface *sur); + + void assignName(ObjectBase *obj, const char *name, uint32_t len); + void removeName(ObjectBase *obj); + ObjectBase * lookupName(const char *name) const; + void appendNameDefines(String8 *str) const; + void appendVarDefines(String8 *str) const; + + uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait); + bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace); + bool runScript(Script *s, uint32_t launchID); + + void initToClient(); + void deinitToClient(); + + ProgramFragment * getDefaultProgramFragment() const { + return mStateFragment.mDefault.get(); + } + ProgramVertex * getDefaultProgramVertex() const { + return mStateVertex.mDefault.get(); + } + ProgramFragmentStore * getDefaultProgramFragmentStore() const { + return mStateFragmentStore.mDefault.get(); + } + ProgramRaster * getDefaultProgramRaster() const { + return mStateRaster.mDefault.get(); + } + + void addInt32Define(const char* name, int32_t value) { + mInt32Defines.add(String8(name), value); + } + + void addFloatDefine(const char* name, float value) { + mFloatDefines.add(String8(name), value); + } + + uint32_t getWidth() const {return mEGL.mWidth;} + uint32_t getHeight() const {return mEGL.mHeight;} + + + ThreadIO mIO; + void objDestroyAdd(ObjectBase *); + + // Timers + enum Timers { + RS_TIMER_IDLE, + RS_TIMER_INTERNAL, + RS_TIMER_SCRIPT, + RS_TIMER_CLEAR_SWAP, + _RS_TIMER_TOTAL + }; + uint64_t getTime() const; + void timerInit(); + void timerReset(); + void timerSet(Timers); + void timerPrint(); + void timerFrame(); + + bool checkVersion1_1() const {return (mGL.mMajorVersion > 1) || (mGL.mMinorVersion >= 1); } + bool checkVersion2_0() const {return mGL.mMajorVersion >= 2; } + + struct { + bool mLogTimes; + bool mLogScripts; + bool mLogObjects; + } props; + + mutable const ObjectBase * mObjHead; + +protected: + Device *mDev; + + struct { + EGLint mNumConfigs; + EGLint mMajorVersion; + EGLint mMinorVersion; + EGLConfig mConfig; + EGLContext mContext; + EGLSurface mSurface; + EGLint mWidth; + EGLint mHeight; + EGLDisplay mDisplay; + } mEGL; + + struct { + const uint8_t * mVendor; + const uint8_t * mRenderer; + const uint8_t * mVersion; + const uint8_t * mExtensions; + + uint32_t mMajorVersion; + uint32_t mMinorVersion; + + } mGL; + + bool mRunning; + bool mExit; + bool mUseDepth; + bool mPaused; + + pthread_t mThreadId; + + ObjectBaseRef<Script> mRootScript; + ObjectBaseRef<ProgramFragment> mFragment; + ObjectBaseRef<ProgramVertex> mVertex; + ObjectBaseRef<ProgramFragmentStore> mFragmentStore; + ObjectBaseRef<ProgramRaster> mRaster; + + + struct ObjDestroyOOB { + pthread_mutex_t mMutex; + Vector<ObjectBase *> mDestroyList; + bool mNeedToEmpty; + }; + ObjDestroyOOB mObjDestroy; + bool objDestroyOOBInit(); + void objDestroyOOBRun(); + void objDestroyOOBDestroy(); + +private: + Context(); + + void initEGL(); + void deinitEGL(); + + bool runRootScript(); + + static void * threadProc(void *); + + Surface *mWndSurface; + + Vector<ObjectBase *> mNames; + KeyedVector<String8,int> mInt32Defines; + KeyedVector<String8,float> mFloatDefines; + + uint64_t mTimers[_RS_TIMER_TOTAL]; + Timers mTimerActive; + uint64_t mTimeLast; + uint64_t mTimeFrame; + uint64_t mTimeLastFrame; +}; + +} +} +#endif |