diff options
Diffstat (limited to 'opengl/libagl2/src/gles2context.h')
-rw-r--r-- | opengl/libagl2/src/gles2context.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/opengl/libagl2/src/gles2context.h b/opengl/libagl2/src/gles2context.h new file mode 100644 index 0000000..cec0340 --- /dev/null +++ b/opengl/libagl2/src/gles2context.h @@ -0,0 +1,166 @@ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; + +#include <stdio.h> +#include <stdlib.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> +#include <GLES/gl.h> +#include <GLES/glext.h> + +#include <utils/threads.h> +#include <pthread.h> + +#include <cutils/log.h> + +#include <assert.h> + +#ifdef __arm__ +#ifndef __location__ +#define __HIERALLOC_STRING_0__(s) #s +#define __HIERALLOC_STRING_1__(s) __HIERALLOC_STRING_0__(s) +#define __HIERALLOC_STRING_2__ __HIERALLOC_STRING_1__(__LINE__) +#define __location__ __FILE__ ":" __HIERALLOC_STRING_2__ +#endif +#undef assert +#define assert(EXPR) { do { if (!(EXPR)) {LOGD("\n*\n*\n*\n* assert fail: '"#EXPR"' at "__location__"\n*\n*\n*\n*"); exit(EXIT_FAILURE); } } while (false); } +//#define printf LOGD +#else // #ifdef __arm__ +//#define LOGD printf +#endif // #ifdef __arm__ + + +#include <pixelflinger2/pixelflinger2_format.h> +#include <pixelflinger2/pixelflinger2.h> + +#include <map> + +typedef uint8_t GGLubyte; // ub + +#define ggl_likely(x) __builtin_expect(!!(x), 1) +#define ggl_unlikely(x) __builtin_expect(!!(x), 0) + +#undef NELEM +#define NELEM(x) (sizeof(x)/sizeof(*(x))) + +template<typename T> +inline T max(T a, T b) +{ + return a<b ? b : a; +} + +template<typename T> +inline T min(T a, T b) +{ + return a<b ? a : b; +} + +struct egl_context_t { + enum { + IS_CURRENT = 0x00010000, + NEVER_CURRENT = 0x00020000 + }; + uint32_t flags; + EGLDisplay dpy; + EGLConfig config; + EGLSurface read; + EGLSurface draw; + + unsigned frame; + clock_t lastSwapTime; + float accumulateSeconds; + + static inline egl_context_t* context(EGLContext ctx); +}; + +struct GLES2Context; + +#ifdef HAVE_ANDROID_OS +#include <bionic_tls.h> +// We have a dedicated TLS slot in bionic +inline void setGlThreadSpecific(GLES2Context *value) +{ + ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value; +} +inline GLES2Context* getGlThreadSpecific() +{ + return (GLES2Context *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]); +} +#else +extern pthread_key_t gGLKey; +inline void setGlThreadSpecific(GLES2Context *value) +{ + pthread_setspecific(gGLKey, value); +} +inline GLES2Context* getGlThreadSpecific() +{ + return static_cast<GLES2Context*>(pthread_getspecific(gGLKey)); +} +#endif + +struct VBO { + unsigned size; + GLenum usage; + void * data; +}; + +struct GLES2Context { + GGLContext rasterizer; + egl_context_t egl; + GGLInterface * iface; // shortcut to &rasterizer.interface + + struct VertexState { + struct VertAttribPointer { + unsigned size; // number of values per vertex + GLenum type; // data type + unsigned stride; // bytes + const void * ptr; +bool normalized : + 1; +bool enabled : + 1; + } attribs [GGL_MAXVERTEXATTRIBS]; + + VBO * vbo, * indices; + std::map<GLuint, VBO *> vbos; + GLuint free; + + Vector4 defaultAttribs [GGL_MAXVERTEXATTRIBS]; + } vert; + + struct TextureState { + GGLTexture * tmus[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]; + int sampler2tmu[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]; // sampler2tmu[sampler] is index of tmu, -1 means not used + unsigned active; + std::map<GLuint, GGLTexture *> textures; + GLuint free; // first possible free name + GGLTexture * tex2D, * texCube; // default textures + unsigned unpack; + + void UpdateSampler(GGLInterface * iface, unsigned tmu); + } tex; + + GLES2Context(); + void InitializeTextures(); + void InitializeVertices(); + + ~GLES2Context(); + void UninitializeTextures(); + void UninitializeVertices(); + + static inline GLES2Context* get() { + return getGlThreadSpecific(); + } +}; + +inline egl_context_t* egl_context_t::context(EGLContext ctx) +{ + GLES2Context* const gl = static_cast<GLES2Context*>(ctx); + return static_cast<egl_context_t*>(&gl->egl); +} + +#define GLES2_GET_CONTEXT(ctx) GLES2Context * ctx = GLES2Context::get(); \ + /*puts(__FUNCTION__);*/ +#define GLES2_GET_CONST_CONTEXT(ctx) GLES2Context * ctx = GLES2Context::get(); \ + /*puts(__FUNCTION__);*/ |