rsContext.h revision edbfabdb98a2974f973d6c042e6efd547dc02fc5
1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/*
24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 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"
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsType.h"
22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAllocation.h"
237c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams#include "rsMesh.h"
24d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
25e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams#include "rs_hal.h"
26e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
27d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
28d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#include "rsMutex.h"
29d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#include "rsThreadIO.h"
30fcf7231249822ff4dae852f1de1f799756689f91Jason Sams#include "rsMatrix4x4.h"
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsDevice.h"
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsScriptC.h"
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAdapter.h"
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsSampler.h"
359b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk#include "rsFont.h"
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramFragment.h"
3754db59c3594e887a412a24713fc3daa1c2404593Jason Sams#include "rsProgramStore.h"
38ebfb436a49673693b98469683451bd9ede797557Jason Sams#include "rsProgramRaster.h"
39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramVertex.h"
408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk#include "rsFBOCache.h"
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsgApiStructs.h"
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsLocklessFifo.h"
44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
45d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#endif // ANDROID_RS_SERIALIZE
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
47407cae950325682a56fe5373dd218a666da901efAlex Sakhartchoukclass ANativeWindow;
48407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
51000479f9e325b4e426a67033abd92d47da412725Mathias Agopian
52d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
54f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#if 0
55f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ(o) { \
56f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    GET_TLS(); \
57ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
58f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams        LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
59f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    } \
60f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams}
61f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ_OR_NULL(o) { \
62f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    GET_TLS(); \
63ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
64f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams        LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
65f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    } \
66f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams}
67f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#else
68f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ(o)
69f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ_OR_NULL(o)
70f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#endif
71f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams
72d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
73d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
74ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukclass Context {
75d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic:
76e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    struct Hal {
77e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        void * drv;
78e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
79e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams        RsdHalFunctions funcs;
80e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    };
81e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams    Hal mHal;
82e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams
83d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams    static Context * createContext(Device *, const RsSurfaceConfig *sc);
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ~Context();
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
8641c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams    static pthread_mutex_t gInitMutex;
871ac9da6717f27ecfd3c650bd1bfd84d336674dfcStephen Hines    // Library mutex (for providing thread-safe calls from the runtime)
881ac9da6717f27ecfd3c650bd1bfd84d336674dfcStephen Hines    static pthread_mutex_t gLibMutex;
8941c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams
90a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    class PushState {
91a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    public:
92a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        PushState(Context *);
93a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ~PushState();
94a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams
95a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    private:
96a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramFragment> mFragment;
97a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramVertex> mVertex;
98a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramStore> mStore;
99a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramRaster> mRaster;
100a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<Font> mFont;
101a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        Context *mRsc;
102a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    };
103a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams
10411c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    RsSurfaceConfig mUserSurfaceConfig;
105462d11b880cba72584c135397c0a82618ab63217Jason Sams
106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ElementState mStateElement;
107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState mStateType;
108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    SamplerState mStateSampler;
109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ProgramFragmentState mStateFragment;
11054db59c3594e887a412a24713fc3daa1c2404593Jason Sams    ProgramStoreState mStateFragmentStore;
111ebfb436a49673693b98469683451bd9ede797557Jason Sams    ProgramRasterState mStateRaster;
112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ProgramVertexState mStateVertex;
1139b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    FontState mStateFont;
114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ScriptCState mScriptC;
1168e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    FBOCache mFBOCache;
117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void swapBuffers();
119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void setRootScript(Script *);
120a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramRaster(ProgramRaster *);
121a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramVertex(ProgramVertex *);
122a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramFragment(ProgramFragment *);
123a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramStore(ProgramStore *);
1249b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    void setFont(Font *);
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void updateSurface(void *sur);
127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
128a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramFragment * getProgramFragment() {return mFragment.get();}
129a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramStore * getProgramStore() {return mFragmentStore.get();}
130a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramRaster * getProgramRaster() {return mRaster.get();}
131a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramVertex * getProgramVertex() {return mVertex.get();}
1329b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    Font * getFont() {return mFont.get();}
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
134156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams    bool setupCheck();
135feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchouk    void setupProgramStore();
136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
13765e7aa56f56097418d617663683544c25b3988eaJason Sams    void pause();
13865e7aa56f56097418d617663683544c25b3988eaJason Sams    void resume();
1398b49bd1a2f8117e1c22884f0150e72cbcf838f32Dianne Hackborn    void setSurface(uint32_t w, uint32_t h, ANativeWindow *sur);
1407d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    void setPriority(int32_t p);
1415c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams    void destroyWorkerThreadResources();
14265e7aa56f56097418d617663683544c25b3988eaJason Sams
143d5680f9ba95ec7ce212e8025774914e79982a1eeJason Sams    void assignName(ObjectBase *obj, const char *name, uint32_t len);
1443eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    void removeName(ObjectBase *obj);
1459c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams
146edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams    RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID);
147edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams    RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
148add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
149f17bccc9050498f51a32a2ee78f5d5a306008e3dJason Sams    uint32_t runScript(Script *s);
150516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
151516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    void initToClient();
152516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    void deinitToClient();
153516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1549c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    ProgramFragment * getDefaultProgramFragment() const {
1559c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams        return mStateFragment.mDefault.get();
1569c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    }
1579c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    ProgramVertex * getDefaultProgramVertex() const {
1589c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams        return mStateVertex.mDefault.get();
1599c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    }
16054db59c3594e887a412a24713fc3daa1c2404593Jason Sams    ProgramStore * getDefaultProgramStore() const {
1619c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams        return mStateFragmentStore.mDefault.get();
1629c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    }
163ebfb436a49673693b98469683451bd9ede797557Jason Sams    ProgramRaster * getDefaultProgramRaster() const {
164ebfb436a49673693b98469683451bd9ede797557Jason Sams        return mStateRaster.mDefault.get();
165ebfb436a49673693b98469683451bd9ede797557Jason Sams    }
1669b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    Font* getDefaultFont() const {
1679b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        return mStateFont.mDefault.get();
1689b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    }
1699c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams
170f603d212552485c634e25f3556f847dc2b022bd5Jason Sams    uint32_t getWidth() const {return mWidth;}
171f603d212552485c634e25f3556f847dc2b022bd5Jason Sams    uint32_t getHeight() const {return mHeight;}
17240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
173add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    mutable ThreadIO mIO;
174bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams
175f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    // Timers
176f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    enum Timers {
177f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_IDLE,
178f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_INTERNAL,
179f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_SCRIPT,
180f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_CLEAR_SWAP,
181f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        _RS_TIMER_TOTAL
182f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    };
183f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    uint64_t getTime() const;
184f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerInit();
185f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerReset();
186f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerSet(Timers);
187f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerPrint();
1882525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    void timerFrame();
189f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams
19066b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams    struct {
19166b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams        bool mLogTimes;
19266b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams        bool mLogScripts;
19366b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams        bool mLogObjects;
1945dad8b4d1fda37b7b4763ef7361c5eb92131cb7eJason Sams        bool mLogShaders;
1954378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        bool mLogShadersAttr;
1964378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        bool mLogShadersUniforms;
1976de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk        bool mLogVisual;
19866b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams    } props;
1999ac2c66f0171593113238635c6a7921c41215e77Joe Onorato
2009dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams    void dumpDebug() const;
201add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    void setError(RsError e, const char *msg = NULL) const;
2029dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams
203a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    mutable const ObjectBase * mObjHead;
204a9e7a05b84470257637c97d65f6562aa832c66efJason Sams
2052c74ad9aae29cc64fece926f353825a7925792c2Alex Sakhartchouk    uint32_t getDPI() const {return mDPI;}
2062c74ad9aae29cc64fece926f353825a7925792c2Alex Sakhartchouk    void setDPI(uint32_t dpi) {mDPI = dpi;}
2078e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams
208d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Device *mDev;
209803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Samsprotected:
210d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2112c74ad9aae29cc64fece926f353825a7925792c2Alex Sakhartchouk    uint32_t mDPI;
2123bc47d438171dce294e816366d53bc9eca772c5bJason Sams    uint32_t mWidth;
2133bc47d438171dce294e816366d53bc9eca772c5bJason Sams    uint32_t mHeight;
214b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    int32_t mThreadPriority;
215704ff64b099406bb328898a7443921f22dbffd6dJason Sams    bool mIsGraphicsContext;
2163bc47d438171dce294e816366d53bc9eca772c5bJason Sams
217d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool mRunning;
218d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool mExit;
21965e7aa56f56097418d617663683544c25b3988eaJason Sams    bool mPaused;
220add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    mutable RsError mError;
221d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
222d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    pthread_t mThreadId;
2237d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    pid_t mNativeThreadId;
224d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
225d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<Script> mRootScript;
226d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<ProgramFragment> mFragment;
227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<ProgramVertex> mVertex;
22854db59c3594e887a412a24713fc3daa1c2404593Jason Sams    ObjectBaseRef<ProgramStore> mFragmentStore;
229ebfb436a49673693b98469683451bd9ede797557Jason Sams    ObjectBaseRef<ProgramRaster> mRaster;
2309b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    ObjectBaseRef<Font> mFont;
231730ee65d4ddb307898053b623120bad1655fadadJason Sams
2326de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk    void displayDebugStats();
2336de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk
234d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprivate:
235d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Context();
236d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams    bool initContext(Device *, const RsSurfaceConfig *sc);
237d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
238d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams
239d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams    bool initGLThread();
2407136220b54e68e0c7faac30577ed20b7482481fdJason Sams    void deinitEGL();
241d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
242b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t runRootScript();
243d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
244d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    static void * threadProc(void *);
2458e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    static void * helperThreadProc(void *);
246d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2478b49bd1a2f8117e1c22884f0150e72cbcf838f32Dianne Hackborn    ANativeWindow *mWndSurface;
2483eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
2493eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    Vector<ObjectBase *> mNames;
250f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams
251f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    uint64_t mTimers[_RS_TIMER_TOTAL];
252f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    Timers mTimerActive;
253f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    uint64_t mTimeLast;
2542525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    uint64_t mTimeFrame;
2552525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    uint64_t mTimeLastFrame;
256b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t mTimeMSLastFrame;
257b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t mTimeMSLastScript;
258b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t mTimeMSLastSwap;
25976322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk    uint32_t mAverageFPSFrameCount;
26076322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk    uint64_t mAverageFPSStartTime;
26176322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk    uint32_t mAverageFPS;
262d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
263d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
264d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#else
265d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
266d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchoukclass Context {
267d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchoukpublic:
268d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    Context() {
269d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        mObjHead = NULL;
270d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    }
271d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    ~Context() {
272d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        ObjectBase::zeroAllUserRef(this);
273d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    }
274d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
275d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    ElementState mStateElement;
276d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    TypeState mStateType;
277d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
278d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    struct {
279d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogTimes;
280d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogScripts;
281d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogObjects;
282d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogShaders;
283d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogShadersAttr;
284d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogShadersUniforms;
285d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk        bool mLogVisual;
286d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    } props;
287d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
288d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    void setError(RsError e, const char *msg = NULL) {  }
289d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
290d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk    mutable const ObjectBase * mObjHead;
291d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
292d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchoukprotected:
293d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
294d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk};
295d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
296d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk
297d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk} // renderscript
298d0f5bd130bdbd5b357b7f1db4562fa55e06d384cAlex Sakhartchouk} // android
299d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#endif
300