• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>
max(T a,T b)48 inline T max(T a, T b)
49 {
50    return a<b ? b : a;
51 }
52 
53 template<typename T>
min(T a,T b)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
setGlThreadSpecific(GLES2Context * value)82 inline void setGlThreadSpecific(GLES2Context *value)
83 {
84    ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value;
85 }
getGlThreadSpecific()86 inline GLES2Context* getGlThreadSpecific()
87 {
88    return (GLES2Context *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]);
89 }
90 #else
91 extern pthread_key_t gGLKey;
setGlThreadSpecific(GLES2Context * value)92 inline void setGlThreadSpecific(GLES2Context *value)
93 {
94    pthread_setspecific(gGLKey, value);
95 }
getGlThreadSpecific()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 
getGLES2Context152    static inline GLES2Context* get() {
153       return getGlThreadSpecific();
154    }
155 };
156 
context(EGLContext ctx)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