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