rsContext.h revision 0f7785c4542855ad5e22e6b720c6bdad1817ac61
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_RS_CONTEXT_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_RS_CONTEXT_H
19ce2baf0d57ee3f1e8a7f07c030595f489407d1ceGilles Debunne
20ce2baf0d57ee3f1e8a7f07c030595f489407d1ceGilles Debunne#include "rsUtils.h"
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsMutex.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsThreadIO.h"
2444c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne#include "rsType.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsMatrix.h"
267609764295d1b3ec0b53d1ae536ee0280f5e0407Mike Cleron#include "rsAllocation.h"
2711f4a48c54f3006778c874662ff04a4d9d157f25Jeff Sharkey#include "rsMesh.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsDevice.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsScriptC.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsAllocation.h"
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsAdapter.h"
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsSampler.h"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsFont.h"
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsProgramFragment.h"
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsProgramStore.h"
368a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov#include "rsProgramRaster.h"
378a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov#include "rsProgramVertex.h"
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsShaderCache.h"
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsVertexArray.h"
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsgApiStructs.h"
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "rsLocklessFifo.h"
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/egl/android_natives.h>
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
4741ec65355bd6ded652769725b276d47c54a0d913Scott Mainnamespace android {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace renderscript {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5154ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson#if 0
5254ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson#define CHECK_OBJ(o) { \
5354ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    GET_TLS(); \
5454ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } \
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CHECK_OBJ_OR_NULL(o) { \
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_TLS(); \
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } \
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CHECK_OBJ(o)
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CHECK_OBJ_OR_NULL(o)
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Context {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static Context * createContext(Device *, const RsSurfaceConfig *sc);
7244c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne    ~Context();
7344c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static pthread_key_t gThreadTLSKey;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static uint32_t gThreadTLSKeyCount;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static uint32_t gGLContextCount;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static pthread_mutex_t gInitMutex;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Library mutex (for providing thread-safe calls from the runtime)
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static pthread_mutex_t gLibMutex;
80617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
81617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    struct ScriptTLSStruct {
82617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        Context * mContext;
83617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        Script * mScript;
84617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    };
85617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
86617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    class PushState {
87617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public:
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PushState(Context *);
8944c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne        ~PushState();
90617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
91617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    private:
9244c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne        ObjectBaseRef<ProgramFragment> mFragment;
9344c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne        ObjectBaseRef<ProgramVertex> mVertex;
940e23ab70919739995a2e2612ddd1dfc2ad3bae76Gilles Debunne        ObjectBaseRef<ProgramStore> mStore;
950e23ab70919739995a2e2612ddd1dfc2ad3bae76Gilles Debunne        ObjectBaseRef<ProgramRaster> mRaster;
9644c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne        ObjectBaseRef<Font> mFont;
970e23ab70919739995a2e2612ddd1dfc2ad3bae76Gilles Debunne        Context *mRsc;
980e23ab70919739995a2e2612ddd1dfc2ad3bae76Gilles Debunne    };
990e23ab70919739995a2e2612ddd1dfc2ad3bae76Gilles Debunne
10044c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne    ScriptTLSStruct *mTlsStruct;
10144c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne    RsSurfaceConfig mUserSurfaceConfig;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1057237c56faea76d43b304562828a443ca766c3c78Romain Guy    //StructuredAllocationContext mStateAllocation;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ElementState mStateElement;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    TypeState mStateType;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SamplerState mStateSampler;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramFragmentState mStateFragment;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramStoreState mStateFragmentStore;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramRasterState mStateRaster;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramVertexState mStateVertex;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    VertexArrayState mStateVertexArray;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FontState mStateFont;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ScriptCState mScriptC;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ShaderCache mShaderCache;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void swapBuffers();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setRootScript(Script *);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setProgramRaster(ProgramRaster *);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setProgramVertex(ProgramVertex *);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setProgramFragment(ProgramFragment *);
124982be3be054960fbf254f225b4aeaee0310e619fJack Veenstra    void setProgramStore(ProgramStore *);
125982be3be054960fbf254f225b4aeaee0310e619fJack Veenstra    void setFont(Font *);
126982be3be054960fbf254f225b4aeaee0310e619fJack Veenstra
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void updateSurface(void *sur);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramFragment * getProgramFragment() {return mFragment.get();}
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramStore * getProgramStore() {return mFragmentStore.get();}
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramRaster * getProgramRaster() {return mRaster.get();}
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramVertex * getProgramVertex() {return mVertex.get();}
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Font * getFont() {return mFont.get();}
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool setupCheck();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setupProgramStore();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1383730bb1cd59bcfa9f5cad8361997b84113ed5923Evan Millar    void pause();
1393730bb1cd59bcfa9f5cad8361997b84113ed5923Evan Millar    void resume();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setSurface(uint32_t w, uint32_t h, ANativeWindow *sur);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setPriority(int32_t p);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void destroyWorkerThreadResources();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void assignName(ObjectBase *obj, const char *name, uint32_t len);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void removeName(ObjectBase *obj);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t runScript(Script *s);
1513730bb1cd59bcfa9f5cad8361997b84113ed5923Evan Millar
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void initToClient();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void deinitToClient();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramFragment * getDefaultProgramFragment() const {
1563730bb1cd59bcfa9f5cad8361997b84113ed5923Evan Millar        return mStateFragment.mDefault.get();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1583730bb1cd59bcfa9f5cad8361997b84113ed5923Evan Millar    ProgramVertex * getDefaultProgramVertex() const {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStateVertex.mDefault.get();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramStore * getDefaultProgramStore() const {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStateFragmentStore.mDefault.get();
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProgramRaster * getDefaultProgramRaster() const {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStateRaster.mDefault.get();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Font* getDefaultFont() const {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStateFont.mDefault.get();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1713730bb1cd59bcfa9f5cad8361997b84113ed5923Evan Millar    uint32_t getWidth() const {return mWidth;}
1727237c56faea76d43b304562828a443ca766c3c78Romain Guy    uint32_t getHeight() const {return mHeight;}
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable ThreadIO mIO;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1765ac413a1d40b04f12d80d65b7c0168b5b225b3e7Svetoslav Ganov    // Timers
1775ac413a1d40b04f12d80d65b7c0168b5b225b3e7Svetoslav Ganov    enum Timers {
1785ac413a1d40b04f12d80d65b7c0168b5b225b3e7Svetoslav Ganov        RS_TIMER_IDLE,
1795ac413a1d40b04f12d80d65b7c0168b5b225b3e7Svetoslav Ganov        RS_TIMER_INTERNAL,
1805ac413a1d40b04f12d80d65b7c0168b5b225b3e7Svetoslav Ganov        RS_TIMER_SCRIPT,
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RS_TIMER_CLEAR_SWAP,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _RS_TIMER_TOTAL
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint64_t getTime() const;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void timerInit();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void timerReset();
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void timerSet(Timers);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void timerPrint();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void timerFrame();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mLogTimes;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mLogScripts;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mLogObjects;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mLogShaders;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mLogShadersAttr;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mLogShadersUniforms;
1980e7d652dbd7cc6415685bece745a752da39179c6Gilles Debunne        bool mLogVisual;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } props;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpDebug() const;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void checkError(const char *, bool isFatal = false) const;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setError(RsError e, const char *msg = NULL) const;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2050e7d652dbd7cc6415685bece745a752da39179c6Gilles Debunne    mutable const ObjectBase * mObjHead;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;}
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool ext_GL_IMG_texture_npot() const {return mGL.GL_IMG_texture_npot;}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool ext_GL_NV_texture_npot_2D_mipmap() const {return mGL.GL_NV_texture_npot_2D_mipmap;}
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float ext_texture_max_aniso() const {return mGL.EXT_texture_max_aniso; }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getMaxFragmentTextures() const {return mGL.mMaxFragmentTextureImageUnits;}
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getMaxFragmentUniformVectors() const {return mGL.mMaxFragmentUniformVectors;}
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getMaxVertexUniformVectors() const {return mGL.mMaxVertexUniformVectors;}
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getMaxVertexAttributes() const {return mGL.mMaxVertexAttribs;}
2157237c56faea76d43b304562828a443ca766c3c78Romain Guy
21653175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra    void launchThreads(WorkerCallback_t cbk, void *data);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getWorkerPoolSize() const {return (uint32_t)mWorkers.mCount;}
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Device *mDev;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint mNumConfigs;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint mMajorVersion;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint mMinorVersion;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig mConfig;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLContext mContext;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLSurface mSurface;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLSurface mSurfaceDefault;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay mDisplay;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } mEGL;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const uint8_t * mVendor;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const uint8_t * mRenderer;
23653175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra        const uint8_t * mVersion;
23753175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra        const uint8_t * mExtensions;
23853175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra
23953175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra        uint32_t mMajorVersion;
24061c9d4b4509aeaab1fcad24fb5a63c874d2fd941Romain Guy        uint32_t mMinorVersion;
24153175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra
24244c1473c03a0021224fa94af9b1e3579ec244b12Gilles Debunne        int32_t mMaxVaryingVectors;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mMaxTextureImageUnits;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mMaxFragmentTextureImageUnits;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mMaxFragmentUniformVectors;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mMaxVertexAttribs;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mMaxVertexUniformVectors;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mMaxVertexTextureUnits;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool OES_texture_npot;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool GL_IMG_texture_npot;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool GL_NV_texture_npot_2D_mipmap;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float EXT_texture_max_aniso;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } mGL;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mWidth;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mHeight;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t mThreadPriority;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mIsGraphicsContext;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mRunning;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mExit;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mPaused;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable RsError mError;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_t mThreadId;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pid_t mNativeThreadId;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct Workers {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        volatile int mRunningCount;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        volatile int mLaunchCount;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t mCount;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_t *mThreadId;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t *mNativeThreadId;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Signal mCompleteSignal;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Signal *mLaunchSignals;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WorkerCallback_t mLaunchCallback;
28153175148c9b962c0ffe9cea0f3dc68bc0196e044Jack Veenstra        void *mLaunchData;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Workers mWorkers;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ObjectBaseRef<Script> mRootScript;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ObjectBaseRef<ProgramFragment> mFragment;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ObjectBaseRef<ProgramVertex> mVertex;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ObjectBaseRef<ProgramStore> mFragmentStore;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ObjectBaseRef<ProgramRaster> mRaster;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ObjectBaseRef<Font> mFont;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void displayDebugStats();
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context();
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool initContext(Device *, const RsSurfaceConfig *sc);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool initGLThread();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void deinitEGL();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t runRootScript();
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void * threadProc(void *);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void * helperThreadProc(void *);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30754ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    ANativeWindow *mWndSurface;
30854ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson
30954ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    Vector<ObjectBase *> mNames;
31054ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson
31154ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint64_t mTimers[_RS_TIMER_TOTAL];
31254ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    Timers mTimerActive;
31354ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint64_t mTimeLast;
31454ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint64_t mTimeFrame;
31554ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint64_t mTimeLastFrame;
31654ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint32_t mTimeMSLastFrame;
31754ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint32_t mTimeMSLastScript;
31854ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint32_t mTimeMSLastSwap;
31954ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint32_t mAverageFPSFrameCount;
32054ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint64_t mAverageFPSStartTime;
32154ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson    uint32_t mAverageFPS;
32254ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson};
32354ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson
32454ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson}
32554ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson}
32654ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson#endif
32754ed87c685fe5a911a622ffef1d5824af6ea95a9Roger Olsson