summaryrefslogtreecommitdiffstats
path: root/libs/rs/rsContext.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/rs/rsContext.h')
-rw-r--r--libs/rs/rsContext.h156
1 files changed, 106 insertions, 50 deletions
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 709730e..cafbdff 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -18,21 +18,21 @@
#define ANDROID_RS_CONTEXT_H
#include "rsUtils.h"
+#include "rsMutex.h"
#include "rsThreadIO.h"
#include "rsType.h"
#include "rsMatrix.h"
#include "rsAllocation.h"
-#include "rsSimpleMesh.h"
#include "rsMesh.h"
#include "rsDevice.h"
#include "rsScriptC.h"
#include "rsAllocation.h"
#include "rsAdapter.h"
#include "rsSampler.h"
-#include "rsLight.h"
+#include "rsFont.h"
#include "rsProgramFragment.h"
-#include "rsProgramFragmentStore.h"
+#include "rsProgramStore.h"
#include "rsProgramRaster.h"
#include "rsProgramVertex.h"
#include "rsShaderCache.h"
@@ -48,10 +48,27 @@ namespace android {
namespace renderscript {
-class Context
-{
+#if 0
+#define CHECK_OBJ(o) { \
+ GET_TLS(); \
+ if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \
+ LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \
+ } \
+}
+#define CHECK_OBJ_OR_NULL(o) { \
+ GET_TLS(); \
+ if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \
+ LOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \
+ } \
+}
+#else
+#define CHECK_OBJ(o)
+#define CHECK_OBJ_OR_NULL(o)
+#endif
+
+class Context {
public:
- Context(Device *, bool isGraphics, bool useDepth);
+ static Context * createContext(Device *, const RsSurfaceConfig *sc);
~Context();
static pthread_key_t gThreadTLSKey;
@@ -64,36 +81,57 @@ public:
Script * mScript;
};
+ class PushState {
+ public:
+ PushState(Context *);
+ ~PushState();
+
+ private:
+ ObjectBaseRef<ProgramFragment> mFragment;
+ ObjectBaseRef<ProgramVertex> mVertex;
+ ObjectBaseRef<ProgramStore> mStore;
+ ObjectBaseRef<ProgramRaster> mRaster;
+ ObjectBaseRef<Font> mFont;
+ Context *mRsc;
+ };
+
+ ScriptTLSStruct *mTlsStruct;
+ RsSurfaceConfig mUserSurfaceConfig;
+
+ typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
//StructuredAllocationContext mStateAllocation;
ElementState mStateElement;
TypeState mStateType;
SamplerState mStateSampler;
ProgramFragmentState mStateFragment;
- ProgramFragmentStoreState mStateFragmentStore;
+ ProgramStoreState mStateFragmentStore;
ProgramRasterState mStateRaster;
ProgramVertexState mStateVertex;
- LightState mStateLight;
VertexArrayState mStateVertexArray;
+ FontState mStateFont;
ScriptCState mScriptC;
ShaderCache mShaderCache;
void swapBuffers();
void setRootScript(Script *);
- void setRaster(ProgramRaster *);
- void setVertex(ProgramVertex *);
- void setFragment(ProgramFragment *);
- void setFragmentStore(ProgramFragmentStore *);
+ void setProgramRaster(ProgramRaster *);
+ void setProgramVertex(ProgramVertex *);
+ void setProgramFragment(ProgramFragment *);
+ void setProgramStore(ProgramStore *);
+ void setFont(Font *);
void updateSurface(void *sur);
- const ProgramFragment * getFragment() {return mFragment.get();}
- const ProgramFragmentStore * getFragmentStore() {return mFragmentStore.get();}
- const ProgramRaster * getRaster() {return mRaster.get();}
- const ProgramVertex * getVertex() {return mVertex.get();}
+ ProgramFragment * getProgramFragment() {return mFragment.get();}
+ ProgramStore * getProgramStore() {return mFragmentStore.get();}
+ ProgramRaster * getProgramRaster() {return mRaster.get();}
+ ProgramVertex * getProgramVertex() {return mVertex.get();}
+ Font * getFont() {return mFont.get();}
bool setupCheck();
+ void setupProgramStore();
bool checkDriver() const {return mEGL.mSurface != 0;}
void pause();
@@ -103,12 +141,11 @@ public:
void assignName(ObjectBase *obj, const char *name, uint32_t len);
void removeName(ObjectBase *obj);
- ObjectBase * lookupName(const char *name) const;
- void appendNameDefines(String8 *str) const;
- uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait);
- bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace);
- uint32_t runScript(Script *s, uint32_t launchID);
+ RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait);
+ RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait);
+ bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
+ uint32_t runScript(Script *s);
void initToClient();
void deinitToClient();
@@ -119,19 +156,20 @@ public:
ProgramVertex * getDefaultProgramVertex() const {
return mStateVertex.mDefault.get();
}
- ProgramFragmentStore * getDefaultProgramFragmentStore() const {
+ ProgramStore * getDefaultProgramStore() const {
return mStateFragmentStore.mDefault.get();
}
ProgramRaster * getDefaultProgramRaster() const {
return mStateRaster.mDefault.get();
}
+ Font* getDefaultFont() const {
+ return mStateFont.mDefault.get();
+ }
- uint32_t getWidth() const {return mEGL.mWidth;}
- uint32_t getHeight() const {return mEGL.mHeight;}
-
+ uint32_t getWidth() const {return mWidth;}
+ uint32_t getHeight() const {return mHeight;}
- ThreadIO mIO;
- void objDestroyAdd(ObjectBase *);
+ mutable ThreadIO mIO;
// Timers
enum Timers {
@@ -148,24 +186,31 @@ public:
void timerPrint();
void timerFrame();
- bool checkVersion1_1() const {return (mGL.mMajorVersion > 1) || (mGL.mMinorVersion >= 1); }
- bool checkVersion2_0() const {return mGL.mMajorVersion >= 2; }
-
struct {
bool mLogTimes;
bool mLogScripts;
bool mLogObjects;
bool mLogShaders;
+ bool mLogShadersAttr;
+ bool mLogShadersUniforms;
+ bool mLogVisual;
} props;
void dumpDebug() const;
- void checkError(const char *) const;
- const char * getError(RsError *);
- void setError(RsError e, const char *msg);
+ void checkError(const char *, bool isFatal = false) const;
+ void setError(RsError e, const char *msg = NULL) const;
mutable const ObjectBase * mObjHead;
bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;}
+ bool ext_GL_NV_texture_npot_2D_mipmap() const {return mGL.GL_NV_texture_npot_2D_mipmap;}
+ float ext_texture_max_aniso() const {return mGL.EXT_texture_max_aniso; }
+ uint32_t getMaxFragmentTextures() const {return mGL.mMaxFragmentTextureImageUnits;}
+ uint32_t getMaxFragmentUniformVectors() const {return mGL.mMaxFragmentUniformVectors;}
+ uint32_t getMaxVertexUniformVectors() const {return mGL.mMaxVertexUniformVectors;}
+
+ void launchThreads(WorkerCallback_t cbk, void *data);
+ uint32_t getWorkerPoolSize() const {return (uint32_t)mWorkers.mCount;}
protected:
Device *mDev;
@@ -177,8 +222,7 @@ protected:
EGLConfig mConfig;
EGLContext mContext;
EGLSurface mSurface;
- EGLint mWidth;
- EGLint mHeight;
+ EGLSurface mSurfaceDefault;
EGLDisplay mDisplay;
} mEGL;
@@ -202,6 +246,8 @@ protected:
int32_t mMaxVertexTextureUnits;
bool OES_texture_npot;
+ bool GL_NV_texture_npot_2D_mipmap;
+ float EXT_texture_max_aniso;
} mGL;
uint32_t mWidth;
@@ -211,40 +257,47 @@ protected:
bool mRunning;
bool mExit;
- bool mUseDepth;
bool mPaused;
- RsError mError;
- const char *mErrorMsg;
+ mutable RsError mError;
pthread_t mThreadId;
pid_t mNativeThreadId;
+ struct Workers {
+ volatile int mRunningCount;
+ volatile int mLaunchCount;
+ uint32_t mCount;
+ pthread_t *mThreadId;
+ pid_t *mNativeThreadId;
+ Signal mCompleteSignal;
+
+ Signal *mLaunchSignals;
+ WorkerCallback_t mLaunchCallback;
+ void *mLaunchData;
+ };
+ Workers mWorkers;
+
ObjectBaseRef<Script> mRootScript;
ObjectBaseRef<ProgramFragment> mFragment;
ObjectBaseRef<ProgramVertex> mVertex;
- ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
+ ObjectBaseRef<ProgramStore> mFragmentStore;
ObjectBaseRef<ProgramRaster> mRaster;
+ ObjectBaseRef<Font> mFont;
-
- struct ObjDestroyOOB {
- pthread_mutex_t mMutex;
- Vector<ObjectBase *> mDestroyList;
- bool mNeedToEmpty;
- };
- ObjDestroyOOB mObjDestroy;
- bool objDestroyOOBInit();
- void objDestroyOOBRun();
- void objDestroyOOBDestroy();
+ void displayDebugStats();
private:
Context();
+ bool initContext(Device *, const RsSurfaceConfig *sc);
+
- void initEGL(bool useGL2);
+ bool initGLThread();
void deinitEGL();
uint32_t runRootScript();
static void * threadProc(void *);
+ static void * helperThreadProc(void *);
ANativeWindow *mWndSurface;
@@ -258,6 +311,9 @@ private:
uint32_t mTimeMSLastFrame;
uint32_t mTimeMSLastScript;
uint32_t mTimeMSLastSwap;
+ uint32_t mAverageFPSFrameCount;
+ uint64_t mAverageFPSStartTime;
+ uint32_t mAverageFPS;
};
}