|
1 /* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
2 * |
|
3 * Permission is hereby granted, free of charge, to any person obtaining a |
|
4 * copy of this software and /or associated documentation files |
|
5 * (the "Materials "), to deal in the Materials without restriction, |
|
6 * including without limitation the rights to use, copy, modify, merge, |
|
7 * publish, distribute, sublicense, and/or sell copies of the Materials, |
|
8 * and to permit persons to whom the Materials are furnished to do so, |
|
9 * subject to the following conditions: |
|
10 * |
|
11 * The above copyright notice and this permission notice shall be included |
|
12 * in all copies or substantial portions of the Materials. |
|
13 * |
|
14 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|
17 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR |
|
20 * THE USE OR OTHER DEALINGS IN THE MATERIALS. |
|
21 * |
|
22 * Initial Contributors: |
|
23 * Nokia Corporation - initial contribution. |
|
24 * |
|
25 * Contributors: |
|
26 * |
|
27 * Description: |
|
28 * |
|
29 */ |
|
30 |
|
31 #include <GLES/gl.h> |
|
32 #include <GLES/glplatform.h> |
|
33 #include <iostream> |
|
34 #include "GLESDesktopGL.h" |
|
35 #include "glesInternal.h" |
|
36 #include "EGLInterface.h" |
|
37 #include "GLESContext.h" |
|
38 #include "GLESArray.h" |
|
39 #include "GLESTexture.h" |
|
40 #include "glesGet.h" |
|
41 |
|
42 // exit() |
|
43 #include <stdlib.h> |
|
44 // memcpy |
|
45 #include <string.h> |
|
46 |
|
47 #ifdef __cplusplus |
|
48 extern "C" { |
|
49 #endif |
|
50 |
|
51 /* Available only in Common profile */ |
|
52 GL_API void GL_APIENTRY glAlphaFunc (GLenum func, GLclampf ref) |
|
53 { |
|
54 GLES_ENTER(); |
|
55 ctx->DGL().glAlphaFunc (func, ref); |
|
56 GLES_LEAVE(); |
|
57 } |
|
58 GL_API void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) |
|
59 { |
|
60 GLES_ENTER(); |
|
61 ctx->DGL().glClearColor (red, green, blue, alpha); |
|
62 GLES_LEAVE(); |
|
63 } |
|
64 GL_API void GL_APIENTRY glClearDepthf (GLclampf depth) |
|
65 { |
|
66 GLES_ENTER(); |
|
67 ctx->DGL().glClearDepth (depth); |
|
68 GLES_LEAVE(); |
|
69 } |
|
70 GL_API void GL_APIENTRY glClipPlanef (GLenum plane, const GLfloat *equation) |
|
71 { |
|
72 GLES_ENTER(); |
|
73 GLES_ERROR_IF(plane < GL_CLIP_PLANE0 || plane >= GL_CLIP_PLANE0 + ctx->MaxClipPlanes(), GL_INVALID_ENUM); |
|
74 GLdouble dequation[4]; |
|
75 for(int i = 0; i < 4; i++) |
|
76 { |
|
77 dequation[i] = static_cast<GLdouble>(equation[i]); |
|
78 } |
|
79 ctx->DGL().glClipPlane (plane, dequation); |
|
80 GLES_LEAVE(); |
|
81 } |
|
82 GL_API void GL_APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) |
|
83 { |
|
84 GLES_ENTER(); |
|
85 ctx->DGL().glColor4f (red, green, blue, alpha); |
|
86 GLES_LEAVE(); |
|
87 } |
|
88 GL_API void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar) |
|
89 { |
|
90 GLES_ENTER(); |
|
91 ctx->DGL().glDepthRange(zNear, zFar); |
|
92 GLES_LEAVE(); |
|
93 } |
|
94 bool isValidSingleValuedFogParamEnum(GLenum pname) |
|
95 { |
|
96 switch(pname) |
|
97 { |
|
98 case GL_FOG_MODE: |
|
99 case GL_FOG_DENSITY: |
|
100 case GL_FOG_START: |
|
101 case GL_FOG_END: |
|
102 return true; |
|
103 default: |
|
104 return false; |
|
105 } |
|
106 } |
|
107 bool isValidFogParamEnum(GLenum pname) |
|
108 { |
|
109 return isValidSingleValuedFogParamEnum(pname) || pname == GL_FOG_COLOR; |
|
110 } |
|
111 GL_API void GL_APIENTRY glFogf (GLenum pname, GLfloat param) |
|
112 { |
|
113 GLES_ENTER(); |
|
114 GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM); |
|
115 ctx->DGL().glFogf (pname, param); |
|
116 GLES_LEAVE(); |
|
117 } |
|
118 GL_API void GL_APIENTRY glFogfv (GLenum pname, const GLfloat *params) |
|
119 { |
|
120 GLES_ENTER(); |
|
121 GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM); |
|
122 ctx->DGL().glFogfv (pname, params); |
|
123 GLES_LEAVE(); |
|
124 } |
|
125 GL_API void GL_APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) |
|
126 { |
|
127 GLES_ENTER(); |
|
128 ctx->DGL().glFrustum (left, right, bottom, top, zNear, zFar); |
|
129 GLES_LEAVE(); |
|
130 } |
|
131 GL_API void GL_APIENTRY glGetClipPlanef (GLenum pname, GLfloat eqn[4]) |
|
132 { |
|
133 GLES_ENTER(); |
|
134 GLdouble deqn[4]; |
|
135 ctx->DGL().glGetClipPlane (pname, deqn); |
|
136 for(int i = 0; i < 4; i++) |
|
137 { |
|
138 eqn[i] = static_cast<GLfloat>(deqn[i]); |
|
139 } |
|
140 GLES_LEAVE(); |
|
141 } |
|
142 GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *params) |
|
143 { |
|
144 GLES_ENTER(); |
|
145 if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_FLOAT, params)) |
|
146 { |
|
147 GLES_ERROR(GL_INVALID_ENUM); |
|
148 } |
|
149 GLES_LEAVE(); |
|
150 } |
|
151 GL_API void GL_APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params) |
|
152 { |
|
153 GLES_ENTER(); |
|
154 ctx->DGL().glGetLightfv (light, pname, params); |
|
155 GLES_LEAVE(); |
|
156 } |
|
157 GL_API void GL_APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params) |
|
158 { |
|
159 GLES_ENTER(); |
|
160 ctx->DGL().glGetMaterialfv (face, pname, params); |
|
161 GLES_LEAVE(); |
|
162 } |
|
163 bool isValidTexEnvTargetEnum(GLenum target) |
|
164 { |
|
165 switch(target) |
|
166 { |
|
167 case GL_POINT_SPRITE_OES: |
|
168 case GL_TEXTURE_ENV: |
|
169 return true; |
|
170 default: |
|
171 return false; |
|
172 } |
|
173 } |
|
174 bool isValidSingleValuedTexEnvParamEnum(GLenum pname) |
|
175 { |
|
176 switch(pname) |
|
177 { |
|
178 case GL_TEXTURE_ENV_MODE: |
|
179 case GL_COORD_REPLACE_OES: |
|
180 case GL_COMBINE_RGB: |
|
181 case GL_COMBINE_ALPHA: |
|
182 case GL_SRC0_RGB: |
|
183 case GL_SRC1_RGB: |
|
184 case GL_SRC2_RGB: |
|
185 case GL_SRC0_ALPHA: |
|
186 case GL_SRC1_ALPHA: |
|
187 case GL_SRC2_ALPHA: |
|
188 case GL_OPERAND0_RGB: |
|
189 case GL_OPERAND1_RGB: |
|
190 case GL_OPERAND2_RGB: |
|
191 case GL_OPERAND0_ALPHA: |
|
192 case GL_OPERAND1_ALPHA: |
|
193 case GL_OPERAND2_ALPHA: |
|
194 case GL_RGB_SCALE: |
|
195 case GL_ALPHA_SCALE: |
|
196 return true; |
|
197 default: |
|
198 return false; |
|
199 } |
|
200 } |
|
201 bool isValidTexEnvParamEnum(GLenum pname) |
|
202 { |
|
203 return isValidSingleValuedTexEnvParamEnum(pname) || pname == GL_TEXTURE_ENV_COLOR; |
|
204 } |
|
205 GL_API void GL_APIENTRY glGetTexEnvfv (GLenum env, GLenum pname, GLfloat *params) |
|
206 { |
|
207 GLES_ENTER(); |
|
208 GLES_ERROR_IF(!isValidTexEnvTargetEnum(env), GL_INVALID_ENUM); |
|
209 GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
210 env = env == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : env; |
|
211 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
212 ctx->DGL().glGetTexEnvfv (env, pname, params); |
|
213 GLES_LEAVE(); |
|
214 } |
|
215 bool isValidTexParamEnum(GLenum pname) |
|
216 { |
|
217 switch(pname) |
|
218 { |
|
219 case GL_TEXTURE_MIN_FILTER: |
|
220 case GL_TEXTURE_MAG_FILTER: |
|
221 case GL_TEXTURE_WRAP_S: |
|
222 case GL_TEXTURE_WRAP_T: |
|
223 case GL_GENERATE_MIPMAP: |
|
224 return true; |
|
225 default: |
|
226 return false; |
|
227 } |
|
228 } |
|
229 GL_API void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params) |
|
230 { |
|
231 GLES_ENTER(); |
|
232 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
233 ctx->DGL().glGetTexParameterfv (target, pname, params); |
|
234 GLES_LEAVE(); |
|
235 } |
|
236 bool isValidLightModelParamEnum(GLenum pname) |
|
237 { |
|
238 switch(pname) |
|
239 { |
|
240 case GL_LIGHT_MODEL_AMBIENT: |
|
241 case GL_LIGHT_MODEL_TWO_SIDE: |
|
242 return true; |
|
243 default: |
|
244 return false; |
|
245 } |
|
246 } |
|
247 GL_API void GL_APIENTRY glLightModelf (GLenum pname, GLfloat param) |
|
248 { |
|
249 GLES_ENTER(); |
|
250 GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM); |
|
251 ctx->DGL().glLightModelf (pname, param); |
|
252 GLES_LEAVE(); |
|
253 } |
|
254 GL_API void GL_APIENTRY glLightModelfv (GLenum pname, const GLfloat *params) |
|
255 { |
|
256 GLES_ENTER(); |
|
257 GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM); |
|
258 ctx->DGL().glLightModelfv (pname, params); |
|
259 GLES_LEAVE(); |
|
260 } |
|
261 GL_API void GL_APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param) |
|
262 { |
|
263 GLES_ENTER(); |
|
264 ctx->DGL().glLightf (light, pname, param); |
|
265 GLES_LEAVE(); |
|
266 } |
|
267 GL_API void GL_APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params) |
|
268 { |
|
269 GLES_ENTER(); |
|
270 ctx->DGL().glLightfv (light, pname, params); |
|
271 GLES_LEAVE(); |
|
272 } |
|
273 GL_API void GL_APIENTRY glLineWidth (GLfloat width) |
|
274 { |
|
275 GLES_ENTER(); |
|
276 ctx->DGL().glLineWidth (width); |
|
277 GLES_LEAVE(); |
|
278 } |
|
279 GL_API void GL_APIENTRY glLoadMatrixf (const GLfloat *m) |
|
280 { |
|
281 GLES_ENTER(); |
|
282 ctx->DGL().glLoadMatrixf (m); |
|
283 GLES_LEAVE(); |
|
284 } |
|
285 GL_API void GL_APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param) |
|
286 { |
|
287 GLES_ENTER(); |
|
288 ctx->DGL().glMaterialf (face, pname, param); |
|
289 GLES_LEAVE(); |
|
290 } |
|
291 bool isValidSingleValuedMaterialParamEnum(GLenum pname) |
|
292 { |
|
293 return pname == GL_SHININESS; |
|
294 } |
|
295 bool isValidMaterialParamEnum(GLenum pname) |
|
296 { |
|
297 if(isValidSingleValuedMaterialParamEnum(pname)) |
|
298 { |
|
299 return true; |
|
300 } |
|
301 else |
|
302 { |
|
303 switch(pname) |
|
304 { |
|
305 case GL_AMBIENT: |
|
306 case GL_DIFFUSE: |
|
307 case GL_AMBIENT_AND_DIFFUSE: |
|
308 case GL_SPECULAR: |
|
309 case GL_EMISSION: |
|
310 case GL_SHININESS: |
|
311 return true; |
|
312 default: |
|
313 return false; |
|
314 } |
|
315 } |
|
316 } |
|
317 GL_API void GL_APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params) |
|
318 { |
|
319 GLES_ENTER(); |
|
320 GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM); |
|
321 ctx->DGL().glMaterialfv (face, pname, params); |
|
322 GLES_LEAVE(); |
|
323 } |
|
324 GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m) |
|
325 { |
|
326 GLES_ENTER(); |
|
327 ctx->DGL().glMultMatrixf(m); |
|
328 GLES_LEAVE(); |
|
329 } |
|
330 bool isValidTextureTargetEnum(GLenum target, unsigned int maxTextureUnits) |
|
331 { |
|
332 return target >= GL_TEXTURE0 && target < GL_TEXTURE0 + maxTextureUnits; |
|
333 } |
|
334 GL_API void GL_APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) |
|
335 { |
|
336 GLES_ENTER(); |
|
337 GLES_ERROR_IF(!isValidTextureTargetEnum(target, ctx->MaxTextureUnits()), GL_INVALID_ENUM); |
|
338 ctx->DGL().glMultiTexCoord4f(target, s, t, r, q); |
|
339 GLES_LEAVE(); |
|
340 } |
|
341 GL_API void GL_APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz) |
|
342 { |
|
343 GLES_ENTER(); |
|
344 ctx->DGL().glNormal3f(nx, ny, nz); |
|
345 GLES_LEAVE(); |
|
346 } |
|
347 GL_API void GL_APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) |
|
348 { |
|
349 GLES_ENTER(); |
|
350 ctx->DGL().glOrtho(left, right, bottom, top, zNear, zFar); |
|
351 GLES_LEAVE(); |
|
352 } |
|
353 GL_API void GL_APIENTRY glPointParameterf (GLenum pname, GLfloat param) |
|
354 { |
|
355 GLES_ENTER(); |
|
356 ctx->DGL().glPointParameterf (pname, param); |
|
357 GLES_LEAVE(); |
|
358 } |
|
359 GL_API void GL_APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params) |
|
360 { |
|
361 GLES_ENTER(); |
|
362 ctx->DGL().glPointParameterfv (pname, params); |
|
363 GLES_LEAVE(); |
|
364 } |
|
365 GL_API void GL_APIENTRY glPointSize (GLfloat size) |
|
366 { |
|
367 GLES_ENTER(); |
|
368 ctx->DGL().glPointSize (size); |
|
369 GLES_LEAVE(); |
|
370 } |
|
371 GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units) |
|
372 { |
|
373 GLES_ENTER(); |
|
374 ctx->DGL().glPolygonOffset (factor, units); |
|
375 GLES_LEAVE(); |
|
376 } |
|
377 GL_API void GL_APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) |
|
378 { |
|
379 GLES_ENTER(); |
|
380 ctx->DGL().glRotatef (angle, x, y, z); |
|
381 GLES_LEAVE(); |
|
382 } |
|
383 GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z) |
|
384 { |
|
385 GLES_ENTER(); |
|
386 ctx->DGL().glScalef (x, y, z); |
|
387 GLES_LEAVE(); |
|
388 } |
|
389 GL_API void GL_APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param) |
|
390 { |
|
391 GLES_ENTER(); |
|
392 GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM); |
|
393 GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
394 target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target; |
|
395 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
396 ctx->DGL().glTexEnvf (target, pname, param); |
|
397 GLES_LEAVE(); |
|
398 } |
|
399 GL_API void GL_APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params) |
|
400 { |
|
401 GLES_ENTER(); |
|
402 GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM); |
|
403 GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
404 target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target; |
|
405 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
406 ctx->DGL().glTexEnvfv (target, pname, params); |
|
407 GLES_LEAVE(); |
|
408 } |
|
409 GL_API void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param) |
|
410 { |
|
411 GLES_ENTER(); |
|
412 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
413 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
414 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
415 ctx->DGL().glTexParameterf (target, pname, param); |
|
416 GLES_LEAVE(); |
|
417 } |
|
418 GL_API void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params) |
|
419 { |
|
420 GLES_ENTER(); |
|
421 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
422 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
423 target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target; |
|
424 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
425 ctx->DGL().glTexParameterfv (target, pname, params); |
|
426 GLES_LEAVE(); |
|
427 } |
|
428 GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z) |
|
429 { |
|
430 GLES_ENTER(); |
|
431 ctx->DGL().glTranslatef (x, y, z); |
|
432 GLES_LEAVE(); |
|
433 } |
|
434 |
|
435 /* Available in both Common and Common-Lite profiles */ |
|
436 GL_API void GL_APIENTRY glActiveTexture (GLenum texture) |
|
437 { |
|
438 GLES_ENTER(); |
|
439 GLES_ERROR_IF(!isValidTextureTargetEnum(texture, ctx->MaxTextureUnits()), GL_INVALID_ENUM); |
|
440 ctx->DGL().glActiveTexture (texture); |
|
441 GLES_LEAVE(); |
|
442 } |
|
443 GL_API void GL_APIENTRY glAlphaFuncx (GLenum func, GLclampx ref) |
|
444 { |
|
445 GLES_ENTER(); |
|
446 ctx->DGL().glAlphaFunc(func, X_TO_F(ref)); |
|
447 GLES_LEAVE(); |
|
448 } |
|
449 bool isValidBufferTarget(GLenum target) |
|
450 { |
|
451 switch(target) |
|
452 { |
|
453 case GL_ARRAY_BUFFER: |
|
454 case GL_ELEMENT_ARRAY_BUFFER: |
|
455 return true; |
|
456 default: |
|
457 return false; |
|
458 } |
|
459 } |
|
460 GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer) |
|
461 { |
|
462 GLES_ENTER(); |
|
463 GLES_ERROR_IF(!isValidBufferTarget(target), GL_INVALID_ENUM); |
|
464 switch(target) |
|
465 { |
|
466 case GL_ARRAY_BUFFER: |
|
467 if(!ctx->BindArrayBuffer(buffer)) |
|
468 { |
|
469 GLES_ERROR(GL_OUT_OF_MEMORY); |
|
470 } |
|
471 break; |
|
472 case GL_ELEMENT_ARRAY_BUFFER: |
|
473 if(!ctx->BindElementArrayBuffer(buffer)) |
|
474 { |
|
475 GLES_ERROR(GL_OUT_OF_MEMORY); |
|
476 } |
|
477 break; |
|
478 default: |
|
479 GLES_ERROR(GL_INVALID_ENUM); |
|
480 } |
|
481 GLES_LEAVE(); |
|
482 } |
|
483 GL_API void GL_APIENTRY glBindTexture (GLenum target, GLuint texture) |
|
484 { |
|
485 GLES_ENTER(); |
|
486 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
487 ctx->GetHostError(); |
|
488 ctx->DGL().glBindTexture (target, texture); |
|
489 if(ctx->GetHostError() == GL_NO_ERROR) |
|
490 { |
|
491 ctx->BindTexture(texture); |
|
492 } |
|
493 GLES_LEAVE(); |
|
494 } |
|
495 bool isValidSrcBlendFuncEnum(GLenum func) |
|
496 { |
|
497 switch(func) |
|
498 { |
|
499 case GL_ZERO: |
|
500 case GL_ONE: |
|
501 case GL_DST_COLOR: |
|
502 case GL_ONE_MINUS_DST_COLOR: |
|
503 case GL_SRC_ALPHA: |
|
504 case GL_ONE_MINUS_SRC_ALPHA: |
|
505 case GL_DST_ALPHA: |
|
506 case GL_ONE_MINUS_DST_ALPHA: |
|
507 case GL_SRC_ALPHA_SATURATE: |
|
508 return true; |
|
509 default: |
|
510 return false; |
|
511 } |
|
512 } |
|
513 bool isValidDstBlendFuncEnum(GLenum func) |
|
514 { |
|
515 switch(func) |
|
516 { |
|
517 case GL_ZERO: |
|
518 case GL_ONE: |
|
519 case GL_SRC_COLOR: |
|
520 case GL_ONE_MINUS_SRC_COLOR: |
|
521 case GL_SRC_ALPHA: |
|
522 case GL_ONE_MINUS_SRC_ALPHA: |
|
523 case GL_DST_ALPHA: |
|
524 case GL_ONE_MINUS_DST_ALPHA: |
|
525 return true; |
|
526 default: |
|
527 return false; |
|
528 } |
|
529 } |
|
530 GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor) |
|
531 { |
|
532 GLES_ENTER(); |
|
533 GLES_ERROR_IF(!isValidSrcBlendFuncEnum(sfactor), GL_INVALID_ENUM); |
|
534 GLES_ERROR_IF(!isValidDstBlendFuncEnum(dfactor), GL_INVALID_ENUM); |
|
535 ctx->DGL().glBlendFunc (sfactor, dfactor); |
|
536 GLES_LEAVE(); |
|
537 } |
|
538 GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) |
|
539 { |
|
540 GLES_ENTER(); |
|
541 GLES_ERROR_IF(size < 0, GL_INVALID_VALUE); |
|
542 GLES_ERROR_IF(usage != GL_STATIC_DRAW && usage != GL_DYNAMIC_DRAW, GL_INVALID_ENUM); |
|
543 |
|
544 GLESBuffer* buffer; |
|
545 switch(target) |
|
546 { |
|
547 case GL_ARRAY_BUFFER: |
|
548 GLES_ERROR_IF(ctx->ArrayBufferBinding() == 0, GL_INVALID_OPERATION); |
|
549 buffer = ctx->ArrayBuffer(); |
|
550 break; |
|
551 case GL_ELEMENT_ARRAY_BUFFER: |
|
552 GLES_ERROR_IF(ctx->ElementArrayBufferBinding() == 0, GL_INVALID_OPERATION); |
|
553 buffer = ctx->ElementArrayBuffer(); |
|
554 break; |
|
555 default: |
|
556 GLES_ERROR(GL_INVALID_ENUM); |
|
557 } |
|
558 GLES_ASSERT(buffer); |
|
559 |
|
560 delete[] buffer->data; |
|
561 buffer->data = GLES_NEW char[size]; |
|
562 if(buffer->data == NULL) |
|
563 { |
|
564 GLES_ERROR(GL_OUT_OF_MEMORY); |
|
565 } |
|
566 |
|
567 if(data != NULL) |
|
568 { |
|
569 memcpy(buffer->data, data, size); |
|
570 } |
|
571 |
|
572 buffer->size = size; |
|
573 buffer->usage = usage; |
|
574 |
|
575 GLES_LEAVE(); |
|
576 } |
|
577 GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data) |
|
578 { |
|
579 GLES_ENTER(); |
|
580 GLES_ERROR_IF(offset < 0, GL_INVALID_VALUE); |
|
581 GLES_ERROR_IF(size < 0, GL_INVALID_VALUE); |
|
582 |
|
583 GLESBuffer* buffer; |
|
584 switch(target) |
|
585 { |
|
586 case GL_ARRAY_BUFFER: |
|
587 GLES_ERROR_IF(ctx->ArrayBufferBinding() == 0, GL_INVALID_OPERATION); |
|
588 buffer = ctx->ArrayBuffer(); |
|
589 break; |
|
590 case GL_ELEMENT_ARRAY_BUFFER: |
|
591 GLES_ERROR_IF(ctx->ElementArrayBufferBinding() == 0, GL_INVALID_OPERATION); |
|
592 buffer = ctx->ElementArrayBuffer(); |
|
593 break; |
|
594 default: |
|
595 GLES_ERROR(GL_INVALID_ENUM); |
|
596 } |
|
597 GLES_ASSERT(buffer); |
|
598 |
|
599 GLES_ERROR_IF(size + offset > buffer->size, GL_INVALID_VALUE); |
|
600 memcpy(static_cast<char*>(buffer->data) + offset, data, size); |
|
601 |
|
602 GLES_LEAVE(); |
|
603 } |
|
604 GL_API void GL_APIENTRY glClear (GLbitfield mask) |
|
605 { |
|
606 GLES_ENTER(); |
|
607 GLES_LOCK_DRAW_SURFACE(); |
|
608 ctx->DGL().glClear (mask); |
|
609 GLES_UNLOCK_SURFACE(); |
|
610 GLES_LEAVE(); |
|
611 } |
|
612 GL_API void GL_APIENTRY glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) |
|
613 { |
|
614 GLES_ENTER(); |
|
615 ctx->DGL().glClearColor (X_TO_F(red), X_TO_F(green), X_TO_F(blue), X_TO_F(alpha)); |
|
616 GLES_LEAVE(); |
|
617 } |
|
618 GL_API void GL_APIENTRY glClearDepthx (GLclampx depth) |
|
619 { |
|
620 GLES_ENTER(); |
|
621 ctx->DGL().glClearDepth (X_TO_D(depth)); |
|
622 GLES_LEAVE(); |
|
623 } |
|
624 GL_API void GL_APIENTRY glClearStencil (GLint s) |
|
625 { |
|
626 GLES_ENTER(); |
|
627 ctx->DGL().glClearStencil (s); |
|
628 GLES_LEAVE(); |
|
629 } |
|
630 GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture) |
|
631 { |
|
632 GLES_ENTER(); |
|
633 GLES_ERROR_IF(!isValidTextureTargetEnum(texture, ctx->MaxTextureUnits()), GL_INVALID_ENUM); |
|
634 ctx->GetHostError(); |
|
635 ctx->DGL().glClientActiveTexture (texture); |
|
636 if(ctx->GetHostError() == GL_NO_ERROR) |
|
637 { |
|
638 ctx->SetClientActiveTexture(texture - GL_TEXTURE0); |
|
639 } |
|
640 GLES_LEAVE_NO_ERROR_CHECK(); |
|
641 } |
|
642 GL_API void GL_APIENTRY glClipPlanex (GLenum plane, const GLfixed *equation) |
|
643 { |
|
644 GLES_ENTER(); |
|
645 GLdouble dequation[4]; |
|
646 for(int i = 0; i < 4; i++) |
|
647 { |
|
648 dequation[i] = X_TO_D(equation[i]); |
|
649 } |
|
650 ctx->DGL().glClipPlane (plane, dequation); |
|
651 GLES_LEAVE(); |
|
652 } |
|
653 GL_API void GL_APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) |
|
654 { |
|
655 GLES_ENTER(); |
|
656 ctx->DGL().glColor4ub (red, green, blue, alpha); |
|
657 GLES_LEAVE(); |
|
658 } |
|
659 GL_API void GL_APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) |
|
660 { |
|
661 GLES_ENTER(); |
|
662 ctx->DGL().glColor4d(X_TO_D(red), X_TO_D(green), X_TO_D(blue), X_TO_D(alpha)); |
|
663 GLES_LEAVE(); |
|
664 } |
|
665 GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) |
|
666 { |
|
667 GLES_ENTER(); |
|
668 ctx->DGL().glColorMask (red, green, blue, alpha); |
|
669 GLES_LEAVE(); |
|
670 } |
|
671 GL_API void GL_APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) |
|
672 { |
|
673 GLES_ENTER(); |
|
674 GLES_ERROR_IF(size != 4, GL_INVALID_VALUE); |
|
675 GLES_ERROR_IF(type != GL_UNSIGNED_BYTE && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM); |
|
676 GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE); |
|
677 ctx->SetColorArray(size, type, stride, pointer); |
|
678 GLES_LEAVE(); |
|
679 } |
|
680 GL_API void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) |
|
681 { |
|
682 GLES_ENTER(); |
|
683 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
684 GLES_ERROR_IF(level > 0, GL_INVALID_VALUE); |
|
685 GLES_ERROR_IF(!glesIsValidCompressedFormat(internalformat), GL_INVALID_ENUM); |
|
686 GLES_ERROR_IF(height < 0, GL_INVALID_VALUE); |
|
687 GLES_ERROR_IF(width < 0, GL_INVALID_VALUE); |
|
688 GLES_ERROR_IF(height > 0 && !glesIsPowerOfTwo(height), GL_INVALID_VALUE); |
|
689 GLES_ERROR_IF(width > 0 && !glesIsPowerOfTwo(width), GL_INVALID_VALUE); |
|
690 GLES_ERROR_IF(imageSize < 0, GL_INVALID_VALUE); |
|
691 |
|
692 GLenum baseFormat = glesMapCompressedToBaseFormat(internalformat); |
|
693 |
|
694 int numLevels = -level + 1; |
|
695 for(int curLevel = 0; curLevel < numLevels; curLevel++) |
|
696 { |
|
697 if(data != NULL) |
|
698 { |
|
699 void* uncompressedData = glesUncompressImage(curLevel, internalformat, width, height, imageSize, data); |
|
700 if(uncompressedData == NULL) |
|
701 { |
|
702 GLES_ERROR(GL_OUT_OF_MEMORY); |
|
703 } |
|
704 ctx->DGL().glTexImage2D(target, curLevel, baseFormat, width, height, border, baseFormat, GL_UNSIGNED_BYTE, uncompressedData); |
|
705 delete uncompressedData; |
|
706 } |
|
707 else |
|
708 { |
|
709 ctx->DGL().glTexImage2D(target, curLevel, baseFormat, width, height, border, baseFormat, GL_UNSIGNED_BYTE, NULL); |
|
710 } |
|
711 |
|
712 if(ctx->GetHostError() == GL_NO_ERROR) |
|
713 { |
|
714 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
715 GLES_ASSERT(texture != NULL); |
|
716 texture->SetLevel(level, internalformat, width, height); |
|
717 |
|
718 if(texture->Level(level)->boundSurface != NULL) |
|
719 { |
|
720 // Texture is respecified. Release the bound EGLSurface. |
|
721 glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level); |
|
722 texture->Level(level)->boundSurface = NULL; |
|
723 } |
|
724 } |
|
725 |
|
726 width /= 2; |
|
727 height /= 2; |
|
728 } |
|
729 |
|
730 GLES_LEAVE(); |
|
731 } |
|
732 static bool isPalettedFormat(GLenum format) |
|
733 { |
|
734 switch(format) |
|
735 { |
|
736 case GL_PALETTE4_RGB8_OES: |
|
737 case GL_PALETTE4_RGBA8_OES: |
|
738 case GL_PALETTE4_R5_G6_B5_OES: |
|
739 case GL_PALETTE4_RGBA4_OES: |
|
740 case GL_PALETTE4_RGB5_A1_OES: |
|
741 case GL_PALETTE8_RGB8_OES: |
|
742 case GL_PALETTE8_RGBA8_OES: |
|
743 case GL_PALETTE8_R5_G6_B5_OES: |
|
744 case GL_PALETTE8_RGBA4_OES: |
|
745 case GL_PALETTE8_RGB5_A1_OES: |
|
746 return true; |
|
747 default: |
|
748 return false; |
|
749 } |
|
750 } |
|
751 GL_API void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) |
|
752 { |
|
753 GLES_ENTER(); |
|
754 GLES_ERROR_IF(!isPalettedFormat(format), GL_INVALID_ENUM); |
|
755 // Not supported for compressed paletted textures. |
|
756 GLES_ERROR(GL_INVALID_OPERATION); |
|
757 GLES_LEAVE(); |
|
758 } |
|
759 bool isValidPixelFormatEnum(GLenum format) |
|
760 { |
|
761 switch(format) |
|
762 { |
|
763 case GL_ALPHA: |
|
764 case GL_LUMINANCE: |
|
765 case GL_LUMINANCE_ALPHA: |
|
766 case GL_RGB: |
|
767 case GL_RGBA: |
|
768 return true; |
|
769 default: |
|
770 return false; |
|
771 } |
|
772 } |
|
773 GL_API void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) |
|
774 { |
|
775 GLES_ENTER(); |
|
776 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
777 GLES_ERROR_IF(!isValidPixelFormatEnum(internalformat), GL_INVALID_ENUM); |
|
778 |
|
779 GLES_LOCK_READ_SURFACE(); |
|
780 ctx->DGL().glCopyTexImage2D (target, level, internalformat, x, y, width, height, border); |
|
781 GLES_UNLOCK_SURFACE(); |
|
782 |
|
783 if(ctx->GetHostError() == GL_NO_ERROR) |
|
784 { |
|
785 GLint genMipmap; |
|
786 ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap); |
|
787 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
788 GLES_ASSERT(texture != NULL); |
|
789 if(level == 0 && genMipmap) |
|
790 { |
|
791 texture->GenerateMipmap(); |
|
792 } |
|
793 |
|
794 if(texture->Level(level)->boundSurface != NULL) |
|
795 { |
|
796 // Texture is respecified. Release the bound EGLSurface. |
|
797 glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level); |
|
798 texture->Level(level)->boundSurface = NULL; |
|
799 } |
|
800 } |
|
801 |
|
802 GLES_LEAVE(); |
|
803 } |
|
804 GL_API void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) |
|
805 { |
|
806 GLES_ENTER(); |
|
807 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
808 |
|
809 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
810 GLES_ASSERT(texture != NULL); |
|
811 const GLESTextureLevel* level_obj = texture->Level(level); |
|
812 if(isPalettedFormat(level_obj->format)) |
|
813 { |
|
814 GLES_ERROR(GL_INVALID_OPERATION); |
|
815 } |
|
816 |
|
817 GLES_LOCK_READ_SURFACE(); |
|
818 ctx->DGL().glCopyTexSubImage2D (target, level, xoffset, yoffset, x, y, width, height); |
|
819 GLES_UNLOCK_SURFACE(); |
|
820 |
|
821 if(ctx->GetHostError() == GL_NO_ERROR) |
|
822 { |
|
823 GLint genMipmap; |
|
824 ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap); |
|
825 if(level == 0 && genMipmap) |
|
826 { |
|
827 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
828 GLES_ASSERT(texture != NULL); |
|
829 texture->GenerateMipmap(); |
|
830 } |
|
831 } |
|
832 |
|
833 GLES_LEAVE(); |
|
834 } |
|
835 GL_API void GL_APIENTRY glCullFace (GLenum mode) |
|
836 { |
|
837 GLES_ENTER(); |
|
838 ctx->DGL().glCullFace (mode); |
|
839 GLES_LEAVE(); |
|
840 } |
|
841 GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers) |
|
842 { |
|
843 GLES_ENTER(); |
|
844 GLES_ERROR_IF(n < 0, GL_INVALID_VALUE); |
|
845 for(int i = 0; i < n; i++) |
|
846 { |
|
847 ctx->DeleteBuffer(buffers[i]); |
|
848 } |
|
849 GLES_LEAVE(); |
|
850 } |
|
851 GL_API void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures) |
|
852 { |
|
853 GLES_ENTER(); |
|
854 GLES_ERROR_IF(n < 0, GL_INVALID_VALUE); |
|
855 ctx->GetHostError(); |
|
856 ctx->DGL().glDeleteTextures (n, textures); |
|
857 if(ctx->GetHostError() == GL_NO_ERROR) |
|
858 { |
|
859 for(int i = 0; i < n; i++) |
|
860 { |
|
861 ctx->DeleteTexture(textures[i]); |
|
862 } |
|
863 } |
|
864 GLES_LEAVE(); |
|
865 } |
|
866 GL_API void GL_APIENTRY glDepthFunc (GLenum func) |
|
867 { |
|
868 GLES_ENTER(); |
|
869 ctx->DGL().glDepthFunc (func); |
|
870 GLES_LEAVE(); |
|
871 } |
|
872 GL_API void GL_APIENTRY glDepthMask (GLboolean flag) |
|
873 { |
|
874 GLES_ENTER(); |
|
875 ctx->DGL().glDepthMask (flag); |
|
876 GLES_LEAVE(); |
|
877 } |
|
878 GL_API void GL_APIENTRY glDepthRangex (GLclampx zNear, GLclampx zFar) |
|
879 { |
|
880 GLES_ENTER(); |
|
881 ctx->DGL().glDepthRange(X_TO_D(zNear), X_TO_D(zFar)); |
|
882 GLES_LEAVE(); |
|
883 } |
|
884 bool isValidCapabilityEnum(GLenum cap) |
|
885 { |
|
886 switch(cap) |
|
887 { |
|
888 case GL_NORMALIZE: |
|
889 case GL_RESCALE_NORMAL: |
|
890 case GL_CLIP_PLANE0: |
|
891 case GL_CLIP_PLANE1: |
|
892 case GL_CLIP_PLANE2: |
|
893 case GL_CLIP_PLANE3: |
|
894 case GL_CLIP_PLANE4: |
|
895 case GL_CLIP_PLANE5: |
|
896 case GL_FOG: |
|
897 case GL_LIGHTING: |
|
898 case GL_COLOR_MATERIAL: |
|
899 case GL_LIGHT0: |
|
900 case GL_LIGHT1: |
|
901 case GL_LIGHT2: |
|
902 case GL_LIGHT3: |
|
903 case GL_LIGHT4: |
|
904 case GL_LIGHT5: |
|
905 case GL_LIGHT6: |
|
906 case GL_LIGHT7: |
|
907 case GL_POINT_SMOOTH: |
|
908 case GL_POINT_SPRITE_OES: |
|
909 case GL_LINE_SMOOTH: |
|
910 case GL_CULL_FACE: |
|
911 case GL_POLYGON_OFFSET_FILL: |
|
912 case GL_MULTISAMPLE: |
|
913 case GL_SAMPLE_ALPHA_TO_COVERAGE: |
|
914 case GL_SAMPLE_ALPHA_TO_ONE: |
|
915 case GL_SAMPLE_COVERAGE: |
|
916 case GL_TEXTURE_2D: |
|
917 case GL_SCISSOR_TEST: |
|
918 case GL_ALPHA_TEST: |
|
919 case GL_STENCIL_TEST: |
|
920 case GL_DEPTH_TEST: |
|
921 case GL_BLEND: |
|
922 case GL_DITHER: |
|
923 case GL_COLOR_LOGIC_OP: |
|
924 return true; |
|
925 default: |
|
926 return false; |
|
927 } |
|
928 } |
|
929 GL_API void GL_APIENTRY glDisable (GLenum cap) |
|
930 { |
|
931 GLES_ENTER(); |
|
932 GLES_ERROR_IF(!isValidCapabilityEnum(cap), GL_INVALID_ENUM); |
|
933 cap = cap == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : cap; |
|
934 ctx->DGL().glDisable (cap); |
|
935 GLES_LEAVE(); |
|
936 } |
|
937 static GLESArrayFlag mapArrayType(GLenum type) |
|
938 { |
|
939 switch(type) |
|
940 { |
|
941 case GL_VERTEX_ARRAY: |
|
942 return GLES_VERTEX_ARRAY; |
|
943 case GL_NORMAL_ARRAY: |
|
944 return GLES_NORMAL_ARRAY; |
|
945 case GL_COLOR_ARRAY: |
|
946 return GLES_COLOR_ARRAY; |
|
947 case GL_POINT_SIZE_ARRAY_OES: |
|
948 return GLES_POINT_SIZE_ARRAY; |
|
949 case GL_TEXTURE_COORD_ARRAY: |
|
950 return GLES_TEXTURE_COORD_ARRAY; |
|
951 default: |
|
952 return GLES_INVALID_ARRAY; |
|
953 } |
|
954 } |
|
955 GL_API void GL_APIENTRY glDisableClientState (GLenum array) |
|
956 { |
|
957 GLES_ENTER(); |
|
958 int flag = static_cast<int>(mapArrayType(array)); |
|
959 GLES_ERROR_IF(flag == GLES_INVALID_ARRAY, GL_INVALID_ENUM); |
|
960 if(flag == GLES_TEXTURE_COORD_ARRAY) |
|
961 { |
|
962 flag <<= ctx->ClientActiveTexture(); |
|
963 } |
|
964 ctx->DisableArray(static_cast<GLESArrayFlag>(flag)); |
|
965 if(array != GL_POINT_SIZE_ARRAY_OES) |
|
966 { |
|
967 ctx->DGL().glDisableClientState(array); |
|
968 } |
|
969 GLES_LEAVE(); |
|
970 } |
|
971 static bool convertArrays(const GLESContext& ctx, GLsizei count, GLESArray** vertexArr, GLESArray** normalArr, |
|
972 GLESArray** colorArr, GLESArray** texCoordArr) |
|
973 { |
|
974 *vertexArr = ctx.VertexArray().Convert(count); |
|
975 if(*vertexArr == NULL) |
|
976 { |
|
977 return false; |
|
978 } |
|
979 ctx.DGL().glVertexPointer((*vertexArr)->Size(), (*vertexArr)->Type(), (*vertexArr)->Stride(), (*vertexArr)->Pointer()); |
|
980 |
|
981 if(ctx.IsArrayEnabled(GLES_NORMAL_ARRAY)) |
|
982 { |
|
983 *normalArr = ctx.NormalArray().Convert(count); |
|
984 if(*normalArr == NULL) |
|
985 { |
|
986 return false; |
|
987 } |
|
988 ctx.DGL().glNormalPointer((*normalArr)->Type(), (*normalArr)->Stride(), (*normalArr)->Pointer()); |
|
989 } |
|
990 |
|
991 if(ctx.IsArrayEnabled(GLES_COLOR_ARRAY)) |
|
992 { |
|
993 *colorArr = ctx.ColorArray().Convert(count); |
|
994 if(*colorArr == NULL) |
|
995 { |
|
996 return false; |
|
997 } |
|
998 ctx.DGL().glColorPointer((*colorArr)->Size(), (*colorArr)->Type(), (*colorArr)->Stride(), (*colorArr)->Pointer()); |
|
999 } |
|
1000 |
|
1001 for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++) |
|
1002 { |
|
1003 if(ctx.IsArrayEnabled(static_cast<GLESArrayFlag>(GLES_TEXTURE_COORD_ARRAY << i))) |
|
1004 { |
|
1005 texCoordArr[i] = ctx.TexCoordArray(i).Convert(count); |
|
1006 if(texCoordArr[i] == NULL) |
|
1007 { |
|
1008 return false; |
|
1009 } |
|
1010 ctx.DGL().glClientActiveTexture(GL_TEXTURE0 + i); |
|
1011 ctx.DGL().glTexCoordPointer(texCoordArr[i]->Size(), texCoordArr[i]->Type(), |
|
1012 texCoordArr[i]->Stride(), texCoordArr[i]->Pointer()); |
|
1013 } |
|
1014 } |
|
1015 |
|
1016 // Reset state |
|
1017 ctx.DGL().glClientActiveTexture(GL_TEXTURE0 + ctx.ClientActiveTexture()); |
|
1018 |
|
1019 return true; |
|
1020 } |
|
1021 void drawPoint(const GLESContext& ctx, int i, GLESArrayPointer& vertexPtr, GLESArrayPointer& normalPtr, |
|
1022 GLESArrayPointer& colorPtr, GLESArrayPointer& pointSizePtr, |
|
1023 GLESArrayPointer* texCoordPtr) |
|
1024 { |
|
1025 if(normalPtr != NULL) |
|
1026 { |
|
1027 switch(normalPtr.Type()) |
|
1028 { |
|
1029 case GL_BYTE: |
|
1030 case GL_SHORT: |
|
1031 ctx.DGL().glNormal3sv(static_cast<const GLshort*>(normalPtr[i])); |
|
1032 break; |
|
1033 case GL_FIXED: |
|
1034 case GL_FLOAT: |
|
1035 ctx.DGL().glNormal3fv(static_cast<const GLfloat*>(normalPtr[i])); |
|
1036 break; |
|
1037 default: |
|
1038 GLES_ASSERT(false); |
|
1039 } |
|
1040 } |
|
1041 |
|
1042 if(colorPtr != NULL) |
|
1043 { |
|
1044 switch(colorPtr.Type()) |
|
1045 { |
|
1046 case GL_UNSIGNED_BYTE: |
|
1047 ctx.DGL().glColor4ubv(static_cast<const GLubyte*>(colorPtr[i])); |
|
1048 break; |
|
1049 case GL_FIXED: |
|
1050 case GL_FLOAT: |
|
1051 ctx.DGL().glColor4fv(static_cast<const GLfloat*>(colorPtr[i])); |
|
1052 break; |
|
1053 default: |
|
1054 GLES_ASSERT(false); |
|
1055 } |
|
1056 } |
|
1057 |
|
1058 GLES_ASSERT(pointSizePtr != NULL); |
|
1059 ctx.DGL().glPointSize(*static_cast<const GLfloat*>(pointSizePtr[i])); |
|
1060 |
|
1061 for(unsigned int j = 0; j < ctx.MaxTextureUnits(); j++) |
|
1062 { |
|
1063 int texture = GL_TEXTURE0 + j; |
|
1064 |
|
1065 if(texCoordPtr[j] != NULL) |
|
1066 { |
|
1067 switch(texCoordPtr[j].Type()) |
|
1068 { |
|
1069 case GL_BYTE: |
|
1070 case GL_SHORT: |
|
1071 switch(texCoordPtr[j].Size()) |
|
1072 { |
|
1073 case 2: |
|
1074 ctx.DGL().glMultiTexCoord2sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i])); |
|
1075 break; |
|
1076 case 3: |
|
1077 ctx.DGL().glMultiTexCoord3sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i])); |
|
1078 break; |
|
1079 case 4: |
|
1080 ctx.DGL().glMultiTexCoord4sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i])); |
|
1081 break; |
|
1082 default: |
|
1083 GLES_ASSERT(false); |
|
1084 } |
|
1085 break; |
|
1086 case GL_FIXED: |
|
1087 case GL_FLOAT: |
|
1088 switch(texCoordPtr[j].Size()) |
|
1089 { |
|
1090 case 2: |
|
1091 ctx.DGL().glMultiTexCoord2fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i])); |
|
1092 break; |
|
1093 case 3: |
|
1094 ctx.DGL().glMultiTexCoord3fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i])); |
|
1095 break; |
|
1096 case 4: |
|
1097 ctx.DGL().glMultiTexCoord4fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i])); |
|
1098 break; |
|
1099 default: |
|
1100 GLES_ASSERT(false); |
|
1101 } |
|
1102 break; |
|
1103 default: |
|
1104 GLES_ASSERT(false); |
|
1105 } |
|
1106 } |
|
1107 } |
|
1108 |
|
1109 GLES_ASSERT(vertexPtr != NULL); |
|
1110 ctx.DGL().glBegin(GL_POINTS); |
|
1111 switch(vertexPtr.Type()) |
|
1112 { |
|
1113 case GL_BYTE: |
|
1114 case GL_SHORT: |
|
1115 switch(vertexPtr.Size()) |
|
1116 { |
|
1117 case 2: |
|
1118 ctx.DGL().glVertex2sv(static_cast<const GLshort*>(vertexPtr[i])); |
|
1119 break; |
|
1120 case 3: |
|
1121 ctx.DGL().glVertex3sv(static_cast<const GLshort*>(vertexPtr[i])); |
|
1122 break; |
|
1123 case 4: |
|
1124 ctx.DGL().glVertex4sv(static_cast<const GLshort*>(vertexPtr[i])); |
|
1125 break; |
|
1126 default: |
|
1127 GLES_ASSERT(false); |
|
1128 } |
|
1129 break; |
|
1130 case GL_FIXED: |
|
1131 case GL_FLOAT: |
|
1132 switch(vertexPtr.Size()) |
|
1133 { |
|
1134 case 2: |
|
1135 ctx.DGL().glVertex2fv(static_cast<const GLfloat*>(vertexPtr[i])); |
|
1136 break; |
|
1137 case 3: |
|
1138 ctx.DGL().glVertex3fv(static_cast<const GLfloat*>(vertexPtr[i])); |
|
1139 break; |
|
1140 case 4: |
|
1141 ctx.DGL().glVertex4fv(static_cast<const GLfloat*>(vertexPtr[i])); |
|
1142 break; |
|
1143 default: |
|
1144 GLES_ASSERT(false); |
|
1145 } |
|
1146 break; |
|
1147 default: |
|
1148 GLES_ASSERT(false); |
|
1149 } |
|
1150 ctx.DGL().glEnd(); |
|
1151 } |
|
1152 bool drawPointArrays(const GLESContext& ctx, int first, int count, |
|
1153 GLESArray* vertexArr, GLESArray* normalArr, GLESArray* colorArr, GLESArray** texCoordArr) |
|
1154 { |
|
1155 GLESArray* pointSizeArr = ctx.PointSizeArray().Convert(count); |
|
1156 if(pointSizeArr == NULL) |
|
1157 { |
|
1158 return false; |
|
1159 } |
|
1160 |
|
1161 GLES_ASSERT(vertexArr != NULL); |
|
1162 GLESArrayPointer vertexPtr = vertexArr->ArrayPointer(); |
|
1163 GLESArrayPointer normalPtr = normalArr != NULL ? normalArr->ArrayPointer() : GLESArrayPointer(); |
|
1164 GLESArrayPointer colorPtr = colorArr != NULL ? colorArr->ArrayPointer() : GLESArrayPointer(); |
|
1165 GLESArrayPointer pointSizePtr = pointSizeArr != NULL ? pointSizeArr->ArrayPointer() : GLESArrayPointer(); |
|
1166 |
|
1167 GLESArrayPointer* texCoordPtr = GLES_NEW GLESArrayPointer[ctx.MaxTextureUnits()]; |
|
1168 if(texCoordPtr == NULL) |
|
1169 { |
|
1170 delete pointSizeArr; |
|
1171 return false; |
|
1172 } |
|
1173 for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++) |
|
1174 { |
|
1175 texCoordPtr[i] = texCoordArr[i] != NULL ? texCoordArr[i]->ArrayPointer() : GLESArrayPointer(); |
|
1176 } |
|
1177 |
|
1178 // Draw individual points |
|
1179 |
|
1180 for(int i = first; i < first + count; i++) |
|
1181 { |
|
1182 drawPoint(ctx, i, vertexPtr, normalPtr, colorPtr, pointSizePtr, texCoordPtr); |
|
1183 } |
|
1184 |
|
1185 delete[] texCoordPtr; |
|
1186 delete pointSizeArr; |
|
1187 |
|
1188 return true; |
|
1189 } |
|
1190 bool drawPointElements(const GLESContext& ctx, int count, GLenum type, const void* indices, |
|
1191 GLESArray* vertexArr, GLESArray* normalArr, GLESArray* colorArr, GLESArray** texCoordArr) |
|
1192 { |
|
1193 GLESArray* pointSizeArr = ctx.PointSizeArray().Convert(count); |
|
1194 if(pointSizeArr == NULL) |
|
1195 { |
|
1196 return false; |
|
1197 } |
|
1198 |
|
1199 GLES_ASSERT(vertexArr != NULL); |
|
1200 GLESArrayPointer vertexPtr = vertexArr->ArrayPointer(); |
|
1201 GLESArrayPointer normalPtr = normalArr != NULL ? normalArr->ArrayPointer() : GLESArrayPointer(); |
|
1202 GLESArrayPointer colorPtr = colorArr != NULL ? colorArr->ArrayPointer() : GLESArrayPointer(); |
|
1203 GLESArrayPointer pointSizePtr = pointSizeArr != NULL ? pointSizeArr->ArrayPointer() : GLESArrayPointer(); |
|
1204 |
|
1205 GLESArrayPointer* texCoordPtr = GLES_NEW GLESArrayPointer[ctx.MaxTextureUnits()]; |
|
1206 if(texCoordPtr == NULL) |
|
1207 { |
|
1208 delete pointSizeArr; |
|
1209 return false; |
|
1210 } |
|
1211 for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++) |
|
1212 { |
|
1213 texCoordPtr[i] = texCoordArr[i] != NULL ? texCoordArr[i]->ArrayPointer() : GLESArrayPointer(); |
|
1214 } |
|
1215 |
|
1216 // Draw individual points |
|
1217 |
|
1218 for(int i = 0; i < count; i++) |
|
1219 { |
|
1220 int index; |
|
1221 switch(type) |
|
1222 { |
|
1223 case GL_UNSIGNED_BYTE: |
|
1224 index = static_cast<const GLubyte*>(indices)[i]; |
|
1225 break; |
|
1226 case GL_UNSIGNED_SHORT: |
|
1227 index = static_cast<const GLushort*>(indices)[i]; |
|
1228 break; |
|
1229 default: |
|
1230 GLES_ASSERT(false); |
|
1231 } |
|
1232 drawPoint(ctx, index, vertexPtr, normalPtr, colorPtr, pointSizePtr, texCoordPtr); |
|
1233 } |
|
1234 |
|
1235 delete[] texCoordPtr; |
|
1236 delete pointSizeArr; |
|
1237 |
|
1238 return true; |
|
1239 } |
|
1240 GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) |
|
1241 { |
|
1242 GLES_ENTER(); |
|
1243 GLES_ERROR_IF(count < 0, GL_INVALID_VALUE); |
|
1244 |
|
1245 if(!ctx->IsArrayEnabled(GLES_VERTEX_ARRAY) || !count) |
|
1246 { |
|
1247 // Nothing to draw |
|
1248 GLES_LEAVE(); |
|
1249 } |
|
1250 |
|
1251 GLESArray* vertexArr = NULL; |
|
1252 GLESArray* normalArr = NULL; |
|
1253 GLESArray* colorArr = NULL; |
|
1254 GLESArray** texCoordArr = GLES_NEW GLESArray*[ctx->MaxTextureUnits()]; |
|
1255 for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++) |
|
1256 { |
|
1257 texCoordArr[i] = NULL; |
|
1258 } |
|
1259 |
|
1260 bool oom = !convertArrays(*ctx, count, &vertexArr, &normalArr, &colorArr, texCoordArr); |
|
1261 if(!oom) |
|
1262 { |
|
1263 GLES_LOCK_DRAW_SURFACE(); |
|
1264 if(mode == GL_POINTS && ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY)) |
|
1265 { |
|
1266 oom = !drawPointArrays(*ctx, first, count, vertexArr, normalArr, colorArr, texCoordArr); |
|
1267 } |
|
1268 else |
|
1269 { |
|
1270 ctx->DGL().glDrawArrays (mode, first, count); |
|
1271 } |
|
1272 GLES_UNLOCK_SURFACE(); |
|
1273 } |
|
1274 |
|
1275 for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++) |
|
1276 { |
|
1277 delete texCoordArr[i]; |
|
1278 } |
|
1279 delete colorArr; |
|
1280 delete normalArr; |
|
1281 delete vertexArr; |
|
1282 delete[] texCoordArr; |
|
1283 |
|
1284 if(oom) |
|
1285 { |
|
1286 GLES_ERROR(GL_OUT_OF_MEMORY); |
|
1287 } |
|
1288 |
|
1289 GLES_LEAVE(); |
|
1290 } |
|
1291 GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) |
|
1292 { |
|
1293 GLES_ENTER(); |
|
1294 GLES_ERROR_IF(count < 0, GL_INVALID_VALUE); |
|
1295 GLES_ERROR_IF(type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT, GL_INVALID_ENUM); |
|
1296 |
|
1297 if(!ctx->IsArrayEnabled(GLES_VERTEX_ARRAY) || !count) |
|
1298 { |
|
1299 // Nothing to draw |
|
1300 GLES_LEAVE(); |
|
1301 } |
|
1302 |
|
1303 GLESArray* vertexArr = NULL; |
|
1304 GLESArray* normalArr = NULL; |
|
1305 GLESArray* colorArr = NULL; |
|
1306 GLESArray** texCoordArr = GLES_NEW GLESArray*[ctx->MaxTextureUnits()]; |
|
1307 for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++) |
|
1308 { |
|
1309 texCoordArr[i] = NULL; |
|
1310 } |
|
1311 |
|
1312 bool oom = !convertArrays(*ctx, count, &vertexArr, &normalArr, &colorArr, texCoordArr); |
|
1313 if(!oom) |
|
1314 { |
|
1315 if(indices == NULL && ctx->ElementArrayBufferBinding()) |
|
1316 { |
|
1317 indices = ctx->ElementArrayBuffer()->data; |
|
1318 } |
|
1319 |
|
1320 GLES_LOCK_DRAW_SURFACE(); |
|
1321 if(mode == GL_POINTS && ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY)) |
|
1322 { |
|
1323 oom = !drawPointElements(*ctx, count, type, indices, |
|
1324 vertexArr, normalArr, colorArr, texCoordArr); |
|
1325 } |
|
1326 else |
|
1327 { |
|
1328 ctx->DGL().glDrawElements (mode, count, type, indices); |
|
1329 } |
|
1330 GLES_UNLOCK_SURFACE(); |
|
1331 } |
|
1332 |
|
1333 for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++) |
|
1334 { |
|
1335 delete texCoordArr[i]; |
|
1336 } |
|
1337 delete colorArr; |
|
1338 delete normalArr; |
|
1339 delete vertexArr; |
|
1340 delete[] texCoordArr; |
|
1341 |
|
1342 if(oom) |
|
1343 { |
|
1344 GLES_ERROR(GL_OUT_OF_MEMORY); |
|
1345 } |
|
1346 |
|
1347 GLES_LEAVE(); |
|
1348 } |
|
1349 GL_API void GL_APIENTRY glEnable (GLenum cap) |
|
1350 { |
|
1351 GLES_ENTER(); |
|
1352 GLES_ERROR_IF(!isValidCapabilityEnum(cap), GL_INVALID_ENUM); |
|
1353 ctx->DGL().glEnable (cap); |
|
1354 GLES_LEAVE(); |
|
1355 } |
|
1356 GL_API void GL_APIENTRY glEnableClientState (GLenum array) |
|
1357 { |
|
1358 GLES_ENTER(); |
|
1359 array = array == GL_POINT_SIZE_ARRAY_OES ? GL_POINT_SIZE_ARRAY : array; |
|
1360 int flag = static_cast<int>(mapArrayType(array)); |
|
1361 GLES_ERROR_IF(flag == GLES_INVALID_ARRAY, GL_INVALID_ENUM); |
|
1362 if(flag == GLES_TEXTURE_COORD_ARRAY) |
|
1363 { |
|
1364 flag <<= ctx->ClientActiveTexture(); |
|
1365 } |
|
1366 ctx->EnableArray(static_cast<GLESArrayFlag>(flag)); |
|
1367 if(array != GL_POINT_SIZE_ARRAY_OES) |
|
1368 { |
|
1369 ctx->DGL().glEnableClientState(array); |
|
1370 } |
|
1371 GLES_LEAVE(); |
|
1372 } |
|
1373 GL_API void GL_APIENTRY glFinish (void) |
|
1374 { |
|
1375 GLES_ENTER(); |
|
1376 ctx->DGL().glFinish(); |
|
1377 GLES_LEAVE(); |
|
1378 } |
|
1379 GL_API void GL_APIENTRY glFlush (void) |
|
1380 { |
|
1381 GLES_ENTER(); |
|
1382 ctx->DGL().glFlush(); |
|
1383 GLES_LEAVE(); |
|
1384 } |
|
1385 GL_API void GL_APIENTRY glFogx (GLenum pname, GLfixed param) |
|
1386 { |
|
1387 GLES_ENTER(); |
|
1388 GLES_ERROR_IF(!isValidSingleValuedFogParamEnum(pname), GL_INVALID_ENUM); |
|
1389 if(pname == GL_FOG_MODE) |
|
1390 { |
|
1391 ctx->DGL().glFogf(pname, static_cast<GLfloat>(param)); |
|
1392 } |
|
1393 else |
|
1394 { |
|
1395 ctx->DGL().glFogf(pname, X_TO_F(param)); |
|
1396 } |
|
1397 GLES_LEAVE(); |
|
1398 } |
|
1399 GL_API void GL_APIENTRY glFogxv (GLenum pname, const GLfixed *params) |
|
1400 { |
|
1401 GLES_ENTER(); |
|
1402 GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM); |
|
1403 if(pname == GL_FOG_MODE) |
|
1404 { |
|
1405 GLfloat fparam = static_cast<GLfloat>(params[0]); |
|
1406 ctx->DGL().glFogfv (pname, &fparam); |
|
1407 } |
|
1408 else |
|
1409 { |
|
1410 GLfloat fparams[4]; |
|
1411 fparams[0] = X_TO_F(params[0]); |
|
1412 if (pname == GL_FOG_COLOR) |
|
1413 { |
|
1414 fparams[1] = X_TO_F(params[1]); |
|
1415 fparams[2] = X_TO_F(params[2]); |
|
1416 fparams[3] = X_TO_F(params[3]); |
|
1417 } |
|
1418 ctx->DGL().glFogfv (pname, fparams); |
|
1419 } |
|
1420 |
|
1421 GLES_LEAVE(); |
|
1422 } |
|
1423 GL_API void GL_APIENTRY glFrontFace (GLenum mode) |
|
1424 { |
|
1425 GLES_ENTER(); |
|
1426 ctx->DGL().glFrontFace (mode); |
|
1427 GLES_LEAVE(); |
|
1428 } |
|
1429 GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) |
|
1430 { |
|
1431 GLES_ENTER(); |
|
1432 ctx->DGL().glFrustum (X_TO_D(left), X_TO_D(right), X_TO_D(bottom), X_TO_D(top), X_TO_D(zNear), X_TO_D(zFar)); |
|
1433 GLES_LEAVE(); |
|
1434 } |
|
1435 GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *params) |
|
1436 { |
|
1437 GLES_ENTER(); |
|
1438 if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_BOOLEAN, params)) |
|
1439 { |
|
1440 GLES_ERROR(GL_INVALID_ENUM); |
|
1441 } |
|
1442 GLES_LEAVE(); |
|
1443 } |
|
1444 GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params) |
|
1445 { |
|
1446 GLES_ENTER(); |
|
1447 GLES_ERROR_IF(!isValidBufferTarget(target), GL_INVALID_ENUM); |
|
1448 |
|
1449 const GLESBuffer* buffer; |
|
1450 switch(target) |
|
1451 { |
|
1452 case GL_ARRAY_BUFFER: |
|
1453 buffer = ctx->ArrayBuffer(); |
|
1454 break; |
|
1455 case GL_ELEMENT_ARRAY_BUFFER: |
|
1456 buffer = ctx->ElementArrayBuffer(); |
|
1457 break; |
|
1458 default: |
|
1459 GLES_ERROR(GL_INVALID_ENUM); |
|
1460 } |
|
1461 |
|
1462 switch(pname) |
|
1463 { |
|
1464 case GL_BUFFER_SIZE: |
|
1465 *params = buffer->size; |
|
1466 break; |
|
1467 case GL_BUFFER_USAGE: |
|
1468 *params = buffer->usage; |
|
1469 break; |
|
1470 default: |
|
1471 GLES_ERROR(GL_INVALID_ENUM); |
|
1472 } |
|
1473 |
|
1474 GLES_LEAVE(); |
|
1475 } |
|
1476 GL_API void GL_APIENTRY glGetClipPlanex (GLenum pname, GLfixed eqn[4]) |
|
1477 { |
|
1478 GLES_ENTER(); |
|
1479 GLES_ERROR_IF(pname < GL_CLIP_PLANE0 || pname >= GL_CLIP_PLANE0 + ctx->MaxClipPlanes(), GL_INVALID_ENUM); |
|
1480 GLdouble deqn[4]; |
|
1481 ctx->DGL().glGetClipPlane(pname, deqn); |
|
1482 for (int i = 0; i < 4; i++) |
|
1483 { |
|
1484 eqn[i] = D_TO_X(deqn[i]); |
|
1485 } |
|
1486 GLES_LEAVE(); |
|
1487 } |
|
1488 GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers) |
|
1489 { |
|
1490 GLES_ENTER(); |
|
1491 GLES_ERROR_IF(n < 0, GL_INVALID_VALUE); |
|
1492 ctx->ReserveBufferNames(n, buffers); |
|
1493 GLES_LEAVE(); |
|
1494 } |
|
1495 GL_API void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures) |
|
1496 { |
|
1497 GLES_ENTER(); |
|
1498 ctx->DGL().glGenTextures (n, textures); |
|
1499 GLES_LEAVE(); |
|
1500 } |
|
1501 GL_API GLenum GL_APIENTRY glGetError (void) |
|
1502 { |
|
1503 GLES_ENTER_RET(GL_INVALID_OPERATION); |
|
1504 GLenum error = ctx->Error(); |
|
1505 ctx->SetError(GL_NO_ERROR); |
|
1506 GLES_LEAVE_RET(error); |
|
1507 } |
|
1508 GL_API void GL_APIENTRY glGetFixedv (GLenum pname, GLfixed *params) |
|
1509 { |
|
1510 GLES_ENTER(); |
|
1511 if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_FIXED, params)) |
|
1512 { |
|
1513 GLES_ERROR(GL_INVALID_ENUM); |
|
1514 } |
|
1515 GLES_LEAVE(); |
|
1516 } |
|
1517 GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *params) |
|
1518 { |
|
1519 GLES_ENTER(); |
|
1520 if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_INTEGER, params)) |
|
1521 { |
|
1522 GLES_ERROR(GL_INVALID_ENUM); |
|
1523 } |
|
1524 GLES_LEAVE(); |
|
1525 } |
|
1526 bool isValidLightEnum(GLenum light, unsigned int maxLights) |
|
1527 { |
|
1528 return light >= GL_LIGHT0 && light < GL_LIGHT0 + maxLights; |
|
1529 } |
|
1530 GL_API void GL_APIENTRY glGetLightxv (GLenum light, GLenum pname, GLfixed *params) |
|
1531 { |
|
1532 GLES_ENTER(); |
|
1533 GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM); |
|
1534 |
|
1535 float fparams[4]; |
|
1536 ctx->DGL().glGetLightfv(light, pname, fparams); |
|
1537 |
|
1538 switch (pname) |
|
1539 { |
|
1540 case GL_AMBIENT: |
|
1541 case GL_DIFFUSE: |
|
1542 case GL_SPECULAR: |
|
1543 case GL_POSITION: |
|
1544 params[3] = F_TO_X(fparams[3]); |
|
1545 case GL_SPOT_DIRECTION: |
|
1546 params[2] = F_TO_X(fparams[2]); |
|
1547 params[1] = F_TO_X(fparams[1]); |
|
1548 case GL_SPOT_EXPONENT: |
|
1549 case GL_SPOT_CUTOFF: |
|
1550 case GL_CONSTANT_ATTENUATION: |
|
1551 case GL_LINEAR_ATTENUATION: |
|
1552 case GL_QUADRATIC_ATTENUATION: |
|
1553 params[0] = F_TO_X(fparams[0]); |
|
1554 break; |
|
1555 default: |
|
1556 GLES_ERROR(GL_INVALID_ENUM); |
|
1557 } |
|
1558 |
|
1559 GLES_LEAVE(); |
|
1560 } |
|
1561 GL_API void GL_APIENTRY glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params) |
|
1562 { |
|
1563 GLES_ENTER(); |
|
1564 GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM); |
|
1565 GLfloat fparams[4]; |
|
1566 ctx->DGL().glGetMaterialfv (face, pname, fparams); |
|
1567 params[0] = F_TO_X(fparams[0]); |
|
1568 if(pname != GL_SHININESS) |
|
1569 { |
|
1570 params[1] = F_TO_X(fparams[1]); |
|
1571 params[2] = F_TO_X(fparams[2]); |
|
1572 params[3] = F_TO_X(fparams[3]); |
|
1573 } |
|
1574 GLES_LEAVE(); |
|
1575 } |
|
1576 GL_API void GL_APIENTRY glGetPointerv (GLenum pname, GLvoid **params) |
|
1577 { |
|
1578 GLES_ENTER(); |
|
1579 switch(pname) |
|
1580 { |
|
1581 case GL_VERTEX_ARRAY_POINTER: |
|
1582 *params = const_cast<GLvoid*>(ctx->VertexArray().Pointer()); |
|
1583 break; |
|
1584 case GL_NORMAL_ARRAY_POINTER: |
|
1585 *params = const_cast<GLvoid*>(ctx->NormalArray().Pointer()); |
|
1586 break; |
|
1587 case GL_COLOR_ARRAY_POINTER: |
|
1588 *params = const_cast<GLvoid*>(ctx->ColorArray().Pointer()); |
|
1589 break; |
|
1590 case GL_POINT_SIZE_ARRAY_POINTER_OES: |
|
1591 *params = const_cast<GLvoid*>(ctx->PointSizeArray().Pointer()); |
|
1592 break; |
|
1593 case GL_TEXTURE_COORD_ARRAY_POINTER: |
|
1594 *params = const_cast<GLvoid*>(ctx->TexCoordArray().Pointer()); |
|
1595 break; |
|
1596 default: |
|
1597 GLES_ERROR(GL_INVALID_ENUM); |
|
1598 } |
|
1599 GLES_LEAVE(); |
|
1600 } |
|
1601 GL_API const GLubyte * GL_APIENTRY glGetString (GLenum name) |
|
1602 { |
|
1603 GLES_ENTER_RET(NULL); |
|
1604 static const GLubyte vendor[] = "Nokia"; |
|
1605 static const GLubyte renderer[] = "OpenGL ES-CM 1.1"; |
|
1606 static const GLubyte version[] = "OpenGL ES-CM 1.1"; |
|
1607 static const GLubyte extensions[] = "GL_OES_read_format GL_OES_compressed_paletted_texture " |
|
1608 "GL_OES_point_size_array GL_OES_point_sprite"; |
|
1609 const GLubyte* str = NULL; |
|
1610 switch(name) |
|
1611 { |
|
1612 case GL_VENDOR: |
|
1613 str = vendor; |
|
1614 break; |
|
1615 case GL_RENDERER: |
|
1616 str = renderer; |
|
1617 break; |
|
1618 case GL_VERSION: |
|
1619 str = version; |
|
1620 break; |
|
1621 case GL_EXTENSIONS: |
|
1622 str = extensions; |
|
1623 break; |
|
1624 default: |
|
1625 GLES_ERROR_RET(GL_INVALID_ENUM, NULL); |
|
1626 break; |
|
1627 } |
|
1628 GLES_LEAVE_RET(str); |
|
1629 } |
|
1630 GL_API void GL_APIENTRY glGetTexEnviv (GLenum env, GLenum pname, GLint *params) |
|
1631 { |
|
1632 GLES_ENTER(); |
|
1633 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
1634 ctx->DGL().glGetTexEnviv (env, pname, params); |
|
1635 GLES_LEAVE(); |
|
1636 } |
|
1637 GL_API void GL_APIENTRY glGetTexEnvxv (GLenum env, GLenum pname, GLfixed *params) |
|
1638 { |
|
1639 GLES_ENTER(); |
|
1640 GLfloat fparams[4]; |
|
1641 |
|
1642 pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname; |
|
1643 |
|
1644 switch (pname) |
|
1645 { |
|
1646 case GL_TEXTURE_ENV_COLOR: |
|
1647 ctx->DGL().glGetTexEnvfv(env, pname, fparams); |
|
1648 params[0] = F_TO_X(fparams[0]); |
|
1649 params[1] = F_TO_X(fparams[1]); |
|
1650 params[2] = F_TO_X(fparams[2]); |
|
1651 params[3] = F_TO_X(fparams[3]); |
|
1652 break; |
|
1653 case GL_RGB_SCALE: |
|
1654 case GL_ALPHA_SCALE: |
|
1655 ctx->DGL().glGetTexEnvfv(env, pname, fparams); |
|
1656 params[0] = F_TO_X(fparams[0]); |
|
1657 break; |
|
1658 case GL_COMBINE_RGB: |
|
1659 case GL_COMBINE_ALPHA: |
|
1660 case GL_COORD_REPLACE: |
|
1661 case GL_TEXTURE_ENV_MODE: |
|
1662 case GL_SRC0_RGB: |
|
1663 case GL_SRC0_ALPHA: |
|
1664 case GL_SRC1_RGB: |
|
1665 case GL_SRC1_ALPHA: |
|
1666 case GL_SRC2_RGB: |
|
1667 case GL_SRC2_ALPHA: |
|
1668 case GL_OPERAND0_RGB: |
|
1669 case GL_OPERAND0_ALPHA: |
|
1670 case GL_OPERAND1_RGB: |
|
1671 case GL_OPERAND1_ALPHA: |
|
1672 case GL_OPERAND2_RGB: |
|
1673 case GL_OPERAND2_ALPHA: |
|
1674 { |
|
1675 GLint i; |
|
1676 ctx->DGL().glGetTexEnviv(env, pname, &i); |
|
1677 params[0] = static_cast<GLfixed>(i); |
|
1678 } |
|
1679 break; |
|
1680 default: |
|
1681 GLES_ERROR(GL_INVALID_ENUM); |
|
1682 } |
|
1683 GLES_LEAVE(); |
|
1684 } |
|
1685 GL_API void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params) |
|
1686 { |
|
1687 GLES_ENTER(); |
|
1688 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
1689 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
1690 ctx->DGL().glGetTexParameteriv (target, pname, params); |
|
1691 GLES_LEAVE(); |
|
1692 } |
|
1693 GL_API void GL_APIENTRY glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params) |
|
1694 { |
|
1695 GLES_ENTER(); |
|
1696 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
1697 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
1698 // All parameters are enum values, no conversion to be done. |
|
1699 ctx->DGL().glGetTexParameteriv (target, pname, params); |
|
1700 GLES_LEAVE(); |
|
1701 } |
|
1702 bool isValidHintEnum(GLenum hint) |
|
1703 { |
|
1704 switch(hint) |
|
1705 { |
|
1706 case GL_PERSPECTIVE_CORRECTION_HINT: |
|
1707 case GL_POINT_SMOOTH_HINT: |
|
1708 case GL_LINE_SMOOTH_HINT: |
|
1709 case GL_FOG_HINT: |
|
1710 case GL_GENERATE_MIPMAP_HINT: |
|
1711 return true; |
|
1712 default: |
|
1713 return false; |
|
1714 } |
|
1715 } |
|
1716 GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode) |
|
1717 { |
|
1718 GLES_ENTER(); |
|
1719 GLES_ERROR_IF(!isValidHintEnum(target), GL_INVALID_ENUM); |
|
1720 ctx->DGL().glHint (target, mode); |
|
1721 GLES_LEAVE(); |
|
1722 } |
|
1723 GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer) |
|
1724 { |
|
1725 GLES_ENTER_RET(GL_FALSE); |
|
1726 return ctx->Buffer(buffer) != NULL; |
|
1727 GLES_LEAVE_RET(GL_FALSE); |
|
1728 } |
|
1729 GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap) |
|
1730 { |
|
1731 GLES_ENTER_RET(GL_FALSE); |
|
1732 switch(cap) |
|
1733 { |
|
1734 case GL_VERTEX_ARRAY: |
|
1735 return ctx->IsArrayEnabled(GLES_VERTEX_ARRAY); |
|
1736 case GL_NORMAL_ARRAY: |
|
1737 return ctx->IsArrayEnabled(GLES_NORMAL_ARRAY); |
|
1738 case GL_COLOR_ARRAY: |
|
1739 return ctx->IsArrayEnabled(GLES_COLOR_ARRAY); |
|
1740 case GL_POINT_SIZE_ARRAY_OES: |
|
1741 return ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY); |
|
1742 case GL_TEXTURE_COORD_ARRAY: |
|
1743 { |
|
1744 int flag = static_cast<int>(GLES_TEXTURE_COORD_ARRAY); |
|
1745 flag <<= ctx->ClientActiveTexture(); |
|
1746 return ctx->IsArrayEnabled(static_cast<GLESArrayFlag>(flag)); |
|
1747 } |
|
1748 case GL_POINT_SPRITE_OES: |
|
1749 return ctx->DGL().glIsEnabled(GL_POINT_SPRITE); |
|
1750 default: |
|
1751 GLES_ERROR_IF_RET(!isValidCapabilityEnum(cap), GL_INVALID_ENUM, GL_FALSE); |
|
1752 return ctx->DGL().glIsEnabled(cap); |
|
1753 } |
|
1754 GLES_LEAVE_RET(ctx->DGL().glIsEnabled (cap)); |
|
1755 } |
|
1756 GL_API GLboolean GL_APIENTRY glIsTexture (GLuint texture) |
|
1757 { |
|
1758 GLES_ENTER_RET(GL_FALSE); |
|
1759 GLES_LEAVE_RET(ctx->DGL().glIsTexture (texture)); |
|
1760 } |
|
1761 GL_API void GL_APIENTRY glLightModelx (GLenum pname, GLfixed param) |
|
1762 { |
|
1763 GLES_ENTER(); |
|
1764 GLES_ERROR_IF(pname != GL_LIGHT_MODEL_TWO_SIDE, GL_INVALID_ENUM); |
|
1765 ctx->DGL().glLightModelf (pname, static_cast<GLfloat>(param)); |
|
1766 GLES_LEAVE(); |
|
1767 } |
|
1768 GL_API void GL_APIENTRY glLightModelxv (GLenum pname, const GLfixed *params) |
|
1769 { |
|
1770 GLES_ENTER(); |
|
1771 GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM); |
|
1772 if(pname == GL_LIGHT_MODEL_TWO_SIDE) |
|
1773 { |
|
1774 GLfloat fparam = static_cast<GLfloat>(params[0]); |
|
1775 ctx->DGL().glLightModelfv (pname, &fparam); |
|
1776 } |
|
1777 else |
|
1778 { |
|
1779 GLfloat fparams[4]; |
|
1780 fparams[0] = X_TO_F(params[0]); |
|
1781 if(pname == GL_LIGHT_MODEL_AMBIENT) |
|
1782 { |
|
1783 fparams[1] = X_TO_F(params[1]); |
|
1784 fparams[2] = X_TO_F(params[2]); |
|
1785 fparams[3] = X_TO_F(params[3]); |
|
1786 } |
|
1787 ctx->DGL().glLightModelfv (pname, fparams); |
|
1788 } |
|
1789 GLES_LEAVE(); |
|
1790 } |
|
1791 GL_API void GL_APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param) |
|
1792 { |
|
1793 GLES_ENTER(); |
|
1794 GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM); |
|
1795 ctx->DGL().glLightf (light, pname, X_TO_F(param)); |
|
1796 GLES_LEAVE(); |
|
1797 } |
|
1798 GL_API void GL_APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params) |
|
1799 { |
|
1800 GLES_ENTER(); |
|
1801 GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM); |
|
1802 GLfloat fparams[4]; |
|
1803 switch(pname) |
|
1804 { |
|
1805 case GL_AMBIENT: |
|
1806 case GL_DIFFUSE: |
|
1807 case GL_SPECULAR: |
|
1808 case GL_POSITION: |
|
1809 fparams[3] = X_TO_F(params[3]); |
|
1810 case GL_SPOT_DIRECTION: |
|
1811 fparams[2] = X_TO_F(params[2]); |
|
1812 fparams[1] = X_TO_F(params[1]); |
|
1813 break; |
|
1814 } |
|
1815 fparams[0] = X_TO_F(params[0]); |
|
1816 ctx->DGL().glLightfv (light, pname, fparams); |
|
1817 GLES_LEAVE(); |
|
1818 } |
|
1819 GL_API void GL_APIENTRY glLineWidthx (GLfixed width) |
|
1820 { |
|
1821 GLES_ENTER(); |
|
1822 ctx->DGL().glLineWidth (X_TO_F(width)); |
|
1823 GLES_LEAVE(); |
|
1824 } |
|
1825 GL_API void GL_APIENTRY glLoadIdentity (void) |
|
1826 { |
|
1827 GLES_ENTER(); |
|
1828 ctx->DGL().glLoadIdentity (); |
|
1829 GLES_LEAVE(); |
|
1830 } |
|
1831 GL_API void GL_APIENTRY glLoadMatrixx (const GLfixed *m) |
|
1832 { |
|
1833 GLES_ENTER(); |
|
1834 GLfloat fm[16]; |
|
1835 for(int i = 0; i < 16; i++) |
|
1836 { |
|
1837 fm[i] = X_TO_F(m[i]); |
|
1838 } |
|
1839 ctx->DGL().glLoadMatrixf (fm); |
|
1840 GLES_LEAVE(); |
|
1841 } |
|
1842 GL_API void GL_APIENTRY glLogicOp (GLenum opcode) |
|
1843 { |
|
1844 GLES_ENTER(); |
|
1845 ctx->DGL().glLogicOp (opcode); |
|
1846 GLES_LEAVE(); |
|
1847 } |
|
1848 GL_API void GL_APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param) |
|
1849 { |
|
1850 GLES_ENTER(); |
|
1851 GLES_ERROR_IF(!isValidSingleValuedMaterialParamEnum(pname), GL_INVALID_ENUM); |
|
1852 ctx->DGL().glMaterialf (face, pname, X_TO_F(param)); |
|
1853 GLES_LEAVE(); |
|
1854 } |
|
1855 GL_API void GL_APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *params) |
|
1856 { |
|
1857 GLES_ENTER(); |
|
1858 GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM); |
|
1859 GLfloat fparams[4]; |
|
1860 for(int i = 0; i < 4; i++) |
|
1861 { |
|
1862 fparams[i] = X_TO_F(params[i]); |
|
1863 } |
|
1864 ctx->DGL().glMaterialfv (face, pname, fparams); |
|
1865 GLES_LEAVE(); |
|
1866 } |
|
1867 GL_API void GL_APIENTRY glMatrixMode (GLenum mode) |
|
1868 { |
|
1869 GLES_ENTER(); |
|
1870 ctx->DGL().glMatrixMode (mode); |
|
1871 GLES_LEAVE(); |
|
1872 } |
|
1873 GL_API void GL_APIENTRY glMultMatrixx (const GLfixed *m) |
|
1874 { |
|
1875 GLES_ENTER(); |
|
1876 GLfloat fm[16]; |
|
1877 for(int i = 0; i < 16; i++) |
|
1878 { |
|
1879 fm[i] = X_TO_F(m[i]); |
|
1880 } |
|
1881 ctx->DGL().glMultMatrixf (fm); |
|
1882 GLES_LEAVE(); |
|
1883 } |
|
1884 GL_API void GL_APIENTRY glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) |
|
1885 { |
|
1886 GLES_ENTER(); |
|
1887 GLES_ERROR_IF(!isValidTextureTargetEnum(target, ctx->MaxTextureUnits()), GL_INVALID_ENUM); |
|
1888 ctx->DGL().glMultiTexCoord4f (target, X_TO_F(s), X_TO_F(t), X_TO_F(r), X_TO_F(q)); |
|
1889 GLES_LEAVE(); |
|
1890 } |
|
1891 GL_API void GL_APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz) |
|
1892 { |
|
1893 GLES_ENTER(); |
|
1894 ctx->DGL().glNormal3f (X_TO_F(nx), X_TO_F(ny), X_TO_F(nz)); |
|
1895 GLES_LEAVE(); |
|
1896 } |
|
1897 GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer) |
|
1898 { |
|
1899 GLES_ENTER(); |
|
1900 GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM); |
|
1901 GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE); |
|
1902 ctx->SetNormalArray(type, stride, pointer); |
|
1903 GLES_LEAVE(); |
|
1904 } |
|
1905 GL_API void GL_APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) |
|
1906 { |
|
1907 GLES_ENTER(); |
|
1908 ctx->DGL().glOrtho (X_TO_D(left), X_TO_D(right), X_TO_D(bottom), X_TO_D(top), X_TO_D(zNear), X_TO_D(zFar)); |
|
1909 GLES_LEAVE(); |
|
1910 } |
|
1911 GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param) |
|
1912 { |
|
1913 GLES_ENTER(); |
|
1914 ctx->DGL().glPixelStorei (pname, param); |
|
1915 GLES_LEAVE(); |
|
1916 } |
|
1917 GL_API void GL_APIENTRY glPointParameterx (GLenum pname, GLfixed param) |
|
1918 { |
|
1919 GLES_ENTER(); |
|
1920 ctx->DGL().glPointParameterf (pname, X_TO_F(param)); |
|
1921 GLES_LEAVE(); |
|
1922 } |
|
1923 GL_API void GL_APIENTRY glPointParameterxv (GLenum pname, const GLfixed *params) |
|
1924 { |
|
1925 GLES_ENTER(); |
|
1926 GLfloat fparams[3]; |
|
1927 fparams[0] = X_TO_F(params[0]); |
|
1928 if(pname == GL_POINT_DISTANCE_ATTENUATION) |
|
1929 { |
|
1930 fparams[1] = X_TO_F(params[1]); |
|
1931 fparams[2] = X_TO_F(params[2]); |
|
1932 } |
|
1933 ctx->DGL().glPointParameterfv (pname, fparams); |
|
1934 GLES_LEAVE(); |
|
1935 } |
|
1936 GL_API void GL_APIENTRY glPointSizex (GLfixed size) |
|
1937 { |
|
1938 GLES_ENTER(); |
|
1939 ctx->DGL().glPointSize (X_TO_F(size)); |
|
1940 GLES_LEAVE(); |
|
1941 } |
|
1942 GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units) |
|
1943 { |
|
1944 GLES_ENTER(); |
|
1945 ctx->DGL().glPolygonOffset (X_TO_F(factor), X_TO_F(units)); |
|
1946 GLES_LEAVE(); |
|
1947 } |
|
1948 GL_API void GL_APIENTRY glPopMatrix (void) |
|
1949 { |
|
1950 GLES_ENTER(); |
|
1951 ctx->DGL().glPopMatrix(); |
|
1952 GLES_LEAVE(); |
|
1953 } |
|
1954 GL_API void GL_APIENTRY glPushMatrix (void) |
|
1955 { |
|
1956 GLES_ENTER(); |
|
1957 ctx->DGL().glPushMatrix(); |
|
1958 GLES_LEAVE(); |
|
1959 } |
|
1960 bool isValidPixelTypeEnum(GLenum type) |
|
1961 { |
|
1962 switch(type) |
|
1963 { |
|
1964 case GL_UNSIGNED_BYTE: |
|
1965 case GL_UNSIGNED_SHORT_5_6_5: |
|
1966 case GL_UNSIGNED_SHORT_4_4_4_4: |
|
1967 case GL_UNSIGNED_SHORT_5_5_5_1: |
|
1968 return true; |
|
1969 default: |
|
1970 return false; |
|
1971 } |
|
1972 } |
|
1973 GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) |
|
1974 { |
|
1975 GLES_ENTER(); |
|
1976 GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM); |
|
1977 GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM); |
|
1978 GLES_LOCK_READ_SURFACE(); |
|
1979 ctx->DGL().glReadPixels (x, y, width, height, format, type, pixels); |
|
1980 GLES_UNLOCK_SURFACE(); |
|
1981 GLES_LEAVE(); |
|
1982 } |
|
1983 GL_API void GL_APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z) |
|
1984 { |
|
1985 GLES_ENTER(); |
|
1986 ctx->DGL().glRotatef (X_TO_F(angle), X_TO_F(x), X_TO_F(y), X_TO_F(z)); |
|
1987 GLES_LEAVE(); |
|
1988 } |
|
1989 GL_API void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert) |
|
1990 { |
|
1991 GLES_ENTER(); |
|
1992 ctx->DGL().glSampleCoverage (value, invert); |
|
1993 GLES_LEAVE(); |
|
1994 } |
|
1995 GL_API void GL_APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert) |
|
1996 { |
|
1997 GLES_ENTER(); |
|
1998 ctx->DGL().glSampleCoverage (X_TO_F(value), invert); |
|
1999 GLES_LEAVE(); |
|
2000 } |
|
2001 GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z) |
|
2002 { |
|
2003 GLES_ENTER(); |
|
2004 ctx->DGL().glScalef (X_TO_F(x), X_TO_F(y), X_TO_F(z)); |
|
2005 GLES_LEAVE(); |
|
2006 } |
|
2007 GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height) |
|
2008 { |
|
2009 GLES_ENTER(); |
|
2010 ctx->DGL().glScissor (x, y, width, height); |
|
2011 GLES_LEAVE(); |
|
2012 } |
|
2013 GL_API void GL_APIENTRY glShadeModel (GLenum mode) |
|
2014 { |
|
2015 GLES_ENTER(); |
|
2016 ctx->DGL().glShadeModel (mode); |
|
2017 GLES_LEAVE(); |
|
2018 } |
|
2019 GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask) |
|
2020 { |
|
2021 GLES_ENTER(); |
|
2022 ctx->DGL().glStencilFunc (func, ref, mask); |
|
2023 GLES_LEAVE(); |
|
2024 } |
|
2025 GL_API void GL_APIENTRY glStencilMask (GLuint mask) |
|
2026 { |
|
2027 GLES_ENTER(); |
|
2028 ctx->DGL().glStencilMask (mask); |
|
2029 GLES_LEAVE(); |
|
2030 } |
|
2031 GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass) |
|
2032 { |
|
2033 GLES_ENTER(); |
|
2034 ctx->DGL().glStencilOp (fail, zfail, zpass); |
|
2035 GLES_LEAVE(); |
|
2036 } |
|
2037 GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) |
|
2038 { |
|
2039 GLES_ENTER(); |
|
2040 GLES_ERROR_IF(size != 2 && size != 3 && size != 4, GL_INVALID_VALUE); |
|
2041 GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM); |
|
2042 GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE); |
|
2043 ctx->SetTexCoordArray(size, type, stride, pointer); |
|
2044 GLES_LEAVE(); |
|
2045 } |
|
2046 GL_API void GL_APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param) |
|
2047 { |
|
2048 GLES_ENTER(); |
|
2049 GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM); |
|
2050 GLES_ERROR_IF(!isValidSingleValuedTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
2051 ctx->DGL().glTexEnvi (target, pname, param); |
|
2052 GLES_LEAVE(); |
|
2053 } |
|
2054 GL_API void GL_APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param) |
|
2055 { |
|
2056 GLES_ENTER(); |
|
2057 GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM); |
|
2058 GLES_ERROR_IF(!isValidSingleValuedTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
2059 GLfloat fparam; |
|
2060 if(target == GL_TEXTURE_ENV && (pname == GL_RGB_SCALE || pname == GL_ALPHA_SCALE)) |
|
2061 { |
|
2062 fparam = X_TO_F(param); |
|
2063 } |
|
2064 else |
|
2065 { |
|
2066 fparam = static_cast<GLfloat>(param); |
|
2067 } |
|
2068 ctx->DGL().glTexEnvf (target, pname, fparam); |
|
2069 GLES_LEAVE(); |
|
2070 } |
|
2071 GL_API void GL_APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params) |
|
2072 { |
|
2073 GLES_ENTER(); |
|
2074 GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM); |
|
2075 GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
2076 ctx->DGL().glTexEnviv (target, pname, params); |
|
2077 GLES_LEAVE(); |
|
2078 } |
|
2079 GL_API void GL_APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params) |
|
2080 { |
|
2081 GLES_ENTER(); |
|
2082 GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM); |
|
2083 GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM); |
|
2084 GLfloat fparams[4]; |
|
2085 switch(pname) |
|
2086 { |
|
2087 case GL_TEXTURE_ENV_COLOR: |
|
2088 fparams[3] = X_TO_F(params[3]); |
|
2089 fparams[2] = X_TO_F(params[2]); |
|
2090 fparams[1] = X_TO_F(params[1]); |
|
2091 // fall-through |
|
2092 case GL_RGB_SCALE: |
|
2093 case GL_ALPHA_SCALE: |
|
2094 fparams[0] = X_TO_F(params[0]); |
|
2095 break; |
|
2096 default: |
|
2097 fparams[0] = static_cast<GLfloat>(params[0]); |
|
2098 } |
|
2099 ctx->DGL().glTexEnvfv (target, pname, fparams); |
|
2100 GLES_LEAVE(); |
|
2101 } |
|
2102 GL_API void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) |
|
2103 { |
|
2104 GLES_ENTER(); |
|
2105 GLES_ERROR_IF(!isValidPixelFormatEnum(internalformat), GL_INVALID_ENUM); |
|
2106 GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM); |
|
2107 GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM); |
|
2108 GLES_ERROR_IF(internalformat != format, GL_INVALID_ENUM); |
|
2109 GLES_ERROR_IF(isPalettedFormat(internalformat), GL_INVALID_OPERATION); |
|
2110 |
|
2111 ctx->DGL().glTexImage2D (target, level, internalformat, width, height, border, format, type, pixels); |
|
2112 if(ctx->GetHostError() == GL_NO_ERROR) |
|
2113 { |
|
2114 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
2115 GLES_ASSERT(texture != NULL); |
|
2116 texture->SetLevel(level, internalformat, width, height); |
|
2117 |
|
2118 GLint genMipmap; |
|
2119 ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap); |
|
2120 if(level == 0 && genMipmap) |
|
2121 { |
|
2122 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
2123 GLES_ASSERT(texture != NULL); |
|
2124 texture->GenerateMipmap(); |
|
2125 } |
|
2126 |
|
2127 if(texture->Level(level)->boundSurface != NULL) |
|
2128 { |
|
2129 // Texture is respecified. Release the bound EGLSurface. |
|
2130 glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level); |
|
2131 texture->Level(level)->boundSurface = NULL; |
|
2132 } |
|
2133 } |
|
2134 |
|
2135 GLES_LEAVE(); |
|
2136 } |
|
2137 GL_API void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param) |
|
2138 { |
|
2139 GLES_ENTER(); |
|
2140 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
2141 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
2142 ctx->DGL().glTexParameteri (target, pname, param); |
|
2143 GLES_LEAVE(); |
|
2144 } |
|
2145 GL_API void GL_APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param) |
|
2146 { |
|
2147 GLES_ENTER(); |
|
2148 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
2149 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
2150 ctx->DGL().glTexParameterf (target, pname, static_cast<GLfloat>(param)); |
|
2151 GLES_LEAVE(); |
|
2152 } |
|
2153 GL_API void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params) |
|
2154 { |
|
2155 GLES_ENTER(); |
|
2156 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
2157 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
2158 ctx->DGL().glTexParameteriv (target, pname, params); |
|
2159 GLES_LEAVE(); |
|
2160 } |
|
2161 GL_API void GL_APIENTRY glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params) |
|
2162 { |
|
2163 GLES_ENTER(); |
|
2164 GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM); |
|
2165 GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM); |
|
2166 GLfloat fparam = static_cast<GLfloat>(params[0]); |
|
2167 ctx->DGL().glTexParameterfv (target, pname, &fparam); |
|
2168 GLES_LEAVE(); |
|
2169 } |
|
2170 GL_API void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) |
|
2171 { |
|
2172 GLES_ENTER(); |
|
2173 GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM); |
|
2174 GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM); |
|
2175 |
|
2176 ctx->DGL().glTexSubImage2D (target, level, xoffset, yoffset, width, height, format, type, pixels); |
|
2177 |
|
2178 if(ctx->GetHostError() == GL_NO_ERROR) |
|
2179 { |
|
2180 GLint genMipmap; |
|
2181 ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap); |
|
2182 if(level == 0 && genMipmap) |
|
2183 { |
|
2184 GLESTexture* texture = ctx->Texture(ctx->TextureBinding()); |
|
2185 GLES_ASSERT(texture != NULL); |
|
2186 texture->GenerateMipmap(); |
|
2187 } |
|
2188 } |
|
2189 |
|
2190 GLES_LEAVE(); |
|
2191 } |
|
2192 GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z) |
|
2193 { |
|
2194 GLES_ENTER(); |
|
2195 ctx->DGL().glTranslatef (X_TO_F(x), X_TO_F(y), X_TO_F(z)); |
|
2196 GLES_LEAVE(); |
|
2197 } |
|
2198 GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) |
|
2199 { |
|
2200 GLES_ENTER(); |
|
2201 GLES_ERROR_IF(size != 2 && size != 3 && size != 4, GL_INVALID_VALUE); |
|
2202 GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM); |
|
2203 GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE); |
|
2204 ctx->SetVertexArray(size, type, stride, pointer); |
|
2205 GLES_LEAVE(); |
|
2206 } |
|
2207 GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height) |
|
2208 { |
|
2209 GLES_ENTER(); |
|
2210 ctx->DGL().glViewport (x, y, width, height); |
|
2211 GLES_LEAVE(); |
|
2212 } |
|
2213 |
|
2214 #ifdef GL_OES_point_size_array |
|
2215 GL_API void GL_APIENTRY glPointSizePointerOES (GLenum type, GLsizei stride, const GLvoid *pointer) |
|
2216 { |
|
2217 GLES_ENTER(); |
|
2218 GLES_ERROR_IF(type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM); |
|
2219 GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE); |
|
2220 ctx->SetPointerSizeArray(type, stride, pointer); |
|
2221 GLES_LEAVE(); |
|
2222 } |
|
2223 #endif |
|
2224 |
|
2225 #ifdef __cplusplus |
|
2226 } |
|
2227 #endif |