blob: b06e5320864bf748e49317f878936b99138f0f6c [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
daniel@transgaming.com92f49922012-05-09 15:49:19 +000066 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +000067 {
68 return error(GL_INVALID_OPERATION, false);
69 }
70
daniel@transgaming.com92f49922012-05-09 15:49:19 +000071 if (format != GL_NONE && format != texture->getInternalFormat(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +000072 {
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,
daniel@transgaming.com4df88e82012-05-09 15:49:24 +000095 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +000096 gl::TextureCubeMap *texture)
97{
98 if (!texture)
99 {
100 return error(GL_INVALID_OPERATION, false);
101 }
102
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000103 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000104 {
105 return error(GL_INVALID_OPERATION, false);
106 }
107
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000108 if (format != GL_NONE && format != texture->getInternalFormat(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000109 {
110 return error(GL_INVALID_OPERATION, false);
111 }
112
113 if (compressed)
114 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000115 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
116 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000117 {
118 return error(GL_INVALID_OPERATION, false);
119 }
120 }
121
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000122 if (xoffset + width > texture->getWidth(target, level) ||
123 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000124 {
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.com4df88e82012-05-09 15:49:24 +00001144 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, 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 }
daniel@transgaming.com92f49922012-05-09 15:49:19 +00001407 textureFormat = tex2d->getInternalFormat(level);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001408 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
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001414 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001415 {
1416 return; // error already registered by validateSubImageParams
1417 }
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001418 textureFormat = texcube->getInternalFormat(target, level);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001419 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.com4f39fd92010-03-08 20:26:45 +00002356 switch (textarget)
2357 {
2358 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002359 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002360 if (tex->getTarget() != GL_TEXTURE_2D)
2361 {
2362 return error(GL_INVALID_OPERATION);
2363 }
2364 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002365 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002366 {
2367 return error(GL_INVALID_OPERATION);
2368 }
2369 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002371
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002378 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002379 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2380 {
2381 return error(GL_INVALID_OPERATION);
2382 }
2383 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002384 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002385 {
2386 return error(GL_INVALID_OPERATION);
2387 }
2388 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002389 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 default:
2392 return error(GL_INVALID_ENUM);
2393 }
2394
2395 if (level != 0)
2396 {
2397 return error(GL_INVALID_VALUE);
2398 }
2399 }
2400
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002401 gl::Framebuffer *framebuffer = NULL;
2402 GLuint framebufferHandle = 0;
2403 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2404 {
2405 framebuffer = context->getReadFramebuffer();
2406 framebufferHandle = context->getReadFramebufferHandle();
2407 }
2408 else
2409 {
2410 framebuffer = context->getDrawFramebuffer();
2411 framebufferHandle = context->getDrawFramebufferHandle();
2412 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002413
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002414 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415 {
2416 return error(GL_INVALID_OPERATION);
2417 }
2418
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002419 switch (attachment)
2420 {
2421 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2422 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2423 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002425 }
2426 }
2427 catch(std::bad_alloc&)
2428 {
2429 return error(GL_OUT_OF_MEMORY);
2430 }
2431}
2432
2433void __stdcall glFrontFace(GLenum mode)
2434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002435 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436
2437 try
2438 {
2439 switch (mode)
2440 {
2441 case GL_CW:
2442 case GL_CCW:
2443 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002444 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445
2446 if (context)
2447 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002448 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 }
2450 }
2451 break;
2452 default:
2453 return error(GL_INVALID_ENUM);
2454 }
2455 }
2456 catch(std::bad_alloc&)
2457 {
2458 return error(GL_OUT_OF_MEMORY);
2459 }
2460}
2461
2462void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002464 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002465
2466 try
2467 {
2468 if (n < 0)
2469 {
2470 return error(GL_INVALID_VALUE);
2471 }
2472
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002473 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474
2475 if (context)
2476 {
2477 for (int i = 0; i < n; i++)
2478 {
2479 buffers[i] = context->createBuffer();
2480 }
2481 }
2482 }
2483 catch(std::bad_alloc&)
2484 {
2485 return error(GL_OUT_OF_MEMORY);
2486 }
2487}
2488
2489void __stdcall glGenerateMipmap(GLenum target)
2490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002491 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002492
2493 try
2494 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002496
2497 if (context)
2498 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002499 switch (target)
2500 {
2501 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002502 {
2503 gl::Texture2D *tex2d = context->getTexture2D();
2504
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002505 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002506 {
2507 return error(GL_INVALID_OPERATION);
2508 }
2509
2510 tex2d->generateMipmaps();
2511 break;
2512 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002513
2514 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002515 {
2516 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2517
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002518 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002519 {
2520 return error(GL_INVALID_OPERATION);
2521 }
2522
2523 texcube->generateMipmaps();
2524 break;
2525 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002526
2527 default:
2528 return error(GL_INVALID_ENUM);
2529 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002530 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
2532 catch(std::bad_alloc&)
2533 {
2534 return error(GL_OUT_OF_MEMORY);
2535 }
2536}
2537
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002538void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002540 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002541
2542 try
2543 {
2544 if (n < 0)
2545 {
2546 return error(GL_INVALID_VALUE);
2547 }
2548
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002549 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002550
2551 if (context)
2552 {
2553 for (int i = 0; i < n; i++)
2554 {
2555 fences[i] = context->createFence();
2556 }
2557 }
2558 }
2559 catch(std::bad_alloc&)
2560 {
2561 return error(GL_OUT_OF_MEMORY);
2562 }
2563}
2564
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002565void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2566{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002567 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002568
2569 try
2570 {
2571 if (n < 0)
2572 {
2573 return error(GL_INVALID_VALUE);
2574 }
2575
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002576 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577
2578 if (context)
2579 {
2580 for (int i = 0; i < n; i++)
2581 {
2582 framebuffers[i] = context->createFramebuffer();
2583 }
2584 }
2585 }
2586 catch(std::bad_alloc&)
2587 {
2588 return error(GL_OUT_OF_MEMORY);
2589 }
2590}
2591
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002592void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2593{
2594 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2595
2596 try
2597 {
2598 if (n < 0)
2599 {
2600 return error(GL_INVALID_VALUE);
2601 }
2602
2603 gl::Context *context = gl::getNonLostContext();
2604
2605 if (context)
2606 {
2607 for (int i = 0; i < n; i++)
2608 {
2609 ids[i] = context->createQuery();
2610 }
2611 }
2612 }
2613 catch(std::bad_alloc&)
2614 {
2615 return error(GL_OUT_OF_MEMORY);
2616 }
2617}
2618
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2620{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002621 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002622
2623 try
2624 {
2625 if (n < 0)
2626 {
2627 return error(GL_INVALID_VALUE);
2628 }
2629
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631
2632 if (context)
2633 {
2634 for (int i = 0; i < n; i++)
2635 {
2636 renderbuffers[i] = context->createRenderbuffer();
2637 }
2638 }
2639 }
2640 catch(std::bad_alloc&)
2641 {
2642 return error(GL_OUT_OF_MEMORY);
2643 }
2644}
2645
2646void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002648 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002649
2650 try
2651 {
2652 if (n < 0)
2653 {
2654 return error(GL_INVALID_VALUE);
2655 }
2656
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002657 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002658
2659 if (context)
2660 {
2661 for (int i = 0; i < n; i++)
2662 {
2663 textures[i] = context->createTexture();
2664 }
2665 }
2666 }
2667 catch(std::bad_alloc&)
2668 {
2669 return error(GL_OUT_OF_MEMORY);
2670 }
2671}
2672
daniel@transgaming.com85423182010-04-22 13:35:27 +00002673void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002675 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002676 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677 program, index, bufsize, length, size, type, name);
2678
2679 try
2680 {
2681 if (bufsize < 0)
2682 {
2683 return error(GL_INVALID_VALUE);
2684 }
2685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002687
2688 if (context)
2689 {
2690 gl::Program *programObject = context->getProgram(program);
2691
2692 if (!programObject)
2693 {
2694 if (context->getShader(program))
2695 {
2696 return error(GL_INVALID_OPERATION);
2697 }
2698 else
2699 {
2700 return error(GL_INVALID_VALUE);
2701 }
2702 }
2703
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002704 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002705 {
2706 return error(GL_INVALID_VALUE);
2707 }
2708
2709 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2710 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002711 }
2712 catch(std::bad_alloc&)
2713 {
2714 return error(GL_OUT_OF_MEMORY);
2715 }
2716}
2717
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002718void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002720 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002721 "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 +00002722 program, index, bufsize, length, size, type, name);
2723
2724 try
2725 {
2726 if (bufsize < 0)
2727 {
2728 return error(GL_INVALID_VALUE);
2729 }
2730
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002732
2733 if (context)
2734 {
2735 gl::Program *programObject = context->getProgram(program);
2736
2737 if (!programObject)
2738 {
2739 if (context->getShader(program))
2740 {
2741 return error(GL_INVALID_OPERATION);
2742 }
2743 else
2744 {
2745 return error(GL_INVALID_VALUE);
2746 }
2747 }
2748
2749 if (index >= (GLuint)programObject->getActiveUniformCount())
2750 {
2751 return error(GL_INVALID_VALUE);
2752 }
2753
2754 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2755 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002756 }
2757 catch(std::bad_alloc&)
2758 {
2759 return error(GL_OUT_OF_MEMORY);
2760 }
2761}
2762
2763void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2764{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002765 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 +00002766 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767
2768 try
2769 {
2770 if (maxcount < 0)
2771 {
2772 return error(GL_INVALID_VALUE);
2773 }
2774
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002775 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002776
2777 if (context)
2778 {
2779 gl::Program *programObject = context->getProgram(program);
2780
2781 if (!programObject)
2782 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002783 if (context->getShader(program))
2784 {
2785 return error(GL_INVALID_OPERATION);
2786 }
2787 else
2788 {
2789 return error(GL_INVALID_VALUE);
2790 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002791 }
2792
2793 return programObject->getAttachedShaders(maxcount, count, shaders);
2794 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002795 }
2796 catch(std::bad_alloc&)
2797 {
2798 return error(GL_OUT_OF_MEMORY);
2799 }
2800}
2801
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002802int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002803{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002804 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002805
2806 try
2807 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002809
2810 if (context)
2811 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002812
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002813 gl::Program *programObject = context->getProgram(program);
2814
2815 if (!programObject)
2816 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002817 if (context->getShader(program))
2818 {
2819 return error(GL_INVALID_OPERATION, -1);
2820 }
2821 else
2822 {
2823 return error(GL_INVALID_VALUE, -1);
2824 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825 }
2826
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002827 if (!programObject->isLinked())
2828 {
2829 return error(GL_INVALID_OPERATION, -1);
2830 }
2831
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002832 return programObject->getAttributeLocation(name);
2833 }
2834 }
2835 catch(std::bad_alloc&)
2836 {
2837 return error(GL_OUT_OF_MEMORY, -1);
2838 }
2839
2840 return -1;
2841}
2842
2843void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002845 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846
2847 try
2848 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002849 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002850
2851 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002852 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002853 if (!(context->getBooleanv(pname, params)))
2854 {
2855 GLenum nativeType;
2856 unsigned int numParams = 0;
2857 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2858 return error(GL_INVALID_ENUM);
2859
2860 if (numParams == 0)
2861 return; // it is known that the pname is valid, but there are no parameters to return
2862
2863 if (nativeType == GL_FLOAT)
2864 {
2865 GLfloat *floatParams = NULL;
2866 floatParams = new GLfloat[numParams];
2867
2868 context->getFloatv(pname, floatParams);
2869
2870 for (unsigned int i = 0; i < numParams; ++i)
2871 {
2872 if (floatParams[i] == 0.0f)
2873 params[i] = GL_FALSE;
2874 else
2875 params[i] = GL_TRUE;
2876 }
2877
2878 delete [] floatParams;
2879 }
2880 else if (nativeType == GL_INT)
2881 {
2882 GLint *intParams = NULL;
2883 intParams = new GLint[numParams];
2884
2885 context->getIntegerv(pname, intParams);
2886
2887 for (unsigned int i = 0; i < numParams; ++i)
2888 {
2889 if (intParams[i] == 0)
2890 params[i] = GL_FALSE;
2891 else
2892 params[i] = GL_TRUE;
2893 }
2894
2895 delete [] intParams;
2896 }
2897 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002898 }
2899 }
2900 catch(std::bad_alloc&)
2901 {
2902 return error(GL_OUT_OF_MEMORY);
2903 }
2904}
2905
2906void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002908 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 +00002909
2910 try
2911 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002912 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002913
2914 if (context)
2915 {
2916 gl::Buffer *buffer;
2917
2918 switch (target)
2919 {
2920 case GL_ARRAY_BUFFER:
2921 buffer = context->getArrayBuffer();
2922 break;
2923 case GL_ELEMENT_ARRAY_BUFFER:
2924 buffer = context->getElementArrayBuffer();
2925 break;
2926 default: return error(GL_INVALID_ENUM);
2927 }
2928
2929 if (!buffer)
2930 {
2931 // A null buffer means that "0" is bound to the requested buffer target
2932 return error(GL_INVALID_OPERATION);
2933 }
2934
2935 switch (pname)
2936 {
2937 case GL_BUFFER_USAGE:
2938 *params = buffer->usage();
2939 break;
2940 case GL_BUFFER_SIZE:
2941 *params = buffer->size();
2942 break;
2943 default: return error(GL_INVALID_ENUM);
2944 }
2945 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002946 }
2947 catch(std::bad_alloc&)
2948 {
2949 return error(GL_OUT_OF_MEMORY);
2950 }
2951}
2952
2953GLenum __stdcall glGetError(void)
2954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002955 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956
2957 gl::Context *context = gl::getContext();
2958
2959 if (context)
2960 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002961 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 }
2963
2964 return GL_NO_ERROR;
2965}
2966
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002967void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002969 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002970
2971 try
2972 {
2973
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002974 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002975
2976 if (context)
2977 {
2978 gl::Fence *fenceObject = context->getFence(fence);
2979
2980 if (fenceObject == NULL)
2981 {
2982 return error(GL_INVALID_OPERATION);
2983 }
2984
2985 fenceObject->getFenceiv(pname, params);
2986 }
2987 }
2988 catch(std::bad_alloc&)
2989 {
2990 return error(GL_OUT_OF_MEMORY);
2991 }
2992}
2993
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002996 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997
2998 try
2999 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003000 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003001
3002 if (context)
3003 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003004 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003005 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003006 GLenum nativeType;
3007 unsigned int numParams = 0;
3008 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3009 return error(GL_INVALID_ENUM);
3010
3011 if (numParams == 0)
3012 return; // it is known that the pname is valid, but that there are no parameters to return.
3013
3014 if (nativeType == GL_BOOL)
3015 {
3016 GLboolean *boolParams = NULL;
3017 boolParams = new GLboolean[numParams];
3018
3019 context->getBooleanv(pname, boolParams);
3020
3021 for (unsigned int i = 0; i < numParams; ++i)
3022 {
3023 if (boolParams[i] == GL_FALSE)
3024 params[i] = 0.0f;
3025 else
3026 params[i] = 1.0f;
3027 }
3028
3029 delete [] boolParams;
3030 }
3031 else if (nativeType == GL_INT)
3032 {
3033 GLint *intParams = NULL;
3034 intParams = new GLint[numParams];
3035
3036 context->getIntegerv(pname, intParams);
3037
3038 for (unsigned int i = 0; i < numParams; ++i)
3039 {
3040 params[i] = (GLfloat)intParams[i];
3041 }
3042
3043 delete [] intParams;
3044 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003045 }
3046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003047 }
3048 catch(std::bad_alloc&)
3049 {
3050 return error(GL_OUT_OF_MEMORY);
3051 }
3052}
3053
3054void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003056 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 +00003057 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003058
3059 try
3060 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003061 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003062
3063 if (context)
3064 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003065 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003066 {
3067 return error(GL_INVALID_ENUM);
3068 }
3069
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003070 gl::Framebuffer *framebuffer = NULL;
3071 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3072 {
3073 if(context->getReadFramebufferHandle() == 0)
3074 {
3075 return error(GL_INVALID_OPERATION);
3076 }
3077
3078 framebuffer = context->getReadFramebuffer();
3079 }
3080 else
3081 {
3082 if (context->getDrawFramebufferHandle() == 0)
3083 {
3084 return error(GL_INVALID_OPERATION);
3085 }
3086
3087 framebuffer = context->getDrawFramebuffer();
3088 }
3089
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003090 GLenum attachmentType;
3091 GLuint attachmentHandle;
3092 switch (attachment)
3093 {
3094 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003095 attachmentType = framebuffer->getColorbufferType();
3096 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003097 break;
3098 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003099 attachmentType = framebuffer->getDepthbufferType();
3100 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003101 break;
3102 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003103 attachmentType = framebuffer->getStencilbufferType();
3104 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003105 break;
3106 default: return error(GL_INVALID_ENUM);
3107 }
3108
3109 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003110 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003111 {
3112 attachmentObjectType = attachmentType;
3113 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003114 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003115 {
3116 attachmentObjectType = GL_TEXTURE;
3117 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003118 else
3119 {
3120 UNREACHABLE();
3121 return;
3122 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003123
3124 switch (pname)
3125 {
3126 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3127 *params = attachmentObjectType;
3128 break;
3129 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3130 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3131 {
3132 *params = attachmentHandle;
3133 }
3134 else
3135 {
3136 return error(GL_INVALID_ENUM);
3137 }
3138 break;
3139 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3140 if (attachmentObjectType == GL_TEXTURE)
3141 {
3142 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3143 }
3144 else
3145 {
3146 return error(GL_INVALID_ENUM);
3147 }
3148 break;
3149 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3150 if (attachmentObjectType == GL_TEXTURE)
3151 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003152 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003153 {
3154 *params = attachmentType;
3155 }
3156 else
3157 {
3158 *params = 0;
3159 }
3160 }
3161 else
3162 {
3163 return error(GL_INVALID_ENUM);
3164 }
3165 break;
3166 default:
3167 return error(GL_INVALID_ENUM);
3168 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169 }
3170 }
3171 catch(std::bad_alloc&)
3172 {
3173 return error(GL_OUT_OF_MEMORY);
3174 }
3175}
3176
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003177GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3178{
3179 EVENT("()");
3180
3181 try
3182 {
3183 gl::Context *context = gl::getContext();
3184
3185 if (context)
3186 {
3187 return context->getResetStatus();
3188 }
3189
3190 return GL_NO_ERROR;
3191 }
3192 catch(std::bad_alloc&)
3193 {
3194 return GL_OUT_OF_MEMORY;
3195 }
3196}
3197
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003198void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3199{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003200 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003201
3202 try
3203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205
3206 if (context)
3207 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003208 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003209 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003210 GLenum nativeType;
3211 unsigned int numParams = 0;
3212 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3213 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003214
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003215 if (numParams == 0)
3216 return; // it is known that pname is valid, but there are no parameters to return
3217
3218 if (nativeType == GL_BOOL)
3219 {
3220 GLboolean *boolParams = NULL;
3221 boolParams = new GLboolean[numParams];
3222
3223 context->getBooleanv(pname, boolParams);
3224
3225 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003227 if (boolParams[i] == GL_FALSE)
3228 params[i] = 0;
3229 else
3230 params[i] = 1;
3231 }
3232
3233 delete [] boolParams;
3234 }
3235 else if (nativeType == GL_FLOAT)
3236 {
3237 GLfloat *floatParams = NULL;
3238 floatParams = new GLfloat[numParams];
3239
3240 context->getFloatv(pname, floatParams);
3241
3242 for (unsigned int i = 0; i < numParams; ++i)
3243 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003244 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 +00003245 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003246 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003247 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003248 else
3249 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 +00003250 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003251
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003252 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254 }
3255 }
3256 }
3257 catch(std::bad_alloc&)
3258 {
3259 return error(GL_OUT_OF_MEMORY);
3260 }
3261}
3262
3263void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003265 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266
3267 try
3268 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270
3271 if (context)
3272 {
3273 gl::Program *programObject = context->getProgram(program);
3274
3275 if (!programObject)
3276 {
3277 return error(GL_INVALID_VALUE);
3278 }
3279
3280 switch (pname)
3281 {
3282 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003283 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284 return;
3285 case GL_LINK_STATUS:
3286 *params = programObject->isLinked();
3287 return;
3288 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003289 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290 return;
3291 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003292 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003293 return;
3294 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003295 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003296 return;
3297 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003298 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299 return;
3300 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003301 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302 return;
3303 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003304 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003305 return;
3306 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003307 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308 return;
3309 default:
3310 return error(GL_INVALID_ENUM);
3311 }
3312 }
3313 }
3314 catch(std::bad_alloc&)
3315 {
3316 return error(GL_OUT_OF_MEMORY);
3317 }
3318}
3319
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003320void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003321{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003322 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 +00003323 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003324
3325 try
3326 {
3327 if (bufsize < 0)
3328 {
3329 return error(GL_INVALID_VALUE);
3330 }
3331
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003332 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003333
3334 if (context)
3335 {
3336 gl::Program *programObject = context->getProgram(program);
3337
3338 if (!programObject)
3339 {
3340 return error(GL_INVALID_VALUE);
3341 }
3342
3343 programObject->getInfoLog(bufsize, length, infolog);
3344 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003345 }
3346 catch(std::bad_alloc&)
3347 {
3348 return error(GL_OUT_OF_MEMORY);
3349 }
3350}
3351
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003352void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3353{
3354 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3355
3356 try
3357 {
3358 switch (pname)
3359 {
3360 case GL_CURRENT_QUERY_EXT:
3361 break;
3362 default:
3363 return error(GL_INVALID_ENUM);
3364 }
3365
3366 gl::Context *context = gl::getNonLostContext();
3367
3368 if (context)
3369 {
3370 params[0] = context->getActiveQuery(target);
3371 }
3372 }
3373 catch(std::bad_alloc&)
3374 {
3375 return error(GL_OUT_OF_MEMORY);
3376 }
3377}
3378
3379void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3380{
3381 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3382
3383 try
3384 {
3385 switch (pname)
3386 {
3387 case GL_QUERY_RESULT_EXT:
3388 case GL_QUERY_RESULT_AVAILABLE_EXT:
3389 break;
3390 default:
3391 return error(GL_INVALID_ENUM);
3392 }
3393 gl::Context *context = gl::getNonLostContext();
3394
3395 if (context)
3396 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003397 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3398
3399 if (!queryObject)
3400 {
3401 return error(GL_INVALID_OPERATION);
3402 }
3403
3404 if (context->getActiveQuery(queryObject->getType()) == id)
3405 {
3406 return error(GL_INVALID_OPERATION);
3407 }
3408
3409 switch(pname)
3410 {
3411 case GL_QUERY_RESULT_EXT:
3412 params[0] = queryObject->getResult();
3413 break;
3414 case GL_QUERY_RESULT_AVAILABLE_EXT:
3415 params[0] = queryObject->isResultAvailable();
3416 break;
3417 default:
3418 ASSERT(false);
3419 }
3420 }
3421 }
3422 catch(std::bad_alloc&)
3423 {
3424 return error(GL_OUT_OF_MEMORY);
3425 }
3426}
3427
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003430 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 +00003431
3432 try
3433 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003435
3436 if (context)
3437 {
3438 if (target != GL_RENDERBUFFER)
3439 {
3440 return error(GL_INVALID_ENUM);
3441 }
3442
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003443 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003444 {
3445 return error(GL_INVALID_OPERATION);
3446 }
3447
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003448 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003449
3450 switch (pname)
3451 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003452 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3453 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3454 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3455 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3456 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3457 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3458 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3459 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3460 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003461 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003462 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003463 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003464 *params = renderbuffer->getSamples();
3465 }
3466 else
3467 {
3468 return error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003469 }
3470 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003471 default:
3472 return error(GL_INVALID_ENUM);
3473 }
3474 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475 }
3476 catch(std::bad_alloc&)
3477 {
3478 return error(GL_OUT_OF_MEMORY);
3479 }
3480}
3481
3482void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3483{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003484 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003485
3486 try
3487 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489
3490 if (context)
3491 {
3492 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003493
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003494 if (!shaderObject)
3495 {
3496 return error(GL_INVALID_VALUE);
3497 }
3498
3499 switch (pname)
3500 {
3501 case GL_SHADER_TYPE:
3502 *params = shaderObject->getType();
3503 return;
3504 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003505 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506 return;
3507 case GL_COMPILE_STATUS:
3508 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3509 return;
3510 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003511 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003512 return;
3513 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003514 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003515 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003516 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3517 *params = shaderObject->getTranslatedSourceLength();
3518 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003519 default:
3520 return error(GL_INVALID_ENUM);
3521 }
3522 }
3523 }
3524 catch(std::bad_alloc&)
3525 {
3526 return error(GL_OUT_OF_MEMORY);
3527 }
3528}
3529
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003530void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003532 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 +00003533 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003534
3535 try
3536 {
3537 if (bufsize < 0)
3538 {
3539 return error(GL_INVALID_VALUE);
3540 }
3541
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003543
3544 if (context)
3545 {
3546 gl::Shader *shaderObject = context->getShader(shader);
3547
3548 if (!shaderObject)
3549 {
3550 return error(GL_INVALID_VALUE);
3551 }
3552
3553 shaderObject->getInfoLog(bufsize, length, infolog);
3554 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003555 }
3556 catch(std::bad_alloc&)
3557 {
3558 return error(GL_OUT_OF_MEMORY);
3559 }
3560}
3561
3562void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3563{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003564 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 +00003565 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003566
3567 try
3568 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003569 switch (shadertype)
3570 {
3571 case GL_VERTEX_SHADER:
3572 case GL_FRAGMENT_SHADER:
3573 break;
3574 default:
3575 return error(GL_INVALID_ENUM);
3576 }
3577
3578 switch (precisiontype)
3579 {
3580 case GL_LOW_FLOAT:
3581 case GL_MEDIUM_FLOAT:
3582 case GL_HIGH_FLOAT:
3583 // Assume IEEE 754 precision
3584 range[0] = 127;
3585 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003586 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003587 break;
3588 case GL_LOW_INT:
3589 case GL_MEDIUM_INT:
3590 case GL_HIGH_INT:
3591 // Some (most) hardware only supports single-precision floating-point numbers,
3592 // which can accurately represent integers up to +/-16777216
3593 range[0] = 24;
3594 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003595 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003596 break;
3597 default:
3598 return error(GL_INVALID_ENUM);
3599 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003600 }
3601 catch(std::bad_alloc&)
3602 {
3603 return error(GL_OUT_OF_MEMORY);
3604 }
3605}
3606
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003607void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003609 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 +00003610 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003611
3612 try
3613 {
3614 if (bufsize < 0)
3615 {
3616 return error(GL_INVALID_VALUE);
3617 }
3618
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003619 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003620
3621 if (context)
3622 {
3623 gl::Shader *shaderObject = context->getShader(shader);
3624
3625 if (!shaderObject)
3626 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00003627 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003628 }
3629
3630 shaderObject->getSource(bufsize, length, source);
3631 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003632 }
3633 catch(std::bad_alloc&)
3634 {
3635 return error(GL_OUT_OF_MEMORY);
3636 }
3637}
3638
zmo@google.coma574f782011-10-03 21:45:23 +00003639void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3640{
3641 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3642 shader, bufsize, length, source);
3643
3644 try
3645 {
3646 if (bufsize < 0)
3647 {
3648 return error(GL_INVALID_VALUE);
3649 }
3650
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003651 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003652
3653 if (context)
3654 {
3655 gl::Shader *shaderObject = context->getShader(shader);
3656
3657 if (!shaderObject)
3658 {
3659 return error(GL_INVALID_OPERATION);
3660 }
3661
3662 shaderObject->getTranslatedSource(bufsize, length, source);
3663 }
3664 }
3665 catch(std::bad_alloc&)
3666 {
3667 return error(GL_OUT_OF_MEMORY);
3668 }
3669}
3670
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003671const GLubyte* __stdcall glGetString(GLenum name)
3672{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003673 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003674
3675 try
3676 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003678
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679 switch (name)
3680 {
3681 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003682 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003684 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003685 case GL_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003686 return (GLubyte*)"OpenGL ES 2.0 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003687 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003688 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003689 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003690 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691 default:
3692 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
3693 }
3694 }
3695 catch(std::bad_alloc&)
3696 {
3697 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3698 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003699}
3700
3701void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003703 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 +00003704
3705 try
3706 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003708
3709 if (context)
3710 {
3711 gl::Texture *texture;
3712
3713 switch (target)
3714 {
3715 case GL_TEXTURE_2D:
3716 texture = context->getTexture2D();
3717 break;
3718 case GL_TEXTURE_CUBE_MAP:
3719 texture = context->getTextureCubeMap();
3720 break;
3721 default:
3722 return error(GL_INVALID_ENUM);
3723 }
3724
3725 switch (pname)
3726 {
3727 case GL_TEXTURE_MAG_FILTER:
3728 *params = (GLfloat)texture->getMagFilter();
3729 break;
3730 case GL_TEXTURE_MIN_FILTER:
3731 *params = (GLfloat)texture->getMinFilter();
3732 break;
3733 case GL_TEXTURE_WRAP_S:
3734 *params = (GLfloat)texture->getWrapS();
3735 break;
3736 case GL_TEXTURE_WRAP_T:
3737 *params = (GLfloat)texture->getWrapT();
3738 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003739 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3740 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3741 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003742 case GL_TEXTURE_USAGE_ANGLE:
3743 *params = (GLfloat)texture->getUsage();
3744 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003745 default:
3746 return error(GL_INVALID_ENUM);
3747 }
3748 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003749 }
3750 catch(std::bad_alloc&)
3751 {
3752 return error(GL_OUT_OF_MEMORY);
3753 }
3754}
3755
3756void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003758 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 +00003759
3760 try
3761 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003762 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003763
3764 if (context)
3765 {
3766 gl::Texture *texture;
3767
3768 switch (target)
3769 {
3770 case GL_TEXTURE_2D:
3771 texture = context->getTexture2D();
3772 break;
3773 case GL_TEXTURE_CUBE_MAP:
3774 texture = context->getTextureCubeMap();
3775 break;
3776 default:
3777 return error(GL_INVALID_ENUM);
3778 }
3779
3780 switch (pname)
3781 {
3782 case GL_TEXTURE_MAG_FILTER:
3783 *params = texture->getMagFilter();
3784 break;
3785 case GL_TEXTURE_MIN_FILTER:
3786 *params = texture->getMinFilter();
3787 break;
3788 case GL_TEXTURE_WRAP_S:
3789 *params = texture->getWrapS();
3790 break;
3791 case GL_TEXTURE_WRAP_T:
3792 *params = texture->getWrapT();
3793 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003794 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3795 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3796 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003797 case GL_TEXTURE_USAGE_ANGLE:
3798 *params = texture->getUsage();
3799 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003800 default:
3801 return error(GL_INVALID_ENUM);
3802 }
3803 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003804 }
3805 catch(std::bad_alloc&)
3806 {
3807 return error(GL_OUT_OF_MEMORY);
3808 }
3809}
3810
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003811void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3812{
3813 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3814 program, location, bufSize, params);
3815
3816 try
3817 {
3818 if (bufSize < 0)
3819 {
3820 return error(GL_INVALID_VALUE);
3821 }
3822
3823 gl::Context *context = gl::getNonLostContext();
3824
3825 if (context)
3826 {
3827 if (program == 0)
3828 {
3829 return error(GL_INVALID_VALUE);
3830 }
3831
3832 gl::Program *programObject = context->getProgram(program);
3833
3834 if (!programObject || !programObject->isLinked())
3835 {
3836 return error(GL_INVALID_OPERATION);
3837 }
3838
3839 if (!programObject->getUniformfv(location, &bufSize, params))
3840 {
3841 return error(GL_INVALID_OPERATION);
3842 }
3843 }
3844 }
3845 catch(std::bad_alloc&)
3846 {
3847 return error(GL_OUT_OF_MEMORY);
3848 }
3849}
3850
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003851void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003853 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003854
3855 try
3856 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003858
3859 if (context)
3860 {
3861 if (program == 0)
3862 {
3863 return error(GL_INVALID_VALUE);
3864 }
3865
3866 gl::Program *programObject = context->getProgram(program);
3867
3868 if (!programObject || !programObject->isLinked())
3869 {
3870 return error(GL_INVALID_OPERATION);
3871 }
3872
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003873 if (!programObject->getUniformfv(location, NULL, params))
3874 {
3875 return error(GL_INVALID_OPERATION);
3876 }
3877 }
3878 }
3879 catch(std::bad_alloc&)
3880 {
3881 return error(GL_OUT_OF_MEMORY);
3882 }
3883}
3884
3885void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3886{
3887 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3888 program, location, bufSize, params);
3889
3890 try
3891 {
3892 if (bufSize < 0)
3893 {
3894 return error(GL_INVALID_VALUE);
3895 }
3896
3897 gl::Context *context = gl::getNonLostContext();
3898
3899 if (context)
3900 {
3901 if (program == 0)
3902 {
3903 return error(GL_INVALID_VALUE);
3904 }
3905
3906 gl::Program *programObject = context->getProgram(program);
3907
3908 if (!programObject || !programObject->isLinked())
3909 {
3910 return error(GL_INVALID_OPERATION);
3911 }
3912
3913 if (!programObject)
3914 {
3915 return error(GL_INVALID_OPERATION);
3916 }
3917
3918 if (!programObject->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003919 {
3920 return error(GL_INVALID_OPERATION);
3921 }
3922 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923 }
3924 catch(std::bad_alloc&)
3925 {
3926 return error(GL_OUT_OF_MEMORY);
3927 }
3928}
3929
3930void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003932 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003933
3934 try
3935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003937
3938 if (context)
3939 {
3940 if (program == 0)
3941 {
3942 return error(GL_INVALID_VALUE);
3943 }
3944
3945 gl::Program *programObject = context->getProgram(program);
3946
3947 if (!programObject || !programObject->isLinked())
3948 {
3949 return error(GL_INVALID_OPERATION);
3950 }
3951
3952 if (!programObject)
3953 {
3954 return error(GL_INVALID_OPERATION);
3955 }
3956
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003957 if (!programObject->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003958 {
3959 return error(GL_INVALID_OPERATION);
3960 }
3961 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003962 }
3963 catch(std::bad_alloc&)
3964 {
3965 return error(GL_OUT_OF_MEMORY);
3966 }
3967}
3968
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003969int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003971 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003972
3973 try
3974 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003975 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003976
3977 if (strstr(name, "gl_") == name)
3978 {
3979 return -1;
3980 }
3981
3982 if (context)
3983 {
3984 gl::Program *programObject = context->getProgram(program);
3985
3986 if (!programObject)
3987 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003988 if (context->getShader(program))
3989 {
3990 return error(GL_INVALID_OPERATION, -1);
3991 }
3992 else
3993 {
3994 return error(GL_INVALID_VALUE, -1);
3995 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996 }
3997
3998 if (!programObject->isLinked())
3999 {
4000 return error(GL_INVALID_OPERATION, -1);
4001 }
4002
daniel@transgaming.com024f1a92011-09-20 16:06:25 +00004003 return programObject->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 }
4005 }
4006 catch(std::bad_alloc&)
4007 {
4008 return error(GL_OUT_OF_MEMORY, -1);
4009 }
4010
4011 return -1;
4012}
4013
4014void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004016 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017
4018 try
4019 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021
daniel@transgaming.come0078962010-04-15 20:45:08 +00004022 if (context)
4023 {
4024 if (index >= gl::MAX_VERTEX_ATTRIBS)
4025 {
4026 return error(GL_INVALID_VALUE);
4027 }
4028
daniel@transgaming.com83921382011-01-08 05:46:00 +00004029 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004030
daniel@transgaming.come0078962010-04-15 20:45:08 +00004031 switch (pname)
4032 {
4033 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004034 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004035 break;
4036 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004037 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004038 break;
4039 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004040 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004041 break;
4042 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004043 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004044 break;
4045 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004046 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004047 break;
4048 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004049 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004050 break;
4051 case GL_CURRENT_VERTEX_ATTRIB:
4052 for (int i = 0; i < 4; ++i)
4053 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004054 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004055 }
4056 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004057 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4058 *params = (GLfloat)attribState.mDivisor;
4059 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004060 default: return error(GL_INVALID_ENUM);
4061 }
4062 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 }
4064 catch(std::bad_alloc&)
4065 {
4066 return error(GL_OUT_OF_MEMORY);
4067 }
4068}
4069
4070void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004072 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073
4074 try
4075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077
daniel@transgaming.come0078962010-04-15 20:45:08 +00004078 if (context)
4079 {
4080 if (index >= gl::MAX_VERTEX_ATTRIBS)
4081 {
4082 return error(GL_INVALID_VALUE);
4083 }
4084
daniel@transgaming.com83921382011-01-08 05:46:00 +00004085 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004086
daniel@transgaming.come0078962010-04-15 20:45:08 +00004087 switch (pname)
4088 {
4089 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004090 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004091 break;
4092 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004093 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004094 break;
4095 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004096 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004097 break;
4098 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004099 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004100 break;
4101 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004102 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004103 break;
4104 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004105 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004106 break;
4107 case GL_CURRENT_VERTEX_ATTRIB:
4108 for (int i = 0; i < 4; ++i)
4109 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004110 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004111 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4112 }
4113 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004114 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4115 *params = (GLint)attribState.mDivisor;
4116 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004117 default: return error(GL_INVALID_ENUM);
4118 }
4119 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004120 }
4121 catch(std::bad_alloc&)
4122 {
4123 return error(GL_OUT_OF_MEMORY);
4124 }
4125}
4126
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004127void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004128{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004129 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004130
4131 try
4132 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004133 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134
daniel@transgaming.come0078962010-04-15 20:45:08 +00004135 if (context)
4136 {
4137 if (index >= gl::MAX_VERTEX_ATTRIBS)
4138 {
4139 return error(GL_INVALID_VALUE);
4140 }
4141
4142 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4143 {
4144 return error(GL_INVALID_ENUM);
4145 }
4146
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004147 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004148 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004149 }
4150 catch(std::bad_alloc&)
4151 {
4152 return error(GL_OUT_OF_MEMORY);
4153 }
4154}
4155
4156void __stdcall glHint(GLenum target, GLenum mode)
4157{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004158 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159
4160 try
4161 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004162 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004163 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004164 case GL_FASTEST:
4165 case GL_NICEST:
4166 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004167 break;
4168 default:
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004169 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004170 }
4171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004172 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004173 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004174 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004175 case GL_GENERATE_MIPMAP_HINT:
4176 if (context) context->setGenerateMipmapHint(mode);
4177 break;
4178 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4179 if (context) context->setFragmentShaderDerivativeHint(mode);
4180 break;
4181 default:
4182 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004184 }
4185 catch(std::bad_alloc&)
4186 {
4187 return error(GL_OUT_OF_MEMORY);
4188 }
4189}
4190
4191GLboolean __stdcall glIsBuffer(GLuint buffer)
4192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004193 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194
4195 try
4196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198
4199 if (context && buffer)
4200 {
4201 gl::Buffer *bufferObject = context->getBuffer(buffer);
4202
4203 if (bufferObject)
4204 {
4205 return GL_TRUE;
4206 }
4207 }
4208 }
4209 catch(std::bad_alloc&)
4210 {
4211 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4212 }
4213
4214 return GL_FALSE;
4215}
4216
4217GLboolean __stdcall glIsEnabled(GLenum cap)
4218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004219 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220
4221 try
4222 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224
4225 if (context)
4226 {
4227 switch (cap)
4228 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004229 case GL_CULL_FACE: return context->isCullFaceEnabled();
4230 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4231 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4232 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4233 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4234 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4235 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4236 case GL_BLEND: return context->isBlendEnabled();
4237 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238 default:
4239 return error(GL_INVALID_ENUM, false);
4240 }
4241 }
4242 }
4243 catch(std::bad_alloc&)
4244 {
4245 return error(GL_OUT_OF_MEMORY, false);
4246 }
4247
4248 return false;
4249}
4250
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004251GLboolean __stdcall glIsFenceNV(GLuint fence)
4252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004253 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004254
4255 try
4256 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004257 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004258
4259 if (context)
4260 {
4261 gl::Fence *fenceObject = context->getFence(fence);
4262
4263 if (fenceObject == NULL)
4264 {
4265 return GL_FALSE;
4266 }
4267
4268 return fenceObject->isFence();
4269 }
4270 }
4271 catch(std::bad_alloc&)
4272 {
4273 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4274 }
4275
4276 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004277}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004279GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004281 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282
4283 try
4284 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004286
4287 if (context && framebuffer)
4288 {
4289 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4290
4291 if (framebufferObject)
4292 {
4293 return GL_TRUE;
4294 }
4295 }
4296 }
4297 catch(std::bad_alloc&)
4298 {
4299 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4300 }
4301
4302 return GL_FALSE;
4303}
4304
4305GLboolean __stdcall glIsProgram(GLuint program)
4306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004307 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308
4309 try
4310 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004312
4313 if (context && program)
4314 {
4315 gl::Program *programObject = context->getProgram(program);
4316
4317 if (programObject)
4318 {
4319 return GL_TRUE;
4320 }
4321 }
4322 }
4323 catch(std::bad_alloc&)
4324 {
4325 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4326 }
4327
4328 return GL_FALSE;
4329}
4330
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004331GLboolean __stdcall glIsQueryEXT(GLuint id)
4332{
4333 EVENT("(GLuint id = %d)", id);
4334
4335 try
4336 {
4337 if (id == 0)
4338 {
4339 return GL_FALSE;
4340 }
4341
4342 gl::Context *context = gl::getNonLostContext();
4343
4344 if (context)
4345 {
4346 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4347
4348 if (queryObject)
4349 {
4350 return GL_TRUE;
4351 }
4352 }
4353 }
4354 catch(std::bad_alloc&)
4355 {
4356 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4357 }
4358
4359 return GL_FALSE;
4360}
4361
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004364 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365
4366 try
4367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369
4370 if (context && renderbuffer)
4371 {
4372 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4373
4374 if (renderbufferObject)
4375 {
4376 return GL_TRUE;
4377 }
4378 }
4379 }
4380 catch(std::bad_alloc&)
4381 {
4382 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4383 }
4384
4385 return GL_FALSE;
4386}
4387
4388GLboolean __stdcall glIsShader(GLuint shader)
4389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004390 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004391
4392 try
4393 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004394 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004395
4396 if (context && shader)
4397 {
4398 gl::Shader *shaderObject = context->getShader(shader);
4399
4400 if (shaderObject)
4401 {
4402 return GL_TRUE;
4403 }
4404 }
4405 }
4406 catch(std::bad_alloc&)
4407 {
4408 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4409 }
4410
4411 return GL_FALSE;
4412}
4413
4414GLboolean __stdcall glIsTexture(GLuint texture)
4415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004416 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417
4418 try
4419 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421
4422 if (context && texture)
4423 {
4424 gl::Texture *textureObject = context->getTexture(texture);
4425
4426 if (textureObject)
4427 {
4428 return GL_TRUE;
4429 }
4430 }
4431 }
4432 catch(std::bad_alloc&)
4433 {
4434 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4435 }
4436
4437 return GL_FALSE;
4438}
4439
4440void __stdcall glLineWidth(GLfloat width)
4441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004442 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004443
4444 try
4445 {
4446 if (width <= 0.0f)
4447 {
4448 return error(GL_INVALID_VALUE);
4449 }
4450
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004452
4453 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004454 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004455 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004456 }
4457 }
4458 catch(std::bad_alloc&)
4459 {
4460 return error(GL_OUT_OF_MEMORY);
4461 }
4462}
4463
4464void __stdcall glLinkProgram(GLuint program)
4465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004466 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004467
4468 try
4469 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004470 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471
4472 if (context)
4473 {
4474 gl::Program *programObject = context->getProgram(program);
4475
4476 if (!programObject)
4477 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004478 if (context->getShader(program))
4479 {
4480 return error(GL_INVALID_OPERATION);
4481 }
4482 else
4483 {
4484 return error(GL_INVALID_VALUE);
4485 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 }
4487
4488 programObject->link();
4489 }
4490 }
4491 catch(std::bad_alloc&)
4492 {
4493 return error(GL_OUT_OF_MEMORY);
4494 }
4495}
4496
4497void __stdcall glPixelStorei(GLenum pname, GLint param)
4498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004499 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500
4501 try
4502 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004503 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004504
4505 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004506 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004507 switch (pname)
4508 {
4509 case GL_UNPACK_ALIGNMENT:
4510 if (param != 1 && param != 2 && param != 4 && param != 8)
4511 {
4512 return error(GL_INVALID_VALUE);
4513 }
4514
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004515 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004516 break;
4517
4518 case GL_PACK_ALIGNMENT:
4519 if (param != 1 && param != 2 && param != 4 && param != 8)
4520 {
4521 return error(GL_INVALID_VALUE);
4522 }
4523
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004524 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004525 break;
4526
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004527 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4528 context->setPackReverseRowOrder(param != 0);
4529 break;
4530
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004531 default:
4532 return error(GL_INVALID_ENUM);
4533 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534 }
4535 }
4536 catch(std::bad_alloc&)
4537 {
4538 return error(GL_OUT_OF_MEMORY);
4539 }
4540}
4541
4542void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004544 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545
4546 try
4547 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004548 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004549
4550 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004552 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 }
4554 }
4555 catch(std::bad_alloc&)
4556 {
4557 return error(GL_OUT_OF_MEMORY);
4558 }
4559}
4560
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004561void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4562 GLenum format, GLenum type, GLsizei bufSize,
4563 GLvoid *data)
4564{
4565 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4566 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4567 x, y, width, height, format, type, bufSize, data);
4568
4569 try
4570 {
4571 if (width < 0 || height < 0 || bufSize < 0)
4572 {
4573 return error(GL_INVALID_VALUE);
4574 }
4575
4576 if (!validReadFormatType(format, type))
4577 {
4578 return error(GL_INVALID_OPERATION);
4579 }
4580
4581 gl::Context *context = gl::getNonLostContext();
4582
4583 if (context)
4584 {
4585 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4586 }
4587 }
4588 catch(std::bad_alloc&)
4589 {
4590 return error(GL_OUT_OF_MEMORY);
4591 }
4592}
4593
4594void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4595 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004597 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004598 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004599 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 try
4602 {
4603 if (width < 0 || height < 0)
4604 {
4605 return error(GL_INVALID_VALUE);
4606 }
4607
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004608 if (!validReadFormatType(format, type))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004610 return error(GL_INVALID_OPERATION);
4611 }
4612
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004613 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614
4615 if (context)
4616 {
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004617 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004618 }
4619 }
4620 catch(std::bad_alloc&)
4621 {
4622 return error(GL_OUT_OF_MEMORY);
4623 }
4624}
4625
4626void __stdcall glReleaseShaderCompiler(void)
4627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004628 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629
4630 try
4631 {
4632 gl::Shader::releaseCompiler();
4633 }
4634 catch(std::bad_alloc&)
4635 {
4636 return error(GL_OUT_OF_MEMORY);
4637 }
4638}
4639
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004640void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004642 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 +00004643 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644
4645 try
4646 {
4647 switch (target)
4648 {
4649 case GL_RENDERBUFFER:
4650 break;
4651 default:
4652 return error(GL_INVALID_ENUM);
4653 }
4654
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004655 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004656 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657 return error(GL_INVALID_ENUM);
4658 }
4659
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004660 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661 {
4662 return error(GL_INVALID_VALUE);
4663 }
4664
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004665 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666
4667 if (context)
4668 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004669 if (width > context->getMaximumRenderbufferDimension() ||
4670 height > context->getMaximumRenderbufferDimension() ||
4671 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004672 {
4673 return error(GL_INVALID_VALUE);
4674 }
4675
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004676 GLuint handle = context->getRenderbufferHandle();
4677 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 {
4679 return error(GL_INVALID_OPERATION);
4680 }
4681
4682 switch (internalformat)
4683 {
4684 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004685 context->setRenderbufferStorage(new gl::Depthbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686 break;
4687 case GL_RGBA4:
4688 case GL_RGB5_A1:
4689 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004690 case GL_RGB8_OES:
4691 case GL_RGBA8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004692 context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693 break;
4694 case GL_STENCIL_INDEX8:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004695 context->setRenderbufferStorage(new gl::Stencilbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696 break;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004697 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004698 context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height, samples));
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004699 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700 default:
4701 return error(GL_INVALID_ENUM);
4702 }
4703 }
4704 }
4705 catch(std::bad_alloc&)
4706 {
4707 return error(GL_OUT_OF_MEMORY);
4708 }
4709}
4710
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004711void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4712{
4713 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4714}
4715
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004718 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719
4720 try
4721 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004722 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004723
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724 if (context)
4725 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004726 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727 }
4728 }
4729 catch(std::bad_alloc&)
4730 {
4731 return error(GL_OUT_OF_MEMORY);
4732 }
4733}
4734
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004735void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4736{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004737 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004738
4739 try
4740 {
4741 if (condition != GL_ALL_COMPLETED_NV)
4742 {
4743 return error(GL_INVALID_ENUM);
4744 }
4745
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004746 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004747
4748 if (context)
4749 {
4750 gl::Fence *fenceObject = context->getFence(fence);
4751
4752 if (fenceObject == NULL)
4753 {
4754 return error(GL_INVALID_OPERATION);
4755 }
4756
4757 fenceObject->setFence(condition);
4758 }
4759 }
4760 catch(std::bad_alloc&)
4761 {
4762 return error(GL_OUT_OF_MEMORY);
4763 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004764}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004765
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004768 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 +00004769
4770 try
4771 {
4772 if (width < 0 || height < 0)
4773 {
4774 return error(GL_INVALID_VALUE);
4775 }
4776
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004777 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004778
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779 if (context)
4780 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004781 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783 }
4784 catch(std::bad_alloc&)
4785 {
4786 return error(GL_OUT_OF_MEMORY);
4787 }
4788}
4789
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004790void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004791{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004792 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004793 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004794 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004795
4796 try
4797 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004798 // No binary shader formats are supported.
4799 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004800 }
4801 catch(std::bad_alloc&)
4802 {
4803 return error(GL_OUT_OF_MEMORY);
4804 }
4805}
4806
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004807void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004809 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 +00004810 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811
4812 try
4813 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004814 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815 {
4816 return error(GL_INVALID_VALUE);
4817 }
4818
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820
4821 if (context)
4822 {
4823 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004824
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825 if (!shaderObject)
4826 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004827 if (context->getProgram(shader))
4828 {
4829 return error(GL_INVALID_OPERATION);
4830 }
4831 else
4832 {
4833 return error(GL_INVALID_VALUE);
4834 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836
4837 shaderObject->setSource(count, string, length);
4838 }
4839 }
4840 catch(std::bad_alloc&)
4841 {
4842 return error(GL_OUT_OF_MEMORY);
4843 }
4844}
4845
4846void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4847{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004848 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849}
4850
4851void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004853 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 +00004854
4855 try
4856 {
4857 switch (face)
4858 {
4859 case GL_FRONT:
4860 case GL_BACK:
4861 case GL_FRONT_AND_BACK:
4862 break;
4863 default:
4864 return error(GL_INVALID_ENUM);
4865 }
4866
4867 switch (func)
4868 {
4869 case GL_NEVER:
4870 case GL_ALWAYS:
4871 case GL_LESS:
4872 case GL_LEQUAL:
4873 case GL_EQUAL:
4874 case GL_GEQUAL:
4875 case GL_GREATER:
4876 case GL_NOTEQUAL:
4877 break;
4878 default:
4879 return error(GL_INVALID_ENUM);
4880 }
4881
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004882 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883
4884 if (context)
4885 {
4886 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4887 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004888 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004889 }
4890
4891 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4892 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004893 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894 }
4895 }
4896 }
4897 catch(std::bad_alloc&)
4898 {
4899 return error(GL_OUT_OF_MEMORY);
4900 }
4901}
4902
4903void __stdcall glStencilMask(GLuint mask)
4904{
4905 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4906}
4907
4908void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004910 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004911
4912 try
4913 {
4914 switch (face)
4915 {
4916 case GL_FRONT:
4917 case GL_BACK:
4918 case GL_FRONT_AND_BACK:
4919 break;
4920 default:
4921 return error(GL_INVALID_ENUM);
4922 }
4923
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004924 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004925
4926 if (context)
4927 {
4928 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4929 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004930 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931 }
4932
4933 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4934 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004935 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936 }
4937 }
4938 }
4939 catch(std::bad_alloc&)
4940 {
4941 return error(GL_OUT_OF_MEMORY);
4942 }
4943}
4944
4945void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4946{
4947 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4948}
4949
4950void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004952 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 +00004953 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954
4955 try
4956 {
4957 switch (face)
4958 {
4959 case GL_FRONT:
4960 case GL_BACK:
4961 case GL_FRONT_AND_BACK:
4962 break;
4963 default:
4964 return error(GL_INVALID_ENUM);
4965 }
4966
4967 switch (fail)
4968 {
4969 case GL_ZERO:
4970 case GL_KEEP:
4971 case GL_REPLACE:
4972 case GL_INCR:
4973 case GL_DECR:
4974 case GL_INVERT:
4975 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004976 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004977 break;
4978 default:
4979 return error(GL_INVALID_ENUM);
4980 }
4981
4982 switch (zfail)
4983 {
4984 case GL_ZERO:
4985 case GL_KEEP:
4986 case GL_REPLACE:
4987 case GL_INCR:
4988 case GL_DECR:
4989 case GL_INVERT:
4990 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004991 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004992 break;
4993 default:
4994 return error(GL_INVALID_ENUM);
4995 }
4996
4997 switch (zpass)
4998 {
4999 case GL_ZERO:
5000 case GL_KEEP:
5001 case GL_REPLACE:
5002 case GL_INCR:
5003 case GL_DECR:
5004 case GL_INVERT:
5005 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005006 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007 break;
5008 default:
5009 return error(GL_INVALID_ENUM);
5010 }
5011
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005012 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005013
5014 if (context)
5015 {
5016 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5017 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005018 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005019 }
5020
5021 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5022 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005023 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005024 }
5025 }
5026 }
5027 catch(std::bad_alloc&)
5028 {
5029 return error(GL_OUT_OF_MEMORY);
5030 }
5031}
5032
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005033GLboolean __stdcall glTestFenceNV(GLuint fence)
5034{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005035 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005036
5037 try
5038 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005039 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005040
5041 if (context)
5042 {
5043 gl::Fence *fenceObject = context->getFence(fence);
5044
5045 if (fenceObject == NULL)
5046 {
5047 return error(GL_INVALID_OPERATION, GL_TRUE);
5048 }
5049
5050 return fenceObject->testFence();
5051 }
5052 }
5053 catch(std::bad_alloc&)
5054 {
5055 error(GL_OUT_OF_MEMORY);
5056 }
5057
5058 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005059}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005060
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005061void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5062 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005064 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 +00005065 "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 +00005066 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005067
5068 try
5069 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005070 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071 {
5072 return error(GL_INVALID_VALUE);
5073 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005074
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005075 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005076 {
5077 return error(GL_INVALID_OPERATION);
5078 }
5079
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005080 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005081 {
5082 case GL_ALPHA:
5083 case GL_LUMINANCE:
5084 case GL_LUMINANCE_ALPHA:
5085 switch (type)
5086 {
5087 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005088 case GL_FLOAT:
5089 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005090 break;
5091 default:
5092 return error(GL_INVALID_ENUM);
5093 }
5094 break;
5095 case GL_RGB:
5096 switch (type)
5097 {
5098 case GL_UNSIGNED_BYTE:
5099 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005100 case GL_FLOAT:
5101 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005102 break;
5103 default:
5104 return error(GL_INVALID_ENUM);
5105 }
5106 break;
5107 case GL_RGBA:
5108 switch (type)
5109 {
5110 case GL_UNSIGNED_BYTE:
5111 case GL_UNSIGNED_SHORT_4_4_4_4:
5112 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005113 case GL_FLOAT:
5114 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005115 break;
5116 default:
5117 return error(GL_INVALID_ENUM);
5118 }
5119 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005120 case GL_BGRA_EXT:
5121 switch (type)
5122 {
5123 case GL_UNSIGNED_BYTE:
5124 break;
5125 default:
5126 return error(GL_INVALID_ENUM);
5127 }
5128 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005129 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5130 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005131 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5132 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005133 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005134 default:
5135 return error(GL_INVALID_VALUE);
5136 }
5137
5138 if (border != 0)
5139 {
5140 return error(GL_INVALID_VALUE);
5141 }
5142
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005144
5145 if (context)
5146 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005147 if (level > context->getMaximumTextureLevel())
5148 {
5149 return error(GL_INVALID_VALUE);
5150 }
5151
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005152 switch (target)
5153 {
5154 case GL_TEXTURE_2D:
5155 if (width > (context->getMaximumTextureDimension() >> level) ||
5156 height > (context->getMaximumTextureDimension() >> level))
5157 {
5158 return error(GL_INVALID_VALUE);
5159 }
5160 break;
5161 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5162 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5163 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5164 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5165 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5166 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5167 if (width != height)
5168 {
5169 return error(GL_INVALID_VALUE);
5170 }
5171
5172 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5173 height > (context->getMaximumCubeTextureDimension() >> level))
5174 {
5175 return error(GL_INVALID_VALUE);
5176 }
5177 break;
5178 default:
5179 return error(GL_INVALID_ENUM);
5180 }
5181
gman@chromium.org50c526d2011-08-10 05:19:44 +00005182 switch (format) {
5183 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5184 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5185 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005186 {
5187 return error(GL_INVALID_OPERATION);
5188 }
5189 else
5190 {
5191 return error(GL_INVALID_ENUM);
5192 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005193 break;
5194 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5195 if (context->supportsDXT3Textures())
5196 {
5197 return error(GL_INVALID_OPERATION);
5198 }
5199 else
5200 {
5201 return error(GL_INVALID_ENUM);
5202 }
5203 break;
5204 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5205 if (context->supportsDXT5Textures())
5206 {
5207 return error(GL_INVALID_OPERATION);
5208 }
5209 else
5210 {
5211 return error(GL_INVALID_ENUM);
5212 }
5213 break;
5214 default:
5215 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005216 }
5217
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005218 if (type == GL_FLOAT)
5219 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005220 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005221 {
5222 return error(GL_INVALID_ENUM);
5223 }
5224 }
5225 else if (type == GL_HALF_FLOAT_OES)
5226 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005227 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005228 {
5229 return error(GL_INVALID_ENUM);
5230 }
5231 }
5232
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233 if (target == GL_TEXTURE_2D)
5234 {
5235 gl::Texture2D *texture = context->getTexture2D();
5236
5237 if (!texture)
5238 {
5239 return error(GL_INVALID_OPERATION);
5240 }
5241
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005242 if (texture->isImmutable())
5243 {
5244 return error(GL_INVALID_OPERATION);
5245 }
5246
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005247 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 }
5249 else
5250 {
5251 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5252
5253 if (!texture)
5254 {
5255 return error(GL_INVALID_OPERATION);
5256 }
5257
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005258 if (texture->isImmutable())
5259 {
5260 return error(GL_INVALID_OPERATION);
5261 }
5262
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263 switch (target)
5264 {
5265 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005266 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267 break;
5268 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005269 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270 break;
5271 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005272 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273 break;
5274 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005275 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276 break;
5277 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005278 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005279 break;
5280 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005281 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282 break;
5283 default: UNREACHABLE();
5284 }
5285 }
5286 }
5287 }
5288 catch(std::bad_alloc&)
5289 {
5290 return error(GL_OUT_OF_MEMORY);
5291 }
5292}
5293
5294void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5295{
5296 glTexParameteri(target, pname, (GLint)param);
5297}
5298
5299void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5300{
5301 glTexParameteri(target, pname, (GLint)*params);
5302}
5303
5304void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005306 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 try
5309 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005311
5312 if (context)
5313 {
5314 gl::Texture *texture;
5315
5316 switch (target)
5317 {
5318 case GL_TEXTURE_2D:
5319 texture = context->getTexture2D();
5320 break;
5321 case GL_TEXTURE_CUBE_MAP:
5322 texture = context->getTextureCubeMap();
5323 break;
5324 default:
5325 return error(GL_INVALID_ENUM);
5326 }
5327
5328 switch (pname)
5329 {
5330 case GL_TEXTURE_WRAP_S:
5331 if (!texture->setWrapS((GLenum)param))
5332 {
5333 return error(GL_INVALID_ENUM);
5334 }
5335 break;
5336 case GL_TEXTURE_WRAP_T:
5337 if (!texture->setWrapT((GLenum)param))
5338 {
5339 return error(GL_INVALID_ENUM);
5340 }
5341 break;
5342 case GL_TEXTURE_MIN_FILTER:
5343 if (!texture->setMinFilter((GLenum)param))
5344 {
5345 return error(GL_INVALID_ENUM);
5346 }
5347 break;
5348 case GL_TEXTURE_MAG_FILTER:
5349 if (!texture->setMagFilter((GLenum)param))
5350 {
5351 return error(GL_INVALID_ENUM);
5352 }
5353 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005354 case GL_TEXTURE_USAGE_ANGLE:
5355 if (!texture->setUsage((GLenum)param))
5356 {
5357 return error(GL_INVALID_ENUM);
5358 }
5359 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 default:
5361 return error(GL_INVALID_ENUM);
5362 }
5363 }
5364 }
5365 catch(std::bad_alloc&)
5366 {
5367 return error(GL_OUT_OF_MEMORY);
5368 }
5369}
5370
5371void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5372{
5373 glTexParameteri(target, pname, *params);
5374}
5375
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005376void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5377{
5378 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5379 target, levels, internalformat, width, height);
5380
5381 try
5382 {
5383 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5384 {
5385 return error(GL_INVALID_ENUM);
5386 }
5387
5388 if (width < 1 || height < 1 || levels < 1)
5389 {
5390 return error(GL_INVALID_VALUE);
5391 }
5392
5393 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5394 {
5395 return error(GL_INVALID_VALUE);
5396 }
5397
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005398 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005399 {
5400 return error(GL_INVALID_OPERATION);
5401 }
5402
5403 GLenum format = gl::ExtractFormat(internalformat);
5404 GLenum type = gl::ExtractType(internalformat);
5405
5406 if (format == GL_NONE || type == GL_NONE)
5407 {
5408 return error(GL_INVALID_ENUM);
5409 }
5410
5411 gl::Context *context = gl::getNonLostContext();
5412
5413 if (context)
5414 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005415 switch (target)
5416 {
5417 case GL_TEXTURE_2D:
5418 if (width > context->getMaximumTextureDimension() ||
5419 height > context->getMaximumTextureDimension())
5420 {
5421 return error(GL_INVALID_VALUE);
5422 }
5423 break;
5424 case GL_TEXTURE_CUBE_MAP:
5425 if (width > context->getMaximumCubeTextureDimension() ||
5426 height > context->getMaximumCubeTextureDimension())
5427 {
5428 return error(GL_INVALID_VALUE);
5429 }
5430 break;
5431 default:
5432 return error(GL_INVALID_ENUM);
5433 }
5434
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005435 if (levels != 1 && !context->supportsNonPower2Texture())
5436 {
5437 if (!gl::isPow2(width) || !gl::isPow2(height))
5438 {
5439 return error(GL_INVALID_OPERATION);
5440 }
5441 }
5442
daniel@transgaming.come1077362011-11-11 04:16:50 +00005443 switch (internalformat)
5444 {
5445 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5446 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5447 if (!context->supportsDXT1Textures())
5448 {
5449 return error(GL_INVALID_ENUM);
5450 }
5451 break;
5452 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5453 if (!context->supportsDXT3Textures())
5454 {
5455 return error(GL_INVALID_ENUM);
5456 }
5457 break;
5458 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5459 if (!context->supportsDXT5Textures())
5460 {
5461 return error(GL_INVALID_ENUM);
5462 }
5463 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005464 case GL_RGBA32F_EXT:
5465 case GL_RGB32F_EXT:
5466 case GL_ALPHA32F_EXT:
5467 case GL_LUMINANCE32F_EXT:
5468 case GL_LUMINANCE_ALPHA32F_EXT:
5469 if (!context->supportsFloat32Textures())
5470 {
5471 return error(GL_INVALID_ENUM);
5472 }
5473 break;
5474 case GL_RGBA16F_EXT:
5475 case GL_RGB16F_EXT:
5476 case GL_ALPHA16F_EXT:
5477 case GL_LUMINANCE16F_EXT:
5478 case GL_LUMINANCE_ALPHA16F_EXT:
5479 if (!context->supportsFloat16Textures())
5480 {
5481 return error(GL_INVALID_ENUM);
5482 }
5483 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005484 }
5485
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005486 if (target == GL_TEXTURE_2D)
5487 {
5488 gl::Texture2D *texture = context->getTexture2D();
5489
5490 if (!texture || texture->id() == 0)
5491 {
5492 return error(GL_INVALID_OPERATION);
5493 }
5494
5495 if (texture->isImmutable())
5496 {
5497 return error(GL_INVALID_OPERATION);
5498 }
5499
5500 texture->storage(levels, internalformat, width, height);
5501 }
5502 else if (target == GL_TEXTURE_CUBE_MAP)
5503 {
5504 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5505
5506 if (!texture || texture->id() == 0)
5507 {
5508 return error(GL_INVALID_OPERATION);
5509 }
5510
5511 if (texture->isImmutable())
5512 {
5513 return error(GL_INVALID_OPERATION);
5514 }
5515
5516 texture->storage(levels, internalformat, width);
5517 }
5518 else UNREACHABLE();
5519 }
5520 }
5521 catch(std::bad_alloc&)
5522 {
5523 return error(GL_OUT_OF_MEMORY);
5524 }
5525}
5526
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005527void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5528 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005530 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005531 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005532 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533 target, level, xoffset, yoffset, width, height, format, type, pixels);
5534
5535 try
5536 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005537 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005538 {
5539 return error(GL_INVALID_ENUM);
5540 }
5541
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005542 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543 {
5544 return error(GL_INVALID_VALUE);
5545 }
5546
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005547 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5548 {
5549 return error(GL_INVALID_VALUE);
5550 }
5551
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005552 if (!gl::CheckTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005553 {
5554 return error(GL_INVALID_ENUM);
5555 }
5556
5557 if (width == 0 || height == 0 || pixels == NULL)
5558 {
5559 return;
5560 }
5561
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005563
5564 if (context)
5565 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005566 if (level > context->getMaximumTextureLevel())
5567 {
5568 return error(GL_INVALID_VALUE);
5569 }
5570
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005571 if (format == GL_FLOAT)
5572 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005573 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005574 {
5575 return error(GL_INVALID_ENUM);
5576 }
5577 }
5578 else if (format == GL_HALF_FLOAT_OES)
5579 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005580 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005581 {
5582 return error(GL_INVALID_ENUM);
5583 }
5584 }
5585
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005586 if (target == GL_TEXTURE_2D)
5587 {
5588 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00005589 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005590 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005591 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005592 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005593 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005594 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005595 {
5596 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00005597 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005598 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005599 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005600 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005601 }
5602 else
5603 {
5604 UNREACHABLE();
5605 }
5606 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 }
5608 catch(std::bad_alloc&)
5609 {
5610 return error(GL_OUT_OF_MEMORY);
5611 }
5612}
5613
5614void __stdcall glUniform1f(GLint location, GLfloat x)
5615{
5616 glUniform1fv(location, 1, &x);
5617}
5618
5619void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5620{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005621 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005622
5623 try
5624 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005625 if (count < 0)
5626 {
5627 return error(GL_INVALID_VALUE);
5628 }
5629
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005630 if (location == -1)
5631 {
5632 return;
5633 }
5634
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005635 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636
5637 if (context)
5638 {
5639 gl::Program *program = context->getCurrentProgram();
5640
5641 if (!program)
5642 {
5643 return error(GL_INVALID_OPERATION);
5644 }
5645
5646 if (!program->setUniform1fv(location, count, v))
5647 {
5648 return error(GL_INVALID_OPERATION);
5649 }
5650 }
5651 }
5652 catch(std::bad_alloc&)
5653 {
5654 return error(GL_OUT_OF_MEMORY);
5655 }
5656}
5657
5658void __stdcall glUniform1i(GLint location, GLint x)
5659{
5660 glUniform1iv(location, 1, &x);
5661}
5662
5663void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5664{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005665 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005666
5667 try
5668 {
5669 if (count < 0)
5670 {
5671 return error(GL_INVALID_VALUE);
5672 }
5673
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005674 if (location == -1)
5675 {
5676 return;
5677 }
5678
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005680
5681 if (context)
5682 {
5683 gl::Program *program = context->getCurrentProgram();
5684
5685 if (!program)
5686 {
5687 return error(GL_INVALID_OPERATION);
5688 }
5689
5690 if (!program->setUniform1iv(location, count, v))
5691 {
5692 return error(GL_INVALID_OPERATION);
5693 }
5694 }
5695 }
5696 catch(std::bad_alloc&)
5697 {
5698 return error(GL_OUT_OF_MEMORY);
5699 }
5700}
5701
5702void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5703{
5704 GLfloat xy[2] = {x, y};
5705
5706 glUniform2fv(location, 1, (GLfloat*)&xy);
5707}
5708
5709void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005711 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712
5713 try
5714 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005715 if (count < 0)
5716 {
5717 return error(GL_INVALID_VALUE);
5718 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005719
5720 if (location == -1)
5721 {
5722 return;
5723 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005724
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005725 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726
5727 if (context)
5728 {
5729 gl::Program *program = context->getCurrentProgram();
5730
5731 if (!program)
5732 {
5733 return error(GL_INVALID_OPERATION);
5734 }
5735
5736 if (!program->setUniform2fv(location, count, v))
5737 {
5738 return error(GL_INVALID_OPERATION);
5739 }
5740 }
5741 }
5742 catch(std::bad_alloc&)
5743 {
5744 return error(GL_OUT_OF_MEMORY);
5745 }
5746}
5747
5748void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5749{
5750 GLint xy[4] = {x, y};
5751
5752 glUniform2iv(location, 1, (GLint*)&xy);
5753}
5754
5755void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005757 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005758
5759 try
5760 {
5761 if (count < 0)
5762 {
5763 return error(GL_INVALID_VALUE);
5764 }
5765
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005766 if (location == -1)
5767 {
5768 return;
5769 }
5770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005772
5773 if (context)
5774 {
5775 gl::Program *program = context->getCurrentProgram();
5776
5777 if (!program)
5778 {
5779 return error(GL_INVALID_OPERATION);
5780 }
5781
5782 if (!program->setUniform2iv(location, count, v))
5783 {
5784 return error(GL_INVALID_OPERATION);
5785 }
5786 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 }
5788 catch(std::bad_alloc&)
5789 {
5790 return error(GL_OUT_OF_MEMORY);
5791 }
5792}
5793
5794void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5795{
5796 GLfloat xyz[3] = {x, y, z};
5797
5798 glUniform3fv(location, 1, (GLfloat*)&xyz);
5799}
5800
5801void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005803 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005804
5805 try
5806 {
5807 if (count < 0)
5808 {
5809 return error(GL_INVALID_VALUE);
5810 }
5811
5812 if (location == -1)
5813 {
5814 return;
5815 }
5816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818
5819 if (context)
5820 {
5821 gl::Program *program = context->getCurrentProgram();
5822
5823 if (!program)
5824 {
5825 return error(GL_INVALID_OPERATION);
5826 }
5827
5828 if (!program->setUniform3fv(location, count, v))
5829 {
5830 return error(GL_INVALID_OPERATION);
5831 }
5832 }
5833 }
5834 catch(std::bad_alloc&)
5835 {
5836 return error(GL_OUT_OF_MEMORY);
5837 }
5838}
5839
5840void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5841{
5842 GLint xyz[3] = {x, y, z};
5843
5844 glUniform3iv(location, 1, (GLint*)&xyz);
5845}
5846
5847void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005849 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005850
5851 try
5852 {
5853 if (count < 0)
5854 {
5855 return error(GL_INVALID_VALUE);
5856 }
5857
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005858 if (location == -1)
5859 {
5860 return;
5861 }
5862
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005864
5865 if (context)
5866 {
5867 gl::Program *program = context->getCurrentProgram();
5868
5869 if (!program)
5870 {
5871 return error(GL_INVALID_OPERATION);
5872 }
5873
5874 if (!program->setUniform3iv(location, count, v))
5875 {
5876 return error(GL_INVALID_OPERATION);
5877 }
5878 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005879 }
5880 catch(std::bad_alloc&)
5881 {
5882 return error(GL_OUT_OF_MEMORY);
5883 }
5884}
5885
5886void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5887{
5888 GLfloat xyzw[4] = {x, y, z, w};
5889
5890 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5891}
5892
5893void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5894{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005895 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005896
5897 try
5898 {
5899 if (count < 0)
5900 {
5901 return error(GL_INVALID_VALUE);
5902 }
5903
5904 if (location == -1)
5905 {
5906 return;
5907 }
5908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910
5911 if (context)
5912 {
5913 gl::Program *program = context->getCurrentProgram();
5914
5915 if (!program)
5916 {
5917 return error(GL_INVALID_OPERATION);
5918 }
5919
5920 if (!program->setUniform4fv(location, count, v))
5921 {
5922 return error(GL_INVALID_OPERATION);
5923 }
5924 }
5925 }
5926 catch(std::bad_alloc&)
5927 {
5928 return error(GL_OUT_OF_MEMORY);
5929 }
5930}
5931
5932void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5933{
5934 GLint xyzw[4] = {x, y, z, w};
5935
5936 glUniform4iv(location, 1, (GLint*)&xyzw);
5937}
5938
5939void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005941 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005942
5943 try
5944 {
5945 if (count < 0)
5946 {
5947 return error(GL_INVALID_VALUE);
5948 }
5949
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005950 if (location == -1)
5951 {
5952 return;
5953 }
5954
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005955 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005956
5957 if (context)
5958 {
5959 gl::Program *program = context->getCurrentProgram();
5960
5961 if (!program)
5962 {
5963 return error(GL_INVALID_OPERATION);
5964 }
5965
5966 if (!program->setUniform4iv(location, count, v))
5967 {
5968 return error(GL_INVALID_OPERATION);
5969 }
5970 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971 }
5972 catch(std::bad_alloc&)
5973 {
5974 return error(GL_OUT_OF_MEMORY);
5975 }
5976}
5977
5978void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005980 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005981 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005982
5983 try
5984 {
5985 if (count < 0 || transpose != GL_FALSE)
5986 {
5987 return error(GL_INVALID_VALUE);
5988 }
5989
5990 if (location == -1)
5991 {
5992 return;
5993 }
5994
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005996
5997 if (context)
5998 {
5999 gl::Program *program = context->getCurrentProgram();
6000
6001 if (!program)
6002 {
6003 return error(GL_INVALID_OPERATION);
6004 }
6005
6006 if (!program->setUniformMatrix2fv(location, count, value))
6007 {
6008 return error(GL_INVALID_OPERATION);
6009 }
6010 }
6011 }
6012 catch(std::bad_alloc&)
6013 {
6014 return error(GL_OUT_OF_MEMORY);
6015 }
6016}
6017
6018void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006020 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006021 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022
6023 try
6024 {
6025 if (count < 0 || transpose != GL_FALSE)
6026 {
6027 return error(GL_INVALID_VALUE);
6028 }
6029
6030 if (location == -1)
6031 {
6032 return;
6033 }
6034
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006035 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036
6037 if (context)
6038 {
6039 gl::Program *program = context->getCurrentProgram();
6040
6041 if (!program)
6042 {
6043 return error(GL_INVALID_OPERATION);
6044 }
6045
6046 if (!program->setUniformMatrix3fv(location, count, value))
6047 {
6048 return error(GL_INVALID_OPERATION);
6049 }
6050 }
6051 }
6052 catch(std::bad_alloc&)
6053 {
6054 return error(GL_OUT_OF_MEMORY);
6055 }
6056}
6057
6058void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6059{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006060 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006061 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006062
6063 try
6064 {
6065 if (count < 0 || transpose != GL_FALSE)
6066 {
6067 return error(GL_INVALID_VALUE);
6068 }
6069
6070 if (location == -1)
6071 {
6072 return;
6073 }
6074
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006075 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006076
6077 if (context)
6078 {
6079 gl::Program *program = context->getCurrentProgram();
6080
6081 if (!program)
6082 {
6083 return error(GL_INVALID_OPERATION);
6084 }
6085
6086 if (!program->setUniformMatrix4fv(location, count, value))
6087 {
6088 return error(GL_INVALID_OPERATION);
6089 }
6090 }
6091 }
6092 catch(std::bad_alloc&)
6093 {
6094 return error(GL_OUT_OF_MEMORY);
6095 }
6096}
6097
6098void __stdcall glUseProgram(GLuint program)
6099{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006100 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006101
6102 try
6103 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006104 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105
6106 if (context)
6107 {
6108 gl::Program *programObject = context->getProgram(program);
6109
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006110 if (!programObject && program != 0)
6111 {
6112 if (context->getShader(program))
6113 {
6114 return error(GL_INVALID_OPERATION);
6115 }
6116 else
6117 {
6118 return error(GL_INVALID_VALUE);
6119 }
6120 }
6121
6122 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006123 {
6124 return error(GL_INVALID_OPERATION);
6125 }
6126
6127 context->useProgram(program);
6128 }
6129 }
6130 catch(std::bad_alloc&)
6131 {
6132 return error(GL_OUT_OF_MEMORY);
6133 }
6134}
6135
6136void __stdcall glValidateProgram(GLuint program)
6137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006138 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006139
6140 try
6141 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006143
6144 if (context)
6145 {
6146 gl::Program *programObject = context->getProgram(program);
6147
6148 if (!programObject)
6149 {
6150 if (context->getShader(program))
6151 {
6152 return error(GL_INVALID_OPERATION);
6153 }
6154 else
6155 {
6156 return error(GL_INVALID_VALUE);
6157 }
6158 }
6159
6160 programObject->validate();
6161 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006162 }
6163 catch(std::bad_alloc&)
6164 {
6165 return error(GL_OUT_OF_MEMORY);
6166 }
6167}
6168
6169void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6170{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006171 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006172
6173 try
6174 {
6175 if (index >= gl::MAX_VERTEX_ATTRIBS)
6176 {
6177 return error(GL_INVALID_VALUE);
6178 }
6179
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006181
6182 if (context)
6183 {
6184 GLfloat vals[4] = { x, 0, 0, 1 };
6185 context->setVertexAttrib(index, vals);
6186 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006187 }
6188 catch(std::bad_alloc&)
6189 {
6190 return error(GL_OUT_OF_MEMORY);
6191 }
6192}
6193
6194void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6195{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006196 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006197
6198 try
6199 {
6200 if (index >= gl::MAX_VERTEX_ATTRIBS)
6201 {
6202 return error(GL_INVALID_VALUE);
6203 }
6204
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006205 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006206
6207 if (context)
6208 {
6209 GLfloat vals[4] = { values[0], 0, 0, 1 };
6210 context->setVertexAttrib(index, vals);
6211 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006212 }
6213 catch(std::bad_alloc&)
6214 {
6215 return error(GL_OUT_OF_MEMORY);
6216 }
6217}
6218
6219void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006221 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222
6223 try
6224 {
6225 if (index >= gl::MAX_VERTEX_ATTRIBS)
6226 {
6227 return error(GL_INVALID_VALUE);
6228 }
6229
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006231
6232 if (context)
6233 {
6234 GLfloat vals[4] = { x, y, 0, 1 };
6235 context->setVertexAttrib(index, vals);
6236 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006237 }
6238 catch(std::bad_alloc&)
6239 {
6240 return error(GL_OUT_OF_MEMORY);
6241 }
6242}
6243
6244void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6245{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006246 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006247
6248 try
6249 {
6250 if (index >= gl::MAX_VERTEX_ATTRIBS)
6251 {
6252 return error(GL_INVALID_VALUE);
6253 }
6254
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006256
6257 if (context)
6258 {
6259 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6260 context->setVertexAttrib(index, vals);
6261 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006262 }
6263 catch(std::bad_alloc&)
6264 {
6265 return error(GL_OUT_OF_MEMORY);
6266 }
6267}
6268
6269void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006271 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 +00006272
6273 try
6274 {
6275 if (index >= gl::MAX_VERTEX_ATTRIBS)
6276 {
6277 return error(GL_INVALID_VALUE);
6278 }
6279
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006281
6282 if (context)
6283 {
6284 GLfloat vals[4] = { x, y, z, 1 };
6285 context->setVertexAttrib(index, vals);
6286 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006287 }
6288 catch(std::bad_alloc&)
6289 {
6290 return error(GL_OUT_OF_MEMORY);
6291 }
6292}
6293
6294void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6295{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006296 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006297
6298 try
6299 {
6300 if (index >= gl::MAX_VERTEX_ATTRIBS)
6301 {
6302 return error(GL_INVALID_VALUE);
6303 }
6304
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006306
6307 if (context)
6308 {
6309 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6310 context->setVertexAttrib(index, vals);
6311 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006312 }
6313 catch(std::bad_alloc&)
6314 {
6315 return error(GL_OUT_OF_MEMORY);
6316 }
6317}
6318
6319void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6320{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006321 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 +00006322
6323 try
6324 {
6325 if (index >= gl::MAX_VERTEX_ATTRIBS)
6326 {
6327 return error(GL_INVALID_VALUE);
6328 }
6329
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006330 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006331
6332 if (context)
6333 {
6334 GLfloat vals[4] = { x, y, z, w };
6335 context->setVertexAttrib(index, vals);
6336 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006337 }
6338 catch(std::bad_alloc&)
6339 {
6340 return error(GL_OUT_OF_MEMORY);
6341 }
6342}
6343
6344void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6345{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006346 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006347
6348 try
6349 {
6350 if (index >= gl::MAX_VERTEX_ATTRIBS)
6351 {
6352 return error(GL_INVALID_VALUE);
6353 }
6354
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006355 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006356
6357 if (context)
6358 {
6359 context->setVertexAttrib(index, values);
6360 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006361 }
6362 catch(std::bad_alloc&)
6363 {
6364 return error(GL_OUT_OF_MEMORY);
6365 }
6366}
6367
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006368void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6369{
6370 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6371
6372 try
6373 {
6374 if (index >= gl::MAX_VERTEX_ATTRIBS)
6375 {
6376 return error(GL_INVALID_VALUE);
6377 }
6378
6379 gl::Context *context = gl::getNonLostContext();
6380
6381 if (context)
6382 {
6383 context->setVertexAttribDivisor(index, divisor);
6384 }
6385 }
6386 catch(std::bad_alloc&)
6387 {
6388 return error(GL_OUT_OF_MEMORY);
6389 }
6390}
6391
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006392void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006393{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006394 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006395 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006396 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006397
6398 try
6399 {
6400 if (index >= gl::MAX_VERTEX_ATTRIBS)
6401 {
6402 return error(GL_INVALID_VALUE);
6403 }
6404
6405 if (size < 1 || size > 4)
6406 {
6407 return error(GL_INVALID_VALUE);
6408 }
6409
6410 switch (type)
6411 {
6412 case GL_BYTE:
6413 case GL_UNSIGNED_BYTE:
6414 case GL_SHORT:
6415 case GL_UNSIGNED_SHORT:
6416 case GL_FIXED:
6417 case GL_FLOAT:
6418 break;
6419 default:
6420 return error(GL_INVALID_ENUM);
6421 }
6422
6423 if (stride < 0)
6424 {
6425 return error(GL_INVALID_VALUE);
6426 }
6427
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006428 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006429
6430 if (context)
6431 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006432 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006433 }
6434 }
6435 catch(std::bad_alloc&)
6436 {
6437 return error(GL_OUT_OF_MEMORY);
6438 }
6439}
6440
6441void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006443 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 +00006444
6445 try
6446 {
6447 if (width < 0 || height < 0)
6448 {
6449 return error(GL_INVALID_VALUE);
6450 }
6451
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006452 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006453
6454 if (context)
6455 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006456 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006457 }
6458 }
6459 catch(std::bad_alloc&)
6460 {
6461 return error(GL_OUT_OF_MEMORY);
6462 }
6463}
6464
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006465void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6466 GLbitfield mask, GLenum filter)
6467{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006468 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006469 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6470 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6471 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6472
6473 try
6474 {
6475 switch (filter)
6476 {
6477 case GL_NEAREST:
6478 break;
6479 default:
6480 return error(GL_INVALID_ENUM);
6481 }
6482
6483 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6484 {
6485 return error(GL_INVALID_VALUE);
6486 }
6487
6488 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6489 {
6490 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
6491 return error(GL_INVALID_OPERATION);
6492 }
6493
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006494 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006495
6496 if (context)
6497 {
6498 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6499 {
6500 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
6501 return error(GL_INVALID_OPERATION);
6502 }
6503
6504 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6505 }
6506 }
6507 catch(std::bad_alloc&)
6508 {
6509 return error(GL_OUT_OF_MEMORY);
6510 }
6511}
6512
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006513void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6514 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006515{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006516 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006517 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006518 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006519 target, level, internalformat, width, height, depth, border, format, type, pixels);
6520
6521 try
6522 {
6523 UNIMPLEMENTED(); // FIXME
6524 }
6525 catch(std::bad_alloc&)
6526 {
6527 return error(GL_OUT_OF_MEMORY);
6528 }
6529}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006530
6531__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6532{
6533 struct Extension
6534 {
6535 const char *name;
6536 __eglMustCastToProperFunctionPointerType address;
6537 };
6538
6539 static const Extension glExtensions[] =
6540 {
6541 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006542 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006543 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006544 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6545 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6546 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6547 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6548 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6549 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6550 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006551 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006552 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006553 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6554 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6555 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6556 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006557 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6558 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6559 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6560 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6561 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6562 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6563 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006564 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6565 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6566 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006567 };
6568
6569 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6570 {
6571 if (strcmp(procname, glExtensions[ext].name) == 0)
6572 {
6573 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6574 }
6575 }
6576
6577 return NULL;
6578}
6579
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006580// Non-public functions used by EGL
6581
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006582bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006583{
6584 EVENT("(egl::Surface* surface = 0x%0.8p)",
6585 surface);
6586
6587 try
6588 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006589 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006590
6591 if (context)
6592 {
6593 gl::Texture2D *textureObject = context->getTexture2D();
6594
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006595 if (textureObject->isImmutable())
6596 {
6597 return false;
6598 }
6599
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006600 if (textureObject)
6601 {
6602 textureObject->bindTexImage(surface);
6603 }
6604 }
6605 }
6606 catch(std::bad_alloc&)
6607 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006608 return error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006609 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006610
6611 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006612}
6613
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006614}