blob: f1791a76b8f1050f03130f6e2aff6792fd882daa [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;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001300 case GL_DEPTH_COMPONENT:
1301 case GL_DEPTH_COMPONENT16:
1302 case GL_DEPTH_COMPONENT32_OES:
1303 case GL_DEPTH_STENCIL_OES:
1304 case GL_DEPTH24_STENCIL8_OES:
1305 if (context->supportsDepthTextures())
1306 {
1307 return error(GL_INVALID_OPERATION);
1308 }
1309 else
1310 {
1311 return error(GL_INVALID_ENUM);
1312 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001313 default:
1314 return error(GL_INVALID_ENUM);
1315 }
1316
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001317 if (target == GL_TEXTURE_2D)
1318 {
1319 gl::Texture2D *texture = context->getTexture2D();
1320
1321 if (!texture)
1322 {
1323 return error(GL_INVALID_OPERATION);
1324 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001325
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001326 if (texture->isImmutable())
1327 {
1328 return error(GL_INVALID_OPERATION);
1329 }
1330
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001331 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001332 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001333 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001334 {
1335 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1336
1337 if (!texture)
1338 {
1339 return error(GL_INVALID_OPERATION);
1340 }
1341
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001342 if (texture->isImmutable())
1343 {
1344 return error(GL_INVALID_OPERATION);
1345 }
1346
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001347 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001348 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001349 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001350 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001351 }
1352 catch(std::bad_alloc&)
1353 {
1354 return error(GL_OUT_OF_MEMORY);
1355 }
1356}
1357
1358void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1359{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001360 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001361 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001362 target, level, xoffset, yoffset, x, y, width, height);
1363
1364 try
1365 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001366 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001367 {
1368 return error(GL_INVALID_ENUM);
1369 }
1370
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001371 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001372 {
1373 return error(GL_INVALID_VALUE);
1374 }
1375
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001376 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1377 {
1378 return error(GL_INVALID_VALUE);
1379 }
1380
1381 if (width == 0 || height == 0)
1382 {
1383 return;
1384 }
1385
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001387
1388 if (context)
1389 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001390 if (level > context->getMaximumTextureLevel())
1391 {
1392 return error(GL_INVALID_VALUE);
1393 }
1394
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001395 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001396
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001397 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1398 {
1399 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1400 }
1401
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001402 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1403 {
1404 return error(GL_INVALID_OPERATION);
1405 }
1406
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001407 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001408 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001409 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001410 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001411
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001412 if (target == GL_TEXTURE_2D)
1413 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001414 gl::Texture2D *tex2d = context->getTexture2D();
1415
1416 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, tex2d))
1417 {
1418 return; // error already registered by validateSubImageParams
1419 }
daniel@transgaming.com92f49922012-05-09 15:49:19 +00001420 textureFormat = tex2d->getInternalFormat(level);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001421 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001422 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001423 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001424 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001425 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1426
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001427 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001428 {
1429 return; // error already registered by validateSubImageParams
1430 }
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001431 textureFormat = texcube->getInternalFormat(target, level);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001432 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001433 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001434 else UNREACHABLE();
1435
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001436 // [OpenGL ES 2.0.24] table 3.9
1437 switch (textureFormat)
1438 {
1439 case GL_ALPHA:
1440 if (colorbufferFormat != GL_ALPHA &&
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:
1450 case GL_RGB:
1451 if (colorbufferFormat != GL_RGB &&
1452 colorbufferFormat != GL_RGB565 &&
1453 colorbufferFormat != GL_RGB8_OES &&
1454 colorbufferFormat != GL_RGBA &&
1455 colorbufferFormat != GL_RGBA4 &&
1456 colorbufferFormat != GL_RGB5_A1 &&
1457 colorbufferFormat != GL_RGBA8_OES)
1458 {
1459 return error(GL_INVALID_OPERATION);
1460 }
1461 break;
1462 case GL_LUMINANCE_ALPHA:
1463 case GL_RGBA:
1464 if (colorbufferFormat != GL_RGBA &&
1465 colorbufferFormat != GL_RGBA4 &&
1466 colorbufferFormat != GL_RGB5_A1 &&
1467 colorbufferFormat != GL_RGBA8_OES)
1468 {
1469 return error(GL_INVALID_OPERATION);
1470 }
1471 break;
1472 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1473 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001474 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1475 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001476 return error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001477 case GL_DEPTH_COMPONENT:
1478 case GL_DEPTH_STENCIL_OES:
1479 return error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001480 default:
1481 return error(GL_INVALID_OPERATION);
1482 }
1483
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001484 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001485 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001486 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001487
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001488 catch(std::bad_alloc&)
1489 {
1490 return error(GL_OUT_OF_MEMORY);
1491 }
1492}
1493
1494GLuint __stdcall glCreateProgram(void)
1495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001496 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001497
1498 try
1499 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001501
1502 if (context)
1503 {
1504 return context->createProgram();
1505 }
1506 }
1507 catch(std::bad_alloc&)
1508 {
1509 return error(GL_OUT_OF_MEMORY, 0);
1510 }
1511
1512 return 0;
1513}
1514
1515GLuint __stdcall glCreateShader(GLenum type)
1516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001517 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518
1519 try
1520 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522
1523 if (context)
1524 {
1525 switch (type)
1526 {
1527 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001528 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001529 return context->createShader(type);
1530 default:
1531 return error(GL_INVALID_ENUM, 0);
1532 }
1533 }
1534 }
1535 catch(std::bad_alloc&)
1536 {
1537 return error(GL_OUT_OF_MEMORY, 0);
1538 }
1539
1540 return 0;
1541}
1542
1543void __stdcall glCullFace(GLenum mode)
1544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001545 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546
1547 try
1548 {
1549 switch (mode)
1550 {
1551 case GL_FRONT:
1552 case GL_BACK:
1553 case GL_FRONT_AND_BACK:
1554 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001555 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001556
1557 if (context)
1558 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001559 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560 }
1561 }
1562 break;
1563 default:
1564 return error(GL_INVALID_ENUM);
1565 }
1566 }
1567 catch(std::bad_alloc&)
1568 {
1569 return error(GL_OUT_OF_MEMORY);
1570 }
1571}
1572
1573void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001575 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576
1577 try
1578 {
1579 if (n < 0)
1580 {
1581 return error(GL_INVALID_VALUE);
1582 }
1583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
1586 if (context)
1587 {
1588 for (int i = 0; i < n; i++)
1589 {
1590 context->deleteBuffer(buffers[i]);
1591 }
1592 }
1593 }
1594 catch(std::bad_alloc&)
1595 {
1596 return error(GL_OUT_OF_MEMORY);
1597 }
1598}
1599
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001600void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001602 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001603
1604 try
1605 {
1606 if (n < 0)
1607 {
1608 return error(GL_INVALID_VALUE);
1609 }
1610
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001611 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001612
1613 if (context)
1614 {
1615 for (int i = 0; i < n; i++)
1616 {
1617 context->deleteFence(fences[i]);
1618 }
1619 }
1620 }
1621 catch(std::bad_alloc&)
1622 {
1623 return error(GL_OUT_OF_MEMORY);
1624 }
1625}
1626
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001627void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1628{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001629 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001630
1631 try
1632 {
1633 if (n < 0)
1634 {
1635 return error(GL_INVALID_VALUE);
1636 }
1637
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001639
1640 if (context)
1641 {
1642 for (int i = 0; i < n; i++)
1643 {
1644 if (framebuffers[i] != 0)
1645 {
1646 context->deleteFramebuffer(framebuffers[i]);
1647 }
1648 }
1649 }
1650 }
1651 catch(std::bad_alloc&)
1652 {
1653 return error(GL_OUT_OF_MEMORY);
1654 }
1655}
1656
1657void __stdcall glDeleteProgram(GLuint program)
1658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001659 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660
1661 try
1662 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001663 if (program == 0)
1664 {
1665 return;
1666 }
1667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 if (context)
1671 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001672 if (!context->getProgram(program))
1673 {
1674 if(context->getShader(program))
1675 {
1676 return error(GL_INVALID_OPERATION);
1677 }
1678 else
1679 {
1680 return error(GL_INVALID_VALUE);
1681 }
1682 }
1683
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001684 context->deleteProgram(program);
1685 }
1686 }
1687 catch(std::bad_alloc&)
1688 {
1689 return error(GL_OUT_OF_MEMORY);
1690 }
1691}
1692
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001693void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1694{
1695 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1696
1697 try
1698 {
1699 if (n < 0)
1700 {
1701 return error(GL_INVALID_VALUE);
1702 }
1703
1704 gl::Context *context = gl::getNonLostContext();
1705
1706 if (context)
1707 {
1708 for (int i = 0; i < n; i++)
1709 {
1710 context->deleteQuery(ids[i]);
1711 }
1712 }
1713 }
1714 catch(std::bad_alloc&)
1715 {
1716 return error(GL_OUT_OF_MEMORY);
1717 }
1718}
1719
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001722 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001723
1724 try
1725 {
1726 if (n < 0)
1727 {
1728 return error(GL_INVALID_VALUE);
1729 }
1730
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732
1733 if (context)
1734 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001735 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001736 {
1737 context->deleteRenderbuffer(renderbuffers[i]);
1738 }
1739 }
1740 }
1741 catch(std::bad_alloc&)
1742 {
1743 return error(GL_OUT_OF_MEMORY);
1744 }
1745}
1746
1747void __stdcall glDeleteShader(GLuint shader)
1748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001749 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750
1751 try
1752 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001753 if (shader == 0)
1754 {
1755 return;
1756 }
1757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759
1760 if (context)
1761 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001762 if (!context->getShader(shader))
1763 {
1764 if(context->getProgram(shader))
1765 {
1766 return error(GL_INVALID_OPERATION);
1767 }
1768 else
1769 {
1770 return error(GL_INVALID_VALUE);
1771 }
1772 }
1773
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774 context->deleteShader(shader);
1775 }
1776 }
1777 catch(std::bad_alloc&)
1778 {
1779 return error(GL_OUT_OF_MEMORY);
1780 }
1781}
1782
1783void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001785 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001786
1787 try
1788 {
1789 if (n < 0)
1790 {
1791 return error(GL_INVALID_VALUE);
1792 }
1793
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001794 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795
1796 if (context)
1797 {
1798 for (int i = 0; i < n; i++)
1799 {
1800 if (textures[i] != 0)
1801 {
1802 context->deleteTexture(textures[i]);
1803 }
1804 }
1805 }
1806 }
1807 catch(std::bad_alloc&)
1808 {
1809 return error(GL_OUT_OF_MEMORY);
1810 }
1811}
1812
1813void __stdcall glDepthFunc(GLenum func)
1814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001815 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001816
1817 try
1818 {
1819 switch (func)
1820 {
1821 case GL_NEVER:
1822 case GL_ALWAYS:
1823 case GL_LESS:
1824 case GL_LEQUAL:
1825 case GL_EQUAL:
1826 case GL_GREATER:
1827 case GL_GEQUAL:
1828 case GL_NOTEQUAL:
1829 break;
1830 default:
1831 return error(GL_INVALID_ENUM);
1832 }
1833
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001834 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001835
1836 if (context)
1837 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001838 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839 }
1840 }
1841 catch(std::bad_alloc&)
1842 {
1843 return error(GL_OUT_OF_MEMORY);
1844 }
1845}
1846
1847void __stdcall glDepthMask(GLboolean flag)
1848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001849 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001850
1851 try
1852 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001854
1855 if (context)
1856 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001857 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001858 }
1859 }
1860 catch(std::bad_alloc&)
1861 {
1862 return error(GL_OUT_OF_MEMORY);
1863 }
1864}
1865
1866void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001868 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001869
1870 try
1871 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001872 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 if (context)
1875 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001876 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877 }
1878 }
1879 catch(std::bad_alloc&)
1880 {
1881 return error(GL_OUT_OF_MEMORY);
1882 }
1883}
1884
1885void __stdcall glDetachShader(GLuint program, GLuint shader)
1886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001887 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001888
1889 try
1890 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892
1893 if (context)
1894 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001895
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896 gl::Program *programObject = context->getProgram(program);
1897 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001898
1899 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001901 gl::Shader *shaderByProgramHandle;
1902 shaderByProgramHandle = context->getShader(program);
1903 if (!shaderByProgramHandle)
1904 {
1905 return error(GL_INVALID_VALUE);
1906 }
1907 else
1908 {
1909 return error(GL_INVALID_OPERATION);
1910 }
1911 }
1912
1913 if (!shaderObject)
1914 {
1915 gl::Program *programByShaderHandle = context->getProgram(shader);
1916 if (!programByShaderHandle)
1917 {
1918 return error(GL_INVALID_VALUE);
1919 }
1920 else
1921 {
1922 return error(GL_INVALID_OPERATION);
1923 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924 }
1925
1926 if (!programObject->detachShader(shaderObject))
1927 {
1928 return error(GL_INVALID_OPERATION);
1929 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001930 }
1931 }
1932 catch(std::bad_alloc&)
1933 {
1934 return error(GL_OUT_OF_MEMORY);
1935 }
1936}
1937
1938void __stdcall glDisable(GLenum cap)
1939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001940 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001941
1942 try
1943 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001944 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001945
1946 if (context)
1947 {
1948 switch (cap)
1949 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001950 case GL_CULL_FACE: context->setCullFace(false); break;
1951 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1952 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1953 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1954 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1955 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1956 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1957 case GL_BLEND: context->setBlend(false); break;
1958 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959 default:
1960 return error(GL_INVALID_ENUM);
1961 }
1962 }
1963 }
1964 catch(std::bad_alloc&)
1965 {
1966 return error(GL_OUT_OF_MEMORY);
1967 }
1968}
1969
1970void __stdcall glDisableVertexAttribArray(GLuint index)
1971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001972 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973
1974 try
1975 {
1976 if (index >= gl::MAX_VERTEX_ATTRIBS)
1977 {
1978 return error(GL_INVALID_VALUE);
1979 }
1980
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001981 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982
1983 if (context)
1984 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001985 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 }
1987 }
1988 catch(std::bad_alloc&)
1989 {
1990 return error(GL_OUT_OF_MEMORY);
1991 }
1992}
1993
1994void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001996 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001997
1998 try
1999 {
2000 if (count < 0 || first < 0)
2001 {
2002 return error(GL_INVALID_VALUE);
2003 }
2004
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002005 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006
2007 if (context)
2008 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002009 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002010 }
2011 }
2012 catch(std::bad_alloc&)
2013 {
2014 return error(GL_OUT_OF_MEMORY);
2015 }
2016}
2017
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002018void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2019{
2020 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2021
2022 try
2023 {
2024 if (count < 0 || first < 0 || primcount < 0)
2025 {
2026 return error(GL_INVALID_VALUE);
2027 }
2028
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002029 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002030 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002031 gl::Context *context = gl::getNonLostContext();
2032
2033 if (context)
2034 {
2035 context->drawArrays(mode, first, count, primcount);
2036 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002037 }
2038 }
2039 catch(std::bad_alloc&)
2040 {
2041 return error(GL_OUT_OF_MEMORY);
2042 }
2043}
2044
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002045void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002047 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 +00002048 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002049
2050 try
2051 {
2052 if (count < 0)
2053 {
2054 return error(GL_INVALID_VALUE);
2055 }
2056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002058
2059 if (context)
2060 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002061 switch (type)
2062 {
2063 case GL_UNSIGNED_BYTE:
2064 case GL_UNSIGNED_SHORT:
2065 break;
2066 case GL_UNSIGNED_INT:
2067 if (!context->supports32bitIndices())
2068 {
2069 return error(GL_INVALID_ENUM);
2070 }
2071 break;
2072 default:
2073 return error(GL_INVALID_ENUM);
2074 }
2075
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002076 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002077 }
2078 }
2079 catch(std::bad_alloc&)
2080 {
2081 return error(GL_OUT_OF_MEMORY);
2082 }
2083}
2084
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002085void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2086{
2087 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2088 mode, count, type, indices, primcount);
2089
2090 try
2091 {
2092 if (count < 0 || primcount < 0)
2093 {
2094 return error(GL_INVALID_VALUE);
2095 }
2096
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002097 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002098 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002099 gl::Context *context = gl::getNonLostContext();
2100
2101 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002102 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002103 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002104 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002105 case GL_UNSIGNED_BYTE:
2106 case GL_UNSIGNED_SHORT:
2107 break;
2108 case GL_UNSIGNED_INT:
2109 if (!context->supports32bitIndices())
2110 {
2111 return error(GL_INVALID_ENUM);
2112 }
2113 break;
2114 default:
2115 return error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002116 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002117
2118 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002119 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002120 }
2121 }
2122 catch(std::bad_alloc&)
2123 {
2124 return error(GL_OUT_OF_MEMORY);
2125 }
2126}
2127
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128void __stdcall glEnable(GLenum cap)
2129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002130 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002131
2132 try
2133 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002134 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135
2136 if (context)
2137 {
2138 switch (cap)
2139 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002140 case GL_CULL_FACE: context->setCullFace(true); break;
2141 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2142 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2143 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2144 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2145 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2146 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2147 case GL_BLEND: context->setBlend(true); break;
2148 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002149 default:
2150 return error(GL_INVALID_ENUM);
2151 }
2152 }
2153 }
2154 catch(std::bad_alloc&)
2155 {
2156 return error(GL_OUT_OF_MEMORY);
2157 }
2158}
2159
2160void __stdcall glEnableVertexAttribArray(GLuint index)
2161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002162 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163
2164 try
2165 {
2166 if (index >= gl::MAX_VERTEX_ATTRIBS)
2167 {
2168 return error(GL_INVALID_VALUE);
2169 }
2170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172
2173 if (context)
2174 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002175 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002176 }
2177 }
2178 catch(std::bad_alloc&)
2179 {
2180 return error(GL_OUT_OF_MEMORY);
2181 }
2182}
2183
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002184void __stdcall glEndQueryEXT(GLenum target)
2185{
2186 EVENT("GLenum target = 0x%X)", target);
2187
2188 try
2189 {
2190 switch (target)
2191 {
2192 case GL_ANY_SAMPLES_PASSED_EXT:
2193 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2194 break;
2195 default:
2196 return error(GL_INVALID_ENUM);
2197 }
2198
2199 gl::Context *context = gl::getNonLostContext();
2200
2201 if (context)
2202 {
2203 context->endQuery(target);
2204 }
2205 }
2206 catch(std::bad_alloc&)
2207 {
2208 return error(GL_OUT_OF_MEMORY);
2209 }
2210}
2211
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002212void __stdcall glFinishFenceNV(GLuint fence)
2213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002214 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002215
2216 try
2217 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002218 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002219
2220 if (context)
2221 {
2222 gl::Fence* fenceObject = context->getFence(fence);
2223
2224 if (fenceObject == NULL)
2225 {
2226 return error(GL_INVALID_OPERATION);
2227 }
2228
2229 fenceObject->finishFence();
2230 }
2231 }
2232 catch(std::bad_alloc&)
2233 {
2234 return error(GL_OUT_OF_MEMORY);
2235 }
2236}
2237
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238void __stdcall glFinish(void)
2239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002240 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002241
2242 try
2243 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002244 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 if (context)
2247 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002248 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250 }
2251 catch(std::bad_alloc&)
2252 {
2253 return error(GL_OUT_OF_MEMORY);
2254 }
2255}
2256
2257void __stdcall glFlush(void)
2258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002259 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002260
2261 try
2262 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002263 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002264
2265 if (context)
2266 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002267 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002268 }
2269 }
2270 catch(std::bad_alloc&)
2271 {
2272 return error(GL_OUT_OF_MEMORY);
2273 }
2274}
2275
2276void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2277{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002278 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002279 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280
2281 try
2282 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002283 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002284 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002285 {
2286 return error(GL_INVALID_ENUM);
2287 }
2288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002290
2291 if (context)
2292 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002293 gl::Framebuffer *framebuffer = NULL;
2294 GLuint framebufferHandle = 0;
2295 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2296 {
2297 framebuffer = context->getReadFramebuffer();
2298 framebufferHandle = context->getReadFramebufferHandle();
2299 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002300 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002301 {
2302 framebuffer = context->getDrawFramebuffer();
2303 framebufferHandle = context->getDrawFramebufferHandle();
2304 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002306 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307 {
2308 return error(GL_INVALID_OPERATION);
2309 }
2310
2311 switch (attachment)
2312 {
2313 case GL_COLOR_ATTACHMENT0:
2314 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2315 break;
2316 case GL_DEPTH_ATTACHMENT:
2317 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2318 break;
2319 case GL_STENCIL_ATTACHMENT:
2320 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2321 break;
2322 default:
2323 return error(GL_INVALID_ENUM);
2324 }
2325 }
2326 }
2327 catch(std::bad_alloc&)
2328 {
2329 return error(GL_OUT_OF_MEMORY);
2330 }
2331}
2332
2333void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002335 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002336 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002337
2338 try
2339 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002340 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 {
2342 return error(GL_INVALID_ENUM);
2343 }
2344
2345 switch (attachment)
2346 {
2347 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002348 case GL_DEPTH_ATTACHMENT:
2349 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350 break;
2351 default:
2352 return error(GL_INVALID_ENUM);
2353 }
2354
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002355 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356
2357 if (context)
2358 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002359 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002360 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002361 textarget = GL_NONE;
2362 }
2363 else
2364 {
2365 gl::Texture *tex = context->getTexture(texture);
2366
2367 if (tex == NULL)
2368 {
2369 return error(GL_INVALID_OPERATION);
2370 }
2371
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372 switch (textarget)
2373 {
2374 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002376 if (tex->getTarget() != GL_TEXTURE_2D)
2377 {
2378 return error(GL_INVALID_OPERATION);
2379 }
2380 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002381 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002382 {
2383 return error(GL_INVALID_OPERATION);
2384 }
2385 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002386 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002387
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002390 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002393 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002394 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002395 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2396 {
2397 return error(GL_INVALID_OPERATION);
2398 }
2399 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002400 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002401 {
2402 return error(GL_INVALID_OPERATION);
2403 }
2404 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002405 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002406
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002407 default:
2408 return error(GL_INVALID_ENUM);
2409 }
2410
2411 if (level != 0)
2412 {
2413 return error(GL_INVALID_VALUE);
2414 }
2415 }
2416
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002417 gl::Framebuffer *framebuffer = NULL;
2418 GLuint framebufferHandle = 0;
2419 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2420 {
2421 framebuffer = context->getReadFramebuffer();
2422 framebufferHandle = context->getReadFramebufferHandle();
2423 }
2424 else
2425 {
2426 framebuffer = context->getDrawFramebuffer();
2427 framebufferHandle = context->getDrawFramebufferHandle();
2428 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002429
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002430 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 {
2432 return error(GL_INVALID_OPERATION);
2433 }
2434
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002435 switch (attachment)
2436 {
2437 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2438 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2439 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2440 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002441 }
2442 }
2443 catch(std::bad_alloc&)
2444 {
2445 return error(GL_OUT_OF_MEMORY);
2446 }
2447}
2448
2449void __stdcall glFrontFace(GLenum mode)
2450{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002451 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452
2453 try
2454 {
2455 switch (mode)
2456 {
2457 case GL_CW:
2458 case GL_CCW:
2459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002461
2462 if (context)
2463 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002464 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002465 }
2466 }
2467 break;
2468 default:
2469 return error(GL_INVALID_ENUM);
2470 }
2471 }
2472 catch(std::bad_alloc&)
2473 {
2474 return error(GL_OUT_OF_MEMORY);
2475 }
2476}
2477
2478void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002480 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481
2482 try
2483 {
2484 if (n < 0)
2485 {
2486 return error(GL_INVALID_VALUE);
2487 }
2488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002490
2491 if (context)
2492 {
2493 for (int i = 0; i < n; i++)
2494 {
2495 buffers[i] = context->createBuffer();
2496 }
2497 }
2498 }
2499 catch(std::bad_alloc&)
2500 {
2501 return error(GL_OUT_OF_MEMORY);
2502 }
2503}
2504
2505void __stdcall glGenerateMipmap(GLenum target)
2506{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002507 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002508
2509 try
2510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002512
2513 if (context)
2514 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002515 switch (target)
2516 {
2517 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002518 {
2519 gl::Texture2D *tex2d = context->getTexture2D();
2520
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002521 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002522 {
2523 return error(GL_INVALID_OPERATION);
2524 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002525 if (tex2d->isDepth(0))
2526 {
2527 return error(GL_INVALID_OPERATION);
2528 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002529
2530 tex2d->generateMipmaps();
2531 break;
2532 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002533
2534 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002535 {
2536 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2537
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002538 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002539 {
2540 return error(GL_INVALID_OPERATION);
2541 }
2542
2543 texcube->generateMipmaps();
2544 break;
2545 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002546
2547 default:
2548 return error(GL_INVALID_ENUM);
2549 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002550 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002551 }
2552 catch(std::bad_alloc&)
2553 {
2554 return error(GL_OUT_OF_MEMORY);
2555 }
2556}
2557
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002558void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002561
2562 try
2563 {
2564 if (n < 0)
2565 {
2566 return error(GL_INVALID_VALUE);
2567 }
2568
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002569 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002570
2571 if (context)
2572 {
2573 for (int i = 0; i < n; i++)
2574 {
2575 fences[i] = context->createFence();
2576 }
2577 }
2578 }
2579 catch(std::bad_alloc&)
2580 {
2581 return error(GL_OUT_OF_MEMORY);
2582 }
2583}
2584
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002585void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002587 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588
2589 try
2590 {
2591 if (n < 0)
2592 {
2593 return error(GL_INVALID_VALUE);
2594 }
2595
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002596 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002597
2598 if (context)
2599 {
2600 for (int i = 0; i < n; i++)
2601 {
2602 framebuffers[i] = context->createFramebuffer();
2603 }
2604 }
2605 }
2606 catch(std::bad_alloc&)
2607 {
2608 return error(GL_OUT_OF_MEMORY);
2609 }
2610}
2611
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002612void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2613{
2614 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2615
2616 try
2617 {
2618 if (n < 0)
2619 {
2620 return error(GL_INVALID_VALUE);
2621 }
2622
2623 gl::Context *context = gl::getNonLostContext();
2624
2625 if (context)
2626 {
2627 for (int i = 0; i < n; i++)
2628 {
2629 ids[i] = context->createQuery();
2630 }
2631 }
2632 }
2633 catch(std::bad_alloc&)
2634 {
2635 return error(GL_OUT_OF_MEMORY);
2636 }
2637}
2638
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002639void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2640{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002641 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002642
2643 try
2644 {
2645 if (n < 0)
2646 {
2647 return error(GL_INVALID_VALUE);
2648 }
2649
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002650 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002651
2652 if (context)
2653 {
2654 for (int i = 0; i < n; i++)
2655 {
2656 renderbuffers[i] = context->createRenderbuffer();
2657 }
2658 }
2659 }
2660 catch(std::bad_alloc&)
2661 {
2662 return error(GL_OUT_OF_MEMORY);
2663 }
2664}
2665
2666void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002668 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002669
2670 try
2671 {
2672 if (n < 0)
2673 {
2674 return error(GL_INVALID_VALUE);
2675 }
2676
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002678
2679 if (context)
2680 {
2681 for (int i = 0; i < n; i++)
2682 {
2683 textures[i] = context->createTexture();
2684 }
2685 }
2686 }
2687 catch(std::bad_alloc&)
2688 {
2689 return error(GL_OUT_OF_MEMORY);
2690 }
2691}
2692
daniel@transgaming.com85423182010-04-22 13:35:27 +00002693void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002695 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002696 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002697 program, index, bufsize, length, size, type, name);
2698
2699 try
2700 {
2701 if (bufsize < 0)
2702 {
2703 return error(GL_INVALID_VALUE);
2704 }
2705
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002706 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002707
2708 if (context)
2709 {
2710 gl::Program *programObject = context->getProgram(program);
2711
2712 if (!programObject)
2713 {
2714 if (context->getShader(program))
2715 {
2716 return error(GL_INVALID_OPERATION);
2717 }
2718 else
2719 {
2720 return error(GL_INVALID_VALUE);
2721 }
2722 }
2723
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002724 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002725 {
2726 return error(GL_INVALID_VALUE);
2727 }
2728
2729 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2730 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731 }
2732 catch(std::bad_alloc&)
2733 {
2734 return error(GL_OUT_OF_MEMORY);
2735 }
2736}
2737
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002738void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002740 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002741 "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 +00002742 program, index, bufsize, length, size, type, name);
2743
2744 try
2745 {
2746 if (bufsize < 0)
2747 {
2748 return error(GL_INVALID_VALUE);
2749 }
2750
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002751 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002752
2753 if (context)
2754 {
2755 gl::Program *programObject = context->getProgram(program);
2756
2757 if (!programObject)
2758 {
2759 if (context->getShader(program))
2760 {
2761 return error(GL_INVALID_OPERATION);
2762 }
2763 else
2764 {
2765 return error(GL_INVALID_VALUE);
2766 }
2767 }
2768
2769 if (index >= (GLuint)programObject->getActiveUniformCount())
2770 {
2771 return error(GL_INVALID_VALUE);
2772 }
2773
2774 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002776 }
2777 catch(std::bad_alloc&)
2778 {
2779 return error(GL_OUT_OF_MEMORY);
2780 }
2781}
2782
2783void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002785 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 +00002786 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002787
2788 try
2789 {
2790 if (maxcount < 0)
2791 {
2792 return error(GL_INVALID_VALUE);
2793 }
2794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002796
2797 if (context)
2798 {
2799 gl::Program *programObject = context->getProgram(program);
2800
2801 if (!programObject)
2802 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002803 if (context->getShader(program))
2804 {
2805 return error(GL_INVALID_OPERATION);
2806 }
2807 else
2808 {
2809 return error(GL_INVALID_VALUE);
2810 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002811 }
2812
2813 return programObject->getAttachedShaders(maxcount, count, shaders);
2814 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816 catch(std::bad_alloc&)
2817 {
2818 return error(GL_OUT_OF_MEMORY);
2819 }
2820}
2821
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002822int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002824 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825
2826 try
2827 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002828 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002829
2830 if (context)
2831 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002832
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002833 gl::Program *programObject = context->getProgram(program);
2834
2835 if (!programObject)
2836 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002837 if (context->getShader(program))
2838 {
2839 return error(GL_INVALID_OPERATION, -1);
2840 }
2841 else
2842 {
2843 return error(GL_INVALID_VALUE, -1);
2844 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002845 }
2846
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002847 if (!programObject->isLinked())
2848 {
2849 return error(GL_INVALID_OPERATION, -1);
2850 }
2851
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002852 return programObject->getAttributeLocation(name);
2853 }
2854 }
2855 catch(std::bad_alloc&)
2856 {
2857 return error(GL_OUT_OF_MEMORY, -1);
2858 }
2859
2860 return -1;
2861}
2862
2863void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002865 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866
2867 try
2868 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002869 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002870
2871 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002872 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002873 if (!(context->getBooleanv(pname, params)))
2874 {
2875 GLenum nativeType;
2876 unsigned int numParams = 0;
2877 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2878 return error(GL_INVALID_ENUM);
2879
2880 if (numParams == 0)
2881 return; // it is known that the pname is valid, but there are no parameters to return
2882
2883 if (nativeType == GL_FLOAT)
2884 {
2885 GLfloat *floatParams = NULL;
2886 floatParams = new GLfloat[numParams];
2887
2888 context->getFloatv(pname, floatParams);
2889
2890 for (unsigned int i = 0; i < numParams; ++i)
2891 {
2892 if (floatParams[i] == 0.0f)
2893 params[i] = GL_FALSE;
2894 else
2895 params[i] = GL_TRUE;
2896 }
2897
2898 delete [] floatParams;
2899 }
2900 else if (nativeType == GL_INT)
2901 {
2902 GLint *intParams = NULL;
2903 intParams = new GLint[numParams];
2904
2905 context->getIntegerv(pname, intParams);
2906
2907 for (unsigned int i = 0; i < numParams; ++i)
2908 {
2909 if (intParams[i] == 0)
2910 params[i] = GL_FALSE;
2911 else
2912 params[i] = GL_TRUE;
2913 }
2914
2915 delete [] intParams;
2916 }
2917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919 }
2920 catch(std::bad_alloc&)
2921 {
2922 return error(GL_OUT_OF_MEMORY);
2923 }
2924}
2925
2926void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2927{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002928 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 +00002929
2930 try
2931 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002932 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002933
2934 if (context)
2935 {
2936 gl::Buffer *buffer;
2937
2938 switch (target)
2939 {
2940 case GL_ARRAY_BUFFER:
2941 buffer = context->getArrayBuffer();
2942 break;
2943 case GL_ELEMENT_ARRAY_BUFFER:
2944 buffer = context->getElementArrayBuffer();
2945 break;
2946 default: return error(GL_INVALID_ENUM);
2947 }
2948
2949 if (!buffer)
2950 {
2951 // A null buffer means that "0" is bound to the requested buffer target
2952 return error(GL_INVALID_OPERATION);
2953 }
2954
2955 switch (pname)
2956 {
2957 case GL_BUFFER_USAGE:
2958 *params = buffer->usage();
2959 break;
2960 case GL_BUFFER_SIZE:
2961 *params = buffer->size();
2962 break;
2963 default: return error(GL_INVALID_ENUM);
2964 }
2965 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002966 }
2967 catch(std::bad_alloc&)
2968 {
2969 return error(GL_OUT_OF_MEMORY);
2970 }
2971}
2972
2973GLenum __stdcall glGetError(void)
2974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002975 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976
2977 gl::Context *context = gl::getContext();
2978
2979 if (context)
2980 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002981 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002982 }
2983
2984 return GL_NO_ERROR;
2985}
2986
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002987void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2988{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002989 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002990
2991 try
2992 {
2993
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002994 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002995
2996 if (context)
2997 {
2998 gl::Fence *fenceObject = context->getFence(fence);
2999
3000 if (fenceObject == NULL)
3001 {
3002 return error(GL_INVALID_OPERATION);
3003 }
3004
3005 fenceObject->getFenceiv(pname, params);
3006 }
3007 }
3008 catch(std::bad_alloc&)
3009 {
3010 return error(GL_OUT_OF_MEMORY);
3011 }
3012}
3013
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003014void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003016 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017
3018 try
3019 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003021
3022 if (context)
3023 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003024 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003025 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003026 GLenum nativeType;
3027 unsigned int numParams = 0;
3028 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3029 return error(GL_INVALID_ENUM);
3030
3031 if (numParams == 0)
3032 return; // it is known that the pname is valid, but that there are no parameters to return.
3033
3034 if (nativeType == GL_BOOL)
3035 {
3036 GLboolean *boolParams = NULL;
3037 boolParams = new GLboolean[numParams];
3038
3039 context->getBooleanv(pname, boolParams);
3040
3041 for (unsigned int i = 0; i < numParams; ++i)
3042 {
3043 if (boolParams[i] == GL_FALSE)
3044 params[i] = 0.0f;
3045 else
3046 params[i] = 1.0f;
3047 }
3048
3049 delete [] boolParams;
3050 }
3051 else if (nativeType == GL_INT)
3052 {
3053 GLint *intParams = NULL;
3054 intParams = new GLint[numParams];
3055
3056 context->getIntegerv(pname, intParams);
3057
3058 for (unsigned int i = 0; i < numParams; ++i)
3059 {
3060 params[i] = (GLfloat)intParams[i];
3061 }
3062
3063 delete [] intParams;
3064 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003065 }
3066 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 }
3068 catch(std::bad_alloc&)
3069 {
3070 return error(GL_OUT_OF_MEMORY);
3071 }
3072}
3073
3074void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003076 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 +00003077 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003078
3079 try
3080 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082
3083 if (context)
3084 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003085 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003086 {
3087 return error(GL_INVALID_ENUM);
3088 }
3089
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003090 gl::Framebuffer *framebuffer = NULL;
3091 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3092 {
3093 if(context->getReadFramebufferHandle() == 0)
3094 {
3095 return error(GL_INVALID_OPERATION);
3096 }
3097
3098 framebuffer = context->getReadFramebuffer();
3099 }
3100 else
3101 {
3102 if (context->getDrawFramebufferHandle() == 0)
3103 {
3104 return error(GL_INVALID_OPERATION);
3105 }
3106
3107 framebuffer = context->getDrawFramebuffer();
3108 }
3109
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003110 GLenum attachmentType;
3111 GLuint attachmentHandle;
3112 switch (attachment)
3113 {
3114 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003115 attachmentType = framebuffer->getColorbufferType();
3116 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003117 break;
3118 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003119 attachmentType = framebuffer->getDepthbufferType();
3120 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003121 break;
3122 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003123 attachmentType = framebuffer->getStencilbufferType();
3124 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003125 break;
3126 default: return error(GL_INVALID_ENUM);
3127 }
3128
3129 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003130 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003131 {
3132 attachmentObjectType = attachmentType;
3133 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003134 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003135 {
3136 attachmentObjectType = GL_TEXTURE;
3137 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003138 else
3139 {
3140 UNREACHABLE();
3141 return;
3142 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003143
3144 switch (pname)
3145 {
3146 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3147 *params = attachmentObjectType;
3148 break;
3149 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3150 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3151 {
3152 *params = attachmentHandle;
3153 }
3154 else
3155 {
3156 return error(GL_INVALID_ENUM);
3157 }
3158 break;
3159 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3160 if (attachmentObjectType == GL_TEXTURE)
3161 {
3162 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3163 }
3164 else
3165 {
3166 return error(GL_INVALID_ENUM);
3167 }
3168 break;
3169 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3170 if (attachmentObjectType == GL_TEXTURE)
3171 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003172 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003173 {
3174 *params = attachmentType;
3175 }
3176 else
3177 {
3178 *params = 0;
3179 }
3180 }
3181 else
3182 {
3183 return error(GL_INVALID_ENUM);
3184 }
3185 break;
3186 default:
3187 return error(GL_INVALID_ENUM);
3188 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189 }
3190 }
3191 catch(std::bad_alloc&)
3192 {
3193 return error(GL_OUT_OF_MEMORY);
3194 }
3195}
3196
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003197GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3198{
3199 EVENT("()");
3200
3201 try
3202 {
3203 gl::Context *context = gl::getContext();
3204
3205 if (context)
3206 {
3207 return context->getResetStatus();
3208 }
3209
3210 return GL_NO_ERROR;
3211 }
3212 catch(std::bad_alloc&)
3213 {
3214 return GL_OUT_OF_MEMORY;
3215 }
3216}
3217
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003218void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3219{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003220 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003221
3222 try
3223 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225
3226 if (context)
3227 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003228 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003229 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003230 GLenum nativeType;
3231 unsigned int numParams = 0;
3232 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3233 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003235 if (numParams == 0)
3236 return; // it is known that pname is valid, but there are no parameters to return
3237
3238 if (nativeType == GL_BOOL)
3239 {
3240 GLboolean *boolParams = NULL;
3241 boolParams = new GLboolean[numParams];
3242
3243 context->getBooleanv(pname, boolParams);
3244
3245 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003247 if (boolParams[i] == GL_FALSE)
3248 params[i] = 0;
3249 else
3250 params[i] = 1;
3251 }
3252
3253 delete [] boolParams;
3254 }
3255 else if (nativeType == GL_FLOAT)
3256 {
3257 GLfloat *floatParams = NULL;
3258 floatParams = new GLfloat[numParams];
3259
3260 context->getFloatv(pname, floatParams);
3261
3262 for (unsigned int i = 0; i < numParams; ++i)
3263 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003264 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 +00003265 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003266 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003268 else
3269 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 +00003270 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003272 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275 }
3276 }
3277 catch(std::bad_alloc&)
3278 {
3279 return error(GL_OUT_OF_MEMORY);
3280 }
3281}
3282
3283void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003285 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003286
3287 try
3288 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290
3291 if (context)
3292 {
3293 gl::Program *programObject = context->getProgram(program);
3294
3295 if (!programObject)
3296 {
3297 return error(GL_INVALID_VALUE);
3298 }
3299
3300 switch (pname)
3301 {
3302 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003303 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304 return;
3305 case GL_LINK_STATUS:
3306 *params = programObject->isLinked();
3307 return;
3308 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003309 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003310 return;
3311 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003312 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313 return;
3314 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003315 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316 return;
3317 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003318 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003319 return;
3320 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003321 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 return;
3323 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003324 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 return;
3326 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003327 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003328 return;
3329 default:
3330 return error(GL_INVALID_ENUM);
3331 }
3332 }
3333 }
3334 catch(std::bad_alloc&)
3335 {
3336 return error(GL_OUT_OF_MEMORY);
3337 }
3338}
3339
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003340void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003342 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 +00003343 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003344
3345 try
3346 {
3347 if (bufsize < 0)
3348 {
3349 return error(GL_INVALID_VALUE);
3350 }
3351
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003353
3354 if (context)
3355 {
3356 gl::Program *programObject = context->getProgram(program);
3357
3358 if (!programObject)
3359 {
3360 return error(GL_INVALID_VALUE);
3361 }
3362
3363 programObject->getInfoLog(bufsize, length, infolog);
3364 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003365 }
3366 catch(std::bad_alloc&)
3367 {
3368 return error(GL_OUT_OF_MEMORY);
3369 }
3370}
3371
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003372void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3373{
3374 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3375
3376 try
3377 {
3378 switch (pname)
3379 {
3380 case GL_CURRENT_QUERY_EXT:
3381 break;
3382 default:
3383 return error(GL_INVALID_ENUM);
3384 }
3385
3386 gl::Context *context = gl::getNonLostContext();
3387
3388 if (context)
3389 {
3390 params[0] = context->getActiveQuery(target);
3391 }
3392 }
3393 catch(std::bad_alloc&)
3394 {
3395 return error(GL_OUT_OF_MEMORY);
3396 }
3397}
3398
3399void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3400{
3401 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3402
3403 try
3404 {
3405 switch (pname)
3406 {
3407 case GL_QUERY_RESULT_EXT:
3408 case GL_QUERY_RESULT_AVAILABLE_EXT:
3409 break;
3410 default:
3411 return error(GL_INVALID_ENUM);
3412 }
3413 gl::Context *context = gl::getNonLostContext();
3414
3415 if (context)
3416 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003417 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3418
3419 if (!queryObject)
3420 {
3421 return error(GL_INVALID_OPERATION);
3422 }
3423
3424 if (context->getActiveQuery(queryObject->getType()) == id)
3425 {
3426 return error(GL_INVALID_OPERATION);
3427 }
3428
3429 switch(pname)
3430 {
3431 case GL_QUERY_RESULT_EXT:
3432 params[0] = queryObject->getResult();
3433 break;
3434 case GL_QUERY_RESULT_AVAILABLE_EXT:
3435 params[0] = queryObject->isResultAvailable();
3436 break;
3437 default:
3438 ASSERT(false);
3439 }
3440 }
3441 }
3442 catch(std::bad_alloc&)
3443 {
3444 return error(GL_OUT_OF_MEMORY);
3445 }
3446}
3447
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003450 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 +00003451
3452 try
3453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003455
3456 if (context)
3457 {
3458 if (target != GL_RENDERBUFFER)
3459 {
3460 return error(GL_INVALID_ENUM);
3461 }
3462
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003463 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003464 {
3465 return error(GL_INVALID_OPERATION);
3466 }
3467
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003468 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003469
3470 switch (pname)
3471 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003472 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3473 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3474 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3475 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3476 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3477 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3478 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3479 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3480 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003481 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003482 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003483 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003484 *params = renderbuffer->getSamples();
3485 }
3486 else
3487 {
3488 return error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003489 }
3490 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003491 default:
3492 return error(GL_INVALID_ENUM);
3493 }
3494 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495 }
3496 catch(std::bad_alloc&)
3497 {
3498 return error(GL_OUT_OF_MEMORY);
3499 }
3500}
3501
3502void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3503{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003504 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003505
3506 try
3507 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003508 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003509
3510 if (context)
3511 {
3512 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003513
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003514 if (!shaderObject)
3515 {
3516 return error(GL_INVALID_VALUE);
3517 }
3518
3519 switch (pname)
3520 {
3521 case GL_SHADER_TYPE:
3522 *params = shaderObject->getType();
3523 return;
3524 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003525 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003526 return;
3527 case GL_COMPILE_STATUS:
3528 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3529 return;
3530 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003531 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003532 return;
3533 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003534 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003536 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3537 *params = shaderObject->getTranslatedSourceLength();
3538 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 default:
3540 return error(GL_INVALID_ENUM);
3541 }
3542 }
3543 }
3544 catch(std::bad_alloc&)
3545 {
3546 return error(GL_OUT_OF_MEMORY);
3547 }
3548}
3549
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003550void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003552 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 +00003553 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003554
3555 try
3556 {
3557 if (bufsize < 0)
3558 {
3559 return error(GL_INVALID_VALUE);
3560 }
3561
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003563
3564 if (context)
3565 {
3566 gl::Shader *shaderObject = context->getShader(shader);
3567
3568 if (!shaderObject)
3569 {
3570 return error(GL_INVALID_VALUE);
3571 }
3572
3573 shaderObject->getInfoLog(bufsize, length, infolog);
3574 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003575 }
3576 catch(std::bad_alloc&)
3577 {
3578 return error(GL_OUT_OF_MEMORY);
3579 }
3580}
3581
3582void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003584 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 +00003585 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586
3587 try
3588 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003589 switch (shadertype)
3590 {
3591 case GL_VERTEX_SHADER:
3592 case GL_FRAGMENT_SHADER:
3593 break;
3594 default:
3595 return error(GL_INVALID_ENUM);
3596 }
3597
3598 switch (precisiontype)
3599 {
3600 case GL_LOW_FLOAT:
3601 case GL_MEDIUM_FLOAT:
3602 case GL_HIGH_FLOAT:
3603 // Assume IEEE 754 precision
3604 range[0] = 127;
3605 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003606 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003607 break;
3608 case GL_LOW_INT:
3609 case GL_MEDIUM_INT:
3610 case GL_HIGH_INT:
3611 // Some (most) hardware only supports single-precision floating-point numbers,
3612 // which can accurately represent integers up to +/-16777216
3613 range[0] = 24;
3614 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003615 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003616 break;
3617 default:
3618 return error(GL_INVALID_ENUM);
3619 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003620 }
3621 catch(std::bad_alloc&)
3622 {
3623 return error(GL_OUT_OF_MEMORY);
3624 }
3625}
3626
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003627void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003628{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003629 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 +00003630 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003631
3632 try
3633 {
3634 if (bufsize < 0)
3635 {
3636 return error(GL_INVALID_VALUE);
3637 }
3638
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003639 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003640
3641 if (context)
3642 {
3643 gl::Shader *shaderObject = context->getShader(shader);
3644
3645 if (!shaderObject)
3646 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00003647 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003648 }
3649
3650 shaderObject->getSource(bufsize, length, source);
3651 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003652 }
3653 catch(std::bad_alloc&)
3654 {
3655 return error(GL_OUT_OF_MEMORY);
3656 }
3657}
3658
zmo@google.coma574f782011-10-03 21:45:23 +00003659void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3660{
3661 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3662 shader, bufsize, length, source);
3663
3664 try
3665 {
3666 if (bufsize < 0)
3667 {
3668 return error(GL_INVALID_VALUE);
3669 }
3670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003671 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003672
3673 if (context)
3674 {
3675 gl::Shader *shaderObject = context->getShader(shader);
3676
3677 if (!shaderObject)
3678 {
3679 return error(GL_INVALID_OPERATION);
3680 }
3681
3682 shaderObject->getTranslatedSource(bufsize, length, source);
3683 }
3684 }
3685 catch(std::bad_alloc&)
3686 {
3687 return error(GL_OUT_OF_MEMORY);
3688 }
3689}
3690
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003691const GLubyte* __stdcall glGetString(GLenum name)
3692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003693 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003694
3695 try
3696 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003697 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003698
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003699 switch (name)
3700 {
3701 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003702 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003703 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003704 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705 case GL_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003706 return (GLubyte*)"OpenGL ES 2.0 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003708 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003709 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003710 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003711 default:
3712 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
3713 }
3714 }
3715 catch(std::bad_alloc&)
3716 {
3717 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3718 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003719}
3720
3721void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003723 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 +00003724
3725 try
3726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003728
3729 if (context)
3730 {
3731 gl::Texture *texture;
3732
3733 switch (target)
3734 {
3735 case GL_TEXTURE_2D:
3736 texture = context->getTexture2D();
3737 break;
3738 case GL_TEXTURE_CUBE_MAP:
3739 texture = context->getTextureCubeMap();
3740 break;
3741 default:
3742 return error(GL_INVALID_ENUM);
3743 }
3744
3745 switch (pname)
3746 {
3747 case GL_TEXTURE_MAG_FILTER:
3748 *params = (GLfloat)texture->getMagFilter();
3749 break;
3750 case GL_TEXTURE_MIN_FILTER:
3751 *params = (GLfloat)texture->getMinFilter();
3752 break;
3753 case GL_TEXTURE_WRAP_S:
3754 *params = (GLfloat)texture->getWrapS();
3755 break;
3756 case GL_TEXTURE_WRAP_T:
3757 *params = (GLfloat)texture->getWrapT();
3758 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003759 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3760 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3761 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003762 case GL_TEXTURE_USAGE_ANGLE:
3763 *params = (GLfloat)texture->getUsage();
3764 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003765 default:
3766 return error(GL_INVALID_ENUM);
3767 }
3768 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003769 }
3770 catch(std::bad_alloc&)
3771 {
3772 return error(GL_OUT_OF_MEMORY);
3773 }
3774}
3775
3776void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003778 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 +00003779
3780 try
3781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003782 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003783
3784 if (context)
3785 {
3786 gl::Texture *texture;
3787
3788 switch (target)
3789 {
3790 case GL_TEXTURE_2D:
3791 texture = context->getTexture2D();
3792 break;
3793 case GL_TEXTURE_CUBE_MAP:
3794 texture = context->getTextureCubeMap();
3795 break;
3796 default:
3797 return error(GL_INVALID_ENUM);
3798 }
3799
3800 switch (pname)
3801 {
3802 case GL_TEXTURE_MAG_FILTER:
3803 *params = texture->getMagFilter();
3804 break;
3805 case GL_TEXTURE_MIN_FILTER:
3806 *params = texture->getMinFilter();
3807 break;
3808 case GL_TEXTURE_WRAP_S:
3809 *params = texture->getWrapS();
3810 break;
3811 case GL_TEXTURE_WRAP_T:
3812 *params = texture->getWrapT();
3813 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003814 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3815 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3816 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003817 case GL_TEXTURE_USAGE_ANGLE:
3818 *params = texture->getUsage();
3819 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003820 default:
3821 return error(GL_INVALID_ENUM);
3822 }
3823 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824 }
3825 catch(std::bad_alloc&)
3826 {
3827 return error(GL_OUT_OF_MEMORY);
3828 }
3829}
3830
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003831void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3832{
3833 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3834 program, location, bufSize, params);
3835
3836 try
3837 {
3838 if (bufSize < 0)
3839 {
3840 return error(GL_INVALID_VALUE);
3841 }
3842
3843 gl::Context *context = gl::getNonLostContext();
3844
3845 if (context)
3846 {
3847 if (program == 0)
3848 {
3849 return error(GL_INVALID_VALUE);
3850 }
3851
3852 gl::Program *programObject = context->getProgram(program);
3853
3854 if (!programObject || !programObject->isLinked())
3855 {
3856 return error(GL_INVALID_OPERATION);
3857 }
3858
3859 if (!programObject->getUniformfv(location, &bufSize, params))
3860 {
3861 return error(GL_INVALID_OPERATION);
3862 }
3863 }
3864 }
3865 catch(std::bad_alloc&)
3866 {
3867 return error(GL_OUT_OF_MEMORY);
3868 }
3869}
3870
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003871void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003873 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874
3875 try
3876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003878
3879 if (context)
3880 {
3881 if (program == 0)
3882 {
3883 return error(GL_INVALID_VALUE);
3884 }
3885
3886 gl::Program *programObject = context->getProgram(program);
3887
3888 if (!programObject || !programObject->isLinked())
3889 {
3890 return error(GL_INVALID_OPERATION);
3891 }
3892
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003893 if (!programObject->getUniformfv(location, NULL, params))
3894 {
3895 return error(GL_INVALID_OPERATION);
3896 }
3897 }
3898 }
3899 catch(std::bad_alloc&)
3900 {
3901 return error(GL_OUT_OF_MEMORY);
3902 }
3903}
3904
3905void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3906{
3907 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3908 program, location, bufSize, params);
3909
3910 try
3911 {
3912 if (bufSize < 0)
3913 {
3914 return error(GL_INVALID_VALUE);
3915 }
3916
3917 gl::Context *context = gl::getNonLostContext();
3918
3919 if (context)
3920 {
3921 if (program == 0)
3922 {
3923 return error(GL_INVALID_VALUE);
3924 }
3925
3926 gl::Program *programObject = context->getProgram(program);
3927
3928 if (!programObject || !programObject->isLinked())
3929 {
3930 return error(GL_INVALID_OPERATION);
3931 }
3932
3933 if (!programObject)
3934 {
3935 return error(GL_INVALID_OPERATION);
3936 }
3937
3938 if (!programObject->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003939 {
3940 return error(GL_INVALID_OPERATION);
3941 }
3942 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003943 }
3944 catch(std::bad_alloc&)
3945 {
3946 return error(GL_OUT_OF_MEMORY);
3947 }
3948}
3949
3950void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003952 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003953
3954 try
3955 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003957
3958 if (context)
3959 {
3960 if (program == 0)
3961 {
3962 return error(GL_INVALID_VALUE);
3963 }
3964
3965 gl::Program *programObject = context->getProgram(program);
3966
3967 if (!programObject || !programObject->isLinked())
3968 {
3969 return error(GL_INVALID_OPERATION);
3970 }
3971
3972 if (!programObject)
3973 {
3974 return error(GL_INVALID_OPERATION);
3975 }
3976
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003977 if (!programObject->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003978 {
3979 return error(GL_INVALID_OPERATION);
3980 }
3981 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003982 }
3983 catch(std::bad_alloc&)
3984 {
3985 return error(GL_OUT_OF_MEMORY);
3986 }
3987}
3988
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003989int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003991 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992
3993 try
3994 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996
3997 if (strstr(name, "gl_") == name)
3998 {
3999 return -1;
4000 }
4001
4002 if (context)
4003 {
4004 gl::Program *programObject = context->getProgram(program);
4005
4006 if (!programObject)
4007 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004008 if (context->getShader(program))
4009 {
4010 return error(GL_INVALID_OPERATION, -1);
4011 }
4012 else
4013 {
4014 return error(GL_INVALID_VALUE, -1);
4015 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016 }
4017
4018 if (!programObject->isLinked())
4019 {
4020 return error(GL_INVALID_OPERATION, -1);
4021 }
4022
daniel@transgaming.com024f1a92011-09-20 16:06:25 +00004023 return programObject->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004024 }
4025 }
4026 catch(std::bad_alloc&)
4027 {
4028 return error(GL_OUT_OF_MEMORY, -1);
4029 }
4030
4031 return -1;
4032}
4033
4034void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4035{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004036 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037
4038 try
4039 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004040 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041
daniel@transgaming.come0078962010-04-15 20:45:08 +00004042 if (context)
4043 {
4044 if (index >= gl::MAX_VERTEX_ATTRIBS)
4045 {
4046 return error(GL_INVALID_VALUE);
4047 }
4048
daniel@transgaming.com83921382011-01-08 05:46:00 +00004049 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004050
daniel@transgaming.come0078962010-04-15 20:45:08 +00004051 switch (pname)
4052 {
4053 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004054 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004055 break;
4056 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004057 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004058 break;
4059 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004060 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004061 break;
4062 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004063 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004064 break;
4065 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004066 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004067 break;
4068 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004069 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004070 break;
4071 case GL_CURRENT_VERTEX_ATTRIB:
4072 for (int i = 0; i < 4; ++i)
4073 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004074 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004075 }
4076 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004077 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4078 *params = (GLfloat)attribState.mDivisor;
4079 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004080 default: return error(GL_INVALID_ENUM);
4081 }
4082 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004083 }
4084 catch(std::bad_alloc&)
4085 {
4086 return error(GL_OUT_OF_MEMORY);
4087 }
4088}
4089
4090void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4091{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004092 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093
4094 try
4095 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004096 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097
daniel@transgaming.come0078962010-04-15 20:45:08 +00004098 if (context)
4099 {
4100 if (index >= gl::MAX_VERTEX_ATTRIBS)
4101 {
4102 return error(GL_INVALID_VALUE);
4103 }
4104
daniel@transgaming.com83921382011-01-08 05:46:00 +00004105 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004106
daniel@transgaming.come0078962010-04-15 20:45:08 +00004107 switch (pname)
4108 {
4109 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004110 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004111 break;
4112 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004113 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004114 break;
4115 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004116 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004117 break;
4118 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004119 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004120 break;
4121 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004122 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004123 break;
4124 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004125 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004126 break;
4127 case GL_CURRENT_VERTEX_ATTRIB:
4128 for (int i = 0; i < 4; ++i)
4129 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004130 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004131 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4132 }
4133 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004134 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4135 *params = (GLint)attribState.mDivisor;
4136 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004137 default: return error(GL_INVALID_ENUM);
4138 }
4139 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004140 }
4141 catch(std::bad_alloc&)
4142 {
4143 return error(GL_OUT_OF_MEMORY);
4144 }
4145}
4146
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004147void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004149 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004150
4151 try
4152 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154
daniel@transgaming.come0078962010-04-15 20:45:08 +00004155 if (context)
4156 {
4157 if (index >= gl::MAX_VERTEX_ATTRIBS)
4158 {
4159 return error(GL_INVALID_VALUE);
4160 }
4161
4162 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4163 {
4164 return error(GL_INVALID_ENUM);
4165 }
4166
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004167 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004168 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004169 }
4170 catch(std::bad_alloc&)
4171 {
4172 return error(GL_OUT_OF_MEMORY);
4173 }
4174}
4175
4176void __stdcall glHint(GLenum target, GLenum mode)
4177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004178 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179
4180 try
4181 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004182 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004183 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004184 case GL_FASTEST:
4185 case GL_NICEST:
4186 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004187 break;
4188 default:
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004189 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004190 }
4191
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004192 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004193 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004194 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004195 case GL_GENERATE_MIPMAP_HINT:
4196 if (context) context->setGenerateMipmapHint(mode);
4197 break;
4198 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4199 if (context) context->setFragmentShaderDerivativeHint(mode);
4200 break;
4201 default:
4202 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004203 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 }
4205 catch(std::bad_alloc&)
4206 {
4207 return error(GL_OUT_OF_MEMORY);
4208 }
4209}
4210
4211GLboolean __stdcall glIsBuffer(GLuint buffer)
4212{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004213 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214
4215 try
4216 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004217 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004218
4219 if (context && buffer)
4220 {
4221 gl::Buffer *bufferObject = context->getBuffer(buffer);
4222
4223 if (bufferObject)
4224 {
4225 return GL_TRUE;
4226 }
4227 }
4228 }
4229 catch(std::bad_alloc&)
4230 {
4231 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4232 }
4233
4234 return GL_FALSE;
4235}
4236
4237GLboolean __stdcall glIsEnabled(GLenum cap)
4238{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004239 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240
4241 try
4242 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244
4245 if (context)
4246 {
4247 switch (cap)
4248 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004249 case GL_CULL_FACE: return context->isCullFaceEnabled();
4250 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4251 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4252 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4253 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4254 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4255 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4256 case GL_BLEND: return context->isBlendEnabled();
4257 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258 default:
4259 return error(GL_INVALID_ENUM, false);
4260 }
4261 }
4262 }
4263 catch(std::bad_alloc&)
4264 {
4265 return error(GL_OUT_OF_MEMORY, false);
4266 }
4267
4268 return false;
4269}
4270
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004271GLboolean __stdcall glIsFenceNV(GLuint fence)
4272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004273 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004274
4275 try
4276 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004277 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004278
4279 if (context)
4280 {
4281 gl::Fence *fenceObject = context->getFence(fence);
4282
4283 if (fenceObject == NULL)
4284 {
4285 return GL_FALSE;
4286 }
4287
4288 return fenceObject->isFence();
4289 }
4290 }
4291 catch(std::bad_alloc&)
4292 {
4293 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4294 }
4295
4296 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004297}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004298
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004299GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004301 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004302
4303 try
4304 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306
4307 if (context && framebuffer)
4308 {
4309 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4310
4311 if (framebufferObject)
4312 {
4313 return GL_TRUE;
4314 }
4315 }
4316 }
4317 catch(std::bad_alloc&)
4318 {
4319 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4320 }
4321
4322 return GL_FALSE;
4323}
4324
4325GLboolean __stdcall glIsProgram(GLuint program)
4326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004327 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004328
4329 try
4330 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004331 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332
4333 if (context && program)
4334 {
4335 gl::Program *programObject = context->getProgram(program);
4336
4337 if (programObject)
4338 {
4339 return GL_TRUE;
4340 }
4341 }
4342 }
4343 catch(std::bad_alloc&)
4344 {
4345 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4346 }
4347
4348 return GL_FALSE;
4349}
4350
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004351GLboolean __stdcall glIsQueryEXT(GLuint id)
4352{
4353 EVENT("(GLuint id = %d)", id);
4354
4355 try
4356 {
4357 if (id == 0)
4358 {
4359 return GL_FALSE;
4360 }
4361
4362 gl::Context *context = gl::getNonLostContext();
4363
4364 if (context)
4365 {
4366 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4367
4368 if (queryObject)
4369 {
4370 return GL_TRUE;
4371 }
4372 }
4373 }
4374 catch(std::bad_alloc&)
4375 {
4376 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4377 }
4378
4379 return GL_FALSE;
4380}
4381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004382GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4383{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004384 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385
4386 try
4387 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004388 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389
4390 if (context && renderbuffer)
4391 {
4392 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4393
4394 if (renderbufferObject)
4395 {
4396 return GL_TRUE;
4397 }
4398 }
4399 }
4400 catch(std::bad_alloc&)
4401 {
4402 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4403 }
4404
4405 return GL_FALSE;
4406}
4407
4408GLboolean __stdcall glIsShader(GLuint shader)
4409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004410 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411
4412 try
4413 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415
4416 if (context && shader)
4417 {
4418 gl::Shader *shaderObject = context->getShader(shader);
4419
4420 if (shaderObject)
4421 {
4422 return GL_TRUE;
4423 }
4424 }
4425 }
4426 catch(std::bad_alloc&)
4427 {
4428 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4429 }
4430
4431 return GL_FALSE;
4432}
4433
4434GLboolean __stdcall glIsTexture(GLuint texture)
4435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004436 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004437
4438 try
4439 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441
4442 if (context && texture)
4443 {
4444 gl::Texture *textureObject = context->getTexture(texture);
4445
4446 if (textureObject)
4447 {
4448 return GL_TRUE;
4449 }
4450 }
4451 }
4452 catch(std::bad_alloc&)
4453 {
4454 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4455 }
4456
4457 return GL_FALSE;
4458}
4459
4460void __stdcall glLineWidth(GLfloat width)
4461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004462 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463
4464 try
4465 {
4466 if (width <= 0.0f)
4467 {
4468 return error(GL_INVALID_VALUE);
4469 }
4470
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004471 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004472
4473 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004474 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004475 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004476 }
4477 }
4478 catch(std::bad_alloc&)
4479 {
4480 return error(GL_OUT_OF_MEMORY);
4481 }
4482}
4483
4484void __stdcall glLinkProgram(GLuint program)
4485{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004486 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004487
4488 try
4489 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004490 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004491
4492 if (context)
4493 {
4494 gl::Program *programObject = context->getProgram(program);
4495
4496 if (!programObject)
4497 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004498 if (context->getShader(program))
4499 {
4500 return error(GL_INVALID_OPERATION);
4501 }
4502 else
4503 {
4504 return error(GL_INVALID_VALUE);
4505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004506 }
4507
4508 programObject->link();
4509 }
4510 }
4511 catch(std::bad_alloc&)
4512 {
4513 return error(GL_OUT_OF_MEMORY);
4514 }
4515}
4516
4517void __stdcall glPixelStorei(GLenum pname, GLint param)
4518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004519 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004520
4521 try
4522 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004523 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004524
4525 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004527 switch (pname)
4528 {
4529 case GL_UNPACK_ALIGNMENT:
4530 if (param != 1 && param != 2 && param != 4 && param != 8)
4531 {
4532 return error(GL_INVALID_VALUE);
4533 }
4534
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004535 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004536 break;
4537
4538 case GL_PACK_ALIGNMENT:
4539 if (param != 1 && param != 2 && param != 4 && param != 8)
4540 {
4541 return error(GL_INVALID_VALUE);
4542 }
4543
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004544 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004545 break;
4546
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004547 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4548 context->setPackReverseRowOrder(param != 0);
4549 break;
4550
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004551 default:
4552 return error(GL_INVALID_ENUM);
4553 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554 }
4555 }
4556 catch(std::bad_alloc&)
4557 {
4558 return error(GL_OUT_OF_MEMORY);
4559 }
4560}
4561
4562void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4563{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004564 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004565
4566 try
4567 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004568 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004569
4570 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004572 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004573 }
4574 }
4575 catch(std::bad_alloc&)
4576 {
4577 return error(GL_OUT_OF_MEMORY);
4578 }
4579}
4580
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004581void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4582 GLenum format, GLenum type, GLsizei bufSize,
4583 GLvoid *data)
4584{
4585 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4586 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4587 x, y, width, height, format, type, bufSize, data);
4588
4589 try
4590 {
4591 if (width < 0 || height < 0 || bufSize < 0)
4592 {
4593 return error(GL_INVALID_VALUE);
4594 }
4595
4596 if (!validReadFormatType(format, type))
4597 {
4598 return error(GL_INVALID_OPERATION);
4599 }
4600
4601 gl::Context *context = gl::getNonLostContext();
4602
4603 if (context)
4604 {
4605 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4606 }
4607 }
4608 catch(std::bad_alloc&)
4609 {
4610 return error(GL_OUT_OF_MEMORY);
4611 }
4612}
4613
4614void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4615 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004616{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004617 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004618 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004619 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004620
4621 try
4622 {
4623 if (width < 0 || height < 0)
4624 {
4625 return error(GL_INVALID_VALUE);
4626 }
4627
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004628 if (!validReadFormatType(format, type))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630 return error(GL_INVALID_OPERATION);
4631 }
4632
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004633 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004634
4635 if (context)
4636 {
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004637 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638 }
4639 }
4640 catch(std::bad_alloc&)
4641 {
4642 return error(GL_OUT_OF_MEMORY);
4643 }
4644}
4645
4646void __stdcall glReleaseShaderCompiler(void)
4647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004648 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649
4650 try
4651 {
4652 gl::Shader::releaseCompiler();
4653 }
4654 catch(std::bad_alloc&)
4655 {
4656 return error(GL_OUT_OF_MEMORY);
4657 }
4658}
4659
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004660void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004662 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 +00004663 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664
4665 try
4666 {
4667 switch (target)
4668 {
4669 case GL_RENDERBUFFER:
4670 break;
4671 default:
4672 return error(GL_INVALID_ENUM);
4673 }
4674
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004675 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004676 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 return error(GL_INVALID_ENUM);
4678 }
4679
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004680 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681 {
4682 return error(GL_INVALID_VALUE);
4683 }
4684
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686
4687 if (context)
4688 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004689 if (width > context->getMaximumRenderbufferDimension() ||
4690 height > context->getMaximumRenderbufferDimension() ||
4691 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004692 {
4693 return error(GL_INVALID_VALUE);
4694 }
4695
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004696 GLuint handle = context->getRenderbufferHandle();
4697 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698 {
4699 return error(GL_INVALID_OPERATION);
4700 }
4701
4702 switch (internalformat)
4703 {
4704 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004705 context->setRenderbufferStorage(new gl::Depthbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 break;
4707 case GL_RGBA4:
4708 case GL_RGB5_A1:
4709 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004710 case GL_RGB8_OES:
4711 case GL_RGBA8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004712 context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004713 break;
4714 case GL_STENCIL_INDEX8:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004715 context->setRenderbufferStorage(new gl::Stencilbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 break;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004717 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004718 context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height, samples));
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004719 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 default:
4721 return error(GL_INVALID_ENUM);
4722 }
4723 }
4724 }
4725 catch(std::bad_alloc&)
4726 {
4727 return error(GL_OUT_OF_MEMORY);
4728 }
4729}
4730
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004731void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4732{
4733 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4734}
4735
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004738 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739
4740 try
4741 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004742 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004743
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 if (context)
4745 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004746 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747 }
4748 }
4749 catch(std::bad_alloc&)
4750 {
4751 return error(GL_OUT_OF_MEMORY);
4752 }
4753}
4754
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004755void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004757 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004758
4759 try
4760 {
4761 if (condition != GL_ALL_COMPLETED_NV)
4762 {
4763 return error(GL_INVALID_ENUM);
4764 }
4765
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004766 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004767
4768 if (context)
4769 {
4770 gl::Fence *fenceObject = context->getFence(fence);
4771
4772 if (fenceObject == NULL)
4773 {
4774 return error(GL_INVALID_OPERATION);
4775 }
4776
4777 fenceObject->setFence(condition);
4778 }
4779 }
4780 catch(std::bad_alloc&)
4781 {
4782 return error(GL_OUT_OF_MEMORY);
4783 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004784}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004785
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004788 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 +00004789
4790 try
4791 {
4792 if (width < 0 || height < 0)
4793 {
4794 return error(GL_INVALID_VALUE);
4795 }
4796
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004797 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004798
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 if (context)
4800 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004801 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802 }
4803 }
4804 catch(std::bad_alloc&)
4805 {
4806 return error(GL_OUT_OF_MEMORY);
4807 }
4808}
4809
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004810void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004812 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004813 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004814 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815
4816 try
4817 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004818 // No binary shader formats are supported.
4819 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820 }
4821 catch(std::bad_alloc&)
4822 {
4823 return error(GL_OUT_OF_MEMORY);
4824 }
4825}
4826
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004827void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004828{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004829 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 +00004830 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831
4832 try
4833 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004834 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 {
4836 return error(GL_INVALID_VALUE);
4837 }
4838
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004840
4841 if (context)
4842 {
4843 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004844
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845 if (!shaderObject)
4846 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004847 if (context->getProgram(shader))
4848 {
4849 return error(GL_INVALID_OPERATION);
4850 }
4851 else
4852 {
4853 return error(GL_INVALID_VALUE);
4854 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855 }
4856
4857 shaderObject->setSource(count, string, length);
4858 }
4859 }
4860 catch(std::bad_alloc&)
4861 {
4862 return error(GL_OUT_OF_MEMORY);
4863 }
4864}
4865
4866void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4867{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004868 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869}
4870
4871void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004873 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 +00004874
4875 try
4876 {
4877 switch (face)
4878 {
4879 case GL_FRONT:
4880 case GL_BACK:
4881 case GL_FRONT_AND_BACK:
4882 break;
4883 default:
4884 return error(GL_INVALID_ENUM);
4885 }
4886
4887 switch (func)
4888 {
4889 case GL_NEVER:
4890 case GL_ALWAYS:
4891 case GL_LESS:
4892 case GL_LEQUAL:
4893 case GL_EQUAL:
4894 case GL_GEQUAL:
4895 case GL_GREATER:
4896 case GL_NOTEQUAL:
4897 break;
4898 default:
4899 return error(GL_INVALID_ENUM);
4900 }
4901
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004902 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004903
4904 if (context)
4905 {
4906 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4907 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004908 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004909 }
4910
4911 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4912 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004913 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004914 }
4915 }
4916 }
4917 catch(std::bad_alloc&)
4918 {
4919 return error(GL_OUT_OF_MEMORY);
4920 }
4921}
4922
4923void __stdcall glStencilMask(GLuint mask)
4924{
4925 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4926}
4927
4928void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004930 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931
4932 try
4933 {
4934 switch (face)
4935 {
4936 case GL_FRONT:
4937 case GL_BACK:
4938 case GL_FRONT_AND_BACK:
4939 break;
4940 default:
4941 return error(GL_INVALID_ENUM);
4942 }
4943
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004944 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945
4946 if (context)
4947 {
4948 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4949 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004950 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951 }
4952
4953 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4954 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004955 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004956 }
4957 }
4958 }
4959 catch(std::bad_alloc&)
4960 {
4961 return error(GL_OUT_OF_MEMORY);
4962 }
4963}
4964
4965void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4966{
4967 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4968}
4969
4970void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004972 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 +00004973 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004974
4975 try
4976 {
4977 switch (face)
4978 {
4979 case GL_FRONT:
4980 case GL_BACK:
4981 case GL_FRONT_AND_BACK:
4982 break;
4983 default:
4984 return error(GL_INVALID_ENUM);
4985 }
4986
4987 switch (fail)
4988 {
4989 case GL_ZERO:
4990 case GL_KEEP:
4991 case GL_REPLACE:
4992 case GL_INCR:
4993 case GL_DECR:
4994 case GL_INVERT:
4995 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004996 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004997 break;
4998 default:
4999 return error(GL_INVALID_ENUM);
5000 }
5001
5002 switch (zfail)
5003 {
5004 case GL_ZERO:
5005 case GL_KEEP:
5006 case GL_REPLACE:
5007 case GL_INCR:
5008 case GL_DECR:
5009 case GL_INVERT:
5010 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005011 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012 break;
5013 default:
5014 return error(GL_INVALID_ENUM);
5015 }
5016
5017 switch (zpass)
5018 {
5019 case GL_ZERO:
5020 case GL_KEEP:
5021 case GL_REPLACE:
5022 case GL_INCR:
5023 case GL_DECR:
5024 case GL_INVERT:
5025 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005026 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005027 break;
5028 default:
5029 return error(GL_INVALID_ENUM);
5030 }
5031
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033
5034 if (context)
5035 {
5036 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5037 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005038 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005039 }
5040
5041 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5042 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005043 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005044 }
5045 }
5046 }
5047 catch(std::bad_alloc&)
5048 {
5049 return error(GL_OUT_OF_MEMORY);
5050 }
5051}
5052
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005053GLboolean __stdcall glTestFenceNV(GLuint fence)
5054{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005055 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005056
5057 try
5058 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005059 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005060
5061 if (context)
5062 {
5063 gl::Fence *fenceObject = context->getFence(fence);
5064
5065 if (fenceObject == NULL)
5066 {
5067 return error(GL_INVALID_OPERATION, GL_TRUE);
5068 }
5069
5070 return fenceObject->testFence();
5071 }
5072 }
5073 catch(std::bad_alloc&)
5074 {
5075 error(GL_OUT_OF_MEMORY);
5076 }
5077
5078 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005079}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005080
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005081void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5082 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005084 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 +00005085 "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 +00005086 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005087
5088 try
5089 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005090 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005091 {
5092 return error(GL_INVALID_VALUE);
5093 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005094
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005095 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005096 {
5097 return error(GL_INVALID_OPERATION);
5098 }
5099
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005100 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005101 {
5102 case GL_ALPHA:
5103 case GL_LUMINANCE:
5104 case GL_LUMINANCE_ALPHA:
5105 switch (type)
5106 {
5107 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005108 case GL_FLOAT:
5109 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005110 break;
5111 default:
5112 return error(GL_INVALID_ENUM);
5113 }
5114 break;
5115 case GL_RGB:
5116 switch (type)
5117 {
5118 case GL_UNSIGNED_BYTE:
5119 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005120 case GL_FLOAT:
5121 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005122 break;
5123 default:
5124 return error(GL_INVALID_ENUM);
5125 }
5126 break;
5127 case GL_RGBA:
5128 switch (type)
5129 {
5130 case GL_UNSIGNED_BYTE:
5131 case GL_UNSIGNED_SHORT_4_4_4_4:
5132 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005133 case GL_FLOAT:
5134 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005135 break;
5136 default:
5137 return error(GL_INVALID_ENUM);
5138 }
5139 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005140 case GL_BGRA_EXT:
5141 switch (type)
5142 {
5143 case GL_UNSIGNED_BYTE:
5144 break;
5145 default:
5146 return error(GL_INVALID_ENUM);
5147 }
5148 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005149 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5150 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005151 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5152 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005153 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005154 case GL_DEPTH_COMPONENT:
5155 switch (type)
5156 {
5157 case GL_UNSIGNED_SHORT:
5158 case GL_UNSIGNED_INT:
5159 break;
5160 default:
5161 return error(GL_INVALID_ENUM);
5162 }
5163 break;
5164 case GL_DEPTH_STENCIL_OES:
5165 switch (type)
5166 {
5167 case GL_UNSIGNED_INT_24_8_OES:
5168 break;
5169 default:
5170 return error(GL_INVALID_ENUM);
5171 }
5172 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005173 default:
5174 return error(GL_INVALID_VALUE);
5175 }
5176
5177 if (border != 0)
5178 {
5179 return error(GL_INVALID_VALUE);
5180 }
5181
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005182 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005183
5184 if (context)
5185 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005186 if (level > context->getMaximumTextureLevel())
5187 {
5188 return error(GL_INVALID_VALUE);
5189 }
5190
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005191 switch (target)
5192 {
5193 case GL_TEXTURE_2D:
5194 if (width > (context->getMaximumTextureDimension() >> level) ||
5195 height > (context->getMaximumTextureDimension() >> level))
5196 {
5197 return error(GL_INVALID_VALUE);
5198 }
5199 break;
5200 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5201 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5202 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5203 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5204 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5205 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5206 if (width != height)
5207 {
5208 return error(GL_INVALID_VALUE);
5209 }
5210
5211 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5212 height > (context->getMaximumCubeTextureDimension() >> level))
5213 {
5214 return error(GL_INVALID_VALUE);
5215 }
5216 break;
5217 default:
5218 return error(GL_INVALID_ENUM);
5219 }
5220
gman@chromium.org50c526d2011-08-10 05:19:44 +00005221 switch (format) {
5222 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5223 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5224 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005225 {
5226 return error(GL_INVALID_OPERATION);
5227 }
5228 else
5229 {
5230 return error(GL_INVALID_ENUM);
5231 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005232 break;
5233 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5234 if (context->supportsDXT3Textures())
5235 {
5236 return error(GL_INVALID_OPERATION);
5237 }
5238 else
5239 {
5240 return error(GL_INVALID_ENUM);
5241 }
5242 break;
5243 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5244 if (context->supportsDXT5Textures())
5245 {
5246 return error(GL_INVALID_OPERATION);
5247 }
5248 else
5249 {
5250 return error(GL_INVALID_ENUM);
5251 }
5252 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005253 case GL_DEPTH_COMPONENT:
5254 case GL_DEPTH_STENCIL_OES:
5255 if (!context->supportsDepthTextures())
5256 {
5257 return error(GL_INVALID_VALUE);
5258 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005259 if (target != GL_TEXTURE_2D)
5260 {
5261 return error(GL_INVALID_OPERATION);
5262 }
5263 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
5264 if (pixels != NULL)
5265 {
5266 return error(GL_INVALID_OPERATION);
5267 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005268 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005269 default:
5270 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005271 }
5272
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005273 if (type == GL_FLOAT)
5274 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005275 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005276 {
5277 return error(GL_INVALID_ENUM);
5278 }
5279 }
5280 else if (type == GL_HALF_FLOAT_OES)
5281 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005282 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005283 {
5284 return error(GL_INVALID_ENUM);
5285 }
5286 }
5287
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 if (target == GL_TEXTURE_2D)
5289 {
5290 gl::Texture2D *texture = context->getTexture2D();
5291
5292 if (!texture)
5293 {
5294 return error(GL_INVALID_OPERATION);
5295 }
5296
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005297 if (texture->isImmutable())
5298 {
5299 return error(GL_INVALID_OPERATION);
5300 }
5301
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005302 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303 }
5304 else
5305 {
5306 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5307
5308 if (!texture)
5309 {
5310 return error(GL_INVALID_OPERATION);
5311 }
5312
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005313 if (texture->isImmutable())
5314 {
5315 return error(GL_INVALID_OPERATION);
5316 }
5317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 switch (target)
5319 {
5320 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005321 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322 break;
5323 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005324 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 break;
5326 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005327 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005328 break;
5329 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005330 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005331 break;
5332 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005333 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005334 break;
5335 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005336 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005337 break;
5338 default: UNREACHABLE();
5339 }
5340 }
5341 }
5342 }
5343 catch(std::bad_alloc&)
5344 {
5345 return error(GL_OUT_OF_MEMORY);
5346 }
5347}
5348
5349void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5350{
5351 glTexParameteri(target, pname, (GLint)param);
5352}
5353
5354void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5355{
5356 glTexParameteri(target, pname, (GLint)*params);
5357}
5358
5359void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005361 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005362
5363 try
5364 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366
5367 if (context)
5368 {
5369 gl::Texture *texture;
5370
5371 switch (target)
5372 {
5373 case GL_TEXTURE_2D:
5374 texture = context->getTexture2D();
5375 break;
5376 case GL_TEXTURE_CUBE_MAP:
5377 texture = context->getTextureCubeMap();
5378 break;
5379 default:
5380 return error(GL_INVALID_ENUM);
5381 }
5382
5383 switch (pname)
5384 {
5385 case GL_TEXTURE_WRAP_S:
5386 if (!texture->setWrapS((GLenum)param))
5387 {
5388 return error(GL_INVALID_ENUM);
5389 }
5390 break;
5391 case GL_TEXTURE_WRAP_T:
5392 if (!texture->setWrapT((GLenum)param))
5393 {
5394 return error(GL_INVALID_ENUM);
5395 }
5396 break;
5397 case GL_TEXTURE_MIN_FILTER:
5398 if (!texture->setMinFilter((GLenum)param))
5399 {
5400 return error(GL_INVALID_ENUM);
5401 }
5402 break;
5403 case GL_TEXTURE_MAG_FILTER:
5404 if (!texture->setMagFilter((GLenum)param))
5405 {
5406 return error(GL_INVALID_ENUM);
5407 }
5408 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005409 case GL_TEXTURE_USAGE_ANGLE:
5410 if (!texture->setUsage((GLenum)param))
5411 {
5412 return error(GL_INVALID_ENUM);
5413 }
5414 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415 default:
5416 return error(GL_INVALID_ENUM);
5417 }
5418 }
5419 }
5420 catch(std::bad_alloc&)
5421 {
5422 return error(GL_OUT_OF_MEMORY);
5423 }
5424}
5425
5426void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5427{
5428 glTexParameteri(target, pname, *params);
5429}
5430
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005431void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5432{
5433 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5434 target, levels, internalformat, width, height);
5435
5436 try
5437 {
5438 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5439 {
5440 return error(GL_INVALID_ENUM);
5441 }
5442
5443 if (width < 1 || height < 1 || levels < 1)
5444 {
5445 return error(GL_INVALID_VALUE);
5446 }
5447
5448 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5449 {
5450 return error(GL_INVALID_VALUE);
5451 }
5452
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005453 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005454 {
5455 return error(GL_INVALID_OPERATION);
5456 }
5457
5458 GLenum format = gl::ExtractFormat(internalformat);
5459 GLenum type = gl::ExtractType(internalformat);
5460
5461 if (format == GL_NONE || type == GL_NONE)
5462 {
5463 return error(GL_INVALID_ENUM);
5464 }
5465
5466 gl::Context *context = gl::getNonLostContext();
5467
5468 if (context)
5469 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005470 switch (target)
5471 {
5472 case GL_TEXTURE_2D:
5473 if (width > context->getMaximumTextureDimension() ||
5474 height > context->getMaximumTextureDimension())
5475 {
5476 return error(GL_INVALID_VALUE);
5477 }
5478 break;
5479 case GL_TEXTURE_CUBE_MAP:
5480 if (width > context->getMaximumCubeTextureDimension() ||
5481 height > context->getMaximumCubeTextureDimension())
5482 {
5483 return error(GL_INVALID_VALUE);
5484 }
5485 break;
5486 default:
5487 return error(GL_INVALID_ENUM);
5488 }
5489
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005490 if (levels != 1 && !context->supportsNonPower2Texture())
5491 {
5492 if (!gl::isPow2(width) || !gl::isPow2(height))
5493 {
5494 return error(GL_INVALID_OPERATION);
5495 }
5496 }
5497
daniel@transgaming.come1077362011-11-11 04:16:50 +00005498 switch (internalformat)
5499 {
5500 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5501 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5502 if (!context->supportsDXT1Textures())
5503 {
5504 return error(GL_INVALID_ENUM);
5505 }
5506 break;
5507 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5508 if (!context->supportsDXT3Textures())
5509 {
5510 return error(GL_INVALID_ENUM);
5511 }
5512 break;
5513 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5514 if (!context->supportsDXT5Textures())
5515 {
5516 return error(GL_INVALID_ENUM);
5517 }
5518 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005519 case GL_RGBA32F_EXT:
5520 case GL_RGB32F_EXT:
5521 case GL_ALPHA32F_EXT:
5522 case GL_LUMINANCE32F_EXT:
5523 case GL_LUMINANCE_ALPHA32F_EXT:
5524 if (!context->supportsFloat32Textures())
5525 {
5526 return error(GL_INVALID_ENUM);
5527 }
5528 break;
5529 case GL_RGBA16F_EXT:
5530 case GL_RGB16F_EXT:
5531 case GL_ALPHA16F_EXT:
5532 case GL_LUMINANCE16F_EXT:
5533 case GL_LUMINANCE_ALPHA16F_EXT:
5534 if (!context->supportsFloat16Textures())
5535 {
5536 return error(GL_INVALID_ENUM);
5537 }
5538 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005539 case GL_DEPTH_COMPONENT16:
5540 case GL_DEPTH_COMPONENT32_OES:
5541 case GL_DEPTH24_STENCIL8_OES:
5542 if (!context->supportsDepthTextures())
5543 {
5544 return error(GL_INVALID_ENUM);
5545 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005546 if (target != GL_TEXTURE_2D)
5547 {
5548 return error(GL_INVALID_OPERATION);
5549 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005550 break;
5551 default:
5552 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005553 }
5554
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005555 if (target == GL_TEXTURE_2D)
5556 {
5557 gl::Texture2D *texture = context->getTexture2D();
5558
5559 if (!texture || texture->id() == 0)
5560 {
5561 return error(GL_INVALID_OPERATION);
5562 }
5563
5564 if (texture->isImmutable())
5565 {
5566 return error(GL_INVALID_OPERATION);
5567 }
5568
5569 texture->storage(levels, internalformat, width, height);
5570 }
5571 else if (target == GL_TEXTURE_CUBE_MAP)
5572 {
5573 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5574
5575 if (!texture || texture->id() == 0)
5576 {
5577 return error(GL_INVALID_OPERATION);
5578 }
5579
5580 if (texture->isImmutable())
5581 {
5582 return error(GL_INVALID_OPERATION);
5583 }
5584
5585 texture->storage(levels, internalformat, width);
5586 }
5587 else UNREACHABLE();
5588 }
5589 }
5590 catch(std::bad_alloc&)
5591 {
5592 return error(GL_OUT_OF_MEMORY);
5593 }
5594}
5595
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005596void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5597 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005599 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005600 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005601 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602 target, level, xoffset, yoffset, width, height, format, type, pixels);
5603
5604 try
5605 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005606 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005607 {
5608 return error(GL_INVALID_ENUM);
5609 }
5610
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005611 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005612 {
5613 return error(GL_INVALID_VALUE);
5614 }
5615
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005616 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5617 {
5618 return error(GL_INVALID_VALUE);
5619 }
5620
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005621 if (!gl::CheckTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005622 {
5623 return error(GL_INVALID_ENUM);
5624 }
5625
5626 if (width == 0 || height == 0 || pixels == NULL)
5627 {
5628 return;
5629 }
5630
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005631 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005632
5633 if (context)
5634 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005635 if (level > context->getMaximumTextureLevel())
5636 {
5637 return error(GL_INVALID_VALUE);
5638 }
5639
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005640 if (format == GL_FLOAT)
5641 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005642 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005643 {
5644 return error(GL_INVALID_ENUM);
5645 }
5646 }
5647 else if (format == GL_HALF_FLOAT_OES)
5648 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005649 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005650 {
5651 return error(GL_INVALID_ENUM);
5652 }
5653 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005654 else if (gl::IsDepthTexture(format))
5655 {
5656 if (!context->supportsDepthTextures())
5657 {
5658 return error(GL_INVALID_ENUM);
5659 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005660 if (target != GL_TEXTURE_2D)
5661 {
5662 return error(GL_INVALID_OPERATION);
5663 }
5664 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
5665 return error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005666 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005667
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005668 if (target == GL_TEXTURE_2D)
5669 {
5670 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00005671 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005672 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005673 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005674 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005675 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005676 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005677 {
5678 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00005679 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005680 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005681 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005682 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005683 }
5684 else
5685 {
5686 UNREACHABLE();
5687 }
5688 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689 }
5690 catch(std::bad_alloc&)
5691 {
5692 return error(GL_OUT_OF_MEMORY);
5693 }
5694}
5695
5696void __stdcall glUniform1f(GLint location, GLfloat x)
5697{
5698 glUniform1fv(location, 1, &x);
5699}
5700
5701void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005703 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005704
5705 try
5706 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005707 if (count < 0)
5708 {
5709 return error(GL_INVALID_VALUE);
5710 }
5711
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005712 if (location == -1)
5713 {
5714 return;
5715 }
5716
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005717 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718
5719 if (context)
5720 {
5721 gl::Program *program = context->getCurrentProgram();
5722
5723 if (!program)
5724 {
5725 return error(GL_INVALID_OPERATION);
5726 }
5727
5728 if (!program->setUniform1fv(location, count, v))
5729 {
5730 return error(GL_INVALID_OPERATION);
5731 }
5732 }
5733 }
5734 catch(std::bad_alloc&)
5735 {
5736 return error(GL_OUT_OF_MEMORY);
5737 }
5738}
5739
5740void __stdcall glUniform1i(GLint location, GLint x)
5741{
5742 glUniform1iv(location, 1, &x);
5743}
5744
5745void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005747 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748
5749 try
5750 {
5751 if (count < 0)
5752 {
5753 return error(GL_INVALID_VALUE);
5754 }
5755
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005756 if (location == -1)
5757 {
5758 return;
5759 }
5760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005762
5763 if (context)
5764 {
5765 gl::Program *program = context->getCurrentProgram();
5766
5767 if (!program)
5768 {
5769 return error(GL_INVALID_OPERATION);
5770 }
5771
5772 if (!program->setUniform1iv(location, count, v))
5773 {
5774 return error(GL_INVALID_OPERATION);
5775 }
5776 }
5777 }
5778 catch(std::bad_alloc&)
5779 {
5780 return error(GL_OUT_OF_MEMORY);
5781 }
5782}
5783
5784void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5785{
5786 GLfloat xy[2] = {x, y};
5787
5788 glUniform2fv(location, 1, (GLfloat*)&xy);
5789}
5790
5791void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005793 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794
5795 try
5796 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 if (count < 0)
5798 {
5799 return error(GL_INVALID_VALUE);
5800 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005801
5802 if (location == -1)
5803 {
5804 return;
5805 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005807 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005808
5809 if (context)
5810 {
5811 gl::Program *program = context->getCurrentProgram();
5812
5813 if (!program)
5814 {
5815 return error(GL_INVALID_OPERATION);
5816 }
5817
5818 if (!program->setUniform2fv(location, count, v))
5819 {
5820 return error(GL_INVALID_OPERATION);
5821 }
5822 }
5823 }
5824 catch(std::bad_alloc&)
5825 {
5826 return error(GL_OUT_OF_MEMORY);
5827 }
5828}
5829
5830void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5831{
5832 GLint xy[4] = {x, y};
5833
5834 glUniform2iv(location, 1, (GLint*)&xy);
5835}
5836
5837void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5838{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005839 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840
5841 try
5842 {
5843 if (count < 0)
5844 {
5845 return error(GL_INVALID_VALUE);
5846 }
5847
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005848 if (location == -1)
5849 {
5850 return;
5851 }
5852
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005854
5855 if (context)
5856 {
5857 gl::Program *program = context->getCurrentProgram();
5858
5859 if (!program)
5860 {
5861 return error(GL_INVALID_OPERATION);
5862 }
5863
5864 if (!program->setUniform2iv(location, count, v))
5865 {
5866 return error(GL_INVALID_OPERATION);
5867 }
5868 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005869 }
5870 catch(std::bad_alloc&)
5871 {
5872 return error(GL_OUT_OF_MEMORY);
5873 }
5874}
5875
5876void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5877{
5878 GLfloat xyz[3] = {x, y, z};
5879
5880 glUniform3fv(location, 1, (GLfloat*)&xyz);
5881}
5882
5883void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005885 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005886
5887 try
5888 {
5889 if (count < 0)
5890 {
5891 return error(GL_INVALID_VALUE);
5892 }
5893
5894 if (location == -1)
5895 {
5896 return;
5897 }
5898
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900
5901 if (context)
5902 {
5903 gl::Program *program = context->getCurrentProgram();
5904
5905 if (!program)
5906 {
5907 return error(GL_INVALID_OPERATION);
5908 }
5909
5910 if (!program->setUniform3fv(location, count, v))
5911 {
5912 return error(GL_INVALID_OPERATION);
5913 }
5914 }
5915 }
5916 catch(std::bad_alloc&)
5917 {
5918 return error(GL_OUT_OF_MEMORY);
5919 }
5920}
5921
5922void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5923{
5924 GLint xyz[3] = {x, y, z};
5925
5926 glUniform3iv(location, 1, (GLint*)&xyz);
5927}
5928
5929void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5930{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005931 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932
5933 try
5934 {
5935 if (count < 0)
5936 {
5937 return error(GL_INVALID_VALUE);
5938 }
5939
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005940 if (location == -1)
5941 {
5942 return;
5943 }
5944
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005945 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005946
5947 if (context)
5948 {
5949 gl::Program *program = context->getCurrentProgram();
5950
5951 if (!program)
5952 {
5953 return error(GL_INVALID_OPERATION);
5954 }
5955
5956 if (!program->setUniform3iv(location, count, v))
5957 {
5958 return error(GL_INVALID_OPERATION);
5959 }
5960 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005961 }
5962 catch(std::bad_alloc&)
5963 {
5964 return error(GL_OUT_OF_MEMORY);
5965 }
5966}
5967
5968void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5969{
5970 GLfloat xyzw[4] = {x, y, z, w};
5971
5972 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5973}
5974
5975void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005977 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005978
5979 try
5980 {
5981 if (count < 0)
5982 {
5983 return error(GL_INVALID_VALUE);
5984 }
5985
5986 if (location == -1)
5987 {
5988 return;
5989 }
5990
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005991 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992
5993 if (context)
5994 {
5995 gl::Program *program = context->getCurrentProgram();
5996
5997 if (!program)
5998 {
5999 return error(GL_INVALID_OPERATION);
6000 }
6001
6002 if (!program->setUniform4fv(location, count, v))
6003 {
6004 return error(GL_INVALID_OPERATION);
6005 }
6006 }
6007 }
6008 catch(std::bad_alloc&)
6009 {
6010 return error(GL_OUT_OF_MEMORY);
6011 }
6012}
6013
6014void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6015{
6016 GLint xyzw[4] = {x, y, z, w};
6017
6018 glUniform4iv(location, 1, (GLint*)&xyzw);
6019}
6020
6021void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006023 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024
6025 try
6026 {
6027 if (count < 0)
6028 {
6029 return error(GL_INVALID_VALUE);
6030 }
6031
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006032 if (location == -1)
6033 {
6034 return;
6035 }
6036
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006037 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006038
6039 if (context)
6040 {
6041 gl::Program *program = context->getCurrentProgram();
6042
6043 if (!program)
6044 {
6045 return error(GL_INVALID_OPERATION);
6046 }
6047
6048 if (!program->setUniform4iv(location, count, v))
6049 {
6050 return error(GL_INVALID_OPERATION);
6051 }
6052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006053 }
6054 catch(std::bad_alloc&)
6055 {
6056 return error(GL_OUT_OF_MEMORY);
6057 }
6058}
6059
6060void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006062 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006063 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064
6065 try
6066 {
6067 if (count < 0 || transpose != GL_FALSE)
6068 {
6069 return error(GL_INVALID_VALUE);
6070 }
6071
6072 if (location == -1)
6073 {
6074 return;
6075 }
6076
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006078
6079 if (context)
6080 {
6081 gl::Program *program = context->getCurrentProgram();
6082
6083 if (!program)
6084 {
6085 return error(GL_INVALID_OPERATION);
6086 }
6087
6088 if (!program->setUniformMatrix2fv(location, count, value))
6089 {
6090 return error(GL_INVALID_OPERATION);
6091 }
6092 }
6093 }
6094 catch(std::bad_alloc&)
6095 {
6096 return error(GL_OUT_OF_MEMORY);
6097 }
6098}
6099
6100void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6101{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006102 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006103 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006104
6105 try
6106 {
6107 if (count < 0 || transpose != GL_FALSE)
6108 {
6109 return error(GL_INVALID_VALUE);
6110 }
6111
6112 if (location == -1)
6113 {
6114 return;
6115 }
6116
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006117 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118
6119 if (context)
6120 {
6121 gl::Program *program = context->getCurrentProgram();
6122
6123 if (!program)
6124 {
6125 return error(GL_INVALID_OPERATION);
6126 }
6127
6128 if (!program->setUniformMatrix3fv(location, count, value))
6129 {
6130 return error(GL_INVALID_OPERATION);
6131 }
6132 }
6133 }
6134 catch(std::bad_alloc&)
6135 {
6136 return error(GL_OUT_OF_MEMORY);
6137 }
6138}
6139
6140void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006142 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006143 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144
6145 try
6146 {
6147 if (count < 0 || transpose != GL_FALSE)
6148 {
6149 return error(GL_INVALID_VALUE);
6150 }
6151
6152 if (location == -1)
6153 {
6154 return;
6155 }
6156
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006157 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006158
6159 if (context)
6160 {
6161 gl::Program *program = context->getCurrentProgram();
6162
6163 if (!program)
6164 {
6165 return error(GL_INVALID_OPERATION);
6166 }
6167
6168 if (!program->setUniformMatrix4fv(location, count, value))
6169 {
6170 return error(GL_INVALID_OPERATION);
6171 }
6172 }
6173 }
6174 catch(std::bad_alloc&)
6175 {
6176 return error(GL_OUT_OF_MEMORY);
6177 }
6178}
6179
6180void __stdcall glUseProgram(GLuint program)
6181{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006182 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006183
6184 try
6185 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006186 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006187
6188 if (context)
6189 {
6190 gl::Program *programObject = context->getProgram(program);
6191
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006192 if (!programObject && program != 0)
6193 {
6194 if (context->getShader(program))
6195 {
6196 return error(GL_INVALID_OPERATION);
6197 }
6198 else
6199 {
6200 return error(GL_INVALID_VALUE);
6201 }
6202 }
6203
6204 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006205 {
6206 return error(GL_INVALID_OPERATION);
6207 }
6208
6209 context->useProgram(program);
6210 }
6211 }
6212 catch(std::bad_alloc&)
6213 {
6214 return error(GL_OUT_OF_MEMORY);
6215 }
6216}
6217
6218void __stdcall glValidateProgram(GLuint program)
6219{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006220 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006221
6222 try
6223 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006225
6226 if (context)
6227 {
6228 gl::Program *programObject = context->getProgram(program);
6229
6230 if (!programObject)
6231 {
6232 if (context->getShader(program))
6233 {
6234 return error(GL_INVALID_OPERATION);
6235 }
6236 else
6237 {
6238 return error(GL_INVALID_VALUE);
6239 }
6240 }
6241
6242 programObject->validate();
6243 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006244 }
6245 catch(std::bad_alloc&)
6246 {
6247 return error(GL_OUT_OF_MEMORY);
6248 }
6249}
6250
6251void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006253 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254
6255 try
6256 {
6257 if (index >= gl::MAX_VERTEX_ATTRIBS)
6258 {
6259 return error(GL_INVALID_VALUE);
6260 }
6261
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006262 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006263
6264 if (context)
6265 {
6266 GLfloat vals[4] = { x, 0, 0, 1 };
6267 context->setVertexAttrib(index, vals);
6268 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006269 }
6270 catch(std::bad_alloc&)
6271 {
6272 return error(GL_OUT_OF_MEMORY);
6273 }
6274}
6275
6276void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6277{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006278 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006279
6280 try
6281 {
6282 if (index >= gl::MAX_VERTEX_ATTRIBS)
6283 {
6284 return error(GL_INVALID_VALUE);
6285 }
6286
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006288
6289 if (context)
6290 {
6291 GLfloat vals[4] = { values[0], 0, 0, 1 };
6292 context->setVertexAttrib(index, vals);
6293 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006294 }
6295 catch(std::bad_alloc&)
6296 {
6297 return error(GL_OUT_OF_MEMORY);
6298 }
6299}
6300
6301void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006303 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304
6305 try
6306 {
6307 if (index >= gl::MAX_VERTEX_ATTRIBS)
6308 {
6309 return error(GL_INVALID_VALUE);
6310 }
6311
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006313
6314 if (context)
6315 {
6316 GLfloat vals[4] = { x, y, 0, 1 };
6317 context->setVertexAttrib(index, vals);
6318 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320 catch(std::bad_alloc&)
6321 {
6322 return error(GL_OUT_OF_MEMORY);
6323 }
6324}
6325
6326void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006328 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006329
6330 try
6331 {
6332 if (index >= gl::MAX_VERTEX_ATTRIBS)
6333 {
6334 return error(GL_INVALID_VALUE);
6335 }
6336
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006338
6339 if (context)
6340 {
6341 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6342 context->setVertexAttrib(index, vals);
6343 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006344 }
6345 catch(std::bad_alloc&)
6346 {
6347 return error(GL_OUT_OF_MEMORY);
6348 }
6349}
6350
6351void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006353 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 +00006354
6355 try
6356 {
6357 if (index >= gl::MAX_VERTEX_ATTRIBS)
6358 {
6359 return error(GL_INVALID_VALUE);
6360 }
6361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006363
6364 if (context)
6365 {
6366 GLfloat vals[4] = { x, y, z, 1 };
6367 context->setVertexAttrib(index, vals);
6368 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006369 }
6370 catch(std::bad_alloc&)
6371 {
6372 return error(GL_OUT_OF_MEMORY);
6373 }
6374}
6375
6376void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6377{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006378 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006379
6380 try
6381 {
6382 if (index >= gl::MAX_VERTEX_ATTRIBS)
6383 {
6384 return error(GL_INVALID_VALUE);
6385 }
6386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006388
6389 if (context)
6390 {
6391 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6392 context->setVertexAttrib(index, vals);
6393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006394 }
6395 catch(std::bad_alloc&)
6396 {
6397 return error(GL_OUT_OF_MEMORY);
6398 }
6399}
6400
6401void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006403 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 +00006404
6405 try
6406 {
6407 if (index >= gl::MAX_VERTEX_ATTRIBS)
6408 {
6409 return error(GL_INVALID_VALUE);
6410 }
6411
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006413
6414 if (context)
6415 {
6416 GLfloat vals[4] = { x, y, z, w };
6417 context->setVertexAttrib(index, vals);
6418 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006419 }
6420 catch(std::bad_alloc&)
6421 {
6422 return error(GL_OUT_OF_MEMORY);
6423 }
6424}
6425
6426void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006428 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006429
6430 try
6431 {
6432 if (index >= gl::MAX_VERTEX_ATTRIBS)
6433 {
6434 return error(GL_INVALID_VALUE);
6435 }
6436
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006437 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006438
6439 if (context)
6440 {
6441 context->setVertexAttrib(index, values);
6442 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006443 }
6444 catch(std::bad_alloc&)
6445 {
6446 return error(GL_OUT_OF_MEMORY);
6447 }
6448}
6449
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006450void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6451{
6452 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6453
6454 try
6455 {
6456 if (index >= gl::MAX_VERTEX_ATTRIBS)
6457 {
6458 return error(GL_INVALID_VALUE);
6459 }
6460
6461 gl::Context *context = gl::getNonLostContext();
6462
6463 if (context)
6464 {
6465 context->setVertexAttribDivisor(index, divisor);
6466 }
6467 }
6468 catch(std::bad_alloc&)
6469 {
6470 return error(GL_OUT_OF_MEMORY);
6471 }
6472}
6473
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006474void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006476 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006477 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006478 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006479
6480 try
6481 {
6482 if (index >= gl::MAX_VERTEX_ATTRIBS)
6483 {
6484 return error(GL_INVALID_VALUE);
6485 }
6486
6487 if (size < 1 || size > 4)
6488 {
6489 return error(GL_INVALID_VALUE);
6490 }
6491
6492 switch (type)
6493 {
6494 case GL_BYTE:
6495 case GL_UNSIGNED_BYTE:
6496 case GL_SHORT:
6497 case GL_UNSIGNED_SHORT:
6498 case GL_FIXED:
6499 case GL_FLOAT:
6500 break;
6501 default:
6502 return error(GL_INVALID_ENUM);
6503 }
6504
6505 if (stride < 0)
6506 {
6507 return error(GL_INVALID_VALUE);
6508 }
6509
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006511
6512 if (context)
6513 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006514 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006515 }
6516 }
6517 catch(std::bad_alloc&)
6518 {
6519 return error(GL_OUT_OF_MEMORY);
6520 }
6521}
6522
6523void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6524{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006525 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 +00006526
6527 try
6528 {
6529 if (width < 0 || height < 0)
6530 {
6531 return error(GL_INVALID_VALUE);
6532 }
6533
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006535
6536 if (context)
6537 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006538 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006539 }
6540 }
6541 catch(std::bad_alloc&)
6542 {
6543 return error(GL_OUT_OF_MEMORY);
6544 }
6545}
6546
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006547void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6548 GLbitfield mask, GLenum filter)
6549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006550 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006551 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6552 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6553 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6554
6555 try
6556 {
6557 switch (filter)
6558 {
6559 case GL_NEAREST:
6560 break;
6561 default:
6562 return error(GL_INVALID_ENUM);
6563 }
6564
6565 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6566 {
6567 return error(GL_INVALID_VALUE);
6568 }
6569
6570 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6571 {
6572 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
6573 return error(GL_INVALID_OPERATION);
6574 }
6575
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006576 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006577
6578 if (context)
6579 {
6580 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6581 {
6582 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
6583 return error(GL_INVALID_OPERATION);
6584 }
6585
6586 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6587 }
6588 }
6589 catch(std::bad_alloc&)
6590 {
6591 return error(GL_OUT_OF_MEMORY);
6592 }
6593}
6594
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006595void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6596 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006598 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006599 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006600 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006601 target, level, internalformat, width, height, depth, border, format, type, pixels);
6602
6603 try
6604 {
6605 UNIMPLEMENTED(); // FIXME
6606 }
6607 catch(std::bad_alloc&)
6608 {
6609 return error(GL_OUT_OF_MEMORY);
6610 }
6611}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006612
6613__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6614{
6615 struct Extension
6616 {
6617 const char *name;
6618 __eglMustCastToProperFunctionPointerType address;
6619 };
6620
6621 static const Extension glExtensions[] =
6622 {
6623 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006624 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006625 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006626 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6627 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6628 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6629 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6630 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6631 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6632 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006633 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006634 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006635 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6636 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6637 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6638 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006639 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6640 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6641 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6642 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6643 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6644 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6645 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006646 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6647 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6648 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006649 };
6650
6651 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6652 {
6653 if (strcmp(procname, glExtensions[ext].name) == 0)
6654 {
6655 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6656 }
6657 }
6658
6659 return NULL;
6660}
6661
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006662// Non-public functions used by EGL
6663
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006664bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006665{
6666 EVENT("(egl::Surface* surface = 0x%0.8p)",
6667 surface);
6668
6669 try
6670 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006671 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006672
6673 if (context)
6674 {
6675 gl::Texture2D *textureObject = context->getTexture2D();
6676
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006677 if (textureObject->isImmutable())
6678 {
6679 return false;
6680 }
6681
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006682 if (textureObject)
6683 {
6684 textureObject->bindTexImage(surface);
6685 }
6686 }
6687 }
6688 catch(std::bad_alloc&)
6689 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006690 return error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006691 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006692
6693 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006694}
6695
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006696}