rsContext.h revision 3bc47d438171dce294e816366d53bc9eca772c5b
1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/* 2d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Copyright (C) 2009 The Android Open Source Project 3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License. 6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at 7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software 11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and 14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License. 15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */ 16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#ifndef ANDROID_RS_CONTEXT_H 18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#define ANDROID_RS_CONTEXT_H 19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 20399bfce299210ef9c2fc1e932202223253e2384aJason Sams#include "rsUtils.h" 21399bfce299210ef9c2fc1e932202223253e2384aJason Sams 22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <ui/Surface.h> 23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 24bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams#include "rsThreadIO.h" 25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsType.h" 26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsMatrix.h" 27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAllocation.h" 281bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams#include "rsSimpleMesh.h" 297c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams#include "rsMesh.h" 30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsDevice.h" 31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsScriptC.h" 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAllocation.h" 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAdapter.h" 34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsSampler.h" 35ee41112e1539de95596600fd2c6dada5d275217fJason Sams#include "rsLight.h" 36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramFragment.h" 37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramFragmentStore.h" 38ebfb436a49673693b98469683451bd9ede797557Jason Sams#include "rsProgramRaster.h" 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramVertex.h" 40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsgApiStructs.h" 42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsLocklessFifo.h" 43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// --------------------------------------------------------------------------- 46d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 47d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 499bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Samsclass Context 50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic: 523bc47d438171dce294e816366d53bc9eca772c5bJason Sams Context(Device *, bool useDepth); 53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ~Context(); 54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 55462d11b880cba72584c135397c0a82618ab63217Jason Sams static pthread_key_t gThreadTLSKey; 5641c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams static uint32_t gThreadTLSKeyCount; 577136220b54e68e0c7faac30577ed20b7482481fdJason Sams static uint32_t gGLContextCount; 5841c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams static pthread_mutex_t gInitMutex; 5941c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams 60462d11b880cba72584c135397c0a82618ab63217Jason Sams struct ScriptTLSStruct { 61462d11b880cba72584c135397c0a82618ab63217Jason Sams Context * mContext; 62462d11b880cba72584c135397c0a82618ab63217Jason Sams Script * mScript; 63462d11b880cba72584c135397c0a82618ab63217Jason Sams }; 64462d11b880cba72584c135397c0a82618ab63217Jason Sams 65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //StructuredAllocationContext mStateAllocation; 67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ElementState mStateElement; 68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams TypeState mStateType; 69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState mStateSampler; 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ProgramFragmentState mStateFragment; 71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ProgramFragmentStoreState mStateFragmentStore; 72ebfb436a49673693b98469683451bd9ede797557Jason Sams ProgramRasterState mStateRaster; 73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ProgramVertexState mStateVertex; 74bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams LightState mStateLight; 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ScriptCState mScriptC; 77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void swapBuffers(); 79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void setRootScript(Script *); 80ebfb436a49673693b98469683451bd9ede797557Jason Sams void setRaster(ProgramRaster *); 81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void setVertex(ProgramVertex *); 82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void setFragment(ProgramFragment *); 83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void setFragmentStore(ProgramFragmentStore *); 84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void updateSurface(void *sur); 86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const ProgramFragment * getFragment() {return mFragment.get();} 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const ProgramFragmentStore * getFragmentStore() {return mFragmentStore.get();} 89ebfb436a49673693b98469683451bd9ede797557Jason Sams const ProgramRaster * getRaster() {return mRaster.get();} 90b0ec1b46d6f5b5612e33fe43a828abea79b87a00Jason Sams const ProgramVertex * getVertex() {return mVertex.get();} 91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void setupCheck(); 939bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams void allocationCheck(const Allocation *); 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 9565e7aa56f56097418d617663683544c25b3988eaJason Sams void pause(); 9665e7aa56f56097418d617663683544c25b3988eaJason Sams void resume(); 973bc47d438171dce294e816366d53bc9eca772c5bJason Sams void setSurface(uint32_t w, uint32_t h, Surface *sur); 9865e7aa56f56097418d617663683544c25b3988eaJason Sams 99d5680f9ba95ec7ce212e8025774914e79982a1eeJason Sams void assignName(ObjectBase *obj, const char *name, uint32_t len); 1003eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams void removeName(ObjectBase *obj); 1013eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams ObjectBase * lookupName(const char *name) const; 102d5680f9ba95ec7ce212e8025774914e79982a1eeJason Sams void appendNameDefines(String8 *str) const; 103d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato void appendVarDefines(String8 *str) const; 1049c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams 105516c31911578db8ce53529483c3ded918ac7dc6bJason Sams uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait); 106516c31911578db8ce53529483c3ded918ac7dc6bJason Sams bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace); 107bd2197fb0038acd2dc4b17ad3ed3c69cc29dcce2Jason Sams bool runScript(Script *s, uint32_t launchID); 108516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 109516c31911578db8ce53529483c3ded918ac7dc6bJason Sams void initToClient(); 110516c31911578db8ce53529483c3ded918ac7dc6bJason Sams void deinitToClient(); 111516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 1129c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams ProgramFragment * getDefaultProgramFragment() const { 1139c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams return mStateFragment.mDefault.get(); 1149c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } 1159c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams ProgramVertex * getDefaultProgramVertex() const { 1169c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams return mStateVertex.mDefault.get(); 1179c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } 1189c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams ProgramFragmentStore * getDefaultProgramFragmentStore() const { 1199c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams return mStateFragmentStore.mDefault.get(); 1209c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } 121ebfb436a49673693b98469683451bd9ede797557Jason Sams ProgramRaster * getDefaultProgramRaster() const { 122ebfb436a49673693b98469683451bd9ede797557Jason Sams return mStateRaster.mDefault.get(); 123ebfb436a49673693b98469683451bd9ede797557Jason Sams } 1249c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams 125d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato void addInt32Define(const char* name, int32_t value) { 126d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato mInt32Defines.add(String8(name), value); 127d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato } 128d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato 129d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato void addFloatDefine(const char* name, float value) { 130d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato mFloatDefines.add(String8(name), value); 131d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato } 132d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato 133b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams uint32_t getWidth() const {return mEGL.mWidth;} 134b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams uint32_t getHeight() const {return mEGL.mHeight;} 13540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 136bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams 137bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams ThreadIO mIO; 138730ee65d4ddb307898053b623120bad1655fadadJason Sams void objDestroyAdd(ObjectBase *); 139bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams 140f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams // Timers 141f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams enum Timers { 142f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams RS_TIMER_IDLE, 143f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams RS_TIMER_INTERNAL, 144f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams RS_TIMER_SCRIPT, 145f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams RS_TIMER_CLEAR_SWAP, 146f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams _RS_TIMER_TOTAL 147f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams }; 148f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams uint64_t getTime() const; 149f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams void timerInit(); 150f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams void timerReset(); 151f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams void timerSet(Timers); 152f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams void timerPrint(); 1532525a815220652b37e2e390fe8c62394a6d0e574Jason Sams void timerFrame(); 154f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams 155b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams bool checkVersion1_1() const {return (mGL.mMajorVersion > 1) || (mGL.mMinorVersion >= 1); } 156b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams bool checkVersion2_0() const {return mGL.mMajorVersion >= 2; } 157b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams 15866b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams struct { 15966b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams bool mLogTimes; 16066b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams bool mLogScripts; 16166b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams bool mLogObjects; 16266b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams } props; 1639ac2c66f0171593113238635c6a7921c41215e77Joe Onorato 164a9e7a05b84470257637c97d65f6562aa832c66efJason Sams mutable const ObjectBase * mObjHead; 165a9e7a05b84470257637c97d65f6562aa832c66efJason Sams 166d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprotected: 167d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Device *mDev; 168d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 169b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams struct { 170b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLint mNumConfigs; 171b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLint mMajorVersion; 172b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLint mMinorVersion; 173b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLConfig mConfig; 174b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLContext mContext; 175b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLSurface mSurface; 176b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLint mWidth; 177b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLint mHeight; 178b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams EGLDisplay mDisplay; 179b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams } mEGL; 180b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams 181b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams struct { 182b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams const uint8_t * mVendor; 183b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams const uint8_t * mRenderer; 184b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams const uint8_t * mVersion; 185b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams const uint8_t * mExtensions; 186b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams 187b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams uint32_t mMajorVersion; 188b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams uint32_t mMinorVersion; 189b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams 190b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams } mGL; 191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 1923bc47d438171dce294e816366d53bc9eca772c5bJason Sams uint32_t mWidth; 1933bc47d438171dce294e816366d53bc9eca772c5bJason Sams uint32_t mHeight; 1943bc47d438171dce294e816366d53bc9eca772c5bJason Sams 195d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams bool mRunning; 196d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams bool mExit; 197b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams bool mUseDepth; 19865e7aa56f56097418d617663683544c25b3988eaJason Sams bool mPaused; 199d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 200d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams pthread_t mThreadId; 201d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ObjectBaseRef<Script> mRootScript; 203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ObjectBaseRef<ProgramFragment> mFragment; 204d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ObjectBaseRef<ProgramVertex> mVertex; 205d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ObjectBaseRef<ProgramFragmentStore> mFragmentStore; 206ebfb436a49673693b98469683451bd9ede797557Jason Sams ObjectBaseRef<ProgramRaster> mRaster; 207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 208730ee65d4ddb307898053b623120bad1655fadadJason Sams 209730ee65d4ddb307898053b623120bad1655fadadJason Sams struct ObjDestroyOOB { 210730ee65d4ddb307898053b623120bad1655fadadJason Sams pthread_mutex_t mMutex; 211730ee65d4ddb307898053b623120bad1655fadadJason Sams Vector<ObjectBase *> mDestroyList; 212730ee65d4ddb307898053b623120bad1655fadadJason Sams bool mNeedToEmpty; 213730ee65d4ddb307898053b623120bad1655fadadJason Sams }; 214730ee65d4ddb307898053b623120bad1655fadadJason Sams ObjDestroyOOB mObjDestroy; 215730ee65d4ddb307898053b623120bad1655fadadJason Sams bool objDestroyOOBInit(); 216730ee65d4ddb307898053b623120bad1655fadadJason Sams void objDestroyOOBRun(); 217730ee65d4ddb307898053b623120bad1655fadadJason Sams void objDestroyOOBDestroy(); 218730ee65d4ddb307898053b623120bad1655fadadJason Sams 219d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprivate: 220d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Context(); 221d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 222d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams void initEGL(); 2237136220b54e68e0c7faac30577ed20b7482481fdJason Sams void deinitEGL(); 224d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 225a09f11d6c641726b61f80c15230a18d31c146fecJason Sams bool runRootScript(); 226d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams static void * threadProc(void *); 228d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 229d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Surface *mWndSurface; 2303eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams 2313eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams Vector<ObjectBase *> mNames; 232d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato KeyedVector<String8,int> mInt32Defines; 233d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onorato KeyedVector<String8,float> mFloatDefines; 234f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams 235f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams uint64_t mTimers[_RS_TIMER_TOTAL]; 236f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams Timers mTimerActive; 237f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams uint64_t mTimeLast; 2382525a815220652b37e2e390fe8c62394a6d0e574Jason Sams uint64_t mTimeFrame; 2392525a815220652b37e2e390fe8c62394a6d0e574Jason Sams uint64_t mTimeLastFrame; 240d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}; 241d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 242d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 243d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 244d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#endif 245