| #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__);*/ |