blob: 8406e4b287e68306b472b1279d0e7b67156f0ff1 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8
9#define GL_APICALL
10#include <GLES2/gl2.h>
11#include <GLES2/gl2ext.h>
12
daniel@transgaming.com00c75962010-03-11 20:36:15 +000013#include <exception>
14#include <limits>
15
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000016#include "common/debug.h"
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000017#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018
19#include "libGLESv2/main.h"
20#include "libGLESv2/mathutil.h"
21#include "libGLESv2/utilities.h"
22#include "libGLESv2/Buffer.h"
23#include "libGLESv2/Context.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000024#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000025#include "libGLESv2/Framebuffer.h"
26#include "libGLESv2/Program.h"
27#include "libGLESv2/Renderbuffer.h"
28#include "libGLESv2/Shader.h"
29#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000030#include "libGLESv2/Query.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000032bool validImageSize(GLint level, GLsizei width, GLsizei height)
33{
34 if (level < 0 || width < 0 || height < 0)
35 {
36 return false;
37 }
38
39 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
40 {
41 return true;
42 }
43
44 if (level == 0)
45 {
46 return true;
47 }
48
49 if (gl::isPow2(width) && gl::isPow2(height))
50 {
51 return true;
52 }
53
54 return false;
55}
56
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +000057bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
58 GLint xoffset, GLint yoffset, GLint level, GLenum format,
59 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +000060{
61 if (!texture)
62 {
63 return error(GL_INVALID_OPERATION, false);
64 }
65
66 if (compressed != texture->isCompressed())
67 {
68 return error(GL_INVALID_OPERATION, false);
69 }
70
71 if (format != GL_NONE && format != texture->getInternalFormat())
72 {
73 return error(GL_INVALID_OPERATION, false);
74 }
75
76 if (compressed)
77 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +000078 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
79 (height % 4 != 0 && height != texture->getHeight(0)))
80 {
81 return error(GL_INVALID_OPERATION, false);
82 }
83 }
84
85 if (xoffset + width > texture->getWidth(level) ||
86 yoffset + height > texture->getHeight(level))
87 {
88 return error(GL_INVALID_VALUE, false);
89 }
90
91 return true;
92}
93
94bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
95 GLint xoffset, GLint yoffset, GLint level, GLenum format,
96 gl::TextureCubeMap *texture)
97{
98 if (!texture)
99 {
100 return error(GL_INVALID_OPERATION, false);
101 }
102
103 if (compressed != texture->isCompressed())
104 {
105 return error(GL_INVALID_OPERATION, false);
106 }
107
108 if (format != GL_NONE && format != texture->getInternalFormat())
109 {
110 return error(GL_INVALID_OPERATION, false);
111 }
112
113 if (compressed)
114 {
115 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000116 (height % 4 != 0 && height != texture->getHeight(0)))
117 {
118 return error(GL_INVALID_OPERATION, false);
119 }
120 }
121
122 if (xoffset + width > texture->getWidth(level) ||
123 yoffset + height > texture->getHeight(level))
124 {
125 return error(GL_INVALID_VALUE, false);
126 }
127
128 return true;
129}
130
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000131// check for combinations of format and type that are valid for ReadPixels
132bool validReadFormatType(GLenum format, GLenum type)
133{
134 switch (format)
135 {
136 case GL_RGBA:
137 switch (type)
138 {
139 case GL_UNSIGNED_BYTE:
140 break;
141 default:
142 return false;
143 }
144 break;
145 case GL_BGRA_EXT:
146 switch (type)
147 {
148 case GL_UNSIGNED_BYTE:
149 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
150 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
151 break;
152 default:
153 return false;
154 }
155 break;
156 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
157 switch (type)
158 {
159 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
160 break;
161 default:
162 return false;
163 }
164 break;
165 default:
166 return false;
167 }
168 return true;
169}
170
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171extern "C"
172{
173
174void __stdcall glActiveTexture(GLenum texture)
175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000176 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000177
178 try
179 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000181
182 if (context)
183 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000184 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
185 {
186 return error(GL_INVALID_ENUM);
187 }
188
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000189 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000190 }
191 }
192 catch(std::bad_alloc&)
193 {
194 return error(GL_OUT_OF_MEMORY);
195 }
196}
197
198void __stdcall glAttachShader(GLuint program, GLuint shader)
199{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000200 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000201
202 try
203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000205
206 if (context)
207 {
208 gl::Program *programObject = context->getProgram(program);
209 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000210
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000211 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000213 if (context->getShader(program))
214 {
215 return error(GL_INVALID_OPERATION);
216 }
217 else
218 {
219 return error(GL_INVALID_VALUE);
220 }
221 }
222
223 if (!shaderObject)
224 {
225 if (context->getProgram(shader))
226 {
227 return error(GL_INVALID_OPERATION);
228 }
229 else
230 {
231 return error(GL_INVALID_VALUE);
232 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233 }
234
235 if (!programObject->attachShader(shaderObject))
236 {
237 return error(GL_INVALID_OPERATION);
238 }
239 }
240 }
241 catch(std::bad_alloc&)
242 {
243 return error(GL_OUT_OF_MEMORY);
244 }
245}
246
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000247void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
248{
249 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
250
251 try
252 {
253 switch (target)
254 {
255 case GL_ANY_SAMPLES_PASSED_EXT:
256 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
257 break;
258 default:
259 return error(GL_INVALID_ENUM);
260 }
261
262 if (id == 0)
263 {
264 return error(GL_INVALID_OPERATION);
265 }
266
267 gl::Context *context = gl::getNonLostContext();
268
269 if (context)
270 {
271 context->beginQuery(target, id);
272 }
273 }
274 catch(std::bad_alloc&)
275 {
276 return error(GL_OUT_OF_MEMORY);
277 }
278}
279
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000280void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000281{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000282 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000283
284 try
285 {
286 if (index >= gl::MAX_VERTEX_ATTRIBS)
287 {
288 return error(GL_INVALID_VALUE);
289 }
290
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000296
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297 if (!programObject)
298 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000299 if (context->getShader(program))
300 {
301 return error(GL_INVALID_OPERATION);
302 }
303 else
304 {
305 return error(GL_INVALID_VALUE);
306 }
307 }
308
309 if (strncmp(name, "gl_", 3) == 0)
310 {
311 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000312 }
313
314 programObject->bindAttributeLocation(index, name);
315 }
316 }
317 catch(std::bad_alloc&)
318 {
319 return error(GL_OUT_OF_MEMORY);
320 }
321}
322
323void __stdcall glBindBuffer(GLenum target, GLuint buffer)
324{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000325 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326
327 try
328 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330
331 if (context)
332 {
333 switch (target)
334 {
335 case GL_ARRAY_BUFFER:
336 context->bindArrayBuffer(buffer);
337 return;
338 case GL_ELEMENT_ARRAY_BUFFER:
339 context->bindElementArrayBuffer(buffer);
340 return;
341 default:
342 return error(GL_INVALID_ENUM);
343 }
344 }
345 }
346 catch(std::bad_alloc&)
347 {
348 return error(GL_OUT_OF_MEMORY);
349 }
350}
351
352void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
353{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000354 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000355
356 try
357 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000358 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000359 {
360 return error(GL_INVALID_ENUM);
361 }
362
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000363 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000364
365 if (context)
366 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000367 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
368 {
369 context->bindReadFramebuffer(framebuffer);
370 }
371
372 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
373 {
374 context->bindDrawFramebuffer(framebuffer);
375 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 }
377 }
378 catch(std::bad_alloc&)
379 {
380 return error(GL_OUT_OF_MEMORY);
381 }
382}
383
384void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000386 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000387
388 try
389 {
390 if (target != GL_RENDERBUFFER)
391 {
392 return error(GL_INVALID_ENUM);
393 }
394
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000396
397 if (context)
398 {
399 context->bindRenderbuffer(renderbuffer);
400 }
401 }
402 catch(std::bad_alloc&)
403 {
404 return error(GL_OUT_OF_MEMORY);
405 }
406}
407
408void __stdcall glBindTexture(GLenum target, GLuint texture)
409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000410 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000411
412 try
413 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000415
416 if (context)
417 {
418 gl::Texture *textureObject = context->getTexture(texture);
419
420 if (textureObject && textureObject->getTarget() != target && texture != 0)
421 {
422 return error(GL_INVALID_OPERATION);
423 }
424
425 switch (target)
426 {
427 case GL_TEXTURE_2D:
428 context->bindTexture2D(texture);
429 return;
430 case GL_TEXTURE_CUBE_MAP:
431 context->bindTextureCubeMap(texture);
432 return;
433 default:
434 return error(GL_INVALID_ENUM);
435 }
436 }
437 }
438 catch(std::bad_alloc&)
439 {
440 return error(GL_OUT_OF_MEMORY);
441 }
442}
443
444void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000446 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000447 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448
449 try
450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000451 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000452
453 if (context)
454 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000455 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000456 }
457 }
458 catch(std::bad_alloc&)
459 {
460 return error(GL_OUT_OF_MEMORY);
461 }
462}
463
464void __stdcall glBlendEquation(GLenum mode)
465{
466 glBlendEquationSeparate(mode, mode);
467}
468
469void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
470{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000471 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000472
473 try
474 {
475 switch (modeRGB)
476 {
477 case GL_FUNC_ADD:
478 case GL_FUNC_SUBTRACT:
479 case GL_FUNC_REVERSE_SUBTRACT:
480 break;
481 default:
482 return error(GL_INVALID_ENUM);
483 }
484
485 switch (modeAlpha)
486 {
487 case GL_FUNC_ADD:
488 case GL_FUNC_SUBTRACT:
489 case GL_FUNC_REVERSE_SUBTRACT:
490 break;
491 default:
492 return error(GL_INVALID_ENUM);
493 }
494
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000496
497 if (context)
498 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000499 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000500 }
501 }
502 catch(std::bad_alloc&)
503 {
504 return error(GL_OUT_OF_MEMORY);
505 }
506}
507
508void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
509{
510 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
511}
512
513void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
514{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000515 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000516 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517
518 try
519 {
520 switch (srcRGB)
521 {
522 case GL_ZERO:
523 case GL_ONE:
524 case GL_SRC_COLOR:
525 case GL_ONE_MINUS_SRC_COLOR:
526 case GL_DST_COLOR:
527 case GL_ONE_MINUS_DST_COLOR:
528 case GL_SRC_ALPHA:
529 case GL_ONE_MINUS_SRC_ALPHA:
530 case GL_DST_ALPHA:
531 case GL_ONE_MINUS_DST_ALPHA:
532 case GL_CONSTANT_COLOR:
533 case GL_ONE_MINUS_CONSTANT_COLOR:
534 case GL_CONSTANT_ALPHA:
535 case GL_ONE_MINUS_CONSTANT_ALPHA:
536 case GL_SRC_ALPHA_SATURATE:
537 break;
538 default:
539 return error(GL_INVALID_ENUM);
540 }
541
542 switch (dstRGB)
543 {
544 case GL_ZERO:
545 case GL_ONE:
546 case GL_SRC_COLOR:
547 case GL_ONE_MINUS_SRC_COLOR:
548 case GL_DST_COLOR:
549 case GL_ONE_MINUS_DST_COLOR:
550 case GL_SRC_ALPHA:
551 case GL_ONE_MINUS_SRC_ALPHA:
552 case GL_DST_ALPHA:
553 case GL_ONE_MINUS_DST_ALPHA:
554 case GL_CONSTANT_COLOR:
555 case GL_ONE_MINUS_CONSTANT_COLOR:
556 case GL_CONSTANT_ALPHA:
557 case GL_ONE_MINUS_CONSTANT_ALPHA:
558 break;
559 default:
560 return error(GL_INVALID_ENUM);
561 }
562
563 switch (srcAlpha)
564 {
565 case GL_ZERO:
566 case GL_ONE:
567 case GL_SRC_COLOR:
568 case GL_ONE_MINUS_SRC_COLOR:
569 case GL_DST_COLOR:
570 case GL_ONE_MINUS_DST_COLOR:
571 case GL_SRC_ALPHA:
572 case GL_ONE_MINUS_SRC_ALPHA:
573 case GL_DST_ALPHA:
574 case GL_ONE_MINUS_DST_ALPHA:
575 case GL_CONSTANT_COLOR:
576 case GL_ONE_MINUS_CONSTANT_COLOR:
577 case GL_CONSTANT_ALPHA:
578 case GL_ONE_MINUS_CONSTANT_ALPHA:
579 case GL_SRC_ALPHA_SATURATE:
580 break;
581 default:
582 return error(GL_INVALID_ENUM);
583 }
584
585 switch (dstAlpha)
586 {
587 case GL_ZERO:
588 case GL_ONE:
589 case GL_SRC_COLOR:
590 case GL_ONE_MINUS_SRC_COLOR:
591 case GL_DST_COLOR:
592 case GL_ONE_MINUS_DST_COLOR:
593 case GL_SRC_ALPHA:
594 case GL_ONE_MINUS_SRC_ALPHA:
595 case GL_DST_ALPHA:
596 case GL_ONE_MINUS_DST_ALPHA:
597 case GL_CONSTANT_COLOR:
598 case GL_ONE_MINUS_CONSTANT_COLOR:
599 case GL_CONSTANT_ALPHA:
600 case GL_ONE_MINUS_CONSTANT_ALPHA:
601 break;
602 default:
603 return error(GL_INVALID_ENUM);
604 }
605
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000606 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
607 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
608
609 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
610 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
611
612 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000614 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
615 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000616 }
617
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000618 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619
620 if (context)
621 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000622 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000623 }
624 }
625 catch(std::bad_alloc&)
626 {
627 return error(GL_OUT_OF_MEMORY);
628 }
629}
630
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000631void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000633 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000634 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000635
636 try
637 {
638 if (size < 0)
639 {
640 return error(GL_INVALID_VALUE);
641 }
642
643 switch (usage)
644 {
645 case GL_STREAM_DRAW:
646 case GL_STATIC_DRAW:
647 case GL_DYNAMIC_DRAW:
648 break;
649 default:
650 return error(GL_INVALID_ENUM);
651 }
652
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000653 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654
655 if (context)
656 {
657 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 switch (target)
660 {
661 case GL_ARRAY_BUFFER:
662 buffer = context->getArrayBuffer();
663 break;
664 case GL_ELEMENT_ARRAY_BUFFER:
665 buffer = context->getElementArrayBuffer();
666 break;
667 default:
668 return error(GL_INVALID_ENUM);
669 }
670
671 if (!buffer)
672 {
673 return error(GL_INVALID_OPERATION);
674 }
675
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000676 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000677 }
678 }
679 catch(std::bad_alloc&)
680 {
681 return error(GL_OUT_OF_MEMORY);
682 }
683}
684
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000685void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000686{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000687 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000688 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000689
690 try
691 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000692 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693 {
694 return error(GL_INVALID_VALUE);
695 }
696
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000697 if (data == NULL)
698 {
699 return;
700 }
701
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000703
704 if (context)
705 {
706 gl::Buffer *buffer;
707
708 switch (target)
709 {
710 case GL_ARRAY_BUFFER:
711 buffer = context->getArrayBuffer();
712 break;
713 case GL_ELEMENT_ARRAY_BUFFER:
714 buffer = context->getElementArrayBuffer();
715 break;
716 default:
717 return error(GL_INVALID_ENUM);
718 }
719
720 if (!buffer)
721 {
722 return error(GL_INVALID_OPERATION);
723 }
724
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000725 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000726 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000727 return error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000728 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000729
730 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000731 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000732 }
733 catch(std::bad_alloc&)
734 {
735 return error(GL_OUT_OF_MEMORY);
736 }
737}
738
739GLenum __stdcall glCheckFramebufferStatus(GLenum target)
740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000741 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000742
743 try
744 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000745 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746 {
747 return error(GL_INVALID_ENUM, 0);
748 }
749
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000750 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000751
752 if (context)
753 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000754 gl::Framebuffer *framebuffer = NULL;
755 if (target == GL_READ_FRAMEBUFFER_ANGLE)
756 {
757 framebuffer = context->getReadFramebuffer();
758 }
759 else
760 {
761 framebuffer = context->getDrawFramebuffer();
762 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763
764 return framebuffer->completeness();
765 }
766 }
767 catch(std::bad_alloc&)
768 {
769 return error(GL_OUT_OF_MEMORY, 0);
770 }
771
772 return 0;
773}
774
775void __stdcall glClear(GLbitfield mask)
776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000777 EVENT("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778
779 try
780 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000781 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 if (context)
784 {
785 context->clear(mask);
786 }
787 }
788 catch(std::bad_alloc&)
789 {
790 return error(GL_OUT_OF_MEMORY);
791 }
792}
793
794void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
795{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000796 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000797 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000798
799 try
800 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802
803 if (context)
804 {
805 context->setClearColor(red, green, blue, alpha);
806 }
807 }
808 catch(std::bad_alloc&)
809 {
810 return error(GL_OUT_OF_MEMORY);
811 }
812}
813
814void __stdcall glClearDepthf(GLclampf depth)
815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000816 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000817
818 try
819 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821
822 if (context)
823 {
824 context->setClearDepth(depth);
825 }
826 }
827 catch(std::bad_alloc&)
828 {
829 return error(GL_OUT_OF_MEMORY);
830 }
831}
832
833void __stdcall glClearStencil(GLint s)
834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836
837 try
838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000840
841 if (context)
842 {
843 context->setClearStencil(s);
844 }
845 }
846 catch(std::bad_alloc&)
847 {
848 return error(GL_OUT_OF_MEMORY);
849 }
850}
851
852void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000854 EVENT("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000855 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000856
857 try
858 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860
861 if (context)
862 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000863 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000864 }
865 }
866 catch(std::bad_alloc&)
867 {
868 return error(GL_OUT_OF_MEMORY);
869 }
870}
871
872void __stdcall glCompileShader(GLuint shader)
873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000874 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000875
876 try
877 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000878 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000879
880 if (context)
881 {
882 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000883
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000884 if (!shaderObject)
885 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000886 if (context->getProgram(shader))
887 {
888 return error(GL_INVALID_OPERATION);
889 }
890 else
891 {
892 return error(GL_INVALID_VALUE);
893 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000894 }
895
896 shaderObject->compile();
897 }
898 }
899 catch(std::bad_alloc&)
900 {
901 return error(GL_OUT_OF_MEMORY);
902 }
903}
904
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000905void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
906 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000908 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000909 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000910 target, level, internalformat, width, height, border, imageSize, data);
911
912 try
913 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +0000914 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +0000915 {
916 return error(GL_INVALID_VALUE);
917 }
918
daniel@transgaming.com01868132010-08-24 19:21:17 +0000919 switch (internalformat)
920 {
921 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
922 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +0000923 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
924 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000925 break;
926 default:
927 return error(GL_INVALID_ENUM);
928 }
929
930 if (border != 0)
931 {
932 return error(GL_INVALID_VALUE);
933 }
934
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000935 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000936
937 if (context)
938 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000939 if (level > context->getMaximumTextureLevel())
940 {
941 return error(GL_INVALID_VALUE);
942 }
943
944 switch (target)
945 {
946 case GL_TEXTURE_2D:
947 if (width > (context->getMaximumTextureDimension() >> level) ||
948 height > (context->getMaximumTextureDimension() >> level))
949 {
950 return error(GL_INVALID_VALUE);
951 }
952 break;
953 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
954 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
955 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
956 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
957 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
958 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
959 if (width != height)
960 {
961 return error(GL_INVALID_VALUE);
962 }
963
964 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
965 height > (context->getMaximumCubeTextureDimension() >> level))
966 {
967 return error(GL_INVALID_VALUE);
968 }
969 break;
970 default:
971 return error(GL_INVALID_ENUM);
972 }
973
gman@chromium.org50c526d2011-08-10 05:19:44 +0000974 switch (internalformat) {
975 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
976 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
977 if (!context->supportsDXT1Textures())
978 {
979 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
980 }
981 break;
982 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
983 if (!context->supportsDXT3Textures())
984 {
985 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
986 }
987 break;
988 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
989 if (!context->supportsDXT5Textures())
990 {
991 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
992 }
993 break;
994 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000995 }
996
997 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
998 {
999 return error(GL_INVALID_VALUE);
1000 }
1001
1002 if (target == GL_TEXTURE_2D)
1003 {
1004 gl::Texture2D *texture = context->getTexture2D();
1005
1006 if (!texture)
1007 {
1008 return error(GL_INVALID_OPERATION);
1009 }
1010
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001011 if (texture->isImmutable())
1012 {
1013 return error(GL_INVALID_OPERATION);
1014 }
1015
daniel@transgaming.com01868132010-08-24 19:21:17 +00001016 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1017 }
1018 else
1019 {
1020 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1021
1022 if (!texture)
1023 {
1024 return error(GL_INVALID_OPERATION);
1025 }
1026
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001027 if (texture->isImmutable())
1028 {
1029 return error(GL_INVALID_OPERATION);
1030 }
1031
daniel@transgaming.com01868132010-08-24 19:21:17 +00001032 switch (target)
1033 {
1034 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1035 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1036 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1037 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1038 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1039 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1040 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1041 break;
1042 default: UNREACHABLE();
1043 }
1044 }
1045 }
1046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001047 }
1048 catch(std::bad_alloc&)
1049 {
1050 return error(GL_OUT_OF_MEMORY);
1051 }
1052}
1053
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001054void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1055 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001056{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001057 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001058 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001059 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001060 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1061
1062 try
1063 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001064 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001065 {
1066 return error(GL_INVALID_ENUM);
1067 }
1068
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001069 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001070 {
1071 return error(GL_INVALID_VALUE);
1072 }
1073
daniel@transgaming.com01868132010-08-24 19:21:17 +00001074 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001075 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001076 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1077 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001078 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1079 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001080 break;
1081 default:
1082 return error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001083 }
1084
daniel@transgaming.com01868132010-08-24 19:21:17 +00001085 if (width == 0 || height == 0 || data == NULL)
1086 {
1087 return;
1088 }
1089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001091
1092 if (context)
1093 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001094 if (level > context->getMaximumTextureLevel())
1095 {
1096 return error(GL_INVALID_VALUE);
1097 }
1098
gman@chromium.org50c526d2011-08-10 05:19:44 +00001099 switch (format) {
1100 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1101 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1102 if (!context->supportsDXT1Textures())
1103 {
1104 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1105 }
1106 break;
1107 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1108 if (!context->supportsDXT3Textures())
1109 {
1110 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1111 }
1112 break;
1113 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1114 if (!context->supportsDXT5Textures())
1115 {
1116 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1117 }
1118 break;
1119 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001120 }
1121
1122 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1123 {
1124 return error(GL_INVALID_VALUE);
1125 }
1126
1127 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1128 {
1129 return error(GL_INVALID_OPERATION); // we wait to check the offsets until this point, because the multiple-of-four restriction
gman@chromium.org50c526d2011-08-10 05:19:44 +00001130 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001131 }
1132
1133 if (target == GL_TEXTURE_2D)
1134 {
1135 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001136 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001137 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001138 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001139 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001140 }
1141 else if (gl::IsCubemapTextureTarget(target))
1142 {
1143 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001144 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001145 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001146 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001147 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001148 }
1149 else
1150 {
1151 UNREACHABLE();
1152 }
1153 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001154 }
1155 catch(std::bad_alloc&)
1156 {
1157 return error(GL_OUT_OF_MEMORY);
1158 }
1159}
1160
1161void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001163 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001164 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001165 target, level, internalformat, x, y, width, height, border);
1166
1167 try
1168 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001169 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001170 {
1171 return error(GL_INVALID_VALUE);
1172 }
1173
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001174 if (border != 0)
1175 {
1176 return error(GL_INVALID_VALUE);
1177 }
1178
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001180
1181 if (context)
1182 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001183 if (level > context->getMaximumTextureLevel())
1184 {
1185 return error(GL_INVALID_VALUE);
1186 }
1187
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001188 switch (target)
1189 {
1190 case GL_TEXTURE_2D:
1191 if (width > (context->getMaximumTextureDimension() >> level) ||
1192 height > (context->getMaximumTextureDimension() >> level))
1193 {
1194 return error(GL_INVALID_VALUE);
1195 }
1196 break;
1197 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1198 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1199 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1200 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1201 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1202 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1203 if (width != height)
1204 {
1205 return error(GL_INVALID_VALUE);
1206 }
1207
1208 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1209 height > (context->getMaximumCubeTextureDimension() >> level))
1210 {
1211 return error(GL_INVALID_VALUE);
1212 }
1213 break;
1214 default:
1215 return error(GL_INVALID_ENUM);
1216 }
1217
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001218 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001219
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001220 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1221 {
1222 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1223 }
1224
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001225 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1226 {
1227 return error(GL_INVALID_OPERATION);
1228 }
1229
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001230 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001231 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001232
1233 // [OpenGL ES 2.0.24] table 3.9
1234 switch (internalformat)
1235 {
1236 case GL_ALPHA:
1237 if (colorbufferFormat != GL_ALPHA &&
1238 colorbufferFormat != GL_RGBA &&
1239 colorbufferFormat != GL_RGBA4 &&
1240 colorbufferFormat != GL_RGB5_A1 &&
1241 colorbufferFormat != GL_RGBA8_OES)
1242 {
1243 return error(GL_INVALID_OPERATION);
1244 }
1245 break;
1246 case GL_LUMINANCE:
1247 case GL_RGB:
1248 if (colorbufferFormat != GL_RGB &&
1249 colorbufferFormat != GL_RGB565 &&
1250 colorbufferFormat != GL_RGB8_OES &&
1251 colorbufferFormat != GL_RGBA &&
1252 colorbufferFormat != GL_RGBA4 &&
1253 colorbufferFormat != GL_RGB5_A1 &&
1254 colorbufferFormat != GL_RGBA8_OES)
1255 {
1256 return error(GL_INVALID_OPERATION);
1257 }
1258 break;
1259 case GL_LUMINANCE_ALPHA:
1260 case GL_RGBA:
1261 if (colorbufferFormat != GL_RGBA &&
1262 colorbufferFormat != GL_RGBA4 &&
1263 colorbufferFormat != GL_RGB5_A1 &&
1264 colorbufferFormat != GL_RGBA8_OES)
1265 {
1266 return error(GL_INVALID_OPERATION);
1267 }
1268 break;
1269 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1270 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001271 if (context->supportsDXT1Textures())
1272 {
1273 return error(GL_INVALID_OPERATION);
1274 }
1275 else
1276 {
1277 return error(GL_INVALID_ENUM);
1278 }
1279 break;
1280 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1281 if (context->supportsDXT3Textures())
1282 {
1283 return error(GL_INVALID_OPERATION);
1284 }
1285 else
1286 {
1287 return error(GL_INVALID_ENUM);
1288 }
1289 break;
1290 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1291 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001292 {
1293 return error(GL_INVALID_OPERATION);
1294 }
1295 else
1296 {
1297 return error(GL_INVALID_ENUM);
1298 }
1299 break;
1300 default:
1301 return error(GL_INVALID_ENUM);
1302 }
1303
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001304 if (target == GL_TEXTURE_2D)
1305 {
1306 gl::Texture2D *texture = context->getTexture2D();
1307
1308 if (!texture)
1309 {
1310 return error(GL_INVALID_OPERATION);
1311 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001312
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001313 if (texture->isImmutable())
1314 {
1315 return error(GL_INVALID_OPERATION);
1316 }
1317
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001318 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001319 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001320 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001321 {
1322 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1323
1324 if (!texture)
1325 {
1326 return error(GL_INVALID_OPERATION);
1327 }
1328
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001329 if (texture->isImmutable())
1330 {
1331 return error(GL_INVALID_OPERATION);
1332 }
1333
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001334 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001335 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001336 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001337 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338 }
1339 catch(std::bad_alloc&)
1340 {
1341 return error(GL_OUT_OF_MEMORY);
1342 }
1343}
1344
1345void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1346{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001347 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001348 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349 target, level, xoffset, yoffset, x, y, width, height);
1350
1351 try
1352 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001353 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001354 {
1355 return error(GL_INVALID_ENUM);
1356 }
1357
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001358 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001359 {
1360 return error(GL_INVALID_VALUE);
1361 }
1362
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001363 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1364 {
1365 return error(GL_INVALID_VALUE);
1366 }
1367
1368 if (width == 0 || height == 0)
1369 {
1370 return;
1371 }
1372
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001374
1375 if (context)
1376 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001377 if (level > context->getMaximumTextureLevel())
1378 {
1379 return error(GL_INVALID_VALUE);
1380 }
1381
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001382 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001383
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001384 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1385 {
1386 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1387 }
1388
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001389 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1390 {
1391 return error(GL_INVALID_OPERATION);
1392 }
1393
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001394 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001395 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001396 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001397 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001398
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001399 if (target == GL_TEXTURE_2D)
1400 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001401 gl::Texture2D *tex2d = context->getTexture2D();
1402
1403 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, tex2d))
1404 {
1405 return; // error already registered by validateSubImageParams
1406 }
1407 textureFormat = tex2d->getInternalFormat();
1408 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001409 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001410 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001411 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001412 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1413
1414 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, level, GL_NONE, texcube))
1415 {
1416 return; // error already registered by validateSubImageParams
1417 }
1418 textureFormat = texcube->getInternalFormat();
1419 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001420 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001421 else UNREACHABLE();
1422
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001423 // [OpenGL ES 2.0.24] table 3.9
1424 switch (textureFormat)
1425 {
1426 case GL_ALPHA:
1427 if (colorbufferFormat != GL_ALPHA &&
1428 colorbufferFormat != GL_RGBA &&
1429 colorbufferFormat != GL_RGBA4 &&
1430 colorbufferFormat != GL_RGB5_A1 &&
1431 colorbufferFormat != GL_RGBA8_OES)
1432 {
1433 return error(GL_INVALID_OPERATION);
1434 }
1435 break;
1436 case GL_LUMINANCE:
1437 case GL_RGB:
1438 if (colorbufferFormat != GL_RGB &&
1439 colorbufferFormat != GL_RGB565 &&
1440 colorbufferFormat != GL_RGB8_OES &&
1441 colorbufferFormat != GL_RGBA &&
1442 colorbufferFormat != GL_RGBA4 &&
1443 colorbufferFormat != GL_RGB5_A1 &&
1444 colorbufferFormat != GL_RGBA8_OES)
1445 {
1446 return error(GL_INVALID_OPERATION);
1447 }
1448 break;
1449 case GL_LUMINANCE_ALPHA:
1450 case GL_RGBA:
1451 if (colorbufferFormat != GL_RGBA &&
1452 colorbufferFormat != GL_RGBA4 &&
1453 colorbufferFormat != GL_RGB5_A1 &&
1454 colorbufferFormat != GL_RGBA8_OES)
1455 {
1456 return error(GL_INVALID_OPERATION);
1457 }
1458 break;
1459 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1460 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001461 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1462 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001463 return error(GL_INVALID_OPERATION);
1464 default:
1465 return error(GL_INVALID_OPERATION);
1466 }
1467
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001468 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001471
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001472 catch(std::bad_alloc&)
1473 {
1474 return error(GL_OUT_OF_MEMORY);
1475 }
1476}
1477
1478GLuint __stdcall glCreateProgram(void)
1479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001480 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481
1482 try
1483 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001484 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485
1486 if (context)
1487 {
1488 return context->createProgram();
1489 }
1490 }
1491 catch(std::bad_alloc&)
1492 {
1493 return error(GL_OUT_OF_MEMORY, 0);
1494 }
1495
1496 return 0;
1497}
1498
1499GLuint __stdcall glCreateShader(GLenum type)
1500{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001501 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001502
1503 try
1504 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001506
1507 if (context)
1508 {
1509 switch (type)
1510 {
1511 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001512 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001513 return context->createShader(type);
1514 default:
1515 return error(GL_INVALID_ENUM, 0);
1516 }
1517 }
1518 }
1519 catch(std::bad_alloc&)
1520 {
1521 return error(GL_OUT_OF_MEMORY, 0);
1522 }
1523
1524 return 0;
1525}
1526
1527void __stdcall glCullFace(GLenum mode)
1528{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001529 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001530
1531 try
1532 {
1533 switch (mode)
1534 {
1535 case GL_FRONT:
1536 case GL_BACK:
1537 case GL_FRONT_AND_BACK:
1538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001540
1541 if (context)
1542 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001543 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544 }
1545 }
1546 break;
1547 default:
1548 return error(GL_INVALID_ENUM);
1549 }
1550 }
1551 catch(std::bad_alloc&)
1552 {
1553 return error(GL_OUT_OF_MEMORY);
1554 }
1555}
1556
1557void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1558{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001559 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560
1561 try
1562 {
1563 if (n < 0)
1564 {
1565 return error(GL_INVALID_VALUE);
1566 }
1567
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001568 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569
1570 if (context)
1571 {
1572 for (int i = 0; i < n; i++)
1573 {
1574 context->deleteBuffer(buffers[i]);
1575 }
1576 }
1577 }
1578 catch(std::bad_alloc&)
1579 {
1580 return error(GL_OUT_OF_MEMORY);
1581 }
1582}
1583
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001584void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001586 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001587
1588 try
1589 {
1590 if (n < 0)
1591 {
1592 return error(GL_INVALID_VALUE);
1593 }
1594
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001595 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001596
1597 if (context)
1598 {
1599 for (int i = 0; i < n; i++)
1600 {
1601 context->deleteFence(fences[i]);
1602 }
1603 }
1604 }
1605 catch(std::bad_alloc&)
1606 {
1607 return error(GL_OUT_OF_MEMORY);
1608 }
1609}
1610
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001613 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001614
1615 try
1616 {
1617 if (n < 0)
1618 {
1619 return error(GL_INVALID_VALUE);
1620 }
1621
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001622 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623
1624 if (context)
1625 {
1626 for (int i = 0; i < n; i++)
1627 {
1628 if (framebuffers[i] != 0)
1629 {
1630 context->deleteFramebuffer(framebuffers[i]);
1631 }
1632 }
1633 }
1634 }
1635 catch(std::bad_alloc&)
1636 {
1637 return error(GL_OUT_OF_MEMORY);
1638 }
1639}
1640
1641void __stdcall glDeleteProgram(GLuint program)
1642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001643 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001644
1645 try
1646 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001647 if (program == 0)
1648 {
1649 return;
1650 }
1651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001653
1654 if (context)
1655 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001656 if (!context->getProgram(program))
1657 {
1658 if(context->getShader(program))
1659 {
1660 return error(GL_INVALID_OPERATION);
1661 }
1662 else
1663 {
1664 return error(GL_INVALID_VALUE);
1665 }
1666 }
1667
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001668 context->deleteProgram(program);
1669 }
1670 }
1671 catch(std::bad_alloc&)
1672 {
1673 return error(GL_OUT_OF_MEMORY);
1674 }
1675}
1676
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001677void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1678{
1679 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1680
1681 try
1682 {
1683 if (n < 0)
1684 {
1685 return error(GL_INVALID_VALUE);
1686 }
1687
1688 gl::Context *context = gl::getNonLostContext();
1689
1690 if (context)
1691 {
1692 for (int i = 0; i < n; i++)
1693 {
1694 context->deleteQuery(ids[i]);
1695 }
1696 }
1697 }
1698 catch(std::bad_alloc&)
1699 {
1700 return error(GL_OUT_OF_MEMORY);
1701 }
1702}
1703
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001704void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1705{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001706 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707
1708 try
1709 {
1710 if (n < 0)
1711 {
1712 return error(GL_INVALID_VALUE);
1713 }
1714
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001715 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001716
1717 if (context)
1718 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001719 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720 {
1721 context->deleteRenderbuffer(renderbuffers[i]);
1722 }
1723 }
1724 }
1725 catch(std::bad_alloc&)
1726 {
1727 return error(GL_OUT_OF_MEMORY);
1728 }
1729}
1730
1731void __stdcall glDeleteShader(GLuint shader)
1732{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001733 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001734
1735 try
1736 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001737 if (shader == 0)
1738 {
1739 return;
1740 }
1741
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001742 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001743
1744 if (context)
1745 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001746 if (!context->getShader(shader))
1747 {
1748 if(context->getProgram(shader))
1749 {
1750 return error(GL_INVALID_OPERATION);
1751 }
1752 else
1753 {
1754 return error(GL_INVALID_VALUE);
1755 }
1756 }
1757
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001758 context->deleteShader(shader);
1759 }
1760 }
1761 catch(std::bad_alloc&)
1762 {
1763 return error(GL_OUT_OF_MEMORY);
1764 }
1765}
1766
1767void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001769 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
1773 if (n < 0)
1774 {
1775 return error(GL_INVALID_VALUE);
1776 }
1777
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001778 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779
1780 if (context)
1781 {
1782 for (int i = 0; i < n; i++)
1783 {
1784 if (textures[i] != 0)
1785 {
1786 context->deleteTexture(textures[i]);
1787 }
1788 }
1789 }
1790 }
1791 catch(std::bad_alloc&)
1792 {
1793 return error(GL_OUT_OF_MEMORY);
1794 }
1795}
1796
1797void __stdcall glDepthFunc(GLenum func)
1798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001799 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800
1801 try
1802 {
1803 switch (func)
1804 {
1805 case GL_NEVER:
1806 case GL_ALWAYS:
1807 case GL_LESS:
1808 case GL_LEQUAL:
1809 case GL_EQUAL:
1810 case GL_GREATER:
1811 case GL_GEQUAL:
1812 case GL_NOTEQUAL:
1813 break;
1814 default:
1815 return error(GL_INVALID_ENUM);
1816 }
1817
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001818 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819
1820 if (context)
1821 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001822 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001823 }
1824 }
1825 catch(std::bad_alloc&)
1826 {
1827 return error(GL_OUT_OF_MEMORY);
1828 }
1829}
1830
1831void __stdcall glDepthMask(GLboolean flag)
1832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001833 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834
1835 try
1836 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838
1839 if (context)
1840 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001841 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001842 }
1843 }
1844 catch(std::bad_alloc&)
1845 {
1846 return error(GL_OUT_OF_MEMORY);
1847 }
1848}
1849
1850void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001852 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001853
1854 try
1855 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001857
1858 if (context)
1859 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001860 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 }
1862 }
1863 catch(std::bad_alloc&)
1864 {
1865 return error(GL_OUT_OF_MEMORY);
1866 }
1867}
1868
1869void __stdcall glDetachShader(GLuint program, GLuint shader)
1870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001871 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872
1873 try
1874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876
1877 if (context)
1878 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001879
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001880 gl::Program *programObject = context->getProgram(program);
1881 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001882
1883 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001884 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001885 gl::Shader *shaderByProgramHandle;
1886 shaderByProgramHandle = context->getShader(program);
1887 if (!shaderByProgramHandle)
1888 {
1889 return error(GL_INVALID_VALUE);
1890 }
1891 else
1892 {
1893 return error(GL_INVALID_OPERATION);
1894 }
1895 }
1896
1897 if (!shaderObject)
1898 {
1899 gl::Program *programByShaderHandle = context->getProgram(shader);
1900 if (!programByShaderHandle)
1901 {
1902 return error(GL_INVALID_VALUE);
1903 }
1904 else
1905 {
1906 return error(GL_INVALID_OPERATION);
1907 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001908 }
1909
1910 if (!programObject->detachShader(shaderObject))
1911 {
1912 return error(GL_INVALID_OPERATION);
1913 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001914 }
1915 }
1916 catch(std::bad_alloc&)
1917 {
1918 return error(GL_OUT_OF_MEMORY);
1919 }
1920}
1921
1922void __stdcall glDisable(GLenum cap)
1923{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001924 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925
1926 try
1927 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001929
1930 if (context)
1931 {
1932 switch (cap)
1933 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001934 case GL_CULL_FACE: context->setCullFace(false); break;
1935 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1936 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1937 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1938 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1939 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1940 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1941 case GL_BLEND: context->setBlend(false); break;
1942 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943 default:
1944 return error(GL_INVALID_ENUM);
1945 }
1946 }
1947 }
1948 catch(std::bad_alloc&)
1949 {
1950 return error(GL_OUT_OF_MEMORY);
1951 }
1952}
1953
1954void __stdcall glDisableVertexAttribArray(GLuint index)
1955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001956 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957
1958 try
1959 {
1960 if (index >= gl::MAX_VERTEX_ATTRIBS)
1961 {
1962 return error(GL_INVALID_VALUE);
1963 }
1964
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001965 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001966
1967 if (context)
1968 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001969 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001970 }
1971 }
1972 catch(std::bad_alloc&)
1973 {
1974 return error(GL_OUT_OF_MEMORY);
1975 }
1976}
1977
1978void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001980 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981
1982 try
1983 {
1984 if (count < 0 || first < 0)
1985 {
1986 return error(GL_INVALID_VALUE);
1987 }
1988
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001989 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
1991 if (context)
1992 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001993 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994 }
1995 }
1996 catch(std::bad_alloc&)
1997 {
1998 return error(GL_OUT_OF_MEMORY);
1999 }
2000}
2001
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002002void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2003{
2004 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2005
2006 try
2007 {
2008 if (count < 0 || first < 0 || primcount < 0)
2009 {
2010 return error(GL_INVALID_VALUE);
2011 }
2012
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002013 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002014 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002015 gl::Context *context = gl::getNonLostContext();
2016
2017 if (context)
2018 {
2019 context->drawArrays(mode, first, count, primcount);
2020 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002021 }
2022 }
2023 catch(std::bad_alloc&)
2024 {
2025 return error(GL_OUT_OF_MEMORY);
2026 }
2027}
2028
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002029void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002031 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002032 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002033
2034 try
2035 {
2036 if (count < 0)
2037 {
2038 return error(GL_INVALID_VALUE);
2039 }
2040
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002041 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002042
2043 if (context)
2044 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002045 switch (type)
2046 {
2047 case GL_UNSIGNED_BYTE:
2048 case GL_UNSIGNED_SHORT:
2049 break;
2050 case GL_UNSIGNED_INT:
2051 if (!context->supports32bitIndices())
2052 {
2053 return error(GL_INVALID_ENUM);
2054 }
2055 break;
2056 default:
2057 return error(GL_INVALID_ENUM);
2058 }
2059
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002060 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061 }
2062 }
2063 catch(std::bad_alloc&)
2064 {
2065 return error(GL_OUT_OF_MEMORY);
2066 }
2067}
2068
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002069void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2070{
2071 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2072 mode, count, type, indices, primcount);
2073
2074 try
2075 {
2076 if (count < 0 || primcount < 0)
2077 {
2078 return error(GL_INVALID_VALUE);
2079 }
2080
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002081 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002082 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002083 gl::Context *context = gl::getNonLostContext();
2084
2085 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002086 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002087 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002088 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002089 case GL_UNSIGNED_BYTE:
2090 case GL_UNSIGNED_SHORT:
2091 break;
2092 case GL_UNSIGNED_INT:
2093 if (!context->supports32bitIndices())
2094 {
2095 return error(GL_INVALID_ENUM);
2096 }
2097 break;
2098 default:
2099 return error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002100 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002101
2102 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002103 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002104 }
2105 }
2106 catch(std::bad_alloc&)
2107 {
2108 return error(GL_OUT_OF_MEMORY);
2109 }
2110}
2111
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002112void __stdcall glEnable(GLenum cap)
2113{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002114 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115
2116 try
2117 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002118 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002119
2120 if (context)
2121 {
2122 switch (cap)
2123 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002124 case GL_CULL_FACE: context->setCullFace(true); break;
2125 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2126 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2127 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2128 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2129 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2130 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2131 case GL_BLEND: context->setBlend(true); break;
2132 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 default:
2134 return error(GL_INVALID_ENUM);
2135 }
2136 }
2137 }
2138 catch(std::bad_alloc&)
2139 {
2140 return error(GL_OUT_OF_MEMORY);
2141 }
2142}
2143
2144void __stdcall glEnableVertexAttribArray(GLuint index)
2145{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002146 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002147
2148 try
2149 {
2150 if (index >= gl::MAX_VERTEX_ATTRIBS)
2151 {
2152 return error(GL_INVALID_VALUE);
2153 }
2154
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002155 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002156
2157 if (context)
2158 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002159 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002160 }
2161 }
2162 catch(std::bad_alloc&)
2163 {
2164 return error(GL_OUT_OF_MEMORY);
2165 }
2166}
2167
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002168void __stdcall glEndQueryEXT(GLenum target)
2169{
2170 EVENT("GLenum target = 0x%X)", target);
2171
2172 try
2173 {
2174 switch (target)
2175 {
2176 case GL_ANY_SAMPLES_PASSED_EXT:
2177 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2178 break;
2179 default:
2180 return error(GL_INVALID_ENUM);
2181 }
2182
2183 gl::Context *context = gl::getNonLostContext();
2184
2185 if (context)
2186 {
2187 context->endQuery(target);
2188 }
2189 }
2190 catch(std::bad_alloc&)
2191 {
2192 return error(GL_OUT_OF_MEMORY);
2193 }
2194}
2195
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002196void __stdcall glFinishFenceNV(GLuint fence)
2197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002198 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002199
2200 try
2201 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002202 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002203
2204 if (context)
2205 {
2206 gl::Fence* fenceObject = context->getFence(fence);
2207
2208 if (fenceObject == NULL)
2209 {
2210 return error(GL_INVALID_OPERATION);
2211 }
2212
2213 fenceObject->finishFence();
2214 }
2215 }
2216 catch(std::bad_alloc&)
2217 {
2218 return error(GL_OUT_OF_MEMORY);
2219 }
2220}
2221
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002222void __stdcall glFinish(void)
2223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002224 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225
2226 try
2227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229
2230 if (context)
2231 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002232 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002233 }
2234 }
2235 catch(std::bad_alloc&)
2236 {
2237 return error(GL_OUT_OF_MEMORY);
2238 }
2239}
2240
2241void __stdcall glFlush(void)
2242{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002243 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244
2245 try
2246 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002247 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002248
2249 if (context)
2250 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002251 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252 }
2253 }
2254 catch(std::bad_alloc&)
2255 {
2256 return error(GL_OUT_OF_MEMORY);
2257 }
2258}
2259
2260void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2261{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002262 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002263 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002264
2265 try
2266 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002267 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002268 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002269 {
2270 return error(GL_INVALID_ENUM);
2271 }
2272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
2275 if (context)
2276 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002277 gl::Framebuffer *framebuffer = NULL;
2278 GLuint framebufferHandle = 0;
2279 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2280 {
2281 framebuffer = context->getReadFramebuffer();
2282 framebufferHandle = context->getReadFramebufferHandle();
2283 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002284 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002285 {
2286 framebuffer = context->getDrawFramebuffer();
2287 framebufferHandle = context->getDrawFramebufferHandle();
2288 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002289
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002290 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291 {
2292 return error(GL_INVALID_OPERATION);
2293 }
2294
2295 switch (attachment)
2296 {
2297 case GL_COLOR_ATTACHMENT0:
2298 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2299 break;
2300 case GL_DEPTH_ATTACHMENT:
2301 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2302 break;
2303 case GL_STENCIL_ATTACHMENT:
2304 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2305 break;
2306 default:
2307 return error(GL_INVALID_ENUM);
2308 }
2309 }
2310 }
2311 catch(std::bad_alloc&)
2312 {
2313 return error(GL_OUT_OF_MEMORY);
2314 }
2315}
2316
2317void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002319 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002320 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321
2322 try
2323 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002324 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 {
2326 return error(GL_INVALID_ENUM);
2327 }
2328
2329 switch (attachment)
2330 {
2331 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002332 case GL_DEPTH_ATTACHMENT:
2333 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334 break;
2335 default:
2336 return error(GL_INVALID_ENUM);
2337 }
2338
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002339 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340
2341 if (context)
2342 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002343 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002344 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002345 textarget = GL_NONE;
2346 }
2347 else
2348 {
2349 gl::Texture *tex = context->getTexture(texture);
2350
2351 if (tex == NULL)
2352 {
2353 return error(GL_INVALID_OPERATION);
2354 }
2355
daniel@transgaming.com01868132010-08-24 19:21:17 +00002356 if (tex->isCompressed())
2357 {
2358 return error(GL_INVALID_OPERATION);
2359 }
2360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002361 switch (textarget)
2362 {
2363 case GL_TEXTURE_2D:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002364 if (tex->getTarget() != GL_TEXTURE_2D)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002365 {
2366 return error(GL_INVALID_OPERATION);
2367 }
2368 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002369
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002376 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2377 {
2378 return error(GL_INVALID_OPERATION);
2379 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002380 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002382 default:
2383 return error(GL_INVALID_ENUM);
2384 }
2385
2386 if (level != 0)
2387 {
2388 return error(GL_INVALID_VALUE);
2389 }
2390 }
2391
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002392 gl::Framebuffer *framebuffer = NULL;
2393 GLuint framebufferHandle = 0;
2394 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2395 {
2396 framebuffer = context->getReadFramebuffer();
2397 framebufferHandle = context->getReadFramebufferHandle();
2398 }
2399 else
2400 {
2401 framebuffer = context->getDrawFramebuffer();
2402 framebufferHandle = context->getDrawFramebufferHandle();
2403 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002404
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002405 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406 {
2407 return error(GL_INVALID_OPERATION);
2408 }
2409
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002410 switch (attachment)
2411 {
2412 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2413 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2414 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002416 }
2417 }
2418 catch(std::bad_alloc&)
2419 {
2420 return error(GL_OUT_OF_MEMORY);
2421 }
2422}
2423
2424void __stdcall glFrontFace(GLenum mode)
2425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002426 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427
2428 try
2429 {
2430 switch (mode)
2431 {
2432 case GL_CW:
2433 case GL_CCW:
2434 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436
2437 if (context)
2438 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002439 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 }
2441 }
2442 break;
2443 default:
2444 return error(GL_INVALID_ENUM);
2445 }
2446 }
2447 catch(std::bad_alloc&)
2448 {
2449 return error(GL_OUT_OF_MEMORY);
2450 }
2451}
2452
2453void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002455 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002456
2457 try
2458 {
2459 if (n < 0)
2460 {
2461 return error(GL_INVALID_VALUE);
2462 }
2463
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002464 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002465
2466 if (context)
2467 {
2468 for (int i = 0; i < n; i++)
2469 {
2470 buffers[i] = context->createBuffer();
2471 }
2472 }
2473 }
2474 catch(std::bad_alloc&)
2475 {
2476 return error(GL_OUT_OF_MEMORY);
2477 }
2478}
2479
2480void __stdcall glGenerateMipmap(GLenum target)
2481{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002482 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483
2484 try
2485 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002486 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002487
2488 if (context)
2489 {
2490 gl::Texture *texture;
2491
2492 switch (target)
2493 {
2494 case GL_TEXTURE_2D:
2495 texture = context->getTexture2D();
2496 break;
2497
2498 case GL_TEXTURE_CUBE_MAP:
2499 texture = context->getTextureCubeMap();
2500 break;
2501
2502 default:
2503 return error(GL_INVALID_ENUM);
2504 }
2505
daniel@transgaming.com01868132010-08-24 19:21:17 +00002506 if (texture->isCompressed())
2507 {
2508 return error(GL_INVALID_OPERATION);
2509 }
2510
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002511 texture->generateMipmaps();
2512 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514 catch(std::bad_alloc&)
2515 {
2516 return error(GL_OUT_OF_MEMORY);
2517 }
2518}
2519
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002520void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2521{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002522 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002523
2524 try
2525 {
2526 if (n < 0)
2527 {
2528 return error(GL_INVALID_VALUE);
2529 }
2530
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002531 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002532
2533 if (context)
2534 {
2535 for (int i = 0; i < n; i++)
2536 {
2537 fences[i] = context->createFence();
2538 }
2539 }
2540 }
2541 catch(std::bad_alloc&)
2542 {
2543 return error(GL_OUT_OF_MEMORY);
2544 }
2545}
2546
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002547void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002549 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550
2551 try
2552 {
2553 if (n < 0)
2554 {
2555 return error(GL_INVALID_VALUE);
2556 }
2557
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559
2560 if (context)
2561 {
2562 for (int i = 0; i < n; i++)
2563 {
2564 framebuffers[i] = context->createFramebuffer();
2565 }
2566 }
2567 }
2568 catch(std::bad_alloc&)
2569 {
2570 return error(GL_OUT_OF_MEMORY);
2571 }
2572}
2573
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002574void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2575{
2576 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2577
2578 try
2579 {
2580 if (n < 0)
2581 {
2582 return error(GL_INVALID_VALUE);
2583 }
2584
2585 gl::Context *context = gl::getNonLostContext();
2586
2587 if (context)
2588 {
2589 for (int i = 0; i < n; i++)
2590 {
2591 ids[i] = context->createQuery();
2592 }
2593 }
2594 }
2595 catch(std::bad_alloc&)
2596 {
2597 return error(GL_OUT_OF_MEMORY);
2598 }
2599}
2600
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002601void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002603 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002604
2605 try
2606 {
2607 if (n < 0)
2608 {
2609 return error(GL_INVALID_VALUE);
2610 }
2611
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002613
2614 if (context)
2615 {
2616 for (int i = 0; i < n; i++)
2617 {
2618 renderbuffers[i] = context->createRenderbuffer();
2619 }
2620 }
2621 }
2622 catch(std::bad_alloc&)
2623 {
2624 return error(GL_OUT_OF_MEMORY);
2625 }
2626}
2627
2628void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2629{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002630 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631
2632 try
2633 {
2634 if (n < 0)
2635 {
2636 return error(GL_INVALID_VALUE);
2637 }
2638
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002639 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002640
2641 if (context)
2642 {
2643 for (int i = 0; i < n; i++)
2644 {
2645 textures[i] = context->createTexture();
2646 }
2647 }
2648 }
2649 catch(std::bad_alloc&)
2650 {
2651 return error(GL_OUT_OF_MEMORY);
2652 }
2653}
2654
daniel@transgaming.com85423182010-04-22 13:35:27 +00002655void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002656{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002657 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002658 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002659 program, index, bufsize, length, size, type, name);
2660
2661 try
2662 {
2663 if (bufsize < 0)
2664 {
2665 return error(GL_INVALID_VALUE);
2666 }
2667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002669
2670 if (context)
2671 {
2672 gl::Program *programObject = context->getProgram(program);
2673
2674 if (!programObject)
2675 {
2676 if (context->getShader(program))
2677 {
2678 return error(GL_INVALID_OPERATION);
2679 }
2680 else
2681 {
2682 return error(GL_INVALID_VALUE);
2683 }
2684 }
2685
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002686 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002687 {
2688 return error(GL_INVALID_VALUE);
2689 }
2690
2691 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002693 }
2694 catch(std::bad_alloc&)
2695 {
2696 return error(GL_OUT_OF_MEMORY);
2697 }
2698}
2699
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002700void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002701{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002702 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002703 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002704 program, index, bufsize, length, size, type, name);
2705
2706 try
2707 {
2708 if (bufsize < 0)
2709 {
2710 return error(GL_INVALID_VALUE);
2711 }
2712
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002714
2715 if (context)
2716 {
2717 gl::Program *programObject = context->getProgram(program);
2718
2719 if (!programObject)
2720 {
2721 if (context->getShader(program))
2722 {
2723 return error(GL_INVALID_OPERATION);
2724 }
2725 else
2726 {
2727 return error(GL_INVALID_VALUE);
2728 }
2729 }
2730
2731 if (index >= (GLuint)programObject->getActiveUniformCount())
2732 {
2733 return error(GL_INVALID_VALUE);
2734 }
2735
2736 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2737 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002738 }
2739 catch(std::bad_alloc&)
2740 {
2741 return error(GL_OUT_OF_MEMORY);
2742 }
2743}
2744
2745void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002747 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002748 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002749
2750 try
2751 {
2752 if (maxcount < 0)
2753 {
2754 return error(GL_INVALID_VALUE);
2755 }
2756
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002757 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002758
2759 if (context)
2760 {
2761 gl::Program *programObject = context->getProgram(program);
2762
2763 if (!programObject)
2764 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002765 if (context->getShader(program))
2766 {
2767 return error(GL_INVALID_OPERATION);
2768 }
2769 else
2770 {
2771 return error(GL_INVALID_VALUE);
2772 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002773 }
2774
2775 return programObject->getAttachedShaders(maxcount, count, shaders);
2776 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002777 }
2778 catch(std::bad_alloc&)
2779 {
2780 return error(GL_OUT_OF_MEMORY);
2781 }
2782}
2783
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002784int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002785{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002786 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002787
2788 try
2789 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002791
2792 if (context)
2793 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002794
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002795 gl::Program *programObject = context->getProgram(program);
2796
2797 if (!programObject)
2798 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002799 if (context->getShader(program))
2800 {
2801 return error(GL_INVALID_OPERATION, -1);
2802 }
2803 else
2804 {
2805 return error(GL_INVALID_VALUE, -1);
2806 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002807 }
2808
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002809 if (!programObject->isLinked())
2810 {
2811 return error(GL_INVALID_OPERATION, -1);
2812 }
2813
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002814 return programObject->getAttributeLocation(name);
2815 }
2816 }
2817 catch(std::bad_alloc&)
2818 {
2819 return error(GL_OUT_OF_MEMORY, -1);
2820 }
2821
2822 return -1;
2823}
2824
2825void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002827 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002828
2829 try
2830 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002831 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002832
2833 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002834 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002835 if (!(context->getBooleanv(pname, params)))
2836 {
2837 GLenum nativeType;
2838 unsigned int numParams = 0;
2839 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2840 return error(GL_INVALID_ENUM);
2841
2842 if (numParams == 0)
2843 return; // it is known that the pname is valid, but there are no parameters to return
2844
2845 if (nativeType == GL_FLOAT)
2846 {
2847 GLfloat *floatParams = NULL;
2848 floatParams = new GLfloat[numParams];
2849
2850 context->getFloatv(pname, floatParams);
2851
2852 for (unsigned int i = 0; i < numParams; ++i)
2853 {
2854 if (floatParams[i] == 0.0f)
2855 params[i] = GL_FALSE;
2856 else
2857 params[i] = GL_TRUE;
2858 }
2859
2860 delete [] floatParams;
2861 }
2862 else if (nativeType == GL_INT)
2863 {
2864 GLint *intParams = NULL;
2865 intParams = new GLint[numParams];
2866
2867 context->getIntegerv(pname, intParams);
2868
2869 for (unsigned int i = 0; i < numParams; ++i)
2870 {
2871 if (intParams[i] == 0)
2872 params[i] = GL_FALSE;
2873 else
2874 params[i] = GL_TRUE;
2875 }
2876
2877 delete [] intParams;
2878 }
2879 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002880 }
2881 }
2882 catch(std::bad_alloc&)
2883 {
2884 return error(GL_OUT_OF_MEMORY);
2885 }
2886}
2887
2888void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002890 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002891
2892 try
2893 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002894 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002895
2896 if (context)
2897 {
2898 gl::Buffer *buffer;
2899
2900 switch (target)
2901 {
2902 case GL_ARRAY_BUFFER:
2903 buffer = context->getArrayBuffer();
2904 break;
2905 case GL_ELEMENT_ARRAY_BUFFER:
2906 buffer = context->getElementArrayBuffer();
2907 break;
2908 default: return error(GL_INVALID_ENUM);
2909 }
2910
2911 if (!buffer)
2912 {
2913 // A null buffer means that "0" is bound to the requested buffer target
2914 return error(GL_INVALID_OPERATION);
2915 }
2916
2917 switch (pname)
2918 {
2919 case GL_BUFFER_USAGE:
2920 *params = buffer->usage();
2921 break;
2922 case GL_BUFFER_SIZE:
2923 *params = buffer->size();
2924 break;
2925 default: return error(GL_INVALID_ENUM);
2926 }
2927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002928 }
2929 catch(std::bad_alloc&)
2930 {
2931 return error(GL_OUT_OF_MEMORY);
2932 }
2933}
2934
2935GLenum __stdcall glGetError(void)
2936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002937 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002938
2939 gl::Context *context = gl::getContext();
2940
2941 if (context)
2942 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002943 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 }
2945
2946 return GL_NO_ERROR;
2947}
2948
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002949void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002951 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002952
2953 try
2954 {
2955
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002956 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002957
2958 if (context)
2959 {
2960 gl::Fence *fenceObject = context->getFence(fence);
2961
2962 if (fenceObject == NULL)
2963 {
2964 return error(GL_INVALID_OPERATION);
2965 }
2966
2967 fenceObject->getFenceiv(pname, params);
2968 }
2969 }
2970 catch(std::bad_alloc&)
2971 {
2972 return error(GL_OUT_OF_MEMORY);
2973 }
2974}
2975
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002978 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979
2980 try
2981 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002982 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002983
2984 if (context)
2985 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002986 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002987 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002988 GLenum nativeType;
2989 unsigned int numParams = 0;
2990 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2991 return error(GL_INVALID_ENUM);
2992
2993 if (numParams == 0)
2994 return; // it is known that the pname is valid, but that there are no parameters to return.
2995
2996 if (nativeType == GL_BOOL)
2997 {
2998 GLboolean *boolParams = NULL;
2999 boolParams = new GLboolean[numParams];
3000
3001 context->getBooleanv(pname, boolParams);
3002
3003 for (unsigned int i = 0; i < numParams; ++i)
3004 {
3005 if (boolParams[i] == GL_FALSE)
3006 params[i] = 0.0f;
3007 else
3008 params[i] = 1.0f;
3009 }
3010
3011 delete [] boolParams;
3012 }
3013 else if (nativeType == GL_INT)
3014 {
3015 GLint *intParams = NULL;
3016 intParams = new GLint[numParams];
3017
3018 context->getIntegerv(pname, intParams);
3019
3020 for (unsigned int i = 0; i < numParams; ++i)
3021 {
3022 params[i] = (GLfloat)intParams[i];
3023 }
3024
3025 delete [] intParams;
3026 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003027 }
3028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003029 }
3030 catch(std::bad_alloc&)
3031 {
3032 return error(GL_OUT_OF_MEMORY);
3033 }
3034}
3035
3036void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3037{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003038 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003039 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040
3041 try
3042 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003044
3045 if (context)
3046 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003047 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003048 {
3049 return error(GL_INVALID_ENUM);
3050 }
3051
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003052 gl::Framebuffer *framebuffer = NULL;
3053 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3054 {
3055 if(context->getReadFramebufferHandle() == 0)
3056 {
3057 return error(GL_INVALID_OPERATION);
3058 }
3059
3060 framebuffer = context->getReadFramebuffer();
3061 }
3062 else
3063 {
3064 if (context->getDrawFramebufferHandle() == 0)
3065 {
3066 return error(GL_INVALID_OPERATION);
3067 }
3068
3069 framebuffer = context->getDrawFramebuffer();
3070 }
3071
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003072 GLenum attachmentType;
3073 GLuint attachmentHandle;
3074 switch (attachment)
3075 {
3076 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003077 attachmentType = framebuffer->getColorbufferType();
3078 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003079 break;
3080 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003081 attachmentType = framebuffer->getDepthbufferType();
3082 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003083 break;
3084 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003085 attachmentType = framebuffer->getStencilbufferType();
3086 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003087 break;
3088 default: return error(GL_INVALID_ENUM);
3089 }
3090
3091 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003092 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003093 {
3094 attachmentObjectType = attachmentType;
3095 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003096 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003097 {
3098 attachmentObjectType = GL_TEXTURE;
3099 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003100 else
3101 {
3102 UNREACHABLE();
3103 return;
3104 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003105
3106 switch (pname)
3107 {
3108 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3109 *params = attachmentObjectType;
3110 break;
3111 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3112 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3113 {
3114 *params = attachmentHandle;
3115 }
3116 else
3117 {
3118 return error(GL_INVALID_ENUM);
3119 }
3120 break;
3121 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3122 if (attachmentObjectType == GL_TEXTURE)
3123 {
3124 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3125 }
3126 else
3127 {
3128 return error(GL_INVALID_ENUM);
3129 }
3130 break;
3131 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3132 if (attachmentObjectType == GL_TEXTURE)
3133 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003134 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003135 {
3136 *params = attachmentType;
3137 }
3138 else
3139 {
3140 *params = 0;
3141 }
3142 }
3143 else
3144 {
3145 return error(GL_INVALID_ENUM);
3146 }
3147 break;
3148 default:
3149 return error(GL_INVALID_ENUM);
3150 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003151 }
3152 }
3153 catch(std::bad_alloc&)
3154 {
3155 return error(GL_OUT_OF_MEMORY);
3156 }
3157}
3158
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003159GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3160{
3161 EVENT("()");
3162
3163 try
3164 {
3165 gl::Context *context = gl::getContext();
3166
3167 if (context)
3168 {
3169 return context->getResetStatus();
3170 }
3171
3172 return GL_NO_ERROR;
3173 }
3174 catch(std::bad_alloc&)
3175 {
3176 return GL_OUT_OF_MEMORY;
3177 }
3178}
3179
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003180void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3181{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003182 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003183
3184 try
3185 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003186 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003187
3188 if (context)
3189 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003190 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003191 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003192 GLenum nativeType;
3193 unsigned int numParams = 0;
3194 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3195 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003197 if (numParams == 0)
3198 return; // it is known that pname is valid, but there are no parameters to return
3199
3200 if (nativeType == GL_BOOL)
3201 {
3202 GLboolean *boolParams = NULL;
3203 boolParams = new GLboolean[numParams];
3204
3205 context->getBooleanv(pname, boolParams);
3206
3207 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003208 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003209 if (boolParams[i] == GL_FALSE)
3210 params[i] = 0;
3211 else
3212 params[i] = 1;
3213 }
3214
3215 delete [] boolParams;
3216 }
3217 else if (nativeType == GL_FLOAT)
3218 {
3219 GLfloat *floatParams = NULL;
3220 floatParams = new GLfloat[numParams];
3221
3222 context->getFloatv(pname, floatParams);
3223
3224 for (unsigned int i = 0; i < numParams; ++i)
3225 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003226 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003227 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003228 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003229 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003230 else
3231 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003233
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003234 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003235 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236 }
3237 }
3238 }
3239 catch(std::bad_alloc&)
3240 {
3241 return error(GL_OUT_OF_MEMORY);
3242 }
3243}
3244
3245void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003247 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003248
3249 try
3250 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003251 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003252
3253 if (context)
3254 {
3255 gl::Program *programObject = context->getProgram(program);
3256
3257 if (!programObject)
3258 {
3259 return error(GL_INVALID_VALUE);
3260 }
3261
3262 switch (pname)
3263 {
3264 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003265 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266 return;
3267 case GL_LINK_STATUS:
3268 *params = programObject->isLinked();
3269 return;
3270 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003271 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003272 return;
3273 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003274 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275 return;
3276 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003277 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278 return;
3279 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003280 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281 return;
3282 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003283 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284 return;
3285 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003286 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287 return;
3288 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003289 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290 return;
3291 default:
3292 return error(GL_INVALID_ENUM);
3293 }
3294 }
3295 }
3296 catch(std::bad_alloc&)
3297 {
3298 return error(GL_OUT_OF_MEMORY);
3299 }
3300}
3301
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003302void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003304 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003305 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306
3307 try
3308 {
3309 if (bufsize < 0)
3310 {
3311 return error(GL_INVALID_VALUE);
3312 }
3313
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003314 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003315
3316 if (context)
3317 {
3318 gl::Program *programObject = context->getProgram(program);
3319
3320 if (!programObject)
3321 {
3322 return error(GL_INVALID_VALUE);
3323 }
3324
3325 programObject->getInfoLog(bufsize, length, infolog);
3326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003327 }
3328 catch(std::bad_alloc&)
3329 {
3330 return error(GL_OUT_OF_MEMORY);
3331 }
3332}
3333
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003334void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3335{
3336 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3337
3338 try
3339 {
3340 switch (pname)
3341 {
3342 case GL_CURRENT_QUERY_EXT:
3343 break;
3344 default:
3345 return error(GL_INVALID_ENUM);
3346 }
3347
3348 gl::Context *context = gl::getNonLostContext();
3349
3350 if (context)
3351 {
3352 params[0] = context->getActiveQuery(target);
3353 }
3354 }
3355 catch(std::bad_alloc&)
3356 {
3357 return error(GL_OUT_OF_MEMORY);
3358 }
3359}
3360
3361void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3362{
3363 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3364
3365 try
3366 {
3367 switch (pname)
3368 {
3369 case GL_QUERY_RESULT_EXT:
3370 case GL_QUERY_RESULT_AVAILABLE_EXT:
3371 break;
3372 default:
3373 return error(GL_INVALID_ENUM);
3374 }
3375 gl::Context *context = gl::getNonLostContext();
3376
3377 if (context)
3378 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003379 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3380
3381 if (!queryObject)
3382 {
3383 return error(GL_INVALID_OPERATION);
3384 }
3385
3386 if (context->getActiveQuery(queryObject->getType()) == id)
3387 {
3388 return error(GL_INVALID_OPERATION);
3389 }
3390
3391 switch(pname)
3392 {
3393 case GL_QUERY_RESULT_EXT:
3394 params[0] = queryObject->getResult();
3395 break;
3396 case GL_QUERY_RESULT_AVAILABLE_EXT:
3397 params[0] = queryObject->isResultAvailable();
3398 break;
3399 default:
3400 ASSERT(false);
3401 }
3402 }
3403 }
3404 catch(std::bad_alloc&)
3405 {
3406 return error(GL_OUT_OF_MEMORY);
3407 }
3408}
3409
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003410void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003412 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003413
3414 try
3415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003417
3418 if (context)
3419 {
3420 if (target != GL_RENDERBUFFER)
3421 {
3422 return error(GL_INVALID_ENUM);
3423 }
3424
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003425 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003426 {
3427 return error(GL_INVALID_OPERATION);
3428 }
3429
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003430 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003431
3432 switch (pname)
3433 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003434 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3435 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3436 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3437 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3438 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3439 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3440 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3441 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3442 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003443 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003444 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003445 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003446 *params = renderbuffer->getSamples();
3447 }
3448 else
3449 {
3450 return error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003451 }
3452 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003453 default:
3454 return error(GL_INVALID_ENUM);
3455 }
3456 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457 }
3458 catch(std::bad_alloc&)
3459 {
3460 return error(GL_OUT_OF_MEMORY);
3461 }
3462}
3463
3464void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003466 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003467
3468 try
3469 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003470 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003471
3472 if (context)
3473 {
3474 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003475
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003476 if (!shaderObject)
3477 {
3478 return error(GL_INVALID_VALUE);
3479 }
3480
3481 switch (pname)
3482 {
3483 case GL_SHADER_TYPE:
3484 *params = shaderObject->getType();
3485 return;
3486 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003487 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003488 return;
3489 case GL_COMPILE_STATUS:
3490 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3491 return;
3492 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003493 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003494 return;
3495 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003496 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003498 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3499 *params = shaderObject->getTranslatedSourceLength();
3500 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 default:
3502 return error(GL_INVALID_ENUM);
3503 }
3504 }
3505 }
3506 catch(std::bad_alloc&)
3507 {
3508 return error(GL_OUT_OF_MEMORY);
3509 }
3510}
3511
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003512void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003514 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003515 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003516
3517 try
3518 {
3519 if (bufsize < 0)
3520 {
3521 return error(GL_INVALID_VALUE);
3522 }
3523
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003524 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003525
3526 if (context)
3527 {
3528 gl::Shader *shaderObject = context->getShader(shader);
3529
3530 if (!shaderObject)
3531 {
3532 return error(GL_INVALID_VALUE);
3533 }
3534
3535 shaderObject->getInfoLog(bufsize, length, infolog);
3536 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003537 }
3538 catch(std::bad_alloc&)
3539 {
3540 return error(GL_OUT_OF_MEMORY);
3541 }
3542}
3543
3544void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3545{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003546 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003547 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003548
3549 try
3550 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003551 switch (shadertype)
3552 {
3553 case GL_VERTEX_SHADER:
3554 case GL_FRAGMENT_SHADER:
3555 break;
3556 default:
3557 return error(GL_INVALID_ENUM);
3558 }
3559
3560 switch (precisiontype)
3561 {
3562 case GL_LOW_FLOAT:
3563 case GL_MEDIUM_FLOAT:
3564 case GL_HIGH_FLOAT:
3565 // Assume IEEE 754 precision
3566 range[0] = 127;
3567 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003568 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003569 break;
3570 case GL_LOW_INT:
3571 case GL_MEDIUM_INT:
3572 case GL_HIGH_INT:
3573 // Some (most) hardware only supports single-precision floating-point numbers,
3574 // which can accurately represent integers up to +/-16777216
3575 range[0] = 24;
3576 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003577 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003578 break;
3579 default:
3580 return error(GL_INVALID_ENUM);
3581 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003582 }
3583 catch(std::bad_alloc&)
3584 {
3585 return error(GL_OUT_OF_MEMORY);
3586 }
3587}
3588
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003589void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003591 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003592 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593
3594 try
3595 {
3596 if (bufsize < 0)
3597 {
3598 return error(GL_INVALID_VALUE);
3599 }
3600
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003601 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003602
3603 if (context)
3604 {
3605 gl::Shader *shaderObject = context->getShader(shader);
3606
3607 if (!shaderObject)
3608 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00003609 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003610 }
3611
3612 shaderObject->getSource(bufsize, length, source);
3613 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003614 }
3615 catch(std::bad_alloc&)
3616 {
3617 return error(GL_OUT_OF_MEMORY);
3618 }
3619}
3620
zmo@google.coma574f782011-10-03 21:45:23 +00003621void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3622{
3623 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3624 shader, bufsize, length, source);
3625
3626 try
3627 {
3628 if (bufsize < 0)
3629 {
3630 return error(GL_INVALID_VALUE);
3631 }
3632
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003633 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003634
3635 if (context)
3636 {
3637 gl::Shader *shaderObject = context->getShader(shader);
3638
3639 if (!shaderObject)
3640 {
3641 return error(GL_INVALID_OPERATION);
3642 }
3643
3644 shaderObject->getTranslatedSource(bufsize, length, source);
3645 }
3646 }
3647 catch(std::bad_alloc&)
3648 {
3649 return error(GL_OUT_OF_MEMORY);
3650 }
3651}
3652
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003653const GLubyte* __stdcall glGetString(GLenum name)
3654{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003655 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003656
3657 try
3658 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003659 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003660
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003661 switch (name)
3662 {
3663 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003664 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003666 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003667 case GL_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003668 return (GLubyte*)"OpenGL ES 2.0 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003670 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003671 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003672 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 default:
3674 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
3675 }
3676 }
3677 catch(std::bad_alloc&)
3678 {
3679 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3680 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003681}
3682
3683void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003685 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003686
3687 try
3688 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003690
3691 if (context)
3692 {
3693 gl::Texture *texture;
3694
3695 switch (target)
3696 {
3697 case GL_TEXTURE_2D:
3698 texture = context->getTexture2D();
3699 break;
3700 case GL_TEXTURE_CUBE_MAP:
3701 texture = context->getTextureCubeMap();
3702 break;
3703 default:
3704 return error(GL_INVALID_ENUM);
3705 }
3706
3707 switch (pname)
3708 {
3709 case GL_TEXTURE_MAG_FILTER:
3710 *params = (GLfloat)texture->getMagFilter();
3711 break;
3712 case GL_TEXTURE_MIN_FILTER:
3713 *params = (GLfloat)texture->getMinFilter();
3714 break;
3715 case GL_TEXTURE_WRAP_S:
3716 *params = (GLfloat)texture->getWrapS();
3717 break;
3718 case GL_TEXTURE_WRAP_T:
3719 *params = (GLfloat)texture->getWrapT();
3720 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003721 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3722 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3723 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003724 case GL_TEXTURE_USAGE_ANGLE:
3725 *params = (GLfloat)texture->getUsage();
3726 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003727 default:
3728 return error(GL_INVALID_ENUM);
3729 }
3730 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003731 }
3732 catch(std::bad_alloc&)
3733 {
3734 return error(GL_OUT_OF_MEMORY);
3735 }
3736}
3737
3738void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003740 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741
3742 try
3743 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003744 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003745
3746 if (context)
3747 {
3748 gl::Texture *texture;
3749
3750 switch (target)
3751 {
3752 case GL_TEXTURE_2D:
3753 texture = context->getTexture2D();
3754 break;
3755 case GL_TEXTURE_CUBE_MAP:
3756 texture = context->getTextureCubeMap();
3757 break;
3758 default:
3759 return error(GL_INVALID_ENUM);
3760 }
3761
3762 switch (pname)
3763 {
3764 case GL_TEXTURE_MAG_FILTER:
3765 *params = texture->getMagFilter();
3766 break;
3767 case GL_TEXTURE_MIN_FILTER:
3768 *params = texture->getMinFilter();
3769 break;
3770 case GL_TEXTURE_WRAP_S:
3771 *params = texture->getWrapS();
3772 break;
3773 case GL_TEXTURE_WRAP_T:
3774 *params = texture->getWrapT();
3775 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003776 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3777 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3778 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003779 case GL_TEXTURE_USAGE_ANGLE:
3780 *params = texture->getUsage();
3781 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003782 default:
3783 return error(GL_INVALID_ENUM);
3784 }
3785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786 }
3787 catch(std::bad_alloc&)
3788 {
3789 return error(GL_OUT_OF_MEMORY);
3790 }
3791}
3792
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003793void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3794{
3795 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3796 program, location, bufSize, params);
3797
3798 try
3799 {
3800 if (bufSize < 0)
3801 {
3802 return error(GL_INVALID_VALUE);
3803 }
3804
3805 gl::Context *context = gl::getNonLostContext();
3806
3807 if (context)
3808 {
3809 if (program == 0)
3810 {
3811 return error(GL_INVALID_VALUE);
3812 }
3813
3814 gl::Program *programObject = context->getProgram(program);
3815
3816 if (!programObject || !programObject->isLinked())
3817 {
3818 return error(GL_INVALID_OPERATION);
3819 }
3820
3821 if (!programObject->getUniformfv(location, &bufSize, params))
3822 {
3823 return error(GL_INVALID_OPERATION);
3824 }
3825 }
3826 }
3827 catch(std::bad_alloc&)
3828 {
3829 return error(GL_OUT_OF_MEMORY);
3830 }
3831}
3832
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003833void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003835 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003836
3837 try
3838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003840
3841 if (context)
3842 {
3843 if (program == 0)
3844 {
3845 return error(GL_INVALID_VALUE);
3846 }
3847
3848 gl::Program *programObject = context->getProgram(program);
3849
3850 if (!programObject || !programObject->isLinked())
3851 {
3852 return error(GL_INVALID_OPERATION);
3853 }
3854
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003855 if (!programObject->getUniformfv(location, NULL, params))
3856 {
3857 return error(GL_INVALID_OPERATION);
3858 }
3859 }
3860 }
3861 catch(std::bad_alloc&)
3862 {
3863 return error(GL_OUT_OF_MEMORY);
3864 }
3865}
3866
3867void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3868{
3869 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3870 program, location, bufSize, params);
3871
3872 try
3873 {
3874 if (bufSize < 0)
3875 {
3876 return error(GL_INVALID_VALUE);
3877 }
3878
3879 gl::Context *context = gl::getNonLostContext();
3880
3881 if (context)
3882 {
3883 if (program == 0)
3884 {
3885 return error(GL_INVALID_VALUE);
3886 }
3887
3888 gl::Program *programObject = context->getProgram(program);
3889
3890 if (!programObject || !programObject->isLinked())
3891 {
3892 return error(GL_INVALID_OPERATION);
3893 }
3894
3895 if (!programObject)
3896 {
3897 return error(GL_INVALID_OPERATION);
3898 }
3899
3900 if (!programObject->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003901 {
3902 return error(GL_INVALID_OPERATION);
3903 }
3904 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003905 }
3906 catch(std::bad_alloc&)
3907 {
3908 return error(GL_OUT_OF_MEMORY);
3909 }
3910}
3911
3912void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003914 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003915
3916 try
3917 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003919
3920 if (context)
3921 {
3922 if (program == 0)
3923 {
3924 return error(GL_INVALID_VALUE);
3925 }
3926
3927 gl::Program *programObject = context->getProgram(program);
3928
3929 if (!programObject || !programObject->isLinked())
3930 {
3931 return error(GL_INVALID_OPERATION);
3932 }
3933
3934 if (!programObject)
3935 {
3936 return error(GL_INVALID_OPERATION);
3937 }
3938
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003939 if (!programObject->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003940 {
3941 return error(GL_INVALID_OPERATION);
3942 }
3943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944 }
3945 catch(std::bad_alloc&)
3946 {
3947 return error(GL_OUT_OF_MEMORY);
3948 }
3949}
3950
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003951int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003953 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954
3955 try
3956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003958
3959 if (strstr(name, "gl_") == name)
3960 {
3961 return -1;
3962 }
3963
3964 if (context)
3965 {
3966 gl::Program *programObject = context->getProgram(program);
3967
3968 if (!programObject)
3969 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003970 if (context->getShader(program))
3971 {
3972 return error(GL_INVALID_OPERATION, -1);
3973 }
3974 else
3975 {
3976 return error(GL_INVALID_VALUE, -1);
3977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978 }
3979
3980 if (!programObject->isLinked())
3981 {
3982 return error(GL_INVALID_OPERATION, -1);
3983 }
3984
daniel@transgaming.com024f1a92011-09-20 16:06:25 +00003985 return programObject->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003986 }
3987 }
3988 catch(std::bad_alloc&)
3989 {
3990 return error(GL_OUT_OF_MEMORY, -1);
3991 }
3992
3993 return -1;
3994}
3995
3996void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003998 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003999
4000 try
4001 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003
daniel@transgaming.come0078962010-04-15 20:45:08 +00004004 if (context)
4005 {
4006 if (index >= gl::MAX_VERTEX_ATTRIBS)
4007 {
4008 return error(GL_INVALID_VALUE);
4009 }
4010
daniel@transgaming.com83921382011-01-08 05:46:00 +00004011 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004012
daniel@transgaming.come0078962010-04-15 20:45:08 +00004013 switch (pname)
4014 {
4015 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004016 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004017 break;
4018 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004019 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004020 break;
4021 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004022 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004023 break;
4024 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004025 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004026 break;
4027 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004028 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004029 break;
4030 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004031 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004032 break;
4033 case GL_CURRENT_VERTEX_ATTRIB:
4034 for (int i = 0; i < 4; ++i)
4035 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004036 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004037 }
4038 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004039 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4040 *params = (GLfloat)attribState.mDivisor;
4041 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004042 default: return error(GL_INVALID_ENUM);
4043 }
4044 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045 }
4046 catch(std::bad_alloc&)
4047 {
4048 return error(GL_OUT_OF_MEMORY);
4049 }
4050}
4051
4052void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004054 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055
4056 try
4057 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059
daniel@transgaming.come0078962010-04-15 20:45:08 +00004060 if (context)
4061 {
4062 if (index >= gl::MAX_VERTEX_ATTRIBS)
4063 {
4064 return error(GL_INVALID_VALUE);
4065 }
4066
daniel@transgaming.com83921382011-01-08 05:46:00 +00004067 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004068
daniel@transgaming.come0078962010-04-15 20:45:08 +00004069 switch (pname)
4070 {
4071 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004072 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004073 break;
4074 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004075 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004076 break;
4077 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004078 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004079 break;
4080 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004081 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004082 break;
4083 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004084 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004085 break;
4086 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004087 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004088 break;
4089 case GL_CURRENT_VERTEX_ATTRIB:
4090 for (int i = 0; i < 4; ++i)
4091 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004092 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004093 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4094 }
4095 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004096 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4097 *params = (GLint)attribState.mDivisor;
4098 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004099 default: return error(GL_INVALID_ENUM);
4100 }
4101 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004102 }
4103 catch(std::bad_alloc&)
4104 {
4105 return error(GL_OUT_OF_MEMORY);
4106 }
4107}
4108
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004109void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004110{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004111 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004112
4113 try
4114 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004115 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116
daniel@transgaming.come0078962010-04-15 20:45:08 +00004117 if (context)
4118 {
4119 if (index >= gl::MAX_VERTEX_ATTRIBS)
4120 {
4121 return error(GL_INVALID_VALUE);
4122 }
4123
4124 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4125 {
4126 return error(GL_INVALID_ENUM);
4127 }
4128
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004129 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004130 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004131 }
4132 catch(std::bad_alloc&)
4133 {
4134 return error(GL_OUT_OF_MEMORY);
4135 }
4136}
4137
4138void __stdcall glHint(GLenum target, GLenum mode)
4139{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004140 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141
4142 try
4143 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004144 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004145 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004146 case GL_FASTEST:
4147 case GL_NICEST:
4148 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004149 break;
4150 default:
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004151 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004152 }
4153
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004154 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004155 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004156 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004157 case GL_GENERATE_MIPMAP_HINT:
4158 if (context) context->setGenerateMipmapHint(mode);
4159 break;
4160 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4161 if (context) context->setFragmentShaderDerivativeHint(mode);
4162 break;
4163 default:
4164 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004165 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004166 }
4167 catch(std::bad_alloc&)
4168 {
4169 return error(GL_OUT_OF_MEMORY);
4170 }
4171}
4172
4173GLboolean __stdcall glIsBuffer(GLuint buffer)
4174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004175 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004176
4177 try
4178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004180
4181 if (context && buffer)
4182 {
4183 gl::Buffer *bufferObject = context->getBuffer(buffer);
4184
4185 if (bufferObject)
4186 {
4187 return GL_TRUE;
4188 }
4189 }
4190 }
4191 catch(std::bad_alloc&)
4192 {
4193 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4194 }
4195
4196 return GL_FALSE;
4197}
4198
4199GLboolean __stdcall glIsEnabled(GLenum cap)
4200{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004201 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202
4203 try
4204 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004205 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206
4207 if (context)
4208 {
4209 switch (cap)
4210 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004211 case GL_CULL_FACE: return context->isCullFaceEnabled();
4212 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4213 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4214 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4215 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4216 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4217 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4218 case GL_BLEND: return context->isBlendEnabled();
4219 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220 default:
4221 return error(GL_INVALID_ENUM, false);
4222 }
4223 }
4224 }
4225 catch(std::bad_alloc&)
4226 {
4227 return error(GL_OUT_OF_MEMORY, false);
4228 }
4229
4230 return false;
4231}
4232
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004233GLboolean __stdcall glIsFenceNV(GLuint fence)
4234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004235 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004236
4237 try
4238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004239 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004240
4241 if (context)
4242 {
4243 gl::Fence *fenceObject = context->getFence(fence);
4244
4245 if (fenceObject == NULL)
4246 {
4247 return GL_FALSE;
4248 }
4249
4250 return fenceObject->isFence();
4251 }
4252 }
4253 catch(std::bad_alloc&)
4254 {
4255 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4256 }
4257
4258 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004259}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004260
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004263 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264
4265 try
4266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268
4269 if (context && framebuffer)
4270 {
4271 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4272
4273 if (framebufferObject)
4274 {
4275 return GL_TRUE;
4276 }
4277 }
4278 }
4279 catch(std::bad_alloc&)
4280 {
4281 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4282 }
4283
4284 return GL_FALSE;
4285}
4286
4287GLboolean __stdcall glIsProgram(GLuint program)
4288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004289 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290
4291 try
4292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294
4295 if (context && program)
4296 {
4297 gl::Program *programObject = context->getProgram(program);
4298
4299 if (programObject)
4300 {
4301 return GL_TRUE;
4302 }
4303 }
4304 }
4305 catch(std::bad_alloc&)
4306 {
4307 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4308 }
4309
4310 return GL_FALSE;
4311}
4312
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004313GLboolean __stdcall glIsQueryEXT(GLuint id)
4314{
4315 EVENT("(GLuint id = %d)", id);
4316
4317 try
4318 {
4319 if (id == 0)
4320 {
4321 return GL_FALSE;
4322 }
4323
4324 gl::Context *context = gl::getNonLostContext();
4325
4326 if (context)
4327 {
4328 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4329
4330 if (queryObject)
4331 {
4332 return GL_TRUE;
4333 }
4334 }
4335 }
4336 catch(std::bad_alloc&)
4337 {
4338 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4339 }
4340
4341 return GL_FALSE;
4342}
4343
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4345{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004346 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004347
4348 try
4349 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004351
4352 if (context && renderbuffer)
4353 {
4354 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4355
4356 if (renderbufferObject)
4357 {
4358 return GL_TRUE;
4359 }
4360 }
4361 }
4362 catch(std::bad_alloc&)
4363 {
4364 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4365 }
4366
4367 return GL_FALSE;
4368}
4369
4370GLboolean __stdcall glIsShader(GLuint shader)
4371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004372 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004373
4374 try
4375 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004376 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377
4378 if (context && shader)
4379 {
4380 gl::Shader *shaderObject = context->getShader(shader);
4381
4382 if (shaderObject)
4383 {
4384 return GL_TRUE;
4385 }
4386 }
4387 }
4388 catch(std::bad_alloc&)
4389 {
4390 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4391 }
4392
4393 return GL_FALSE;
4394}
4395
4396GLboolean __stdcall glIsTexture(GLuint texture)
4397{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004398 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004399
4400 try
4401 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004403
4404 if (context && texture)
4405 {
4406 gl::Texture *textureObject = context->getTexture(texture);
4407
4408 if (textureObject)
4409 {
4410 return GL_TRUE;
4411 }
4412 }
4413 }
4414 catch(std::bad_alloc&)
4415 {
4416 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4417 }
4418
4419 return GL_FALSE;
4420}
4421
4422void __stdcall glLineWidth(GLfloat width)
4423{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004424 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425
4426 try
4427 {
4428 if (width <= 0.0f)
4429 {
4430 return error(GL_INVALID_VALUE);
4431 }
4432
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004433 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004434
4435 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004437 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438 }
4439 }
4440 catch(std::bad_alloc&)
4441 {
4442 return error(GL_OUT_OF_MEMORY);
4443 }
4444}
4445
4446void __stdcall glLinkProgram(GLuint program)
4447{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004448 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449
4450 try
4451 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004452 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004453
4454 if (context)
4455 {
4456 gl::Program *programObject = context->getProgram(program);
4457
4458 if (!programObject)
4459 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004460 if (context->getShader(program))
4461 {
4462 return error(GL_INVALID_OPERATION);
4463 }
4464 else
4465 {
4466 return error(GL_INVALID_VALUE);
4467 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469
4470 programObject->link();
4471 }
4472 }
4473 catch(std::bad_alloc&)
4474 {
4475 return error(GL_OUT_OF_MEMORY);
4476 }
4477}
4478
4479void __stdcall glPixelStorei(GLenum pname, GLint param)
4480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004481 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482
4483 try
4484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004486
4487 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004488 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004489 switch (pname)
4490 {
4491 case GL_UNPACK_ALIGNMENT:
4492 if (param != 1 && param != 2 && param != 4 && param != 8)
4493 {
4494 return error(GL_INVALID_VALUE);
4495 }
4496
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004497 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004498 break;
4499
4500 case GL_PACK_ALIGNMENT:
4501 if (param != 1 && param != 2 && param != 4 && param != 8)
4502 {
4503 return error(GL_INVALID_VALUE);
4504 }
4505
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004506 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004507 break;
4508
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004509 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4510 context->setPackReverseRowOrder(param != 0);
4511 break;
4512
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004513 default:
4514 return error(GL_INVALID_ENUM);
4515 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
4517 }
4518 catch(std::bad_alloc&)
4519 {
4520 return error(GL_OUT_OF_MEMORY);
4521 }
4522}
4523
4524void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527
4528 try
4529 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004530 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004531
4532 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004534 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535 }
4536 }
4537 catch(std::bad_alloc&)
4538 {
4539 return error(GL_OUT_OF_MEMORY);
4540 }
4541}
4542
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004543void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4544 GLenum format, GLenum type, GLsizei bufSize,
4545 GLvoid *data)
4546{
4547 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4548 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4549 x, y, width, height, format, type, bufSize, data);
4550
4551 try
4552 {
4553 if (width < 0 || height < 0 || bufSize < 0)
4554 {
4555 return error(GL_INVALID_VALUE);
4556 }
4557
4558 if (!validReadFormatType(format, type))
4559 {
4560 return error(GL_INVALID_OPERATION);
4561 }
4562
4563 gl::Context *context = gl::getNonLostContext();
4564
4565 if (context)
4566 {
4567 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4568 }
4569 }
4570 catch(std::bad_alloc&)
4571 {
4572 return error(GL_OUT_OF_MEMORY);
4573 }
4574}
4575
4576void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4577 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004579 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004580 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004581 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582
4583 try
4584 {
4585 if (width < 0 || height < 0)
4586 {
4587 return error(GL_INVALID_VALUE);
4588 }
4589
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004590 if (!validReadFormatType(format, type))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592 return error(GL_INVALID_OPERATION);
4593 }
4594
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004596
4597 if (context)
4598 {
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004599 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600 }
4601 }
4602 catch(std::bad_alloc&)
4603 {
4604 return error(GL_OUT_OF_MEMORY);
4605 }
4606}
4607
4608void __stdcall glReleaseShaderCompiler(void)
4609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004610 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611
4612 try
4613 {
4614 gl::Shader::releaseCompiler();
4615 }
4616 catch(std::bad_alloc&)
4617 {
4618 return error(GL_OUT_OF_MEMORY);
4619 }
4620}
4621
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004622void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004624 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004625 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626
4627 try
4628 {
4629 switch (target)
4630 {
4631 case GL_RENDERBUFFER:
4632 break;
4633 default:
4634 return error(GL_INVALID_ENUM);
4635 }
4636
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004637 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 return error(GL_INVALID_ENUM);
4640 }
4641
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004642 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 {
4644 return error(GL_INVALID_VALUE);
4645 }
4646
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648
4649 if (context)
4650 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004651 if (width > context->getMaximumRenderbufferDimension() ||
4652 height > context->getMaximumRenderbufferDimension() ||
4653 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004654 {
4655 return error(GL_INVALID_VALUE);
4656 }
4657
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004658 GLuint handle = context->getRenderbufferHandle();
4659 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660 {
4661 return error(GL_INVALID_OPERATION);
4662 }
4663
4664 switch (internalformat)
4665 {
4666 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004667 context->setRenderbufferStorage(new gl::Depthbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004668 break;
4669 case GL_RGBA4:
4670 case GL_RGB5_A1:
4671 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004672 case GL_RGB8_OES:
4673 case GL_RGBA8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004674 context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675 break;
4676 case GL_STENCIL_INDEX8:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004677 context->setRenderbufferStorage(new gl::Stencilbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 break;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004679 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004680 context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height, samples));
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004681 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 default:
4683 return error(GL_INVALID_ENUM);
4684 }
4685 }
4686 }
4687 catch(std::bad_alloc&)
4688 {
4689 return error(GL_OUT_OF_MEMORY);
4690 }
4691}
4692
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004693void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4694{
4695 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4696}
4697
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004700 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004701
4702 try
4703 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004704 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004705
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 if (context)
4707 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004708 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709 }
4710 }
4711 catch(std::bad_alloc&)
4712 {
4713 return error(GL_OUT_OF_MEMORY);
4714 }
4715}
4716
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004717void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004719 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004720
4721 try
4722 {
4723 if (condition != GL_ALL_COMPLETED_NV)
4724 {
4725 return error(GL_INVALID_ENUM);
4726 }
4727
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004728 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004729
4730 if (context)
4731 {
4732 gl::Fence *fenceObject = context->getFence(fence);
4733
4734 if (fenceObject == NULL)
4735 {
4736 return error(GL_INVALID_OPERATION);
4737 }
4738
4739 fenceObject->setFence(condition);
4740 }
4741 }
4742 catch(std::bad_alloc&)
4743 {
4744 return error(GL_OUT_OF_MEMORY);
4745 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004746}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004747
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4749{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004750 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751
4752 try
4753 {
4754 if (width < 0 || height < 0)
4755 {
4756 return error(GL_INVALID_VALUE);
4757 }
4758
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004759 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004760
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761 if (context)
4762 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004763 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004764 }
4765 }
4766 catch(std::bad_alloc&)
4767 {
4768 return error(GL_OUT_OF_MEMORY);
4769 }
4770}
4771
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004772void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004774 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004775 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004776 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004777
4778 try
4779 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004780 // No binary shader formats are supported.
4781 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783 catch(std::bad_alloc&)
4784 {
4785 return error(GL_OUT_OF_MEMORY);
4786 }
4787}
4788
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004789void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004791 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004792 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793
4794 try
4795 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004796 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797 {
4798 return error(GL_INVALID_VALUE);
4799 }
4800
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
4803 if (context)
4804 {
4805 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004806
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004807 if (!shaderObject)
4808 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004809 if (context->getProgram(shader))
4810 {
4811 return error(GL_INVALID_OPERATION);
4812 }
4813 else
4814 {
4815 return error(GL_INVALID_VALUE);
4816 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817 }
4818
4819 shaderObject->setSource(count, string, length);
4820 }
4821 }
4822 catch(std::bad_alloc&)
4823 {
4824 return error(GL_OUT_OF_MEMORY);
4825 }
4826}
4827
4828void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4829{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004830 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831}
4832
4833void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004835 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836
4837 try
4838 {
4839 switch (face)
4840 {
4841 case GL_FRONT:
4842 case GL_BACK:
4843 case GL_FRONT_AND_BACK:
4844 break;
4845 default:
4846 return error(GL_INVALID_ENUM);
4847 }
4848
4849 switch (func)
4850 {
4851 case GL_NEVER:
4852 case GL_ALWAYS:
4853 case GL_LESS:
4854 case GL_LEQUAL:
4855 case GL_EQUAL:
4856 case GL_GEQUAL:
4857 case GL_GREATER:
4858 case GL_NOTEQUAL:
4859 break;
4860 default:
4861 return error(GL_INVALID_ENUM);
4862 }
4863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 if (context)
4867 {
4868 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4869 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004870 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871 }
4872
4873 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4874 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004875 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004876 }
4877 }
4878 }
4879 catch(std::bad_alloc&)
4880 {
4881 return error(GL_OUT_OF_MEMORY);
4882 }
4883}
4884
4885void __stdcall glStencilMask(GLuint mask)
4886{
4887 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4888}
4889
4890void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4891{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004892 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004893
4894 try
4895 {
4896 switch (face)
4897 {
4898 case GL_FRONT:
4899 case GL_BACK:
4900 case GL_FRONT_AND_BACK:
4901 break;
4902 default:
4903 return error(GL_INVALID_ENUM);
4904 }
4905
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004906 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907
4908 if (context)
4909 {
4910 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4911 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004912 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913 }
4914
4915 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4916 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004917 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918 }
4919 }
4920 }
4921 catch(std::bad_alloc&)
4922 {
4923 return error(GL_OUT_OF_MEMORY);
4924 }
4925}
4926
4927void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4928{
4929 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4930}
4931
4932void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004934 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004935 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936
4937 try
4938 {
4939 switch (face)
4940 {
4941 case GL_FRONT:
4942 case GL_BACK:
4943 case GL_FRONT_AND_BACK:
4944 break;
4945 default:
4946 return error(GL_INVALID_ENUM);
4947 }
4948
4949 switch (fail)
4950 {
4951 case GL_ZERO:
4952 case GL_KEEP:
4953 case GL_REPLACE:
4954 case GL_INCR:
4955 case GL_DECR:
4956 case GL_INVERT:
4957 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004958 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004959 break;
4960 default:
4961 return error(GL_INVALID_ENUM);
4962 }
4963
4964 switch (zfail)
4965 {
4966 case GL_ZERO:
4967 case GL_KEEP:
4968 case GL_REPLACE:
4969 case GL_INCR:
4970 case GL_DECR:
4971 case GL_INVERT:
4972 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004973 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004974 break;
4975 default:
4976 return error(GL_INVALID_ENUM);
4977 }
4978
4979 switch (zpass)
4980 {
4981 case GL_ZERO:
4982 case GL_KEEP:
4983 case GL_REPLACE:
4984 case GL_INCR:
4985 case GL_DECR:
4986 case GL_INVERT:
4987 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004988 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989 break;
4990 default:
4991 return error(GL_INVALID_ENUM);
4992 }
4993
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995
4996 if (context)
4997 {
4998 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4999 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005000 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005001 }
5002
5003 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5004 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005005 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005006 }
5007 }
5008 }
5009 catch(std::bad_alloc&)
5010 {
5011 return error(GL_OUT_OF_MEMORY);
5012 }
5013}
5014
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005015GLboolean __stdcall glTestFenceNV(GLuint fence)
5016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005017 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005018
5019 try
5020 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005021 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005022
5023 if (context)
5024 {
5025 gl::Fence *fenceObject = context->getFence(fence);
5026
5027 if (fenceObject == NULL)
5028 {
5029 return error(GL_INVALID_OPERATION, GL_TRUE);
5030 }
5031
5032 return fenceObject->testFence();
5033 }
5034 }
5035 catch(std::bad_alloc&)
5036 {
5037 error(GL_OUT_OF_MEMORY);
5038 }
5039
5040 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005041}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005042
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005043void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5044 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005046 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005047 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005048 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049
5050 try
5051 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005052 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005053 {
5054 return error(GL_INVALID_VALUE);
5055 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005056
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005057 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058 {
5059 return error(GL_INVALID_OPERATION);
5060 }
5061
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005062 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 {
5064 case GL_ALPHA:
5065 case GL_LUMINANCE:
5066 case GL_LUMINANCE_ALPHA:
5067 switch (type)
5068 {
5069 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005070 case GL_FLOAT:
5071 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005072 break;
5073 default:
5074 return error(GL_INVALID_ENUM);
5075 }
5076 break;
5077 case GL_RGB:
5078 switch (type)
5079 {
5080 case GL_UNSIGNED_BYTE:
5081 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005082 case GL_FLOAT:
5083 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005084 break;
5085 default:
5086 return error(GL_INVALID_ENUM);
5087 }
5088 break;
5089 case GL_RGBA:
5090 switch (type)
5091 {
5092 case GL_UNSIGNED_BYTE:
5093 case GL_UNSIGNED_SHORT_4_4_4_4:
5094 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005095 case GL_FLOAT:
5096 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005097 break;
5098 default:
5099 return error(GL_INVALID_ENUM);
5100 }
5101 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005102 case GL_BGRA_EXT:
5103 switch (type)
5104 {
5105 case GL_UNSIGNED_BYTE:
5106 break;
5107 default:
5108 return error(GL_INVALID_ENUM);
5109 }
5110 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005111 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5112 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005113 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5114 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005115 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005116 default:
5117 return error(GL_INVALID_VALUE);
5118 }
5119
5120 if (border != 0)
5121 {
5122 return error(GL_INVALID_VALUE);
5123 }
5124
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005125 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005126
5127 if (context)
5128 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005129 if (level > context->getMaximumTextureLevel())
5130 {
5131 return error(GL_INVALID_VALUE);
5132 }
5133
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005134 switch (target)
5135 {
5136 case GL_TEXTURE_2D:
5137 if (width > (context->getMaximumTextureDimension() >> level) ||
5138 height > (context->getMaximumTextureDimension() >> level))
5139 {
5140 return error(GL_INVALID_VALUE);
5141 }
5142 break;
5143 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5144 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5145 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5146 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5147 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5148 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5149 if (width != height)
5150 {
5151 return error(GL_INVALID_VALUE);
5152 }
5153
5154 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5155 height > (context->getMaximumCubeTextureDimension() >> level))
5156 {
5157 return error(GL_INVALID_VALUE);
5158 }
5159 break;
5160 default:
5161 return error(GL_INVALID_ENUM);
5162 }
5163
gman@chromium.org50c526d2011-08-10 05:19:44 +00005164 switch (format) {
5165 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5166 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5167 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005168 {
5169 return error(GL_INVALID_OPERATION);
5170 }
5171 else
5172 {
5173 return error(GL_INVALID_ENUM);
5174 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005175 break;
5176 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5177 if (context->supportsDXT3Textures())
5178 {
5179 return error(GL_INVALID_OPERATION);
5180 }
5181 else
5182 {
5183 return error(GL_INVALID_ENUM);
5184 }
5185 break;
5186 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5187 if (context->supportsDXT5Textures())
5188 {
5189 return error(GL_INVALID_OPERATION);
5190 }
5191 else
5192 {
5193 return error(GL_INVALID_ENUM);
5194 }
5195 break;
5196 default:
5197 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005198 }
5199
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005200 if (type == GL_FLOAT)
5201 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005202 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005203 {
5204 return error(GL_INVALID_ENUM);
5205 }
5206 }
5207 else if (type == GL_HALF_FLOAT_OES)
5208 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005209 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005210 {
5211 return error(GL_INVALID_ENUM);
5212 }
5213 }
5214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 if (target == GL_TEXTURE_2D)
5216 {
5217 gl::Texture2D *texture = context->getTexture2D();
5218
5219 if (!texture)
5220 {
5221 return error(GL_INVALID_OPERATION);
5222 }
5223
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005224 if (texture->isImmutable())
5225 {
5226 return error(GL_INVALID_OPERATION);
5227 }
5228
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005229 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 }
5231 else
5232 {
5233 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5234
5235 if (!texture)
5236 {
5237 return error(GL_INVALID_OPERATION);
5238 }
5239
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005240 if (texture->isImmutable())
5241 {
5242 return error(GL_INVALID_OPERATION);
5243 }
5244
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245 switch (target)
5246 {
5247 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005248 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005249 break;
5250 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005251 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005252 break;
5253 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005254 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005255 break;
5256 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005257 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 break;
5259 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005260 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005261 break;
5262 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005263 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005264 break;
5265 default: UNREACHABLE();
5266 }
5267 }
5268 }
5269 }
5270 catch(std::bad_alloc&)
5271 {
5272 return error(GL_OUT_OF_MEMORY);
5273 }
5274}
5275
5276void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5277{
5278 glTexParameteri(target, pname, (GLint)param);
5279}
5280
5281void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5282{
5283 glTexParameteri(target, pname, (GLint)*params);
5284}
5285
5286void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005288 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005289
5290 try
5291 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005292 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005293
5294 if (context)
5295 {
5296 gl::Texture *texture;
5297
5298 switch (target)
5299 {
5300 case GL_TEXTURE_2D:
5301 texture = context->getTexture2D();
5302 break;
5303 case GL_TEXTURE_CUBE_MAP:
5304 texture = context->getTextureCubeMap();
5305 break;
5306 default:
5307 return error(GL_INVALID_ENUM);
5308 }
5309
5310 switch (pname)
5311 {
5312 case GL_TEXTURE_WRAP_S:
5313 if (!texture->setWrapS((GLenum)param))
5314 {
5315 return error(GL_INVALID_ENUM);
5316 }
5317 break;
5318 case GL_TEXTURE_WRAP_T:
5319 if (!texture->setWrapT((GLenum)param))
5320 {
5321 return error(GL_INVALID_ENUM);
5322 }
5323 break;
5324 case GL_TEXTURE_MIN_FILTER:
5325 if (!texture->setMinFilter((GLenum)param))
5326 {
5327 return error(GL_INVALID_ENUM);
5328 }
5329 break;
5330 case GL_TEXTURE_MAG_FILTER:
5331 if (!texture->setMagFilter((GLenum)param))
5332 {
5333 return error(GL_INVALID_ENUM);
5334 }
5335 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005336 case GL_TEXTURE_USAGE_ANGLE:
5337 if (!texture->setUsage((GLenum)param))
5338 {
5339 return error(GL_INVALID_ENUM);
5340 }
5341 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342 default:
5343 return error(GL_INVALID_ENUM);
5344 }
5345 }
5346 }
5347 catch(std::bad_alloc&)
5348 {
5349 return error(GL_OUT_OF_MEMORY);
5350 }
5351}
5352
5353void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5354{
5355 glTexParameteri(target, pname, *params);
5356}
5357
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005358void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5359{
5360 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5361 target, levels, internalformat, width, height);
5362
5363 try
5364 {
5365 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5366 {
5367 return error(GL_INVALID_ENUM);
5368 }
5369
5370 if (width < 1 || height < 1 || levels < 1)
5371 {
5372 return error(GL_INVALID_VALUE);
5373 }
5374
5375 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5376 {
5377 return error(GL_INVALID_VALUE);
5378 }
5379
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005380 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005381 {
5382 return error(GL_INVALID_OPERATION);
5383 }
5384
5385 GLenum format = gl::ExtractFormat(internalformat);
5386 GLenum type = gl::ExtractType(internalformat);
5387
5388 if (format == GL_NONE || type == GL_NONE)
5389 {
5390 return error(GL_INVALID_ENUM);
5391 }
5392
5393 gl::Context *context = gl::getNonLostContext();
5394
5395 if (context)
5396 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005397 switch (target)
5398 {
5399 case GL_TEXTURE_2D:
5400 if (width > context->getMaximumTextureDimension() ||
5401 height > context->getMaximumTextureDimension())
5402 {
5403 return error(GL_INVALID_VALUE);
5404 }
5405 break;
5406 case GL_TEXTURE_CUBE_MAP:
5407 if (width > context->getMaximumCubeTextureDimension() ||
5408 height > context->getMaximumCubeTextureDimension())
5409 {
5410 return error(GL_INVALID_VALUE);
5411 }
5412 break;
5413 default:
5414 return error(GL_INVALID_ENUM);
5415 }
5416
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005417 if (levels != 1 && !context->supportsNonPower2Texture())
5418 {
5419 if (!gl::isPow2(width) || !gl::isPow2(height))
5420 {
5421 return error(GL_INVALID_OPERATION);
5422 }
5423 }
5424
daniel@transgaming.come1077362011-11-11 04:16:50 +00005425 switch (internalformat)
5426 {
5427 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5428 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5429 if (!context->supportsDXT1Textures())
5430 {
5431 return error(GL_INVALID_ENUM);
5432 }
5433 break;
5434 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5435 if (!context->supportsDXT3Textures())
5436 {
5437 return error(GL_INVALID_ENUM);
5438 }
5439 break;
5440 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5441 if (!context->supportsDXT5Textures())
5442 {
5443 return error(GL_INVALID_ENUM);
5444 }
5445 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005446 case GL_RGBA32F_EXT:
5447 case GL_RGB32F_EXT:
5448 case GL_ALPHA32F_EXT:
5449 case GL_LUMINANCE32F_EXT:
5450 case GL_LUMINANCE_ALPHA32F_EXT:
5451 if (!context->supportsFloat32Textures())
5452 {
5453 return error(GL_INVALID_ENUM);
5454 }
5455 break;
5456 case GL_RGBA16F_EXT:
5457 case GL_RGB16F_EXT:
5458 case GL_ALPHA16F_EXT:
5459 case GL_LUMINANCE16F_EXT:
5460 case GL_LUMINANCE_ALPHA16F_EXT:
5461 if (!context->supportsFloat16Textures())
5462 {
5463 return error(GL_INVALID_ENUM);
5464 }
5465 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005466 }
5467
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005468 if (target == GL_TEXTURE_2D)
5469 {
5470 gl::Texture2D *texture = context->getTexture2D();
5471
5472 if (!texture || texture->id() == 0)
5473 {
5474 return error(GL_INVALID_OPERATION);
5475 }
5476
5477 if (texture->isImmutable())
5478 {
5479 return error(GL_INVALID_OPERATION);
5480 }
5481
5482 texture->storage(levels, internalformat, width, height);
5483 }
5484 else if (target == GL_TEXTURE_CUBE_MAP)
5485 {
5486 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5487
5488 if (!texture || texture->id() == 0)
5489 {
5490 return error(GL_INVALID_OPERATION);
5491 }
5492
5493 if (texture->isImmutable())
5494 {
5495 return error(GL_INVALID_OPERATION);
5496 }
5497
5498 texture->storage(levels, internalformat, width);
5499 }
5500 else UNREACHABLE();
5501 }
5502 }
5503 catch(std::bad_alloc&)
5504 {
5505 return error(GL_OUT_OF_MEMORY);
5506 }
5507}
5508
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005509void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5510 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005512 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005513 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005514 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 target, level, xoffset, yoffset, width, height, format, type, pixels);
5516
5517 try
5518 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005519 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005520 {
5521 return error(GL_INVALID_ENUM);
5522 }
5523
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005524 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 {
5526 return error(GL_INVALID_VALUE);
5527 }
5528
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005529 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5530 {
5531 return error(GL_INVALID_VALUE);
5532 }
5533
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005534 if (!gl::CheckTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005535 {
5536 return error(GL_INVALID_ENUM);
5537 }
5538
5539 if (width == 0 || height == 0 || pixels == NULL)
5540 {
5541 return;
5542 }
5543
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005545
5546 if (context)
5547 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005548 if (level > context->getMaximumTextureLevel())
5549 {
5550 return error(GL_INVALID_VALUE);
5551 }
5552
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005553 if (format == GL_FLOAT)
5554 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005555 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005556 {
5557 return error(GL_INVALID_ENUM);
5558 }
5559 }
5560 else if (format == GL_HALF_FLOAT_OES)
5561 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005562 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005563 {
5564 return error(GL_INVALID_ENUM);
5565 }
5566 }
5567
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005568 if (target == GL_TEXTURE_2D)
5569 {
5570 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00005571 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005572 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005573 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005574 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005575 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005576 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005577 {
5578 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00005579 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005580 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005581 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005582 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005583 }
5584 else
5585 {
5586 UNREACHABLE();
5587 }
5588 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 }
5590 catch(std::bad_alloc&)
5591 {
5592 return error(GL_OUT_OF_MEMORY);
5593 }
5594}
5595
5596void __stdcall glUniform1f(GLint location, GLfloat x)
5597{
5598 glUniform1fv(location, 1, &x);
5599}
5600
5601void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005603 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604
5605 try
5606 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 if (count < 0)
5608 {
5609 return error(GL_INVALID_VALUE);
5610 }
5611
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005612 if (location == -1)
5613 {
5614 return;
5615 }
5616
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618
5619 if (context)
5620 {
5621 gl::Program *program = context->getCurrentProgram();
5622
5623 if (!program)
5624 {
5625 return error(GL_INVALID_OPERATION);
5626 }
5627
5628 if (!program->setUniform1fv(location, count, v))
5629 {
5630 return error(GL_INVALID_OPERATION);
5631 }
5632 }
5633 }
5634 catch(std::bad_alloc&)
5635 {
5636 return error(GL_OUT_OF_MEMORY);
5637 }
5638}
5639
5640void __stdcall glUniform1i(GLint location, GLint x)
5641{
5642 glUniform1iv(location, 1, &x);
5643}
5644
5645void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005647 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005648
5649 try
5650 {
5651 if (count < 0)
5652 {
5653 return error(GL_INVALID_VALUE);
5654 }
5655
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005656 if (location == -1)
5657 {
5658 return;
5659 }
5660
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005661 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005662
5663 if (context)
5664 {
5665 gl::Program *program = context->getCurrentProgram();
5666
5667 if (!program)
5668 {
5669 return error(GL_INVALID_OPERATION);
5670 }
5671
5672 if (!program->setUniform1iv(location, count, v))
5673 {
5674 return error(GL_INVALID_OPERATION);
5675 }
5676 }
5677 }
5678 catch(std::bad_alloc&)
5679 {
5680 return error(GL_OUT_OF_MEMORY);
5681 }
5682}
5683
5684void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5685{
5686 GLfloat xy[2] = {x, y};
5687
5688 glUniform2fv(location, 1, (GLfloat*)&xy);
5689}
5690
5691void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005693 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694
5695 try
5696 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005697 if (count < 0)
5698 {
5699 return error(GL_INVALID_VALUE);
5700 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005701
5702 if (location == -1)
5703 {
5704 return;
5705 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708
5709 if (context)
5710 {
5711 gl::Program *program = context->getCurrentProgram();
5712
5713 if (!program)
5714 {
5715 return error(GL_INVALID_OPERATION);
5716 }
5717
5718 if (!program->setUniform2fv(location, count, v))
5719 {
5720 return error(GL_INVALID_OPERATION);
5721 }
5722 }
5723 }
5724 catch(std::bad_alloc&)
5725 {
5726 return error(GL_OUT_OF_MEMORY);
5727 }
5728}
5729
5730void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5731{
5732 GLint xy[4] = {x, y};
5733
5734 glUniform2iv(location, 1, (GLint*)&xy);
5735}
5736
5737void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005739 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740
5741 try
5742 {
5743 if (count < 0)
5744 {
5745 return error(GL_INVALID_VALUE);
5746 }
5747
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005748 if (location == -1)
5749 {
5750 return;
5751 }
5752
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005753 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005754
5755 if (context)
5756 {
5757 gl::Program *program = context->getCurrentProgram();
5758
5759 if (!program)
5760 {
5761 return error(GL_INVALID_OPERATION);
5762 }
5763
5764 if (!program->setUniform2iv(location, count, v))
5765 {
5766 return error(GL_INVALID_OPERATION);
5767 }
5768 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005769 }
5770 catch(std::bad_alloc&)
5771 {
5772 return error(GL_OUT_OF_MEMORY);
5773 }
5774}
5775
5776void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5777{
5778 GLfloat xyz[3] = {x, y, z};
5779
5780 glUniform3fv(location, 1, (GLfloat*)&xyz);
5781}
5782
5783void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005785 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786
5787 try
5788 {
5789 if (count < 0)
5790 {
5791 return error(GL_INVALID_VALUE);
5792 }
5793
5794 if (location == -1)
5795 {
5796 return;
5797 }
5798
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800
5801 if (context)
5802 {
5803 gl::Program *program = context->getCurrentProgram();
5804
5805 if (!program)
5806 {
5807 return error(GL_INVALID_OPERATION);
5808 }
5809
5810 if (!program->setUniform3fv(location, count, v))
5811 {
5812 return error(GL_INVALID_OPERATION);
5813 }
5814 }
5815 }
5816 catch(std::bad_alloc&)
5817 {
5818 return error(GL_OUT_OF_MEMORY);
5819 }
5820}
5821
5822void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5823{
5824 GLint xyz[3] = {x, y, z};
5825
5826 glUniform3iv(location, 1, (GLint*)&xyz);
5827}
5828
5829void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005831 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005832
5833 try
5834 {
5835 if (count < 0)
5836 {
5837 return error(GL_INVALID_VALUE);
5838 }
5839
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005840 if (location == -1)
5841 {
5842 return;
5843 }
5844
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005845 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005846
5847 if (context)
5848 {
5849 gl::Program *program = context->getCurrentProgram();
5850
5851 if (!program)
5852 {
5853 return error(GL_INVALID_OPERATION);
5854 }
5855
5856 if (!program->setUniform3iv(location, count, v))
5857 {
5858 return error(GL_INVALID_OPERATION);
5859 }
5860 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861 }
5862 catch(std::bad_alloc&)
5863 {
5864 return error(GL_OUT_OF_MEMORY);
5865 }
5866}
5867
5868void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5869{
5870 GLfloat xyzw[4] = {x, y, z, w};
5871
5872 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5873}
5874
5875void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005877 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878
5879 try
5880 {
5881 if (count < 0)
5882 {
5883 return error(GL_INVALID_VALUE);
5884 }
5885
5886 if (location == -1)
5887 {
5888 return;
5889 }
5890
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005892
5893 if (context)
5894 {
5895 gl::Program *program = context->getCurrentProgram();
5896
5897 if (!program)
5898 {
5899 return error(GL_INVALID_OPERATION);
5900 }
5901
5902 if (!program->setUniform4fv(location, count, v))
5903 {
5904 return error(GL_INVALID_OPERATION);
5905 }
5906 }
5907 }
5908 catch(std::bad_alloc&)
5909 {
5910 return error(GL_OUT_OF_MEMORY);
5911 }
5912}
5913
5914void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5915{
5916 GLint xyzw[4] = {x, y, z, w};
5917
5918 glUniform4iv(location, 1, (GLint*)&xyzw);
5919}
5920
5921void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005923 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924
5925 try
5926 {
5927 if (count < 0)
5928 {
5929 return error(GL_INVALID_VALUE);
5930 }
5931
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005932 if (location == -1)
5933 {
5934 return;
5935 }
5936
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005937 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005938
5939 if (context)
5940 {
5941 gl::Program *program = context->getCurrentProgram();
5942
5943 if (!program)
5944 {
5945 return error(GL_INVALID_OPERATION);
5946 }
5947
5948 if (!program->setUniform4iv(location, count, v))
5949 {
5950 return error(GL_INVALID_OPERATION);
5951 }
5952 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953 }
5954 catch(std::bad_alloc&)
5955 {
5956 return error(GL_OUT_OF_MEMORY);
5957 }
5958}
5959
5960void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005962 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005963 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964
5965 try
5966 {
5967 if (count < 0 || transpose != GL_FALSE)
5968 {
5969 return error(GL_INVALID_VALUE);
5970 }
5971
5972 if (location == -1)
5973 {
5974 return;
5975 }
5976
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005978
5979 if (context)
5980 {
5981 gl::Program *program = context->getCurrentProgram();
5982
5983 if (!program)
5984 {
5985 return error(GL_INVALID_OPERATION);
5986 }
5987
5988 if (!program->setUniformMatrix2fv(location, count, value))
5989 {
5990 return error(GL_INVALID_OPERATION);
5991 }
5992 }
5993 }
5994 catch(std::bad_alloc&)
5995 {
5996 return error(GL_OUT_OF_MEMORY);
5997 }
5998}
5999
6000void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006002 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006003 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004
6005 try
6006 {
6007 if (count < 0 || transpose != GL_FALSE)
6008 {
6009 return error(GL_INVALID_VALUE);
6010 }
6011
6012 if (location == -1)
6013 {
6014 return;
6015 }
6016
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006017 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018
6019 if (context)
6020 {
6021 gl::Program *program = context->getCurrentProgram();
6022
6023 if (!program)
6024 {
6025 return error(GL_INVALID_OPERATION);
6026 }
6027
6028 if (!program->setUniformMatrix3fv(location, count, value))
6029 {
6030 return error(GL_INVALID_OPERATION);
6031 }
6032 }
6033 }
6034 catch(std::bad_alloc&)
6035 {
6036 return error(GL_OUT_OF_MEMORY);
6037 }
6038}
6039
6040void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006042 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006043 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044
6045 try
6046 {
6047 if (count < 0 || transpose != GL_FALSE)
6048 {
6049 return error(GL_INVALID_VALUE);
6050 }
6051
6052 if (location == -1)
6053 {
6054 return;
6055 }
6056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058
6059 if (context)
6060 {
6061 gl::Program *program = context->getCurrentProgram();
6062
6063 if (!program)
6064 {
6065 return error(GL_INVALID_OPERATION);
6066 }
6067
6068 if (!program->setUniformMatrix4fv(location, count, value))
6069 {
6070 return error(GL_INVALID_OPERATION);
6071 }
6072 }
6073 }
6074 catch(std::bad_alloc&)
6075 {
6076 return error(GL_OUT_OF_MEMORY);
6077 }
6078}
6079
6080void __stdcall glUseProgram(GLuint program)
6081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006082 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006083
6084 try
6085 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087
6088 if (context)
6089 {
6090 gl::Program *programObject = context->getProgram(program);
6091
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006092 if (!programObject && program != 0)
6093 {
6094 if (context->getShader(program))
6095 {
6096 return error(GL_INVALID_OPERATION);
6097 }
6098 else
6099 {
6100 return error(GL_INVALID_VALUE);
6101 }
6102 }
6103
6104 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 {
6106 return error(GL_INVALID_OPERATION);
6107 }
6108
6109 context->useProgram(program);
6110 }
6111 }
6112 catch(std::bad_alloc&)
6113 {
6114 return error(GL_OUT_OF_MEMORY);
6115 }
6116}
6117
6118void __stdcall glValidateProgram(GLuint program)
6119{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006120 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006121
6122 try
6123 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006124 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006125
6126 if (context)
6127 {
6128 gl::Program *programObject = context->getProgram(program);
6129
6130 if (!programObject)
6131 {
6132 if (context->getShader(program))
6133 {
6134 return error(GL_INVALID_OPERATION);
6135 }
6136 else
6137 {
6138 return error(GL_INVALID_VALUE);
6139 }
6140 }
6141
6142 programObject->validate();
6143 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144 }
6145 catch(std::bad_alloc&)
6146 {
6147 return error(GL_OUT_OF_MEMORY);
6148 }
6149}
6150
6151void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6152{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006153 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154
6155 try
6156 {
6157 if (index >= gl::MAX_VERTEX_ATTRIBS)
6158 {
6159 return error(GL_INVALID_VALUE);
6160 }
6161
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006163
6164 if (context)
6165 {
6166 GLfloat vals[4] = { x, 0, 0, 1 };
6167 context->setVertexAttrib(index, vals);
6168 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006169 }
6170 catch(std::bad_alloc&)
6171 {
6172 return error(GL_OUT_OF_MEMORY);
6173 }
6174}
6175
6176void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006178 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006179
6180 try
6181 {
6182 if (index >= gl::MAX_VERTEX_ATTRIBS)
6183 {
6184 return error(GL_INVALID_VALUE);
6185 }
6186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006188
6189 if (context)
6190 {
6191 GLfloat vals[4] = { values[0], 0, 0, 1 };
6192 context->setVertexAttrib(index, vals);
6193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006194 }
6195 catch(std::bad_alloc&)
6196 {
6197 return error(GL_OUT_OF_MEMORY);
6198 }
6199}
6200
6201void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6202{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006203 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006204
6205 try
6206 {
6207 if (index >= gl::MAX_VERTEX_ATTRIBS)
6208 {
6209 return error(GL_INVALID_VALUE);
6210 }
6211
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006213
6214 if (context)
6215 {
6216 GLfloat vals[4] = { x, y, 0, 1 };
6217 context->setVertexAttrib(index, vals);
6218 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006219 }
6220 catch(std::bad_alloc&)
6221 {
6222 return error(GL_OUT_OF_MEMORY);
6223 }
6224}
6225
6226void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006228 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006229
6230 try
6231 {
6232 if (index >= gl::MAX_VERTEX_ATTRIBS)
6233 {
6234 return error(GL_INVALID_VALUE);
6235 }
6236
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006238
6239 if (context)
6240 {
6241 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6242 context->setVertexAttrib(index, vals);
6243 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006244 }
6245 catch(std::bad_alloc&)
6246 {
6247 return error(GL_OUT_OF_MEMORY);
6248 }
6249}
6250
6251void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006253 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254
6255 try
6256 {
6257 if (index >= gl::MAX_VERTEX_ATTRIBS)
6258 {
6259 return error(GL_INVALID_VALUE);
6260 }
6261
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006262 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006263
6264 if (context)
6265 {
6266 GLfloat vals[4] = { x, y, z, 1 };
6267 context->setVertexAttrib(index, vals);
6268 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006269 }
6270 catch(std::bad_alloc&)
6271 {
6272 return error(GL_OUT_OF_MEMORY);
6273 }
6274}
6275
6276void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6277{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006278 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006279
6280 try
6281 {
6282 if (index >= gl::MAX_VERTEX_ATTRIBS)
6283 {
6284 return error(GL_INVALID_VALUE);
6285 }
6286
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006288
6289 if (context)
6290 {
6291 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6292 context->setVertexAttrib(index, vals);
6293 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006294 }
6295 catch(std::bad_alloc&)
6296 {
6297 return error(GL_OUT_OF_MEMORY);
6298 }
6299}
6300
6301void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006303 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304
6305 try
6306 {
6307 if (index >= gl::MAX_VERTEX_ATTRIBS)
6308 {
6309 return error(GL_INVALID_VALUE);
6310 }
6311
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006313
6314 if (context)
6315 {
6316 GLfloat vals[4] = { x, y, z, w };
6317 context->setVertexAttrib(index, vals);
6318 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320 catch(std::bad_alloc&)
6321 {
6322 return error(GL_OUT_OF_MEMORY);
6323 }
6324}
6325
6326void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006328 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006329
6330 try
6331 {
6332 if (index >= gl::MAX_VERTEX_ATTRIBS)
6333 {
6334 return error(GL_INVALID_VALUE);
6335 }
6336
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006338
6339 if (context)
6340 {
6341 context->setVertexAttrib(index, values);
6342 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343 }
6344 catch(std::bad_alloc&)
6345 {
6346 return error(GL_OUT_OF_MEMORY);
6347 }
6348}
6349
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006350void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6351{
6352 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6353
6354 try
6355 {
6356 if (index >= gl::MAX_VERTEX_ATTRIBS)
6357 {
6358 return error(GL_INVALID_VALUE);
6359 }
6360
6361 gl::Context *context = gl::getNonLostContext();
6362
6363 if (context)
6364 {
6365 context->setVertexAttribDivisor(index, divisor);
6366 }
6367 }
6368 catch(std::bad_alloc&)
6369 {
6370 return error(GL_OUT_OF_MEMORY);
6371 }
6372}
6373
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006374void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006376 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006377 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006378 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006379
6380 try
6381 {
6382 if (index >= gl::MAX_VERTEX_ATTRIBS)
6383 {
6384 return error(GL_INVALID_VALUE);
6385 }
6386
6387 if (size < 1 || size > 4)
6388 {
6389 return error(GL_INVALID_VALUE);
6390 }
6391
6392 switch (type)
6393 {
6394 case GL_BYTE:
6395 case GL_UNSIGNED_BYTE:
6396 case GL_SHORT:
6397 case GL_UNSIGNED_SHORT:
6398 case GL_FIXED:
6399 case GL_FLOAT:
6400 break;
6401 default:
6402 return error(GL_INVALID_ENUM);
6403 }
6404
6405 if (stride < 0)
6406 {
6407 return error(GL_INVALID_VALUE);
6408 }
6409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006411
6412 if (context)
6413 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006414 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006415 }
6416 }
6417 catch(std::bad_alloc&)
6418 {
6419 return error(GL_OUT_OF_MEMORY);
6420 }
6421}
6422
6423void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6424{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006425 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006426
6427 try
6428 {
6429 if (width < 0 || height < 0)
6430 {
6431 return error(GL_INVALID_VALUE);
6432 }
6433
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435
6436 if (context)
6437 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006438 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006439 }
6440 }
6441 catch(std::bad_alloc&)
6442 {
6443 return error(GL_OUT_OF_MEMORY);
6444 }
6445}
6446
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006447void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6448 GLbitfield mask, GLenum filter)
6449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006450 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006451 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6452 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6453 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6454
6455 try
6456 {
6457 switch (filter)
6458 {
6459 case GL_NEAREST:
6460 break;
6461 default:
6462 return error(GL_INVALID_ENUM);
6463 }
6464
6465 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6466 {
6467 return error(GL_INVALID_VALUE);
6468 }
6469
6470 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6471 {
6472 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
6473 return error(GL_INVALID_OPERATION);
6474 }
6475
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006476 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006477
6478 if (context)
6479 {
6480 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6481 {
6482 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
6483 return error(GL_INVALID_OPERATION);
6484 }
6485
6486 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6487 }
6488 }
6489 catch(std::bad_alloc&)
6490 {
6491 return error(GL_OUT_OF_MEMORY);
6492 }
6493}
6494
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006495void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6496 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006498 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006499 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006500 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006501 target, level, internalformat, width, height, depth, border, format, type, pixels);
6502
6503 try
6504 {
6505 UNIMPLEMENTED(); // FIXME
6506 }
6507 catch(std::bad_alloc&)
6508 {
6509 return error(GL_OUT_OF_MEMORY);
6510 }
6511}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006512
6513__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6514{
6515 struct Extension
6516 {
6517 const char *name;
6518 __eglMustCastToProperFunctionPointerType address;
6519 };
6520
6521 static const Extension glExtensions[] =
6522 {
6523 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006524 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006525 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006526 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6527 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6528 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6529 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6530 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6531 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6532 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006533 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006534 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006535 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6536 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6537 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6538 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006539 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6540 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6541 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6542 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6543 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6544 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6545 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006546 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6547 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6548 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006549 };
6550
6551 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6552 {
6553 if (strcmp(procname, glExtensions[ext].name) == 0)
6554 {
6555 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6556 }
6557 }
6558
6559 return NULL;
6560}
6561
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006562// Non-public functions used by EGL
6563
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006564bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006565{
6566 EVENT("(egl::Surface* surface = 0x%0.8p)",
6567 surface);
6568
6569 try
6570 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006571 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006572
6573 if (context)
6574 {
6575 gl::Texture2D *textureObject = context->getTexture2D();
6576
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006577 if (textureObject->isImmutable())
6578 {
6579 return false;
6580 }
6581
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006582 if (textureObject)
6583 {
6584 textureObject->bindTexImage(surface);
6585 }
6586 }
6587 }
6588 catch(std::bad_alloc&)
6589 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006590 return error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006591 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006592
6593 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006594}
6595
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006596}