rsContext.h revision add9d9633205f76cc34f04368b8482c2c369ba63
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"
21c1d726c2d62424867ec14f2cde16b00fe0ddfee1Jason Sams#include "rsMutex.h"
22399bfce299210ef9c2fc1e932202223253e2384aJason Sams
23bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams#include "rsThreadIO.h"
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsType.h"
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsMatrix.h"
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAllocation.h"
277c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams#include "rsMesh.h"
28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsDevice.h"
29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsScriptC.h"
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAllocation.h"
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsAdapter.h"
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsSampler.h"
339b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk#include "rsFont.h"
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramFragment.h"
3554db59c3594e887a412a24713fc3daa1c2404593Jason Sams#include "rsProgramStore.h"
36ebfb436a49673693b98469683451bd9ede797557Jason Sams#include "rsProgramRaster.h"
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsProgramVertex.h"
38bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams#include "rsShaderCache.h"
39bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams#include "rsVertexArray.h"
40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsgApiStructs.h"
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsLocklessFifo.h"
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
445cbb940cf6b1fd2b44d66bc40e5c3e8429bbd741Mathias Agopian#include <ui/egl/android_natives.h>
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
48000479f9e325b4e426a67033abd92d47da412725Mathias Agopian
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
51f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#if 0
52f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ(o) { \
53f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    GET_TLS(); \
54ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
55f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams        LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
56f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    } \
57f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams}
58f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ_OR_NULL(o) { \
59f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    GET_TLS(); \
60ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
61f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams        LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
62f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    } \
63f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams}
64f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#else
65f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ(o)
66f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#define CHECK_OBJ_OR_NULL(o)
67f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams#endif
68f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams
69ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukclass Context {
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic:
71d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams    static Context * createContext(Device *, const RsSurfaceConfig *sc);
72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ~Context();
73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
74462d11b880cba72584c135397c0a82618ab63217Jason Sams    static pthread_key_t gThreadTLSKey;
7541c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams    static uint32_t gThreadTLSKeyCount;
767136220b54e68e0c7faac30577ed20b7482481fdJason Sams    static uint32_t gGLContextCount;
7741c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams    static pthread_mutex_t gInitMutex;
7841c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams
79462d11b880cba72584c135397c0a82618ab63217Jason Sams    struct ScriptTLSStruct {
80462d11b880cba72584c135397c0a82618ab63217Jason Sams        Context * mContext;
81462d11b880cba72584c135397c0a82618ab63217Jason Sams        Script * mScript;
82462d11b880cba72584c135397c0a82618ab63217Jason Sams    };
83a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams
84a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    class PushState {
85a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    public:
86a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        PushState(Context *);
87a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ~PushState();
88a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams
89a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    private:
90a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramFragment> mFragment;
91a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramVertex> mVertex;
92a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramStore> mStore;
93a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<ProgramRaster> mRaster;
94a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        ObjectBaseRef<Font> mFont;
95a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams        Context *mRsc;
96a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    };
97a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams
98f166d9b5a280f0ec2ce7e089471c20a1477e2dbbJason Sams    ScriptTLSStruct *mTlsStruct;
9911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams    RsSurfaceConfig mUserSurfaceConfig;
100462d11b880cba72584c135397c0a82618ab63217Jason Sams
1018e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //StructuredAllocationContext mStateAllocation;
104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ElementState mStateElement;
105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState mStateType;
106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    SamplerState mStateSampler;
107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ProgramFragmentState mStateFragment;
10854db59c3594e887a412a24713fc3daa1c2404593Jason Sams    ProgramStoreState mStateFragmentStore;
109ebfb436a49673693b98469683451bd9ede797557Jason Sams    ProgramRasterState mStateRaster;
110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ProgramVertexState mStateVertex;
111bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams    VertexArrayState mStateVertexArray;
1129b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    FontState mStateFont;
113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ScriptCState mScriptC;
115bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams    ShaderCache mShaderCache;
116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void swapBuffers();
118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void setRootScript(Script *);
119a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramRaster(ProgramRaster *);
120a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramVertex(ProgramVertex *);
121a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramFragment(ProgramFragment *);
122a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    void setProgramStore(ProgramStore *);
1239b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    void setFont(Font *);
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void updateSurface(void *sur);
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
127a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramFragment * getProgramFragment() {return mFragment.get();}
128a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramStore * getProgramStore() {return mFragmentStore.get();}
129a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramRaster * getProgramRaster() {return mRaster.get();}
130a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams    ProgramVertex * getProgramVertex() {return mVertex.get();}
1319b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    Font * getFont() {return mFont.get();}
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
133156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams    bool setupCheck();
134feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchouk    void setupProgramStore();
1353b7d39bb51f851ddee441fa34884495217e477f9Jason Sams    bool checkDriver() const {return mEGL.mSurface != 0;}
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);
14165e7aa56f56097418d617663683544c25b3988eaJason Sams
142d5680f9ba95ec7ce212e8025774914e79982a1eeJason Sams    void assignName(ObjectBase *obj, const char *name, uint32_t len);
1433eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    void removeName(ObjectBase *obj);
1449c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams
1451c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait);
1461c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams    RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait);
147add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
148f17bccc9050498f51a32a2ee78f5d5a306008e3dJason Sams    uint32_t runScript(Script *s);
149516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
150516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    void initToClient();
151516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    void deinitToClient();
152516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
1539c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    ProgramFragment * getDefaultProgramFragment() const {
1549c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams        return mStateFragment.mDefault.get();
1559c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    }
1569c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    ProgramVertex * getDefaultProgramVertex() const {
1579c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams        return mStateVertex.mDefault.get();
1589c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    }
15954db59c3594e887a412a24713fc3daa1c2404593Jason Sams    ProgramStore * getDefaultProgramStore() const {
1609c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams        return mStateFragmentStore.mDefault.get();
1619c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams    }
162ebfb436a49673693b98469683451bd9ede797557Jason Sams    ProgramRaster * getDefaultProgramRaster() const {
163ebfb436a49673693b98469683451bd9ede797557Jason Sams        return mStateRaster.mDefault.get();
164ebfb436a49673693b98469683451bd9ede797557Jason Sams    }
1659b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    Font* getDefaultFont() const {
1669b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        return mStateFont.mDefault.get();
1679b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    }
1689c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams
169f603d212552485c634e25f3556f847dc2b022bd5Jason Sams    uint32_t getWidth() const {return mWidth;}
170f603d212552485c634e25f3556f847dc2b022bd5Jason Sams    uint32_t getHeight() const {return mHeight;}
17140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
172add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    mutable ThreadIO mIO;
173bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams
174f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    // Timers
175f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    enum Timers {
176f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_IDLE,
177f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_INTERNAL,
178f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_SCRIPT,
179f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        RS_TIMER_CLEAR_SWAP,
180f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams        _RS_TIMER_TOTAL
181f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    };
182f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    uint64_t getTime() const;
183f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerInit();
184f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerReset();
185f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerSet(Timers);
186f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    void timerPrint();
1872525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    void timerFrame();
188f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams
18966b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams    struct {
19066b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams        bool mLogTimes;
19166b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams        bool mLogScripts;
19266b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams        bool mLogObjects;
1935dad8b4d1fda37b7b4763ef7361c5eb92131cb7eJason Sams        bool mLogShaders;
1944378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        bool mLogShadersAttr;
1954378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        bool mLogShadersUniforms;
1966de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk        bool mLogVisual;
19766b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams    } props;
1989ac2c66f0171593113238635c6a7921c41215e77Joe Onorato
1999dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams    void dumpDebug() const;
200add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    void checkError(const char *, bool isFatal = false) const;
201add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    void setError(RsError e, const char *msg = NULL) const;
2029dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams
203a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    mutable const ObjectBase * mObjHead;
204a9e7a05b84470257637c97d65f6562aa832c66efJason Sams
2052978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;}
206581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    bool ext_GL_NV_texture_npot_2D_mipmap() const {return mGL.GL_NV_texture_npot_2D_mipmap;}
2074378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk    float ext_texture_max_aniso() const {return mGL.EXT_texture_max_aniso; }
208b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    uint32_t getMaxFragmentTextures() const {return mGL.mMaxFragmentTextureImageUnits;}
209b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    uint32_t getMaxFragmentUniformVectors() const {return mGL.mMaxFragmentUniformVectors;}
210b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk    uint32_t getMaxVertexUniformVectors() const {return mGL.mMaxVertexUniformVectors;}
2112978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams
2128e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    void launchThreads(WorkerCallback_t cbk, void *data);
213f3470edc8a929d73797789656ce840aff918dcd0Jason Sams    uint32_t getWorkerPoolSize() const {return (uint32_t)mWorkers.mCount;}
2148e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams
215d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprotected:
216d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Device *mDev;
217d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
218b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams    struct {
219b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLint mNumConfigs;
220b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLint mMajorVersion;
221b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLint mMinorVersion;
222b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLConfig mConfig;
223b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLContext mContext;
224b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLSurface mSurface;
22511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams        EGLSurface mSurfaceDefault;
226b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        EGLDisplay mDisplay;
227b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams    } mEGL;
228b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams
229b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams    struct {
230b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        const uint8_t * mVendor;
231b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        const uint8_t * mRenderer;
232b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        const uint8_t * mVersion;
233b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        const uint8_t * mExtensions;
234b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams
235b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        uint32_t mMajorVersion;
236b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams        uint32_t mMinorVersion;
237b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams
2380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxVaryingVectors;
2390011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxTextureImageUnits;
2400011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
2410011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxFragmentTextureImageUnits;
2420011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxFragmentUniformVectors;
2430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
2440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxVertexAttribs;
2450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxVertexUniformVectors;
2460011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        int32_t mMaxVertexTextureUnits;
2472978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams
2482978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        bool OES_texture_npot;
249581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk        bool GL_NV_texture_npot_2D_mipmap;
2504378f1175546616c76ecb7f0b1159940ab22d5f4Alex Sakhartchouk        float EXT_texture_max_aniso;
251b13ada5071f55c96054c47bbd88d8801cd2c0f15Jason Sams    } mGL;
252d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2533bc47d438171dce294e816366d53bc9eca772c5bJason Sams    uint32_t mWidth;
2543bc47d438171dce294e816366d53bc9eca772c5bJason Sams    uint32_t mHeight;
255b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    int32_t mThreadPriority;
256704ff64b099406bb328898a7443921f22dbffd6dJason Sams    bool mIsGraphicsContext;
2573bc47d438171dce294e816366d53bc9eca772c5bJason Sams
258d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool mRunning;
259d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool mExit;
26065e7aa56f56097418d617663683544c25b3988eaJason Sams    bool mPaused;
261add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams    mutable RsError mError;
262d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
263d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    pthread_t mThreadId;
2647d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    pid_t mNativeThreadId;
265d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2668e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    struct Workers {
2678e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        volatile int mRunningCount;
2688e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        volatile int mLaunchCount;
2698e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        uint32_t mCount;
2708e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        pthread_t *mThreadId;
2718e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        pid_t *mNativeThreadId;
2728e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        Signal mCompleteSignal;
2738e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams
2748e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        Signal *mLaunchSignals;
2758e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        WorkerCallback_t mLaunchCallback;
2768e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams        void *mLaunchData;
2778e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    };
2788e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    Workers mWorkers;
2798e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams
280d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<Script> mRootScript;
281d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<ProgramFragment> mFragment;
282d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<ProgramVertex> mVertex;
28354db59c3594e887a412a24713fc3daa1c2404593Jason Sams    ObjectBaseRef<ProgramStore> mFragmentStore;
284ebfb436a49673693b98469683451bd9ede797557Jason Sams    ObjectBaseRef<ProgramRaster> mRaster;
2859b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    ObjectBaseRef<Font> mFont;
286730ee65d4ddb307898053b623120bad1655fadadJason Sams
2876de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk    void displayDebugStats();
2886de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk
289d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprivate:
290d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Context();
291d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams    bool initContext(Device *, const RsSurfaceConfig *sc);
292d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
293d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams
294d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams    bool initGLThread();
2957136220b54e68e0c7faac30577ed20b7482481fdJason Sams    void deinitEGL();
296d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
297b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t runRootScript();
298d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
299d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    static void * threadProc(void *);
3008e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams    static void * helperThreadProc(void *);
301d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
3028b49bd1a2f8117e1c22884f0150e72cbcf838f32Dianne Hackborn    ANativeWindow *mWndSurface;
3033eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams
3043eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams    Vector<ObjectBase *> mNames;
305f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams
306f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    uint64_t mTimers[_RS_TIMER_TOTAL];
307f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    Timers mTimerActive;
308f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams    uint64_t mTimeLast;
3092525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    uint64_t mTimeFrame;
3102525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    uint64_t mTimeLastFrame;
311b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t mTimeMSLastFrame;
312b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t mTimeMSLastScript;
313b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams    uint32_t mTimeMSLastSwap;
31476322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk    uint32_t mAverageFPSFrameCount;
31576322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk    uint64_t mAverageFPSStartTime;
31676322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk    uint32_t mAverageFPS;
317d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
318d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
319d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
320d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
321d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#endif
322