Home | History | Annotate | Download | only in src
      1 #define _SIZE_T_DEFINED_
      2 typedef unsigned int size_t;
      3 
      4 #include <stdio.h>
      5 #include <stdlib.h>
      6 
      7 #include <EGL/egl.h>
      8 #include <EGL/eglext.h>
      9 #include <GLES/gl.h>
     10 #include <GLES/glext.h>
     11 
     12 #include <utils/threads.h>
     13 #include <pthread.h>
     14 
     15 #include <cutils/log.h>
     16 
     17 #include <assert.h>
     18 
     19 #ifdef __arm__
     20 #ifndef __location__
     21 #define __HIERALLOC_STRING_0__(s)   #s
     22 #define __HIERALLOC_STRING_1__(s)   __HIERALLOC_STRING_0__(s)
     23 #define __HIERALLOC_STRING_2__      __HIERALLOC_STRING_1__(__LINE__)
     24 #define __location__                __FILE__ ":" __HIERALLOC_STRING_2__
     25 #endif
     26 #undef assert
     27 #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); }
     28 //#define printf LOGD
     29 #else // #ifdef __arm__
     30 //#define LOGD printf
     31 #endif // #ifdef __arm__
     32 
     33 
     34 #include <pixelflinger2/pixelflinger2_format.h>
     35 #include <pixelflinger2/pixelflinger2.h>
     36 
     37 #include <map>
     38 
     39 typedef uint8_t                 GGLubyte;               // ub
     40 
     41 #define ggl_likely(x)   __builtin_expect(!!(x), 1)
     42 #define ggl_unlikely(x) __builtin_expect(!!(x), 0)
     43 
     44 #undef NELEM
     45 #define NELEM(x) (sizeof(x)/sizeof(*(x)))
     46 
     47 template<typename T>
     48 inline T max(T a, T b)
     49 {
     50    return a<b ? b : a;
     51 }
     52 
     53 template<typename T>
     54 inline T min(T a, T b)
     55 {
     56    return a<b ? a : b;
     57 }
     58 
     59 struct egl_context_t {
     60    enum {
     61       IS_CURRENT      =   0x00010000,
     62       NEVER_CURRENT   =   0x00020000
     63    };
     64    uint32_t            flags;
     65    EGLDisplay          dpy;
     66    EGLConfig           config;
     67    EGLSurface          read;
     68    EGLSurface          draw;
     69 
     70    unsigned frame;
     71    clock_t lastSwapTime;
     72    float accumulateSeconds;
     73 
     74    static inline egl_context_t* context(EGLContext ctx);
     75 };
     76 
     77 struct GLES2Context;
     78 
     79 #ifdef HAVE_ANDROID_OS
     80 #include <bionic_tls.h>
     81 // We have a dedicated TLS slot in bionic
     82 inline void setGlThreadSpecific(GLES2Context *value)
     83 {
     84    ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value;
     85 }
     86 inline GLES2Context* getGlThreadSpecific()
     87 {
     88    return (GLES2Context *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]);
     89 }
     90 #else
     91 extern pthread_key_t gGLKey;
     92 inline void setGlThreadSpecific(GLES2Context *value)
     93 {
     94    pthread_setspecific(gGLKey, value);
     95 }
     96 inline GLES2Context* getGlThreadSpecific()
     97 {
     98    return static_cast<GLES2Context*>(pthread_getspecific(gGLKey));
     99 }
    100 #endif
    101 
    102 struct VBO {
    103    unsigned size;
    104    GLenum usage;
    105    void * data;
    106 };
    107 
    108 struct GLES2Context {
    109    GGLContext rasterizer;
    110    egl_context_t egl;
    111    GGLInterface * iface; // shortcut to &rasterizer.interface
    112 
    113    struct VertexState {
    114       struct VertAttribPointer {
    115          unsigned size; // number of values per vertex
    116          GLenum type;  // data type
    117          unsigned stride; // bytes
    118          const void * ptr;
    119 bool normalized :
    120          1;
    121 bool enabled :
    122          1;
    123       } attribs [GGL_MAXVERTEXATTRIBS];
    124 
    125       VBO * vbo, * indices;
    126       std::map<GLuint, VBO *> vbos;
    127       GLuint free;
    128 
    129       Vector4 defaultAttribs [GGL_MAXVERTEXATTRIBS];
    130    } vert;
    131 
    132    struct TextureState {
    133       GGLTexture * tmus[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS];
    134       int sampler2tmu[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]; // sampler2tmu[sampler] is index of tmu, -1 means not used
    135       unsigned active;
    136       std::map<GLuint, GGLTexture *> textures;
    137       GLuint free; // first possible free name
    138       GGLTexture * tex2D, * texCube; // default textures
    139       unsigned unpack;
    140 
    141       void UpdateSampler(GGLInterface * iface, unsigned tmu);
    142    } tex;
    143 
    144    GLES2Context();
    145    void InitializeTextures();
    146    void InitializeVertices();
    147 
    148    ~GLES2Context();
    149    void UninitializeTextures();
    150    void UninitializeVertices();
    151 
    152    static inline GLES2Context* get() {
    153       return getGlThreadSpecific();
    154    }
    155 };
    156 
    157 inline egl_context_t* egl_context_t::context(EGLContext ctx)
    158 {
    159    GLES2Context* const gl = static_cast<GLES2Context*>(ctx);
    160    return static_cast<egl_context_t*>(&gl->egl);
    161 }
    162 
    163 #define GLES2_GET_CONTEXT(ctx) GLES2Context * ctx = GLES2Context::get(); \
    164                                  /*puts(__FUNCTION__);*/
    165 #define GLES2_GET_CONST_CONTEXT(ctx) GLES2Context * ctx = GLES2Context::get(); \
    166                                        /*puts(__FUNCTION__);*/
    167