blob: cec0340303f3fe706db7d24c44bf193d21970de2 [file] [log] [blame]
David Liaf94ceb2011-03-01 16:54:04 -08001#define _SIZE_T_DEFINED_
2typedef 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
39typedef 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
47template<typename T>
48inline T max(T a, T b)
49{
50 return a<b ? b : a;
51}
52
53template<typename T>
54inline T min(T a, T b)
55{
56 return a<b ? a : b;
57}
58
59struct 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
77struct GLES2Context;
78
79#ifdef HAVE_ANDROID_OS
80#include <bionic_tls.h>
81// We have a dedicated TLS slot in bionic
82inline void setGlThreadSpecific(GLES2Context *value)
83{
84 ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value;
85}
86inline GLES2Context* getGlThreadSpecific()
87{
88 return (GLES2Context *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]);
89}
90#else
91extern pthread_key_t gGLKey;
92inline void setGlThreadSpecific(GLES2Context *value)
93{
94 pthread_setspecific(gGLKey, value);
95}
96inline GLES2Context* getGlThreadSpecific()
97{
98 return static_cast<GLES2Context*>(pthread_getspecific(gGLKey));
99}
100#endif
101
102struct VBO {
103 unsigned size;
104 GLenum usage;
105 void * data;
106};
107
108struct 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;
119bool normalized :
120 1;
121bool 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
157inline 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__);*/