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