sync with tizen_2.2
[sdk/emulator/qemu.git] / hw / yagl_drivers / gles1_ogl / yagl_gles1_ogl.c
1 #include <GL/gl.h>
2 #include "yagl_gles1_ogl.h"
3 #include "yagl_drivers/gles_ogl/yagl_gles_ogl_macros.h"
4 #include "yagl_drivers/gles_ogl/yagl_gles_ogl.h"
5 #include "yagl_gles1_driver.h"
6 #include "yagl_dyn_lib.h"
7 #include "yagl_log.h"
8 #include "yagl_process.h"
9 #include "yagl_thread.h"
10 #include "yagl_tls.h"
11 #include <GL/glx.h>
12
13 static YAGL_DEFINE_TLS(struct yagl_thread_state*, gles1_ogl_ts);
14
15 struct yagl_gles1_ogl_ps
16 {
17     struct yagl_gles1_driver_ps base;
18 };
19
20 struct yagl_gles1_ogl
21 {
22     struct yagl_gles1_driver base;
23
24     struct yagl_dyn_lib *dyn_lib;
25
26     struct yagl_gles_ogl *gles_ogl;
27
28     YAGL_GLES_OGL_PROC2(glAlphaFunc, GLenum, GLclampf, func, ref)
29     YAGL_GLES_OGL_PROC4(glColor4f, GLfloat, GLfloat, GLfloat, GLfloat, red, green, blue, alpha)
30     YAGL_GLES_OGL_PROC2(glDepthRangef, GLclampf, GLclampf, zNear, zFar)
31     YAGL_GLES_OGL_PROC2(glFogf, GLenum, GLfloat, pname, param)
32     YAGL_GLES_OGL_PROC2(glFogfv, GLenum, const GLfloat*, pname, params)
33     YAGL_GLES_OGL_PROC3(glGetLightfv, GLenum, GLenum, GLfloat*, light, pname, params)
34     YAGL_GLES_OGL_PROC3(glGetMaterialfv, GLenum, GLenum, GLfloat*, face, pname, params)
35     YAGL_GLES_OGL_PROC3(glGetTexEnvfv, GLenum, GLenum, GLfloat*, env, pname, params)
36     YAGL_GLES_OGL_PROC2(glLightModelf, GLenum, GLfloat, pname, param)
37     YAGL_GLES_OGL_PROC2(glLightModelfv, GLenum, const GLfloat*, pname, params)
38     YAGL_GLES_OGL_PROC3(glLightf, GLenum, GLenum, GLfloat, light, pname, param)
39     YAGL_GLES_OGL_PROC3(glLightfv, GLenum, GLenum, const GLfloat*, light, pname, params)
40     YAGL_GLES_OGL_PROC1(glLoadMatrixf, const GLfloat*, m)
41     YAGL_GLES_OGL_PROC3(glMaterialf, GLenum, GLenum, GLfloat, face, pname, param)
42     YAGL_GLES_OGL_PROC3(glMaterialfv, GLenum, GLenum, const GLfloat*, face, pname, params)
43     YAGL_GLES_OGL_PROC1(glMultMatrixf, const GLfloat*, m)
44     YAGL_GLES_OGL_PROC5(glMultiTexCoord4f, GLenum, GLfloat, GLfloat, GLfloat, GLfloat, target, s, t, r, q)
45     YAGL_GLES_OGL_PROC3(glNormal3f, GLfloat, GLfloat, GLfloat, nx, ny, nz)
46     YAGL_GLES_OGL_PROC2(glPointParameterf, GLenum, GLfloat, pname, param)
47     YAGL_GLES_OGL_PROC2(glPointParameterfv, GLenum, const GLfloat*, pname, params)
48     YAGL_GLES_OGL_PROC1(glPointSize, GLfloat, size)
49     YAGL_GLES_OGL_PROC4(glRotatef, GLfloat, GLfloat, GLfloat, GLfloat, angle, x, y, z)
50     YAGL_GLES_OGL_PROC3(glScalef, GLfloat, GLfloat, GLfloat, x, y, z)
51     YAGL_GLES_OGL_PROC3(glTexEnvf, GLenum, GLenum, GLfloat, target, pname, param)
52     YAGL_GLES_OGL_PROC3(glTexEnvfv, GLenum, GLenum, const GLfloat*, target, pname, params)
53     YAGL_GLES_OGL_PROC3(glTranslatef, GLfloat, GLfloat, GLfloat, x, y, z)
54     YAGL_GLES_OGL_PROC1(glClientActiveTexture, GLenum, texture)
55     YAGL_GLES_OGL_PROC4(glColor4ub, GLubyte, GLubyte, GLubyte, GLubyte, red, green, blue, alpha)
56     YAGL_GLES_OGL_PROC4(glColorPointer, GLint, GLenum, GLsizei, const GLvoid*, size, type, stride, pointer)
57     YAGL_GLES_OGL_PROC1(glDisableClientState, GLenum, array)
58     YAGL_GLES_OGL_PROC1(glEnableClientState, GLenum, array)
59     YAGL_GLES_OGL_PROC2(glGetPointerv, GLenum, GLvoid**, pname, params)
60     YAGL_GLES_OGL_PROC3(glGetTexEnviv, GLenum, GLenum, GLint*, env, pname, params)
61     YAGL_GLES_OGL_PROC0(glLoadIdentity)
62     YAGL_GLES_OGL_PROC1(glLogicOp, GLenum, opcode)
63     YAGL_GLES_OGL_PROC1(glMatrixMode, GLenum, mode)
64     YAGL_GLES_OGL_PROC3(glNormalPointer, GLenum, GLsizei, const GLvoid*, type, stride, pointer)
65     YAGL_GLES_OGL_PROC0(glPopMatrix)
66     YAGL_GLES_OGL_PROC0(glPushMatrix)
67     YAGL_GLES_OGL_PROC1(glShadeModel, GLenum, mode)
68     YAGL_GLES_OGL_PROC4(glTexCoordPointer, GLint, GLenum, GLsizei, const GLvoid*, size, type, stride, pointer)
69     YAGL_GLES_OGL_PROC3(glTexEnvi, GLenum, GLenum, GLint, target, pname, param)
70     YAGL_GLES_OGL_PROC3(glTexEnviv, GLenum, GLenum, const GLint*, target, pname, params)
71     YAGL_GLES_OGL_PROC4(glVertexPointer, GLint, GLenum, GLsizei, const GLvoid*, size, type, stride, pointer)
72 };
73
74 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, AlphaFunc, GLenum, GLclampf, func, ref)
75 YAGL_GLES_OGL_PROC_IMPL4(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Color4f, GLfloat, GLfloat, GLfloat, GLfloat, red, green, blue, alpha)
76 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, DepthRangef, GLclampf, GLclampf, zNear, zFar)
77 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Fogf, GLenum, GLfloat, pname, param)
78 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Fogfv, GLenum, const GLfloat*, pname, params)
79 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, GetLightfv, GLenum, GLenum, GLfloat*, light, pname, params)
80 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, GetMaterialfv, GLenum, GLenum, GLfloat*, face, pname, params)
81 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, GetTexEnvfv, GLenum, GLenum, GLfloat*, env, pname, params)
82 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, LightModelf, GLenum, GLfloat, pname, param)
83 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, LightModelfv, GLenum, const GLfloat*, pname, params)
84 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Lightf, GLenum, GLenum, GLfloat, light, pname, param)
85 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Lightfv, GLenum, GLenum, const GLfloat*, light, pname, params)
86 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, LoadMatrixf, const GLfloat*, m)
87 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Materialf, GLenum, GLenum, GLfloat, face, pname, param)
88 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Materialfv, GLenum, GLenum, const GLfloat*, face, pname, params)
89 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, MultMatrixf, const GLfloat*, m)
90 YAGL_GLES_OGL_PROC_IMPL5(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, MultiTexCoord4f, GLenum, GLfloat, GLfloat, GLfloat, GLfloat, target, s, t, r, q)
91 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Normal3f, GLfloat, GLfloat, GLfloat, nx, ny, nz)
92 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, PointParameterf, GLenum, GLfloat, pname, param)
93 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, PointParameterfv, GLenum, const GLfloat*, pname, params)
94 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, PointSize, GLfloat, size)
95 YAGL_GLES_OGL_PROC_IMPL4(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Rotatef, GLfloat, GLfloat, GLfloat, GLfloat, angle, x, y, z)
96 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Scalef, GLfloat, GLfloat, GLfloat, x, y, z)
97 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, TexEnvf, GLenum, GLenum, GLfloat, target, pname, param)
98 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, TexEnvfv, GLenum, GLenum, const GLfloat*, target, pname, params)
99 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Translatef, GLfloat, GLfloat, GLfloat, x, y, z)
100 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, ClientActiveTexture, GLenum, texture)
101 YAGL_GLES_OGL_PROC_IMPL4(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, Color4ub, GLubyte, GLubyte, GLubyte, GLubyte, red, green, blue, alpha)
102 YAGL_GLES_OGL_PROC_IMPL4(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, ColorPointer, GLint, GLenum, GLsizei, const GLvoid*, size, type, stride, pointer)
103 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, DisableClientState, GLenum, array)
104 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, EnableClientState, GLenum, array)
105 YAGL_GLES_OGL_PROC_IMPL2(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, GetPointerv, GLenum, GLvoid**, pname, params)
106 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, GetTexEnviv, GLenum, GLenum, GLint*, env, pname, params)
107 YAGL_GLES_OGL_PROC_IMPL0(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, LoadIdentity)
108 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, LogicOp, GLenum, opcode)
109 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, MatrixMode, GLenum, mode)
110 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, NormalPointer, GLenum, GLsizei, const GLvoid*, type, stride, pointer)
111 YAGL_GLES_OGL_PROC_IMPL0(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, PopMatrix)
112 YAGL_GLES_OGL_PROC_IMPL0(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, PushMatrix)
113 YAGL_GLES_OGL_PROC_IMPL1(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, ShadeModel, GLenum, mode)
114 YAGL_GLES_OGL_PROC_IMPL4(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, TexCoordPointer, GLint, GLenum, GLsizei, const GLvoid*, size, type, stride, pointer)
115 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, TexEnvi, GLenum, GLenum, GLint, target, pname, param)
116 YAGL_GLES_OGL_PROC_IMPL3(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, TexEnviv, GLenum, GLenum, const GLint*, target, pname, params)
117 YAGL_GLES_OGL_PROC_IMPL4(yagl_gles1_driver_ps, yagl_gles1_driver_ps, yagl_gles1_ogl, VertexPointer, GLint, GLenum, GLsizei, const GLvoid*, size, type, stride, pointer)
118
119 static void yagl_gles1_ogl_thread_init(struct yagl_gles1_driver_ps *driver_ps,
120                                        struct yagl_thread_state *ts)
121 {
122     gles1_ogl_ts = ts;
123
124     YAGL_LOG_FUNC_ENTER_TS(gles1_ogl_ts, yagl_gles1_ogl_thread_init, NULL);
125
126     YAGL_LOG_FUNC_EXIT(NULL);
127 }
128
129 static void yagl_gles1_ogl_thread_fini(struct yagl_gles1_driver_ps *driver_ps)
130 {
131     YAGL_LOG_FUNC_ENTER_TS(gles1_ogl_ts, yagl_gles1_ogl_thread_fini, NULL);
132
133     gles1_ogl_ts = NULL;
134
135     YAGL_LOG_FUNC_EXIT(NULL);
136 }
137
138 static void yagl_gles1_ogl_process_destroy(struct yagl_gles1_driver_ps *driver_ps)
139 {
140     struct yagl_gles1_ogl_ps *gles1_ogl_ps = (struct yagl_gles1_ogl_ps*)driver_ps;
141     struct yagl_gles_ogl_ps *gles_ogl_ps = NULL;
142
143     YAGL_LOG_FUNC_ENTER(driver_ps->common->ps->id, 0, yagl_gles1_ogl_process_destroy, NULL);
144
145     gles_ogl_ps = (struct yagl_gles_ogl_ps*)gles1_ogl_ps->base.common;
146
147     yagl_gles1_driver_ps_cleanup(&gles1_ogl_ps->base);
148
149     yagl_gles_ogl_ps_destroy(gles_ogl_ps);
150
151     g_free(gles1_ogl_ps);
152
153     YAGL_LOG_FUNC_EXIT(NULL);
154 }
155
156 static struct yagl_gles1_driver_ps
157     *yagl_gles1_ogl_process_init(struct yagl_gles1_driver *driver,
158                                  struct yagl_process_state *ps)
159 {
160     struct yagl_gles1_ogl *gles1_ogl = (struct yagl_gles1_ogl*)driver;
161     struct yagl_gles1_ogl_ps *gles1_ogl_ps =
162         g_malloc0(sizeof(struct yagl_gles1_ogl_ps));
163     struct yagl_gles_ogl_ps *gles_ogl_ps = NULL;
164
165     YAGL_LOG_FUNC_ENTER(ps->id, 0, yagl_gles1_ogl_process_init, NULL);
166
167     gles_ogl_ps = yagl_gles_ogl_ps_create(gles1_ogl->gles_ogl, ps);
168     assert(gles_ogl_ps);
169
170     yagl_gles1_driver_ps_init(&gles1_ogl_ps->base, driver, &gles_ogl_ps->base);
171
172     gles1_ogl_ps->base.thread_init = &yagl_gles1_ogl_thread_init;
173     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, AlphaFunc);
174     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Color4f);
175     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, DepthRangef);
176     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Fogf);
177     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Fogfv);
178     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, GetLightfv);
179     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, GetMaterialfv);
180     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, GetTexEnvfv);
181     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, LightModelf);
182     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, LightModelfv);
183     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Lightf);
184     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Lightfv);
185     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, LoadMatrixf);
186     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Materialf);
187     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Materialfv);
188     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, MultMatrixf);
189     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, MultiTexCoord4f);
190     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Normal3f);
191     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, PointParameterf);
192     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, PointParameterfv);
193     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, PointSize);
194     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Rotatef);
195     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Scalef);
196     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, TexEnvf);
197     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, TexEnvfv);
198     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Translatef);
199     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, ClientActiveTexture);
200     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, Color4ub);
201     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, ColorPointer);
202     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, DisableClientState);
203     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, EnableClientState);
204     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, GetPointerv);
205     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, GetTexEnviv);
206     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, LoadIdentity);
207     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, LogicOp);
208     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, MatrixMode);
209     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, NormalPointer);
210     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, PopMatrix);
211     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, PushMatrix);
212     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, ShadeModel);
213     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, TexCoordPointer);
214     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, TexEnvi);
215     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, TexEnviv);
216     YAGL_GLES_OGL_ASSIGN_PROC(yagl_gles1_ogl, gles1_ogl_ps, VertexPointer);
217     gles1_ogl_ps->base.thread_fini = &yagl_gles1_ogl_thread_fini;
218     gles1_ogl_ps->base.destroy = &yagl_gles1_ogl_process_destroy;
219
220     YAGL_LOG_FUNC_EXIT(NULL);
221
222     return &gles1_ogl_ps->base;
223 }
224
225 static void yagl_gles1_ogl_destroy(struct yagl_gles1_driver *driver)
226 {
227     struct yagl_gles1_ogl *gles1_ogl = (struct yagl_gles1_ogl*)driver;
228
229     YAGL_LOG_FUNC_ENTER_NPT(yagl_gles1_ogl_destroy, NULL);
230
231     yagl_gles_ogl_destroy(gles1_ogl->gles_ogl);
232
233     yagl_dyn_lib_destroy(gles1_ogl->dyn_lib);
234
235     yagl_gles1_driver_cleanup(&gles1_ogl->base);
236
237     g_free(gles1_ogl);
238
239     YAGL_LOG_FUNC_EXIT(NULL);
240 }
241
242 struct yagl_gles1_driver *yagl_gles1_ogl_create(void)
243 {
244     struct yagl_gles1_ogl *gles1_ogl = NULL;
245     PFNGLXGETPROCADDRESSPROC get_address = NULL;
246     struct yagl_dyn_lib *dyn_lib = NULL;
247     struct yagl_gles_ogl *gles_ogl = NULL;
248
249     YAGL_LOG_FUNC_ENTER_NPT(yagl_gles1_ogl_create, NULL);
250
251     gles1_ogl = g_malloc0(sizeof(*gles1_ogl));
252
253     yagl_gles1_driver_init(&gles1_ogl->base);
254
255     dyn_lib = yagl_dyn_lib_create();
256
257     if (!dyn_lib) {
258         goto fail;
259     }
260
261     if (!yagl_dyn_lib_load(dyn_lib, "libGL.so.1")) {
262         YAGL_LOG_ERROR("Unable to load libGL.so.1: %s",
263                        yagl_dyn_lib_get_error(dyn_lib));
264         goto fail;
265     }
266
267     gles_ogl = yagl_gles_ogl_create(dyn_lib);
268
269     if (!gles_ogl) {
270         goto fail;
271     }
272
273     get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress");
274
275     if (!get_address) {
276         get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB");
277     }
278
279     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glAlphaFunc);
280     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glColor4f);
281     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glDepthRangef);
282     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glFogf);
283     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glFogfv);
284     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glGetLightfv);
285     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glGetMaterialfv);
286     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glGetTexEnvfv);
287     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLightModelf);
288     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLightModelfv);
289     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLightf);
290     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLightfv);
291     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLoadMatrixf);
292     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glMaterialf);
293     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glMaterialfv);
294     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glMultMatrixf);
295     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glMultiTexCoord4f);
296     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glNormal3f);
297     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glPointParameterf);
298     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glPointParameterfv);
299     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glPointSize);
300     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glRotatef);
301     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glScalef);
302     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glTexEnvf);
303     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glTexEnvfv);
304     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glTranslatef);
305     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glClientActiveTexture);
306     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glColor4ub);
307     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glColorPointer);
308     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glDisableClientState);
309     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glEnableClientState);
310     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glGetPointerv);
311     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glGetTexEnviv);
312     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLoadIdentity);
313     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glLogicOp);
314     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glMatrixMode);
315     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glNormalPointer);
316     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glPopMatrix);
317     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glPushMatrix);
318     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glShadeModel);
319     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glTexCoordPointer);
320     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glTexEnvi);
321     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glTexEnviv);
322     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glVertexPointer);
323
324     gles1_ogl->dyn_lib = dyn_lib;
325     gles1_ogl->gles_ogl = gles_ogl;
326     gles1_ogl->base.process_init = &yagl_gles1_ogl_process_init;
327     gles1_ogl->base.destroy = &yagl_gles1_ogl_destroy;
328
329     YAGL_LOG_FUNC_EXIT(NULL);
330
331     return &gles1_ogl->base;
332
333 fail:
334     if (gles_ogl) {
335         yagl_gles_ogl_destroy(gles_ogl);
336     }
337     if (dyn_lib) {
338         yagl_dyn_lib_destroy(dyn_lib);
339     }
340     yagl_gles1_driver_cleanup(&gles1_ogl->base);
341     g_free(gles1_ogl);
342
343     YAGL_LOG_FUNC_EXIT(NULL);
344
345     return NULL;
346 }